{"version":3,"sources":["webpack:///./packages/core-components/Theme/index.ts","webpack:///./packages/core/lib/netx-query-dam.ts","webpack:///./packages/core-components/Form/ErrorField/ErrorField.tsx","webpack:///./packages/core-components/Form/DateField/DateField.tsx","webpack:///./packages/core-components/Form/hooks/useForm.ts","webpack:///./packages/core-components/Form/hooks/useFormInput.ts","webpack:///./packages/core-components/util.ts","webpack:///./packages/core-components/IconButton/iconButtonClasses.ts","webpack:///./packages/core-components/IconButton/IconButton.tsx","webpack:///./packages/core-components/hooks/useWhenChangedEffect.ts","webpack:///./packages/core-components/hooks/useSharedRef.tsx","webpack:///./packages/core-components/Form/SelectField/index.tsx","webpack:///./packages/core-components/hooks/useDragResizeElement.tsx","webpack:///./packages/core-components/hooks/useMemoCompare.ts","webpack:///./packages/core-components/hooks/usePrevious.ts","webpack:///./packages/core-components/hooks/useRpc.ts","webpack:///./packages/core-components/hooks/useRefState.ts","webpack:///./packages/core-components/index.ts","webpack:///./packages/core-components/Chip/Chip.tsx","webpack:///./packages/core-components/Button/Button.tsx","webpack:///./packages/core-components/FallbackMessage/fallbackMessageClasses.ts","webpack:///./packages/core-components/FallbackMessage/FallbackMessage.tsx","webpack:///./packages/core-components/Dialog/index.ts","webpack:///./packages/core-components/hooks/useUpdateEffect.ts","webpack:///./packages/core-components/Confirmation/withConfirmation.tsx","webpack:///./packages/core-components/Confirmation/index.ts","webpack:///./packages/core-upload-asset/locales.ts","webpack:///./packages/core-components/Alert/index.ts","webpack:///./packages/core-components/Snackbar/Snackbar.tsx","webpack:///./packages/core-components/Snackbar/SnackbarService.tsx","webpack:///./packages/core-components/Snackbar/withSnackbar.tsx","webpack:///./packages/core-components/Snackbar/index.ts","webpack:///./packages/core-upload-asset/constants.ts","webpack:///./packages/core-attribute-grid-editor/utils.ts","webpack:///./packages/core-components/ActionButton/ActionButton.tsx","webpack:///./packages/core-attribute/hooks/usePlaceholder.ts","webpack:///./packages/core-components/Form/util.ts","webpack:///./packages/core-components/ScrollBorder/createShadow.ts","webpack:///./packages/core-components/ScrollBorder/scrollSentinelClasses.ts","webpack:///./packages/core-components/ScrollBorder/ScrollSentinel.tsx","webpack:///./packages/core-components/ScrollBorder/scrollBorderClasses.ts","webpack:///./packages/core-components/hooks/useIntersectionObserver.ts","webpack:///./packages/core-components/ScrollBorder/ScrollBorder.tsx","webpack:///./packages/core-components/ScrollBorder/scrollBorderReactWindowClasses.ts","webpack:///./packages/core-components/ScrollBorder/ScrollBorderReactWindow.tsx","webpack:///./packages/core-components/Form/AutoListField/components/Option/index.tsx","webpack:///./packages/core-components/Form/AutoListField/components/Selection/index.tsx","webpack:///./packages/core-components/Form/AutoListField/locales.ts","webpack:///./packages/core-components/Form/AutoListField/util.ts","webpack:///./packages/core-components/Form/AutoListField/AutoList.tsx","webpack:///./packages/core-components/Form/AutoListField/constants.ts","webpack:///./packages/core-components/PrimaryTitle/PrimaryTitle.tsx","webpack:///./packages/core-components/SecondaryTitle/SecondaryTitle.tsx","webpack:///./packages/core-components/Title/titleClasses.ts","webpack:///./packages/core-components/Title/Title.tsx","webpack:///./packages/core-search-rules/constants.ts","webpack:///./packages/core-components/SubmitButton/submitButtonClasses.ts","webpack:///./packages/core-components/SubmitButton/SubmitButton.tsx","webpack:///./packages/core-components/Form/SelectField/components/Select/SelectField.tsx","webpack:///./packages/core-components/FormDialog/index.ts","webpack:///./packages/core-attribute-set-selection/context/constants.ts","webpack:///./packages/core-attribute-set-selection/context/actions.ts","webpack:///./packages/core-attribute-set-selection/context/reducer.ts","webpack:///./packages/core-attribute-set-selection/context/index.tsx","webpack:///./packages/core-search-rules/rules/baseRule.ts","webpack:///./packages/core-search-rules/locales.ts","webpack:///./packages/core-search-rules/rules/baseModel.ts","webpack:///./packages/core-components/Tabs/Tabs.tsx","webpack:///./packages/core-components/Tabs/useTabs.tsx","webpack:///./packages/core-components/Tabs/TabsProvider.tsx","webpack:///./packages/core-components/hooks/useComponentIsMounted.ts","webpack:///./packages/core-attribute/components/Action/Search.tsx","webpack:///./packages/core-attribute/containers/Attribute/index.tsx","webpack:///./packages/core-attribute-permission/constants.ts","webpack:///./packages/core-attribute-permission/locales.ts","webpack:///./packages/core-attribute-permission/components/ListItemMenu/index.tsx","webpack:///./packages/core-attribute-permission/components/ListItem/index.tsx","webpack:///./packages/core-attribute-permission/components/VirtualizedListItem/index.tsx","webpack:///./packages/core-attribute-permission/components/VirtualizedList/index.tsx","webpack:///./packages/core-attribute-permission/components/VirtualizedListTrapFocus/PermissionItemMenuFocusTrap.tsx","webpack:///./packages/core-attribute-permission/components/VirtualizedListTrapFocus/VirtualizedPermissionListItemFocusTrap.tsx","webpack:///./packages/core-attribute-permission/components/VirtualizedListTrapFocus/index.tsx","webpack:///./packages/core-user/components/UserLevelSelector/index.tsx","webpack:///./packages/core-attribute-permission/components/FormBody/index.tsx","webpack:///./packages/core-attribute-permission/components/Dialog/index.tsx","webpack:///./packages/core-attribute-permission/context/constants.ts","webpack:///./packages/core-attribute-permission/context/reducer.ts","webpack:///./packages/core-attribute-permission/context/actions.ts","webpack:///./packages/core-attribute-permission/api/getAttributePermissions.ts","webpack:///./packages/core-attribute-permission/api/setAttributePermissions.ts","webpack:///./packages/core-attribute-permission/context/index.tsx","webpack:///./packages/core-attribute-permission/containers/Permissions/index.tsx","webpack:///./packages/core-attribute/context/index.tsx","webpack:///./packages/core-attribute/containers/Dropdown/index.tsx","webpack:///./packages/core-components/Form/TextField/textFieldClasses.ts","webpack:///./packages/core-components/Form/TextField/styledTextFieldClasses.ts","webpack:///./packages/core-components/Form/TextField/StyledTextField.tsx","webpack:///./packages/core-components/Form/TextField/TextField.tsx","webpack:///./packages/core-components/Form/TextField/index.tsx","webpack:///./packages/core-components/TabPanel/tabPanelClasses.ts","webpack:///./packages/core-components/TabPanel/TabPanel.tsx","webpack:///./packages/core-search-rules/rules/constants.ts","webpack:///./packages/core-asset/utils/createAssetObject.ts","webpack:///./packages/core-asset/utils/isDocumentFileTypeAsset.ts","webpack:///./packages/core-asset/utils/isImageFileTypeAsset.ts","webpack:///./packages/core-asset/utils/isVideoFileTypeAsset.ts","webpack:///./packages/core-asset/utils/getGeneralAssetFileType.ts","webpack:///./packages/core-asset/utils/getDocumentFileTypeAssetInfoLabel.ts","webpack:///./packages/core-asset/utils/getMediaFileTypeAssetInfoLabel.ts","webpack:///./packages/core-asset/utils/getImageFileTypeAssetInfoLabel.ts","webpack:///./packages/core-asset/utils/getAssetFileTypeInfoLabel.ts","webpack:///./packages/core-asset/utils/isAssetCheckedOut.ts","webpack:///./packages/core-asset/utils/isDefaultIcon.ts","webpack:///./packages/core-asset/utils/routeToAsset.ts","webpack:///./packages/core-attribute/api/getSemanticObjectAutoList.ts","webpack:///./packages/core-attribute/api/metadataAutoCompleteLookup.ts","webpack:///./packages/core-attribute/api/metadataDatasetAutoList.ts","webpack:///./packages/core-attribute/api/vocabularyValueLookup.ts","webpack:///./packages/core-components/ContextMenu/contextMenuClasses.ts","webpack:///./packages/core-components/ContextMenu/ContextMenu.tsx","webpack:///./packages/core-components/ContextMenu/ContextMenuService.tsx","webpack:///./packages/core-components/ContextMenu/withContextMenu.tsx","webpack:///./packages/core-components/Tooltip/Tooltip.tsx","webpack:///./packages/core-attribute/utils/actionChangesValue.ts","webpack:///./packages/core-attribute/utils/getAttributeComponent.ts","webpack:///./packages/core-attribute/utils/getTemplatesEffectedByLookup.ts","webpack:///./packages/core-attribute/utils/isAppendable.ts","webpack:///./packages/core-attribute/utils/isSystemAttribute.ts","webpack:///./packages/core-attribute/utils/normalizeValue.ts","webpack:///./packages/core-components/Form/TextField/ReadOnlyTextField.tsx","webpack:///./packages/core-components/Drawer/constants.ts","webpack:///./packages/core-components/Drawer/locales.ts","webpack:///./packages/core-components/Drawer/drawerToolbarClasses.ts","webpack:///./packages/core-components/Drawer/DrawerToolbar.tsx","webpack:///./packages/core-components/Drawer/drawerClasses.ts","webpack:///./packages/core-components/Drawer/Drawer.tsx","webpack:///./packages/core-components/Drawer/withDrawer.tsx","webpack:///./packages/core-components/MenuItem/menuItemClasses.ts","webpack:///./packages/core-components/MenuItem/MenuItem.tsx","webpack:///./packages/core-components/hooks/useUserPref.ts","webpack:///./packages/core-attribute/parsers/base.ts","webpack:///./packages/core-search-rules/rules/metadata/constants.ts","webpack:///./packages/core-components/hooks/useEnhancedRef.ts","webpack:///./packages/core-search-rules/utils/createValidationObject.ts","webpack:///./packages/core-attribute-grid-editor/store/change/constants.ts","webpack:///./packages/core-attribute-grid-editor/store/change/reducer.ts","webpack:///./packages/core-attribute-grid-editor/store/change/index.tsx","webpack:///./packages/core-attribute-grid-editor/store/grid/constants.ts","webpack:///./packages/core-attribute-grid-editor/store/grid/reducer.ts","webpack:///./packages/core-attribute/parsers-out/base.ts","webpack:///./packages/core-attribute/parsers-out/date.ts","webpack:///./packages/core-attribute/parsers-out/multi-select.ts","webpack:///./packages/core-attribute/parsers-out/number.ts","webpack:///./packages/core-attribute/parsers-out/select.ts","webpack:///./packages/core-attribute/parsers-out/tag.ts","webpack:///./packages/core-attribute/parsers-out/semantic.ts","webpack:///./packages/core-attribute/parsers-out/tag-vocab.ts","webpack:///./packages/core-attribute/parsers-out/text.ts","webpack:///./packages/core-attribute/parsers-out/textarea.ts","webpack:///./packages/core-attribute/parsers-out/index.ts","webpack:///./packages/core-attribute-grid-editor/store/selection/constants.ts","webpack:///./packages/core-attribute-grid-editor/store/selection/reducer.ts","webpack:///./packages/core-attribute-grid-editor/store/selection/index.tsx","webpack:///./packages/core-attribute-grid-editor/store/selection/utils.ts","webpack:///./packages/core-attribute-grid-editor/store/progress/constants.ts","webpack:///./packages/core-attribute-grid-editor/store/progress/reducer.ts","webpack:///./packages/core-attribute-grid-editor/store/progress/index.tsx","webpack:///./packages/core-attribute-grid-editor/store/grid/data/useSave.ts","webpack:///./packages/core-attribute-grid-editor/store/grid/get-values/all.ts","webpack:///./packages/core-attribute-grid-editor/store/grid/get-values/loose.ts","webpack:///./packages/core-attribute-grid-editor/store/grid/set-values/all.ts","webpack:///./packages/core-attribute-grid-editor/store/grid/reset-values/all.ts","webpack:///./packages/core-attribute-grid-editor/store/grid/index.tsx","webpack:///./packages/core-attribute-grid-editor/store/grid/data/useGet.ts","webpack:///./packages/core-attribute-grid-editor/store/grid/set-values/specific.ts","webpack:///./packages/core-attribute-grid-editor/store/grid/reset-values/loose.ts","webpack:///./packages/core-attribute-grid-editor/store/grid/set-values/loose.ts","webpack:///./packages/core-components/VirtualizedTable/contexts/TableLayout/TableLayout.tsx","webpack:///./packages/core-components/VirtualizedTable/contexts/TableRowSelection/TableRowSelection.tsx","webpack:///./packages/core-components/DialogTitle/dialogTitleClasses.ts","webpack:///./packages/core-components/DialogTitle/DialogTitle.tsx","webpack:///./packages/core-asset/collections/singleton/attributeSets.ts","webpack:///./packages/core-asset-expiration/locales.ts","webpack:///./packages/core-components/ArrowFocusTrap/components/ArrowFocusTrapItem/arrowFocusTrapItemClasses.ts","webpack:///./packages/core-components/ArrowFocusTrap/store/context.ts","webpack:///./packages/core-components/ArrowFocusTrap/hooks/useArrowFocusTrapItem/useArrowFocusTrapItem.ts","webpack:///./packages/core-components/ArrowFocusTrap/components/ArrowFocusTrapItem/ArrowFocusTrapItem.tsx","webpack:///./packages/core-components/ArrowFocusTrap/store/actions.ts","webpack:///./packages/core-components/ArrowFocusTrap/hooks/useArrowFocusItemAction/useArrowFocusItemAction.ts","webpack:///./packages/core-components/ArrowFocusTrap/components/ArrowFocusTrapItemActions/arrowFocusTrapItemActionsClasses.ts","webpack:///./packages/core-components/ArrowFocusTrap/components/ArrowFocusTrapItemActions/ArrowFocusTrapItemActions.tsx","webpack:///./packages/core-components/ArrowFocusTrap/store/reducer.ts","webpack:///./packages/core-components/ArrowFocusTrap/contexts/ArrowFocusTrapContext/ArrowFocusTrapContext.tsx","webpack:///./packages/core-components/ArrowFocusTrap/withArrowFocusTrap.tsx","webpack:///./packages/core-components/ArrowFocusTrap/hooks/useArrowFocusTrap/useArrowFocusTrap.ts","webpack:///./packages/core-components/ArrowFocusTrap/components/ArrowFocusTrapItems/arrowFocusTrapItemsClasses.ts","webpack:///./packages/core-components/ArrowFocusTrap/components/ArrowFocusTrapItems/ArrowFocusTrapItems.tsx","webpack:///./packages/core-components/ActionMenu/actionMenuClasses.ts","webpack:///./packages/core-components/ActionMenu/ActionMenu.tsx","webpack:///./packages/core-components/ErrorBoundary/_ErrorBoundary.tsx","webpack:///./packages/core-components/ErrorBoundary/ErrorBoundary.tsx","webpack:///./packages/core-components/ErrorBoundary/withErrorBoundary.tsx","webpack:///./packages/core-components/ToggleButton/toggleButtonClasses.ts","webpack:///./packages/core-components/ToggleButton/ToggleButton.tsx","webpack:///./packages/core-components/MenuList/MenuList.tsx","webpack:///./packages/core-components/Theme/Theme.tsx","webpack:///./packages/core-components/hooks/useBackboneCollection.ts","webpack:///./packages/core-attribute/components/Attribute/index.tsx","webpack:///./packages/core-components/Chip/chipClasses.ts","webpack:///./packages/core-components/Form/SelectField/components/Select/selectFieldClasses.ts","webpack:///./packages/core-components/Form/SelectField/components/Input/index.tsx","webpack:///./packages/core-components/Form/SelectField/components/ListBox/index.tsx","webpack:///./packages/core-attribute/locales.ts","webpack:///./packages/core-components/Confirmation/ConfirmationService.tsx","webpack:///./packages/core-components/DragResize/constants.ts","webpack:///./packages/core-asset/utils/isMediaFileTypeAsset.ts","webpack:///./packages/core-asset/constants.ts","webpack:///./packages/core-components/DownloadDialog/components/Dialog/index.tsx","webpack:///./packages/core-components/DownloadDialog/store/constants.ts","webpack:///./packages/core-components/DownloadDialog/store/reducer.ts","webpack:///./packages/core-components/DownloadDialog/store/index.tsx","webpack:///./packages/core-components/DownloadDialog/store/api/getProgressReport.ts","webpack:///./packages/core-components/DownloadDialog/store/api/setProgressReportNotify.ts","webpack:///./packages/core-components/DownloadDialog/withDownloadDialog.tsx","webpack:///./packages/core-components/ScrollShadow/useScrollAddedNodesIntoView.tsx","webpack:///./packages/core-components/ScrollShadow/ScrollShadow.tsx","webpack:///./packages/core-components/ScrollShadow/useScrollListener.tsx","webpack:///./packages/core-attribute/hooks/useAttributes/constants.ts","webpack:///./packages/core-attribute/hooks/useAttributes/reducer.ts","webpack:///./packages/core-attribute/hooks/useAttributes/useAttributes.ts","webpack:///./packages/core-components/ActionMenuList/ActionMenuList.tsx","webpack:///./packages/core-components/Tab/Tab.tsx","webpack:///./packages/core-components/Form/Form.tsx","webpack:///./packages/core-components/hooks/useMediaQuery.ts","webpack:///./packages/core-cart/collections/currentCart.js","webpack:///./build-targets/portal/packages/core-cart/collections/localSelection.js","webpack:///./build-targets/portal/packages/core-cart/collections/singleton/cart.ts","webpack:///./packages/core-components/hooks/useDispatcher.ts","webpack:///./packages/core-components/hooks/useImageLoader.tsx","webpack:///./packages/core-search-rules/rules/checkouts/constants.ts","webpack:///./packages/core-search-rules/rules/date/constants.ts","webpack:///./packages/core-search-rules/rules/keyword/constants.ts","webpack:///./packages/core-search-rules/rules/visual/constants.ts","webpack:///./packages/core-upload-asset/actions.ts","webpack:///./packages/core-components/VirtualizedList/hooks/useReactQueryUtils.ts","webpack:///./packages/core-components/VirtualizedList/hooks/useVirtualizedListArrowTabTrap/constants.ts","webpack:///./packages/core-components/VirtualizedList/hooks/useVirtualizedListArrowTabTrap/reducer.ts","webpack:///./packages/core-components/VirtualizedList/hooks/useVirtualizedListArrowTabTrap/actions.ts","webpack:///./packages/core-components/VirtualizedList/hooks/useVirtualizedListArrowTabTrap/useVirtualizedListArrowTabTrap.tsx","webpack:///./packages/core/functionality/select2.js","webpack:///./build-targets/portal/packages/core/functionality/select2.js","webpack:///./packages/core-components/ColoredAvatar/index.tsx","webpack:///./packages/core-components/Form/withForm.tsx","webpack:///./packages/core-components/hooks/useDocumentKeyDown.ts","webpack:///./packages/core-cart-current/actions.ts","webpack:///./packages/core-attribute-set/index.ts","webpack:///./packages/core-components/CountChip/CountChip.tsx","webpack:///./packages/core-components/Alert/Alert.tsx","webpack:///./packages/core-attribute/parsers/date.ts","webpack:///./packages/core-search-rules/rules/fileAspect/constants.ts","webpack:///./packages/core-components/DragResize/DragResize.tsx","webpack:///./packages/core-components/DragResize/dragResizeHandleClasses.ts","webpack:///./packages/core-components/FormDialog/FormDialog.tsx","webpack:///./packages/core-attribute/validators/number.ts","webpack:///./packages/core-attribute/parsers/number.ts","webpack:///./packages/core-components/VirtualizedList/react-query/index.ts","webpack:///./packages/core-user/api/getGroupAutoList.ts","webpack:///./packages/core-user/api/getUserAutoList.ts","webpack:///./packages/core-asset-custom-thumbnail/constants.ts","webpack:///./packages/core-cart-current/enablers.ts","webpack:///./packages/core-attribute-grid-editor/containers/GridEditor/index.tsx","webpack:///./packages/core-attribute-set/components/Set/index.tsx","webpack:///./packages/core-cart-current/locales.ts","webpack:///./packages/core-asset-repurpose/constants.ts","webpack:///./packages/core-search-visual/enablers.ts","webpack:///./packages/core-components/Table/TableCell/TableCell.tsx","webpack:///./packages/core-components/Table/TableCell/ActionsTableCell.tsx","webpack:///./packages/core-components/Table/TableColumn/TableColumn.tsx","webpack:///./packages/core-components/Table/TableColumn/ResizableTableColumn.tsx","webpack:///./packages/core-components/Table/TableColumn/index.tsx","webpack:///./packages/core-components/Table/TableHead/TableHead.tsx","webpack:///./packages/core-components/Table/TableRow/TableRow.tsx","webpack:///./packages/core-components/Table/TableRow/SortableTableRowHandle.tsx","webpack:///./packages/core-components/Table/TableRow/SortableTableRow.tsx","webpack:///./packages/core-components/Table/TableRow/index.tsx","webpack:///./packages/core-components/Table/TableRow/EditableTableRow.tsx","webpack:///./packages/core-components/Table/TableBody/TableBody.tsx","webpack:///./packages/core-components/Table/TableBody/SortableTableBody.tsx","webpack:///./packages/core-components/Table/TableBody/index.tsx","webpack:///./packages/core-components/Table/TablePagination/TablePagination.tsx","webpack:///./packages/core-components/Table/TableToolbar/TableToolbar.tsx","webpack:///./packages/core-components/Table/Table.tsx","webpack:///./packages/core-components/VirtualizedList/components/VirtualizedList/virtualizedListClasses.ts","webpack:///./packages/core-components/VirtualizedList/components/VirtualizedList/VirtualizedList.tsx","webpack:///./packages/core-components/VirtualizedList/components/VirtualizedList/virtualizedListScrollBorderClasses.ts","webpack:///./packages/core-components/VirtualizedList/components/VirtualizedList/VirtualizedListScrollBorder.tsx","webpack:///./packages/core-components/DialogAlert/DialogAlert.tsx","webpack:///./packages/core-components/Dialog/Dialog.tsx","webpack:///./packages/core-attribute-set/hooks/useAttributeSet.ts","webpack:///./packages/core-attribute-set/contexts/AttributeSetContext.tsx","webpack:///./packages/core-user/components/UserAutoList/UserAutoList.tsx","webpack:///./packages/core-category/api/getCategoryAutoList.ts","webpack:///./packages/core-upload/properties/upload.js","webpack:///./packages/core-upload/models/upload.js","webpack:///./packages/core-category/api/getCategoryData.ts","webpack:///./packages/core-components/Chip/components/Skeleton/index.tsx","webpack:///./packages/core-search-rules/rules/categoryId/constants.ts","webpack:///./packages/core-asset/utils/getAssetFileSizeLabel.ts","webpack:///./packages/core-components/Dialog/withNiceModal.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/Date/index.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/MultiSelect/index.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/MetadataLookup/Lookup.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/Number/index.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/Select/index.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/Semantic/index.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/Tag/index.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/TagVocab/index.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/MetadataLookup/InputAdornment.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/Text/index.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/components/Action/ClearToggle.tsx","webpack:///./packages/core-attribute/components/EditableAttribute/EditableAttribute.tsx","webpack:///./packages/core-user/utils/getCorrectedUserSelector.ts","webpack:///./packages/core-user/utils/setPreference.ts","webpack:///./packages/core-asset-expiration/api/expireAsset.ts","webpack:///./packages/core-components/VirtualizedList/index.ts","webpack:///./packages/core/constants.ts","webpack:///./packages/core-search-rules/utils/convertToRules.ts","webpack:///./packages/core-components/VirtualizedList/components/VirtualizedListClassicPager/VirtualizedListClassicPager.tsx","webpack:///./packages/core-components/VirtualizedList/components/VirtualizedListPager/VirtualizedListPager.tsx","webpack:///./packages/core-attribute/api/metadataDatasetLookup.ts","webpack:///./packages/core-attribute/components/Dropdown/index.tsx","webpack:///./packages/core-components/Chip/components/Skeleton/chipSkeletonClasses.ts","webpack:///./packages/core-components/Form/SelectField/components/ValueChip/index.tsx","webpack:///./packages/core-components/Form/hooks/useErrorFocus.ts","webpack:///./packages/core-attribute/hooks/useAttributes/index.ts","webpack:///./packages/core-attribute/utils/parseValue.ts","webpack:///./packages/core-attribute/utils/isMultiValue.ts","webpack:///./packages/core-asset/collections/singleton/index.ts","webpack:///./packages/core-share/collections/sharedResources.js","webpack:///./packages/core-search-rules/rules/cart/constants.ts","webpack:///./packages/core-search-rules/rules/contents/constants.ts","webpack:///./packages/core-attribute/hooks/useMetadataLookupsAllowed.ts","webpack:///./packages/core-components/DragResize/dragResizeClasses.ts","webpack:///./packages/core-components/DragResize/DragResizeHandle.tsx","webpack:///./packages/core-components/DragResize/useDragResize.ts","webpack:///./packages/core-components/FormDialog/formDialogClasses.ts","webpack:///./packages/core-user/locales.ts","webpack:///./packages/core-asset-custom-thumbnail/locales.ts","webpack:///./packages/core-asset/utils/assetIsPresent.ts","webpack:///./packages/core-cart-current/hooks/useCartBarActions.ts","webpack:///./packages/core-user/utils/isPublicUser.ts","webpack:///./packages/core-attribute-set/api/getAttributeFieldSet.ts","webpack:///./packages/core-attribute-set/components/Sets/index.tsx","webpack:///./packages/core-attribute-set/components/SortableSet/index.tsx","webpack:///./packages/core-attribute-set/components/SortableSets/index.tsx","webpack:///./packages/core-asset-repurpose/locales.ts","webpack:///./packages/core-cart-asset/locales.ts","webpack:///./packages/core-asset/services/resync/locales.ts","webpack:///./packages/core-asset/services/resync/enablers.ts","webpack:///./packages/core-asset/services/resync/constants.ts","webpack:///./node_modules/buffer/index.js","webpack:///./packages/core/lib/netx-react-view.tsx","webpack:///./packages/core-user/api/getUserGroupAutoList.ts","webpack:///./packages/core-user/components/UserGroupAutoList/UserGroupAutoList.tsx","webpack:///./packages/core-user/components/UserSelector/userSelectorListItemClasses.ts","webpack:///./packages/core-user/components/UserSelector/UserSelectorListItem.tsx","webpack:///./packages/core-user/components/UserSelector/UserSelectorListItems.tsx","webpack:///./packages/core-user/components/UserSelector/userSelectorClasses.ts","webpack:///./packages/core-user/components/UserSelector/UserSelector.tsx","webpack:///./packages/core-cart-asset/utils/assetIsInCart.ts","webpack:///./packages/core-cart-asset/enablers.ts","webpack:///./packages/core-attribute/components/AttributeSkeleton/index.tsx","webpack:///./packages/core-attribute/components/ReadOnlyAttribute/index.tsx","webpack:///./packages/core-attribute-grid-editor/properties/errors.ts","webpack:///./packages/core-attribute-grid-editor/properties/messages.ts","webpack:///./packages/core-cart-current/hooks/useCurrentCart/useCurrentCart.ts","webpack:///./packages/core-user/components/GroupAutoList/GroupAutoList.tsx","webpack:///./packages/core-attribute-set-selection/components/SetSelector/index.tsx","webpack:///./packages/core-cart/collections/singleton/savedCart.ts","webpack:///./packages/core-asset-repurpose/actions.ts","webpack:///./build-targets/portal/packages/core/functionality/materialCheckboxes.js","webpack:///./packages/core-asset-custom-thumbnail/hooks/useAssetCustomThumbnail/useAssetCustomThumbnail.ts","webpack:///./packages/core-asset/services/share/constants.ts","webpack:///./packages/core-asset/services/share/locales.ts","webpack:///./packages/core-search-visual/locales.ts","webpack:///./packages/core-asset/hooks/useAssetTasks/useAssetTasks.ts","webpack:///./packages/core-asset/components/AssetImage/assetImageWorkingClasses.ts","webpack:///./packages/core-asset/components/AssetImage/AssetImageWorking.tsx","webpack:///./packages/core-asset/components/AssetImage/assetImageClasses.ts","webpack:///./packages/core-asset/components/AssetImage/AssetImage.tsx","webpack:///./packages/core-components/ItemManager/constants.ts","webpack:///./packages/core-components/ItemManager/store/reducers.ts","webpack:///./packages/core-components/ItemManager/ItemManagerService.tsx","webpack:///./packages/core-components/ItemManager/store/actions.ts","webpack:///./packages/core-components/ItemManager/ItemManager.tsx","webpack:///./packages/core-components/ItemManager/ItemManagerSortableHandle.tsx","webpack:///./packages/core-components/ItemManager/ItemManagerItem.tsx","webpack:///./packages/core-components/ItemManager/ItemManagerSortableItem.tsx","webpack:///./packages/core-components/SearchFilter/searchFilterEndAdornmentClasses.ts","webpack:///./packages/core-components/SearchFilter/SearchFilterEndAdornment.tsx","webpack:///./packages/core-components/SearchFilter/searchFilterStartAdornmentClasses.ts","webpack:///./packages/core-components/SearchFilter/SearchFilterStartAdornment.tsx","webpack:///./packages/core-components/SearchFilter/SearchFilter.tsx","webpack:///./packages/core-components/SearchFilter/searchFilterClasses.ts","webpack:///./packages/core-attribute/hooks/useMetadataLookups.ts","webpack:///./packages/core-search-rules/rules/fileFormat/constants.ts","webpack:///./packages/core-search-rules/rules/fileSize/constants.ts","webpack:///./packages/core-search-rules/rules/user/constants.ts","webpack:///./packages/core-asset-custom-thumbnail/actions.ts","webpack:///./packages/core-asset/utils/assetHasAudio.ts","webpack:///./packages/core-asset/utils/assetHasVideo.ts","webpack:///./packages/core-asset-project/actions.ts","webpack:///./packages/core-grid/lib/sorters/client.js","webpack:///./packages/core-cart/collections/singleton/index.ts","webpack:///./packages/core-asset-expiration/actions.ts","webpack:///./packages/core-asset/services/delete/actions.ts","webpack:///./packages/core-asset/services/delete/locales.ts","webpack:///./packages/core-asset/services/resync/actions.ts","webpack:///./packages/core-search-visual/actions.ts","webpack:///./packages/core-search-rules/rules/categoryId/categoryIdRule.ts","webpack:///./packages/core-search-rules/rules/keyword/keywordRule.ts","webpack:///./packages/core-attribute/store/attributesStore.ts","webpack:///./packages/core-asset-expiration/components/AssetExpiration/AssetExpirationForm.tsx","webpack:///./packages/core-asset-expiration/components/AssetExpiration/AssetExpiration.tsx","webpack:///./packages/core-asset-expiration/contexts/AssetExpiration/AssetExpiration.tsx","webpack:///./packages/core-asset-expiration/components/AssetExpirationBadge/assetExpirationBadgeClasses.ts","webpack:///./packages/core-asset-expiration/components/AssetExpirationBadge/AssetExpirationBadge.tsx","webpack:///./packages/core-attribute/validators/date.ts","webpack:///./packages/core-attribute/validators/multi-select.ts","webpack:///./packages/core-attribute/validators/select.ts","webpack:///./packages/core-attribute/validators/tag.ts","webpack:///./packages/core-attribute/validators/semantic.ts","webpack:///./packages/core-attribute/validators/tag-vocab.ts","webpack:///./packages/core-attribute/validators/text.ts","webpack:///./packages/core-attribute/validators/textarea.ts","webpack:///./packages/core-attribute/validators/index.ts","webpack:///./packages/core-search-rules/rules/metadata/utils/getMetadataTypeLabel.ts","webpack:///./packages/core-search-rules/rules/metadata/utils/getMetadataTypeOptions.ts","webpack:///./packages/core-search-rules/rules/metadata/utils/metadataNameHackIn.ts","webpack:///./packages/core-search-rules/rules/metadata/utils/metadataNameHackOut.ts","webpack:///./packages/core-asset-project/enablers.ts","webpack:///./packages/core-asset-project/locales.ts","webpack:///./packages/core-category/constants.ts","webpack:///./packages/core-share-request/constants.ts","webpack:///./packages/core-cart/models/savedCart.js","webpack:///./packages/core-cart-asset/actions.ts","webpack:///./packages/core-asset/services/share/actions.ts","webpack:///./packages/core-components/VirtualizedTable/index.ts","webpack:///./packages/core-search-rules/rules/cart/cartRule.ts","webpack:///./packages/core-asset-repurpose/enablers.ts","webpack:///./packages/core-components/Form/NumberField/NumberField.tsx","webpack:///./packages/core-components/Theme/withTheme.tsx","webpack:///./packages/core-components/Theme/Logo.tsx","webpack:///./packages/core-components/Theme/styled.ts","webpack:///./packages/core-components/Theme/composeClasses.ts","webpack:///./packages/core-search-rules/rules/advancedRaw/constants.ts","webpack:///./packages/core-search-rules/rules/attributeHistory/constants.ts","webpack:///./packages/core-search-rules/rules/expiration/constants.ts","webpack:///./packages/core-search-rules/rules/fileFormatFamily/constants.ts","webpack:///./packages/core-search-rules/rules/savedSearch/constants.ts","webpack:///./packages/core-components/VirtualizedList/react-query/getIndexedResults.ts","webpack:///./packages/core-components/VirtualizedList/react-query/getNextPageParam.ts","webpack:///./packages/core-asset/services/asset/api/getAssetBean.ts","webpack:///./packages/core-attribute-grid-editor/enablers.ts","webpack:///./packages/core-attribute-set/api/index.ts","webpack:///./packages/core-attribute-set/components/index.ts","webpack:///./packages/core-attribute-set/contexts/index.ts","webpack:///./packages/core-search-visual/constants.ts","webpack:///./node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack:///./packages/core-search-rules/rules/cart/defaults.ts","webpack:///./packages/core-search-rules/rules/categoryId/defaults.ts","webpack:///./packages/core-search-rules/rules/locales.ts","webpack:///./packages/core-search-rules/rules/keyword/defaults.ts","webpack:///./packages/core-search-rules/rules/metadata/metadataRule.ts","webpack:///./packages/core-search-rules/rules/metadata/defaults.ts","webpack:///./packages/core-search-rules/utils/encodeBase64Rules.ts","webpack:///./packages/core-custom-action/actions.ts","webpack:///./packages/core-custom-action/constants.ts","webpack:///./packages/core-custom-action/locales.ts","webpack:///./packages/core-components/ClipboardTextField/locales.ts","webpack:///./packages/core-components/ClipboardTextField/ClipboardTextField.tsx","webpack:///./packages/core-components/URLTextField/locales.ts","webpack:///./packages/core-components/URLTextField/urlTextFieldClasses.ts","webpack:///./packages/core-components/URLTextField/URLTextField.tsx","webpack:///./packages/core-custom-action/components/CustomActionEndpoint/CustomActionEndpoint.tsx","webpack:///./packages/core-custom-action/api/deleteCustomAction.ts","webpack:///./packages/core-custom-action/api/getCustomActionMenu.ts","webpack:///./packages/core-custom-action/api/getCustomActions.ts","webpack:///./packages/core-custom-action/api/isCustomActionEndpointUrlAccessible.ts","webpack:///./packages/core-custom-action/api/resetCustomActionSecret.ts","webpack:///./packages/core-custom-action/api/setCustomAction.ts","webpack:///./packages/core-custom-action/api/triggerCustomAction.ts","webpack:///./packages/core-custom-action/api/react-query/deleteCustomAction.ts","webpack:///./packages/core-custom-action/api/react-query/getCustomActionMenu.ts","webpack:///./packages/core-custom-action/api/react-query/getCustomActions.ts","webpack:///./packages/core-custom-action/api/react-query/isCustomActionEndpointUrlAccessible.ts","webpack:///./packages/core-custom-action/api/react-query/setCustomAction.ts","webpack:///./packages/core-custom-action/hooks/useIsCustomActionEndpointUrlAccessible.ts","webpack:///./packages/core-custom-action/components/CustomActionEndpoint/CustomActionEndpointPayloadUrl.tsx","webpack:///./packages/core-custom-action/components/CustomActionEndpoint/CustomActionEndpointTargetUrl.tsx","webpack:///./packages/core-custom-action/components/CustomActionCreated/customActionCreatedClasses.ts","webpack:///./packages/core-custom-action/components/CustomActionCreated/CustomActionCreated.tsx","webpack:///./packages/core-custom-action/components/CustomActionCreated/CustomActionCreatedDialog.tsx","webpack:///./packages/core-custom-action/components/CustomActionEditAccess/customActionEditAccessClasses.ts","webpack:///./packages/core-custom-action/components/CustomActionEditAccess/CustomActionEditAccess.tsx","webpack:///./packages/core-custom-action/components/CustomActionEdit/CustomActionEdit.tsx","webpack:///./packages/core-custom-action/components/CustomActionEdit/CustomActionEditDialog.tsx","webpack:///./packages/core-custom-action/contexts/CustomActionsContext.tsx","webpack:///./packages/core-custom-action/hooks/useCustomActionActions.ts","webpack:///./packages/core-custom-action/components/CustomActionBlockingDialog/CustomActionBlockingDialog.tsx","webpack:///./packages/core-custom-action/hooks/useCustomActionMenus.ts","webpack:///./packages/core-custom-action/hooks/useCustomActions.ts","webpack:///./packages/core-attribute/formatters/base.ts","webpack:///./packages/core-attribute/formatters/date.ts","webpack:///./packages/core-attribute/formatters/multi-select.ts","webpack:///./packages/core-attribute/formatters/number.ts","webpack:///./packages/core-attribute/formatters/select.ts","webpack:///./packages/core-attribute/formatters/tag.ts","webpack:///./packages/core-attribute/formatters/semantic.ts","webpack:///./packages/core-attribute/formatters/tag-vocab.ts","webpack:///./packages/core-attribute/formatters/text.ts","webpack:///./packages/core-attribute/formatters/textarea.ts","webpack:///./packages/core-attribute/formatters/index.ts","webpack:///./packages/core-components/Form/SelectField/components/ReadOnlyMultiSelect/index.tsx","webpack:///./packages/core-components/Form/SelectField/components/ReadOnlySelect/index.tsx","webpack:///./packages/core-attribute-set/containers/Sets/index.tsx","webpack:///./packages/core-components/VirtualizedList/contexts/VirtualizedListArrowTabTrap/VirtualizedListArrowTabTrap.tsx","webpack:///./packages/core-asset/components/Attributes/Attribute/utils.ts","webpack:///./packages/core-attribute-set-selection/index.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRowCells/Generic.tsx","webpack:///./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:///./packages/core-category/services/category/enablers.ts","webpack:///./packages/core-dashboard/properties/dashboard.js","webpack:///./packages/core-app/views/appGalleryHeaderView.js","webpack:///./build-targets/portal/packages/core-app/views/appGalleryHeaderView.js","webpack:///./packages/core-category/views/categoryTreeNodeView.js","webpack:///./build-targets/portal/packages/core-category/views/categoryTreeNodeView.js","webpack:///./packages/core-app/views/appGalleryView.js","webpack:///./build-targets/portal/packages/core-app/views/appGalleryView.js","webpack:///./packages/core-cms/services/settings/locales.ts","webpack:///./packages/core-components/Confirmation/ConfirmationDialog.tsx","webpack:///./packages/core/lib/next-query-client.tsx","webpack:///./packages/core-grid/lib/sorters/server.js","webpack:///./packages/core-cart/collections/savedCarts.js","webpack:///./node_modules/react-scroll-sync/dist/index.js","webpack:///./packages/core-search-rules/utils/decodeBase64Rules.ts","webpack:///./packages/core-search-rules/utils/convertRulesToCollection.ts","webpack:///./src/js/lib/backgrid-exposed.js","webpack:///./packages/core-asset/collections/assetAttributeSets_.js","webpack:///./packages/core-asset/models/assetAttributeSet_system.js","webpack:///./packages/core-asset/collections/assetAttributeSets_system.js","webpack:///./packages/core-asset/collections/assetAttributeSets_user.js","webpack:///./packages/core-asset/collections/assetAttributeSets_filter.js","webpack:///./packages/core-cms/services/settings/utils/getAttributesIdsForContext.ts","webpack:///./packages/core-cms/services/settings/utils/settingsDataToBrandPortal.ts","webpack:///./packages/core-asset/collections/assetAttributeSets.js","webpack:///./packages/core-components/VirtualizedTable/hooks/useTableRowSelection/constants.ts","webpack:///./packages/core-components/VirtualizedTable/hooks/useTableRowSelection/actions.ts","webpack:///./packages/core-components/VirtualizedTable/hooks/useTableRowSelection/reducer.ts","webpack:///./packages/core-components/VirtualizedTable/hooks/useTableRowSelection/useTableRowSelection.ts","webpack:///./packages/core-components/VirtualizedTable/hooks/useTableLayout/constants.ts","webpack:///./packages/core-components/VirtualizedTable/hooks/useTableLayout/actions.ts","webpack:///./packages/core-components/VirtualizedTable/hooks/useTableLayout/reducer.ts","webpack:///./packages/core-components/VirtualizedTable/hooks/useTableLayout/useTableLayout.ts","webpack:///./packages/core-attribute/parsers/multi-select.ts","webpack:///./packages/core-attribute/parsers/select.ts","webpack:///./packages/core-attribute/parsers/tag.ts","webpack:///./packages/core-attribute/parsers/semantic.ts","webpack:///./packages/core-attribute/parsers/tag-vocab.ts","webpack:///./packages/core-attribute/parsers/text.ts","webpack:///./packages/core-attribute/parsers/textarea.ts","webpack:///./packages/core-attribute/parsers/index.ts","webpack:///./node_modules/@dnd-kit/modifiers/dist/modifiers.esm.js","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableBody/VirtualizedTableBody.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRow/DraggableTableRow.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableBody/VirtualizedSortableTableBody.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRow/virtualizedLoadingTableRowCellClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRow/VirtualizedLoadingTableRowCell.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRow/virtualizedLoadingTableRowClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRow/VirtualizedLoadingTableRow.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRow/index.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeader/virtualizedTableHeaderClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeader/virtualizedTableVerticalScrollSpacerClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeader/VirtualizedTableVerticalScrollSpacer.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeader/VirtualizedTableHeader.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTable/virtualizedTableClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTable/VirtualizedSortableTable.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTable/VirtualizedTable.tsx","webpack:///./packages/core/functionality/table.js","webpack:///./build-targets/portal/packages/core/functionality/table.js","webpack:///./packages/core-components/Drawer/Fallback.tsx","webpack:///./packages/core-asset/models/assetAttributeSet_user.js","webpack:///./packages/core-attribute-grid-editor/index.tsx","webpack:///./packages/core-grid/lib/webworkers/selection_points.js","webpack:///./packages/core-cart/properties/cart.js","webpack:///./packages/core-grid/properties/grid.js","webpack:///./packages/core-grid/lib/configs/default.js","webpack:///./packages/core-asset/components/AssetImage/utils.ts","webpack:///./packages/core-cart-saved/actions.ts","webpack:///./packages/core-components/hooks/useOnlineStatus.ts","webpack:///./packages/core-pdf-viewer/actions.ts","webpack:///./packages/core-category/views/categoryTreeNodesView.js","webpack:///./build-targets/portal/packages/core-category/views/categoryTreeNodesView.js","webpack:///./packages/core-components/DragResize/index.ts","webpack:///./packages/core-attribute-grid-editor/columns.ts","webpack:///./packages/core-upload-asset/index.ts","webpack:///./node_modules/@babel/runtime/helpers/inherits.js","webpack:///./packages/core-search-rules/rules/categoryId/locales.ts","webpack:///./packages/core-search-rules/rules/categoryId/utils/rawCategoryIdCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/categoryId/model.ts","webpack:///./packages/core-search-rules/rules/categoryId/validate.ts","webpack:///./packages/core-search-rules/rules/keyword/locales.ts","webpack:///./packages/core-search-rules/rules/keyword/utils/rawKeywordCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/keyword/model.ts","webpack:///./packages/core-search-rules/rules/keyword/validate.ts","webpack:///./packages/core-search-rules/rules/metadata/locales.ts","webpack:///./packages/core-search-rules/rules/metadata/utils/rawMetadataCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/metadata/model.ts","webpack:///./packages/core-search-rules/rules/metadata/validate.ts","webpack:///./packages/core-search-rules/utils/searchCriteriaToSmallSALO.ts","webpack:///./packages/core-search-rules/rules/cart/utils/rawCartCriteriaToRuleObject.ts","webpack:///./packages/core-cart-saved/enablers.ts","webpack:///./packages/core-cart-saved/locales.ts","webpack:///./packages/core-search-rules/rules/cart/model.ts","webpack:///./packages/core-search-rules/rules/expiration/defaults.ts","webpack:///./node_modules/@mui/material/esm/RadioGroup/RadioGroupContext.js","webpack:///./packages/core-public-link/properties/publicLink.js","webpack:///./node_modules/@material/textfield/constants.js","webpack:///./packages/core-search/views/searchFacetOptionView.js","webpack:///./build-targets/portal/packages/core-search/views/searchFacetOptionView.js","webpack:///./packages/core-search/views/searchFacetOptionsView.js","webpack:///./build-targets/portal/packages/core-search/views/searchFacetOptionsView.js","webpack:///./packages/core-search/views/searchFacetView.js","webpack:///./build-targets/portal/packages/core-search/views/searchFacetOptionsListView.js","webpack:///./build-targets/portal/packages/core-search/views/searchFacetView.js","webpack:///./packages/core-search/views/searchFacetSelectedView.js","webpack:///./build-targets/portal/packages/core-search/views/searchFacetSelectedView.js","webpack:///./packages/core-search/views/searchFacetsSelectedView.js","webpack:///./packages/core-search/views/searchFacetsView.js","webpack:///./build-targets/portal/packages/core-search/views/searchFacetsView.js","webpack:///./packages/core-attribute-grid-editor/components/ChangesChip/index.tsx","webpack:///./packages/core-attribute-grid-editor/components/Header/index.tsx","webpack:///./packages/core-attribute-asset/components/Editor/index.tsx","webpack:///./packages/core-attribute-asset/components/BulkEditor/index.tsx","webpack:///./packages/core-attribute-quick-edit/components/Actions/Append.tsx","webpack:///./packages/core-attribute-grid-editor/components/SideEditor/index.tsx","webpack:///./packages/core-attribute-grid-editor/components/SingleFieldEditor/index.tsx","webpack:///./packages/core-attribute-grid-editor/components/GridEditor/index.tsx","webpack:///./packages/core-components/hooks/useDragGlobalStyles.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeaderCell/virtualizedTableHeaderCellClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeaderCell/virtualizedTableHeaderCellSortIndicatorClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeaderCell/VirtualizedTableHeaderCellSortIndicator.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeaderCell/virtualizedTableHeaderCellDraggerClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeaderCell/VirtualizedTableHeaderCellDragger.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableHeaderCell/VirtualizedTableHeaderCell.tsx","webpack:///./packages/core-search-rules/rules/categoryId/components/CategoryIdRuleEditor/categoryIdRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/categoryId/components/CategoryIdRuleEditor/CategoryIdRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/keyword/components/KeywordRuleEditor/keywordRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/keyword/components/KeywordRuleEditor/KeywordRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/metadata/components/MetadataRuleEditor/metadataRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/metadata/components/MetadataRuleEditor/MetadataRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/cart/components/CartRuleEditor/cartRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/cart/components/CartRuleEditor/CartRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/categoryId/utils/getCategoryIdTypeLabel.ts","webpack:///./packages/core-attribute-grid-editor/hacks/cell-keyboard-navigation.ts","webpack:///./packages/core-attribute-grid-editor/hacks/scroll.ts","webpack:///./packages/core-search-rules/rules/cart/utils/rulesContainCart.ts","webpack:///./packages/core-search-rules/rules/cart/utils/rulesContainCurrentCart.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRowCell/virtualizedTableRowCellClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRowCell/VirtualizedTableRowCell.tsx","webpack:///./packages/core-search/models/searchRule_clip.js","webpack:///./packages/core-search/collections/searchRules_clips.js","webpack:///./packages/core-search-rules/rules/keyword/utils/getKeywordTypeLabel.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRowCells/GenericIconCell.tsx","webpack:///./packages/core-category/components/AutoList/index.tsx","webpack:///./packages/core-pdf-viewer/enablers.ts","webpack:///./packages/core-upload/properties/errors.js","webpack:///./build-targets/portal/packages/core-ad-builder/models/ABCustomization.js","webpack:///./packages/core-app/views/promptView.js","webpack:///./build-targets/portal/packages/core-app/views/promptView.js","webpack:///./node_modules/react-table/index.js","webpack:///./packages/core-permissions/models/assetPermission.js","webpack:///./build-targets/portal/packages/core-category/templates/categoryTreeNodesView.html","webpack:///./build-targets/portal/packages/core-category/templates/categoryTreeNodeView.html","webpack:///./packages/core-search/collections/searchConstituents.js","webpack:///./packages/core-search-rules/rules/categoryId/index.ts","webpack:///./packages/core-attribute/store/index.ts","webpack:///./packages/core-asset-gallery/constants.ts","webpack:///./packages/core-search-rules/rules/expiration/expirationRule.ts","webpack:///./packages/core-public-link/models/publicLink.js","webpack:///./build-targets/portal/packages/core-app/templates/promptView.html","webpack:///./packages/core-search-saved/actions.ts","webpack:///./packages/core-search/enablers.js","webpack:///./packages/core-search/actions.js","webpack:///./packages/core-search/menus.js","webpack:///./packages/core-search/collections/searchConstituents_clips.js","webpack:///./packages/core-search/models/searchAttributeHistoryRule.js","webpack:///./packages/core-search/collections/searchAttributeHistoryRules.js","webpack:///./packages/core-search/views/searchGalleryView.js","webpack:///./build-targets/portal/packages/core-search/views/searchGalleryView.js","webpack:///./packages/core-search/views/searchConstituentsGalleryView.js","webpack:///./packages/core-search/views/searchConstituentsGalleryHeaderView.js","webpack:///./packages/core-asset/views/assetConstituentView.js","webpack:///./packages/core-asset/views/assetConstituentsView.js","webpack:///./packages/core-search/views/searchConstituentsListItemView.js","webpack:///./build-targets/portal/packages/core-search/views/searchConstituentsListItemView.js","webpack:///./packages/core-search/views/searchConstituentsListView.js","webpack:///./packages/core-asset/views/assetConstituentView_clip.js","webpack:///./packages/core-search/views/searchConstituentsListItemView_clip.js","webpack:///./packages/core-search/views/searchConstituentsListView_clips.js","webpack:///./packages/core-search-rules/rules/savedSearch/defaults.ts","webpack:///./packages/core-search-rules/rules/savedSearch/savedSearchRule.ts","webpack:///./packages/core-search-rules/utils/convertRulesToRuleObjects.ts","webpack:///./packages/core-search-rules/actions.ts","webpack:///./packages/core-search-rules/utils/getUserSort.ts","webpack:///./packages/core-search-rules/utils/areSearchRulesSortable.ts","webpack:///./packages/core-search-rules/utils/getRuleAtIndex.ts","webpack:///./packages/core-search-rules/rules/advancedRaw/defaults.ts","webpack:///./packages/core-search-rules/rules/attributeHistory/defaults.ts","webpack:///./packages/core-search-rules/rules/checkouts/defaults.ts","webpack:///./packages/core-search-rules/rules/contents/defaults.ts","webpack:///./packages/core-search-rules/rules/date/defaults.ts","webpack:///./packages/core-search-rules/rules/fileAspect/defaults.ts","webpack:///./packages/core-search-rules/rules/fileFormat/defaults.ts","webpack:///./packages/core-search-rules/rules/fileFormatFamily/defaults.ts","webpack:///./packages/core-search-rules/rules/fileSize/defaults.ts","webpack:///./packages/core-search-rules/rules/user/defaults.ts","webpack:///./packages/core-search-rules/rules/visual/defaults.ts","webpack:///./packages/core-search-rules/utils/getRuleDefaults.ts","webpack:///./packages/core-search-rules/rules/advancedRaw/validate.ts","webpack:///./packages/core-search-rules/rules/advancedRaw/model.ts","webpack:///./packages/core-search-rules/rules/attributeHistory/model.ts","webpack:///./packages/core-search-rules/rules/attributeHistory/validate.ts","webpack:///./packages/core-user/api/getUserLabel.ts","webpack:///./packages/core-search-rules/rules/checkouts/validate.ts","webpack:///./packages/core-search-rules/rules/checkouts/model.ts","webpack:///./packages/core-search-rules/rules/contents/validate.ts","webpack:///./packages/core-search-rules/rules/contents/model.ts","webpack:///./packages/core-search-rules/rules/date/validate.ts","webpack:///./packages/core-search-rules/rules/date/model.ts","webpack:///./packages/core-search-rules/rules/expiration/model.ts","webpack:///./packages/core-search-rules/rules/expiration/validate.ts","webpack:///./packages/core-search-rules/rules/fileAspect/validate.ts","webpack:///./packages/core-search-rules/rules/fileAspect/model.ts","webpack:///./packages/core-search-rules/rules/fileFormat/model.ts","webpack:///./packages/core-search-rules/rules/fileFormatFamily/model.ts","webpack:///./packages/core-search-rules/rules/fileSize/validate.ts","webpack:///./packages/core-search-rules/rules/fileSize/model.ts","webpack:///./packages/core-search-rules/rules/savedSearch/model.ts","webpack:///./packages/core-search-rules/rules/savedSearch/validate.ts","webpack:///./packages/core-search-rules/rules/user/validate.ts","webpack:///./packages/core-search-rules/rules/user/model.ts","webpack:///./packages/core-search-rules/rules/visual/validate.ts","webpack:///./packages/core-search-rules/rules/visual/model.ts","webpack:///./packages/core-search-rules/utils/getRuleModel.ts","webpack:///./packages/core-search-rules/rules/advancedRaw/advancedRawRule.ts","webpack:///./packages/core-search-rules/rules/advancedRaw/utils/rawAdvancedRawCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/attributeHistory/attributeHistoryRule.ts","webpack:///./packages/core-search-rules/rules/attributeHistory/utils/rawAttributeHistoryCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/checkouts/checkoutsRule.ts","webpack:///./packages/core-search-rules/rules/checkouts/utils/rawCheckoutsCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/contents/contentsRule.ts","webpack:///./packages/core-search-rules/rules/contents/utils/rawContentsCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/date/dateRule.ts","webpack:///./packages/core-search-rules/rules/date/utils/rawDateCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/expiration/utils/rawExpirationCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/fileAspect/fileAspectRule.ts","webpack:///./packages/core-search-rules/rules/fileAspect/utils/rawFileAspectCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/fileFormat/fileFormatRule.ts","webpack:///./packages/core-search-rules/rules/fileFormat/utils/rawFileFormatCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/fileFormatFamily/fileFormatFamilyRule.ts","webpack:///./packages/core-search-rules/rules/fileFormatFamily/utils/rawFileFormatFamilyCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/fileSize/fileSizeRule.ts","webpack:///./packages/core-search-rules/rules/fileSize/utils/rawFileSizeCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/savedSearch/utils/rawSavedSearchCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/user/userRule.ts","webpack:///./packages/core-search-rules/rules/user/utils/rawUserCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/visual/visualRule.ts","webpack:///./packages/core-search-rules/rules/visual/utils/rawVisualCriteriaToRuleObject.ts","webpack:///./packages/core-search-rules/rules/getRuleObjectFromRawCriteria.ts","webpack:///./packages/core-search-rules/utils/savedSearchCriteriaToRuleObjects.ts","webpack:///./packages/core-search-rules/hooks/useSearchRules/reducer.ts","webpack:///./packages/core-search-rules/contexts/SearchRules/SearchRules.tsx","webpack:///./packages/core-search/collections/savedSearches.js","webpack:///./packages/core-search/collections/singleton/savedSearch.ts","webpack:///./packages/core-search-saved/hooks/useSavedSearches.ts","webpack:///./packages/core-search-saved/api/getSearch.ts","webpack:///./packages/core-search-saved/hooks/useSavedSearch.ts","webpack:///./packages/core-search-rules/store/searchRules.ts","webpack:///./packages/core-search-rules/hooks/useSearchRulesStore.ts","webpack:///./packages/core-search-rules/contexts/SearchRulesStoreContext.tsx","webpack:///./packages/core-search-rules/rules/advancedRaw/components/AdvancedRawRuleEditor/advancedRawRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/advancedRaw/components/AdvancedRawRuleEditor/AdvancedRawRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/attributeHistory/components/AttributeHistoryRuleEditor/attributeHistoryRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/attributeHistory/components/AttributeHistoryRuleEditor/AttributeHistoryRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/checkouts/locales.ts","webpack:///./packages/core-search-rules/rules/checkouts/utils/getCheckoutsTypeLabel.ts","webpack:///./packages/core-search-rules/rules/checkouts/components/CheckoutsRuleEditor/checkoutsRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/checkouts/components/CheckoutsRuleEditor/CheckoutsRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/contents/locales.ts","webpack:///./packages/core-search-rules/rules/contents/utils/getContentsTypeLabel.ts","webpack:///./packages/core-search-rules/rules/contents/components/ContentsRuleEditor/contentsRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/contents/components/ContentsRuleEditor/ContentsRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/date/locales.ts","webpack:///./packages/core-search-rules/rules/date/utils/getDateSubTypeLabel.ts","webpack:///./packages/core-search-rules/rules/date/components/DateRuleEditor/dateRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/date/components/DateRuleEditor/DateRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/expiration/components/ExpirationRuleEditor/expirationRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/expiration/components/ExpirationRuleEditor/ExpirationRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/fileAspect/locales.ts","webpack:///./packages/core-search-rules/rules/fileAspect/utils/getFileAspectSubTypeLabel.ts","webpack:///./packages/core-search-rules/rules/fileAspect/utils/getFileAspectTypeLabel.ts","webpack:///./packages/core-search-rules/rules/fileAspect/utils/getOrientationLabel.ts","webpack:///./packages/core-search-rules/rules/fileAspect/components/FileAspectRuleEditor/fileAspectRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/fileAspect/components/FileAspectRuleEditor/FileAspectRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/fileFormat/locales.ts","webpack:///./packages/core-search-rules/rules/fileFormat/utils/getFileFormatTypeLabel.ts","webpack:///./packages/core-search-rules/rules/fileFormat/components/FileFormatRuleEditor/fileFormatRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/fileFormat/components/FileFormatRuleEditor/FileFormatRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/fileFormatFamily/components/FileFormatFamilyRuleEditor/fileFormatFamilyRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/fileFormatFamily/components/FileFormatFamilyRuleEditor/FileFormatFamilyRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/fileSize/locales.ts","webpack:///./packages/core-search-rules/rules/fileSize/utils/getFileSizeTypeLabel.ts","webpack:///./packages/core-search-rules/rules/fileSize/utils/getFileSizeSubTypeLabel.ts","webpack:///./packages/core-search-rules/rules/fileSize/components/FileSizeRuleEditor/fileSizeRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/fileSize/components/FileSizeRuleEditor/FileSizeRuleEditor.tsx","webpack:///./packages/core-search-saved/locales.ts","webpack:///./packages/core-search-rules/rules/savedSearch/components/SavedSearchRuleEditor/savedSearchRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/savedSearch/components/SavedSearchRuleEditor/SavedSearchRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/user/locales.ts","webpack:///./packages/core-search-rules/rules/user/components/UserRuleEditor/userRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/user/components/UserRuleEditor/UserRuleEditor.tsx","webpack:///./node_modules/mui-color-input/dist/mui-color-input.es.js","webpack:///./packages/core-asset/api/getAssetAutoList.ts","webpack:///./packages/core-asset/components/AssetAutoList/AssetAutoList.tsx","webpack:///./packages/core-search-rules/rules/visual/locales.ts","webpack:///./packages/core-search-rules/rules/visual/components/VisualRuleEditor/visualRuleEditorClasses.ts","webpack:///./packages/core-search-rules/rules/visual/components/VisualRuleEditor/VisualRuleEditor.tsx","webpack:///./packages/core-search-rules/rules/getEditorComponent.ts","webpack:///./packages/core-search-visual/hooks/useIsVisualSearchEnabled.ts","webpack:///./packages/core-search-rules/hooks/useSearchRuleTypeOptions.ts","webpack:///./packages/core-search-rules/components/SearchRuleTypeSelector/SearchRuleTypeSelector.tsx","webpack:///./packages/core-search-rules/components/SearchRuleEditor/searchRuleEditorClasses.ts","webpack:///./packages/core-search-rules/components/SearchRuleEditor/SearchRuleEditor.tsx","webpack:///./packages/core-search-rules/components/SearchRulesEditorList/searchRulesEditorListClasses.ts","webpack:///./packages/core-search-rules/components/SearchRulesEditorList/SearchRulesEditorList.tsx","webpack:///./node_modules/@mui/material/esm/ListItemButton/ListItemButton.js","webpack:///./packages/core-search-rules/components/SearchRulesEditor/searchRulesEditorDropdownClasses.ts","webpack:///./packages/core-search-rules/components/SearchRulesEditor/SearchRulesEditorDropdown.tsx","webpack:///./node_modules/@mui/material/esm/RadioGroup/RadioGroup.js","webpack:///./packages/core-search-rules/components/SearchRulesEditor/SearchRulesMatchCriteriaSelector.tsx","webpack:///./packages/core-search-rules/components/SearchRulesEditor/searchRulesEditorClasses.ts","webpack:///./packages/core-search-rules/components/SearchRulesEditor/SearchRulesEditor.tsx","webpack:///./packages/core-search-rules/components/SearchRulesEditor/SearchRulesEditorDialog.tsx","webpack:///./packages/core-search-rules/views/searchEditor.ts","webpack:///./packages/core-search-rules/controller.ts","webpack:///./packages/core-search/cache.ts","webpack:///./packages/core-search/routes.js","webpack:///./packages/core-search-visual/controller.ts","webpack:///./packages/core-search-saved/controller.ts","webpack:///./packages/core-search/controller.js","webpack:///./packages/core-search/controllers/savedSearchController.js","webpack:///./build-targets/portal/packages/core-search/controller.js","webpack:///./packages/core-search/index.js","webpack:///./packages/core-app/views/appTabItemView.js","webpack:///./build-targets/portal/packages/core-app/views/appTabItemView.js","webpack:///./packages/core-app/views/appTabItemsView.js","webpack:///./node_modules/@material/tab-scroller/util.js","webpack:///./node_modules/@material/tab-scroller/constants.js","webpack:///./node_modules/@material/tab-scroller/rtl-scroller.js","webpack:///./node_modules/@material/tab-scroller/rtl-default-scroller.js","webpack:///./node_modules/@material/tab-scroller/rtl-negative-scroller.js","webpack:///./node_modules/@material/tab-scroller/rtl-reverse-scroller.js","webpack:///./node_modules/@material/tab-scroller/foundation.js","webpack:///./node_modules/@material/tab-scroller/component.js","webpack:///./node_modules/@material/tab-indicator/constants.js","webpack:///./node_modules/@material/tab-indicator/foundation.js","webpack:///./node_modules/@material/tab-indicator/fading-foundation.js","webpack:///./node_modules/@material/tab-indicator/sliding-foundation.js","webpack:///./node_modules/@material/tab-indicator/component.js","webpack:///./node_modules/@material/tab/constants.js","webpack:///./node_modules/@material/tab/foundation.js","webpack:///./node_modules/@material/tab/component.js","webpack:///./node_modules/@material/tab-bar/constants.js","webpack:///./node_modules/@material/tab-bar/foundation.js","webpack:///./node_modules/@material/tab-bar/component.js","webpack:///./build-targets/portal/packages/core-app/views/appTabItemsView.js","webpack:///./packages/core/lib/netx-tabView.js","webpack:///./packages/core-cart-saved/hooks/useSavedCarts.ts","webpack:///./packages/core-category/views/categoryTreeSelectNodeView.js","webpack:///./packages/core-category/views/categoryTreeSelectNodesView.js","webpack:///./packages/core-category/views/categoryTreeView.js","webpack:///./build-targets/portal/packages/core-category/views/categoryTreeView.js","webpack:///./packages/core-category/views/categoryTreeSelectView.js","webpack:///./packages/core-components/VirtualizedTable/containers/VirtualizedTable/VirtualizedTable.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRowCells/Byte.tsx","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRowCells/DragHandleCell.tsx","webpack:///./packages/core-asset/views/assetAttributesView.js","webpack:///./build-targets/portal/packages/core-asset/views/assetAttributesView.js","webpack:///./build-targets/portal/packages/core/functionality/materialTextFields.js","webpack:///./build-targets/portal/packages/core/functionality/patches/mdc-textfield.js","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRow/tableRowClasses.ts","webpack:///./packages/core-components/VirtualizedTable/components/VirtualizedTableRow/TableRow.tsx","webpack:///./packages/core-attribute-grid-editor/components/CellEditor/index.tsx","webpack:///./packages/core-share-request/labels.ts","webpack:///./src/js/lib/customElements/nx-search.js","webpack:///./src/js/lib/nx-drag/jquery-netx-dragresize.js","webpack:///./packages/core-share/properties/accessToken.js","webpack:///./packages/core-share/constants.ts","webpack:///./build-targets/portal/packages/core-share/templates/downloadShareView.html","webpack:///./build-targets/portal/packages/core-share/templates/emailShareView.html","webpack:///./build-targets/portal/packages/core-share/templates/mediaServiceShareView.html","webpack:///./node_modules/@babel/runtime/helpers/toPropertyKey.js","webpack:///./src/js/lib/backgrid-netx.js","webpack:///./packages/core-asset/actions.js","webpack:///./build-targets/portal/packages/core-asset/actions.js","webpack:///./packages/core-asset/menus.js","webpack:///./build-targets/portal/packages/core-asset/menus.js","webpack:///./packages/core-asset/models/assetRequest.js","webpack:///./packages/core-asset/models/assetView.js","webpack:///./packages/core-asset/collections/assetIndex.js","webpack:///./packages/core-asset/models/assetMetadatum.js","webpack:///./packages/core-asset/collections/assetMetadata.js","webpack:///./packages/core-permissions/collections/assetPermissions.js","webpack:///./packages/core-asset/models/assetUsage.js","webpack:///./packages/core-asset/collections/assetUsage.js","webpack:///./packages/core-asset/collections/assetVersions.js","webpack:///./packages/core-asset/collections/assetViews.js","webpack:///./packages/core-grid/collections/grid.js","webpack:///./packages/core-asset/collections/assetAttributeHistory.js","webpack:///./packages/core-comment/models/comment.js","webpack:///./packages/core-comment/collections/comments.js","webpack:///./packages/core-project/models/projectReviewAnnotationComment.js","webpack:///./packages/core-project/collections/projectReviewAnnotationComments.js","webpack:///./packages/core-project/models/projectReviewAnnotation.js","webpack:///./packages/core-project/collections/projectReviewAnnotations.js","webpack:///./packages/core-project/models/projectReviewDecision.js","webpack:///./packages/core-project/collections/projectReviewDecisions.js","webpack:///./packages/core-project/properties/projects.js","webpack:///./packages/core-project/models/projectReview.js","webpack:///./packages/core-project/collections/projectReviews.js","webpack:///./packages/core-project/models/projectParticipant.js","webpack:///./packages/core-project/collections/projectParticipants.js","webpack:///./packages/core-user/models/userSelector_member.js","webpack:///./packages/core-user/collections/userSelectorMembers.js","webpack:///./packages/core-user/models/userSelector.js","webpack:///./packages/core-project/models/project.js","webpack:///./packages/core-project/collections/projects.js","webpack:///./packages/core-asset/models/currentAsset.js","webpack:///./packages/core-asset/collections/assetCursor.js","webpack:///./packages/core-asset/collections/assetRequests.js","webpack:///./packages/core-asset/models/assetTaskList.js","webpack:///./packages/core-asset/collections/assetTasks.js","webpack:///./packages/core-asset/models/metadataMapLink.js","webpack:///./packages/core-asset/collections/metadataMapLinks.js","webpack:///./packages/core-asset/models/metadataMap.js","webpack:///./packages/core-asset/collections/metadataMaps.js","webpack:///./packages/core-asset/models/miniAsset.js","webpack:///./packages/core-asset/collections/miniAssets.js","webpack:///./packages/core-asset/models/pendingAsset.js","webpack:///./packages/core-asset/collections/pendingAssets.js","webpack:///./packages/core-asset/views/assetVersionReactivate.js","webpack:///./packages/core-asset/views/assetConstituentDownloadView.js","webpack:///./packages/core-asset/views/assetConstituentDownloadView_clip.js","webpack:///./build-targets/portal/packages/core-asset/views/assetDetailView.js","webpack:///./packages/core-asset/routes.js","webpack:///./build-targets/portal/packages/core-asset/routes.js","webpack:///./packages/core-asset/models/assetProcess.js","webpack:///./packages/core-asset/collections/assetImagePresets.js","webpack:///./packages/core-asset/collections/assetVideoPresets.js","webpack:///./packages/core-asset-repurpose/controller.ts","webpack:///./packages/core-asset-custom-thumbnail/controller.ts","webpack:///./packages/core-app/services/confirmation/views/confirm.ts","webpack:///./packages/core-asset-expiration/controller.ts","webpack:///./packages/core-asset-gallery/views/asset-gallery.ts","webpack:///./packages/core-asset-gallery/actions.ts","webpack:///./packages/core-asset-gallery/controller.ts","webpack:///./packages/core-asset-project/controller.ts","webpack:///./packages/core-asset/services/resync/controller.ts","webpack:///./packages/core-asset/services/delete/controller.ts","webpack:///./packages/core-asset/controller.js","webpack:///./build-targets/portal/packages/core-asset/views/assetQuickzoomView.js","webpack:///./build-targets/portal/packages/core-asset/controller.js","webpack:///./packages/core-asset/index.js","webpack:///./packages/core-permissions/enablers.js","webpack:///./packages/core-permissions/actions.js","webpack:///./build-targets/portal/packages/core-permissions/actions.js","webpack:///./packages/core-permissions/menus.js","webpack:///./packages/core-permissions/views/assetPermissionEditView.js","webpack:///./packages/core-permissions/config.js","webpack:///./packages/core-permissions/routes.js","webpack:///./packages/core-permissions/controller.js","webpack:///./packages/core-permissions/index.js","webpack:///./packages/core-asset/components/Attributes/Selector/constants.ts","webpack:///./packages/core-asset/components/Attributes/Selector/store.ts","webpack:///./packages/core-asset/components/Attributes/Selector/components/AttributeDropdown/index.tsx","webpack:///./packages/core-asset/components/Attributes/Selector/components/Item/index.tsx","webpack:///./packages/core-asset/components/Attributes/Selector/components/Selector/index.tsx","webpack:///./packages/core-asset/components/Attributes/Selector/containers/Selector/index.tsx","webpack:///./packages/core-asset/views/assetAttributesSelectReactView.js","webpack:///./packages/core-asset/components/Attributes/Selector/index.tsx","webpack:///./packages/core-share/models/accessTokenAsset.js","webpack:///./packages/core-share/collections/accessTokenAssets.js","webpack:///./packages/core-share/models/accessToken.js","webpack:///./packages/core-asset/views/assetListItemView_card.js","webpack:///./packages/core-asset/views/assetListView_card.js","webpack:///./packages/core-asset/views/assetListViewTypeManager.js","webpack:///./packages/core-cart/enablers.js","webpack:///./build-targets/portal/packages/core-cart/enablers.js","webpack:///./packages/core-asset/models/assetRequestAttribute.js","webpack:///./packages/core-asset/collections/assetRequestAttributes.js","webpack:///./node_modules/react-table/dist/react-table.production.min.js","webpack:///./node_modules/base64-js/index.js","webpack:///./node_modules/ieee754/index.js","webpack:///./build-targets/portal/packages/core-permissions/templates/assetPermissionEditView.html","webpack:///./build-targets/portal/packages/core/functionality/materialList.js","webpack:///./node_modules/@webcomponents/custom-elements/custom-elements.min.js","webpack:///./build-targets/portal/packages/core-asset/templates/assetListViewManager.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetListView_card.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetListItemView_card.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetAttributesView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchFacetsView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchFacetView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchFacetOptionsView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchFacetOptionView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchFacetOptionListView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchFacetOptionsListView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchFacetsSelectedView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchFacetSelectedView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchGalleryView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchConstituentsGalleryView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchConstituentsGalleryHeaderView.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetConstituentsView.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetConstituentView.html","webpack:///./build-targets/portal/packages/core-search/templates/searchConstituentsListView_clips.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetConstituentView_clip.html","webpack:///./build-targets/portal/packages/core-search/templates/searchConstituentsListItemView_clip.html","webpack:///./packages/core-search-rules/rules/keyword/index.ts","webpack:///./packages/core-search-rules/rules/metadata/index.ts","webpack:///./packages/core-search-rules/utils/getSearchCriteriaFromSmallSALO.ts","webpack:///./packages/core-search-rules/rules/cart/index.ts","webpack:///./packages/core-cart-saved/index.ts","webpack:///./build-targets/portal/packages/core-search/templates/searchGalleryHeaderView.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetConstituentDownloadView_clip.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetDetailView.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetLinksView.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetDetailPreviewView.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetQuickzoomView.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetZoomifyView.html","webpack:///./src/js/lib/leaflet-src.js","webpack:///./src/js/lib/L.TileLayer.Zoomify.js","webpack:///./src/js/lib/zoomify-netx.js","webpack:///./build-targets/portal/packages/core-category/templates/categoryGalleryView.html","webpack:///./build-targets/portal/packages/core-category/templates/categoryBreadCrumbView.html","webpack:///./build-targets/portal/packages/core-category/templates/categoryGalleryHeaderView.html","webpack:///./packages/core-share/properties/feeds.js","webpack:///./build-targets/portal/packages/core-share/templates/userShareView.html","webpack:///./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack:///./node_modules/@babel/runtime/helpers/createClass.js","webpack:///./node_modules/@babel/runtime/helpers/toPrimitive.js","webpack:///./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","webpack:///./node_modules/@babel/runtime/helpers/getPrototypeOf.js","webpack:///./src/js/lib/backgrid.js","webpack:///./src/js/lib/backgrid-filter.js","webpack:///./src/js/lib/backgrid-select-all.js","webpack:///./src/js/lib/backgrid-select-filter.js","webpack:///./packages/core-search/views/searchGalleryHeaderView.js","webpack:///./build-targets/portal/packages/core-search/views/searchGalleryHeaderView.js","webpack:///./packages/core-asset/views/assetZoomifyView.js","webpack:///./build-targets/portal/packages/core-asset/views/assetZoomifyView.js","webpack:///./node_modules/focus-trap/index.js","webpack:///./node_modules/@mui/material/esm/Box/Box.js","webpack:///./build-targets/portal/packages/core-share/templates/ftpShareView.html","webpack:///./node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack:///./node_modules/warning/warning.js","webpack:///./node_modules/react-swipeable-views-core/lib/constant.js","webpack:///./packages/core-category/actions.js","webpack:///./build-targets/portal/packages/core-category/actions.js","webpack:///./packages/core-category/menus.js","webpack:///./build-targets/portal/packages/core-category/menus.js","webpack:///./packages/core-category/collections/recentCategories.js","webpack:///./packages/core-category/routes.js","webpack:///./packages/core-category/services/category/actions.ts","webpack:///./packages/core-category/services/category/controller.ts","webpack:///./packages/core-category/controller.js","webpack:///./packages/core-category/views/categoryGalleryView.js","webpack:///./build-targets/portal/packages/core-category/views/categoryGalleryView.js","webpack:///./packages/core-category/views/categoryBreadCrumbView.js","webpack:///./build-targets/portal/packages/core-category/views/categoryBreadCrumbView.js","webpack:///./packages/core-category/views/categoryGalleryHeaderView.js","webpack:///./build-targets/portal/packages/core-category/views/categoryGalleryHeaderView.js","webpack:///./build-targets/portal/packages/core-category/controller.js","webpack:///./packages/core-category/index.js","webpack:///./node_modules/@mui/material/esm/internal/svg-icons/RadioButtonUnchecked.js","webpack:///./node_modules/@mui/material/esm/internal/svg-icons/RadioButtonChecked.js","webpack:///./node_modules/@mui/material/esm/Radio/RadioButtonIcon.js","webpack:///./node_modules/@mui/material/esm/utils/createChainedFunction.js","webpack:///./node_modules/@mui/material/esm/Radio/radioClasses.js","webpack:///./node_modules/@mui/material/esm/Radio/Radio.js","webpack:///./node_modules/@mui/material/esm/RadioGroup/useRadioGroup.js","webpack:///./node_modules/@mui/material/esm/utils/shouldSpreadAdditionalProps.js","webpack:///./node_modules/@mui/material/esm/Slider/Slider.js","webpack:///./node_modules/@mui/material/esm/ButtonGroup/buttonGroupClasses.js","webpack:///./node_modules/@mui/material/esm/ButtonGroup/ButtonGroup.js","webpack:///./node_modules/@mui/material/esm/FormGroup/formGroupClasses.js","webpack:///./node_modules/@mui/material/esm/FormGroup/FormGroup.js","webpack:///./node_modules/@mui/material/esm/Collapse/collapseClasses.js","webpack:///./node_modules/@mui/material/esm/Collapse/Collapse.js","webpack:///./build-targets/portal/packages/core-cart/templates/addAssetsToCategoryView.html","webpack:///./build-targets/portal/packages/core-app/templates/appTabItemsView.html","webpack:///./build-targets/portal/packages/core-app/templates/appTabItemView.html","webpack:///./build-targets/portal/packages/core-app/templates/select.html","webpack:///./build-targets/portal/packages/core-app/templates/select_from.html","webpack:///./build-targets/portal/packages/core-app/templates/select_fromItem.html","webpack:///./build-targets/portal/packages/core-app/templates/select_new.html","webpack:///./build-targets/portal/packages/core-app/templates/select_newItem.html","webpack:///./build-targets/portal/packages/core-app/templates/select_selected.html","webpack:///./build-targets/portal/packages/core-app/templates/select_selectedItem.html","webpack:///./node_modules/tabbable/index.js","webpack:///./node_modules/xtend/immutable.js","webpack:///./build-targets/portal/packages/core-cart/templates/cartGalleryView.html","webpack:///./build-targets/portal/packages/core-cart/templates/cartGalleryHeaderView.html","webpack:///./build-targets/portal/packages/core-cart/templates/savedCartGalleryView.html","webpack:///./build-targets/portal/packages/core-cart/templates/savedCartActionsBar.html","webpack:///./build-targets/portal/packages/core-cart/templates/savedCartGalleryHeaderView.html","webpack:///./build-targets/portal/packages/core-share/templates/downloadOptionsView.html","webpack:///./build-targets/portal/packages/core-share/templates/assetOptionsView.html","webpack:///./build-targets/portal/packages/core-share/templates/createPDFOptionsView.html","webpack:///./build-targets/portal/packages/core-share/templates/createPDFTemplateItemsView.html","webpack:///./build-targets/portal/packages/core-share/templates/createPDFTemplateItemView.html","webpack:///./src/js/lib/jquery.resize.js","webpack:///./build-targets/portal/packages/core-share/templates/exportMetadataView.html","webpack:///./build-targets/portal/packages/core-share/templates/shareStatusView.html","webpack:///./build-targets/portal/packages/core-app/templates/confirmView-downloadWarnings.html","webpack:///./packages/core-components/Switch/index.tsx","webpack:///./node_modules/@mui/material/transitions/utils.js","webpack:///./node_modules/react-swipeable/dist/react-swipeable.umd.js","webpack:///./node_modules/react-swipeable-views/lib/index.js","webpack:///./node_modules/react-swipeable-views/lib/SwipeableViews.js","webpack:///./node_modules/@babel/runtime/helpers/objectWithoutProperties.js","webpack:///./node_modules/react-swipeable-views-core/lib/index.js","webpack:///./node_modules/react-swipeable-views-core/lib/checkIndexBounds.js","webpack:///./node_modules/react-swipeable-views-core/lib/computeIndex.js","webpack:///./node_modules/react-swipeable-views-core/lib/getDisplaySameSlide.js","webpack:///./node_modules/react-swipeable-views-core/lib/mod.js","webpack:///./node_modules/@mui/material/ListSubheader/listSubheaderClasses.js","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABTemplateView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABTemplatePreviewView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABTemplateTabsView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABBlocksView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABBlockView.html","webpack:///./build-targets/portal/packages/core-asset/templates/assetSelectListItemView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABCustomizationsListView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABAssetTemplatesView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABCustomizationDownloadView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABCustomizationNameView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABGalleryHeaderView.html","webpack:///./build-targets/portal/packages/core-ad-builder/templates/ABGalleryView.html","webpack:///./packages/core-share/enablers.js","webpack:///./build-targets/portal/packages/core-share/enablers.js","webpack:///./packages/core-category/enablers.js","webpack:///./packages/core-download-request/constants.ts","webpack:///./packages/core-download-request/locales.ts","webpack:///./packages/core-download-request/actions.ts","webpack:///./packages/core-share/actions.js","webpack:///./build-targets/portal/packages/core-share/actions.js","webpack:///./build-targets/portal/packages/core-share/menus.js","webpack:///./packages/core-share/models/feed.js","webpack:///./packages/core-share/models/shareStatus.js","webpack:///./packages/core-share/collections/accessTokens.js","webpack:///./packages/core-share/collections/feeds.js","webpack:///./packages/core-share/models/shareMediaService.js","webpack:///./packages/core-share/properties/mediaServices.js","webpack:///./packages/core-share/collections/shareMediaServices.js","webpack:///./packages/core-share/views/shareStatusView.js","webpack:///./build-targets/portal/packages/core-share/views/shareStatusView.js","webpack:///./packages/core-share/config.js","webpack:///./packages/core-share/routes.js","webpack:///./packages/core-download-request/routes.ts","webpack:///./packages/core-download-request/components/DownloadRequestApprovalsList/cells/CheckboxCell.tsx","webpack:///./packages/core-download-request/contexts/DownloadRequestApprovals/constants.ts","webpack:///./packages/core-download-request/contexts/DownloadRequestApprovals/reducer.ts","webpack:///./packages/core-download-request/contexts/DownloadRequestApprovals/actions.ts","webpack:///./packages/core-download-request/api/getDownloadRequestApprovals.ts","webpack:///./packages/core-download-request/api/react-query/getDownloadRequestApprovals.ts","webpack:///./packages/core-download-request/api/parsers/parseCustomJustificationFormData.ts","webpack:///./packages/core-download-request/api/parsers/parseInCustomJustificationForm.ts","webpack:///./packages/core-download-request/api/getCustomJustificationForm.ts","webpack:///./packages/core-download-request/api/getDownloadRequestDetails.ts","webpack:///./packages/core-download-request/api/react-query/getDownloadRequestDetails.ts","webpack:///./packages/core-download-request/api/getDownloadRequests.ts","webpack:///./packages/core-download-request/api/react-query/getDownloadRequests.ts","webpack:///./packages/core-download-request/errors.ts","webpack:///./packages/core-download-request/contexts/DownloadRequestApprovals/index.tsx","webpack:///./packages/core-download-request/components/DownloadRequestConfirm/DownloadRequestConfirm.tsx","webpack:///./packages/core-download-request/api/exportDownloadRequests.ts","webpack:///./packages/core-download-request/api/reviewDownloadRequest.ts","webpack:///./packages/core-download-request/contexts/DownloadRequest/constants.ts","webpack:///./packages/core-download-request/contexts/DownloadRequest/reducer.ts","webpack:///./packages/core-download-request/contexts/DownloadRequest/actions.ts","webpack:///./packages/core-download-request/contexts/DownloadRequest/index.tsx","webpack:///./packages/core-download-request/contexts/DownloadRequests/constants.ts","webpack:///./packages/core-download-request/contexts/DownloadRequests/actions.ts","webpack:///./packages/core-download-request/contexts/DownloadRequests/reducer.ts","webpack:///./packages/core-download-request/contexts/DownloadRequests/index.tsx","webpack:///./packages/core-download-request/components/DownloadRequestApprovalsList/cells/CheckboxHeaderCell.tsx","webpack:///./packages/core-download-request/components/DownloadRequestApprovalsList/columns.tsx","webpack:///./packages/core-download-request/components/DownloadRequestApprovalsList/DownloadRequestApprovalsList.tsx","webpack:///./packages/core-components/SlidePanel/SlidePanel.tsx","webpack:///./packages/core-components/SlidePanel/withSlidePanel.tsx","webpack:///./packages/core-download-request/components/DownloadRequestDetails/downloadRequestDetailsClasses.ts","webpack:///./packages/core-download-request/components/DownloadRequestDetails/DownloadRequestDetailsTabs.tsx","webpack:///./packages/core-download-request/components/DownloadRequestDetails/DownloadRequestDetailsTabPanels.tsx","webpack:///./packages/core-download-request/components/DownloadRequestDetails/DownloadRequestDetails.tsx","webpack:///./packages/core-download-request/components/DownloadRequestDetails/index.tsx","webpack:///./packages/core-download-request/components/DownloadRequestDownloadOptionsList/DownloadRequestDownloadOptionsListItem.tsx","webpack:///./packages/core-download-request/components/DownloadRequestDownloadOptionsList/DownloadRequestDownloadOptionsList.tsx","webpack:///./packages/core-download-request/components/DownloadRequestJustificationDetails/DownloadRequestJustificationDetailsField.tsx","webpack:///./packages/core-download-request/components/DownloadRequestJustificationDetails/DownloadRequestJustificationDetails.tsx","webpack:///./packages/core-download-request/components/DownloadRequestRequesterPaper/downloadRequestRequesterPaperContentClasses.ts","webpack:///./packages/core-download-request/components/DownloadRequestRequesterPaper/DownloadRequestRequesterDate.tsx","webpack:///./packages/core-download-request/components/DownloadRequestRequesterPaper/DownloadRequestRequesterEmail.tsx","webpack:///./packages/core-download-request/components/DownloadRequestRequesterPaper/DownloadRequestRequesterName.tsx","webpack:///./packages/core-download-request/components/DownloadRequestRequesterPaper/DownloadRequestRequesterSource.tsx","webpack:///./packages/core-download-request/components/DownloadRequestRequesterPaper/DownloadRequestRequesterPaperContent.tsx","webpack:///./packages/core-download-request/components/DownloadRequestRequesterPaper/DownloadRequestRequesterPaper.tsx","webpack:///./packages/core-download-request/components/DownloadRequests/downloadRequestsHeaderClasses.ts","webpack:///./packages/core-download-request/components/DownloadRequestsFilters/DownloadRequestsStatusFilter.tsx","webpack:///./packages/core-components/SearchFilterExpandable/searchFilterExpandableClasses.ts","webpack:///./packages/core-components/SearchFilterExpandable/SearchFilterExpandable.tsx","webpack:///./packages/core-download-request/components/DownloadRequestsFilters/DownloadRequestsTextFilter.tsx","webpack:///./packages/core-download-request/components/DownloadRequestsFilters/DownloadRequestsFilters.tsx","webpack:///./packages/core-download-request/components/DownloadRequests/DownloadRequestsHeader.tsx","webpack:///./packages/core-download-request/components/DownloadRequestsList/cells/ActionCell.tsx","webpack:///./packages/core-download-request/components/DownloadRequestsList/cells/UserCell.tsx","webpack:///./packages/core-download-request/components/DownloadRequestsList/columns.tsx","webpack:///./packages/core-download-request/components/DownloadRequestsList/DownloadRequestsList.tsx","webpack:///./packages/core-download-request/components/DownloadRequests/DownloadRequests.tsx","webpack:///./packages/core-download-request/components/DownloadRequestApprovals/downloadRequestApprovalsFooterClasses.ts","webpack:///./packages/core-download-request/components/DownloadRequestApprovals/DownloadRequestApprovalsFooter.tsx","webpack:///./packages/core-download-request/components/DownloadRequestApprovals/DownloadRequestApprovals.tsx","webpack:///./packages/core-download-request/containers/DownloadRequestApprovals/DownloadRequestApprovalsContainer.tsx","webpack:///./packages/core-download-request/containers/DownloadRequests/DownloadRequestsContainer.tsx","webpack:///./packages/core-download-request/views/download-requests.ts","webpack:///./packages/core-download-request/controller.ts","webpack:///./packages/core-asset/services/share/controller.ts","webpack:///./packages/core-category/services/share/actions.ts","webpack:///./packages/core-category/services/share/controller.ts","webpack:///./packages/core-cart-saved/controller.ts","webpack:///./packages/core-share/controller.js","webpack:///./build-targets/portal/packages/core-share/controller.js","webpack:///./packages/core-share/models/shareWays.js","webpack:///./build-targets/portal/packages/core-share/models/shareWays.js","webpack:///./packages/core-share/index.js","webpack:///./packages/core-cart/actions.js","webpack:///./build-targets/portal/packages/core-cart/actions.js","webpack:///./packages/core-cart/menus.js","webpack:///./build-targets/portal/packages/core-cart/menus.js","webpack:///./packages/core-cart/views/addAssetsToCategoryView.js","webpack:///./packages/core-cart/views/cartDeleteWarningsView.js","webpack:///./packages/core-app/views/select_fromItem.js","webpack:///./build-targets/portal/packages/core-app/views/select_fromItem.js","webpack:///./packages/core-app/views/select_newItem.js","webpack:///./build-targets/portal/packages/core-app/views/select_newItem.js","webpack:///./packages/core-app/views/select_new.js","webpack:///./build-targets/portal/packages/core-app/views/select_new.js","webpack:///./packages/core-app/views/select_from.js","webpack:///./build-targets/portal/packages/core-app/views/select_from.js","webpack:///./packages/core-app/views/select_selectedItem.js","webpack:///./build-targets/portal/packages/core-app/views/select_selectedItem.js","webpack:///./packages/core-app/views/select_selected.js","webpack:///./build-targets/portal/packages/core-app/views/select_selected.js","webpack:///./packages/core-app/views/select.js","webpack:///./node_modules/@material/drawer/constants.js","webpack:///./node_modules/@material/drawer/dismissible/foundation.js","webpack:///./node_modules/@material/drawer/modal/foundation.js","webpack:///./node_modules/@material/drawer/component.js","webpack:///./node_modules/@material/drawer/util.js","webpack:///./build-targets/portal/packages/core/functionality/materialDrawer.js","webpack:///./build-targets/portal/packages/core/functionality/resizable.js","webpack:///./build-targets/portal/packages/core-app/views/select.js","webpack:///./packages/core-cart/routes.js","webpack:///./build-targets/portal/packages/core-cart/routes.js","webpack:///./packages/core-cart-asset/controller.ts","webpack:///./packages/core-cart-current/controller.ts","webpack:///./packages/core-cart/controller.js","webpack:///./packages/core-cart/views/cartGalleryView.js","webpack:///./packages/core-cart/views/cartGalleryHeaderView.js","webpack:///./packages/core-cart/views/savedCartGalleryView.js","webpack:///./build-targets/portal/packages/core-cart/views/savedCartActionsBar.js","webpack:///./build-targets/portal/packages/core-cart/views/savedCartGalleryView.js","webpack:///./packages/core-cart/views/savedCartGalleryHeaderView.js","webpack:///./build-targets/portal/packages/core-cart/controller.js","webpack:///./packages/core-cart/index.js","webpack:///./build-targets/portal/packages/core-ad-builder/models/ABBlock.js","webpack:///./build-targets/portal/packages/core-ad-builder/collections/ABBlocks.js","webpack:///./packages/core-ad-builder/properties/adBuilder.js","webpack:///./build-targets/portal/packages/core-ad-builder/models/ABTemplate.js","webpack:///./packages/core-ad-builder/enablers.js","webpack:///./packages/core-ad-builder/actions.js","webpack:///./build-targets/portal/packages/core-ad-builder/actions.js","webpack:///./packages/core-ad-builder/menus.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABTemplatePreviewView.js","webpack:///./build-targets/portal/packages/core-asset/views/assetSelectListItemView.js","webpack:///./build-targets/portal/packages/core-ad-builder/collections/ABCategoryAssets.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABBlockView.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABBlocksView.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABCustomizationsListView.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABTemplateTabsView.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABTemplateView.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABAssetTemplatesView.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABCustomizationDownloadView.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABCustomizationNameView.js","webpack:///./build-targets/portal/packages/core-ad-builder/collections/ABCustomizations.js","webpack:///./build-targets/portal/packages/core-ad-builder/collections/ABAssets.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABGalleryHeaderView.js","webpack:///./build-targets/portal/packages/core-ad-builder/views/ABGalleryView.js","webpack:///./packages/core-ad-builder/config.js","webpack:///./packages/core-ad-builder/routes.js","webpack:///./build-targets/portal/packages/core-ad-builder/routes.js","webpack:///./build-targets/portal/packages/core-ad-builder/controller.js","webpack:///./packages/core-ad-builder/index.js","webpack:///./node_modules/@material/floating-label/constants.js","webpack:///./node_modules/@material/floating-label/foundation.js","webpack:///./node_modules/@material/floating-label/component.js","webpack:///./node_modules/@material/line-ripple/constants.js","webpack:///./node_modules/@material/line-ripple/foundation.js","webpack:///./node_modules/@material/line-ripple/component.js","webpack:///./node_modules/@material/notched-outline/constants.js","webpack:///./node_modules/@material/notched-outline/foundation.js","webpack:///./node_modules/@material/notched-outline/component.js","webpack:///./node_modules/@material/textfield/character-counter/constants.js","webpack:///./node_modules/@material/textfield/character-counter/foundation.js","webpack:///./node_modules/@material/textfield/character-counter/component.js","webpack:///./node_modules/@material/textfield/foundation.js","webpack:///./node_modules/@material/textfield/helper-text/constants.js","webpack:///./node_modules/@material/textfield/helper-text/foundation.js","webpack:///./node_modules/@material/textfield/helper-text/component.js","webpack:///./node_modules/@material/textfield/icon/constants.js","webpack:///./node_modules/@material/textfield/icon/foundation.js","webpack:///./node_modules/@material/textfield/icon/component.js","webpack:///./node_modules/@material/textfield/component.js","webpack:///./packages/core-share/views/assetOptionsView.js","webpack:///./build-targets/portal/packages/core-share/views/assetOptionsView.js","webpack:///./packages/core-share/views/createPDFTemplateItemView.js","webpack:///./build-targets/portal/packages/core-share/views/createPDFTemplateItemView.js","webpack:///./packages/core-share/views/createPDFTemplateItemsView.js","webpack:///./packages/core-share/views/createPDFOptionsView.js","webpack:///./build-targets/portal/packages/core-share/views/createPDFOptionsView.js","webpack:///./packages/core-share/views/exportMetadataView.js","webpack:///./build-targets/portal/packages/core-share/views/exportMetadataView.js","webpack:///./packages/core-share/views/downloadOptionsView.js","webpack:///./packages/core-public-link/actions.js","webpack:///./packages/core-public-link/menus.js","webpack:///./packages/core-public-link/collections/publicLinks.js","webpack:///./packages/core-public-link/config.js","webpack:///./packages/core-public-link/routes.js","webpack:///./packages/core-public-link/controller.js","webpack:///./packages/core-public-link/index.js","webpack:///./packages/core-user/actions.js","webpack:///./packages/core-user/menus.js","webpack:///./packages/core-user/config.js","webpack:///./packages/core-user/routes.js","webpack:///./packages/core-user/controller.js","webpack:///./packages/core-user/index.js","webpack:///./node_modules/@mui/material/esm/Switch/switchClasses.js","webpack:///./node_modules/@mui/material/esm/Switch/Switch.js"],"names":["QueryError","Error","code","QUERY_SORT_ORDER","ASCENDING","DESCENDING","sessionErrors","netxQueryDam","client","axios","create","baseURL","Netx","URL","api","defaults","headers","common","source","CancelToken","_post","post","method","data","config","session","resetLogoutTimer","get","includes","unshift","getToken","getKey","promise","id","Date","now","dataContext","jsonrpc","params","cancelToken","token","then","response","error","dispatcher","trigger","message","cancel","ErrorField","disabled","FormHelperText","DateTextField","inputRef","props","innerRef","useSharedRef","useErrorFocus","TextField","DateField","classes","changed","className","form","formFieldOptions","onChange","hideErrorMessage","loadingValue","name","placeholder","readOnly","required","value","dateToHTML","useFormInput","handleChange","useCallback","date","moment","toString","format","ex","console","log","getValueFromPickerDate","setValue","clsx","root","LocalizationProvider","dateLibInstance","dateAdapter","AdapterMoment","DatePicker","inputFormat","mask","minDate","renderInput","textFieldProps","helperText","fullWidth","InputProps","endAdornment","CircularProgress","size","loading","variant","inputProps","InputLabelProps","inputLabel","withStyles","theme","createStyles","display","flexDirection","width","maxWidth","position","right","top","strokeWidth","React","memo","DEFAULT_OPTIONS","alwaysValidate","removeValueOnUnregister","resetOnSubmit","resetWithOriginalValues","submitLabel","i18n","t","useForm","values","formOptions","act","shouldAct","useComponentIsMounted","options","optionsRef","setOptions","useRefState","lastFormOptionsRef","useRef","useEffect","equal","current","multiFieldsRef","fieldRef","isSubmitting","isSubmittingRef","setIsSubmitting","submissionError","submissionErrorRef","setSubmissionError","formMultipleValues","formMultipleValuesRef","setFormMultipleValues","multipleValues","formValues","formValuesRef","setFormValues","originalValues","originalValuesRef","setOriginalValues","formActions","formActionsRef","setFormActions","formChanges","formChangesRef","setFormChanges","formErrors","formErrorsRef","setFormErrors","hasChanged","hasChangedRef","setHasChanged","isValid","isValidRef","setIsValid","lastValuesRef","Object","keys","length","getAction","fieldName","hasError","type","existing","inErrors","fieldNames","Array","isArray","some","key","checkFieldChanged","originalValue","action","field","valuesMatch","clearAction","actions","_actions","clearError","errors","newErrors","forEach","resetActions","withAction","resetChanges","setChange","changes","_changes","setError","validateField","async","input","validator","result","isEmptyValue","validate","currentValues","validationFailed","i","c","register","fieldOptions","unregister","setAction","removeAction","updateOptions","reset","withValues","withMultipleValues","onReset","handleSubmit","callback","onSubmit","event","preventDefault","stopPropagation","valid","undefined","resetWithCurrentValues","actionsRef","changesRef","errorsRef","multipleValuesRef","setMultipleValues","setValues","valuesRef","_fieldName","compareProps","ignoreProps","nextProps","lastProps","preventContextMenu","combineRefs","refs","node","ref","getIconButtonUtilityClass","slot","generateUtilityClass","iconButtonClasses","generateUtilityClasses","ICON_BUTTON_SIZE_VALUE","small","medium","large","ICON_SIZE_VALUE","IconButtonRoot","styled","MuiIconButton","overridesResolver","styles","ownerState","colors","getSeverityColors","height","boxShadow","shadows","transition","transitions","duration","short","background","palette","secondary","light","muiIconButtonClasses","fontWeight","typography","fontWeightMedium","color","backgroundColor","main","contrastText","default","text","hover","borderWidth","borderStyle","borderColor","custom","border","opacity","outlined","fab","contained","white","icon","IconButtonIconRoot","FontAwesomeIcon","zIndex","IconButtonPrimitive","_classes","children","label","title","IconProps","TooltipProps","slots","capitalize","composeClasses","useUtilityClasses","Tooltip","fixedWidth","displayName","IconButton","useWhenChangedEffect","thingThatMightChange","thingThatMightChangeRef","ranOnceRef","callbackRef","oldValue","onlyOnUpdate","executeAtMount","initialValue","refsToShare","sharingRef","resolvableRef","defineProperty","FieldInner","Field","forwardRef","document","body","DEFAULT_WIDTH","DragHandle","isDragging","dragging","makeStyles","html","cursor","userSelect","pointerEvents","role","borderLeft","overflow","left","bottom","mode","fontSize","marginTop","transform","useMemoCompare","next","compare","previousRef","previous","isEqual","usePrevious","useRpc","rpcRef","lastMethod","rpc","Rpc","duplicateQueryPolicy","request","callsByName","xhr","state","abort","Promise","resolve","reject","query","catch","setState","useState","stateRef","_setState","newState","ChipRoot","MuiChip","CHIP_CLASS_NAME","meshAvatar","muiChipClasses","avatar","chipClasses","deleteIcon","dark","marginLeft","ChipDeleteIcon","deleteIconColor","alpha","primary","lineHeight","outline","outlineStyle","ChipIconWrapper","padding","spacing","ChipInner","deleteTabbable","deleteTitle","onBlur","onFocus","deleteIconRef","focused","setFocused","iconWrapper","getChipUtilityClass","disableTitle","setDisableTitle","focus","handleBlur","handleFocus","handleDeleteIconKeydown","keyCode","which","click","TransitionProps","onEntering","onExited","onKeyDown","tabIndex","TimesCircleIcon","Chip","Button","severity","warn","flex","getButtonSeverityStyles","FALLBACK_MESSAGE_CLASS_NAME","getFallbackMessageUtilityClass","fallbackMessageClasses","FallbackMessageRoot","alignItems","paper","justifyContent","minHeight","textAlign","SEVERITIES","reduce","accum","FallbackMessageIcon","onBackground","marginBottom","FallbackMessageBody","FallbackMessageHeader","FallbackMessageText","Typography","FallbackMessageChildren","FallbackMessage","header","_icon","_message","gutterBottom","useUpdateEffect","effect","dependencies","isInitialMount","withConfirmation","Component","ConfirmationService","ConfirmationServiceProvider","UploadAssetItemStatusLabel","UploadAssetItemStatus","COLLISION_REJECTION","COMPLETED","DUPLICATE","ERROR","IMPORTING","MISSING","PAUSED","PENDING","PROCESSING","RECOVERED","RECOVERABLE_ERROR","UPLOADING","UploadAssetConfirmation","CONFIRM_DISCARD","UploadAssetMessage","DUPLICATE_FILE_ADDED","INVALID_FILE_NAMES","CONNECTION_LOST","UPLOAD_STARTED_GOTO","UPLOAD_STARTED","IMPORT_FAILED","fileName","file","IMPORT_SUCCESS","UploadBuilderLabel","ACTIVE","FILE_COUNT","count","FAILED","PROGRESS","UploadBuilderTitle","UPLOADS","UPLOAD","NEW_UPLOAD","EDIT_ATTRIBUTES","UploadAssetWarning","COLLISION_REJECTED","DUPLICATE_DETECTED","FILE_DOES_NOT_MATCH","MISSING_FILES","UploadAssetActionLabel","ADD_FILES","BACK","CANCEL","CLEAR","CLICK_TO_ADD_FILES","DROP_FILES_HERE","GOTO","GOTO_ASSET","GOTO_FOLDER","GOTO_STATUS","NEXT","PAUSE","PAUSE_ALL","REMOVE","RESELECT","RESUME","RESUME_ALL","RETRY","SELECT_CATEGORY","VIEW_DUPLICATE","UploadAssetProcessLabel","ImportingTask","VisualDescriptorTask","ImageProxiesTask","AudioTask","FFFViewTask","INDDPageTask","IWorkPageTask","KeyframesTask","MetadataTask","OfficePageTask","PDFPageTask","PostImportTask","PreviewTask","RelatedAssetTask","SWFTask","ThumbnailTask","VideoPreviewTask","WatermarkTask","ZoomTask","ZoomTileTask","TransitionUp","Slide","direction","Snackbar","onClick","open","isOpen","setIsOpen","handleClose","reason","handleAlertClose","ReactDOM","createPortal","autoHideDuration","onClose","TransitionComponent","anchorOrigin","horizontal","vertical","style","Alert","SnackbarServiceContext","createContext","useSnackbar","useContext","SnackbarServiceProvider","snackbarOpen","setSnackbarOpen","snackbarState","setSnackbarState","nextSnackbarStateRef","lastSnackbarStateRef","handleExited","handleOpenSnackbar","Provider","withSnackbar","UploadAssetPref","USER_LEVEL","IMPORTER","invalidCharsPattern","invalidPeriodsPattern","ACTIVE_STATUSES","COMPLETED_STATUSES","ACTIONABLE_COMPLETED_STATUSES","INACTIVE_STATUSES","PAUSABLE_STATUSES","PAUSED_STATUSES","PROGRESS_STATUSES","REMOVABLE_STATUSES","RESUMABLE_STATUSES","defaultOptions","start","amount","increment","delay","breakItUp","processCallback","completeCallback","idx","process","amt","processed","end","call","self","brokenUp","setTimeout","checkEquality","newValue","getAppendChar","appendChar","getPreference","getBehaviorFromGrid","plugin","behavior","getDataModelFromGrid","dataModel","getColumnFromGrid","x","columns","getColumnsFromGrid","allColumns","getSortIndexesFromGrid","sortIndex","getDataFromGrid","dataSource","getDataSourceFromGrid","getDataPointFromCellEvent","dataCell","detail","getUpdatedValueData","assetId","newValues","rowData","initialiValues","column","value1","value2","Set","appendValue","properties","parseInValue","find","getColumnsByName","columnsByName","ActionButton","checked","ComponentProps","handleClick","persist","commonProps","MenuItem","button","ListItemIcon","menuIconWrapper","ListItemText","ToggleButton","on","onToggle","startIcon","minWidth","usePlaceholder","attrData","defaultPlaceholder","modifiers","cleared","disable","getPlaceholder","isMultipleField","ATTRIBUTE_MULTIPLE_VALUE_TYPES","setPlaceholder","INPUT_FORM_KEYS","getInputFormObject","fromEntries","entries","filter","currentValue","join","match","replace","JSON","stringify","shadow","shadowSize","createShadow","side","backgroundRepeat","backgroundSize","getSentinelUtilityClass","ScrollSentinelRoot","ScrollSentinel","getScrollBorderUtilityClass","scrollBorderClasses","useIntersectionObserver","cb","opts","observer","IntersectionObserver","threshold","unobserve","element","disconnect","registerRef","index","currentObserver","exists","observe","concat","unregisterRef","ScrollBorderBottom","ScrollBorderTop","ScrollBorderRoot","scrolled","scrollBorderTop","hasOverflow","scrolledToEnd","scrollBorderBottom","useShadow","borderBottom","borderTop","ScrollBorderScrollWrapper","mixins","scrollable","ScrollBorder","setScrolled","setScrolledToEnd","setHasOverflow","contentPadding","sendProps","internalRef","scrollWrapper","scrollSentinel","intersectionObserver","entry","target","getAttribute","isIntersecting","useLayoutEffect","RO","ResizeObserver","clientHeight","scrollHeight","getScrollBorderReactWindowUtilityClass","scrollBorderReactWindowClasses","ScrollBorderReactWindowWrapper","ScrollBorderReactWindowSentinel","ScrollBorderReactWindowBorder","ScrollBorderReactWindowBottom","ScrollBorderReactWindowTop","ScrollBorderReactWindowPrimitive","onOverflowChange","onOverflowChangeRef","useEnhancedRef","intersectionRect","y","boundingClientRect","intersectionRatio","toFixed","ScrollBorderReactWindow","StyledListItemIcon","AutoListOption","uncontrolled","ListItem","ListItemAvatar","Avatar","ColoredAvatar","PlusIcon","primaryTypographyProps","noWrap","marginRight","paddingRight","AutoListSelection","getTagProps","getValueLabel","onSearch","uncontrolledValues","_getValueLabel","map","uncontrolledValue","ValueChip","noInput","noMatches","isValidQueryInput","trim","isInValue","toLowerCase","val","AutoListFieldInner","additionalOptions","clearOnClose","flexible","hideLabel","multiple","onLookup","testValueContainsInput","testValueContainsOption","AutocompleteProps","_value","getOptionLabel","inputValue","setInputValue","isLoading","setIsLoading","setOpen","searchInput","setSearchInput","setUncontrolledValue","setUncontrolledValues","testValueCb","testValueOptionCb","option","testOptionsContainInputCb","newUncontrolledValues","addToArrayUnique","handleFilterOptions","handleLookup","str","results","uniqueArray","handleInputChange","IGNORE_INPUT_CHANGE_EVENTS","handleOpen","renderOption","Option","renderTags","Selection","SelectField","labelHidden","filterOptions","filterSelectedOptions","noOptionsText","locales","onInputChange","onOpen","AutoListFieldPrimitive","AutoListField","noOptions","textOverflow","refresh","paddingTop","PrimaryTitle","SkeletonProps","Skeleton","SecondaryTitlePrimitive","sekeleton","component","paragraph","SecondaryTitle","TITLE_CLASS_NAME","getTitleUtilityClass","titleClasses","TitleRoot","TitleIcon","borderRadius","TitleIconArea","TitleTitleArea","TitlePrimitive","actionButton","PrimaryTitleProps","SecondaryTitleProps","iconArea","titleArea","Title","SearchMatchCriteria","SearchSortOrder","DEFAULT_SEARCH_SORT_FIELD","DEFAULT_SEARCH_SORT_ORDER","ASC","DEFAULT_SEARCH_MATCH_CRITERIA","AND","MetadataSubType1","NON_SORTABLE_SEARCH_TYPES","SearchType","CUSTOM","VISUAL","SEARCH_SORT_SYSTEM_ATTRIBUTES","ATTRIBUTE_SYSTEM_ID","checksum","expireDate","fileFormatFamily","fileSize2","filetypelabel","importDate","moddate","creationdate","dimensions","SALO_STRING_MAP","ACTIVE_TEMPLATES","ADVANCED_RAW","ATTRIBUTE_HISTORY","CART","CATEGORY_ID","CATEGORY_NAME","CHECKOUTS","CONTENTS","DATE","FILE_ASPECT","FILE_FORMAT","FILE_FORMAT_FAMILY","FILE_SIZE","KEYWORD","METADATA","SAVED_SEARCH","THESAURUS","a","b","d","e","f","g","h","SUBMIT_BUTTON_CLASS_NAME","getSubmitButtonUtilityClass","submitButtonClasses","SubmitButtonRoot","iconOnly","submitting","SubmitButtonButton","SubmitButtonProgress","LinearProgress","SubmitButtonPrimitive","progress","showWorking","SaveIcon","SubmitButton","SelectFieldRoot","selectFieldClasses","inputLabelClasses","inputBaseClasses","shrink","ListItemIconRoot","selectedIcon","AutocompleteRoot","Autocomplete","autocomplete","PopperRoot","Popper","autocompleteClasses","renderGroup","group","ListSubheader","SelectFieldInner","labelKey","optionLabels","getSelectFieldUtilityClass","fixedSizeListRef","Input","autoComplete","secondaryAction","selected","faCheck","getSafeValues","autoHighlight","blurOnSelect","clearOnBlur","disableClearable","selectOnFocus","disableCloseOnSelect","handleHomeEndKeys","openOnFocus","ListboxComponent","ListBox","PopperComponent","ListboxProps","SelectFieldPrimitive","ACTIONS","Actions","dispatch","setOrder","ids","initialState","attributeTemplateIds","attributeTemplates","enforce","hideSystemAttributes","invalidator","loaded","loadingTemplates","lookupsAllowed","targets","notEmpty","arr","reducer","reverse","attrs","attr","attributeid","flat","leftToLoad","StoreContext","useAttributeSetSelectionProvider","context","AttributeSetSelectionProvider","confirm","defaultSelection","userPrefKey","attributesSetProvider","useAttributeSetProvider","confirmation","useConfirmation","useReducer","cancelled","setCancelled","justPulledFromPrefsRef","userPref","setUserPref","useUserPref","parseIn","split","parseOut","continueFetching","asyncForEach","getAttributeTemplatesById","getMetadataLookupsByIds","fetch","setSelected","all","description","catchOnCancel","getUserLevel","n","dispatchActions","useMemo","attributeSetCtx","BASE_RULE","elementType","elementSubType1","elementSubType2","elementValue1","elementValue2","elementValue3","SearchTypeLabel","BRANCH_CHILDREN","EXPIRE","FILE_STATUS","LAST_SEARCH","LOCATION","METADATA_HISTORY","PROOF","RATING","RELATED_ASSETS","REVIEWS","USER","SearchMatchCriteriaLabel","NOT","OR","SearchSubTypeLabel","SearchRulesActionLabel","ADD_RULE","DELETE_RULE","RESET","SEARCH","SearchDataUnavailableMessage","RuleModel","elementSubType1Options","elementSubType2Options","constructor","elementValue1Label","elementValue2Label","elementValue3Label","elementValue1Loading","elementValue2Loading","elementValue3Loading","elementValue1Unavailable","elementValue2Unavailable","elementValue3Unavailable","_id","reactionDisposers","validationErrors","dirty","this","nanoid","makeObservable","observable","setElementValue1Label","setElementValue1Loading","setElementValue1Unavailable","setElementValue2Label","setElementValue2Loading","setElementValue2Unavailable","setElementValue3Label","setElementValue3Loading","setElementValue3Unavailable","setValidationErrors","dispose","unavailable","toRuleObject","TabsRoot","MuiTabs","TabsPrimitive","tabs","useTabsProvider","centered","indicatorColor","textColor","activeTabIndex","Tabs","useTabs","afterChange","beforeChange","setActiveTabIndex","setTab","TabsContext","TabsProviderInner","useImperativeHandle","TabsProviderPrimitive","TabsProvider","componentIsMounted","Search","SearchIcon","AttributeContainerComponent","alignActions","limitHeightToContainer","matchContainerHeight","permission","isReadOnly","valueRef","handleValueSearch","handleValueItemSearch","leadingControls","Attribute","AttributeContainer","maxHeight","UserLevel","ADMIN","PERMISSION_TYPE","PERMISSION_MODE","PERMISSION_MESSAGES","NO_PERMISSIONS","PERMISSION_TITLES","EDIT","PERMISSION_TYPE_LABEL","dropdownIcon","activeIcon","menu","permissionModeItem","onRemove","ButtonProps","MenuProps","anchorEl","setAnchorEl","internalButtonRef","handleOpenClick","currentTarget","selectPermission","perm","handleRemove","modeEntries","modeCount","faCaretDown","Menu","Boolean","divider","dense","paddingLeft","listItemAction","PermissionItemMenuProps","PermissionItemMenuComponent","PermissionItemMenu","groupName","write","groupId","VirtualizedPermissionListItem","rows","viewportWidth","skeleton","VirtualizedPermissionsList","ListItemComponent","ListItemComponentProps","dataReady","total","VirtualizedList","useIsScrolling","innerElementType","PermissionsIcon","active","canTab","buttonRef","requestedCloseRef","requestedOpenRef","menuOpen","setMenuOpen","handleMenuToggled","blur","preventBubble","VirtualizedPermissionListItemFocusTrap","itemMenuRef","justTabbedForwardRef","activeIndex","focusTrapActive","onInteracting","menuActive","setMenuActive","close","useDocumentKeyDown","shiftKey","handleMenuOpenedToggle","requested","wasOpen","handleMenuBlur","menuToggleId","onFocusCapture","PermissionItemFocusTrapMenu","VirtualizedListTrapFocusRoot","margin","PermissionsPrimitive","virtualListRef","addedAtIndex","itemProvider","useVirtualizedListArrowTabTrapProvider","internalVirtualListRef","rootRef","activeDescendant","onScrollIndexUpdate","onItemInteracting","onItemClick","Permissions","activeDescendantLabel","pageSize","enumToValues","permissionListWrapper","container","containerRef","onAdd","groupRef","stageHeight","setStageHeight","window","innerHeight","listHeight","setListHeight","setMaxHeight","setAddedAtIndex","onResize","addEventListener","removeEventListener","availableHeight","minMeight","Math","min","handleAdd","read","handleFilterGroups","groups","GroupAutoList","filterGroups","dialogContent","backdropRef","confirmLabel","faUsersMedical","requiresChanges","secondaryTitle","attributeTemplate","BackdropProps","DialogContentProps","originalData","ready","saving","unsavedChanges","templateId","push","parse","existingRecord","assign","addPermission","deletePermission","resetPermissions","updatePermission","getAttributePermissions","requestParams","NetxQueryDam","setAttributePermissions","groupAttributePermissions","queryClient","QueryClient","reactQueryGetAttributePermissions","queryParams","queryKey","AttributePermissionProvider","attributesProvider","useAttributeProvider","dataRef","attributePermissionsMutation","useMutation","onError","onSuccess","attributePermissions","attributePermissionsQuery","useQuery","enabled","refetchOnReconnect","refetchOnWindowFocus","retry","attributeData","edit","setPermissionEdit","endEdit","getAttributeTemplate","getById","save","mutateAsync","status","isFetching","isItemLoaded","PermissionsContainer","useAttributePermissionProvider","dialogReady","setDialogReady","handlePermissionItemChange","newPerm","handlePermissionItemRemove","hidePager","loadMoreItems","onEntered","isAppearing","Wrapped","AttributeContext","hasMandatoryUserDefinedTemplates","lookups","getAll","getByIds","getByName","getByNames","getByType","getDefaultValues","getLabelById","lookup","searchValue","AttributeProviderInner","attributes","useAttributes","editPermission","setEditPermission","contextValue","keepMounted","AttributeProviderPrimitive","AttributeProvider","AttributeDropdownContainer","getTextFieldUtilityClass","textFieldClasses","getStyledTextFieldUtilityClass","styledTextFieldClasses","StyledTextFieldRoot","MuiTextField","textarea","inherit","outlinedInputClasses","notchedOutline","LoadingRoot","StyledTextFieldPrimitive","multiline","StyledTextField","TextFieldRoot","TextFieldPrimitive","ReadOnlyTextField","getTabPanelClass","tabPanelClasses","TabPanelRoot","pad","TabPanelPrimitive","disablePadding","hidden","TabPanel","SearchTypeAdvancedRaw","SearchTypeAttributeHistory","SearchTypeCart","SearchTypeCategoryId","SearchTypeCheckouts","SearchTypeContents","SearchTypeDate","SearchTypeExpiration","SearchTypeFileAspect","SearchTypeFileFormat","SearchTypeFileFormatFamily","SearchTypeFileSize","SearchTypeKeyword","SearchTypeMetadata","SearchTypeSavedSearch","SearchTypeUser","SearchTypeVisual","EditableRuleTypes","createAssetObject","overrides","attribute1","attribute10","attribute11","attribute12","attribute13","attribute14","attribute15","attribute16","attribute17","attribute18","attribute19","attribute2","attribute20","attribute3","attribute4","attribute5","attribute6","attribute7","attribute8","attribute9","attributeIds","attributeNames","attributeValues","audioBitRate","audioChannelCount","audioChannelLayout","audioSampleRate","categories","categoryPaths","categoryid","checkout","checkoutUserLabel","commitAttributes","constituentIds","constituentType","expirationDate","fileheight","filesize","filetype","filewidth","flvPreview","geoLocationLabel","hasChildren","imageid","importUserLabel","inCurrentCart","latitude","locationContext","locationid","longitude","metadata","metadataAvailable","moduserid","moduserlabel","parentId","path","permissionMatrix","previewHeight","previewUrl","previewWidth","proofAvailable","rating","relatedAvailable","repurposeAvailability","reviewAvailable","statDeliveries","statPreviews","thumb","thumbUrl","timeScale","versionIds","viewIds","viewNames","visible","zoomAvailable","dpi","md5sum","bitDepth","colorProfile","alphaChannel","templatable","template","templateCustomizable","iiifManifestUrl","isDocumentFileTypeAsset","DocumentFormatFamilies","isImageFileTypeAsset","ImageFormatFamilies","isVideoFileTypeAsset","VideoFormatFamilies","getGeneralAssetFileType","specific","isMediaFileTypeAsset","getDocumentFileTypeAssetInfoLabel","pageCount","getMediaFileTypeAssetInfoLabel","secondsToHms","getImageFileTypeAssetInfoLabel","getAssetFileTypeInfoLabel","isAssetCheckedOut","asset","assetStatuses","CHECKOUT","ASSET_DEFAULT_ICON_TEST","isDefaultIcon","routeToAsset","router","navigate","getSemanticObjectAutoList","metadataAutoCompleteLookup","metadataDatasetAutoList","vocabularyValueLookup","CONTEXT_MENU_CLASS_NAME","getContextMenuUtilityClass","ContextMenuRoot","Popover","popoverClasses","ContextMenuWrapper","ContextMenuList","ContextMenuHeader","headerSeverity","ContextMenu","headerIcon","headerPrimary","headerSecondary","selectedAction","handleAction","handleClickAway","listener","handleListKeyDown","anchorPosition","anchorReference","ClickAwayListener","onClickAway","ActionMenuList","autoFocusItem","onAction","ContextMenuServiceContext","useContextMenu","ContextMenuServiceProvider","contextMenuState","setContextMenuState","awaitingPromiseRef","openContextMenu","withContextMenu","_open","_","throttle","toggleOpen","disableInteractive","actionChangesValue","ATTRIBUTE_ACTION","APPEND","getAttributeComponent","TextAttribute","SelectAttribute","DateAttribute","MultiSelectAttribute","TagAttribute","NumberAttribute","SemanticAttribute","TagVocabAttribute","getTemplatesEffectedByLookup","keyDatasets","attributesWorking","targetDatasets","isAppendable","isSystemAttribute","normalizeValue","wrapLabel","pseudoValue","displayLabel","displayValue","whiteSpace","readOnlyLabel","wordBreak","DrawerAnchor","DrawerVariant","DrawerActionLabel","COLLAPSE","CLOSE","UNCOLLAPSE","DRAWER_TOOLBAR_CLASS_NAME","getDrawerToolbarUtilityClass","drawerToolbarClasses","DrawerToolbarRoot","toolbar","anchorLeft","anchorRight","visibility","DrawerTitle","DrawerToggle","DrawerToolbarPrimitive","anchor","cancelAsClose","onCollapseToggle","toggle","Toggle","TimesIcon","ToggleIcon","rotation","LEFT","RIGHT","DrawerToolbar","DRAWER_CLASS_NAME","getDrawerUtilityClass","drawerClasses","DrawerRoot","DragResize","resizing","dragResizeHandleClasses","willChange","content","easing","sharp","enteringScreen","leavingScreen","overflowX","temporary","DrawerWrapper","MuiDrawer","paperClasses","DrawerContent","DrawerPrimitive","headerActions","onResized","overflowParent","PERMANENT","exited","setExited","setResizing","TEMPORARY","handleDrawerToggle","handleDrawerClick","handleDrawerKeyDown","drawer","DragResizeDirection","minSize","overflowParentEl","onResizeStarted","onResizeEnded","FocusTrap","disableEnforceFocus","Drawer","withDrawer","DrawerProps","MENU_ITEM_CLASS_NAME","getMenuItemUtilityClass","menuItemClasses","MenuItemRoot","MuiMenuItem","severityError","MenuItemIcon","MenuItemColorAvatar","colorAvatar","secondaryText","unstable_capitalize","preference","asBoolean","defaultValue","parseInRef","parseOutRef","update","prefValue","user","prefs","off","preferenceRef","setPref","setPreference","base","MetadataType","MetadataNoValueTypes","MATCH_VALUE_IS_NOT_EMPTY","MATCH_VALUE_IS_EMPTY","MetadataSingleValueTypes","EXCLUDE","MATCH_ALL_WHOLE_WORDS","MATCH_ALL_WILD_CARDS","MATCH_ANY_WHOLE_WORDS","MATCH_ANY_WILD_CARDS","MATCH_EXACTLY","oldRef","createValidationObject","currentChanges","useChangeStore","ChangeStoreProvider","gridEditor","addFieldTimeout","addField","toAdd","clearTimeout","removeFieldTimeout","removeField","toRemove","add","remove","overflownX","overflownY","storedData","overflown","Number","isInteger","piece","padStart","multiSelect","number","select","tag","semantic","tagVocab","ATTRIBUTE_TYPE","MULTISELECT","NUMBER","SELECT","SEMANTIC","TAG","TAG_VOCAB","tag_vocab","TEXT","TEXTAREA","cells","columnCount","inSingleColumn","inSingleRow","loose","rowCount","singleColumn","singleRow","hasColumns","hasSelections","hasRows","isEmpty","useSelectionStore","SelectionStoreProvider","_inSingleColumn","looseRowCount","numColumns","selections","selectedColumn","hasOwnProperty","_inSingleRow","numRows","selectedRow","parseInt","setProgress","timeoutRef","handleSelectionChangeCheck","selectionModel","allRowsSelected","handleColumnSelectionChange","columnNames","handleRowSelectionChange","handleSelectionChange","getSelections","selectionCount","rect","endX","endY","startX","startY","xSelected","ySelected","indexOf","getColumns","cellCount","row","cols","clear","repaint","selectAll","toggleSelectAllRows","getPoints","worker","getInlineWorker","PointsWebWorker","onmessage","points","trailing","postMessage","columnName","_index","totalColumns","totalRows","working","useProgressStore","ProgressStoreProvider","updateTimeoutRef","updateRequestedAtRef","storeValue","useSet","snackbar","updatedData","uuid","batchJob","BatchJobModel","pollInterval","model","prog","garbageCollect","finally","poll","messages","saveSuccess","getAllValues","permissions","round","attrValues","valuesWritables","perms","parseOutValue","writable","w","getValues","selectionStore","ignoreParseOut","aborted","completed","job","selectedColumnObjects","selectedColumnCount","selectedRows","selectedRowCount","rowIndexesUpdating","columnIndexesUpdating","processCount","rowAmount","rowIndex","realIndex","dataSize","columnAmount","multiValueFields","columnObject","pointsSize","updateAllValues","changeStore","initialValues","updatingFields","updatingColumnObjects","updatingFieldCount","valueData","takeFocus","columnsByNames","originalRowData","useGridStore","GridStoreProvider","onSetData","getData","search","cartSingleton","selection","createSearchObject","sortField","sortOrder","matchCriteria","elementTypes","elementSubType1s","elementSubType2s","elementValue1s","elementValue2s","elementValue3s","useGetData","saveData","useSaveData","cart","useCurrentCart","rawDataRef","schemaRef","permissionRef","progressStore","changeStoreRef","selectionStoreRef","attributeSetSelectionProvider","getGridData","gridData","datum","record","parseValue","getSchema","types","items","multivalue","mandatory","typeId","semanticTypeId","spec1","spec2","localizer","attributeFormatters","attributeParsers","invalid","attributeValidators","attributeParsersOut","formatValue","pulldownOptions","getColumnPropsForAttribute","clone","cloneFromId","cloneToIds","fields","cloneDataSource","totalItemsToCloneTo","cloneFromData","_cloneFromData","updateData","updateSpecificValues","getCloneData","cloneData","cloneTargets","splice","cloneFields","cloneSchema","workerAbortRef","getSelectedValues","_getSelectedValues","resetAllChanges","resetAllValues","resetStore","resetSelectedChanges","changedFields","changesToDelete","pointAmount","changeIndex","resetSelectedValues","setData","schema","resized","loadingData","details","valueColumnObjects","selectedColumns","updateSelectedValues","images","permissionsRef","getCell","declaredRendererName","point","getColumn","isHandleColumn","halign","getType","cellConfig_setAlignment","isUserDataArea","columnProps","fixedColumnCount","cellReadOnlyColor","cellChangedColor","cellMandatoryColor","cellDefaultColor","cellConfig_setColor","rowImages","img","Image","onload","ratio","naturalWidth","naturalHeight","src","loadImage","cellRenderers","rowSelection","centerIcon","leftIcon","gridCell","getCellEditorAt","declaredEditorName","cellEvent","editorType","cellEditors","handleCellClicked","isGridRow","handleCellEditorDataChange","handleResize","sbHScroller","sbVScroller","contentSize","containerSize","assetIds","assetCount","hasAssets","gridDetails","updatedDataSize","item","rawData","rawAttr","TableLayoutStoreContext","useTableLayoutProvider","TableLayoutProvider","tableLayout","useTableLayout","TableRowSelectionStoreContext","useTableRowSelectionProvider","TableRowSelectionProvider","tableRowSelection","useTableRowSelection","DIALOG_TITLE_CLASS_NAME","getDialogTitleUtilityClass","dialogTitleClasses","DialogTitleRoot","MuiDialogTitle","hasIcon","DialogTitleText","DialogTitleActions","DialogTitleControls","DialogTitle","controls","edge","faTimes","attributeSets","AttributesSetsCollection","assetAttributes","assetAttributesSingleton","ASSET_EXPIRATION_ACTION_LABELS","UNEXPIRE","ASSET_EXPIRATION_CONFIRMATIONS","ASSET_EXPIRATION_SUBMIT_LABELS","ASSET_EXPIRATION_TITLES","ARROW_FOCUS_TRAP_ITEM_CLASS_NAME","arrowFocusTrapItemClasses","noop","nooop","defaultPublicContext","handleItemClick","handleItemInteractStart","handleScrollIndexUpdate","setActiveIndex","justClickedItem","disableNextScrollUpdate","defaultInternalContext","keysDisabled","clickKeysDisabled","returnToIndexOnFocus","sendNextFocusToPreviousElement","setReturnToIndexOnFocus","InternalContext","PublicContext","useArrowFocusTrapItem","isActive","debounce","contains","activeElement","preventScroll","setActive","focusActive","Action","useArrowFocusItemAction","memoizedAttributes","EnableClickKeys","DisableClickKeys","handleMenuOpen","ocb","DisableKeys","args","handleMenuClose","EnableKeys","ARROW_FOCUS_TRAP_ITEM_ACTIONS_CLASS_NAME","getArrowFocusTrapItemActionsUtilityClass","ArrowFocusTrapItemActionsRoot","ArrowFocusTrapItemActions","childrenProp","onMouseDown","Children","child","isValidElement","cloneElement","onEnter","onExit","getInitialState","checkIndexLoop","keepInBounds","max","Disable","Enable","End","Home","NextItem","NextPage","PrevItem","PrevPage","SetActiveItem","SetPageSize","SetReturnToIndexOnFocus","SetTotal","FOCUS_TRAP_NAVIGATION_KEYS","FOCUS_TRAP_NAVIGATION","ArrowDown","ArrowUp","PageDown","PageUp","ArrowFocusTrapContext","initialActiveIndex","onActiveIndexChange","onItemKeyDown","store","_returnToIndexOnFocus","activeIndexRef","disabledRef","justUpdatedIndexFromKeyboard","isScrolling","scrollToItem","itemClickedTimeout","itemClicked","page","stopIndex","createSyntheticEvent","ctrlKey","publicContext","internalContext","withArrowFocusTrap","ArrowFocusTrapContextProps","useArrowFocusTrap","ARROW_FOCUS_TRAP_ITEMS_CLASS_NAME","getArrowFocusTrapItemsUtilityClass","ArrowFocusTrapItemsRoot","ArrowFocusTrapItemsInner","align","disableScrollToOnFocusCapture","contextVirtualListRef","__returnToIndexOnFocus","blurTimeout","hasFocus","trapActive","listRef","sendFocus","focussable","prototype","querySelectorAll","offsetWidth","offsetHeight","nextElement","focusPreviousElement","ArrowFocusTrapItemsPrimitive","ACTION_MENU_CLASS_NAME","getActionMenuUtilityClass","actionMenuClasses","ActionMenuSkeleton","onActionDefault","ActionMenu","alwaysUseEllipsis","buttonVariant","ActionButtonProps","handleShowClick","handleActionClick","buttonTitle","EllipsisIcon","onContextMenuCapture","Divider","ErrorBoundary","super","static","componentDidCatch","errorInfo","render","Fallback","ExclamationIcon","bind","useTheme","_styles","withErrorBoundary","TOGGLE_BUTTON_CLASS_NAME","getToggleButtonUtilityClass","toggleButtonClasses","ToggleButtonRoot","getBackgroundColor","darken","lighten","fill","ToggleButtonBackground","transformOrigin","isOn","setIsOn","MenuList","Severity","watermarkCacheBuster","severities","innerWrapper","buttonSeverities","getStylePropertyDemo","defaultMuiTheme","createTheme","isSafari","safari","getHintTextColor","strToHslColor","s","l","hash","charCodeAt","baseTheme","demo","outlinedBorderColor","getOutlinedBorderColor","placeholderVisible","getPlaceholderOpacity","getStyleProperty","absoluteFill","flexFillColumn","formFooter","hideScrollbar","scrollbarWidth","msOverflowStyle","overscrollBehavior","webkitOverflowScrolling","positionSticky","WebkitOverflowScrolling","settingsContainer","forceScrollable","watermark","portal","isPortal","cms","backgroundPosition","backgroundImage","success","accent","backdrop","components","MuiAccordionSummary","styleOverrides","expandIconWrapper","MuiAutocomplete","groupUl","MuiAvatar","WebkitMaskImage","MuiButton","textTransform","iconSizeMedium","MuiButtonBase","MuiFilledInput","MuiFormHelperText","defaultProps","edgeEnd","MuiInputLabel","filled","MuiInputBase","MuiLinearProgress","MuiOutlinedInput","MuiPaper","elevation","MuiSelect","MuiTab","MuiTooltip","tooltip","MuiTypography","MozOsxFontSmoothing","WebkitFontSmoothing","body1","body2","caption","h5","h6","useThemeMui","NetxTheme","setTheme","getThemeMode","useDispatcher","themeMode","injectFirst","useBackboneCollection","collection","fetchOnMount","setAttributes","models","pullAndSetData","debouncedPullAndSetData","preferredFetchMethod","VirtualizedInput","OuterElementContext","OuterElementType","outerProps","InnerElementRoot","renderRow","areEqual","itemData","toArray","itemCount","itemSize","innerFixedSizeListRef","justLoopedToRef","handleKeydown","prevent","scrollTo","capture","handleItemRendered","MouseEvent","bubbles","cancelable","querySelector","dispatchEvent","outerElementType","overscanCount","onItemsRendered","TYPE_LABELS","HIERARCHICAL","SYSTEM_ATTRIBUTE_LABELS","ATTRIBUTE_SYSTEM","ASSET_ID","CATEGORY_PATHS","CHECKSUM","CREATION_DATE","DIMENSIONS","EXPIRE_DATE","FILE","FILE_SIZE_2","FILE_TYPE_LABEL","HEIGHT","IMPORT_DATE","MOD_DATE","MOD_USER","NAME","PATH","SMART_LABELS","THUMB_PATH","WIDTH","ConfirmationServiceContext","setCatchOnCancel","confirmationState","setConfirmationState","openConfirmation","Axis","ClientPosition","ClientDimension","ScrollDimension","OffsetDimension","DRAG_RESIZE_DEFAULT_DIRECTION","MediaFormatFamilies","AudioFormatFamilyType","AUDIO","AudioFormatFamilies","DOCUMENT","LAYOUT","CAMERA_RAW","IMAGE","RAW","VECTOR","VideoFormatFamilyType","VIDEO","MediaFormatFamilyType","DownloadDialog","completeUrl","disableEmailWhenDone","emailWhenDoneLabel","onEmailWhenDone","Dialog","DialogContent","DialogActions","DownloadServiceContext","useDownload","DownloadServiceProviderPrimitive","downloadState","setDownloadState","queryFn","getProgressReport","refetchInterval","percentComplete","openDownloadLink","openDownload","getUUID","handleEmailWhenDone","notify","setProgressReportNotify","DownloadServiceProvider","withDownloadDialog","DownloadServiceProviderProps","childList","scrollEnd","isOverflown","isScrolled","reachedScrollEnd","scrollTop","ScrollShadowWrapper","scrollNewItemsIntoView","mutationsList","removed","added","addedNodes","removedNodes","from","el","scrollIntoView","block","scrollMode","skipOverflowHiddenElements","MutationObserver","useScrollAddedNodesIntoView","onScroll","scrollListener","useScrollListener","handleHeight","system","writableOnly","userDefinedOnly","attributesSingleton","_attributes","omitSystem","omitReadOnly","objectType","objectTypes","names","limitToIds","defaultValues","attribute","lookupValue","metadataDatasetLookup","isMultiValue","Tab","FormInner","noValidate","FormPrimitive","Form","useMediaQuery","_mediaQuery","useMuiMediaQuery","mediaQuery","setMediaQuery","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","CurrentCart","Base","xhrLoadingMessages","searchAssetBeanObjects","xhrLoadedMessages","methods","addReviewAssetsToCart","projectId","decision","addToCategory","bulkEditCartAttributes","categorize","targetCat","categorizeArgs","createPDFWithOptions","delink","scope","editMetadata","exportMetadata","link","manualRepurpose","repurposeAssetIds","pluck","attrId","isNumeric","AssetAttributeModel","isString","findWhere","attributeProperties","repurpose","resync","resyncScopes","share","toggleVisibility","testBatchFailure","testBatchForever","parsers","cartResultParser","trackBatchJob","editMetaArgs","repurposeDownloadOverride","repurposeId","repurposeOtherIds","repurposeMethods","repurposeValues","runJobArgs","infinite","addQueue","assets","CoreCollection","addSubCollection","removeQueue","listenTo","triggerCartCount","catId","addAssetsToCart","queueUpdated","removeAssets","checkRoute","bulkEdit","attrModel","getAttributesByObjectType","compact","v","k","getRepurposableAssets","each","getRepurposableIds","isSortable","queueCount","queueing","assetsList","tidyAssetList","removeAssetsFromCart","toAssetSet","AssetSetModel","assetSetTypes","__name__","LocalSelection","routeContext","localStoragePathKey","host","defer","stopListening","pager","set","routesToPage","loadLocalAssets","empty","endSlice","slice","fetchSpecificAssets","gotoPage","curPage","loadPage","addLocalAssets","idArr","union","$","Deferred","removeLocalAssets","difference","returnAssetIdArray","isInCart","assetSet","isPublicUser","LocalAssetsCollection","once","useImageLoader","disableXHR","onLoaded","setFallbackUrls","setLoading","setSrc","url","setUrl","lastUrlRef","currentlyLoadingUrl","disableXHRRef","loadingRegularCancel","onLoadedRef","xmlHttpRef","cancelLoad","fallbackUrls","_fallbackUrls","shift","_loadRegular","image","onerror","err","loadRegular","unstable_batchedUpdates","xmlHTTP","XMLHttpRequest","responseType","matchMime","getAllResponseHeaders","blob","Blob","revokeObjectURL","createObjectURL","onloadend","onloadstart","onprogress","lengthComputable","send","load","_url","CheckoutType","DateType","DateSubType","DateNoValueTypes","LAST_MONTH","LAST_SIX_MONTHS","LAST_THREE_MONTHS","LAST_WEEK","LAST_YEAR","TODAY","YESTERDAY","DateSingleValueTypes","AFTER","BEFORE","DateSystemDefinedTypes","LAST_MODIFIED","KeywordType","VisualType","UPLOAD_ASSET_ACTION_ICON","faFile","faFolder","STATUS","faCloudUploadAlt","UPLOAD_ASSET_BASE_EVENT","UPLOAD_ASSET_EVENT","IMPORT_ERROR","IMPORT_FAILURE","IMPORT_WARNING","useReactQueryUtils","reactQuery","useQueryClient","invalidate","invalidateQueries","predicate","refetchPage","lastPage","allPages","startIndex","fetchNextPage","pageParam","debouncedLoadMoreItems","debouncePromise","debouncedRefetch","refetch","removeItemFromCache","itemRemoved","pages","lengthBefore","setQueriesData","setQueryData","updateItemInCache","handleDeleteMutationSuccess","handleEditMutationSuccess","editEffectsOrder","editRemovesFromFilter","interactingWithItem","enable","home","nextItem","nextPage","prevItem","prevPage","setInteractingWithItem","useVirtualizedListArrowTabTrap","activeRef","focusedOnceRef","disableNextFocusCapture","disableNextIndexUpdate","shouldFocus","defaultPrevented","relatedTarget","interacting","visibleStopIndex","LVBHandler","sortBy","r","INBHandler","stringHandler","isUndefined","AttachBodyProto","AttachBody","_positionDropdown","wrap","$dropdown","hasClass","$container","$dropdownContainer","offset","css","maxY","removeClass","addClass","Props","cleanUpSelect2","Plugins","Destroy","filterAutocompleteResults","_prepareSelect2","completion","extra","view","CustomAdapter","$element","__super__","Utils","Extend","ArrayData","getCompletion","when","inquiry","term","users","u","extend","omit","DataAdapter","Decorate","MinimumInputLength","Tags","dropdownAdapter","DropdownAdapter","Dropdown","AttachContainer","DropdownSearch","CloseOnSelect","dataAdapter","minimumInputLength","allowClear","autocompleteSearchable","selectOnClose","selectionAdapter","resultsAdapter","language","lnaguage","getOptions","Initialize","setAttribute","prepareSelect2","detectAutocomplete","opt","hasFunctionality","extendFunctionality","addInitializer","instance","Register","select2","destroyMethod","destroy","initializeMethod","pluginObj","$pluginEl","initOpts","Select2","getSelect2Options","icons","SingleSelection","$selection","apply","closest","Results","$results","_option","classList","otherOpts","ResultsAdapter","HidePlaceholder","SelectOnClose","Select2Chips","SelectionAdapter","Placeholder","AllowClear","EventRelay","AvatarRoot","charAt","toLocaleUpperCase","withForm","refreshAt","inputForm","USE_DOCUMENT_KEY_DOWN_DEFAULTS","cbRef","CART_CURRENT_ACTION_ICON","CATEGORIZE","faBook","CREATE_PDF","faFilePdf","CREATE_TMS_OBJECT_PACKAGE","faCube","DELETE","faTrashAlt","DOWNLOAD","faArrowCircleDown","DOWNLOAD_METADATA","faFileExport","faList","EMPTY","FIND_REPLACE","faSearch","MANAGE_ARCHIVE","faArchive","MANAGE_EXPIRATION","faCalendar","MENU","faShare","RELATIONSHIPS","faClone","REPURPOSE","faRecycle","RESYNC","faUndoAlt","REVIEW","faClipboardList","SAVE","faInboxIn","VISIBILITY","faEye","CART_CURRENT_BASE_EVENT","CART_CURRENT_EVENT","CountChipRoot","CountChip","hideAvatar","onClear","onDelete","AlertRoot","MuiAlert","alertClasses","FileAspectType","FileAspectSubType","FileAspectOrientationValue","DragResizeRoot","DRAG_RESIZE_CLASS_NAME","dragResizeClasses","DragResizeContent","DragResizeSentinel","SIDES","TOP","BOTTOM","DragResizeInner","checkLimits","handleMouseDown","useDragResize","sentinel","getDragResizeUtilityClass","handleObserver","DragResizePrimitive","DRAG_RESIZE_HANDLE_CLASS_NAME","getDragResizeHandleUtilityClass","FormDialogRoot","FORM_DIALOG_CLASS_NAME","formDialogClasses","FormDialogContent","FormDialogForm","FormDialogActions","FormDialogCancelButton","submitButton","FormDialogSubmitButton","breakpoints","down","FormDialog","cancelLabel","disableEscapeKeyDown","isUncontrolled","smallScreen","cancelButton","getFormDialogUtilityClass","submitEnabled","handleCancel","fullScreen","isWorking","parseNumber","locale","navigator","example","Intl","NumberFormat","cleanPattern","RegExp","parseFloat","whatDecimalSeparator","toLocaleString","substring","maxLength","Infinity","numberType","maxDecimal","ATTRIBUTE_NUMBER_MAX_DECIMAL","decimalIndex","isNaN","ATTRIBUTE_NUMBER_SPEC_2_TYPE","UNLIMITED","decimalCount","decimalSeparator","getDecimalCount","WHOLE","getGroupAutoList","getUserAutoList","UserPermission","READ","CUSTOM_THUMBNAIL_MINIMUM_USER_LEVEL","PRODUCER","currentCartIsEmpty","getTotal","currentCartIsNotEmpty","canCategorizeCurrentCartAssets","currentUserMeetsUserLevel","MANAGER","canDeleteCurrentCartAssets","canCreatePdfFromCurrentCart","CONSUMER","canCreateTMSObjectFromCurrentCart","canDownloadCurrentCart","canDownloadCurrentCartMetadata","canEditCurrentCartAttributes","canUseGridEditor","canFindReplaceCurrentCart","canManageCurrentCartArchive","DIRECTOR","canManageCurrentCartExpiration","assetExpirationEnabled","canManageCurrentCartRelationships","canManageCurrentCartVisibility","canRepurposeCurrentCart","canRepurpose","canResyncCurrentCart","canReviewCurrentCart","isMobile","assetProjectEnabled","canShareCurrentCart","getPublicProperty","hypergrid","Sorters","ClientSort","server","ServerSort","elementRef","pluginRef","configurationRef","pluginReady","setPluginReady","columnsRef","hasChanges","setHasChanges","global","fin","Hypergrid","cellKeyboardNavigationHack","scrollHack","addProperties","updateConfiguration","getDefaults","_columns","themeListener","updateSchema","removeAllEventListeners","terminate","div","hasChildNodes","lastChild","removeChild","handleSetData","installPlugins","fireSyntheticGridResizedEvent","Event","AttributeSetComponent","allowSystemAttributes","hideReadOnlyAttributes","hideReadOnlyAttribuetesWithoutValues","limitToValues","loadingValues","lookupsDisabled","readOnlyAttributes","metadataLookupsEnabled","canMetadataLookup","displayableAttributes","permReadOnly","attributeWorking","isMetadataLookup","isMetadataTarget","CART_CURRENT_ACTION_LABELS","REPURPOSE_MINIMUM_USER_LEVEL","REPURPOSE_SUPPORTED_VIEW_NAMES","REPURPOSE_SUPPORTED_FILE_FORMAT_FAMILIES","visualSearchEnabled","SearchVisualPref","ENABLED","canVisualSearch","TableCell","freezeSize","setWidth","clientWidth","ActionCell","ActionMenuProps","TableColumn","onSort","sortable","sorted","sort","sortedAscending","sortedDescending","CaretIcon","dummy","dragger","borderRight","MozUserSelect","WebkitUserSelect","ResizableTableColumn","dims","setDims","cellWidth","xStart","setIsDragging","lastMouseDown","cellRef","mousemove","clientX","mouseup","resizable","TableHead","hasActions","inEditMode","reordering","TableColumnProps","handleSort","order","TableRow","iconColumn","actionColumn","getRowBackgroundColor","contextActions","deleting","rowDisabled","sorting","contextMenu","menuIsOpen","setMenuIsOpen","handleActionsMenuClose","handleActionsMenuOpen","clientY","handleContextMenu","clickable","onContextMenu","rowStyles","SortableTableRowHandle","EqualsIcon","SortableHandle","SortableElement","sortableRef","setStyle","scrollContainer","scrollLeft","handleSortMove","screenX","screenY","reorderable","editActions","verticalAlign","wrapper","onCancel","onRowUpdate","submitError","handleKeyDown","handleKeyUp","handleSubmitClick","onKeyUp","CheckIcon","editable","editing","onEditing","onEditModeToggle","rowSorting","TableRowProps","deletingId","editingId","isEditing","setIsEditing","handleEditCancel","schemaKeys","SortableTableBody","SortableContainer","TableBody","transitionProperty","onReorder","setRowSorting","handleUpdateBeforeStart","handleSortEnd","oldIndex","newIndex","helperClass","lockAxis","lockToContainerEdges","onSortEnd","updateBeforeSortStart","useDragHandle","onChangePage","rowsPerPage","handleChangePage","hideData","onPageChange","rowsPerPageOptions","filterStr","onFilter","SearchFilter","Table","canReorder","emptyFallback","filtered","onRowClick","showEmptyFallback","TableBodyProps","TableHeadProps","TablePaginationProps","TableProps","TableToolbarProps","tableData","setTableData","setInEditMode","_canReorder","handleFilter","handleReorder","arrayMove","Paper","TableContainer","tableContainer","table","emptyTable","getVirtualizedListClass","virtualizedListClasses","VirtualizedListRoot","VirtualizedListFooter","VirtualizedListWrapper","VirtualizedListPrimitive","disableScrollShadow","scrollIndex","onOverflownChange","listClassName","chunkSize","useClassicPaging","itemTotal","getListItemComponentProps","infiniteLoaderRef","_virtualListRef","currentPage","setCurrentPage","setOverflown","stageSize","setStageSize","lastRendered","overscanStartIndex","overscanStopIndex","visibleStartIndex","showBorder","footer","sizeRef","visibleIndexes","setVisibleIndexes","stop","totalItems","ceil","resetloadMoreItemsCache","onOverflownChangeRef","OuterElement","handleItemsRendered","_onItemsRendered","handleVisiableStartIndexUpdate","forceUpdate","handleIsItemLoaded","handleLoadMoreItems","handlePageChange","scrollBarWidth","getScrollbarWidth","subtractFromWidth","handleWidth","targetRef","minimumBatchSize","itemKey","initialScrollOffset","getItemAriaLabel","showFirstButton","showLastButton","virtualizedListScrollBorderClasses","borderTopColor","borderBottomColor","DialogAlertRoot","DialogAlertPrimitive","DialogAlert","DialogProgress","Transition","DialogPrimitive","preventBackdropClose","DialogAlertProps","getLookupThing","thing","otherProp","keyId","useAttributeSet","injectMandatory","_omitReadOnly","attributeSetsSingleton","syncedOnce","syncing","userSetIdsRef","attributeSetFilters","filters","attributeSetFiltersRef","getFilterById","attrSet","includeInactive","getAllAttributeTemplateIds","attributeSet","getTemplates","mandatoryTemplates","mandatoryTemplateIds","templates","getAttributeFieldSet","getAttributeTemplatesByIds","getAttributeTemplateIdsById","getAttributeTemplateIdsByIds","getMetadataLookupsById","getSelectable","ignoreSystemMandatory","ignoreUserMandatory","attributesCtx","AttributeSetContext","AttributeSetProviderInner","AttributeSetProvider","getOptionSelected","UserAutoListInner","filterUsers","renderAvatarOption","faUsers","isOptionEqualToValue","UserAutoListPrimitive","UserAutoList","getCategoryAutoList","permissionMatrixLevel","Upload","autoStart","browse_button","multi_selection","drop_element","fileEncoding","fileFormat","storageLocation","uploading","files","comparator","pluploadOptions","storageLocations","app","uploader","PROGRESS_THROTTLE","nsEventStr","removeFile","locations","defaultLocation","getDefaultLocation","stashBrowseButton","destroyUploader","addDroppedFiles","originalEvent","dataTransfer","dropfiles","mOxie","File","addFile","beforeUpload","bindToDispatcher","binder","bindUploader","bindings","ctx","pairs","binding","isFunction","browseButtonId","cid","createUploader","has","uploaderArgs","runtimes","upload","must_have_extension","multipart_params","sessionKey","plupload","Uploader","unbindAll","initializedUploader","fileUploaded","filesAdded","addedTimestamp","charsRegex","periodsRegex","mapEventPrefix","invalidFiles","test","uploadFilenameError","merge","AUTO_START","filesWaiting","initializeUploader","uploaderInitialized","uploadError","uploadComplete","init","eventStr","argsToArray","arguments","arg","selectFiles","$button","buttonStashed","append","appendTo","syncBrowseButtons","$el","Element","jQuery","pup","getCategoryDataEndpoint","getCategoryData","signal","repositorydirectory","ChipSkeletonRoot","CHIP_SKELETON_CLASS_NAME","ChipSkeleton","getChipSkeletonUtilityClass","CategoryType","getAssetFileSizeLabel","bytes","withNiceModal","NiceModal","DialogProps","modal","useModal","hide","resolveHide","DateAttributeComponent","disableFolksonomy","shrinkLabel","textfieldPlaceholder","MultiSelectAttributeComponent","handleSearch","labelIcon","labelWrapper","textValue","setTextValue","lookupRef","testLookup","lookupString","autoList","freeSolo","NumberAttributeComponent","numberLength","numberTypes","substr","decimalDigitCount","formatNumber","SelectAttributeComponent","SemanticAttributeComponent","TagAttributeComponent","TagVocabAttributeComponent","TextFieldProps","InputVariant","inputAdornmentStart","Icon","KeyIcon","TargetIcon","attributeId","Fragment","attributeName","placement","TextAttributeComponent","isTextArea","ClearToggle","setCleared","handleToggle","TrashIcon","EditableAttributeComponent","appendable","clearable","enforceMandatory","forceClearable","onValueChange","AttributeComponent","checkRequired","canAppend","ATTRIBUTE_APPENDABLE_TYPES","requiredRef","setRequired","modeRef","lastActionRef","lastValueRef","getDisabledActions","disabledActions","setDisabledActions","newAction","lastAction","validators","handleClearToggle","handleValueChange","inputWrapper","trailingControls","EditableAttribute","alignSelf","getCorrectedUserSelector","userSelector","none","expireAsset","SORT_ORDER","correctValueIfNeeded","arrayToCsv","convertToRules","rules","rule","VirtualizedListPagerRoot","VirtualizedListPagerLabel","VirtualizedListClassicPager","VirtualizedListPager","floor","AttributeDropdown","getAttributeLabelFromId","filteredOptions","IGNORE","nodeName","dateParser","SharedResources","getUser","resourceName","modeFilters","getPageDTO","fetchForUser","userId","silent","sortableFields","PagerModel","sorter","SorterModel","sharedResource","isFavorite","hasModeFilter","isFiltered","selectedMode","matchesFilters","getTitle","allows","resetModeFilter","firstPage","setModeFilter","ContentsType","useMetadataLookupsAllowed","disableLookups","setLookupsAllowed","setEmpty","targetId","DragResizeHandleRoot","ellipsis","DragResizeHandleEllipsis","DragResizeHandle","getDirectionAsNumber","maxSize","userPrefSize","setUserPrefSize","currentSize","setCurrentSize","isDraggingRef","initialSizeRef","lastSizeRef","pointerStartRef","lastMouseDownRef","limitSize","draggedOnce","maxSizeRef","minSizeRef","sizeDirection","axis","X","Y","getAxisFromDirection","axisRef","timeout","recheck","setRecheck","requestAnimationFrame","overflowEl","clientSize","scrollSize","newSize","limitToSize","documentElement","initialSize","startPosition","parentElement","USER_LEVEL_LABEL","BROWSER","NO_ACCESS","USER_GROUP_ITEM_TYPE_LABEL","UserGroupItemType","GROUP","USER_SELECTOR_LABEL","SELECT_GROUPS","SELECT_USERS","SELECT_GROUPS_USERS","ALL","CUSTOM_THUMBNAIL_ACTION_LABELS","PRESENT_STATUSES","NEARLINE","ONLINE","TEMP","assetIsPresent","useCartBarActions","includeAll","setActions","customActionMenus","useCustomActionMenus","customActionMenusRef","getActions","enableTest","customAction","faBolt","executeCustomAction","actionsToOrderedActions","AttributeSets","sets","setsLoaded","SortableAttributeSet","stickySentinel","stickySentinel_top","stickySentinel_bottom","dragHandle","titleText","stuck","searchable","disableSort","useSortable","stickyTargetRef","sentinelTopRef","sentinelBottomRef","setStuck","CSS","Translate","bottomStuckRef","topStuckRef","stickyChange","getScrollparent","footerObserver","targetInfo","rootBoundsInfo","rootBounds","headerObserver","isSorting","setNodeRef","listeners","SortableAttributeSets","flexWrap","flexFlow","itemWrapper","hasMultipleItems","list","dragOverlay","layout","orderUpdated","activeId","setActiveId","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","coordinateGetter","sortableKeyboardCoordinates","TouchSensor","handleDragEnd","over","handleDragStart","autoScroll","collisionDetection","closestCenter","onDragCancel","onDragEnd","onDragStart","strategy","verticalListSortingStrategy","rectSortingStrategy","REPURPOSE_ACTION_LABELS","CART_ASSET_ACTION_LABELS","ADD_TO_CART","REMOVE_FROM_CART","ASSET_RESYNC_ACTION_LABELS","canResyncAsset","ASSET_RESYNC_MINIMUM_USER_LEVEL","PermissionMatrixName","MODIFY","base64","ieee754","kMaxLength","Buffer","TYPED_ARRAY_SUPPORT","createBuffer","that","RangeError","Uint8Array","__proto__","encodingOrOffset","allocUnsafe","TypeError","ArrayBuffer","array","byteOffset","byteLength","fromArrayLike","fromArrayBuffer","string","encoding","isEncoding","actual","fromString","obj","isBuffer","len","copy","buffer","fromObject","assertSize","isView","loweredCase","utf8ToBytes","base64ToBytes","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","m","bidirectionalIndexOf","dir","arrayIndexOf","lastIndexOf","indexSize","arrLength","valLength","String","buf","readUInt16BE","foundIndex","found","j","hexWrite","remaining","strLen","parsed","utf8Write","blitBuffer","asciiWrite","byteArray","asciiToBytes","latin1Write","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","fromByteArray","res","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","decodeCodePointsArray","exports","SlowBuffer","alloc","INSPECT_MAX_BYTES","foo","subarray","typedArraySupport","poolSize","_augment","Symbol","species","configurable","allocUnsafeSlow","_isBuffer","pos","swap16","swap32","swap64","equals","inspect","thisStart","thisEnd","thisCopy","targetCopy","isFinite","toJSON","_arr","ret","out","toHex","checkOffset","ext","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","INVALID_BASE64_RE","leadSurrogate","toByteArray","stringtrim","base64clean","dst","ReactView","preRender","removing","rendered","postRender","resolveWith","renderedOnce","unmountComponentAtNode","getUserGroupAutoList","uid","UserGroupAutoListInner","filterUsersOrGroups","UserGroupAutoList","USER_SELECTOR_LIST_ITEM_CLASS_NAME","getUserSelectorListItemUtilityClass","userSelectorListItemClasses","UserSelectorListItemRoot","UserSelectorListItemActions","UserSelectorListItem","hideSubtitle","ListItemSecondaryAction","UserSelectorListItemsRoot","UserSelectorListFallbackMessage","UserSelectorListItemsWrapper","List","UserSelectorListItemsItemWrapper","UserSelectorListItems","disableNone","scrollRef","rowVirtualizer","useVirtualizer","getScrollElement","estimateSize","overscan","measure","totalSize","getTotalSize","getVirtualItems","virtualItem","USER_SELECTOR_CLASS_NAME","getUserSelectorUtilityClass","UserSelectorRoot","UserSelectorHeader","lbvToUserGroupItem","lvb","getGroupIdsFromUserSelector","getUserIdsFromUserSelector","addToSelector","userGroupItem","allWereSelected","groupLabel","userLabel","UserSelector","disableGroupSelection","disableUserSelection","commonAutoListProps","userIds","groupIds","usersOrGroups","removeFromSelector","assetIsInCart","canAddAssetToCart","canRemoveAssetFromCart","AttributeSkeletonComponent","textFieldHeight","textFieldSize","getTextFieldHeight","actionSize","preDecorate","postDecorate","inputWidthSubtraction","skeletonItem","preDecorator","readOnlyText","readOnlyTextTitle","readOnlyTextValue","inputArea","postDecorator","AttributeSkeleton","rounded","withTheme","getFormattedValue","formattedValue","formatters","href","rel","formatURLS","ReadOnlyAttributeComponent","ReadOnlyAttribute","singleFieldMultipleFieldsSelected","singleFieldNoFieldsSelected","cartRef","setCart","queued","updateTimeout","AttributeSetSelectorRoot","groupBy","SetSelector","allowCustom","systemLabel","getSetOptionsInOrder","tagProps","ourValue","allSavedCarts","SavedCartsCollection","favoriteSavedCarts","pagesToDisplay","REPURPOSE_ACTION_ICON","REPURPOSE_BASE_EVENT","REPURPOSE_EVENT","REPURPOSE_ASSET","REPURPOSE_SELECTION","REPURPOSE_AUDIO","REPURPOSE_IMAGE","materialCheckboxes","cleanUp","invoke","purgeEls","getExcludedViews","whenShown","checkboxEl","checkbox","MDCCheckbox","formField","MDCFormField","useAssetCustomThumbnail","isUploading","setIsUploading","isSaving","setIsSaving","cacheBuster","setCachBuster","customThumb","percent","useAssetTasks","taskStatus","setTaskStatus","tasksActive","setTasksActive","taskProgress","setTaskProgress","ASSET_IMAGE_WORKING_CLASS_NAME","getAssetImageWorkingUtilityClass","AssetImageWorkingRoot","AssetImageWorkingProgress","AssetImageWorkingPrimary","AssetImageWorkingInner","AssetImageWorkingPrimitive","AssetImageWorking","getAssetImageUtilityClass","assetImageClasses","AssetImageRoot","landscape","portrait","hideShadow","customIcon","AssetImageImg","objectFit","WebkitTouchCallout","AssetImageProgress","AssetImageWrapper","AssetImageWatermark","AssetImageCustomIcon","alignContent","AssetImageSkeleton","AssetImagePrimitive","disableFade","forceImageSize","hideTasks","disableLoader","watermarkImageLoader","showWatermark","setShowWatermark","customThumbnail","containerDims","setContainerDims","imageSize","setImageSize","SIZE_TYPE","PREVIEW","imageDims","setImageDims","orientation","setOrentation","ORIENTATION","PORTRAIT","imageWrapper","appendToSrc","getURLQueryFromObject","defaultIcon","imageLoading","reloadImage","sources","assetEndpoint","closestSize","getClosestSize","assetSize","sized","getSizedDims","LANDSCAPE","Fade","in","draggable","alt","unmountOnExit","mountOnEnter","AssetImage","hasMaxItems","lastId","maxItems","limitItems","fromIndex","toIndex","ActionsContext","ItemsManagerServiceContext","useItemManagerActions","useItemManagerStore","getNewItemValues","getNewItemsValues","currentObject","ItemManagerServiceProvider","addMultiple","reorder","setMaxItems","addItem","addItems","removeItem","resetItems","getItems","orderedValues","pieces","getItemMatchRegExp","getItemErrors","itemErrors","regex","getItemValues","itemValues","getItemActions","itemActions","ItemManagerWrapper","ScrollShadow","ItemManager","fallback","onRemoveClick","ItemComponent","ItemComponentProps","setIsSorting","handleBeforeSortStart","handleRemoveClick","hasItems","sortInProgress","ItemManagerItem","hideRemove","getSearchFilterEndAdornmentClassesUtilityClass","searchFilterEndAdornmentClasses","SearchFilterEndAdornmentRoot","SearchFilterEndAdornment","getSearchFilterStartAdornmentClassesUtilityClass","searchFilterStartAdornmentClasses","SearchFilterStartAdornmentRoot","SearchFilterStartAdornment","SearchFilterRoot","hideStartAdornment","searchFilterClasses","onFilteredChange","SearchFilterEndAdornmentProps","SearchFilterStartAdornmentProps","getSearchFilterUtilityClass","innerInputRef","handleClear","startAdornment","useMetadataLookups","setAttributesWorking","lookupResults","FileFormatType","FileSizeType","FileSizeMetric","UserType","faImage","CUSTOM_THUMBNAIL_ACTION_ICON","CUSTOM_THUMBNAIL_BASE_EVENT","CUSTOM_THUMBNAIL_EVENT","assetHasAudio","assetHasVideo","ASSET_PROJECT_ACTION_ICON","PROJECT","ADD_TO_PROJECT","CREATE_PROJECT","ASSET_PROJECT_BASE_EVENT","ASSET_PROJECT_EVENT","Sort","grid","toggleSort","cellEnter","cellExit","onmouseleave","canvasMouseOut","unsort","getRowIndex","getValueByField","oldGetValue","getValue","oldSaveValue","getRow","$$CLASS_NAME","columnIndex","columnHoverIndex","ascendingComparator","colProps","lastHover","lastColumnHoverIndex","columnRightIcon","isHeaderCell","descendingComparator","setSort","clearSelections","selectionChanged","uninstall","iconOpts","faCalendarMinus","faCalendarPlus","ASSET_EXPIRATION_ACTION_ICON","BASE_EVENT","ASSET_EXPIRATION_EVENT","MINIMUM_USER_LEVEL","ASSET_DELETE_ACTION_ICON","ASSET_DELETE_BASE_EVENT","ASSET_DELETE_EVENT","SUCCESS","ASSET_DELETE_CONFIRMATIONS","ASSET_DELETE_ACTION_LABELS","faRedoAlt","ASSET_RESYNC_ACTION_ICON","ASSET_RESYNC_BASE_EVENT","ASSET_RESYNC_EVENT","SEARCH_VISUAL_ACTION_ICON","ASSET","COLOR","SEARCH_VISUAL_BASE_EVENT","SEARCH_VISUAL_EVENT","createCategoryIdRule","categoryIdRuleDefaults","createKeywordRule","includeContents","keyword","keywordRuleDefaults","attributesStore","_updateFromGlobal","systemAttributes","computed","updateFromGlobal","userAttributes","deep","runInAction","getAttributeById","getAttributeByName","getAttributesByIds","AssetExpirationFormRoot","AssetExpirationForm","local","AssetExpiration","AssetExpirationContext","expire","expireWithDate","expireWithMilliseconds","unexpire","subscribe","useAssetExpirationProvider","AssetExpirationProvider","ASSET_EXPIRATION_BADGE_CLASS_NAME","AssetExpirationBadge","multi_select","semtantic","getMetadataTypeLabel","MetadataTypeLabel","getMetadataTypeOptions","MATCH_ANY_RANGE","metadataNameHackIn","metadataNameHackOut","canManageAssetProject","ASSET_PROJECT_ACTION_LABELS","CategorizeAssetsAction","CategoryOrder","CategoryPref","TOKEN_ACCESS_TYPES","ASSET_SET","CATEGORY","SAVED_CART","TOKEN_SECURITY_TYPES","NONE","PASSWORD","TOKEN_TYPES","VIEW_ONLY","TOKEN_DOWNLOAD_OPTION_TYPES","ASSET_VIEW","CONTACT_SHEET","HISTORICAL","MANUAL_REPURPOSE","ORIGINAL","PRESET_PROCESS","PROXY","TOKEN_ASSET_DOWNLOAD_OPTION_TYPES","SavedCart","xhrTrackProgress","addFacetedSearchToCart","searchFacets","selectedValues","filterMode","archiveCartAssets","download","duplicateCart","cartName","expireCartAssets","fetchBean","unarchiveCartAssets","newCount","contentCount","sharedResourceRoute","archiveArgs","locationId","assetsArg","expirationArgs","unarchiveArgs","email","addCurrentCart","AssetSearchRulesCollection","archive","CartAssetsCollection","expireAssets","getAssetIds","getCartAssets","cartAssets","getRoute","fullUrl","location","customConfig","ROUTE_SAVED_CART","rename","savedCart","getLabel","unarchive","unexpireAssets","sc","faInboxOut","CART_ASSET_ACTION_ICON","CART_ASSET_BASE_EVENT","CART_ASSET_EVENT","ASSET_SHARE_ICON","ASSET_SHARE_BASE_EVENT","ASSET_SHARE_EVENT","createCartRule","cartRuleDefaults","canRepurposeAsset","supportedFileFormatFamily","supportedViewName","NumberField","counter","$0","getNumberWithoutDuplicateDecimals","imageLoader","logoUrl","themeLogo","logoDark","logoLight","createStyled","getIndexedResults","extraParams","stackData","getNextPageParam","getAssetBean","_setPrototypeOf","o","p","module","setPrototypeOf","__esModule","ONLY","SearchValueUnavailableLabel","MATCH_ALL_FRAGMENTS","createMetadataRule","metadataRuleDefaults","rangeStart","rangeEnd","encodeBase64Rules","criteria","encodeURIComponent","searchCriteriaToSmallSALO","faPlus","faPencilAlt","faSyncAlt","CUSTOM_ACTION_EVENT","UPDATED","CUSTOM_ACTION_LIST_PAGE_SIZE","CustomActionField","CUSTOM_ACTIONS_SORTABLE_FIELDS","CustomActionPayloadType","CustomActionContextName","CUSTOM_ACTION_DEFAULTS","PAYLOAD_URL","TARGET_URL","USER_SELECTOR","userSelectorId","CUSTOM_ACTION_COLUMN_LABEL","CONTEXT_NAME","ID","CUSTOM_ACTION_ACTION_LABEL","ADD","CREATE","DONE","REGENERATE_SECRET","CUSTOM_ACTION_TITLE","CREATE_CUSTOM_ACTION","CONFIRM_REGENERATE","CONFIRM_DELETE","CUSTOM_ACTION","CUSTOM_ACTIONS","EDIT_CUSTOM_ACTION","CUSTOM_ACTION_LABEL","ANY","ACCESS","DISABLED","NAME_HELP","PAYLOAD_URL_HELP","SECRET","TARGET_URL_HELP","TEST_ENDPOINT_URL","TOTAL","CUSTOM_ACTION_MESSAGE","CHECKING_ENDPOINT","ENDPOINT_ACCESSIBLE","ENDPOINT_INACCESSIBLE","NO_MATCHING_RECORDS","NO_RECORDS","PERFORMING_ACTION","SECRETE_MESSAGE","SUCCEEDED","CLIPBOARD_TEXT_FIELD_ACTION_LABEL","COPY","CLIPBOARD_TEXT_FIELD_MESSAGE","ClipboardTextField","copyErrorMessage","copySuccessMessage","onCopy","faClipboard","URL_TEXT_FIELD_ACTION_LABEL","TEST","URL_TEXT_FIELD_LABEL","URL_TEXT_FIELD_MESSAGES","TESTING","ACCESSIBLE","INACCESSIBLE","URL_TEXT_FIELD_CLASS_NAME","getURLTextFieldUtilityClass","URLTextFieldRoot","URLTextFieldInputAddon","URLTextFieldStatus","urlRegex","validateURL","URLTextField","testButtonLabel","testingURL","testingUrlMessage","urlAccessible","urlAccessibleMessage","urlInaccessibleMessage","onTestURL","InputAdornment","disablePointerEvents","checking","CustomActionEndpoint","customActionId","deleteCustomAction","getCustomActionMenuEndpoint","getCustomActionMenu","getCustomActionsDefaultFilters","isEnabled","payloadUrl","targetUrl","GET_CUSTOM_ACTIONS_DEFAULT_SORT_FIELD","GET_CUSTOM_ACTIONS_DEFAULT_SORT_ORDER","getCustomActionsDefaultSort","getWebooksSortField","getWebooksSortOrder","getCustomActionsEndpoint","getCustomActions","isCustomActionEndpointUrlAccessibleEndpoint","isCustomActionEndpointUrlAccessible","resetCustomActionSecret","setCustomAction","rest","restUserSelector","enforceHttpsUrlString","triggerCustomAction","useReactQueryDeleteCustomAction","mutationFn","useReactQueryGetCustomActionMenu","queryKeyParams","GetCustomActionsReactQueryKey","useReactQueryGetCustomActions","useInfiniteQuery","useReactQueryIsCustomActionEndpointUrlAccessible","useReactQuerySetCustomAction","useIsCustomActionEndpointUrlAccessible","refetchOnMount","isError","fetchStatus","check","CustomActionEndpointPayloadUrlRoot","CustomActionEndpointPayloadUrl","CustomActionEndpointTargetUrlRoot","CustomActionEndpointTargetUrl","CUSTOM_ACTION_CREATED_CLASS_NAME","getCustomActionCreatedUtilityClass","CustomActionCreatedRoot","CustomActionCreatedActions","CustomActionCreatedAlert","CustomActionCreatedInputWrapper","CustomActionCreatedContentWrapper","CustomActionCreated","secret","CustomActionCreatedDialogRoot","CustomActionCreatedDialogActions","CustomActionCreatedSubmitButton","CustomActionCreatedDialog","CUSTOM_ACTION_EDIT_ACCESS_CLASS_NAME","getCustomActionEditAccessUtilityClass","CustomActionEditAccessRoot","CustomActionEditAccessUserSelector","CustomActionEditAccessLabel","CustomActionEditAccess","_userSelector","CustomActionFormRoot","CustomActionFormHeader","CustomActionFormContent","CustomActionInputWrapper","CustomActionEdit","unregisters","FormControlLabel","control","Checkbox","CustomActionEditDialogRoot","CustomActionEditDialog","CustomActionEditDialogNiceModal","CustomActionCreatedDialogNiceModal","CustomActionsContext","CustomActionsProviderInner","customActions","useCustomActions","resetSecret","show","fullCustomAction","contextValues","useCustomActionActions","CustomActionBlockingDialogActions","CustomActionBlockingDialog","blocking","errorMessage","successMessage","userCustomAction","CustomActionBlockingDialogNiceModal","payload","CURRENT_SELECTION","eventId","spawnNewWindow","appendQueryObjectToURL","setDataReady","setFilters","setQueryParams","debouncedQueryParams","useDebounce","keepPreviousData","queryUtils","editMutation","textFields","caseInsensitiveStringIncludes","deleteMutation","mutate","contextName","dataUpdatedAt","truncateAt","baseParser","assetExpirationToDateString","parser","noLocale","useGrouping","maximumFractionDigits","minimumFractionDigits","ReadOnlyChips","getLabels","ReadOnlyMultiSelectField","FormLabel","ReadOnlySelectField","AttributeSetsContainer","VirtualizedListArrowTabTrapProvider","virtualizedListArrowTabTrap","GenericCellPrimitive","GenericCell","ReferenceError","canAddCategory","category","recursivePermission","canEditCategory","canImportToCategory","searchTypes","latestDocuments","latestImages","latestUploads","latestVideos","mostViewed","AppGalleryHeaderView","events","headerTitle","i18nCountStr","loadingClassObjects","requireSync","collectionList","isCollection","listenToCollection","getHeaderTitle","$sort","$title","$breadcrumb","last","$slider","userSortView","removeSubView","addSubView","UserSortView","bindCollectionEvents","updateTitle","updateCount","searchRule","selectedFacets","unbindCollectionEvents","__isCollection__","sliding","sliderMin","sliderMax","initializeIcons","faHome","faSlidersH","updateActionsMenu","$actions","enableIf","CategoryTreeNodeView","childView","viewClass","ChildView","lazyLoad","tree","dragend","dragstart","loitering","uniqueId","loadingClassRemoveDelay","tagName","Template","checkActive","newParentId","bindModelEvents","debouncedRender","makeActive","setOpenClasses","depth","toggleClass","templateVars","categoryId","subCategories","TREE_MAX_DEPTH","disabledCategories","ACTIVE_CLASS","dragEnd","dragStart","stopImmediatePropagation","ui","returnToTopLevel","opened","triggerState","isTrigger","upLevel","$target","first","ChildViews","faAngleRight","faArrowsAlt","faCaretRight","treeMaxDepth","categoryConfig","CoreView","hasKids","isFirstNode","parent","menuItem","is","$folder","prev","$menuitem","AppGalleryView","views","assetCustomConfig","LIST_TYPE","viewSpec","_model","headerView","setModel","Views","viewInstance","parentNode","replaceChild","toggleFacets","toggleFacetsOff","toggleFacetsOn","ATTRIBUTE_CONTEXT_LABELS","ATTRIBUTE_CONTEXT","DETAIL","SORT","DEFAULT_SEARCH_PLACEHOLDER","ConfirmationDialog","disableCancel","withQueryClient","canvas","CustomEvent","SavedCarts","getSharedResources","getAllCarts","getUserCarts","fetchBeans","fetchBeansForUser","Model","currentCart","addAssets","getCarts","savedCarts","addSearch","createNewCarts","carts","newCarts","getCart","idAttribute","getEditableCarts","canEdit","hasEditableCarts","factory","__WEBPACK_EXTERNAL_MODULE_2__","__WEBPACK_EXTERNAL_MODULE_13__","modules","installedModules","__webpack_require__","moduleId","_ScrollSync","enumerable","_interopRequireDefault","_ScrollSyncPane","_createClass","defineProperties","descriptor","Constructor","protoProps","staticProps","_react","_react2","_propTypes2","_classCallCheck","_possibleConstructorReturn","ScrollSync","_Component","_ref","_temp","_this","_len","_key","getPrototypeOf","panes","registerPane","findPane","syncScrollPosition","addEvents","unregisterPane","removeEvents","onscroll","handlePaneScroll","pane","syncScrollPositions","scrolledPane","onSync","subClass","superClass","_inherits","scrollWidth","scrollTopOffset","scrollLeftOffset","_props","proportional","paneHeight","paneWidth","only","propTypes","func","isRequired","bool","childContextTypes","env","NODE_ENV","REACT_ELEMENT_TYPE","for","object","$$typeof","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","run","marker","runClearTimeout","Item","nextTick","browser","argv","version","versions","addListener","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","cwd","chdir","umask","emptyFunction","invariant","warning","ReactPropTypesSecret","checkPropTypes","throwOnDirectAccess","ITERATOR_SYMBOL","iterator","ANONYMOUS","ReactPropTypes","createPrimitiveTypeChecker","symbol","any","createChainableTypeChecker","thatReturnsNull","arrayOf","typeChecker","propName","componentName","propFullName","PropTypeError","propValue","getPropType","instanceOf","expectedClass","expectedClassName","isNode","objectOf","propType","oneOf","expectedValues","oneOfType","arrayOfTypeCheckers","checker","getPostfixForTypeWarning","shape","shapeTypes","stack","manualPropTypeCallCache","manualPropTypeWarningCount","checkType","cacheKey","chainedCheckType","expectedType","getPreciseType","every","iteratorFn","maybeIterable","getIteratorFn","step","done","isSymbol","PropTypes","makeEmptyFunction","thatReturns","thatReturnsFalse","thatReturnsTrue","thatReturnsThis","thatReturnsArgument","validateFormat","condition","argIndex","framesToPop","printWarning","_len2","_key2","loggedTypeFailures","typeSpecs","getStack","typeSpecName","shim","getShim","_reactDom2","ScrollSyncPane","attachTo","findDOMNode","prevProps","contextTypes","decodeBase64Rules","base64str","decodeURIComponent","getSearchCriteriaFromSmallSALO","convertRulesToCollection","conditions","___EXPOSE_LOADER_IMPORT___","___EXPOSE_LOADER_GLOBAL_THIS___","AssetAttributeSets_","attributeSetsChanged","allAttributeIds","deleteAttributeSets","deleteMultiple","selectableSets","forEditing","intersection","AssetAttributeSet_System","triggerIds","triggerType","collectionid","attributeIdsUpdated","parseAndSave","isNew","populateAttributes","AssetAttributeSets_System","getIds","getObjects","collectionIds","AssetAttributeSets_User","AssetAttributeSets_Filter","getAttributesIdsForContext","attrIds","hasUpdatedAttributesSystem","goo","DEFAULT_ATTRIBUTE_IDS","settingsDataToBrandPortal","AssetAttributeSets","localeCompare","fetchSets","systemSets","userSets","PORTAL_ATTRIBUTE_CONTEXT","portalContextAttrIds","PORTAL_ATTRIBUTE_CONTEXT_LABELS","_attributeNames","_attributeIds","mandatoryAttrs","getMandatoryAttributes","hasMandatoryAttributes","attributesChanged","SystemAssetAttributeSetsCollection","UserAssetAttributeSetsCollection","FilterAttributeSetCollection","GetDefaults","pick","updateMandatory","defaultKeys","getGenericAttributes","isModel","getMandatoryAttributeNames","withoutDefaultValues","withoutSystem","getMandatory","toggleRowSelected","rowId","toggleAllRowsSelected","rowsSelected","rowsDeselected","isSelected","setColumnWidth","setViewportWidth","setHasOverflown","addUpArray","num","keepWidthInBounds","refitColumns","increaseOnly","dirtyColumns","frozenLeadingColumnCount","frozenTrailingColumnCount","originalColumnWidths","columnWidths","trueColumnWidths","totalColumnWidths","diff","spaceUsed","columnWidth","columnsOverflown","maxColumnWidth","minColumnWidth","rowHeight","totalColumnsWidth","totalLeadingFrozenColumnsWidth","totalTrailingFrozenColumnsWidth","totalNonFixedColumnsWidth","columnSortTypes","columnTypes","columnPositions","columnsVisible","columnsFrozen","columnsFrozenLeading","columnsFrozenTrailing","frozenLeadingColumnPositions","frozenTrailingColumnPositions","getColumnTotals","newReturn","columnsLastFrozenLeading","columnsFirstFrozenTrailing","columnTotals","_columnsWidths","_dirtyColumns","widths","sortType","columnType","scrollLeftRef","csvToArray","restrictToVerticalAxis","VirtualizedTableBodyOuterElement","VirtualizedTableBodyPrimitive","arrowFocusTrapRef","disableFocus","onRowKeyDown","_arrowFocusTrapRef","InnerElement","ArrowFocusTrap","getRowFromData","original","visibleEndIndex","VirtualizedTableRowWrapper","VirtualizedTableBody","DraggableTableRowPrimitive","dragStyle","VirtualizedTableRow","sortActive","DraggableTableRow","VirtualizedSortableTableBodyPrimitive","onDraggingChange","findIndex","ArrowFocusTrapAction","handleDragCancel","toTheLeft","activeItem","canScroll","dropAnimation","dataIndex","prepareRow","isClone","VirtualizedSortableTableBody","getVirtualizedLoadingTableRowCellClass","virtualizedLoadingTableRowCellClasses","VirtualizedLoadingTableRowCellRoot","frozenLeadingColumn","frozenTrailingColumn","lastFrozenLeadingColumn","firstFrozenTrailingColumn","alphanumeric","numeric","thumbnail","checkboxWithLabel","generic","VirtualizedLoadingTableRowCell","firstFrozenTrailing","frozen","frozenLeading","frozenTrailing","lastFrozenLeading","animation","getVirtualizedLoadingTableRowClass","virtualizedLoadingTableRowClasses","VirtualizedLoadingTableRowRoot","WebkitTransform","WebkitPerspective","WebkitBackfaceVisibility","VirtualizedLoadingTableRowInner","visibleColumnIndexes","VirtualizedLoadingTableRowCellProps","VirtualizedLoadingTableRowPrimitive","VirtualizedLoadingTableRow","VirtualizedTableRowWrapperInner","getRowProps","startIndexFromPage","activeRow","tableRowSelectionProvider","VirtualizedTableRowWrapperPrimitive","getVirtualizedTableHeaderUtilityClass","getVirtualizedTableVerticalScrollSpacerUtilityClass","VirtualizedTableVerticalScrollSpacerRoot","VirtualizedTableVerticalScrollSpacerPrimitive","VirtualizedTableVerticalScrollSpacer","VirtualizedTableHeaderRoot","overflowY","VirtualizedTableHeaderWrapper","moveFocus","currentFocus","traversalFunction","wrappedOnce","nextFocus","firstChild","nextFocusDisabled","hasAttribute","inline","nextElementSibling","previousItem","previousElementSibling","VirtualizedTableHeaderInner","onColumnClick","TableHeaderCellProps","columnsWrapperRef","unstable_ownerDocument","firstActiveIndex","interactive","scroll","handleColumnClick","handleColumnFocusCapture","onTouchMove","VirtualizedTableHeaderCell","onKeyDownCapture","VirtualizedTableHeaderPrimitive","VirtualizedTableHeader","getVirtualizedTableClass","VirtualizedTableRoot","VirtualizedSortableTablePrimitive","disableTabIndex","onRowContextMenu","TableHeaderProps","useTable","handleSync","relativeLeft","nextLeft","relativeRight","VirtualizedSortableTable","VirtualizedTablePrimitive","defaultSortOrder","VirtualizedTable","Backgrid","Extension","ClientSideFilter","matcher","makeMatcher","col","pageableCollection","getFirstPage","shadowCollection","filtering","reindex","prepareTable","initializeBackgrid","Row","Grid","initialize","mv","me","rowAdded","serverSideSort","renderOnChange","renderableChange","attrName","renderTable","isBoolean","tableClassName","$deleteBtn","gridFilter","replaceWith","$gridFilter","gridFilters","$targets","prop","selectChanged","Find","getRowViewById","matrix","isNumber","userLevel","performAction","clearFilters","cleanUpTable","getRowById","getRowIdByElement","$idElement","rowClicked","tr","ControlCell","CellEditor","configureSyncActions","HeaderCell","contextmenu","findContextMenu","insertContextMenu","Cell","backgridSelectFilter","SelectFilter","delegateEvents","checkHasResults","removeAttribute","trueCollectionLength","defineColumns","without","faEllipsisV","faEquals","UIComponents","selectpicker","plugins","$selectEl","styleBase","doneButtonText","liveSearch","noneSelectedText","noneResultsText","caret","callByNeed","oldCaret","innerHTML","HandleCell","OriginalControlCellRender","__initializers__","omitRender","nxActions","formatter","fromRaw","enabledActions","getEnabledActions","initializeActions","renderActions","functionalityName","__functionality__","MaterialMenus","AssetAttributeSet_User","clientAttrs","saveAttributeFieldSet","AttributesCollection","getAttributes","getAttributeCount","withDefaultValue","unique","msgData","totalPoints","Uint16Array","searchOnly","defaultRowHeight","font","foregroundSelectionColor","foregroundSelectionFont","selectionRegionOverlayColor","selectionRegionOutlineColor","hoverCellHighlight","filterable","gridBorderRight","renderFalsy","multipleSelections","columnAutosizing","hoverColumnHighlight","columnHeaderBackgroundColor","columnHeaderColor","columnHeaderBackgroundSelectionColor","columnHeaderForegroundSelectionColor","columnHeaderForegroundSelectionFont","columnHeaderBackgroundColumnSelectionColor","columnHeaderForegroundColumnSelectionColor","minimumColumnWidth","rowResize","checkboxOnlyRowSelections","subgrid","showFilterRow","singleRowSelectionMode","rowHeaderColor","rowHeaderBackgroundColor","rowHeaderBackgroundSelectionColor","rowHeaderForegroundSelectionColor","rowHeaderForegroundSelectionFont","hoverRowHighlight","rowHeaderBackgroundRowSelectionColor","rowHeaderForegroundRowSelectionColor","lineColor","THUMB","ZOOM","PROXY_MAX_LENGTH","preview","zoom","isPortrait","getFittedDims","newHeight","newWidth","getDims","newDims","getThumbDims","getPreviewDims","getZoomDims","CART_SAVED_ACTION_ICON","faCopy","RENAME","faICursor","REMOVE_ASSET","faMinusCircle","REMOVE_SELECTED_ASSETS","CART_SAVED_BASE_EVENT","CART_SAVED_EVENT","subscribers","delete","publish","isOnline","useOnlineStatus","setIsOnline","onLine","PDF_VIEWER_ACTION_ICON","EXPORT_PAGES","faDownload","PDF_VIEWER_BASE_EVENT","PDF_VIEWER_EVENT","VIEW","CategoryTreeNodesView","categoriesCanReorder","faAngleLeft","categoryChanged","catModel","Modernizr","touch","innerWidth","NS","curCat","parentCat","isTopLevel","isOneDeepChildless","navHeight","COLUMN_WIDTHS","setWidths","setColumnProperties","_getWidth","getActiveColumn","gridProperties","getWidth","defaultColumnWidth","_setWidth","_setWidths","_updateSchema","getColumnWidth","CategoryIdTypeLabel","EXCLUDE_RECURSIVE","ONLY_RECURSIVE","rawCategoryIdCriteriaToRuleObject","subtype1","CategoryIdRuleModel","validation","validateCatrgoryIdRule","setElementSubType1","setElementValue1","autorun","setElementSubType2","setElementValue2","setElementValue3","KeywordTypeLabel","MATCH_ANY_FRAGMENT","MATCH_EXACTLY_INCLUDING_DIACRITICAL_MARKS","MATCH_EXCLUDE","MATCH_ALL_WHOLE_WORDS_AND","MATCH_ANY_WHOLE_WORDS_OR","rawKeywordCriteriaToRuleObject","KeywordRuleModel","validateKeywordRule","rawMetadataCriteriaToRuleObject","value3","MetadataRuleModel","validateMetadataRule","reaction","ruleObjectBase","stringIsDate","hasElementValue1","hasElementValue2","hasElementValue3","compareStartValue","getTime","compareEndValue","rawCartCriteriaToRuleObject","savedCartIsNotEmpty","savedCartIsEmpty","canCreatePdfFromSavedCart","canCreateTMSObjectPackageFromSavedCart","canDownloadSavedCart","canManageSavedCartArchive","canManageSavedCartExpiration","canReviewSavedCart","canShareSavedCart","canDeleteSavedCart","canManage","canDuplicateSavedCart","canRenameSavedCart","CART_SAVED_ACTION_LABELS","CartRuleModel","expirationRuleDefaults","RadioGroupContext","linkTypes","expirationTypes","permanent","securityTypes","password","referrer","strings","ARIA_CONTROLS","ICON_SELECTOR","INPUT_SELECTOR","LABEL_SELECTOR","LINE_RIPPLE_SELECTOR","OUTLINE_SELECTOR","cssClasses","DENSE","FOCUSED","FULLWIDTH","HELPER_LINE","INVALID","NO_LABEL","OUTLINED","ROOT","WITH_LEADING_ICON","WITH_TRAILING_ICON","numbers","DENSE_LABEL_SCALE","LABEL_SCALE","VALIDATION_ATTR_WHITELIST","ALWAYS_FLOAT_TYPES","SearchFacetOptionView","keydownToggle","keycode","tabindex","removeAttr","$currentTarget","$parentLi","$facet","parents","nextAll","prevAll","SearchFacetOptionsView","Update","$select","sel","SearchFacetView","checkSelection","searchFacetOptionsView","getSelected","unbindModelEvents","faCaretLeft","SearchFactOptionsListView","localStorageKey","toggleState","getIndex","toggleClickHandler","collapseBool","$elem","SearchFacetOptionsListView","SearchFacetSelectedView","$tooltip","SearchFacetsSelectedView","SearchFacetsView","searchFacetsSelected","chipRef","gridStore","MousePointerIcon","CaretDownIcon","MainHeader","onClone","onEdit","hasSelection","setSelection","counts","PencilIcon","CloneIcon","Editor","textDecoration","attributesWrapper","selector","hideSetSelector","BulkEditor","Append","AppendIcon","StyledBulkEditorComponent","BulkEditorComponent","BulkEditorDrawer","setWorking","attributeProvider","readOnlyValues","updatedValues","submitData","fieldAction","updateType","getSubmitData","updatedActions","editorAppend","setEditorAppend","dataActive","setDataActive","handleEntered","submit","appending","setAppending","setCanAppend","selectedField","canSubmit","multipleFieldsSelected","fieldLength","GridEditor","editorOpen","setEditorOpen","indeterminateProgress","handleClone","handleEditClick","handleInputLineSubmit","handleSideEditorSubmit","_Header","Header","_SideEditor","sideEditor","SideEditor","_SingleFieldEditor","SingleFieldEditor","DialogContentText","paddingBottom","closedActions","loadingOverlay","loadingContainer","useDragGlobalStyles","useStyles","getVirtualizedTableHeaderCellClass","virtualizedTableHeaderCellClasses","getVirtualizedTableHeaderCellSortIndicatorClass","virtualizedTableHeaderCellSortIndicatorClasses","VirtualizedTableHeaderCellSortIndicatorRoot","asc","VirtualizedTableHeaderCellSortIndicatorPrimitive","VirtualizedTableHeaderCellSortIndicator","getVirtualizedTableHeaderCellDraggerClass","virtualizedTableHeaderCellDraggerClasses","VirtualizedTableHeaderCellDraggerRoot","VirtualizedTableHeaderCellDraggerEllipsis","VirtualizedTableHeaderCellDraggerPrimitive","VirtualizedTableHeaderCellDragger","VirtualizedTableHeaderCellRoot","alignRight","VirtualizedTableHeaderCellLabel","pxToRem","VirtualizedTableHeaderCellPrimitive","cellWidthRef","xStartRef","headerLabel","noLabel","nonInteractive","getHeaderProps","ColumnComponent","disableDragResize","CATEGORY_ID_RULE_EDITOR_CLASS_NAME","getCategoryIdRuleEditorUtilityClass","CategoryIdRuleEditorRoot","CategoryIdRuleEditorPrimitive","onSubType1Change","onValue1Change","categoryName","setCategoryName","waitingForCategory","getCategoryIdTypeLabel","CategoryIdRuleEditor","CategoryIdRuleEditorGeneric","KEYWORD_RULE_EDITOR_CLASS_NAME","getKeywordRuleEditorUtilityClass","KeywordRuleEditorRoot","KeywordRuleEditorPrimitive","_elementSubType1Options","getKeywordTypeLabel","KeywordRuleEditor","KeywordRuleEditorGeneric","METADATA_RULE_EDITOR_CLASS_NAME","getMetadataRuleEditorUtilityClass","MetadataRuleEditorRoot","MetadataRuleEditorCriteria","MetadataRuleEditorValues","SEARCHABLE_SYSTEM_ATTRIBUTES","MetadataRuleEditorPrimitive","onValue2Change","onValue3Change","selectedAttribute","MetadataRuleEditor","MetadataRuleEditorGeneric","CART_RULE_EDITOR_CLASS_NAME","getCartRuleEditorUtilityClass","CartRuleEditorRoot","CartRuleEditorPrimitive","useSavedCarts","labels","CartRuleEditor","cellKeyboardNavigation","wasEditing","cs","lookupFeature","handleRIGHT","editor","moveSingleSelect","handleLEFT","offsetX","offsetY","getColumnCount","mouseCorner","getMouseDown","plus","getDragExtent","getRowCount","newX","newY","moveToSingleSelect","editAt","CellEvent","currentDeltaProp","resetCurrentDeltaTimeout","scrollBar","delta","fixScrollBar","bar","evt","deltaProp","_maxScrollX","_max","_maxScrollY","_bound","onwheel","rulesContainCart","searchRules","rulesContainCurrentCart","getVirtualizedTableRowCellUtilityClass","virtualizedTableRowCellClasses","VirtualizedTableRowCellRoot","frozenLeadingCell","frozenTrailingCell","VirtualizedTableRowCellPrimitive","cell","getCellProps","cellProps","VirtualizedTableRowCell","SearchRule_Clip","searchApi","searchTargetIsMetadata","SearchRules_clips","CHUNK_SIZE","userPrefKeys","initProperties","GenericIconCellPrimitive","GenericIconCell","CategoryAutoListInner","filterCategories","CategoryAutoListPrimitive","CategoryAutoList","canExportPages","canViewPDF","checkinErrors","ABCustomization","blocks","locked","PromptView","hideOnSubmit","modalOptions","removeOnHide","prompt","promptMessage","MaterialCheckboxes","AssetPermission","deleteAclEntry","setAclEntry","pastPosition","permissionLabel","principal","principalId","principalLabel","recursive","recursiveLabel","targetLabel","typeLabel","entryId","permissionTargetIds","permissionLabels","stripLabel","__t","__p","__j","print","SearchConstituents","setStartPosition","chunk","_startPosition","_maxItems","fetchMethod","fetchAssetConstituentCount","fetchingAssetConstituentCount","constituents","pop","lastChunk","constituentId","fullResults","PAGE_SIZE","ClipSearchRulesCollection","pagerRoutes","addSubModel","hasRouteContext","lastSearchRoute","origFetch","addChunk","AssetsCollection","assetConstituentCount","fetchingAssetCount","useFacetedSearch","AssetGalleryLayout","AssetGalleryPref","createExpirationRule","PublicLink","accessCode","accessCount","creationDate","expirationAccesses","expirationType","fileExtension","includeSubFolders","linkId","objectId","passwordLabel","recipientEmail","recipientNote","securityType","linkUrl","origin","escape","faSave","SEARCH_SAVED_BASE_EVENT","SEARCH_SAVED_EVENT","attributeHistorySearch","autocompletions","attributeHistory","canDeleteSavedSearch","getViewModel","getViewCollection","saved","canSaveSearch","assetIsImage","route","testOnSync","SearchAssetsCollection","findSearchModel","at","SearchConstituents_Clips","fetchingConstituentCount","basic","basicSearchStr","escapeURI","fetchSearch","typeStr","SearchAttributeHistoryRule","date1","date2","userName","getTemplate","toSALO","hasRules","attributeTypeIds","dataItem","SearchAttributeHistoryRules","SearchGalleryView","SearchConstituentsGalleryView","SearchConstituentsGalleryHeaderView","Backbone","history","getHash","unescapeURI","AssetConstituentView","AssetConstituentsView","dataAction","SearchConstituentsListItemView","faArrowDown","SearchConstituentsListView","AssetConstituentView_Clip","dataAlias","showProgress","hideProgress","getDuration","previewModUrl","prettyRange","getPrettyRange","thumbModUrl","progressMessage","$progress","$progressBar","$progressBarSr","$progressMessage","keyframeProgress","SearchConstituentsListItemView_Clip","whenImagesLoaded","SearchConstituentsListView_Clips","savedSearchRuleDefaults","createSavedSearchRule","getNormalizedMultivalue","convertRulesToRuleObjects","ruleObjects","getMatchingAttributeValues","_elementValue1","matchingAttributeValues","faPencil","SEARCH_RULES_BASE_EVENT","SEARCH_RULES_EVENT","EDIT_SEARCH","getUserSort","SortField","SortOrder","areSearchRulesSortable","getRuleAtIndex","advancedRawRuleDefaults","attributeHistoryRuleDefaults","checkoutsRuleDefaults","contentsRuleDefaults","dateRuleDefaults","fileAspectRuleDefaults","EQUAL_TO","fileFormatRuleDefaults","fileFormatFamilyRuleDefaults","fileSizeRuleDefaults","APPROXIMATELY","BYTES","userRuleDefaults","IMPORTED_BY","visualRuleDefaults","getRuleDefaults","validateAdvancedRawRule","AdvancedRawRuleModel","AttributeHistoryRuleModel","getUserLabel","validateCheckoutsRule","USER_ID","CheckoutsRuleModel","validateContentsRule","ContentsRuleModel","validateDate","validateDateRule","IN_BETWEEN","DateRuleModel","USER_DEFINED_ATTRIBUTE","ExpirationRuleModel","validateFileAspectRule","FileAspectRuleModel","prevElementSubType1","FileFormatRuleModel","fileTypes","FileFormatFamilyRuleModel","fileFormatFamilies","validateFileSizeRule","FileSizeRuleModel","SavedSearchRuleModel","validateUserRule","UserRuleModel","validateVisualRule","hex","isHexColor","VisualRuleModel","RuleModelMap","getRuleModel","createAdvancedRawRule","raw","rawAdvancedRawCriteriaToRuleObject","createAttributeHistoryRule","attributeValue","rawAttributeHistoryCriteriaToRuleObject","createCheckoutsRule","rawCheckoutsCriteriaToRuleObject","createContentsRule","contents","rawContentsCriteriaToRuleObject","createDateRule","subType","fromDate","toDate","rawDateCriteriaToRuleObject","subtype2","rawExpirationCriteriaToRuleObject","createFileAspectRule","rawFileAspectCriteriaToRuleObject","createFileFormatRule","rawFileFormatCriteriaToRuleObject","createFileFormatFamilyRule","rawFileFormatFamilyCriteriaToRuleObject","createFileSizeRule","fileSize","metric","rawFileSizeCriteriaToRuleObject","rawSavedSearchCriteriaToRuleObject","createUserRule","rawUserCriteriaToRuleObject","createVisualRule","rawVisualCriteriaToRuleObject","RuleObjectFromRawCriteriaMap","getRuleObjectFromRawCriteria","rawCriteria","savedSearchCriteriaToRuleObjects","addRuleObject","ruleObject","getMatchingAttributeSiblings","_item","matchingAttributeSiblings","SearchRulesProvider","SavedSearches","getSearchesForUser","savedSearch","savedSearches","allSavedSearches","SavedSearchesCollection","favoriteSavedSearches","savedSearchBean","useSavedSearches","savedSearchesSingleton","getSearch","useSavedSearch","extended","setSavedSearch","savedSearchData","bean","configure","enforceActions","SearchRulesStore","isSomeDataUnavailable","addRule","removeRule","reorderRuleByIndex","replaceRule","setMatchCriteria","getRules","ruleParams","_rule","oldRuleModel","newRule","newRuleModels","reorderRule","fromId","toId","old_index","new_index","newArr","array_move","useSearchRulesStore","savedSearchId","setStore","loadingSavedSearch","SearchRulesStoreContext","useSearchRulesStoreProvider","SearchRulesStoreProviderInner","searchRulesStore","SearchRulesStoreProvider","ADVANCED_RAW_RULE_EDITOR_CLASS_NAME","getAdvancedRawRuleEditorUtilityClass","AdvancedRawRuleEditorRoot","AdvancedRawRuleEditor","AdvancedRawRuleEditorGeneric","ATTRIBUTE_HISTORY_RULE_EDITOR_CLASS_NAME","getAttributeHistoryRuleEditorUtilityClass","AttributeHistoryRuleEditorRoot","AttributeHistoryRuleEditor","CheckoutTypeLabel","getCheckoutsTypeLabel","CHECKOUTS_RULE_EDITOR_CLASS_NAME","getCheckoutsRuleEditorUtilityClass","CheckoutsRuleEditorRoot","CheckoutsRuleEditor","setUserName","waitingForUserLabel","CheckoutsRuleEditorGeneric","ContentsTypeLabel","getContentsTypeLabel","CONTENTS_RULE_EDITOR_CLASS_NAME","getContentsRuleEditorUtilityClass","ContentsRuleEditorRoot","ContentsRuleEditor","ContentsRuleEditorGeneric","DateRuleTypeLabel","DateRuleSubTypeLabel","getDateSubTypeLabel","DATE_RULE_EDITOR_CLASS_NAME","getDateRuleEditorUtilityClass","DateRuleEditorRoot","DateRuleEditorCriteria","DateRuleEditorValues","DateRuleEditorPrimitive","onSubType2Change","attributeState","_elementSubType2Options","userDates","getSubType1OptionLabel","subType1","DateRuleEditor","DateRuleEditorGeneric","EXPIRATION_RULE_EDITOR_CLASS_NAME","getExpirationRuleEditorUtilityClass","ExpirationRuleEditorRoot","ExpirationRuleEditor","FileAspectTypeLabel","DURATION","FileAspectSubTypeLabel","GREATER_THAN","LESS_THAN","FileAspectOrientationValueLabel","getFileAspectSubTypeLabel","getFileAspectTypeLabel","getOrientationLabel","FILE_ASPECT_RULE_EDITOR_CLASS_NAME","getFileAspectRuleEditorUtilityClass","FileAspectRuleEditorRoot","FileAspectEditorCriteria","FileAspectEditorValues","ORIENTATION_OPTIONS","FileAspectRuleEditor","FileAspectRuleEditorGeneric","FileFormatTypeLabel","getFileFormatTypeLabel","FILE_FORMAT_RULE_EDITOR_CLASS_NAME","getFileFormatRuleEditorUtilityClass","FileFormatRuleEditorRoot","FileFormatRuleEditor","valueOptions","FileFormatRuleEditorGeneric","FILE_FORMAT_FAMILYRULE_EDITOR_CLASS_NAME","getFileFormatFamilyRuleEditorUtilityClass","FileFormatFamilyRuleEditorRoot","FileFormatFamilyRuleEditor","FileFormatFamilyRuleEditorGeneric","FileSizeTypeLabel","FileSizeSubTypeLabel","GBYTES","KBYTES","MBYTES","getFileSizeTypeLabel","getFileSizeSubTypeLabel","FILE_SIZE_RULE_EDITOR_CLASS_NAME","getFileSizeRuleEditorUtilityClass","FileSizeRuleEditorRoot","FileSizeEditorCriteria","FileSizeEditorValues","FileSizeRuleEditor","FileSizeRuleEditorGeneric","SAVED_SEARCH_RULE_EDITOR_CLASS_NAME","getSavedSearchRuleEditorUtilityClass","SavedSearchRuleEditorRoot","SavedSearchRuleEditor","UserTypeLabel","MODIFIED_BY","USER_RULE_EDITOR_CLASS_NAME","getUserRuleEditorUtilityClass","UserRuleEditorRoot","UserRuleEditor","UserRuleEditorGeneric","kt","B","xt","aspectRatio","Rt","bgColor","disablePopover","isBgColorValid","disableTouchRipple","Ht","Container","It","wt","Pt","Slider","ht","shouldForwardProp","Tt","rgbColor","L","Ft","ArrowLeft","ArrowRight","tt","et","rt","Space","boxSizing","Thumb","Vt","hsv","currentHue","Nt","S","I","A","getBoundingClientRect","Et","C","H","Bt","E","$t","Lt","Ot","Dt","abs","O","ct","D","R","nt","U","ot","startsWith","Kt","it","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","goldenrod","gold","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavenderblush","lavender","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellow","yellowgreen","qt","rgb","exec","rgba","hsl","hsla","hsva","hex8","hex6","hex4","hex3","Xt","_t","Gt","jt","ok","q","z","CSS_UNIT","M","Ut","originalInput","roundA","gradientType","isDark","getBrightness","isLight","toRgb","getLuminance","getAlpha","setAlpha","toHsv","toHsvString","toHsl","toHslString","toHexString","toHex8","Wt","toHex8String","toRgbString","toPercentageRgb","toPercentageRgbString","toName","toNumber","brighten","tint","mix","shade","desaturate","saturate","greyscale","spin","analogous","complement","monochromatic","splitcomplement","triad","polyad","tetrad","F","st","Jt","Zt","Qt","currentColor","isAlphaHidden","ft","K","mt","px","te","Mt","ut","ne","ge","PopoverProps","fallbackValue","V","P","N","Z","G","J","Q","St","spellCheck","T","yt","queueMicrotask","getAssetAutoList","AssetAutoListInner","filterAssets","AssetAutoList","VisualTypeLabel","VISUAL_RULE_EDITOR_CLASS_NAME","getVisualRuleEditorUtilityClass","VisualRuleEditorRoot","VisualRuleEditor","assetName","setAssetName","waitingForAsset","VisualRuleEditorGeneric","RuleEditorComponentMap","getEditorComponent","searchType","useIsVisualSearchEnabled","visualEnabled","useSearchRuleTypeOptions","SearchRuleTypeSelector","SEARCH_RULE_EDITOR_CLASS_NAME","getSearchRuleEditorUtilityClass","searchRuleEditorClasses","SearchRuleEditorRoot","dataUnavailable","SearchRuleEditorHeader","SearchRuleEditorContent","SearchRuleTypeSelectorRoot","SearchRuleEditorUnsupportedAlert","SearchRuleEditorPrimitive","removeDisabled","onUpdateType","SearchRuleEditor","SEARCH_RULES_EDITOR_LIST_CLASS_NAME","getSearchRulesEditorListUtilityClass","SearchRulesEditorListRoot","SearchRulesEditorListScrollBorder","SearchRulesEditorListInner","onRemoveRule","onUpdateRuleType","handleRemoveRule","handleTypeChange","handleSubType1Change","handleSubType2Change","subType2","handleValue1Change","handleValue2Change","handleValue3Change","SearchRulesEditorListPrimitive","SearchRulesEditorList","SearchRulesEditorListContainer","lastLength","els","ListItemButtonRoot","ButtonBase","alignItemsFlexStart","disableGutters","gutters","flexGrow","shortest","vars","listItemButtonClasses","mainChannel","selectedOpacity","focusVisible","focusOpacity","hoverOpacity","disabledOpacity","backgroundClip","inProps","useThemeProps","autoFocus","focusVisibleClassName","other","ListContext","childContext","listItemRef","useEnhancedEffect","composedClasses","handleRef","useForkRef","to","SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME","getSearchRulesEditorDropdownUtilityClass","SearchRulesEditorDropdownRoot","SearchRulesEditorDropdownButton","ButtonGroup","SearchRulesEditorDropdownOpenIcon","SearchRulesEditorDropdownMenu","SearchRulesEditorDropdownOptions","SearchRulesEditorDropdownOptionsList","SearchRulesEditorDropdownOptionsFilter","SearchRulesEditorDropdownOptionsScrollBorder","SearchRulesEditorDropdown","onSelect","anchorRef","setFilter","openIcon","optionsFilter","optionsList","popoverActions","nameProp","valueProp","setValueState","useControlled","controlled","useId","FormGroup","SearchRulesMatchCriteriaSelector","FormControl","Radio","SearchRulesMatchCriteriaSelectorContainer","SEARCH_RULES_EDITOR_CLASS_NAME","getSearchRulesEditorUtilityClass","SearchRulesEditorAlertCollapse","Collapse","SearchRulesEditorRoot","SearchRulesEditorHeader","SearchRulesEditorFooter","SearchRulesEditorForm","SearchRulesEditorAlert","SearchRulesEditorInner","disableAdd","onAddNewRule","onResetRules","Box","sx","faUndo","SearchRulesEditorPrimitive","SearchRulesEditor","SearchRulesEditorContainer","SearchRulesEditorDialogRoot","SearchRulesEditorDialogInner","SearchRulesEditorDialogPrimtive","SearchRulesEditorDialog","searchId","SearchEditorView","searchCriteria","editView","routeRemoved","routeListener","newRoute","previousRoute","viewOptions","rulesObject","encodedRules","isRouted","routeMatch","back","searchCriteriaCache","routes","reroute","pageNo","SearchAssetsCollecion","SavedSearchModel","ShareableTypes","appViews","modalViews","bootstrap","SavedSearchController","SearchRulesController","SearchVisualController","fetchSearchCriteria","savedCartsSingleton","favorite","searchModes","searchOptions","searchAssets","advancedSearchDate","addToAdvancedSearch_date","assetAttributeTypeIds","isForObjectType","removeFromAdvancedSearch_date","populateFromDateAttributes","dateSubTypes1_default","sortFields","checksumEnabled","searchableSystemAttributes","View","showActions","collectionOrModel","notifyType","saveSearch","SavedSearchDispatchListeners","searchStr","SearchAttributeHistoryRulesCollection","toStr","escapedStr","unescapedStr","isEscapedURI","exactMatch","pageStr","searchRoute","ruleItems","strAsNumber","clips","ClipSearchConstituentsCollection","SearchConstituentsListView_clips","clip","modeStr","wait","deepClone","facet","advanced","facets","SearchGalleryHeaderView","AssetListView","exact","LIST_TYPES_ENABLED","AssetListViewTypeManagerView","imports","namespace","Asset","initialized","addMenus","menus","controller","AppTabItemView","tabName","toCamelCase","addRelatedView","listenToOnce","toggleActive","toggleUnsavedChanges","relatedView","hasTotal","tabClicked","$count","useList","AppTabItemsView","tabsChanged","horizontalScrollbarHeight_","ANIMATING","SCROLL_AREA_SCROLL","SCROLL_TEST","AREA_SELECTOR","CONTENT_SELECTOR","MDCTabScrollerRTL","adapter","adapter_","_super","MDCTabScrollerRTLDefault","getScrollPositionRTL","currentScrollLeft","getScrollAreaScrollLeft","calculateScrollEdges_","scrollToRTL","scrollX","edges","clampedScrollLeft","clampScrollValue_","finalScrollPosition","scrollDelta","incrementScrollRTL","getAnimatingScrollPosition","getScrollContentOffsetWidth","getScrollAreaOffsetWidth","MDCTabScrollerRTLNegative","translateX","contentWidth","MDCTabScrollerRTLReverse","MDCTabScrollerFoundation","defaultAdapter","isAnimating_","eventTargetMatchesSelector","addScrollAreaClass","setScrollAreaStyleProperty","setScrollContentStyleProperty","getScrollContentStyleValue","setScrollAreaScrollLeft","computeScrollAreaClientRect","computeScrollContentClientRect","computeHorizontalScrollbarHeight","horizontalScrollbarHeight","getScrollPosition","isRTL_","computeCurrentScrollPositionRTL_","currentTranslateX","calculateCurrentTranslateX_","handleInteraction","stopScrollAnimation_","handleTransitionEnd","evtTarget","incrementScroll","scrollXIncrement","incrementScrollRTL_","incrementScroll_","scrollToRTL_","scrollTo_","getRTLScroller","rtlScrollerInstance_","rtlScrollerFactory_","transformValue","matrixParams","_a","tx","currentScrollX","safeScrollX","animate_","targetScrollX","currentScrollPosition","getAnimatingScrollPosition_","initialScrollLeft","newScrollLeft","rootClientRect","contentClientRect","rightEdgeDelta","MDCTabScroller","area_","root_","content_","initialSyncWithDOM","handleInteraction_","foundation_","handleTransitionEnd_","getDefaultFoundation","setProperty","getComputedStyle","getPropertyValue","documentObj","shouldCacheResult","createElement","appendChild","getScrollContentWidth","FADE","NO_TRANSITION","MDCTabIndicatorFoundation","computeContentClientRect","setContentStyleProperty","MDCFadingTabIndicatorFoundation","activate","deactivate","MDCSlidingTabIndicatorFoundation","previousIndicatorClientRect","currentClientRect","widthDelta","xPosition","MDCTabIndicator","ARIA_SELECTED","INTERACTED_EVENT","RIPPLE_SELECTOR","TABINDEX","TAB_INDICATOR_SELECTOR","MDCTabFoundation","focusOnActivate_","setAttr","activateIndicator","deactivateIndicator","notifyInteracted","getOffsetLeft","getOffsetWidth","getContentOffsetLeft","getContentOffsetWidth","setFocusOnActivate","focusOnActivate","computeDimensions","rootWidth","rootLeft","contentLeft","contentRight","rootRight","MDCTab","rippleFactory","tabIndicatorFactory","foundation","rippleSurface","rippleAdapter","createAdapter","updateCssVariable","varName","rippleFoundation","ripple_","tabIndicatorElement","tabIndicator_","handleClick_","listen","unlisten","tabId","offsetLeft","computeIndicatorClientRect","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","END_KEY","ENTER_KEY","HOME_KEY","SPACE_KEY","TAB_ACTIVATED_EVENT","TAB_SCROLLER_SELECTOR","TAB_SELECTOR","ARROW_LEFT_KEYCODE","ARROW_RIGHT_KEYCODE","END_KEYCODE","ENTER_KEYCODE","EXTRA_SCROLL_AMOUNT","HOME_KEYCODE","SPACE_KEYCODE","ACCEPTABLE_KEYS","KEYCODE_MAP","Map","MDCTabBarFoundation","useAutomaticActivation_","isRTL","setActiveTab","activateTabAtIndex","deactivateTabAtIndex","focusTabAtIndex","getTabIndicatorClientRectAtIndex","getTabDimensionsAtIndex","getPreviousActiveTabIndex","getFocusedTabIndex","getIndexOfTabById","getTabListLength","notifyTabActivated","setUseAutomaticActivation","useAutomaticActivation","activateTab","previousClientRect","previousActiveIndex","indexIsInRange_","getKeyFromEvent_","isActivationKey_","determineTargetFromKey_","focusedTabIndex","handleTabInteraction","scrollIntoViewRTL_","scrollIntoView_","maxIndex","calculateScrollIncrement_","nextIndex","scrollPosition","barWidth","nextTabDimensions","relativeContentLeft","leftIncrement","rightIncrement","calculateScrollIncrementRTL_","scrollContentWidth","findAdjacentTabIndexClosestToEdge_","tabDimensions","relativeRootLeft","relativeRootRight","relativeRootDelta","findAdjacentTabIndexClosestToEdgeRTL_","rootDelta","scrollIncrement","tabIdCounter","MDCTabBar","tabList_","tab","tabFactory","tabScrollerFactory","instantiateTabs_","tabScroller_","instantiateTabScroller_","handleTabInteraction_","handleKeyDown_","clientRect","tabElements","getTabElements_","tabScrollerElement","materialList","childViews","checkMaterialTabActive","tabBar","setupMaterial","MaterialList","TabView","isTabView","__isTabView__","noRender","instantiateOnAdd","additionalViewClasses","automaticallySetTabs","showOnAdd","defaultTab","tabsViewOptions","tabsView","viewCollection","showViewByName","activeView","getActiveView","showFirstEnabledView","newTab","oldTab","tabChanged","$tabs","setElement","beforeShowView","currentHeight","$childTargetEl","registerView","instantiateView","showView","showTab","viewChanging","canChange","lastTab","routedView","isMyOriginalCollection","isRouting","isViewActionValid","exitRoute","viewInstantiated","removeOnSimpleHide","viewAfterShown","viewOnShowing","AppViewModel","CategoryTreeSelectNodeView","selectedCategory","selectName","hasAddPermission","CategoryTreeSelectNodesView","TreeViews","CategoryTreeView","treeViewClass","treeNodesView","topLevelCategories","filteredTreeNodesView","filteredCategories","$all","$filtered","$search","refreshTree","clearSearch","faArrowCircleLeft","CategoryTreeSelectView","hideEditButton","cat","CategoryModel","uniqueEvent","treeView","$tree","submitArgs","submitReady","categorySelected","oldCatId","selectedCatgeory","VirtualizedTableContainerPrimitive","VirtualizedTableContainer","ByteCell","AssetAttributesView","truncateValuesAt","noValueStr","primaryAttribute","detailAttributes","materialTextFields","dateComponents","textField","input_","deactivateFocus","materialTextFieldFloatLabel","shouldFloat","getMaterailTextField","label_","float","notchOutline","ttInputEl","inputEl","MDCTextField","textfield","notchOutlinePatched_","openNotch","notchOutlinePatchTimeout","hasOutline","labelScale","labelWidth","getLabelWidth","forceFloat","hasLabel","isFocused","inputFocusHandler_","floatLabel","notchOutlinePatch","getTableRowClass","tableRowClasses","TableRowRoot","TableRowInner","VirtualizedTableRowCellProps","isTrusted","TableRowPrimitive","downloadOption","family","NxSearch","HTMLElement","checkCancelButton","getSearchEvent","observedAttributes","connectedCallback","getChangeEvent","fireOnEnterOnly","eventType","attributeChangedCallback","previousValue","createEvent","initEvent","customElements","define","NetxDragResize","autoscroll","ns","stand_alone","netxDrag","$dragHandler","class","dragFrom","targetItems","targetItem","$items","handle","startWidth","usePercent","startHeight","currentWidth","_dragHandler","last_width","init_width","init_height","last_left","last_top","onDragHandler","_e","$body","parentHeight","outerHeight","parentWidth","outerWidth","_getDragEvent","onDragMove","diffLeft","diffTop","distance","scrollDiffX","scrollDiffY","con_scroll_y","con_scroll_x","pointer","diff_top","diff_left","ms_init_pos","setHeight","last_height","onDragStop","$doc","$proxyEl","$scrollContainer","$win","removeData","_ignoreDrag","_getDragData","os","_getOffset","parentScrollHeight","thisTop","win_size","underflowParent","parentScrollWidth","thisLeft","_updateStageSize","dimensionAdjusted","elRect","parentRect","tempWidth","previousParentRect","Plugin","_arguments","$this","fn","netxDragResize","isObject","proxyFor","proxy","indefinite","accesses","accessTypes","TOKEN_PASSWORD_PLACEHOLDER","profile","authenticated","mediaServices","service","_typeof","toPrimitive","StringFormatter","rawValue","isNull","StringCell","updateStateClassesMaybe","datepicker","$dateEl","autoclose","disableTouchKeyboard","$tooltipEl","tooltipOptions","partial","BooleanCell","$checkbox","CellFormatter","DateCellEditor","InputCellEditor","killDatepicker","saveOrCancel","wasReset","picker","HtmlCell","ImageCell","NetxNumberCellEditor","decimalLength","decimals","TextareaCellEditor","TextareaCell","hideRow","Body","useAdvancedMenu","resizer","span","innerText","menuCollection","NumberCell","editUserLevel","DateCell","TimeCell","Column","sortValue","colName","makeRegExp","escapeChars","char","removeCollectionReference","collectionNotEmpty","allowsDelete","assetNotPending","canZoomAsset","disabledClass","categoryAndAssetCanEdit","canRemoveAssetFromCategory","canCheckIn","canCheckOut","assetExpires","canLock","canUnlock","notMobile","reviewEnabled","assetCanReview","assetNotCheckedOut","assetCanRepurpose","assetRequestsEnabled","canManageVersions","canDownloadVersion","faSignInAlt","faSignOutAlt","faClock","newActions","extendActions","assetContextMenu","assetExpirationActions","assetList","assetTabs","assetViews","assetDetail","assetActions","assetSelectionContextMenu","assetSavedCollectionContextMenu","assetCategoryActions","assetConstituentClipActions","assetListColumnContextMenu","assetViewActions","permissionAssetActions","AssetRequest","attributeCaptions","attributeLabels","attributePlaceholders","attributeRequired","categoryPath","notifyId","notifyLabel","setAssetRequest","requestId","getAssetRequest","parseAttributes","mail","emailOpts","notes","emailNotes","emailTo","emails","attributesSelected","AssetRequestAttributesCollection","selectedAttributes","assetRequestData","mapObject","getParallelArrays","AssetView","imageId","autoTaskId","fileHeight","fileWidth","fileSizeLabel","fileTypeId","fileTypeLabel","viewMetadataLabels","viewMetadataValues","viewId","matrixBit","AssetIndex","AssetMetadatum","AssetMetadata","getAssetMetadata","lvbToMetadata","syncMap","toObject","theObj","AssetPermissions","getAcls","fetchAll","deletePermissions","setPosition","currentPosition","newPositionData","myPos","AssetUsage","domain","dataArr","usageOb","AssetVersions","AssetViews","getViewObjectsForAsset","assetView","loadingMessage","parseRow","fieldCount","columnProperties","editorTypes","primaryColumn","requiredFields","ProgressModel","complete","getCellValue","getColumnIndex","getColumnValue","getJSON","getPrimary","getRowData","getSortParams","sortParams","defaultSortParams","isNewSort","parseColumn","parseColumns","primaryIdx","newData","AssetAttributeHistory","getAssetAttributeHistory","searchString","trackedAttributes","filterByHistory","creation_date","createDate","creation_user_label","createUserName","getTypeName","parseURL","unsetSort","Comment","annotationId","authorEmail","authorId","authorLabel","comment","isEdited","lastModDate","rootCommentId","Comments","addComment","ProjectReviewAnnotationComment","projectStatus","allowed","setProjectStatus","ProjectReviewAnnotationComments","roomName","comments","canEditProject","removeComment","subscriptionMessage","dto","ProjectReviewAnnotation","commentCount","creatorEmail","creatorId","creatorLabel","fillStyle","firstComment","lineWidth","originX","originY","reviewId","strokeStyle","AssetAnnotationsCommentsCollection","AssetAnnotationCommentModel","unset","getComments","getShapeData","scale","unsubscribe","updatePosition","updateSize","updateSizeAndPosition","updateStyle","ProjectReviewAnnotations","annotations","annotation","addAnnotation","removeAnnotation","resetActive","activeAnnotation","ProjectReviewDecision","userEmail","decisionDate","ProjectReviewDecisions","userDecisions","approvalModes","approved","rejected","closed","ProjectReview","approvedCount","isRestricted","needsWorkCount","rejectedCount","userDecision","zoomUrl","setReviewDecision","projectDecisions","decisions","review","AssetProjectReviewAnnotationsCollection","AssetProjectReviewDecisionsCollection","getAnnotations","getDecisions","resetActiveAnnotation","canMakeDecision","getOrientation","getZoomProxyScale","ProjectReviews","project","getReviewsForAsset","getReviewsForProject","startId","getProjectId","getSortDTO","reviews","getActive","nextReview","selectReview","previousReview","removeReview","ProjectParticipant","approver","ProjectParticpants","participants","approvers","participant","UserSelector_Member","realId","UserSelectorMembers","selectors","GroupCollection","UserCollection","setUserSelector","selectorsEnabled","_listenId","__isModel__","addMember","getGroups","getUsers","getMember","getMemberIds","removeMember","resetUserSelector","setMembers","userSelectorObject","deepObjectExtend","selectorMembers","UserSelectorMembersCollection","member","deselectAll","getCompletionType","hasGroupIds","hasUserIds","getChanges","matches","toggleMember","Project","approvalMode","creationUser","dueDate","hasApprovers","hasDecisions","modDate","modUser","updateProject","participantCount","addAssetsToProject","deleteAssetsFromProject","updateProjectStatus","projectStatuses","ProjectParticipantsCollection","AssetProjectReviewsCollection","canModifyApprovalMode","getActiveReview","getApprovers","getParticipants","getReviews","getUserSelector","isClosed","approverCount","approversChanged","oldApprovers","Projects","getAllProjects","getProjectsForAsset","getProjectsForUser","currentUser","projectIds","firstId","restIds","projects","createNewProjects","newProjects","CurrentAsset","assetAttributeDatum","AssetAttributeDatumCollection","AttributeHistoryCollection","CategoriesCollection","indices","AssetIndexCollection","links","AssetMetadataCollection","AssetPermissionsCollection","ProjectsCollection","ProjectReviewsCollection","usage","AssetUsageCollection","AssetVersionsCollection","AssetViewsCollection","attributeDatum","selectedView","selectedViewId","fetchVersions","constituent","dateToAsset","task","permissionUpdated","newVersion","oldVersion","progressOb","uploadModel","fromCatId","toCatId","fetchCategories","fetchAttributeHistory","newCatArr","oldCatArr","getCategoriesById","fetchIndices","fetchLinks","fetchMetadata","fetchPermissions","fetchProjects","fetchReviews","fetchUsage","fetchViews","viewsCount","AssetCursor","getAssetObjects","currentAsset","cachedCollection","cacheFetch","expectedId","recordViewed","SearchConstituentsCollection","clearPages","otherSelection","goto","forceSimple","AssetRequests","getAssetRequests","assetRequests","AssetTaskList","tasks","targetTask","AssetTasks","trackTasks","triggerError","onlineStatusChanged","onlineStatus","_polling","pollUntil","getCompletedTasks","taskComplete","taskUpdated","appConfig","POLL_INTERVAL","triggerComplete","MetadataMapLink","mappingId","templateIds","schemaUpdated","schemaField","splitSchema","MetadataMapLinks","MetadataMap","isDefault","mapLinks","setDefaultMap","allMaps","mappingLinks","getMapLinks","MetadataMapLinksCollection","mappedAttributeIds","chain","flatten","uniq","mapsAttribute","AttributeModel","toSchemaField","mapLink","mapsMetadata","newMapLinks","schemaFields","MetadataMaps","getMetadataMapJson","clearDefaultMap","getSchemas","schemas","schemaLabels","rex","schemaLabel","fieldLabel","both","where","import","export","MiniAsset","constituentAvailable","flvAvailable","formatIcon","label1","label2","label3","label4","label5","label6","label7","label8","label9","label10","approval","relatedAssets","deleteWait","nameMaybe","AssetModel","MiniAssets","fetchSpecificMethod","ignoreStat","fetchAssetCount","PendingAsset","categoryIds","PendingAssets","assetImporting","assetEnteringCategory","assetLeavingCategory","uploaded","setupDoneListener","newId","oldId","findByAsset","filterByAsset","findByCategory","filterByCategory","AssetVersionReactivate","AssetConstituentDownloadView","AssetConstituentDownloadView_Clip","presets","faLongArrowAltLeft","isListViewHash","AssetDetailView","renderAllChildren","assetIdChanged","assetCursor","previewView","AssetPreviewView","templateName","AssetDetailPreviewViewTemplate","paging","listView","AssetLinksViewTemplate","attributesView","AssetAttributeSetsSelection","pagerView","PagerView","AssetDetailPagerViewTemplate","hasTouch","isPanning","contextHash","pauseAV","isPlaying","lastHash","toListLink","afterHidden","bindEvents","hammer","Hammer","hammerPan","$listView","$detailCrumb","$pagerView","$previewView","$attributesView","showLoaded","videojs","pause","removeVideoPreview","showProgressBar","stopPlayer","$videoJs","player","renderPreview","detailClick","gesture","additionalEvent","deltaX","angle","undelegateEvents","viewerType","AssetProcess","execute","downloadOverride","otherIds","AssetImageProcesses","getProcesses","AssetVideoProcesses","audio","AssetImagePresetsCollection","video","AssetVideoPresetsCollection","showAction","assetModel","manualUserLevel","canManuallyRepurpose","inspection","getProcessListForUser","processes","manualProcesses","countKeys","countKeysLength","otherAssetCount","badCount","yesLabel","videoAssetIds","preset","ThemedComponent","ConfirmView","onConfirm","userInputToExpirationTime","attributeSetSelectionDefault","sortFieldPrefKey","sortOrderPrefKey","AssetGalleryView","galleryRef","hackReady","GalleryHack","renderRequested","hackRender","setPage","showAssets","hideAssets","ASSET_GALLERY_DISPATCHER_BASE_EVENT","ASSET_GALLERY_DISPATCHER_EVENT","SHOW","SHOW_DETAIL","facetFilterMode","_selectedFacets","turnOff","turnOn","currentId","assetsCollection","progressTask","AssetDetailEnablers","assetHasClips","assetHasConstituents_clips","assetHasConstituents_keyframes","assetHasConstituents_layers","assetHasConstituents_pages","assetHasDetail","assetHasLinks","assetHasMetadata","assetHasPreview","assetHasProjects","assetHasReviews","assetHasVersions","assetHasViews","fsViews","getAttributeId","filterByObjectType","clipAttributes","clipAttributesSingleton","CurrentAssetModel","AssetCursorCollection","metadataMaps","MetadataMapsCollection","misc","MiniAssetsCollection","pending","PendingAssetsCollection","AssetTasksCollection","AssetResyncController","AssetGalleryController","AssetDeleteController","AssetExpirationController","AssetRepurposeController","AssetCustomThumbnailController","AssetProjectController","listTypeAttributeSetsSelections","listType","AssetAttributeSetsSelectionCollection","NxVideo","imported","getRecentlyUploadedAssets","getMostViewedAssets","autoSort","newWindow","CoreModel","downloadOptions","DownloadOptionsCollection","downloadOptionTypes","historical","rtn","assetAttributeSetsSelection","attributeSetSelection","selectedIds","selectedId","selectTree","linkCategory","addCategory","fromCategory","fromCat","toCat","moveCategory","removeCategory","CHECKIN_ENABLE","DOWNLOAD_ON_CHECKOUT","cancelCheckout","setDisplay","getDownloadOptions","processIdx","manualOpt","originalOpt","DownloadOptionModel","requiresApproval","requiresJustification","getManualRepurposeOptions","clipId","AssetConstituentClipModel","startTime","range","endTime","bits","curId","assetThings","_thing","_enableTest","ROUTE","intersect","DETAIL_TABS","showEmpty","ucThing","ucfirst","tabTest","Enablers","assetDetailView","fetchConstituents","inMotion","pdfUrl","Menus","lock","unlock","getLastPage","getNextPage","getPrevPage","REIMPORT_ENABLE","AssetRequestsCollection","showOptions","AssetRequestModel","doFetch","Load","FETCH_ON_SAVE","versionModel","AssetVersionReactivateView","memoText","reactivateAssetVersion","AssetViewModel","cacheInMediaRich","makeZoomTiles","progressUUID","faExpandArrows","faStop","faTimesCircle","AssetQuickzoomView","stepSize","domEvents","hammerPanstart","onRightClick","isAsset","isTemplate","zoomEnabled","$zoomIn","$zoomOut","$img","$zoomImg","zoomImgScale","originalWidth","originalHeight","zoomToWindow","setImgDimensions","targetWidth","targetHeight","centerZoomImage","zoomEnable","zoomIn","curWidth","curHeight","zoomOut","dragTopStart","deltaY","dragLeftStart","detailTab","AssetZoomifyView","permissionsEnabled","faUsersCog","AssetPermissionEditView","enhancedAcls","principalIds","targetIds","principalUserId","principalGroupId","targetAssetId","targetCategoryId","targetChanged","principalChanged","inputs","$principal","hideField","$principalUserId","$principalGroupId","showField","$targetAssetId","$targetCategoryId","$recursive","resource","getPermissions","PermissionModel","permissionTarget","AssetPermissionModel","getParticipant","addParticipant","sendMessage","CUSTOM_SET","selectedAttributeIds","selectedSetId","showInput","setId","selectFirstAvailableAttribute","affix","getAttributeFormValuesFromIds","addButton","chip","selectorWrapper","withSetSelection","itemManagerActions","itemManagerStore","dropdownRef","withSetSelectionRef","triggerDefaultSet","triggerFocus","attributesLength","handleAddClick","handleAttributeSelectChange","Items","ListIcon","Sets","AssetAttributeSelectView","childCollection","newSelectedIds","updateMax","AccessToken","hasAudio","hasVideo","hasZoom","canZoom","getTokenString","tokenModel","getWaveformJSON","json","tokenStr","hasMultimedia","isDocument","isPDF","isImage","AccessTokenAssets","getTokenAssetData","getTokenInfo","accessId","accessType","justifyDetails","justifyId","requestorId","requestorLabel","secondsToLive","timesUsed","totalUses","approve","note","downloadForToken","fetchInfo","getAssets","hasDownloadableOptions","syncOpts","toSources","downloadableTypes","hasOption","secs","_opts","getTimezoneOffset","dateToLocalTimezone","hours","minutes","seconds","expDate","dateFromAsset","templateCustomization","baseUrl","pathname","AssetListItemView_Card","attributeSetsSelection","card","assetAttributesView","AssetAttributesCardTemplate","AssetListView_Card","AssetListViews","CardView","AssetListViewTypeManager","loadingMethods","layoutType","subViewOptions","currentLayoutType","typeChanged","removeAssetListView","isShown","injectAssetListView","assetArr","syncObj","resetHorizontalScroll","$assetListView","addPagerView","$galleryView","afterShown","assetListView","assetsAreSelected","getCurrentCart","canManageArchive","canManageAssetExpiration","canRemoveCartPermission","cartCanCreateTMSObject","currentCartNotEmpty","canAddAssetsToCart","canRemoveAssetFromSavedCart","gallery","assetInCart","assetNotInCart","isAppView","AssetRequestAtribute","AssetRequestAttributes","MAX_SAFE_INTEGER","userProps","pluginName","info","isReactComponent","accessor","W","Footer","originalId","placeholderOf","manualExpandedKey","expanded","expandSubRows","isExpanded","canExpand","subRows","colSpan","totalVisibleHeaderCount","useOptions","stateReducers","useControlledState","columnsDeps","allColumnsDeps","accessValue","materializedColumns","materializedColumnsDeps","useInstanceAfterData","visibleColumns","visibleColumnsDeps","headerGroups","headerGroupsDeps","useInstanceBeforeDimensions","useInstance","getTableProps","getTableBodyProps","getHeaderGroupProps","getFooterGroupProps","getFooterProps","useFinalInstance","resetHiddenColumns","toggleHideColumn","setHiddenColumns","toggleHideAllColumns","getToggleHiddenProps","getToggleHideAllColumnsProps","hiddenColumns","toggleHidden","isVisible","allColumnsHidden","indeterminate","columnId","flatHeaders","getHooks","autoResetHiddenColumns","ee","oe","re","ie","defaultColumn","getSubRows","getRowId","stateReducer","ue","totalLeft","totalMinWidth","totalWidth","totalMaxWidth","totalFlexWidth","canResize","le","flatRows","rowsById","accessValueHooks","getInstance","originalSubRows","resetExpanded","toggleRowExpanded","toggleAllRowsExpanded","se","getToggleAllRowsExpandedProps","ae","getToggleRowExpandedProps","ce","de","fe","pe","isAllRowsExpanded","paginateExpandedRows","autoResetExpanded","preExpandedRows","expandedRows","expandedDepth","autoRemove","ve","he","ye","we","Re","be","Se","Ce","xe","freeze","exactText","exactTextCase","includesAll","includesSome","includesValue","between","resetFilters","setAllFilters","Pe","Be","Ee","filterValue","filterTypes","manualFilters","defaultCanFilter","disableFilters","autoResetFilters","canFilter","preFilteredRows","filteredRows","preFilteredFlatRows","preFilteredRowsById","filteredFlatRows","filteredRowsById","resetGlobalFilter","setGlobalFilter","Ie","Fe","Ge","globalFilter","userFilterTypes","manualGlobalFilter","autoResetGlobalFilter","disableGlobalFilter","preGlobalFilteredRows","preGlobalFilteredFlatRows","preGlobalFilteredRowsById","globalFilteredRows","globalFilteredFlatRows","globalFilteredRowsById","Ae","ke","sum","minMax","average","median","uniqueCount","He","Te","resetGroupBy","setGroupBy","toggleGroupBy","ze","getGroupByToggleProps","We","Oe","Me","Ne","Le","canGroupBy","isGrouped","groupedIndex","je","groupByFn","De","manualGroupBy","aggregations","autoResetGroupBy","disableGroupBy","defaultCanGroupBy","defaultGroupBy","Aggregated","aggregate","aggregateValue","groupByID","groupByVal","leafRows","preGroupedRows","preGroupedFlatRow","preGroupedRowsById","groupedRows","groupedFlatRows","groupedRowsById","onlyGroupedFlatRows","onlyGroupedRowsById","nonGroupedFlatRows","nonGroupedRowsById","allCells","isPlaceholder","isAggregated","Ve","Xe","qe","Ke","datetime","resetSortBy","setSortBy","toggleSortBy","clearSortBy","sortDescFirst","Ue","getSortByToggleProps","$e","Je","Ye","isMultiSortEvent","canSort","disableMultiSort","desc","multi","disableSortRemove","disableMultiRemove","maxMultiSortColCount","orderByFn","Qe","sortTypes","manualSortBy","defaultCanSort","disableSortBy","autoResetSortBy","isSorted","sortedIndex","isSortedDesc","sortInverted","preSortedRows","preSortedFlatRows","sortedRows","sortedFlatRows","resetPage","setPageSize","Ze","pageIndex","autoResetPage","manualPagination","pageOptions","canPreviousPage","canNextPage","previousPage","resetPivot","togglePivot","getPivotToggleProps","lt","dt","pt","gt","canPivot","pivotColumns","isPivotSource","uniqueValues","PivotHeader","isPivotGroup","pivotValue","isPivoted","autoResetPivot","manaulPivot","disablePivot","defaultCanPivot","defaultPivot","resetSelectedRows","toggleAllPageRowsSelected","vt","getToggleRowSelectedProps","getToggleAllRowsSelectedProps","getToggleAllPageRowsSelectedProps","bt","manualRowSelectedKey","isSomeSelected","isAllRowsSelected","selectedRowIds","isAllPageRowsSelected","selectSubRows","autoResetSelectedRows","selectedFlatRows","Ct","setRowState","setCellState","resetRowState","initialRowStateAccessor","initialCellStateAccessor","rowState","cellState","autoResetRowState","resetColumnOrder","setColumnOrder","columnOrder","At","columnStartResizing","columnResizing","columnDoneResizing","resetResize","getResizerProps","zt","touches","mouse","moveEvent","moveHandler","upEvent","upHandler","passive","headerIdWidths","onTouchStart","isResizingColumn","disableResizing","isResizing","autoResetResize","resetResizing","totalColumnsMinWidth","Yt","gridTemplateColumns","gridLayout","getElementById","startingWidth","_UNSTABLE_usePivotColumns","defaultGroupByFn","defaultOrderByFn","defaultRenderer","emptyRenderer","ensurePluginOrder","flexRender","functionalUpdate","loopHooks","makePropGetter","makeRenderer","reduceHooks","safeUseLayoutEffect","useAbsoluteLayout","useAsyncDebounce","regeneratorRuntime","mark","t0","t1","sent","t2","finish","abrupt","useBlockLayout","useColumnOrder","useExpanded","useFilters","useFlexLayout","useGetLatest","useGlobalFilter","useGridLayout","useGroupBy","useMountedLayoutEffect","usePagination","useResizeColumns","useRowSelect","useRowState","useSortBy","hooks","initialRows","totalColumnsMaxWidth","headerGroup","footerGroups","b64","lens","getLens","validLen","placeHoldersLen","tmp","Arr","_byteLength","curByte","revLookup","uint8","extraBytes","parts","maxChunkLength","len2","encodeChunk","output","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","NaN","LN2","typeIds","permissionTypes","permissionType","permissionIds","principalTypes","principalType","targetTypes","targetType","disabledListItemCheckboxPatch","MDCList","arrowNavigationPatch","materialRipples","listElements","listItemEl","MDCRipple","setSingleSelection","wrapFocus","clicked","itemSelected","materialListItemSelected","setSelectedIndex","hashSplit","hrefSplit","_ignoreItemSelection","onListItemSelect","listElement","hasCheckboxAtIndex","setCheckedCheckboxOrRadioAtIndex","materialLists","setup","getFocusedListItem","focusedItem","focusedItemIndex_","getActiveList","focusedList","Document","createElementNS","aa","importNode","ba","prepend","ca","da","DocumentFragment","ea","Node","cloneNode","insertBefore","getOwnPropertyDescriptor","attachShadow","getAttributeNS","setAttributeNS","removeAttributeNS","insertAdjacentElement","insertAdjacentHTML","fa","ha","ia","before","ja","after","ka","la","ma","na","oa","pa","qa","ra","isConnected","__CE_isImportDocument","ShadowRoot","nextSibling","nodeType","ELEMENT_NODE","localName","__CE_shadowRoot","noDocumentConstructionObserver","shadyDomFastWalk","ShadyDom","inUse","nativeMethods","__CE_patched","__CE_state","disconnectedCallback","upgrade","__CE_registry","readyState","__CE_documentLoadHandled","ownerDocument","defaultView","constructionStack","constructorFunction","__CE_definition","hasAttributes","ua","namespaceURI","HTMLUnknownElement","sourceURL","line","lineNumber","columnNumber","ErrorEvent","initErrorEvent","filename","lineno","colno","va","wa","subtree","xa","ya","SyntaxError","Aa","Function","adoptedCallback","za","Da","previousSibling","ta","childNodes","Ca","whenDefined","polyfillWrapFlushCallback","CustomElementRegistry","polyfillDefineLazy","Ea","Ha","Fa","Ba","TEXT_NODE","sa","COMMENT_NODE","textContent","createTextNode","Ga","forcePolyfill","__CE_installPolyfill","overrideDefaultIcon","imgSrc","isPhoto","videoUrl","millisecondsToTimeStr","keyframeReady","smallSALO","correctSearchCriteriaQuirks","realName","canClose","oldL","noConflict","Util","dest","stamp","invokeEach","limitExecByInterval","time","execOnUnlock","wrapperFn","falseFn","formatNum","digits","splitWords","getParamString","existingUrl","uppercase","toUpperCase","emptyImageUrl","getPrefixed","prefixes","lastTime","timeoutDefer","timeToCall","requestFn","cancelFn","cancelAnimationFrame","requestAnimFrame","immediate","cancelAnimFrame","Class","NewClass","_initHooks","callInitHooks","proto","statics","_initHooksCalled","include","mergeOptions","addInitHook","ielt9","webkit","chrome","phantomjs","android","android23","gecko","mobile","msPointer","retina","doc","ie3d","webkit3d","gecko3d","opera3d","any3d","eventsKey","Mixin","Events","indexKey","indexLenKey","typeIndex","contextId","hasEventListeners","clearAllEventListeners","fireEvent","addOneTimeEventListener","handler","fire","userAgent","msPointerEnabled","msMaxTouchPoints","PointerEvent","pointerEnabled","maxTouchPoints","devicePixelRatio","matchMedia","WebKitCSSMatrix","L_DISABLE_3D","L_NO_TOUCH","startName","supported","Browser","opera","mobileWebkit","mobileWebkit3d","mobileOpera","Point","_add","subtract","_subtract","divideBy","_divideBy","multiplyBy","_multiplyBy","_round","_floor","distanceTo","sqrt","Bounds","getCenter","getBottomLeft","getTopRight","getSize","bounds","intersects","min2","max2","xIntersects","yIntersects","Transformation","_b","_c","_d","_transform","untransform","DomUtil","getStyle","currentStyle","getViewportOffset","docBody","docEl","offsetTop","offsetParent","clientLeft","documentIsLtr","_docIsLtrCached","_docIsLtr","_getClass","_setClass","baseVal","setOpacity","filterName","Enabled","Opacity","testProp","getTranslateString","is3d","getScaleString","disable3D","_leaflet_pos","TRANSFORM","getPosition","TRANSITION","TRANSITION_END","disableTextSelection","DomEvent","enableTextSelection","userSelectProperty","_userSelect","disableImageDrag","enableImageDrag","LatLng","lat","lng","DEG_TO_RAD","PI","RAD_TO_DEG","MAX_MARGIN","latLng","precision","d2r","dLat","dLon","lat1","lat2","sin1","sin","sin2","cos","atan2","lon","LatLngBounds","southWest","northEast","latlngs","latLngBounds","_southWest","_northEast","bufferRatio","sw","heightBuffer","widthBuffer","getSouthWest","getNorthEast","getNorthWest","getNorth","getWest","getSouthEast","getSouth","getEast","sw2","ne2","latIntersects","lngIntersects","toBBoxString","Projection","SphericalMercator","MAX_LATITUDE","latlng","unproject","atan","exp","LonLat","CRS","latLngToPoint","projectedPoint","projection","transformation","pointToLatLng","untransformedPoint","Simple","EPSG3857","EPSG900913","EPSG4326","crs","fadeAnimation","trackResize","markerZoomAnimation","_initContainer","_initLayout","_onResize","_initEvents","maxBounds","setMaxBounds","center","setView","_handlers","_layers","_zoomBoundLayers","_tileLayersNum","_addLayers","layers","getZoom","_resetView","_limitZoom","setZoom","_loaded","_zoom","setZoomAround","getZoomScale","viewHalf","centerOffset","latLngToContainerPoint","newCenter","containerPointToLatLng","fitBounds","getBounds","paddingTL","paddingTopLeft","paddingBR","paddingBottomRight","getBoundsZoom","paddingOffset","swPoint","nePoint","maxZoom","fitWorld","panTo","pan","panBy","_rawPanBy","_panInsideMaxBounds","panInsideBounds","_limitCenter","addLayer","layer","minZoom","_updateZoomLevels","zoomAnimation","TileLayer","_tileLayersToLoad","_onTileLayerLoad","_layerAdd","removeLayer","hasLayer","eachLayer","invalidateSize","animate","oldSize","_sizeChanged","_initialCenter","oldCenter","debounceMoveend","_sizeTimer","addHandler","HandlerClass","_container","_leaflet","_clearPanes","_clearControlPos","_clearHandlers","_checkIfLoaded","_moved","layerPointToLatLng","_getCenterLayerPoint","getPixelBounds","getMinZoom","_layersMinZoom","getMaxZoom","_layersMaxZoom","inside","boundsSize","nw","zoomNotFound","_size","topLeftPoint","_getTopLeftPoint","getPixelOrigin","_initialTopLeftPoint","getPanes","_panes","getContainer","toZoom","getScaleZoom","latLngToLayerPoint","containerPointToLayerPoint","_getMapPanePos","layerPointToContainerPoint","layerPoint","mouseEventToContainerPoint","getMousePosition","mouseEventToLayerPoint","mouseEventToLatLng","_initPanes","_initControlPos","_mapPane","mapPane","_createPane","_tilePane","tilePane","objectsPane","shadowPane","overlayPane","markerPane","popupPane","zoomHide","preserveMapOffset","afterZoomAnim","zoomChanged","_getNewTopLeftPoint","hard","_getZoomSpan","oldZoomSpan","onOff","_onMouseClick","_fireMouseEvent","_resizeRequest","_simulated","moved","boxZoom","_skipped","containerPoint","whenReady","_latLngToNewLayerPoint","newZoom","topLeft","_getCenterOffset","centerPoint","viewBounds","_getBoundsOffset","_limitOffset","newBounds","pxBounds","nwOffset","seOffset","dx","_rebound","dy","Mercator","R_MINOR","R_MAJOR","r2","eccent","con","ts","phi","dphi","EPSG3395","tileSize","subdomains","errorTileUrl","attribution","zoomOffset","unloadInvisibleTiles","updateWhenIdle","detectRetina","_map","_animated","_zoomAnimated","_reset","_update","_animateZoom","_endZoomAnim","_limitedUpdate","addTo","bringToFront","_setAutoZIndex","bringToBack","getAttribution","_updateOpacity","setZIndex","_updateZIndex","noRedraw","redraw","edgeZIndex","tiles","_tiles","_bgBuffer","_tileContainer","tile","_tilesToLoad","reuseTiles","_unusedTiles","_clearBgBuffer","_getTileSize","zoomN","maxNativeZoom","tileBounds","_addTilesFromCenterOut","_removeOtherTiles","_tileShouldBeLoaded","tilesToLoad","fragment","createDocumentFragment","_addTile","tilePoint","continuousWorld","_getWrapTileNum","nwPoint","sePoint","kArr","_removeTile","tilePos","_getTilePos","_getTile","_loadTile","_getZoomForUrl","zoomReverse","getTileUrl","_getSubdomain","_adjustTilePoint","tms","_resetTile","_createTile","galleryimg","onselectstart","onmousemove","_layer","_tileOnLoad","_tileOnError","_tileLoaded","_clearBgBufferTimer","newUrl","tileLayer","WMS","defaultWmsParams","transparent","wmsParams","_crs","_wmsVersion","projectionKey","bbox","setParams","wms","Canvas","_redrawTile","drawTile","_tilePoint","tileDrawn","ImageOverlay","_bounds","_image","_initImage","_onImageLoad","imageOverlay","createIcon","oldIcon","_createIcon","_getIconUrl","_createImg","_setIconStyles","shadowAnchor","iconAnchor","Default","iconSize","popupAnchor","imagePath","scripts","getElementsByTagName","leafletRe","Marker","keyboard","zIndexOffset","riseOnHover","riseOffset","_latlng","_initIcon","_removeIcon","_removeShadow","getLatLng","setLatLng","setZIndexOffset","setIcon","_popup","bindPopup","_setPos","classToAdd","addIcon","_initInteraction","_bringToFront","_resetZIndex","newShadow","_shadow","addShadow","_zIndex","_onKeyPress","Handler","MarkerDrag","wasDragged","_enabled","DivIcon","bgPos","divIcon","closePopupOnClick","Popup","autoPan","closeButton","autoPanPadding","keepInView","_source","_isOpen","animFade","_getEvents","popup","openOn","openPopup","_updatePosition","_adjustPan","getContent","_content","setContent","_updateContent","_updateLayout","viewreset","zoomanim","_zoomAnimation","closeOnClick","preclick","_close","moveend","closePopup","prefix","containerClass","_closeButton","disableClickPropagation","_onCloseButtonClick","_wrapper","_contentNode","disableScrollPropagation","_tipContainer","_tip","scrolledClass","_containerWidth","animated","_containerBottom","_containerLeft","containerHeight","containerWidth","layerPos","containerPos","autoPanPaddingTopLeft","autoPanPaddingBottomRight","togglePopup","_popupHandlersAdded","_movePopup","setPopupContent","unbindPopup","getPopup","LayerGroup","getLayerId","clearLayers","methodName","getLayer","getLayers","layerGroup","FeatureGroup","EVENTS","_propagateEvent","_popupContent","_popupOptions","featureGroup","Path","CLIP_PADDING","stroke","dashArray","lineCap","lineJoin","weight","fillColor","fillOpacity","_initElements","projectLatlngs","_updatePath","_pathRoot","vml","_stroke","_fill","_updateStyle","_updatePathViewport","_pathViewport","SVG_NS","svg","createSVGRect","SVG","getPathString","_createElement","_initPathRoot","_initPath","_initStyle","_path","_animatePathZoom","_endPathZoom","_updateSvgViewport","_pathZooming","vp","_openPopup","_latlngs","adj","VML","namespaces","coordsize","stroked","endcap","dashStyle","joinstyle","getContext","L_PREFER_CANVAS","CANVAS","_requestUpdate","_onClick","_onMouseMove","_updateRequest","_fireMapMoveEnd","_ctx","_canvasCtx","_drawPath","drawMethod","beginPath","_parts","Polygon","closePath","_checkIfEmpty","globalAlpha","restore","_containsPoint","_animatingZoom","_mouseInside","_updateCanvasViewport","translate","LineUtil","simplify","tolerance","sqTolerance","_reducePoints","_simplifyDP","pointToSegmentDistance","p1","p2","_sqClosestPointOnSegment","closestPointOnSegment","markers","_simplifyDPStep","newPoints","sqDist","maxSqDist","reducedPoints","_sqDist","clipSegment","useLastCode","codeOut","newCode","codeA","_lastCode","_getBitCode","codeB","_getEdgeIntersection","dot","Polyline","_convertLatLngs","smoothFactor","noClip","_originalPoints","_getPathPartStr","getLatLngs","setLatLngs","addLatLng","spliceLatLngs","closestLayerPoint","minDistance","minPoint","jLen","overwrite","_clipPoints","segment","lu","_simplifyPoints","polyline","PolyUtil","clipPolygon","clippedPoints","_code","_initWithHoles","hole","_holes","_holePoints","newParts","clipped","polygon","createMulti","Klass","_options","MultiPolyline","MultiPolygon","multiPolyline","multiPolygon","Rectangle","_boundsToLatLngs","setBounds","rectangle","Circle","radius","_mRadius","setRadius","lngRadius","_getLngRadius","pointLeft","_point","_radius","latRadius","getRadius","_getLatRadius","circle","CircleMarker","circleMarker","part","arc","w2","GeoJSON","geojson","addData","feature","features","geometries","geometry","coordinates","geometryToLayer","pointToLayer","coordsToLatLng","asFeature","resetStyle","onEachFeature","_setLayerStyle","vectorOptions","coords","coordsToLatLngs","levelsDeep","latLngToCoords","latLngsToCoords","latLngs","getFeature","newGeometry","geoJSON","PointToGeoJSON","toGeoJSON","multiToGeoJSON","jsons","isGeometryCollection","geoJson","originalHandler","newType","_getEvent","addPointerListener","addDoubleTapListener","_checkMouse","_filterClick","attachEvent","removePointerListener","removeDoubleTapListener","detachEvent","cancelBubble","Draggable","START","_fakeStop","returnValue","clientTop","getWheelDelta","wheelDelta","_skipEvents","skipped","related","caller","callee","timeStamp","elapsed","_lastClick","_simulatedClick","END","mousedown","touchstart","pointerdown","MSPointerDown","MOVE","dragStartTarget","_element","_dragStartTarget","_onDown","_disabled","_moving","_startPoint","_startPos","_newPos","_onMove","_onUp","srcElement","_animRequest","addHooks","removeHooks","inertia","inertiaDeceleration","inertiaMaxSpeed","inertiaThreshold","easeLinearity","worldCopyJump","Drag","_draggable","_onDragStart","_onDrag","_onDragEnd","_onPreDrag","_onViewReset","_panAnim","_positions","_times","_lastTime","_lastPos","pxCenter","pxWorldCenter","_initialWorldOffset","_worldWidth","worldWidth","halfWidth","newX1","newX2","noInertia","ease","speedVector","speed","limitedSpeed","limitedSpeedVector","decelerationDuration","noMoveStart","doubleClickZoom","DoubleClickZoom","_onDoubleClick","scrollWheelZoom","ScrollWheelZoom","_onWheelScroll","_delta","_lastMousePos","_startTime","_timer","_performZoom","_touchstart","_touchend","doubleTap","pre","touchend","trackedTouches","pointerId","onTouchEnd","newTouch","endElement","POINTER_CANCEL","POINTER_DOWN","POINTER_MOVE","POINTER_UP","_pointers","_pointerDocumentListener","addPointerListenerStart","addPointerListenerEnd","addPointerListenerMove","pointers","alreadyInArray","changedTouches","internalCb","pointerType","MSPOINTER_TYPE_MOUSE","buttons","touchZoom","bounceAtZoomLimits","TouchZoom","_onTouchStart","_zooming","viewCenter","_startCenter","_startDist","_centerOffset","_onTouchMove","_onTouchEnd","_scale","_updateOnMove","_getScaleOrigin","oldZoom","floatZoomDelta","roundZoomDelta","tap","tapTolerance","Tap","_fireClick","_holdTimeout","_isTapValid","_simulateEvent","simulatedEvent","initMouseEvent","BoxZoom","_pane","_onMouseDown","_startLayerPoint","_onMouseUp","_onKeyDown","_box","startPoint","box","newPos","_finish","boxZoomBounds","keyboardPanOffset","keyboardZoomOffset","Keyboard","keyCodes","up","_setPanOffset","_setZoomOffset","_onFocus","_onBlur","_addHooks","_removeHooks","_focused","_panKeys","codes","_zoomKeys","_inProgress","_marker","iconPos","Control","removeControl","addControl","corner","_controlCorners","removeFrom","_refocusOnMap","corners","_controlContainer","createCorner","vSide","hSide","Zoom","zoomInText","zoomInTitle","zoomOutText","zoomOutTitle","zoomName","_zoomInButton","_createButton","_zoomIn","_zoomOutButton","_zoomOut","_updateDisabled","zoomControl","Attribution","_attributions","addAttribution","_onLayerAdd","_onLayerRemove","setPrefix","removeAttribution","attribs","prefixAndAttribs","attributionControl","Scale","imperial","_addScales","_mScale","_iScale","centerLat","dist","maxMeters","_updateScales","_updateMetric","_updateImperial","meters","_getRoundNum","_getScaleWidth","maxMiles","miles","feet","maxFeet","pow10","Layers","collapsed","autoZIndex","baseLayers","overlays","_lastZIndex","_handlingClick","_addLayer","_onLayerChange","addBaseLayer","addOverlay","_form","_expand","_collapse","_layersLink","_onInputClick","_baseLayersList","_separator","_overlaysList","overlay","baseLayersPresent","overlaysPresent","_addItem","_createRadioElement","radioHtml","radioFragment","defaultChecked","layerId","inputsLen","PosAnimation","_el","_onTransitionEnd","_stepTimer","setInterval","_onStep","_getPos","stepPos","_transformRe","clearInterval","_tryAnimatedZoom","_tryAnimatedPan","_onPanTransitionStep","_onPanTransitionEnd","_duration","_easeOutPower","_offset","_animate","_step","_complete","_animId","_runFrame","_easeOut","zoomAnimationThreshold","_catchTransitionEnd","propertyName","_onZoomTransitionEnd","_nothingToAnimate","getElementsByClassName","backwards","_animateToCenter","_animateToZoom","_animating","_prepareBgBuffer","bg","initialTransform","scaleStr","front","bgLoaded","_getLoadedTilesPercentage","frontLoaded","_stopLoadingImages","_defaultLocateOptions","watch","maximumAge","enableHighAccuracy","locate","_locateOptions","geolocation","_handleGeolocationError","onResponse","_handleGeolocationResponse","_locationWatchId","watchPosition","getCurrentPosition","stopLocate","clearWatch","latAccuracy","accuracy","lngAccuracy","timestamp","Zoomify","_imageSize","_gridSize","_getGridSize","mapSize","_getBestFitZoom","gridSize","_getTileGroup","zoomify","_ceil","_nxCachebuster","nxSetCachebuster","valueOf","truncated","crumbOverflow","crumb","breadcrumb","sourceTypes","formatTypes","itunes","iTunesCategories","Arts","Design","Food","Literature","Business","Careers","Investing","Shopping","Comedy","Education","Training","Automotive","Aviation","Hobbies","Local","National","Regional","Health","Sexuality","Music","Alternative","Blues","Country","Electronic","Ambient","Breakbeat","Disco","Downtempo","Garage","House","IDM","Jungle","Progressive","Techno","Trance","Tribal","Folk","Freeform","Inspirational","Jazz","Latin","Metal","Oldies","Pop","Reggae","Rock","Soundtracks","World","Buddhism","Christianity","Hinduism","Islam","Judaism","Other","Spirituality","Medicine","History","Philosophy","Amateur","Outdoor","Professional","Technology","Gadgets","Podcasting","shareable","toPropertyKey","_defineProperties","hint","prim","assertThisInitialized","_getPrototypeOf","ws","trimBeginRegexp","trimEndRegexp","lpad","padstr","paddingLen","resolveNameToClass","suffix","klass","Command","altKey","charCode","metaKey","repeat","moveUp","moveDown","moveLeft","moveRight","passThru","toRaw","formattedData","NumberFormatter","orderSeparator","HUMANIZED_NUM_RE","integerPart","decimalPart","thousands","decimalParts","PercentFormatter","multiplier","tokens","DatetimeFormatter","includeDate","includeTime","includeMilli","DATE_RE","TIME_RE","ISO_SPLITTER_RE","_convert","jsDate","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","YYYYMMDD","HHmmssSSS","UTC","getUTCMilliseconds","EmailFormatter","SelectFormatter","command","blurred","renderError","changedAttributes","renderable","enterEditMode","currentEditor","exitEditMode","UriCell","EmailCell","PercentCell","IntegerCell","DatetimeCell","BooleanCellEditor","mouseDown","enterOrExitEditMode","SelectCellEditor","variable","evaluate","interpolate","setOptionValues","optionValues","setMultiple","_renderOptions","nvps","optionValue","optionText","optgroupName","optgroup","SelectCell","delimiter","selectedText","rawDatum","optionGroupValues","optionGroupValue","headerCell","Columns","Collection","makeCell","eq","EmptyRow","emptyText","td","setCellDirection","fullCollection","removeCellDirection","cycleSort","HeaderRow","_unshiftEmptyRowMayBe","insertRow","removeRow","moveToNextCell","updateEmptyRow","emptyRow","$children","$rowEl","makeComparator","PageableCollection","setSorting","maxOffset","insertColumn","removeColumn","ServerSideFilter","clearSearchBox","searchBox","showClearButtonMaybe","$clearButton","clearButton","_debounceMethods","methodNames","regexp","SelectRowCell","change","onKeydown","SelectAllHeaderCell","selectedModels","getSelectedModels","selectAllHeaderCell","headerCells","modelId","clearSelectedModels","selectOptions","clearValue","isSavedSearch","visual","keydown","zoomReset","zoomifyData","startImage","zoomifyDirectory","addWatermarks","zoomClose","getDimensions","h2","w1","h1","ZOOM_TOLERANCE","initialZoom","initialPan","mapOb","$tile","faSearchMinus","faSearchPlus","activeFocusDelay","trapQueue","tabbable","xtend","activeFocusTraps","activateTrap","trap","activeTrap","trapIndex","deactivateTrap","unpause","userOptions","returnFocusOnDeactivate","escapeDeactivates","firstTabbableNode","lastTabbableNode","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","paused","activateOptions","updateTabbableNodes","onActivate","addListeners","removeListeners","deactivateOptions","onDeactivate","returnFocus","previousActiveElement","tryFocus","getNodeForOption","getInitialFocusNode","checkFocusIn","checkPointerDown","checkClick","checkKey","optionName","clickOutsideDeactivates","isFocusable","allowOutsideClick","isEscapeEvent","isTabEvent","checkTab","tabbableNodes","isSelectableInput","defaultTheme","defaultClassName","generateClassName","generate","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","newObj","hasPropertyDescriptor","RESISTANCE_COEF","UNCERTAINTY_THRESHOLD","faUpload","categoryContextMenu","categoryList","RecentCategories","faFolderPlus","CATEGORY_BASE_EVENT","CATEGORY_EVENT","IMPORT","ORGANIZE_ASSETS","SEARCH_ALL_ASSETS","toCategoryId","fromCategoryId","currentCat","recent","RecentCategoriesCollection","CategoryAssetsCollection","directory","_CategoryController","CategoryTreeNodesCollection","catInfo","parentid","parentCategoryName","promises","getCategoryDetailsData","getAttributeProfile","beforeParentId","newParent","getDetails","assetCountStr","byteCountStr","subCategoryCountStr","fileCount","subCategoryCount","byteCount","currentCatDestroyed","ancestorOfCurrent","searchRules_listAll","getCategoryObjects","parentOnly","childrenNeeded","fetchChildren","fetchCategory","searchCategoryName","CategoryGalleryView","CategoryBreadCrumbView","crumbs","myCrumb","rootCat","selectedCrumbs","Selectpicker","CategoryGalleryHeaderView","breadCrumbView","$breadcrumbs","getCategoryBreadcrumbs","getCategoryAssets","catAssets","lastCategoryRoute","categoryViews","breadcrumbs","displayCategoriesAsAssets","CategoryListView","cmsConfig","homeRoute","appView","togglePages","createSvgIcon","RadioButtonIconRoot","RadioButtonIconBackground","RadioButtonUnchecked","RadioButtonIconDot","RadioButtonChecked","easeIn","easeOut","getRadioUtilityClass","_excluded","RadioRoot","SwitchBase","activeChannel","defaultCheckedIcon","_defaultIcon$props$fo","_defaultCheckedIcon$p","checkedProp","checkedIcon","onChangeProp","radioGroup","Slot","isHostComponent","sliderClasses","sliderUnstyledClasses","SliderRoot","marked","track","trackInverted","trackFalse","touchAction","WebkitTapHighlightColor","colorAdjust","SliderRail","rail","SliderTrack","SliderThumb","SliderValueLabel","SliderValueLabelUnstyled","valueLabel","valueLabelOpen","SliderMark","markActive","SliderMarkLabel","markLabel","markLabelActive","_componentsProps$root","_componentsProps$thum","_componentsProps$trac","_componentsProps$valu","isRtl","componentsProps","extendUtilityClasses","SliderUnstyled","Root","Rail","Track","ValueLabel","Mark","MarkLabel","as","getButtonGroupUtilityClass","ButtonGroupRoot","grouped","disableElevation","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","onBackgroundChannel","borderRightColor","disableFocusRipple","disableRipple","ButtonGroupContext","getFormGroupUtilityClass","FormGroupRoot","muiFormControl","useFormControl","fcs","formControlState","states","getCollapseUtilityClass","CollapseRoot","entered","collapsedSize","CollapseWrapper","CollapseWrapperInner","wrapperInner","addEndListener","collapsedSizeProp","inProp","onExiting","standard","timer","wrapperRef","autoTransitionDuration","isHorizontal","nodeRef","normalizedTransitionCallback","maybeIsAppearing","getWrapperSize","handleEnter","handleEntering","wrapperSize","transitionDuration","transitionTimingFunction","duration2","getAutoHeightDuration","handleExit","handleExiting","childProps","muiSupportAuto","newItemsEnabled","clientSearch","clientSearchKey","candidateSelectors","candidateSelector","msMatchesSelector","webkitMatchesSelector","candidate","candidateTabindex","regularTabbables","orderedTabbables","candidates","includeContainer","isNodeMatchingSelectorTabbable","getTabindex","documentOrder","sortOrderedTabbables","isNodeMatchingSelectorFocusable","isInput","isRadio","radioSet","nodes","getCheckedRadio","isTabbableRadio","isNonTabbableRadio","isHiddenInput","isHidden","isTabbable","focusableCandidateSelector","tabindexAttr","contentEditable","isContentEditable","shareMessage","originalOption","originalSticky","proxyOptions","lcfirst","processOptions","identifier","usingDefaultTemplates","contactSheetName","exportOptions","maxAttributes","resize","overriden","raf","stylesCreated","jQuery_resize","addResizeListener","removeResize","removeResizeListener","requestFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","cancelFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","resetTriggers","triggers","__resizeTriggers__","expand","firstElementChild","contract","lastElementChild","expandChild","checkTriggers","__resizeLast__","__resizeRAF__","__resizeListeners__","keyframeprefix","animationstartevent","domPrefixes","startEvents","elm","animationName","animationKeyframes","animationStyle","head","styleSheet","cssText","embedAvailable","embedSelected","historicalAvailable","itemLabel","codeLabel","Switch","isChecked","setIsChecked","getTransitionProps","_style$transitionDura","_style$transitionTimi","transitionDelay","reflow","_interopNamespace","React__namespace","_extends","UP","DOWN","preventDefaultTouchmoveEvent","rotationAngle","trackMouse","trackTouch","initial","swiping","xy","mouseMove","mouseUp","touchEnd","touchMove","touchStart","getDirection","absX","absY","rotateXYByAngle","angleInRadians","getHandlers","handlerProps","onStart","onMove","onUp","_ref2","_rotateXYByAngle","velocity","vxvy","eventData","onSwipeStart","onSwiping","cancelablePageSwipe","onSwiped","onEnd","onSwipedDir","onTap","cleanUpMouse","attachTouch","cleanup","tls","_ref3","_ref4","addState","cleanUpTouch","updateTransientState","useSwipeable","transientState","transientProps","_React$useMemo","stateSetter","handlers","_interopRequireWildcard","_SwipeableViews","SwipeableViewsContext","getDomTreeShapes","findNativeHandler","_extends2","_objectWithoutProperties2","_classCallCheck2","_createClass2","_possibleConstructorReturn2","_getPrototypeOf2","_inherits2","_reactSwipeableViewsCore","WebkitFlexShrink","flexShrink","axisProperties","rotationMatrix","scrollLength","clientLength","createTransition","property","easeFunction","applyRotationMatrix","pageX","pageY","adaptMouse","rootNode","domTreeShapes","nodeWhoClaimedTheScroll","goingForward","areNotAtStart","areNotAtEnd","SwipeableViews","_React$Component","containerNode","ignoreNextScrollEvents","viewLength","lastX","vx","isSwiping","started","transitionListener","touchMoveListener","activeSlide","indexCurrent","firstRenderTimeout","setRootNode","setContainerNode","setActiveSlide","updateHeight","handleSwipeStart","computedStyle","transformValues","rootStyle","tranformNormalized","handleSwipeMove","_this$props","ignoreNativeScroll","onSwitching","resistance","constant","_computeIndex","computeIndex","setIndexCurrent","displaySameSlide","handleTouchStart","handleSwipeEnd","indexNew","indexLatest","hysteresis","indexMax","onChangeIndex","handleTouchEnd","handleMouseUp","onMouseUp","handleMouseLeave","onMouseLeave","handleMouseMove","onMouseMove","handleScroll","heightLatest","renderOnlyActive","disableLazyLoading","_this2","getDisplaySameSlide","_this3","slideUpdateHeight","animateTransitions","onTransitionEnd","WebkitTransition","_this4","_this$props2","animateHeight","containerStyleProp","containerStyle","enableMouseEvents","slideStyleProp","slideStyle","slideClassName","springConfig","_this$state","touchEvents","mouseEvents","additionalTranstion","WebkitFlexDirection","getSwipeableViewsContext","indexChild","_default","objectWithoutPropertiesLoose","excluded","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","_checkIndexBounds","_constant","_getDisplaySameSlide","_mod","newStartX","getChildrenKey","oldKey","getListSubheaderUtilityClass","_base","textType","formLocked","formats","canUseShareMenu","gatherActions","shareMenu","actionStrs","actionStr","hasContents","canShareAssets","categoryNotEmpty","REVIEW_STATUS","APPROVAL_STATUS","REVIEW_STATUS_LABEL","DOWNLOAD_REQUEST_ACTION_LABEL","LIST","faCheckSquare","faImages","DOWNLOAD_REQUEST_ROUTES","DOWNLOAD_REQUEST_EVENT","LIST_ROUTE","VIEW_ROUTE","findCartModel","canEmail","mediaServicesEnabled","displayedDownloadOptionTypes","SavedCartModel","OptionTileModel","faLink","faLongArrowAltDown","assetSetShareOptions","collabCartShareActions","accessTokenActions","Feed","asset_total","attr_1_id","attr_2_id","copyright","feedURL","format_type","imageAssetId","item_id","item_id_label","item_type","item_type_label","itunesCategories","itunes_subtitle","keywordAttr","managing_editor","owner","ownerEmail","pubDateAttr","skip_days","skip_hours","subtitleAttr","ttl","cast_id","imageAsset","fetchImage","imageNotFound","rejectWith","ShareStatus","unsetProgressReportNotify","pollWait","jobTitle","progressMessageCount","progressMessages","runningTime","runningTimeLabel","secondsToReload","notifyOnComplete","estimatedTime","doneTest","preventDefaultPollingStatus","errObj","emailWhenDone","stopPolling","AccessTokens","getAllApprovedTokens","getAllPendingTokens","getUserTokens","Feeds","getAllFeedIds","getFeeds","ShareMediaService","authenticate","ShareMediaServices","getMediaServices","allowedServices","getAuthenticatedServices","ShareStatusView","statusModel","detailsUpdated","titleUpdated","progressUpdated","userExists","$details","CONTAINER_ID","STATUS_CONTAINER_ID","TOKEN_ASSETS_MINI","gotoAsset","CellImage","outlineColor","CheckboxCell","readOnlyChecked","approvalStatus","_readOnly","toalLoaded","visibleIndex","setVisibleIndex","getDownloadRequestApprovals","downloadRequestId","reactQueryGetDownloadRequestApprovals","cleanString","txt","decodeHTML","stripHTML","formItem","keyPieces","formValue","en","parseCustomJustificationFormData","customForm","justification","getFormItem","parseInCustomJustificationForm","customJustificationForm","formData","getCustomJustificationForm","getDownloadRequestDetails","reactQueryGetDownloadRequestDetails","GET_DOWNLOAD_REQUESTS_FIELD","GET_DOWNLOAD_REQUESTS_SORTABLE_FIELDS","GET_DOWNLOAD_REQUESTS_REVIEW_STATUS_FILTERS","GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_FIELD","GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_ORDER","GET_DOWNLOAD_REQUESTS_DEFAULT_REVIEW_STATUS","getDownloadRequestsFilterStatus","filterStatus","getDownloadRequests","filterText","reviewStatus","reactQueryGetDownloadRequests","ERROR_CODE","FETCH_ERROR_CODES","DownloadRequestApprovalsProviderPrimitive","reactQueryUtils","DownloadRequestApprovalsProvider","StyledScrollBorder","StyledFormDialog","DEFAULT_VALUES","messageEnabled","DownloadRequestConfirm","approvalCount","handleMessageEnableChange","labelPlacement","exportDownloadRequests","reviewDownloadRequest","entitySelector","notifyRequester","assetSourceType","portalContext","requester","requestDate","showApprovals","showConfirm","hideApprovals","hideConfirm","useDownloadRequestProvider","DownloadRequestProviderPrimitive","onUpdated","approvalsActive","setApprovalsActive","confirmActive","setConfirmActive","approvalObjext","setApprovalObject","mutation","submitApprovals","idRef","routed","excludeIds","includeIds","DownloadRequestProvider","setFilterText","setStatusFilter","useDownloadRequestsProvider","DownloadRequestsProviderPrimitive","downloadRequestProvider","sortFieldPref","setSortFieldPref","sortOrderPref","setSortOrderPref","filterStatusPref","setFilterStatusPref","exportToCSV","DownloadRequestsProvider","refetchQueries","CheckboxHeaderCell","readOnlyValue","letterSpacing","originalRow","fileType","DownloadRequestApprovalsListPrimitive","handleRowClick","handleRowKeyDown","DownloadRequestApprovalsList","StyledBox","transitionDurationDefault","enter","exit","oppositeDirection","SlidePanel","couldBeOpen","dummySpacer","puller","minFlingVelocity","mountedRefOnce","setCouldBeOpen","translationBeforeSwipe","lastTranslation","maxTranslateRef","maxTranslate","changeTransition","anchorRtl","getAnchor","rtlTranslateMultiplier","drawerStyle","webkitTransform","webkitTransition","backdropStyle","translateRatio","drawerEl","getDelta","withSlidePanel","SlidePanelProps","getDownloadRequestDetailsClass","downloadRequestDetailsClasses","DownloadRequestTabRoot","DownloadRequestDetailsTabsPrimitive","TabProps","DownloadRequestDetailsTabs","DownloadRequestDetailsTabPanelsPrimitive","downloadRequestDetails","DownloadRequestJustificationDetailsScrollBordered","DownloadRequestDownloadOptionsScrollBordered","DownloadRequestDetailsTabPanels","DownloadRequestDetailsRoot","listSubheaderClasses","DownloadRequestDetailsPrimitive","DownloadRequestDetails","DownloadRequestDetailsSlidePanel","DownloadRequestDetailsContainerPrimitive","DownloadRequestDetailsContainer","getIcon","FileIcon","ImageIcon","PDFIcon","HistoryIcon","AudioIcon","VideoIcon","DownloadRequestDownloadOptionListItem","getOptionKey","downloadRequestDownloadOptionsStyles","scrollBorder","DownloadRequestDownloadOptions","lastHeader","showSubHeader","shouldShowHeader","getOptionHeaderLabel","faListUl","DownloadRequestJustificationDetailsField","downloadRequestJustificationDetailsStyles","DownloadRequestJustificationDetails","DownloadRequestRequesterPaper","getDownloadRequestRequesterPaperContentUtilityClass","downloadRequestRequesterPaperContentClasses","DownloadRequestRequesterDate","formattedDate","DownloadRequestRequesterEmail","DownloadRequestRequesterName","DownloadRequestRequesterSourceRoot","DownloadRequestRequesterSource","displaySource","DownloadRequestRequesterPaperContentRoot","DownloadRequestRequesterPaperContentPrimaryRoot","DownloadRequestRequesterPaperContentSecondaryRoot","DownloadRequestRequesterPaperContent","ColoredAvatarRoot","DownloadRequestRequesterPaperRoot","AvatarProps","ContentProps","getDownloadRequestsHeaderUtilityClass","downloadRequestsHeaderClasses","DownloadRequestsStatusFilterRoot","FILTER_OPTIONS","DownloadRequestsStatusFilterPrimitive","provider","approvalStatusFilter","setApprovalStatusFilter","handleApprovalStatusFilter","DownloadRequestsStatusFilter","getSearchFilterExpandableUtilityClass","searchFilterExpandableClasses","SearchFilterExpandableFieldRoot","inputClasses","formControlClasses","SearchFilterExpandable","setExpanded","setFiltered","handleFilterChange","DownloadRequestsTextFilterRoot","DownloadRequestsTextFilterPrimitive","DownloadRequestsTextFilter","DownloadRequestFiltersRoot","DownloadRequestsFiltersPrimitive","DownloadRequestsFilters","DownloadRequestsHeaderRoot","DownloadRequestsHeaderTitleRoot","DownloadRequestsHeaderActionsRoot","DownloadRequestsHeaderPrimitive","faClipboardCheck","faCloudDownload","DownloadRequestsHeader","menuActions","UserCell","Generic","faUserTimes","DownloadRequestsListPrimitive","noRecords","DownloadRequestsList","DownloadRequestsRoot","DownloadRequestsPrimitive","DownloadRequestsHeaderProps","DownloadRequests","getDownloadRequestApprovalsFooterUtilityClass","DownloadRequestApprovalsFooterRoot","DownloadRequestApprovalsFooterPrimitive","DownloadRequestApprovalsFooter","DownloadRequestApprovalsPrimitive","contentRef","panelOpen","setPanelOpen","PaperProps","StyledDownloadRequestApprovals","DownloadRequestApprovals","DownloadRequestApprovalsContainerPrimitive","DownloadRequestApprovalsContainer","DownloadRequestsContainerPrimitive","DownloadRequestsContainer","DownloadRequestsView","uniqueShowAction","CATEGORY_SHARE_BASE_EVENT","CATEGORY_SHARE_EVENT","_assetIds","Templates","DownloadShareTemplate","EmailShareTemplate","ftp","FTPShareTemplate","globalSearch","GlobalSearchShareTemplate","mediaService","MediaServiceShareTemplate","UserShareTemplate","DownloadRequestService","AssetShareController","CategoryShareController","SavedCartController","ShareStatusModel","routeToSharedResource","ShareMediaServicesCollection","feeds","FeedsCollection","ShareWays","contextOptions","ignoreDownloadWarningTypes","manualOption","orginalOption","configurableOptions","getDownloadWarnings","warnings","messageCount","ConfirmDownloadWarningsTemplate","yesEvent","yesEventArgs","DownloadOptionsView","parseSelectedDownloadOptions","CustomFormCollection","formName","progressReport","yourEmail","adminEmail","repurposeOptions","processId","hideOnSelect","AccessTokensCollection","setFilterStr","publicLink","mine","publicLinks","AccessTokenModel","hasOptions","expirationTime","setHours","contactSheet","selectedOptions","isManualRepurpose","isEmbed","editableOptions","setUserSelectedDownloadOptions","categoryAssets","CategoryAssets","userValues","labVal","ele","waitForDam","videoCount","audioCount","documentCount","imageCount","toShareable","prepareDownload","shareStatusModel","ShareableModel","way","supports","shareWay","shareWays","getShareData","feed","hereItIsMsg","providedModel","FeedModel","fullName","makeUniqueName","toggleFavorite","emailAssets","_emailAssets","fail","msg","PromptViewTextareaTemplate","$neededInformation","shareableMenu","ShareWay","shareData","appendMetadata","errorCatastrophe","hoursToLive","sizeUncompressed","warningMessage","prepareAssets","prepareCart","_downloadForToken","prepareCartId","prepareAssetsArgs","compression","reduceFileSize","_rpc","newConst","tests","rpcAndWait","rpcMethod","rpcAndShare","statQuery","systemLogs","emailArgs","defaultEmailArgs","autoCc","customType","emailCc","emailFrom","emailSubject","videoAssets","deferred","setCartId","linkHandler","PublicLinkModel","shareSavedThing","thingCache","thingLabel","shareTitle","shareFunction","shareType","__isView__","faPlusCircle","isNotPublicUser","cartManageArchive","savedCartManageArchive","cartExpirationActions","savedCartExpirationActions","cartBarActions","savedCartBarActions","cartBarActionsMobile","savedCollection","savedCollectionContextMenu","cartHeaderActions","cartSavedHeaderActions","AddAssetsToCategoryView","CartDeleteWarningsView","Select_FromItem","deselect","$input","getAutocompleteLabel","Select_NewItem","uniqueKey","uniqueMessage","Select_New","idKey","hasNewItems","onAddItemClick","onRemoveItemClick","nxData","Select_From","_addedIds","_removedIds","newItemsView","additionalAttrs","_originalIds","newItems","newItemOpts","SelectNewView","newLabel","removedIdx","addedIdx","deselectItem","getSelection","onSelectChange","toggleSelected","selectItem","toSelectedItemFromAutocomplete","ignoreUsers","Select_SelectedItem","Select_Selected","TitleAttribute","keyEvents","backspace","keyboardDelete","listItem","focusItemAtIndex","KeyEvents","Select","requiresSelection","selectionUpdated","formChanged","checkForm","SelectFromView","SelectionView","$selectedCount","new","newItem","selectFromView","getViewByName","ANIMATE","CLOSING","DISMISSIBLE","MODAL","OPEN","OPENING","APP_CONTENT_SELECTOR","CLOSE_EVENT","OPEN_EVENT","SCRIM_SELECTOR","MDCDismissibleDrawerFoundation","animationFrame_","animationTimer_","elementHasClass","notifyClose","notifyOpen","saveFocus","restoreFocus","focusActiveNavigationItem","trapFocus","releaseFocus","isOpening","isClosing","runNextAnimationFrame_","isElement_","closed_","opened_","MDCModalDrawerFoundation","handleScrimClick","MDCDrawer","list_","focusTrapFactory","listFactory","listEl","focusTrapFactory_","surfaceEl","scrim_","handleScrimClick_","focusTrap_","initialFocus","handleKeydown_","previousFocus_","previousFocus","activeNavItemEl","LIST_ITEM_ACTIVATED_CLASS","cleanUpResizable","resizeTargets","prepareResizable","resizeTargetSelector","startSize","resizableGetStartSize","startHeigh","resizeUserPref","resizeStartWidth","resizeStartHeight","resizeDirection","resizeMinWidth","resizeMinHeight","resizeUsingPercent","resizeStart","toggleResizable","resizeDisabled","_formChanged","resizeDragFrom","checkInputsReady","hideDrawer","inputChanged","inputsReady","mdcDrawerClosing","submitted","confirmedUnsavedChanges","confirmHide","onmdcdrawerclosed","showDrawer","inputReadyTimeout","dragresizestart","dragresizeend","dragresizing","dragresizereset","resizeMaxHeight","resizeMaxWidth","Resizable","materialDrawer","materialOptions","escapeKey","MaterialDrawer","bodyViews","getSavedCart","CartSingleton","SavedCartSingleton","CurrentCartController","CartAssetController","emailWhenReady","unarchiveEmailWhenReady","unarchiveEmail","unarchiveType","SearchRulesCollection","disableFutureConfirm","deleteCartAssets","warningObj","failedAssetCount","failedAssets","SelectView","newSavedCarts","newSavedCart","cartIds","cartId","pat","addedIds","createObjectPackage","CartGalleryView","CartGalleryHeaderView","SavedCartGalleryView","SavedCartActionsBar","savedCartBarView","$cartTitle","$savedCartBar","SavedCartGalleryHeaderView","inCart","assetIdArr","lastCartRoute","fetchCurrentCart","cacheSelection","assetIdAr","fetchSavedCart","menuView","ABBlock","restriction","sourceCategoryId","sourceCategoryName","viewCid","setCid","assetCollection","ABBlocks","updateCustomization","customizationModel","custValues","custBlock","blockTypes","textTypes","area","outputTypes","indd","jpg","pdf","png","restrictions","ABTemplate","customizable","outputs","customization","abTitle","blockCollection","ABCustomizationModel","ABBlocksCollection","templateModel","canPublish","templateBlocks","ABTemplateIsActive","ABTemplateModel","ABTemplatePreviewView","custPreview","quickZoom","AssetSelectListItemView","elementName","blockId","siblings","ABCategoryAssets","getABAssets","setCategoryId","ABBlockView","childViewCollection","ABCategoryAssetsCollection","getChildViewCollection","isSyncing","updateModelValue","readonly","radioChange","resetChildviews","showLoading","ABBlocksView","cacheQueries","faLock","ABCustomizationsListView","ABTemplateTabsView","renderOnInstatiate","adBuilder","currentTemplate","userCustomizations","ABTemplateView","templatePreview","templateTabs","abTemplateModel","$abTitle","abCustomizationModel","$abLabel","$abDescription","abLabel","abDescription","ABAssetTemplatesView","ABCustomizationDownloadView","ABCustomizationNameView","cancelCustomizationSave","ABCustomizations","setTemplates","ABAssets","resetSearchParams","fetchTemplates","ABGalleryHeaderView","ABGalleryView","ABCustomizationsCollection","templateAssets","ABAssetsCollection","customTemplate","saveResult","progressUuid","fetchResult","cust","csOptions","tableRow","LABEL_FLOAT_ABOVE","LABEL_SHAKE","MDCFloatingLabelFoundation","shakeAnimationEndHandler_","handleShakeAnimationEnd_","registerInteractionHandler","deregisterInteractionHandler","shake","shouldShake","MDCFloatingLabel","evtType","LINE_RIPPLE_ACTIVE","LINE_RIPPLE_DEACTIVATING","MDCLineRippleFoundation","transitionEndHandler_","registerEventHandler","deregisterEventHandler","setRippleCenter","xCoordinate","isDeactivating","MDCLineRipple","NOTCH_ELEMENT_SELECTOR","NOTCH_ELEMENT_PADDING","OUTLINE_NOTCHED","OUTLINE_UPGRADED","MDCNotchedOutlineFoundation","setNotchWidthProperty","removeNotchWidthProperty","notch","notchWidth","closeNotch","MDCNotchedOutline","notchElement_","removeProperty","ROOT_SELECTOR","MDCTextFieldCharacterCounterFoundation","setCounterValue","currentLength","MDCTextFieldCharacterCounter","POINTERDOWN_EVENTS","INTERACTION_EVENTS","MDCTextFieldFoundation","foundationMap","isFocused_","receivedUserInput_","isValid_","useNativeValidation_","helperText_","characterCounter_","characterCounter","leadingIcon_","leadingIcon","trailingIcon_","trailingIcon","activateFocus","inputBlurHandler_","inputInputHandler_","handleInput","setPointerXOffset_","setTransformOrigin","textFieldInteractionHandler_","handleTextFieldInteraction","validationAttributeChangeHandler_","attributesList","handleValidationAttributeChange","getNativeInput_","shouldAlwaysFloat_","isBadInput_","registerTextFieldInteractionHandler","deregisterTextFieldInteractionHandler","registerInputInteractionHandler","deregisterInputInteractionHandler","registerValidationAttributeChangeHandler","deregisterValidationAttributeChangeHandler","getNativeInput","activateLineRipple","deactivateLineRipple","setLineRippleTransformOrigin","shakeLabel","closeOutline","validationObserver_","setCharacterCounter_","nativeInput","styleValidity_","styleFocused_","showToScreenReader","targetEvent","targetClientRect","normalizedX","autoCompleteFocus","isNativeInputValid_","setValid","setUseNativeValidation","useNativeValidation","isDisabled","setDisabled","styleDisabled_","setHelperTextContent","setLeadingIconAriaLabel","setAriaLabel","setLeadingIconContent","setTrailingIconAriaLabel","setTrailingIconContent","validity","badInput","setValidity","HELPER_TEXT_PERSISTENT","HELPER_TEXT_VALIDATION_MSG","ARIA_HIDDEN","ROLE","MDCTextFieldHelperTextFoundation","setPersistent","isPersistent","setValidation","isValidation","inputIsValid","helperTextIsPersistent","validationMsgNeedsDisplay","hide_","MDCTextFieldHelperText","ICON_EVENT","ICON_ROLE","MDCTextFieldIconFoundation","savedTabIndex_","interactionHandler_","getAttr","notifyIconAction","isEnterKey","MDCTextFieldIcon","lineRippleFactory","helperTextFactory","characterCounterFactory","iconFactory","labelFactory","outlineFactory","labelElement","lineRippleElement","lineRipple_","outlineElement","outline_","helperTextStrings","hasHelperLine","helperTextEl","characterCounterStrings","characterCounterEl","iconElements","ripple","createRipple_","pattern","minLength","getRootAdapterMethods_","getInputAdapterMethods_","getLabelAdapterMethods_","getLineRippleAdapterMethods_","getOutlineAdapterMethods_","getFoundationMap_","getAttributesList","isOutlined","isSurfaceActive","ponyfill","AssetOptionsView","stickyPref","proxyOpts","proxySelected","isCategory","$originalOption","originalToggled","labelKeyed","CreatePDFTemplateItemView","pdfDownloadOption","defaultEngine","defaultTemplate","defaultTemplates","uniqueIdentifier","labelClicked","smil","CreatePDFTemplateItemsView","CreatePDFOptionsView","defaultTitle","assetAttrs","selectedAttrSet","setListView","AssetAttributesSelectReactView","templateListView","titleOb","$setListView","$templateListView","$toggleContainer","$toggle","$pdfOptions","$maxLength","displayLabels","highRes","changeAttributeSetMaxLength","nxVal","getSelectedAttributes","togglePDFOptions","createPDFOptionsView","MaterialTextFields","ExportMetadataView","handleAttributeSelectionChange","hasManualRepurpose","hasManualRepurposeOptions","$derivativesSelected","onlyExportAttributes","exportSelected","derivativesSelected","$attributeCheckbox","$attributeSets","$embedCheckbox","$attributeOptions","$embedOptions","toggleEmbedAllowed","$setListPanel","toggleAttributeOptions","toggleEmbedOptions","userPrefs","isTrue","exportMetadataView","optionCount","presetProcess","contactSheetModel","metadataModel","formatted","embedMetadata","proxies","formatTypeOptions","organizeContentsBy","organizeByTypes","folderPath","usingIndesign","pdfTemplate","pdfExportPreset","contextOpts","PublicLinks","getUserPublicLinkObjects","readAll","PublicLinksCollection","plink","handleErr","userProfile","PREFS_ID","SHOW_USERS_AS_TEXT","getUserUploadCategory","allUsers","UsersCollection","allGroups","GroupsCollection","UserAssetAttributeSetModel","aId","getPropertyObject","duplicateKeys","modelValues","UserProfileModel","autogeneratePassword","password1","password2","userSelfRegistration","getAvailableLocales","userCountry","userLanguage","setUserPreferences","changeLanguage","reload","setUserPreference","themeProperties","setThemeMode","getSwitchUtilityClass","SwitchRoot","switchBase","SwitchSwitchBase","defaultColor","defaultDisabledColor","switchTrackDisabled","SwitchTrack","switchTrack","SwitchThumb"],"mappings":"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","file":"23.bundle.min.js?2.22.31.f488ddff.1688766848291","sourcesContent":["export {default} from './Theme';\nexport * from './Theme';\n\nexport {default as withTheme} from './withTheme';\nexport {default as Logo} from './Logo';\n\nexport * from './styled';\nexport * from './composeClasses';\nexport * from './types';\n","import axios from 'axios';\n\nimport Netx, {dispatcher} from '@netx/core/bootstrap';\n\n/** server error */\nexport type ErrorResult = {\n\tcode: Codes;\n\tdata?: null;\n\tmessage: string;\n\tresult: string;\n};\n\n/** server error response */\nexport type ErrorResponse = {\n\terror: T;\n};\n\n/** server success response */\nexport type SuccessResponse = {\n\tresult: T;\n};\n\nexport class QueryError extends Error {\n\tcode: Codes;\n}\n\nexport type QueryPager = {\n\tstartIndex: number;\n\tsize: number;\n};\n\nexport type QuerySort = {\n\tfield: F;\n\torder: typeof QUERY_SORT_ORDER[keyof typeof QUERY_SORT_ORDER];\n};\n\nexport const QUERY_SORT_ORDER = {\n\tASCENDING: 'asc',\n\tDESCENDING: 'desc',\n};\n\nconst sessionErrors = [6, 3001, 3002, 3003];\n\nexport interface QueryPromise extends Promise {\n\tcancel(): void;\n}\n\nexport const netxQueryDam = () => {\n\tconst client = axios.create({\n\t\tbaseURL: Netx.URL.api,\n\t});\n\tclient.defaults.headers.common['Content-Type'] = 'application/json';\n\n\tconst source = axios.CancelToken.source();\n\n\t// Back it up\n\tconst _post = client.post;\n\t// And wrap it\n\t// We can ignore ts check on this, because as long as we do not modify the response\n\t// data, we will still be getting proper types out\n\t// For some reason, assigning the _post call to a var and returning is not valid but\n\t// just returning the _post call is valid (something in the abstract types)\n\t// @ts-ignore\n\tclient.post = (method, data = [], config = {}) => {\n\t\tconst {session} = Netx;\n\t\t// every succesful sync resets the server's logout timer; reset our client one too.\n\t\tsession?.resetLogoutTimer();\n\n\t\tif (!(session?.get('publicMethods') || []).includes(method)) {\n\t\t\t((data as unknown) as any[]).unshift(\n\t\t\t\tsession.getToken() || session.getKey(),\n\t\t\t);\n\t\t}\n\n\t\tconst promise = _post(\n\t\t\tmethod,\n\t\t\t{\n\t\t\t\tid: Date.now(),\n\t\t\t\tdataContext: 'json',\n\t\t\t\tjsonrpc: '2.0',\n\t\t\t\tmethod,\n\t\t\t\tparams: data,\n\t\t\t} as unknown,\n\t\t\t{...config, cancelToken: source.token},\n\t\t).then((response) => {\n\t\t\tif (response.data.error as ErrorResponse) {\n\t\t\t\tconst code = response.data.error.code;\n\t\t\t\tif (sessionErrors.includes(code)) {\n\t\t\t\t\t// If we have a token, some calls with give sessionErrors while others will pass.\n\t\t\t\t\t// If not, a session error means our key is invalid.\n\t\t\t\t\tif (!session?.getToken()) dispatcher.trigger('session:expire');\n\t\t\t\t}\n\t\t\t\tconst error = new QueryError(response.data.error.message);\n\t\t\t\terror.code = code;\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tsession?.resetLogoutTimer();\n\n\t\t\treturn response;\n\t\t});\n\n\t\t// For react query to cancel on unmount (or any other to cancel via the promise)\n\t\t// TODO: soon we can remove this as axios now supports passing signal\n\t\t// just need to hunt down anything depending on this behvior and pass along the signal\n\t\t// from react query\n\t\t(promise as QueryPromise).cancel = () => {\n\t\t\treturn source.cancel('cancelled by external script');\n\t\t};\n\n\t\treturn promise;\n\t};\n\n\treturn client;\n};\n\nexport default netxQueryDam;\n","import React from 'react';\n\nimport {FormHelperText} from '@mui/material';\n\nimport {FormValidationError} from '../../';\n\nexport interface ErrorFieldProps {\n\tdisabled?: boolean;\n\terror?: FormValidationError;\n\thide?: boolean;\n}\n\nconst ErrorField: React.FunctionComponent = ({\n\tdisabled = false,\n\terror,\n}) => {\n\tif (!error) return null;\n\n\treturn (\n\t\t\n\t\t\t{error.message}\n\t\t\n\t);\n};\n\nexport default ErrorField;\n","import moment, {Moment} from '@netx/core/lib/netx-moment';\nimport React, {useCallback} from 'react';\n\nimport {dateToHTML} from '@netx/core/lib/underscore-netx';\n\nimport clsx from 'clsx';\n\nimport {TextField, TextFieldProps, CircularProgress} from '@mui/material';\nimport {LocalizationProvider} from '@mui/x-date-pickers/LocalizationProvider';\nimport {\n\tDatePicker,\n\tDatePickerProps as MuiDatePickerProps,\n} from '@mui/x-date-pickers';\nimport {AdapterMoment} from '@mui/x-date-pickers/AdapterMoment';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\n\nimport {DateValue} from '@netx/core-asset/models/attribute';\nimport useSharedRef from '@netx/core-components/hooks/useSharedRef';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {useFormInput} from '../';\nimport ErrorField from '../ErrorField';\nimport type {CommonFieldPropsWithTextField} from '../typings';\nimport {useErrorFocus} from '../hooks/useErrorFocus';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflexDirection: 'column',\n\t\t\twidth: '100%',\n\t\t\t// account for calendar icon button\n\t\t\t'& .MuiInputLabel-formControl:not(.MuiInputLabel-shrink)': {\n\t\t\t\tmaxWidth: 'calc(100% - 56px) !important',\n\t\t\t},\n\t\t},\n\t\tinputLabel: {},\n\t\tloading: {\n\t\t\tposition: 'absolute',\n\t\t\tright: 10,\n\t\t\ttop: 10,\n\t\t\t'& circle': {\n\t\t\t\tstrokeWidth: 2,\n\t\t\t},\n\t\t},\n\t});\n\nconst getValueFromPickerDate = (date: Moment) => {\n\tif (!date) return null;\n\n\tif (!(date instanceof moment)) return date.toString();\n\n\ttry {\n\t\treturn date.format('YYYY-MM-DD');\n\t} catch (ex) {\n\t\tconsole.log(`error converting date`, date, ex);\n\t}\n\treturn null;\n};\n\n// Note: inputProps will be applied to the datepicker wrapping element and not the input\n// super annoying - and hopefully gets worked out someday\n// This will also cause other issues, like the value not actually being applied to the input\n// For these reasons we cannot allow it to be passed at this time\nexport type DateFieldProps = Omit<\n\tCommonFieldPropsWithTextField,\n\t'onError' | 'ref'\n> &\n\tOmit<\n\t\tMuiDatePickerProps,\n\t\t'label' | 'onChange' | 'renderInput' | 'value'\n\t> & {\n\t\tonChange?: (value: DateValue) => void;\n\t};\n\n// DatePicker passes a ref to the input but we would also like to have a ref to the input\n// need to wrap the text field and share the refs\ntype DateTextFieldProps = {\n\terror?: boolean;\n\tinputRef?: React.Ref;\n} & TextFieldProps;\nconst DateTextField: React.FunctionComponent = ({\n\terror,\n\tinputRef,\n\t...props\n}) => {\n\tconst innerRef = useSharedRef(null, [inputRef]);\n\tuseErrorFocus({\n\t\terror,\n\t\tinputRef: innerRef,\n\t});\n\n\treturn ;\n};\n\nconst DateField = ({\n\tclasses,\n\n\tchanged,\n\tclassName,\n\tdisabled,\n\terror,\n\tform,\n\tformFieldOptions,\n\tonChange,\n\thideErrorMessage,\n\tloadingValue,\n\tname,\n\tplaceholder,\n\treadOnly,\n\trequired,\n\tvalue,\n\n\t...props\n}: WithStyles & DateFieldProps) => {\n\tvalue = value == null ? null : value;\n\tif (value && value.includes('/')) {\n\t\tvalue = dateToHTML(value);\n\t}\n\n\tuseFormInput(name, value, form, {required, ...formFieldOptions});\n\n\tconst handleChange = useCallback(\n\t\t(date: Moment) => {\n\t\t\tconst value = getValueFromPickerDate(date);\n\n\t\t\tform?.setValue(name, value);\n\t\t\tonChange?.(value);\n\t\t},\n\t\t[form?.setValue, name, onChange],\n\t);\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{loadingValue ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\ttextFieldProps.InputProps?.endAdornment\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tinputProps={{\n\t\t\t\t\t\t\t\t\t...textFieldProps.inputProps,\n\t\t\t\t\t\t\t\t\t...props.inputProps,\n\t\t\t\t\t\t\t\t\tplaceholder:\n\t\t\t\t\t\t\t\t\t\tplaceholder || textFieldProps.inputProps?.placeholder,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tInputLabelProps={{\n\t\t\t\t\t\t\t\t\tclassName: classes.inputLabel,\n\t\t\t\t\t\t\t\t\t...textFieldProps.InputLabelProps,\n\t\t\t\t\t\t\t\t\t...props.InputLabelProps,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t}}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\n\t\t\t{!hideErrorMessage ? (\n\t\t\t\t\n\t\t\t) : null}\n\t\t
\n\t);\n};\n\nexport default withStyles(styles, {\n\tname: 'Form-Inputs-Date',\n})(React.memo(DateField));\n","import React, {useCallback, useEffect, useRef} from 'react';\n\nimport equal from 'fast-deep-equal/es6/react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {useRefState, useComponentIsMounted} from '@netx/core-components/hooks';\nimport {isEmptyValue} from '../util';\nimport {valuesMatch} from '../util';\n\nexport type FormAction = string;\nexport type FormActions<\n\tTValues extends FormValues = FormValues,\n\tTAction extends FormAction = FormAction\n> = {\n\t[Property in keyof TValues]: TAction | undefined;\n};\n\nexport type FormChanges = Partial<\n\tRecord\n>;\n\nexport type FormFieldRef = Record<\n\tkeyof TValues,\n\t{\n\t\tname: keyof TValues;\n\t\toptions: FormFieldRefOptions;\n\t}\n>;\n\nexport interface FormFieldRefOptions {\n\tvalidator?: (value: any) => true | Error | Promise;\n\thasChanged?: (\n\t\tvalue: any,\n\t\toriginalValue: any,\n\t\tmultipleValues: boolean,\n\t\taction?: TAction,\n\t) => boolean;\n\trequired?: boolean;\n\tvalue?: any;\n\taction?: TAction;\n}\n\nexport type FormMultiFields = Record<\n\tkeyof TValues,\n\tany\n>;\nexport type FormMultipleValues<\n\tTValues extends FormValues = FormValues\n> = Record;\n\nexport interface FormOptions<\n\tTValues extends FormValues = FormValues,\n\tTAction extends FormAction = FormAction,\n\tTReturn = any\n> {\n\t/** Validate regardless if field has changed */\n\talwaysValidate?: boolean;\n\tmultipleValues?: FormMultipleValues;\n\tonChange?: (hasChanged: boolean, isValid: boolean) => void;\n\tonReset?: () => void;\n\tonSubmit?: (\n\t\tvalues: TValues,\n\t\tchanges?: FormChanges,\n\t\tactions?: FormActions,\n\t) => Promise | void;\n\tresetOnSubmit?: boolean;\n\tresetWithCurrentValues?: boolean;\n\t/** wins over `resetWithCurrentValues` */\n\tresetWithOriginalValues?: boolean;\n\tsubmitLabel?: string;\n\tremoveValueOnUnregister?: boolean;\n}\n\nexport type FormValidationError = {\n\tmessage: string;\n\ttype: string;\n};\n\nexport type FormValidationErrors = Record<\n\tkeyof TValues,\n\tFormValidationError\n>;\n\nexport type FormValues = Record;\n\nconst DEFAULT_OPTIONS: FormOptions = {\n\talwaysValidate: false,\n\tremoveValueOnUnregister: true,\n\tresetOnSubmit: false,\n\tresetWithOriginalValues: false,\n\tsubmitLabel: i18n.t('i18n.submit'),\n};\n\nexport default function useForm<\n\tTValues extends FormValues = FormValues,\n\tTAction extends FormAction = FormAction,\n\tTReturn = any\n>(values?: TValues, formOptions?: FormOptions) {\n\tconst {act, shouldAct} = useComponentIsMounted();\n\n\tconst [options, optionsRef, setOptions] = useRefState({\n\t\t...DEFAULT_OPTIONS,\n\t\t...formOptions,\n\t} as FormOptions);\n\tconst lastFormOptionsRef = useRef(formOptions);\n\tuseEffect(() => {\n\t\tif (equal(lastFormOptionsRef.current, formOptions)) return;\n\t\tlastFormOptionsRef.current = formOptions || {};\n\t\tact(() =>\n\t\t\tsetOptions({\n\t\t\t\t...DEFAULT_OPTIONS,\n\t\t\t\t...formOptions,\n\t\t\t} as FormOptions),\n\t\t);\n\t}, [formOptions]);\n\n\tconst multiFieldsRef = useRef({} as FormMultiFields);\n\tconst fieldRef = useRef({} as FormFieldRef);\n\n\tconst [isSubmitting, isSubmittingRef, setIsSubmitting] = useRefState(false);\n\tconst [submissionError, submissionErrorRef, setSubmissionError] = useRefState<\n\t\tstring | null\n\t>(null);\n\n\tconst [\n\t\tformMultipleValues,\n\t\tformMultipleValuesRef,\n\t\tsetFormMultipleValues,\n\t] = useRefState(\n\t\toptions.multipleValues || ({} as FormMultipleValues),\n\t);\n\tconst [formValues, formValuesRef, setFormValues] = useRefState(\n\t\tvalues || ({} as TValues),\n\t);\n\tconst [originalValues, originalValuesRef, setOriginalValues] = useRefState(\n\t\tformValues as TValues,\n\t);\n\tconst [formActions, formActionsRef, setFormActions] = useRefState(\n\t\t{} as FormActions,\n\t);\n\tconst [formChanges, formChangesRef, setFormChanges] = useRefState(\n\t\t{} as FormChanges,\n\t);\n\tconst [formErrors, formErrorsRef, setFormErrors] = useRefState(\n\t\t{} as FormValidationErrors,\n\t);\n\tconst [hasChanged, hasChangedRef, setHasChanged] = useRefState(false);\n\tconst [isValid, isValidRef, setIsValid] = useRefState(true);\n\n\t// Setup/teardown\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tmultiFieldsRef.current = {} as FormMultiFields;\n\t\t\tfieldRef.current = {} as FormFieldRef;\n\t\t};\n\t}, []);\n\n\t// When values passed in change, merge with current\n\tconst lastValuesRef = useRef(values);\n\tuseEffect(() => {\n\t\tif (equal(lastValuesRef.current, values)) return;\n\t\tlastValuesRef.current = values;\n\t\tsetOriginalValues(values || ({} as TValues));\n\t\tsetFormValues(values || ({} as TValues));\n\t}, [values]);\n\n\t// When multiple values passed in change\n\tuseEffect(() => {\n\t\tif (equal(formMultipleValuesRef.current, options.multipleValues)) return;\n\t\tsetFormMultipleValues(\n\t\t\toptions.multipleValues || ({} as FormMultipleValues),\n\t\t);\n\t}, [options.multipleValues]);\n\n\t// When our data/validation changes\n\tuseEffect(() => {\n\t\tconst {onChange} = optionsRef.current;\n\t\tonChange && onChange(hasChanged, isValid);\n\t}, [hasChanged, isValid]);\n\n\t// When changes occur\n\tuseEffect(() => {\n\t\tsetHasChanged(!!Object.keys(formChanges).length);\n\t}, [formChanges]);\n\n\t// When errors change\n\tuseEffect(() => {\n\t\tsetIsValid(!Object.keys(formErrors).length);\n\t}, [formErrors]);\n\n\t/** Get action for field */\n\tconst getAction = useCallback((fieldName: keyof TValues):\n\t\t| TAction\n\t\t| undefined => {\n\t\treturn formActionsRef.current[fieldName];\n\t}, []);\n\n\t/** Field has error */\n\tconst hasError = useCallback(\n\t\t(fieldName: keyof TValues, type: string, message: string) => {\n\t\t\tconst existing = formErrorsRef.current[fieldName];\n\t\t\treturn existing && existing.type === type && existing.message === message;\n\t\t},\n\t\t[],\n\t);\n\n\t/** Field(s) have error */\n\tconst inErrors = useCallback(\n\t\t(fieldNames: keyof TValues | Array) => {\n\t\t\tif (!Array.isArray(fieldNames)) fieldNames = [fieldNames];\n\t\t\treturn Object.keys(formErrorsRef.current).some((key) =>\n\t\t\t\t(fieldNames as Array).includes(key),\n\t\t\t);\n\t\t},\n\t\t[],\n\t);\n\n\t/** Check if field has changed */\n\tconst checkFieldChanged = useCallback(\n\t\t(\n\t\t\tfieldName: keyof TValues,\n\t\t\tvalue: any,\n\t\t\toriginalValue: any,\n\t\t\tmultipleValues: boolean,\n\t\t\taction?: TAction,\n\t\t): boolean => {\n\t\t\tconst field = fieldRef.current[fieldName];\n\t\t\tif (!field) return false;\n\n\t\t\tconst {hasChanged} = field.options;\n\n\t\t\t// Field did not provide its own method\n\t\t\tif (!hasChanged) {\n\t\t\t\treturn !valuesMatch(value, originalValue, multipleValues);\n\t\t\t}\n\n\t\t\treturn hasChanged(value, originalValue, multipleValues, action);\n\t\t},\n\t\t[],\n\t);\n\n\t/** Clear action for field */\n\tconst clearAction = useCallback((fieldName: keyof TValues): void => {\n\t\tif (!fieldRef.current[fieldName]) return;\n\n\t\tsetFormActions((actions) => {\n\t\t\tconst _actions = {...actions};\n\t\t\tdelete _actions[fieldName];\n\t\t\treturn _actions;\n\t\t});\n\t}, []);\n\n\t/** Clear error for field(s) */\n\tconst clearError = useCallback(\n\t\t(fieldNames?: keyof TValues | Array) => {\n\t\t\tif (fieldNames && !inErrors(fieldNames)) return;\n\n\t\t\tsetFormErrors((errors) => {\n\t\t\t\t// Clear all\n\t\t\t\tif (fieldNames == null) return {} as FormValidationErrors;\n\n\t\t\t\tif (!Array.isArray(fieldNames)) fieldNames = [fieldNames];\n\n\t\t\t\tconst newErrors = {...errors};\n\t\t\t\tfieldNames.forEach((fieldName) => {\n\t\t\t\t\tdelete newErrors[fieldName];\n\t\t\t\t});\n\t\t\t\treturn Object.keys(newErrors).length > 0\n\t\t\t\t\t? newErrors\n\t\t\t\t\t: ({} as FormValidationErrors);\n\t\t\t});\n\t\t},\n\t\t[inErrors],\n\t);\n\n\t/** Reset actions */\n\tconst resetActions = useCallback((withAction?: TAction) => {\n\t\tconst actions = {} as FormActions;\n\t\tObject.keys(fieldRef.current).forEach((fieldName: keyof TValues) => {\n\t\t\tactions[fieldName] = withAction;\n\t\t});\n\t\tsetFormActions(actions);\n\t}, []);\n\n\t/** Reset all changes */\n\tconst resetChanges = useCallback(() => {\n\t\tsetFormChanges({} as FormChanges);\n\t}, []);\n\n\t/** Set/unset change for field */\n\tconst setChange = useCallback(\n\t\t(fieldName: keyof TValues, changed: boolean) => {\n\t\t\tif (!fieldRef.current[fieldName]) return;\n\n\t\t\tsetFormChanges((changes) => {\n\t\t\t\tconst _changes = {...changes};\n\t\t\t\tchanged ? (_changes[fieldName] = true) : delete _changes[fieldName];\n\t\t\t\treturn _changes;\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\t/** Set error for field */\n\tconst setError = useCallback(\n\t\t(fieldName: keyof TValues, type: string, message: string) => {\n\t\t\t// Already have an error set\n\t\t\tif (hasError(fieldName, type, message)) return;\n\n\t\t\tsetFormErrors((errors) => {\n\t\t\t\treturn {\n\t\t\t\t\t...errors,\n\t\t\t\t\t[fieldName]: {\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\t[hasError],\n\t);\n\n\t/** Validate single field */\n\tconst validateField = useCallback(\n\t\tasync (fieldName: keyof TValues, value?: any) => {\n\t\t\tconst input = fieldRef.current[fieldName];\n\t\t\tif (!input) return new Error(`'${fieldName}' not registered`);\n\n\t\t\t// No value was passed in, use the value we already have stored\n\t\t\tif (value === void 0) {\n\t\t\t\tvalue = formValuesRef.current[fieldName];\n\t\t\t}\n\n\t\t\tconst {required, validator} = input.options;\n\t\t\tlet result: true | Error = true;\n\n\t\t\tif (validator) {\n\t\t\t\tresult = await validator(value);\n\t\t\t}\n\n\t\t\tif (result === true && required && isEmptyValue(value)) {\n\t\t\t\tresult = new Error(i18n.t('i18n.required'));\n\t\t\t}\n\n\t\t\tresult === true\n\t\t\t\t? clearError(fieldName)\n\t\t\t\t: setError(fieldName, 'validation', result.message);\n\n\t\t\treturn result;\n\t\t},\n\t\t[clearError, setError],\n\t);\n\n\t/** Validate all fields in form */\n\tconst validate = useCallback(async () => {\n\t\tconst fieldNames = Object.keys(fieldRef.current);\n\t\tconst currentValues = formValuesRef.current;\n\n\t\tlet validationFailed = false;\n\n\t\tfor (let i = 0, c = fieldNames.length; i < c; i++) {\n\t\t\tconst fieldName = fieldNames[i];\n\t\t\tconst valid = await validateField(fieldName, currentValues[fieldName]);\n\t\t\tif (valid !== true) validationFailed = true;\n\t\t}\n\n\t\treturn !validationFailed;\n\t}, [validateField]);\n\n\tuseEffect(() => {\n\t\tif (isValidRef.current || !shouldAct()) return;\n\t\tObject.keys(formErrorsRef.current).forEach((fieldName) =>\n\t\t\tvalidateField(fieldName),\n\t\t);\n\t}, [formValues]);\n\n\t/** Register field */\n\tconst register = useCallback(\n\t\t(\n\t\t\tfieldName: keyof TValues,\n\t\t\tfieldOptions: FormFieldRefOptions = {},\n\t\t) => {\n\t\t\tif (!fieldName) return () => {};\n\n\t\t\tconst {current} = multiFieldsRef;\n\t\t\tconst {alwaysValidate} = optionsRef.current;\n\n\t\t\tif (current[fieldName] != null) {\n\t\t\t\tconst input = fieldRef.current[fieldName];\n\t\t\t\t// Always update with most recent options\n\t\t\t\tinput.options = {\n\t\t\t\t\t...input.options,\n\t\t\t\t\t...options,\n\t\t\t\t};\n\t\t\t\tcurrent[fieldName]++;\n\t\t\t\talwaysValidate && validateField(fieldName);\n\t\t\t\treturn () => unregister(fieldName);\n\t\t\t}\n\n\t\t\tcurrent[fieldName] = 1;\n\t\t\tfieldRef.current[fieldName] = {\n\t\t\t\tname: fieldName,\n\t\t\t\toptions: fieldOptions,\n\t\t\t};\n\t\t\tfieldOptions.value !== void 0 && setValue(fieldName, fieldOptions.value);\n\t\t\tfieldOptions.action !== void 0 &&\n\t\t\t\tsetAction(fieldName, fieldOptions.action);\n\t\t\talwaysValidate && validateField(fieldName);\n\n\t\t\treturn () => unregister(fieldName);\n\t\t},\n\t\t[validateField],\n\t);\n\n\tconst removeAction = useCallback((fieldName: keyof TValues) => {\n\t\tif (!fieldRef.current[fieldName]) return;\n\t\tsetFormActions((actions) => {\n\t\t\tconst _actions = {...actions};\n\t\t\tdelete _actions[fieldName];\n\t\t\treturn _actions;\n\t\t});\n\t}, []);\n\n\t/** Set action for field */\n\tconst setAction = useCallback(\n\t\t(fieldName: keyof TValues, action: TAction): void => {\n\t\t\tif (!fieldRef.current[fieldName]) return;\n\t\t\tsetFormActions((actions) => ({\n\t\t\t\t...actions,\n\t\t\t\t[fieldName]: action,\n\t\t\t}));\n\t\t},\n\t\t[],\n\t);\n\n\t/** Set field(s) value */\n\tconst setValue = useCallback(\n\t\t(fieldName: Partial | keyof TValues, value?: any) => {\n\t\t\t// An object of values\n\t\t\tif (typeof fieldName !== 'string') {\n\t\t\t\tObject.keys(fieldName).forEach((name) => {\n\t\t\t\t\tsetValue(name, fieldName[name]);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// TODO: maybe we do not require registering of fields if we want to allow this\n\t\t\t// to be used as a headless form like solution\n\t\t\t// But I set it up this way with the expectation that you would send information\n\t\t\t// about the fields this will track (validation etc) - so it really is not that\n\t\t\t// outrageous to expect someone to take the time to simply call\n\t\t\t// `form.register('foo', {required: true})`\n\t\t\t// This form does allow for passing in values at init that will be passed back out\n\t\t\t// on submit - just will not allow the manipulation of the values if they are not registered\n\t\t\t// IDK - something to think about (something i was thinking about while writing tests)\n\t\t\tif (!fieldRef.current[fieldName]) return;\n\n\t\t\tconst {alwaysValidate} = optionsRef.current;\n\n\t\t\tconst changed = checkFieldChanged(\n\t\t\t\tfieldName,\n\t\t\t\tvalue,\n\t\t\t\toriginalValuesRef.current[fieldName as string],\n\t\t\t\tformMultipleValuesRef.current[fieldName],\n\t\t\t\tformActionsRef.current[fieldName],\n\t\t\t);\n\t\t\tsetChange(fieldName, changed);\n\n\t\t\t// No need to go further if the value is the same as the currently set one\n\t\t\tif (!changed && valuesMatch(formValuesRef.current[fieldName], value))\n\t\t\t\treturn;\n\n\t\t\t// Let's assume that if the field has not changed that there are no errors\n\t\t\t// The component using this should opt to validate the form before submitting\n\t\t\t// at which point \"original values\" that fail validation will be caught\n\t\t\t// If using the submit handler we offer, validation will be called before calling submit\n\t\t\t// method in component\n\t\t\tchanged || alwaysValidate\n\t\t\t\t? validateField(fieldName, value)\n\t\t\t\t: clearError(fieldName);\n\n\t\t\tsetFormValues((values) => ({\n\t\t\t\t...values,\n\t\t\t\t[fieldName]: value,\n\t\t\t}));\n\t\t},\n\t\t[checkFieldChanged, clearError, setChange, validateField],\n\t);\n\n\t/** Un-register field */\n\tconst unregister = useCallback(\n\t\t(fieldName: keyof TValues) => {\n\t\t\t// Unregister all fields\n\t\t\tif (!fieldName) {\n\t\t\t\tclearError();\n\t\t\t\tresetChanges();\n\t\t\t\tsetFormValues({} as TValues);\n\t\t\t\tfieldRef.current = {} as FormFieldRef;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// We have no records of ever registering this field even once\n\t\t\tconst {current} = multiFieldsRef;\n\t\t\tif (!current[fieldName] == null) return;\n\n\t\t\tconst {removeValueOnUnregister} = optionsRef.current;\n\n\t\t\t// If it is the only record, delete\n\t\t\tif (current[fieldName] === 1) {\n\t\t\t\tdelete current[fieldName];\n\t\t\t\tclearError(fieldName);\n\t\t\t\tsetChange(fieldName, false);\n\t\t\t\tremoveAction(fieldName);\n\t\t\t\t// Remove from values\n\t\t\t\tremoveValueOnUnregister &&\n\t\t\t\t\tsetFormValues((formValues) => {\n\t\t\t\t\t\tconst values = {...formValues};\n\t\t\t\t\t\tdelete values[fieldName];\n\t\t\t\t\t\treturn values;\n\t\t\t\t\t});\n\t\t\t\tdelete fieldRef.current[fieldName];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Otherwise just reduce the count\n\t\t\tcurrent[fieldName]--;\n\t\t},\n\t\t[clearError, resetChanges, setChange, validate],\n\t);\n\n\tconst updateOptions = useCallback((fieldName: keyof TValues, options) => {\n\t\tif (!fieldRef.current[fieldName]) return;\n\t\tfieldRef.current[fieldName].options = {\n\t\t\t...fieldRef.current[fieldName].options,\n\t\t\t...options,\n\t\t};\n\t}, []);\n\n\t/** Reset form */\n\tconst reset = useCallback(\n\t\t(\n\t\t\twithValues?: Partial,\n\t\t\twithAction?: TAction,\n\t\t\twithMultipleValues?: FormMultipleValues,\n\t\t) => {\n\t\t\tconst values: FormValues = {};\n\t\t\t// Reset all to null\n\t\t\tObject.keys(fieldRef.current).forEach((name) => {\n\t\t\t\tvalues[name] = null;\n\t\t\t});\n\t\t\t// Combine with any passed in values\n\t\t\tsetFormValues({...values, ...withValues} as TValues);\n\t\t\tsetSubmissionError(null);\n\t\t\tsetFormErrors({} as FormValidationErrors);\n\t\t\tsetOriginalValues({...values, ...withValues} as TValues);\n\t\t\tsetFormMultipleValues((withMultipleValues || {}) as TValues);\n\t\t\twithAction ? resetActions(withAction) : resetActions();\n\t\t\tclearError();\n\t\t\tresetChanges();\n\n\t\t\tconst {onReset} = optionsRef.current;\n\t\t\tonReset && onReset();\n\t\t},\n\t\t[clearError, resetActions, resetChanges],\n\t);\n\n\tconst handleSubmit = useCallback(\n\t\t(callback: Function | undefined = options.onSubmit) => async (\n\t\t\tevent?: React.FormEvent,\n\t\t) => {\n\t\t\tif (event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\n\t\t\tif (isSubmittingRef.current) return;\n\t\t\tsetSubmissionError(null);\n\t\t\tsetIsSubmitting(true);\n\n\t\t\ttry {\n\t\t\t\tconst valid = await validate();\n\n\t\t\t\t// Check that we are still mounted\n\t\t\t\tif (!shouldAct()) return;\n\n\t\t\t\tif (!valid) return false;\n\n\t\t\t\tconst {resetOnSubmit} = optionsRef.current;\n\n\t\t\t\tconst result = callback\n\t\t\t\t\t? await callback(\n\t\t\t\t\t\t\tformValuesRef.current,\n\t\t\t\t\t\t\tformChangesRef.current,\n\t\t\t\t\t\t\tformActionsRef.current,\n\t\t\t\t\t )\n\t\t\t\t\t: undefined;\n\n\t\t\t\tact(() => {\n\t\t\t\t\tif (resetOnSubmit) {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\tresetWithCurrentValues,\n\t\t\t\t\t\t\tresetWithOriginalValues,\n\t\t\t\t\t\t} = optionsRef.current;\n\t\t\t\t\t\treset(\n\t\t\t\t\t\t\tresetWithOriginalValues\n\t\t\t\t\t\t\t\t? originalValuesRef.current\n\t\t\t\t\t\t\t\t: resetWithCurrentValues\n\t\t\t\t\t\t\t\t? formValuesRef.current\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetOriginalValues(formValuesRef.current);\n\t\t\t\t\t\tconst multipleValues = {...formMultipleValuesRef.current};\n\t\t\t\t\t\tfor (const key in formChangesRef.current) {\n\t\t\t\t\t\t\tdelete multipleValues[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetFormMultipleValues(multipleValues);\n\t\t\t\t\t\tresetChanges();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn result as TReturn | undefined;\n\t\t\t} catch (ex) {\n\t\t\t\tsetSubmissionError(ex.message);\n\t\t\t\t// Do nothing (for now) - the submission was just not successful\n\t\t\t} finally {\n\t\t\t\tact(() => setIsSubmitting(false));\n\t\t\t}\n\t\t},\n\t\t[reset, resetChanges, validate, options.onSubmit],\n\t);\n\n\treturn {\n\t\tfieldRef,\n\t\toptions,\n\n\t\tactions: formActions,\n\t\tactionsRef: formActionsRef,\n\t\tclearAction,\n\t\tgetAction,\n\t\tsetAction,\n\t\tresetActions,\n\t\tsetSubmissionError,\n\t\tsubmissionError,\n\n\t\tchanges: formChanges,\n\t\tchangesRef: formChangesRef,\n\t\thasChanged,\n\t\thasChangedRef,\n\t\tsetChange,\n\t\tresetChanges,\n\t\tcheckFieldChanged,\n\n\t\terrors: formErrors,\n\t\terrorsRef: formErrorsRef,\n\t\tsetError,\n\t\tclearError,\n\t\tisValid,\n\t\tisValidRef,\n\t\tvalidate,\n\t\tvalidateField,\n\n\t\tregister,\n\t\tunregister,\n\t\thandleSubmit,\n\t\treset,\n\t\tisSubmitting,\n\n\t\tmultipleValues: formMultipleValues,\n\t\tmultipleValuesRef: formMultipleValuesRef,\n\t\tsetMultipleValues: setFormMultipleValues,\n\n\t\toriginalValues,\n\t\toriginalValuesRef,\n\t\tsetValue,\n\t\tsetValues: setFormValues,\n\t\tupdateOptions,\n\t\tvalues: formValues,\n\t\tvaluesRef: formValuesRef,\n\t};\n}\n\n// Typescript cannot infer `ReturnType` of a generic, so you must roll your own\nclass InferWrapper<\n\tTValues extends FormValues = FormValues,\n\tTAction extends FormAction = FormAction,\n\tTReturn = any\n> {\n\tmediate = (...args: any[]) => useForm(...args);\n}\n\nexport type FormType<\n\tTValues extends FormValues = FormValues,\n\tTAction extends FormAction = FormAction,\n\tTReturn = any\n> = ReturnType['mediate']>;\n\nexport type FormParameters = [\n\t(TValues | undefined)?,\n\t(FormOptions | undefined)?,\n];\n","import React from 'react';\nimport {useEffect} from 'react';\n\nimport {FormFieldRefOptions, InputForm} from '@netx/core-components';\n\nexport default function useFormInput(\n\tfieldName: string,\n\tvalue: any,\n\tform?: InputForm,\n\toptions?: FormFieldRefOptions,\n) {\n\t// Setup/teardown\n\tuseEffect(() => {\n\t\tif (!form || !fieldName) return;\n\t\tconst _fieldName = fieldName;\n\n\t\tform.register(fieldName, options);\n\t\tform.setValue(fieldName, value);\n\t\treturn () => {\n\t\t\tform.unregister(_fieldName);\n\t\t};\n\t}, [fieldName]);\n\n\tuseEffect(() => {\n\t\tif (!form || !fieldName) return;\n\t\tform.updateOptions(fieldName, options);\n\t}, [options?.required, options?.validator, options?.hasChanged]);\n\n\tuseEffect(() => {\n\t\tif (!form || !fieldName) return;\n\t\tform.setValue(fieldName, value);\n\t}, [value]);\n}\n","import {MouseEvent as ReactMouseEvent} from 'react';\nimport equal from 'fast-deep-equal/es6/react';\n\nexport const compareProps = (ignoreProps?: string[], key?: string) => {\n\treturn function (nextProps: any, lastProps: any) {\n\t\treturn equal(nextProps, lastProps);\n\t};\n};\n\nexport function preventContextMenu(\n\tevent: ReactMouseEvent,\n) {\n\tevent.preventDefault();\n}\n\ntype Ref =\n\t| React.MutableRefObject\n\t| React.Ref\n\t| React.RefObject\n\t// | ((node: N | null) => void)\n\t| undefined\n\t| null;\n/**\n * When multiple refs would like to share the same node but cannot be used in a hook format.\n * Like when utilizing a ref from the children callback of `InfiniteLoader`\n @example\n
(ref, anotherRef, andAnotherRef)}\n */\nexport function combineRefs(...refs: Ref[]) {\n\treturn (node: N) => {\n\t\trefs.forEach((ref) => {\n\t\t\tif (!ref) return;\n\t\t\ttypeof ref === 'function'\n\t\t\t\t? ref(node)\n\t\t\t\t: ((ref as React.MutableRefObject).current = node);\n\t\t});\n\t};\n}\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const ICON_BUTTON_CLASS_NAME = 'IconButton';\nexport const ICON_BUTTON_CLASS_SLOTS = ['root', 'icon'] as const;\n\nexport type IconButtonClassSlot = typeof ICON_BUTTON_CLASS_SLOTS[number];\n\nexport interface IconButtonClasses {\n\t/** Styles applied to the root element. */\n\troot: string;\n\ticon: string;\n\n\tdefault: string;\n\n\tcontained: string;\n\tcontainedInherit: string;\n\tcontainedPrimary: string;\n\tcontainedSecondary: string;\n\tcontainedError: string;\n\tcontainedInfo: string;\n\tcontainedSuccess: string;\n\tcontainedWarning: string;\n\n\tfab: string;\n\tfabInherit: string;\n\tfabPrimary: string;\n\tfabSecondary: string;\n\tfabError: string;\n\tfabInfo: string;\n\tfabSuccess: string;\n\tfabWarning: string;\n\n\toutlined: string;\n\toutlinedInherit: string;\n\toutlinedPrimary: string;\n\toutlinedSecondary: string;\n\toutlinedError: string;\n\toutlinedInfo: string;\n\toutlinedSuccess: string;\n\toutlinedWarning: string;\n}\n\nexport const getIconButtonUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('IconButton', slot);\n\nexport const iconButtonClasses: IconButtonClasses = generateUtilityClasses(\n\t'IconButton',\n\t[\n\t\t'root',\n\t\t'default',\n\t\t'contained',\n\t\t'containedInherit',\n\t\t'containedPrimary',\n\t\t'containedSecondary',\n\t\t'containedError',\n\t\t'containedInfo',\n\t\t'containedSuccess',\n\t\t'containedWarning',\n\t\t'fab',\n\t\t'fabInherit',\n\t\t'fabPrimary',\n\t\t'fabSecondary',\n\t\t'fabError',\n\t\t'fabInfo',\n\t\t'fabSuccess',\n\t\t'fabWarning',\n\t\t'icon',\n\t\t'outlined',\n\t\t'outlinedInherit',\n\t\t'outlinedPrimary',\n\t\t'outlinedSecondary',\n\t\t'outlinedError',\n\t\t'outlinedInfo',\n\t\t'outlinedSuccess',\n\t\t'outlinedWarning',\n\t],\n);\nexport default iconButtonClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport MuiIconButton, {\n\tIconButtonProps as MuiIconButtonProps,\n\ticonButtonClasses as muiIconButtonClasses,\n} from '@mui/material/IconButton';\n\nimport {capitalize} from '@mui/material';\n\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithMuiPropOverrides,\n\tWithClasses,\n} from '@netx/core-components/Theme';\nimport {\n\ticonButtonClasses,\n\tgetIconButtonUtilityClass,\n\tIconButtonClasses,\n\tICON_BUTTON_CLASS_NAME,\n} from './iconButtonClasses';\n\nimport Tooltip, {TooltipProps} from '../Tooltip';\n\nimport {IconProp} from '@fortawesome/fontawesome-svg-core';\nimport {\n\tFontAwesomeIcon,\n\tFontAwesomeIconProps,\n} from '@fortawesome/react-fontawesome';\n\nimport {getSeverityColors} from '../Theme';\n\nexport const ICON_BUTTON_VARIANTS = [\n\t'fab',\n\t'outlined',\n\t'contained',\n\t'default',\n] as const;\n\nexport const ICON_BUTTON_SIZE_VALUE = {\n\tsmall: 28,\n\tmedium: 42,\n\tlarge: 56,\n} as const;\n\nexport const ICON_SIZE_VALUE = {\n\tsmall: 12,\n\tmedium: 18,\n\tlarge: 24,\n} as const;\n\nexport type IconButtonVariant = typeof ICON_BUTTON_VARIANTS[number];\n\nexport type IconButtonColor = Required['color'];\n\ntype IconButtonUtiltiyClassProps = WithClasses<\n\tIconButtonClasses,\n\t{\n\t\tcolor: IconButtonColor;\n\t\tvariant?: IconButtonVariant;\n\t\tsize: Required['size'];\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: IconButtonUtiltiyClassProps) => {\n\tconst {classes, color, variant} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\t(variant && variant) || 'default',\n\t\t\tvariant && `${variant}${capitalize(color)}`,\n\t\t],\n\t\ticon: ['icon'],\n\t};\n\treturn composeClasses(slots, getIconButtonUtilityClass, classes);\n};\n\nconst IconButtonRoot = styled(MuiIconButton, {\n\tname: ICON_BUTTON_CLASS_NAME,\n\tslot: 'Root',\n\toverridesResolver: (props, styles) => styles.root,\n})(({theme, ...props}) => {\n\tconst ownerState = props.ownerState as IconButtonUtiltiyClassProps;\n\tconst colors = getSeverityColors(theme);\n\treturn {\n\t\theight: ICON_BUTTON_SIZE_VALUE[ownerState.size],\n\t\twidth: ICON_BUTTON_SIZE_VALUE[ownerState.size],\n\n\t\t...(ownerState.variant === 'fab'\n\t\t\t? {\n\t\t\t\t\tboxShadow: theme.shadows[4],\n\t\t\t\t\ttransition: theme.transitions.create(\n\t\t\t\t\t\t['background-color', 'box-shadow'],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tduration: theme.transitions.duration.short,\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t\t'&:active': {\n\t\t\t\t\t\tboxShadow: theme.shadows[6],\n\t\t\t\t\t},\n\t\t\t\t\t'&:hover': {\n\t\t\t\t\t\tbackground: theme.palette.secondary.light,\n\t\t\t\t\t},\n\t\t\t\t\t[`&.${muiIconButtonClasses.disabled}`]: {\n\t\t\t\t\t\tboxShadow: 'none', // theme.shadows[0],\n\t\t\t\t\t},\n\t\t\t }\n\t\t\t: {}),\n\n\t\t...(ownerState.variant === 'fab' || ownerState.variant === 'contained'\n\t\t\t? {\n\t\t\t\t\tfontWeight: theme.typography.fontWeightMedium,\n\t\t\t\t\t...(ownerState.color === 'default'\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tbackgroundColor: theme.palette.secondary.main,\n\t\t\t\t\t\t\t\tcolor: `${theme.palette.secondary.contrastText} !important`,\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: ownerState.color === 'inherit'\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tcolor: 'inherit',\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tbackgroundColor: colors[ownerState.color]?.default,\n\t\t\t\t\t\t\t\tcolor: `${colors[ownerState.color]?.text} !important`,\n\t\t\t\t\t\t\t\t'&:hover': {\n\t\t\t\t\t\t\t\t\tbackground: colors[ownerState.color].hover,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t }),\n\t\t\t }\n\t\t\t: ownerState.variant === 'outlined'\n\t\t\t? {\n\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\tborderStyle: 'solid',\n\t\t\t\t\t...(ownerState.color === 'default'\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tborderColor: theme.palette.custom.border,\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: ownerState.color === 'inherit'\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tborderColor: 'inherit',\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tborderColor: colors[ownerState.color]?.default,\n\t\t\t\t\t\t }),\n\t\t\t }\n\t\t\t: {}),\n\n\t\t...(ownerState.variant === 'default' || ownerState.variant === 'outlined'\n\t\t\t? {\n\t\t\t\t\tcolor:\n\t\t\t\t\t\townerState.color === 'inherit'\n\t\t\t\t\t\t\t? 'inherit'\n\t\t\t\t\t\t\t: ownerState.color === 'default'\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: colors[ownerState.color]?.default,\n\t\t\t }\n\t\t\t: {}),\n\n\t\t[`&.${muiIconButtonClasses.disabled}`]: {\n\t\t\topacity: 0.5,\n\t\t\t// ownerState.color !== 'inherit' && ownerState.color !== 'default'\n\t\t\t// \t? 0.5\n\t\t\t// \t: undefined,\n\t\t\t[`&.${iconButtonClasses.outlined}, &.${iconButtonClasses.default}`]: {\n\t\t\t\tcolor:\n\t\t\t\t\townerState.color === 'inherit'\n\t\t\t\t\t\t? 'inherit'\n\t\t\t\t\t\t: ownerState.color === 'default'\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: colors[ownerState.color]?.default,\n\t\t\t},\n\t\t\t[`&.${iconButtonClasses.fab}, &.${iconButtonClasses.contained}`]: {\n\t\t\t\tbackgroundColor:\n\t\t\t\t\townerState.color === 'inherit'\n\t\t\t\t\t\t? 'inherit'\n\t\t\t\t\t\t: ownerState.color === 'default'\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: colors[ownerState.color]?.default,\n\t\t\t\tcolor: theme.palette.common.white,\n\t\t\t},\n\t\t},\n\n\t\t[`& .${iconButtonClasses.icon}`]: {\n\t\t\theight: ICON_SIZE_VALUE[ownerState.size],\n\t\t\twidth: ICON_SIZE_VALUE[ownerState.size],\n\t\t},\n\t};\n});\n\nconst IconButtonIconRoot = styled(FontAwesomeIcon, {\n\tname: 'IconButton',\n\tslot: 'Icon',\n\toverridesResolver: (props, styles) => styles.icon,\n})(({theme}) => ({\n\tzIndex: 2,\n}));\n\ninterface IconProps extends Partial> {}\n\nexport interface IconButtonProps\n\textends Omit>, 'classes'>,\n\t\tWithClasses<\n\t\t\tIconButtonClasses,\n\t\t\tReact.PropsWithChildren<{\n\t\t\t\ticon: IconProp;\n\t\t\t\tlabel?: string | NonNullable;\n\t\t\t\tvariant?: IconButtonVariant;\n\t\t\t\tIconProps?: Omit;\n\t\t\t\tTooltipProps?: Partial;\n\t\t\t}>\n\t\t> {}\n\nexport const IconButtonPrimitive = ({\n\tclasses: _classes,\n\tchildren,\n\tclassName,\n\tdisabled,\n\ticon,\n\tlabel = '',\n\tsize = 'medium',\n\tcolor,\n\tvariant = 'default',\n\ttitle,\n\tIconProps,\n\tTooltipProps,\n\t...props\n}: IconButtonProps) => {\n\tcolor = color ? color : variant === 'fab' ? 'secondary' : 'default';\n\n\tconst ownerState = {\n\t\tclasses: _classes,\n\t\tcolor,\n\t\tvariant,\n\t\tsize,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t{children}\n\t\t\t\n\t\t\n\t);\n};\n\nIconButtonPrimitive.displayName = 'IconButton';\n\nexport const IconButton = React.memo(IconButtonPrimitive);\nexport default IconButton;\n","import {useEffect, useRef} from 'react';\nimport equal from 'fast-deep-equal/react';\n\ntype Options = {\n\texecuteAtMount?: boolean;\n\tonlyOnUpdate?: boolean;\n};\n\nexport const useWhenChangedEffect = (\n\tthingThatMightChange: T,\n\tcallback: (thingThatMightChange: T, oldValue?: T) => void | (() => void),\n\toptions?: Options,\n) => {\n\tconst thingThatMightChangeRef = useRef(thingThatMightChange);\n\tconst ranOnceRef = useRef(false);\n\tconst callbackRef = useRef(callback);\n\tcallbackRef.current = callback;\n\n\tuseEffect(() => {\n\t\tif (equal(thingThatMightChangeRef.current, thingThatMightChange)) return;\n\t\tconst oldValue = thingThatMightChangeRef.current;\n\t\tthingThatMightChangeRef.current = thingThatMightChange;\n\t\tif (options?.onlyOnUpdate && !ranOnceRef.current) {\n\t\t\tranOnceRef.current = true;\n\t\t\treturn;\n\t\t}\n\t\treturn callbackRef.current(thingThatMightChange, oldValue);\n\t}, [thingThatMightChange, options?.onlyOnUpdate]);\n\n\tuseEffect(() => {\n\t\tif (!options?.executeAtMount) return;\n\t\treturn callback(thingThatMightChange);\n\t}, []);\n};\n\nexport default useWhenChangedEffect;\n","// https://github.com/facebook/react/issues/13029\nimport {MutableRefObject, useRef} from 'react';\n\ntype InputRef =\n\t| ((instance: T | null) => void)\n\t| MutableRefObject\n\t| null\n\t| undefined;\n\n/**\n * Works like normal useRef, but accepts second argument which is array\n * of additional refs of the same type. Ref value will be shared with\n * all of those provided refs as well\n @example\n const Foo = forwardRef((props, refToForward) => {\n const ref = useSharedRef(null, [refToForward]);\n return
baz
\n })\n */\nexport const useSharedRef = (\n\tinitialValue: T,\n\trefsToShare: Array>,\n) => {\n\t// actual ref that will hold the value\n\tconst innerRef = useRef(initialValue);\n\n\t// ref function that will update innerRef value as well as will publish value to all provided refs\n\tfunction sharingRef(value: T) {\n\t\t// update inner value\n\t\tinnerRef.current = value;\n\t\t// for each provided ref - update it as well\n\t\trefsToShare.forEach((resolvableRef) => {\n\t\t\t// react supports various types of refs\n\t\t\tif (typeof resolvableRef === 'function') {\n\t\t\t\t// if it's functional ref - call it with new value\n\t\t\t\tresolvableRef(value);\n\t\t\t} else {\n\t\t\t\t// it should be ref with .current prop\n\t\t\t\t// make sure it exists - if so - assign new value\n\t\t\t\tif (resolvableRef) {\n\t\t\t\t\t(resolvableRef as any).current = value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * We want ref we return to work using .current, but it has to be function in order\n\t * to share value with other refs.\n\t *\n\t * Let's add custom get property called 'current' that will return\n\t * fresh value of innerRef.current\n\t */\n\tif (!(sharingRef as any).current) {\n\t\tObject.defineProperty(sharingRef, 'current', {\n\t\t\tget() {\n\t\t\t\treturn innerRef.current;\n\t\t\t},\n\t\t});\n\t}\n\n\treturn sharingRef as typeof sharingRef & {current: T};\n};\n\nexport default useSharedRef;\n","import React from 'react';\n\nimport SelectField, {SelectFieldProps} from './components/Select';\nimport {ReadOnlySelectField, ReadOnlySelectFieldProps} from './components';\nexport {default as SelectField} from './components/Select';\nexport * from './components/Select';\n\nexport type FieldRef = React.ForwardedRef;\n\ntype ExternalProps<\n\tT = any,\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false,\n\tFreeSolo extends boolean | undefined = false\n> =\n\t| SelectFieldProps\n\t| ReadOnlySelectFieldProps;\n\ntype InternalProps = {\n\treadOnly?: boolean;\n};\n\nconst FieldInner = <\n\tT,\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false,\n\tFreeSolo extends boolean | undefined = false\n>(\n\t{\n\t\treadOnly,\n\t\t...props\n\t}: InternalProps & ExternalProps,\n\tref: FieldRef,\n) => {\n\treturn !readOnly ? (\n\t\t\n\t\t\tref={ref}\n\t\t\t{...(props as SelectFieldProps)}\n\t\t/>\n\t) : (\n\t\t\n\t);\n};\n\nexport const FieldPrimitive = React.forwardRef(FieldInner) as <\n\tT,\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false,\n\tFreeSolo extends boolean | undefined = false\n>(\n\tprops: InternalProps & ExternalProps,\n) => JSX.Element;\n\nexport const Field = FieldPrimitive;\n\nexport default Field;\n","// TODO: This only works for dragging right to left\n\nimport React, {\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport _ from 'underscore';\nimport clsx from 'clsx';\n\nimport {createStyles, makeStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nconst body = document.body;\n\nconst DEFAULT_WIDTH = 400;\nconst MIN_WIDTH = 265;\n\nconst useStyles = (dragging = false) =>\n\tmakeStyles(() => {\n\t\tif (!dragging) return {};\n\t\treturn createStyles({\n\t\t\t'@global': {\n\t\t\t\thtml: {\n\t\t\t\t\tcursor: 'col-resize !important',\n\t\t\t\t},\n\t\t\t\tbody: {\n\t\t\t\t\t'& *': {\n\t\t\t\t\t\tuserSelect: 'none !important',\n\t\t\t\t\t\tpointerEvents: 'none !important',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\nconst dragHandleStyles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tbackground: 'rgba(0, 0, 0, 0.02)',\n\t\t\tborderLeft: '1px solid transparent',\n\t\t\twidth: 8,\n\t\t\tcursor: 'col-resize',\n\t\t\toverflow: 'hidden',\n\t\t\tposition: 'absolute',\n\t\t\ttransition: 'opacity 0.3s ease',\n\t\t\ttop: 0,\n\t\t\tleft: 0,\n\t\t\tbottom: 0,\n\t\t\tzIndex: 1201,\n\t\t\tuserSelect: 'none',\n\t\t\t'&:hover': {\n\t\t\t\tborderColor: theme.palette.secondary.main,\n\t\t\t\topacity: 1,\n\t\t\t},\n\t\t\t'&$dragging': {\n\t\t\t\tborderColor: theme.palette.secondary.main,\n\t\t\t\topacity: 1,\n\t\t\t},\n\t\t\t'& .ellipsis': {\n\t\t\t\tcolor:\n\t\t\t\t\ttheme.palette.mode === 'light'\n\t\t\t\t\t\t? 'rgba(0, 0, 0, 0.2)'\n\t\t\t\t\t\t: 'rgba(255, 255, 255, 0.2)',\n\t\t\t\tfontSize: '20px',\n\t\t\t\tposition: 'absolute',\n\t\t\t\tleft: -1,\n\t\t\t\tmarginTop: -8.5,\n\t\t\t\theight: 17,\n\t\t\t\ttop: '50%',\n\t\t\t\ttransform: 'rotate(90deg)',\n\t\t\t},\n\t\t},\n\t\tdragging: {\n\t\t\tborderColor: theme.palette.secondary.main,\n\t\t},\n\t});\n\ninterface DragHandleProps {\n\tisDragging?: boolean;\n\tonMouseDown(event: React.MouseEvent): void;\n}\n\nconst DragHandle: React.FunctionComponent<\n\tWithStyles & DragHandleProps\n> = React.memo(({classes, isDragging, ...props}) => {\n\tuseStyles(isDragging)();\n\treturn (\n\t\t\n\t\t\t
\n\t\t
\n\t);\n});\nconst StyledDragHandle = withStyles(dragHandleStyles)(DragHandle);\nconst withDragHandle = ({isDragging, onMouseDown}: DragHandleProps) => {\n\treturn (props) => (\n\t\t\n\t);\n};\n\ntype Dims = {\n\tbodyLeft: number;\n\tbodyWidth: number;\n\twidth: number;\n};\n\nexport interface UseDragResizeElementProps {\n\tclassName?: string;\n\tchildren?: React.ReactNode;\n\toverflowParent: React.RefObject;\n\tdefaultWidth?: number;\n\tminWidth?: number;\n\twidth?: number;\n\tonResize?: (width: number) => void;\n\tonResizeStarted?: () => void;\n\tonResizeEnded?: (width: number) => void;\n}\n\nexport default function useDragResizeElement({\n\toverflowParent,\n\tdefaultWidth = DEFAULT_WIDTH,\n\tminWidth = MIN_WIDTH,\n\twidth,\n\tonResize,\n\tonResizeEnded,\n\tonResizeStarted,\n}: UseDragResizeElementProps) {\n\tconst [dims, setDims] = useState({\n\t\tbodyLeft: 0,\n\t\tbodyWidth: 0,\n\t\twidth: Math.max(width || defaultWidth, minWidth),\n\t});\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst isDraggingRef = useRef(isDragging);\n\tconst lastMouseDownRef = useRef(Date.now());\n\tconst lastWidthRef = useRef(dims.width);\n\tconst maxWidthRef = useRef(0);\n\tconst initialWidthRef = useRef(0);\n\tconst xStartRef = useRef(0);\n\n\tuseEffect(() => {\n\t\tif (lastWidthRef.current === dims.width) return;\n\t\tlastWidthRef.current = dims.width;\n\t\tonResize && onResize(dims.width);\n\t});\n\tuseLayoutEffect(() => {\n\t\tif (isDraggingRef.current === isDragging) return;\n\t\tisDraggingRef.current = isDragging;\n\t\tisDragging\n\t\t\t? onResizeStarted && onResizeStarted()\n\t\t\t: onResizeEnded && onResizeEnded(dims.width);\n\t});\n\n\t// When the width or overflow parent is changed\n\tuseLayoutEffect(() => {\n\t\tif (!overflowParent.current) return;\n\t\tconst clientWidth = overflowParent.current.clientWidth;\n\t\tif (\n\t\t\tclientWidth < overflowParent.current.scrollWidth ||\n\t\t\tdims.width >= clientWidth\n\t\t) {\n\t\t\tsetDims((dims) => {\n\t\t\t\tif (!overflowParent.current) return dims;\n\t\t\t\tlet newWidth =\n\t\t\t\t\tdims.width -\n\t\t\t\t\t(overflowParent.current.scrollWidth -\n\t\t\t\t\t\toverflowParent.current.clientWidth +\n\t\t\t\t\t\t2);\n\t\t\t\tif (newWidth < minWidth) newWidth = minWidth;\n\t\t\t\tmaxWidthRef.current = Math.min(newWidth, clientWidth);\n\t\t\t\treturn {\n\t\t\t\t\t...dims,\n\t\t\t\t\twidth: newWidth,\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t}, [dims.width]);\n\n\t// When we start/stop dragging\n\tuseLayoutEffect(() => {\n\t\tif (!isDragging) return;\n\n\t\tlet width: number;\n\t\tconst mousemove = _.throttle(\n\t\t\t(event: MouseEvent): void => {\n\t\t\t\tconst maxWidth = maxWidthRef.current;\n\t\t\t\t// dragging left\n\t\t\t\twidth = initialWidthRef.current - (event.clientX - xStartRef.current);\n\t\t\t\t// dragging right\n\t\t\t\t// width = initialWidthRef.current + (event.clientX - xStartRef.current),\n\t\t\t\tif (maxWidth > 0 && width > maxWidth) {\n\t\t\t\t\twidth = maxWidth;\n\t\t\t\t} else if (minWidth > width) {\n\t\t\t\t\twidth = minWidth;\n\t\t\t\t}\n\t\t\t\tsetDims((dims) => ({\n\t\t\t\t\t...dims,\n\t\t\t\t\twidth,\n\t\t\t\t}));\n\t\t\t},\n\t\t\t16,\n\t\t\t{trailing: true},\n\t\t);\n\n\t\tconst mouseup = () => setIsDragging(false);\n\t\tdocument.addEventListener('mousemove', mousemove);\n\t\tdocument.addEventListener('mouseup', mouseup);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousemove', mousemove);\n\t\t\tdocument.removeEventListener('mouseup', mouseup);\n\t\t\tmaxWidthRef.current = 0;\n\t\t};\n\t}, [isDragging]);\n\n\tconst handleMouseDown = useCallback(\n\t\t(event: React.MouseEvent) => {\n\t\t\tevent.stopPropagation();\n\t\t\tif (Date.now() - lastMouseDownRef.current < 300) {\n\t\t\t\tsetDims((dims) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...dims,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tinitialWidthRef.current =\n\t\t\t\t\t(event.target as HTMLElement)?.parentElement?.offsetWidth || 0;\n\t\t\t\txStartRef.current = event.clientX;\n\t\t\t\tsetIsDragging(true);\n\t\t\t}\n\t\t\tlastMouseDownRef.current = Date.now();\n\t\t},\n\t\t[],\n\t);\n\n\treturn {\n\t\thandleMouseDown,\n\t\tisDragging,\n\t\twidth: dims.width,\n\t\tDragHandle: withDragHandle({onMouseDown: handleMouseDown, isDragging}),\n\t};\n}\n\nconst useDragStyles = makeStyles({\n\troot: {\n\t\twidth: DEFAULT_WIDTH,\n\t\t'&:not(:hover):not($dragging) .use-drag-resize__handle': {\n\t\t\topacity: 0,\n\t\t},\n\t},\n\tdragging: {},\n});\n\nexport function WithDragResize(Component: React.ComponentType) {\n\treturn React.memo(\n\t\t({\n\t\t\tchildren,\n\t\t\tdefaultWidth,\n\t\t\tminWidth,\n\t\t\tonResize,\n\t\t\tonResizeEnded,\n\t\t\tonResizeStarted,\n\t\t\toverflowParent,\n\t\t\twidth,\n\t\t\t...props\n\t\t}: UseDragResizeElementProps & T) => {\n\t\t\tconst classes = useDragStyles();\n\n\t\t\tconst {DragHandle, ...dragResize} = useDragResizeElement({\n\t\t\t\tdefaultWidth,\n\t\t\t\tminWidth,\n\t\t\t\tonResize,\n\t\t\t\tonResizeEnded,\n\t\t\t\tonResizeStarted,\n\t\t\t\toverflowParent,\n\t\t\t\twidth,\n\t\t\t});\n\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{children}\n\t\t\t\t\n\t\t\t);\n\t\t},\n\t);\n}\n","import React from 'react';\nimport {useEffect, useRef} from 'react';\n\nexport default function useMemoCompare(next, compare) {\n\t// Ref for storing previous value\n\tconst previousRef = useRef();\n\tconst previous = previousRef.current;\n\n\t// Pass previous and next value to compare function\n\t// to determine whether to consider them equal.\n\tconst isEqual = compare(previous, next);\n\n\t// If not equal update previousRef to next value.\n\t// We only update if not equal so that this hook continues to return\n\t// the same old value if compare keeps returning true.\n\tuseEffect(() => {\n\t\tif (!isEqual) {\n\t\t\tpreviousRef.current = next;\n\t\t}\n\t});\n\n\t// Finally, if equal then return the previous value\n\treturn isEqual ? previous : next;\n}\n","import {useRef, useEffect} from 'react';\n\nexport const usePrevious = (value: T): T | undefined => {\n\tconst ref = useRef();\n\n\tuseEffect(() => {\n\t\tref.current = value;\n\t}, [value]);\n\n\t// Return previous value (happens before update in useEffect above)\n\treturn ref.current;\n};\nexport default usePrevious;\n","import React, {useCallback, useRef, useEffect} from 'react';\n\nimport Rpc from 'core-libs/backbone.rpc';\n\ntype ReturnData =\n\t| Record\n\t| Record[]\n\t| string[]\n\t| string;\n\ntype Data = Array> | Record;\n\nexport default function useRpc() {\n\tconst rpcRef = useRef();\n\tconst lastMethod = useRef();\n\n\tuseEffect(() => {\n\t\tconst rpc = (rpcRef.current = new Rpc());\n\t\trpc.duplicateQueryPolicy = 'abort';\n\t\treturn (): void => {\n\t\t\tif (rpc && lastMethod.current) {\n\t\t\t\tconst request = rpc.callsByName && rpc.callsByName[lastMethod.current];\n\t\t\t\tif (request && request.xhr?.state && request.xhr.state() == 'pending') {\n\t\t\t\t\trequest.xhr.abort && request.xhr.abort();\n\t\t\t\t}\n\t\t\t}\n\t\t\trpcRef.current = undefined;\n\t\t};\n\t}, []);\n\n\tconst query = useCallback(\n\t\t(\n\t\t\tmethod: string,\n\t\t\tdata?: Data,\n\t\t): Promise => {\n\t\t\tlastMethod.current = method;\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tif (!rpcRef.current || !rpcRef.current.query) return;\n\t\t\t\trpcRef.current\n\t\t\t\t\t.query(method, data || [], (result: TReturn) => {\n\t\t\t\t\t\tlastMethod.current = undefined;\n\t\t\t\t\t\treturn resolve(result);\n\t\t\t\t\t})\n\t\t\t\t\t.catch(reject);\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\treturn query;\n}\n","import React from 'react';\nimport {useCallback, useRef, useState} from 'react';\n\nfunction useRefState(\n\tinitialValue: S | (() => S),\n): [S, React.MutableRefObject, React.Dispatch>] {\n\tconst [state, setState] = useState(initialValue);\n\tconst stateRef = useRef(state);\n\n\tconst _setState = useCallback((value: S | ((state: S) => S)) => {\n\t\tsetState((state: S) => {\n\t\t\tconst newState =\n\t\t\t\ttypeof value === 'function' ? (value as Function)(state) : value;\n\t\t\tstateRef.current = newState;\n\t\t\treturn newState;\n\t\t});\n\t}, []);\n\n\treturn [state, stateRef, _setState];\n}\n\nexport default useRefState;\n","export {default as ActionButton} from './ActionButton';\nexport * from './ActionButton';\n\nexport {default as ActionMenu} from './ActionMenu';\nexport * from './ActionMenu';\n\nexport {default as ActionMenuList} from './ActionMenuList';\nexport * from './ActionMenuList';\n\nexport {default as AddActionButton} from './AddActionButton';\nexport * from './AddActionButton';\n\nexport {default as Alert} from './Alert';\nexport * from './Alert';\n\nexport {default as Button} from './Button';\nexport * from './Button';\n\nexport {default as Chip} from './Chip';\nexport * from './Chip';\n\nexport {default as ConfirmationServiceProvider} from './Confirmation';\nexport * from './Confirmation';\n\nexport {default as ContextMenuServiceProvider} from './ContextMenu';\nexport * from './ContextMenu';\n\nexport {default as CountChip} from './CountChip';\nexport * from './CountChip';\n\nexport {default as Drawer} from './Drawer';\nexport * from './Drawer';\n\nexport {default as DeleteActionButton} from './DeleteActionButton';\nexport * from './DeleteActionButton';\n\nexport {default as Dialog} from './Dialog';\nexport * from './Dialog';\n\nexport {default as DialogTitle} from './DialogTitle';\nexport * from './DialogTitle';\n\nexport {default as DownloadServiceProvider} from './DownloadDialog';\nexport * from './DownloadDialog';\n\nexport {default as EditActionButton} from './EditActionButton';\nexport * from './EditActionButton';\n\nexport {default as ErrorBoundary} from './ErrorBoundary';\nexport * from './ErrorBoundary';\n\nexport * from './Form';\n\nexport {default as FormDialog} from './FormDialog';\nexport * from './FormDialog';\n\nexport {default as IconButton} from './IconButton';\nexport * from './IconButton';\n\nexport * from './ItemManager';\n\nexport {default as MenuItem} from './MenuItem';\nexport * from './MenuItem';\n\nexport {default as MenuList} from './MenuList';\nexport * from './MenuList';\n\nexport {default as ScrollShadow} from './ScrollShadow';\nexport * from './ScrollShadow';\n\nexport {default as SnackbarServiceProvider} from './Snackbar';\nexport * from './Snackbar';\n\nexport {default as SubmitButton} from './SubmitButton';\nexport * from './SubmitButton';\n\nexport {default as Tab} from './Tab';\nexport * from './Tab';\n\nexport {default as TabPanel} from './TabPanel';\nexport * from './TabPanel';\n\nexport {default as Tabs} from './Tabs';\nexport * from './Tabs';\n\nexport {default as Table} from './Table';\nexport * from './Table';\n\nexport {default as Theme} from './Theme';\nexport * from './Theme';\n\nexport {default as Title} from './Title';\nexport * from './Title';\n\nexport {default as ToggleButton} from './ToggleButton';\nexport * from './ToggleButton';\n\nexport {default as Tooltip} from './Tooltip';\nexport * from './Tooltip';\n\nexport * from './hooks';\nexport * from './util';\n","import React, {useCallback, useEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {\n\tFontAwesomeIcon,\n\tFontAwesomeIconProps,\n} from '@fortawesome/react-fontawesome';\nimport {faTimesCircle as TimesCircleIcon} from '@fortawesome/pro-solid-svg-icons';\nimport {\n\tChip as MuiChip,\n\tChipProps as MuiChipProps,\n\tchipClasses as muiChipClasses,\n} from '@mui/material';\nimport {alpha} from '@mui/system';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithMuiPropOverrides,\n\tWithClasses,\n} from '../Theme';\nimport Tooltip from '../Tooltip';\nimport {ChipSkeleton} from './components/Skeleton';\nimport {\n\tchipClasses,\n\tgetChipUtilityClass,\n\tChipClasses,\n\tCHIP_CLASS_NAME,\n} from './chipClasses';\n\nexport type ChipRef = React.ForwardedRef;\n\nexport type ChipUtilityProps = WithClasses<\n\tChipClasses,\n\t{\n\t\tdisabled?: boolean;\n\t\tmeshAvatar?: boolean;\n\t\tcolor?:\n\t\t\t| 'default'\n\t\t\t| 'primary'\n\t\t\t| 'secondary'\n\t\t\t| 'error'\n\t\t\t| 'info'\n\t\t\t| 'success'\n\t\t\t| 'warning';\n\t\tvariant?: MuiChipProps['variant'];\n\t}\n>;\n\nconst useUtilityClasses = (props: ChipUtilityProps) => {\n\tconst {classes} = props;\n\tconst slots = {\n\t\troot: ['root'],\n\t\tdeleteIcon: ['deleteIcon'],\n\t\ticonWrapper: ['iconWrapper'],\n\t};\n\treturn composeClasses(slots, getChipUtilityClass, classes);\n};\n\nconst ChipRoot = styled(MuiChip, {\n\tname: CHIP_CLASS_NAME,\n\tslot: 'Root',\n})(({theme, ownerState}) => {\n\tconst {meshAvatar, color = 'default'} = ownerState as ChipUtilityProps;\n\n\tconst palette = {\n\t\t...theme.palette,\n\t\tdefault: theme.palette.secondary,\n\t};\n\n\treturn {\n\t\t...(color !== 'default'\n\t\t\t? {\n\t\t\t\t\t[`&.${muiChipClasses.outlined}`]: {\n\t\t\t\t\t\tborderColor: palette[color].main,\n\t\t\t\t\t\t[`& .${muiChipClasses.avatar}`]: {\n\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\tbackgroundColor: palette[color].main,\n\t\t\t\t\t\t\tcolor: `#fff !important`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[`& .${muiChipClasses.icon}`]: {\n\t\t\t\t\t\t\tcolor: `${palette[color].main}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[`& .${chipClasses.deleteIcon}`]: {\n\t\t\t\t\t\t\tcolor: `${palette[color].main} !important`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t }\n\t\t\t: {\n\t\t\t\t\t[`&.${muiChipClasses.outlined}`]: {\n\t\t\t\t\t\t[`& .${muiChipClasses.avatar}`]: {\n\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t }),\n\t\t// [`&.${muiChipClasses.outlined}`]: {\n\t\t// \t// borderColor: color !== 'default' ? `${palette[color].main} !important` : undefined,\n\t\t// \t[`& .${muiChipClasses.avatar}`]: {\n\t\t// \t\t// backgroundColor: `${theme.palette.secondary.main} !important`,\n\t\t// \t\t// color: `${theme.palette.secondary.contrastText} !important`,\n\t\t// \t\tfontWeight: 600,\n\t\t// \t\tbackgroundColor: color !== 'default' ? `${palette[color].main} !important` : undefined,\n\t\t// \t\tcolor: `#fff !important`,\n\t\t// \t},\n\t\t// \t[`& .${muiChipClasses.icon}`]: {\n\t\t// \t\tcolor: `${palette[color].main}`,\n\t\t// \t},\n\t\t// \t[`& .${chipClasses.deleteIcon}`]: {\n\t\t// \t\tcolor: `${palette[color].main} !important`,\n\t\t// \t},\n\t\t// },\n\t\t[`&:not(.${muiChipClasses.outlined})`]: {\n\t\t\t[`& .${muiChipClasses.avatar}`]: {\n\t\t\t\tbackgroundColor: `${palette[color].dark} !important`,\n\t\t\t\tcolor: `#fff !important`,\n\t\t\t},\n\t\t},\n\t\t...(meshAvatar\n\t\t\t? {\n\t\t\t\t\t[`& .${muiChipClasses.avatar}`]: {\n\t\t\t\t\t\tmarginLeft: 0,\n\t\t\t\t\t\twidth: 32,\n\t\t\t\t\t\theight: 32,\n\t\t\t\t\t},\n\t\t\t }\n\t\t\t: null),\n\t};\n});\n\nconst ChipDeleteIcon = styled('div', {\n\tname: CHIP_CLASS_NAME,\n\tslot: 'DeleteIcon',\n})(({theme}) => {\n\tconst deleteIconColor = alpha(theme.palette.text.primary, 0.26);\n\treturn {\n\t\t// Adjust for font-awesome\n\t\theight: `20px !important`,\n\t\tfontSize: `20px !important`,\n\t\tlineHeight: 1,\n\t\t// Make focusable\n\t\t'&:focus': {\n\t\t\tcolor: alpha(deleteIconColor, 0.34),\n\t\t\toutline: 'none',\n\t\t\toutlineStyle: 'none',\n\t\t\tboxShadow: 'none',\n\t\t\tborderColor: 'transparent',\n\t\t},\n\t};\n});\n\nconst ChipIconWrapper = styled('div', {\n\tname: CHIP_CLASS_NAME,\n\tslot: 'IconWrapper',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tpadding: theme.spacing(0, 0, 0, 0.75),\n}));\n\nexport type ChipProps = WithMuiPropOverrides<\n\tOmit\n> &\n\tWithClasses<\n\t\tChipClasses,\n\t\t{\n\t\t\tloading?: boolean;\n\t\t\tmeshAvatar?: boolean;\n\t\t\tdeleteTabbable?: boolean;\n\t\t\tdeleteTitle?: string;\n\t\t\ticon?: FontAwesomeIconProps['icon'] | null;\n\t\t\ttitle?: string;\n\t\t}\n\t>;\n\nconst ChipInner = (\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tcolor,\n\t\tdeleteTabbable,\n\t\tdeleteTitle,\n\t\tdisabled = false,\n\t\ticon,\n\t\tloading,\n\t\tmeshAvatar = false,\n\t\tvariant,\n\t\ttitle,\n\t\tonBlur,\n\t\tonFocus,\n\t\t...props\n\t}: ChipProps,\n\tref: ChipRef,\n) => {\n\tconst deleteIconRef = useRef(null);\n\tconst [focused, setFocused] = useState(false);\n\n\tconst ownerState: ChipUtilityProps = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tcolor,\n\t\tdisabled,\n\t\tmeshAvatar,\n\t\tvariant,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst [disableTitle, setDisableTitle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!focused || deleteTabbable) return;\n\t\tdeleteIconRef.current?.focus();\n\t});\n\n\tconst handleBlur = useCallback(\n\t\t(event) => {\n\t\t\tsetFocused(false);\n\t\t\tonBlur?.(event);\n\t\t},\n\t\t[onBlur],\n\t);\n\n\tconst handleFocus = useCallback(\n\t\t(event) => {\n\t\t\tsetFocused(true);\n\t\t\tonFocus?.(event);\n\t\t},\n\t\t[deleteTabbable, onFocus],\n\t);\n\n\tconst handleDeleteIconKeydown = useCallback(\n\t\t(event: React.KeyboardEvent) => {\n\t\t\tif (disabled) return;\n\n\t\t\tconst code = event.keyCode || event.which;\n\t\t\t// enter/space keys\n\t\t\tif (code === 13 || code === 32) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tdeleteIconRef.current?.click();\n\t\t\t}\n\t\t},\n\t\t[disabled],\n\t);\n\n\treturn (\n\t\t\n\t\t\t{loading ? (\n\t\t\t\t\n\t\t\t) : (\n\t\t\t\t {\n\t\t\t\t\t\t\t\t\tsetDisableTitle(true);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tonExited: () => {\n\t\t\t\t\t\t\t\t\tsetDisableTitle(false);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttitle={deleteTitle != null ? deleteTitle : i18n.t('i18n.remove')}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\ticon={\n\t\t\t\t\t\ticon ? (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t\townerState={ownerState}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport const ChipPrimitive = React.forwardRef(\n\tChipInner,\n) as React.ForwardRefExoticComponent;\n\nexport const Chip = ChipPrimitive;\n\nexport default Chip;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {\n\tButton as MuiButton,\n\tButtonProps as MuiButtonProps,\n\tTypography,\n} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport {getButtonSeverityStyles, Severity, Theme} from '../Theme';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tflex: '0 0 auto',\n\t\t},\n\t\tdisabled: {},\n\t\toutlined: {},\n\t\tcontained: {},\n\t\ttext: {},\n\t\t...getButtonSeverityStyles(theme),\n\t});\n\nexport interface ButtonProps extends MuiButtonProps {\n\tseverity?: Severity;\n}\n\nconst Button = React.forwardRef<\n\tHTMLButtonElement,\n\tWithStyles & ButtonProps\n>(\n\t(\n\t\t{\n\t\t\tclasses,\n\t\t\tchildren,\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\tseverity = 'default',\n\t\t\tvariant = 'text',\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tif (props.color != null && severity !== 'default') {\n\t\t\tconsole.warn(\n\t\t\t\t'unsetting `color` prop; do not use `color` and `severity` in tandem',\n\t\t\t);\n\t\t\tprops.color = undefined;\n\t\t}\n\n\t\treturn (\n\t\t\t\n\t\t\t\t{children}\n\t\t\t\n\t\t);\n\t},\n);\n\nexport default withStyles(styles)(Button);\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const FALLBACK_MESSAGE_CLASS_NAME = 'FallbackMessage';\nexport const FALLBACK_MESSAGE_CLASS_SLOTS = [\n\t'root',\n\t'children',\n\t'header',\n\t'icon',\n\t'body',\n\t'text',\n] as const;\n\nexport type FallbackMessageClassSlot = typeof FALLBACK_MESSAGE_CLASS_SLOTS[number];\n\nexport interface FallbackMessageClasses {\n\t/** styles applied to the root element */\n\troot: string;\n\tchildren: string;\n\theader: string;\n\tbody: string;\n\ticon: string;\n\ttext: string;\n\n\t// severities\n\terror: string;\n\tinfo: string;\n\tsuccess: string;\n\twarning: string;\n\n\t// variants\n\tlight: string;\n}\n\nexport type FallbackMessageClassKey = keyof FallbackMessageClasses;\n\nexport const getFallbackMessageUtilityClass = (\n\tslot: FallbackMessageClassSlot,\n) => generateUtilityClass(FALLBACK_MESSAGE_CLASS_NAME, slot);\n\nexport const fallbackMessageClasses: FallbackMessageClasses = generateUtilityClasses(\n\tFALLBACK_MESSAGE_CLASS_NAME,\n\t[\n\t\t'root',\n\t\t'body',\n\t\t'children',\n\t\t'header',\n\t\t'icon',\n\t\t'text',\n\t\t'light',\n\t\t'error',\n\t\t'info',\n\t\t'success',\n\t\t'warning',\n\t],\n);\n\nexport default fallbackMessageClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {Typography} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {CSSProperties} from '@mui/styles/withStyles';\nimport {\n\tSEVERITIES,\n\tSeverity,\n\tSeverityCSSProperties,\n\tTheme,\n\tcomposeClasses,\n\tstyled,\n\tWithClasses,\n} from '@netx/core-components/Theme';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport type {IconDefinition} from '@fortawesome/fontawesome-svg-core';\n\nimport {\n\tfallbackMessageClasses,\n\tFallbackMessageClasses,\n\tgetFallbackMessageUtilityClass,\n\tFALLBACK_MESSAGE_CLASS_NAME,\n} from './fallbackMessageClasses';\n\ntype FallbackMessageUtiltiyClassProps = WithClasses<\n\tFallbackMessageClasses,\n\t{\n\t\tseverity?: Severity;\n\t\tvariant?: 'default' | 'light';\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: FallbackMessageUtiltiyClassProps) => {\n\tconst {classes, severity, variant} = ownerState;\n\tconst slots = {\n\t\troot: ['root', variant],\n\t\ticon: ['icon', variant, severity],\n\t\ttext: ['text', variant, severity],\n\t\tchildren: ['children'],\n\t\tbody: ['body'],\n\t\theader: ['header', variant],\n\t};\n\treturn composeClasses(slots, getFallbackMessageUtilityClass, classes);\n};\n\nconst FallbackMessageRoot = styled('div', {\n\tname: FALLBACK_MESSAGE_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\talignItems: 'center',\n\tbackground: theme.palette.background.paper,\n\tflex: '1 1 auto',\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tjustifyContent: 'center',\n\tminHeight: 0,\n\toverflow: 'hidden',\n\tpadding: theme.spacing(3),\n\ttextAlign: 'center',\n\twidth: '100%',\n\t[`&.${fallbackMessageClasses.light}`]: {\n\t\t[`& .${fallbackMessageClasses.icon}`]: {\n\t\t\t...SEVERITIES.reduce((accum, key) => {\n\t\t\t\treturn key === 'default'\n\t\t\t\t\t? accum\n\t\t\t\t\t: {\n\t\t\t\t\t\t\t...accum,\n\t\t\t\t\t\t\t[`&.${key}`]: {\n\t\t\t\t\t\t\t\tcolor: theme.palette[key].light,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t };\n\t\t\t}, {}),\n\t\t},\n\t},\n\t[`&:not(.${fallbackMessageClasses.light})`]: {\n\t\t[`& .${fallbackMessageClasses.icon}`]: {\n\t\t\t...SEVERITIES.reduce((accum, key) => {\n\t\t\t\treturn key === 'default'\n\t\t\t\t\t? accum\n\t\t\t\t\t: {\n\t\t\t\t\t\t\t...accum,\n\t\t\t\t\t\t\t[`&.${key}`]: {\n\t\t\t\t\t\t\t\tcolor: theme.palette[key].main,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t };\n\t\t\t}, {}),\n\t\t},\n\t},\n}));\n\nconst FallbackMessageIcon = styled(FontAwesomeIcon, {\n\tname: FALLBACK_MESSAGE_CLASS_NAME,\n\tslot: 'Icon',\n})(({theme}) => ({\n\tcolor: theme.palette.custom.icon.onBackground,\n\theight: '75px !important',\n\twidth: '75px !important',\n\tmarginBottom: theme.spacing(2),\n}));\n\nconst FallbackMessageBody = styled('div', {\n\tname: FALLBACK_MESSAGE_CLASS_NAME,\n\tslot: 'Body',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tcolor: theme.palette.text.secondary,\n\twidth: '100%',\n}));\n\nconst FallbackMessageHeader = styled('div', {\n\tname: FALLBACK_MESSAGE_CLASS_NAME,\n\tslot: 'Header',\n})(({theme}) => ({\n\t[`&:not(.${fallbackMessageClasses.light}) .${fallbackMessageClasses.text}`]: {\n\t\tcolor: theme.palette.text.primary,\n\t},\n}));\n\nconst FallbackMessageText = styled(Typography, {\n\tname: FALLBACK_MESSAGE_CLASS_NAME,\n\tslot: 'Text',\n})(({theme}) => ({\n\t[`&.${fallbackMessageClasses.light}`]: {\n\t\tcolor: theme.palette.text.secondary,\n\t},\n}));\n\nconst FallbackMessageChildren = styled('div', {\n\tname: FALLBACK_MESSAGE_CLASS_NAME,\n\tslot: 'Children',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tmarginTop: theme.spacing(3),\n\twidth: '100%',\n}));\n\nexport type FallbackMessageProps = WithClasses<\n\tFallbackMessageClasses,\n\tReact.PropsWithChildren<{\n\t\ticon?: IconDefinition;\n\t\ttitle?: string;\n\t\tmessage?: string;\n\t\tseverity?: Severity;\n\t\tvariant?: 'default' | 'light';\n\t}>\n>;\n\n/**\n * A uniformed way to show fallback messages in the app \\\n * It will size to whatever container it is put in - it will not influence the size of the parent container\n */\nexport const FallbackMessage = ({\n\tchildren,\n\tclassName,\n\ticon,\n\tmessage,\n\ttitle,\n\t...props\n}: FallbackMessageProps) => {\n\tconst classes = useUtilityClasses(props);\n\n\tconst _icon = icon ? (\n\t\t\n\t) : null;\n\tconst _message =\n\t\tmessage != null ? (\n\t\t\t\n\t\t\t\t{message}\n\t\t\t\n\t\t) : null;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{_icon}\n\t\t\t\t{title ? (\n\t\t\t\t\t\n\t\t\t\t\t\t{title}\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\t\t\t\n\t\t\t\t{_message}\n\n\t\t\t\t{children ? (\n\t\t\t\t\t\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\t\t\n\t);\n};\n\nexport default React.memo(FallbackMessage);\n","export {default} from './Dialog';\nexport * from '@mui/material/Dialog/dialogClasses';\nexport {default as dialogClasses} from '@mui/material/Dialog/dialogClasses';\nexport * from './Dialog';\n","import {useRef, useEffect} from 'react';\n\nexport const useUpdateEffect = (\n\teffect: Function,\n\tdependencies?: React.DependencyList,\n) => {\n\tconst isInitialMount = useRef(true);\n\n\tuseEffect(() => {\n\t\tif (isInitialMount.current) {\n\t\t\tisInitialMount.current = false;\n\t\t\treturn;\n\t\t}\n\t\treturn effect();\n\t}, dependencies);\n};\n\nexport default useUpdateEffect;\n","import React from 'react';\n\nimport {ConfirmationServiceProvider} from './ConfirmationService';\n\n/**\n * wrap component in confirmation\n * @example\n\tconst WrappedComponenet = withConfirmation(Componenet);\n */\nexport const withConfirmation = function (\n\tComponent: C,\n) {\n\treturn (\n\t\tprops: JSX.IntrinsicAttributes &\n\t\t\tJSX.LibraryManagedAttributes>,\n\t) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t};\n};\n\nexport default withConfirmation;\n","import {ConfirmationServiceProvider} from './ConfirmationService';\nexport * from './withConfirmation';\nexport * from './ConfirmationService';\nexport default ConfirmationServiceProvider;\n","import {i18n} from '@netx/core/i18n';\nimport {UploadAssetItemStatus} from './constants';\n\nexport const UploadAssetItemStatusLabel = {\n\t[UploadAssetItemStatus.COLLISION_REJECTION]: i18n.t('i18n.duplicate'),\n\t[UploadAssetItemStatus.COMPLETED]: i18n.t('i18n.imported'),\n\t[UploadAssetItemStatus.DUPLICATE]: i18n.t('i18n.duplicate'),\n\t[UploadAssetItemStatus.ERROR]: i18n.t('i18n.error'),\n\t[UploadAssetItemStatus.IMPORTING]: i18n.t('i18n.importing'),\n\t[UploadAssetItemStatus.MISSING]: i18n.t('i18n.missing'),\n\t[UploadAssetItemStatus.PAUSED]: i18n.t('i18n.paused'),\n\t[UploadAssetItemStatus.PENDING]: i18n.t('i18n.pending'),\n\t[UploadAssetItemStatus.PROCESSING]: i18n.t('i18n.processing'),\n\t[UploadAssetItemStatus.RECOVERED]: i18n.t('i18n.recovered'),\n\t[UploadAssetItemStatus.RECOVERABLE_ERROR]: i18n.t('i18n.error'),\n\t[UploadAssetItemStatus.UPLOADING]: i18n.t('i18n.uploading'),\n};\n\nexport const UploadAssetConfirmation = {\n\tCONFIRM_DISCARD: i18n.t('i18n.confirmDiscardChanges'),\n};\n\nexport const UploadAssetMessage = {\n\tDUPLICATE_FILE_ADDED: i18n.t('i18n.uploadAssetDuplicateFileAdded'),\n\tINVALID_FILE_NAMES: i18n.t('i18n.invalidFileNames'),\n\tCONNECTION_LOST: i18n.t('i18n.connectionLost'),\n\tUPLOAD_STARTED_GOTO: i18n.t('i18n.uploadStartedClickProgress'),\n\tUPLOAD_STARTED: i18n.t('i18n.uploadStarted'),\n\tIMPORT_FAILED: ({fileName}: {fileName: string}) =>\n\t\ti18n.t('i18n.fileImportFailed', {file: fileName}),\n\tIMPORT_SUCCESS: ({fileName}: {fileName: string}) =>\n\t\ti18n.t('i18n.fileImportedSuccessfully', {file: fileName}),\n};\n\nexport const UploadBuilderLabel = {\n\tACTIVE: i18n.t('i18n.active'),\n\tCOMPLETED: i18n.t('i18n.completed'),\n\tFILE_COUNT: (count: number) => i18n.t('i18n.fileCount', {count}),\n\tFAILED: i18n.t('i18n.failed'),\n\tMISSING: i18n.t('i18n.missing'),\n\tPAUSED: i18n.t('i18n.paused'),\n\tPROGRESS: i18n.t('i18n.progress'),\n\tRECOVERED: i18n.t('i18n.recovered'),\n\tIMPORTING: i18n.t('i18n.importing'),\n};\n\nexport const UploadBuilderTitle = {\n\tUPLOADS: i18n.t('i18n.uploads'),\n\tUPLOAD: i18n.t('i18n.upload'),\n\tNEW_UPLOAD: i18n.t('i18n.newUpload'),\n\tEDIT_ATTRIBUTES: i18n.t('i18n.editAttributes'),\n};\n\nexport const UploadAssetWarning = {\n\tCOLLISION_REJECTED: ({fileName}: {fileName: string}) =>\n\t\ti18n.t('i18n.importCollisionRejectWarning', {file: fileName}),\n\tDUPLICATE_DETECTED: ({fileName}: {fileName: string}) =>\n\t\ti18n.t('i18n.importFileDuplicateWarning', {file: fileName}),\n\tFILE_DOES_NOT_MATCH: i18n.t('i18n.uploadAssetReselectMismatch'),\n\tMISSING_FILES: (count: number) =>\n\t\ti18n.t('i18n.uploadAssetMissingFiles', {count}),\n};\n\nexport const UploadAssetActionLabel = {\n\tADD_FILES: i18n.t('i18n.addFiles'),\n\tBACK: i18n.t('i18n.back'),\n\tCANCEL: i18n.t('i18n.cancel'),\n\tCLEAR: i18n.t('i18n.clear'),\n\tCLICK_TO_ADD_FILES: i18n.t('i18n.clickToAddFiles'),\n\tDROP_FILES_HERE: i18n.t('i18n.orDropFilesHere'),\n\tGOTO: i18n.t('i18n.goto'),\n\tGOTO_ASSET: i18n.t('i18n.viewAsset'),\n\tGOTO_FOLDER: i18n.t('i18n.gotoCategory'),\n\tGOTO_STATUS: i18n.t('i18n.gotoStatus'),\n\tNEW_UPLOAD: i18n.t('i18n.newUpload'),\n\tNEXT: i18n.t('i18n.next'),\n\tPAUSE: i18n.t('i18n.pause'),\n\tPAUSE_ALL: i18n.t('i18n.pauseAll'),\n\tREMOVE: i18n.t('i18n.remove'),\n\tRESELECT: i18n.t('i18n.reSelectFile'),\n\tRESUME: i18n.t('i18n.resume'),\n\tRESUME_ALL: i18n.t('i18n.resumeAll'),\n\tRETRY: i18n.t('i18n.retry'),\n\tSELECT_CATEGORY: i18n.t('i18n.selectCategory'),\n\tUPLOAD: i18n.t('i18n.upload'),\n\tVIEW_DUPLICATE: i18n.t('i18n.viewDuplicate'),\n};\n\nexport const UploadAssetProcessLabel = {\n\tImportingTask: i18n.t('i18n.importing'),\n\tVisualDescriptorTask: i18n.t('i18n.performingTaskVisualDescriptor'),\n\tImageProxiesTask: i18n.t('i18n.performingTaskImageProxies'),\n\tAudioTask: i18n.t('i18n.performingTaskAudio'),\n\tFFFViewTask: i18n.t('i18n.performingTaskFFFView'),\n\tINDDPageTask: i18n.t('i18n.performingTaskINDDPage'),\n\tIWorkPageTask: i18n.t('i18n.performingTaskIWorkPage'),\n\tKeyframesTask: i18n.t('i18n.performingTaskKeyframes'),\n\tMetadataTask: i18n.t('i18n.performingTaskMetadata'),\n\tOfficePageTask: i18n.t('i18n.performingTaskOfficePage'),\n\tPDFPageTask: i18n.t('i18n.performingTaskPDFPage'),\n\tPostImportTask: i18n.t('i18n.performingTaskPostImport'),\n\tPreviewTask: i18n.t('i18n.performingTaskPreview'),\n\tRelatedAssetTask: i18n.t('i18n.performingTaskRelatedAssets'),\n\tSWFTask: i18n.t('i18n.performingTaskSWF'),\n\tThumbnailTask: i18n.t('i18n.performingTaskThumbnail'),\n\tVideoPreviewTask: i18n.t('i18n.performingTaskVideoPeview'),\n\tWatermarkTask: i18n.t('i18n.performingTaskWatermark'),\n\tZoomTask: i18n.t('i18n.performingTaskZoom'),\n\tZoomTileTask: i18n.t('i18n.performingTaskZoomTiles'),\n};\n","export {default} from './Alert';\nexport * from './Alert';\nexport * from '@mui/material/Alert/alertClasses';\nexport {default as alertClasses} from '@mui/material/Alert/alertClasses';\n","import React, {useCallback, useEffect, useState} from 'react';\nimport ReactDOM from 'react-dom';\nimport {\n\tSlide,\n\tSlideProps,\n\tSnackbar as MuiSnackbar,\n\tSnackbarProps as MuiSnackbarProps,\n} from '@mui/material';\n\nimport {TransitionProps} from '@mui/material/transitions';\nimport Alert, {AlertProps} from '../Alert';\n\nexport interface SnackbarOptions\n\textends Omit,\n\t\tPick {}\n\nexport interface SnackbarProps extends SnackbarOptions {\n\topen: boolean;\n}\n\ntype MuiSnackbarMethods = Required>;\n\nconst TransitionUp: React.FunctionComponent = React.forwardRef<\n\tHTMLElement,\n\tSlideProps\n>(function Transition(props, ref) {\n\treturn ;\n});\n\nexport const Snackbar: React.FunctionComponent> = ({\n\tonClick,\n\tmessage,\n\topen,\n\tseverity = 'info',\n\tvariant = 'filled',\n\t...props\n}) => {\n\tconst [isOpen, setIsOpen] = useState(open);\n\n\tuseEffect(() => {\n\t\tsetIsOpen(open);\n\t}, [open]);\n\n\tconst handleClose = useCallback(\n\t\t(event, reason) => {\n\t\t\tif (reason === 'clickaway') return;\n\t\t\tsetIsOpen(false);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleAlertClose = useCallback(\n\t\t(event: React.SyntheticEvent) => {\n\t\t\tevent.stopPropagation();\n\t\t\tsetIsOpen(false);\n\t\t},\n\t\t[],\n\t);\n\n\treturn ReactDOM.createPortal(\n\t\t {\n\t\t\t\t\t\t\tonClick(event);\n\t\t\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t\t }\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\t{...props}\n\t\t\tstyle={{\n\t\t\t\tcursor: onClick ? 'pointer' : undefined,\n\t\t\t\t...props.style,\n\t\t\t}}\n\t\t>\n\t\t\t\n\t\t\t\t{message}\n\t\t\t\n\t\t,\n\t\tdocument.body,\n\t);\n};\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {Snackbar, SnackbarOptions} from './Snackbar';\nexport type {SnackbarOptions} from './Snackbar';\n\nconst SnackbarServiceContext = createContext<\n\t(options: SnackbarOptions) => void\n>(() => {});\n\nexport const useSnackbar = () => useContext(SnackbarServiceContext);\n\nexport const SnackbarServiceProvider = ({children}) => {\n\tconst [snackbarOpen, setSnackbarOpen] = useState(false);\n\tconst [snackbarState, setSnackbarState] = useState();\n\tconst nextSnackbarStateRef = useRef();\n\tconst lastSnackbarStateRef = useRef();\n\n\tuseEffect(() => {\n\t\tlastSnackbarStateRef.current = snackbarState;\n\t}, [snackbarState]);\n\n\tconst handleExited = useCallback(() => {\n\t\tsetSnackbarState(nextSnackbarStateRef.current || undefined);\n\t\tsetSnackbarOpen(nextSnackbarStateRef.current != null);\n\t\tnextSnackbarStateRef.current = undefined;\n\t}, []);\n\n\tconst handleOpenSnackbar = useCallback((options: SnackbarOptions) => {\n\t\tif (lastSnackbarStateRef.current != null) {\n\t\t\tnextSnackbarStateRef.current = options;\n\t\t\tsetSnackbarOpen(false);\n\t\t\treturn;\n\t\t}\n\t\tsetSnackbarOpen(true);\n\t\tsetSnackbarState(options);\n\t}, []);\n\n\treturn (\n\t\t<>\n\t\t\t\n\n\t\t\t\n\t\t\n\t);\n};\n","import React from 'react';\n\nimport {SnackbarServiceProvider} from './SnackbarService';\n\n/**\n * wrap component in snack bar provider\n * @example\n\tconst WrappedComponenet = withSnackbar(Componenet);\n */\nexport const withSnackbar = function (\n\tComponent: C,\n) {\n\treturn (\n\t\tprops: JSX.IntrinsicAttributes &\n\t\t\tJSX.LibraryManagedAttributes>,\n\t) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t};\n};\n\nexport default withSnackbar;\n// Type '\n// IntrinsicAttributes & LibraryManagedAttributes>\n// is not assignable to type\n// LibraryManagedAttributes>>\n","import {SnackbarServiceProvider} from './SnackbarService';\nexport * from './withSnackbar';\nexport * from './SnackbarService';\nexport default SnackbarServiceProvider;\n","import {USER_LEVEL} from '@netx/core-user/constants';\n\nexport enum UploadAssetPref {\n\tSELECTED_ATTRIUBUTE_SET = 'attribute.attributeSets.selected.uploadAsset',\n}\n\nexport enum UploadAssetItemStatus {\n\tCOLLISION_REJECTION = 'collision_rejection',\n\tERROR = 'error',\n\tCOMPLETED = 'completed',\n\tDUPLICATE = 'duplicate',\n\tMISSING = 'missing',\n\tIMPORTING = 'importing',\n\tPROCESSING = 'processing', // tasks\n\tPAUSED = 'paused',\n\tPENDING = 'pending',\n\tRECOVERABLE_ERROR = 'recoverable_error',\n\tRECOVERED = 'recovered',\n\tUPLOADING = 'uploading',\n}\n\nexport const UPLOAD_ASSET_MINIMUM_USER_LEVEL = USER_LEVEL.IMPORTER;\n\n// This pattern only matches strings that do NOT contain illegal chars for category names\nexport const invalidCharsPattern = /[~—|+<>:?*\\\\\\/]/g;\nexport const invalidPeriodsPattern = /^(?!\\.)(?!.*\\.$)(?!.*?\\.\\.)/;\n// This string is the human-readable translation of the above string, for explanatory messages:\nexport const invalidNameCharacters = '/ \\\\ . + \" : * | < > ?';\n\n/**\n * Statuses that are active in the store, whether pausable/removable or not\n */\nexport const ACTIVE_STATUSES = [\n\tUploadAssetItemStatus.IMPORTING,\n\tUploadAssetItemStatus.PENDING,\n\tUploadAssetItemStatus.PROCESSING,\n\tUploadAssetItemStatus.UPLOADING,\n];\n\n/**\n * Statuses that have no further action available in the store\\\n * Unrecoverable erros and completion\n */\nexport const COMPLETED_STATUSES = [\n\tUploadAssetItemStatus.COLLISION_REJECTION,\n\tUploadAssetItemStatus.COMPLETED,\n\tUploadAssetItemStatus.DUPLICATE,\n\tUploadAssetItemStatus.ERROR,\n];\n\nexport const ACTIONABLE_COMPLETED_STATUSES = [\n\tUploadAssetItemStatus.COMPLETED,\n\tUploadAssetItemStatus.DUPLICATE,\n\tUploadAssetItemStatus.COLLISION_REJECTION,\n];\n\nexport const INACTIVE_STATUSES = [\n\tUploadAssetItemStatus.COLLISION_REJECTION,\n\tUploadAssetItemStatus.COMPLETED,\n\tUploadAssetItemStatus.DUPLICATE,\n\tUploadAssetItemStatus.ERROR,\n\tUploadAssetItemStatus.MISSING,\n];\n\nexport const PAUSABLE_STATUSES = [\n\tUploadAssetItemStatus.UPLOADING,\n\tUploadAssetItemStatus.PENDING,\n];\n\nexport const PAUSED_STATUSES = [\n\tUploadAssetItemStatus.RECOVERED,\n\tUploadAssetItemStatus.PAUSED,\n\tUploadAssetItemStatus.RECOVERABLE_ERROR,\n];\n\nexport const PROGRESS_STATUSES = [\n\tUploadAssetItemStatus.PAUSED,\n\tUploadAssetItemStatus.PENDING,\n\tUploadAssetItemStatus.PROCESSING,\n\tUploadAssetItemStatus.RECOVERED,\n\tUploadAssetItemStatus.UPLOADING,\n\tUploadAssetItemStatus.IMPORTING,\n\tUploadAssetItemStatus.MISSING,\n];\n\n/**\n * Statuses that can be removed from the store\n */\nexport const REMOVABLE_STATUSES = [\n\tUploadAssetItemStatus.COLLISION_REJECTION,\n\tUploadAssetItemStatus.COMPLETED,\n\tUploadAssetItemStatus.DUPLICATE,\n\tUploadAssetItemStatus.ERROR,\n\tUploadAssetItemStatus.MISSING,\n\tUploadAssetItemStatus.PAUSED,\n\tUploadAssetItemStatus.PENDING,\n\tUploadAssetItemStatus.RECOVERABLE_ERROR,\n\tUploadAssetItemStatus.RECOVERED,\n\tUploadAssetItemStatus.UPLOADING,\n];\n\nexport const RESUMABLE_STATUSES = [UploadAssetItemStatus.PAUSED];\n","import Netx from '@netx/core/bootstrap';\nimport equal from 'fast-deep-equal';\n\nimport {GridEditor, GridEditorColumn, HypergridCellEvent, Point} from './types';\n\nexport const appendValue = (value1: any, value2: any, appendChar?: string) => {\n\tif (value1 == null) return value2;\n\tif (value2 == null) return value1;\n\tif (Array.isArray(value1) && Array.isArray(value2))\n\t\treturn [...new Set([...value1, ...value2])];\n\treturn `${value1}${appendChar || ''}${value2}`;\n};\n\ntype BreakItUpOptions = {\n\tamount?: number;\n\tdelay?: number;\n\tincrement?: number;\n\tsize: number;\n\tstart?: number;\n};\n\nconst defaultOptions: Required> = {\n\tstart: 0,\n\tamount: 10,\n\tincrement: 1,\n\tdelay: 2,\n};\n\nexport async function breakItUp(\n\toptions: BreakItUpOptions,\n\tprocessCallback: (index: number) => false | void,\n): Promise;\n\nexport async function breakItUp(\n\toptions: BreakItUpOptions,\n\tprocessCallback: (index: number) => false | void,\n\tcompleteCallback?: () => T,\n): Promise;\n\nexport async function breakItUp(\n\toptions: BreakItUpOptions,\n\tprocessCallback: (index: number) => false | void,\n\tcompleteCallback?: () => T,\n): Promise {\n\toptions = {...defaultOptions, ...options};\n\tconst {amount, delay, increment, size, start} = options as Required<\n\t\tBreakItUpOptions\n\t>;\n\n\tlet idx = 0;\n\n\treturn new Promise((resolve, reject) => {\n\t\t// So we are not creating a new anonymouse function each chunk we iterate over (delays and all)\n\t\tconst process = function (start: number, amt: number) {\n\t\t\t// Vars\n\t\t\tlet processed: void | false;\n\n\t\t\t// Keep in bounds\n\t\t\tif (start < 0) start = 0;\n\t\t\tlet end = start + amount;\n\t\t\tif (end > size) end = size;\n\n\t\t\tlet i = start;\n\t\t\t// Process\n\t\t\tfor (; i < end; i += increment) {\n\t\t\t\t// Return false in your process callback to end the loop and just fire the complete callback\n\t\t\t\tprocessed = processCallback.call(self, i);\n\t\t\t\tidx++;\n\t\t\t\tif (processed === false) break;\n\t\t\t}\n\n\t\t\t// Next\n\t\t\tif (processed !== false && i <= size - 1) {\n\t\t\t\tbrokenUp(i, amount);\n\t\t\t}\n\t\t\t// Finished\n\t\t\telse {\n\t\t\t\tresolve(\n\t\t\t\t\ttypeof completeCallback === 'function' ? completeCallback() : null,\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t\t// I am trying this out so that we might be able to give some progress indication in the event that\n\t\t// we are trying to edit a whole lot of cells (so the screen isn't just locked up)\n\t\tconst brokenUp = function (start: number, amt: number) {\n\t\t\t// No delay on first call\n\t\t\tidx === 0 ? process(start, amt) : setTimeout(process, delay, start, amt);\n\t\t};\n\t\t// Start\n\t\tbrokenUp(start, amount);\n\t});\n}\n\nexport const checkEquality = (newValue: any, originalValue: any) => {\n\treturn (\n\t\t((originalValue == null || originalValue === '') &&\n\t\t\t(newValue == null || newValue === '')) ||\n\t\tequal(originalValue, newValue)\n\t);\n};\n\nexport const getAppendChar = () => {\n\tlet appendChar = Netx.getPreference('metadata.appendChars') as string;\n\tif (appendChar == null) {\n\t\tappendChar = ' ';\n\t}\n\treturn appendChar;\n};\n\nexport const getBehaviorFromGrid = (plugin: GridEditor) => {\n\treturn plugin.behavior;\n};\n\nexport const getDataModelFromGrid = (plugin: GridEditor) => {\n\treturn getBehaviorFromGrid(plugin).dataModel;\n};\n\nexport const getDataSourceFromGrid = (plugin: GridEditor) => {\n\treturn getDataModelFromGrid(plugin).dataSource;\n};\n\nexport const getColumnFromGrid = (plugin: GridEditor, x: number) => {\n\treturn getBehaviorFromGrid(plugin).columns[x];\n};\n\nexport const getColumnsFromGrid = (plugin: GridEditor) => {\n\treturn getBehaviorFromGrid(plugin).allColumns;\n};\n\nexport const getSortIndexesFromGrid = (plugin: GridEditor) => {\n\treturn getDataModelFromGrid(plugin).sortIndex;\n};\n\nexport const getDataFromGrid = (plugin: GridEditor) => {\n\treturn getDataSourceFromGrid(plugin).data;\n};\n\nexport const getDataFromPoint = (plugin: GridEditor, point: Point) => {\n\treturn getDataFromGrid(plugin)[point.y];\n};\n\nexport const getDataPointFromCellEvent = (event: HypergridCellEvent) => {\n\tif (event.dataCell) {\n\t\treturn event.dataCell;\n\t}\n\n\tconst detail = event.detail;\n\treturn detail.input !== void 0 && detail.input.event !== void 0\n\t\t? detail.input.event.dataCell\n\t\t: detail.dataCell;\n};\n\nimport {FormActions, FormValues} from '@netx/core-components/Form';\n\nexport const getUpdatedValueData = (\n\tassetId: number,\n\tnewValues: FormValues,\n\trowData: FormValues,\n\tinitialiValues: FormValues[],\n\tcolumn: any,\n\tactions?: FormActions,\n\tappendChar?: string,\n) => {\n\tconst {name} = column;\n\tconst action = actions?.[name] || 'overwrite';\n\n\tlet newValue = newValues[name];\n\tif (action === 'clear') newValue = null;\n\tif (newValue === void 0) return;\n\n\tnewValue =\n\t\taction === 'append'\n\t\t\t? appendValue(rowData[name], newValue, appendChar)\n\t\t\t: newValue;\n\n\tnewValue = column.properties.parseInValue\n\t\t? column.properties.parseInValue(newValue)\n\t\t: newValue;\n\n\tconst originalValue = initialiValues.find(\n\t\t(data) => data.assetId === assetId,\n\t)?.[name];\n\n\treturn {\n\t\tvalue: newValue,\n\t\tchanged: !checkEquality(newValue, originalValue),\n\t};\n};\n\nexport const getColumnsByName = (columns: GridEditorColumn[]) => {\n\tconst columnsByName: {\n\t\t[column_name: string]: any;\n\t} = {};\n\tcolumns.forEach((column) => {\n\t\tcolumnsByName[column.name] = column;\n\t});\n\treturn columnsByName;\n};\n","import React, {useCallback} from 'react';\n\nimport {ListItemIcon, ListItemText, MenuItem, Typography} from '@mui/material';\nimport IconButton, {IconButtonProps} from '@netx/core-components/IconButton';\nimport Button, {ButtonProps} from '@netx/core-components/Button';\nimport {MenuItemProps} from '@mui/material/MenuItem';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {IconProp} from '@fortawesome/fontawesome-svg-core';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport ToggleButton, {ToggleButtonProps} from '../ToggleButton';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {},\n\t\tmenuIconWrapper: {\n\t\t\t// It is just too darn wide\n\t\t\tminWidth: 42,\n\t\t},\n\t});\n\ntype ComponentProps = {\n\t'data-testid'?: string;\n} & (\n\t| Partial>\n\t| Partial>\n\t| Partial>\n\t| Partial>\n);\n\nexport interface ActionButtonProps {\n\tcolor?: string;\n\tclassName?: string;\n\tdisabled?: boolean;\n\ticon?: IconProp;\n\tlabel: string;\n\tonClick(...args: any[]): void;\n\tonKeyDown?: (...args: any[]) => void;\n\tvariant?: 'fab' | 'icon' | 'menu' | 'standard' | 'toggle';\n\ttabIndex?: number;\n\tsize?: ButtonProps['size'];\n\tchecked?: boolean;\n\tComponentProps?: ComponentProps;\n}\n\nconst ActionButton: React.FunctionComponent<\n\tWithStyles & ActionButtonProps\n> = ({\n\tclasses,\n\n\tclassName,\n\tdisabled,\n\ticon,\n\tlabel,\n\tonClick,\n\tonKeyDown,\n\tvariant,\n\tsize,\n\ttabIndex,\n\tchecked = false,\n\tComponentProps,\n}) => {\n\tvariant = variant == null ? 'standard' : variant;\n\tComponentProps = ComponentProps || {};\n\n\tconst handleClick = useCallback(\n\t\t(event) => {\n\t\t\tevent.persist && event.persist();\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t\tonClick(event);\n\t\t},\n\t\t[onClick],\n\t);\n\n\tconst commonProps = {\n\t\tclassName,\n\t\tdisabled,\n\t\tonClick: handleClick,\n\t\tonKeyDown,\n\t};\n\n\tswitch (variant) {\n\t\tcase 'fab':\n\t\tcase 'icon':\n\t\t\treturn icon ? (\n\t\t\t\t)}\n\t\t\t\t\tvariant={variant === 'icon' ? undefined : variant}\n\t\t\t\t/>\n\t\t\t) : null;\n\t\tcase 'menu':\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t{icon ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t) : null}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t);\n\t\tcase 'toggle':\n\t\t\tif (!icon) return null;\n\t\t\treturn (\n\t\t\t\t\n\t\t\t);\n\t\t//case 'standard':\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t\ttabIndex={tabIndex != null ? tabIndex : undefined}\n\t\t\t\t\t{...commonProps}\n\t\t\t\t\t{...(ComponentProps as Partial)}\n\t\t\t\t>\n\t\t\t\t\t\n\t\t\t\t\t\t{label}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t);\n\t}\n};\n\nActionButton.displayName = 'ActionButton';\n\nexport default withStyles(styles, {\n\tname: 'ActionButton',\n})(React.memo(ActionButton));\n","import React, {useState} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {useUpdateEffect} from '@netx/core-components/hooks';\nimport {isEmptyValue} from '@netx/core-components/Form';\n\nimport {AttributeAttributes} from '@netx/core-asset/models/attribute';\nimport {ATTRIBUTE_MULTIPLE_VALUE_TYPES} from '../constants';\n\nexport interface Modifiers {\n\tcleared?: boolean;\n\tdisable?: boolean;\n\tmultipleValues?: boolean;\n\treadOnly?: boolean;\n\tvalue?: any;\n}\n\nexport const usePlaceholder = (\n\tattrData: AttributeAttributes,\n\tdefaultPlaceholder = '',\n\tmodifiers: Modifiers = {\n\t\tcleared: false,\n\t\tdisable: false,\n\t\tmultipleValues: false,\n\t\treadOnly: false,\n\t},\n): string => {\n\tconst getPlaceholder = () => {\n\t\tconst isMultipleField = ATTRIBUTE_MULTIPLE_VALUE_TYPES.includes(\n\t\t\tattrData.type as typeof ATTRIBUTE_MULTIPLE_VALUE_TYPES[number],\n\t\t);\n\t\treturn modifiers.disable || !isEmptyValue(modifiers.value)\n\t\t\t? ''\n\t\t\t: modifiers.cleared\n\t\t\t? i18n.t('i18n.tagPanelEmptiedValue')\n\t\t\t: (modifiers.multipleValues && i18n.t('i18n.tagPanelMultipleValues')) ||\n\t\t\t (modifiers.readOnly && '(none)') ||\n\t\t\t defaultPlaceholder ||\n\t\t\t (isMultipleField ? i18n.t('i18n.makeSelection') : '');\n\t};\n\n\tconst [placeholder, setPlaceholder] = useState(getPlaceholder());\n\n\tuseUpdateEffect(() => {\n\t\tsetPlaceholder(getPlaceholder());\n\t}, [attrData.type, defaultPlaceholder, modifiers]);\n\n\treturn placeholder;\n};\n\nexport default usePlaceholder;\n","import {FormType, InputForm} from './';\n\nconst INPUT_FORM_KEYS = [\n\t'register',\n\t'unregister',\n\t'setError',\n\t'clearError',\n\t'setAction',\n\t'setValue',\n\t'setChange',\n\t'updateOptions',\n\t'errorsRef',\n\t'valuesRef',\n\t'validateField',\n] as const;\n\n/**\n * Get form items needed to run an input\n * By not passing the whole form object to an input we have much\n * better control over inputs rendering (and better performance)\n * The methods used are wrapped in useCallback\n */\nexport const getInputFormObject = = FormType>(\n\tform: T,\n): InputForm => {\n\treturn Object.fromEntries(\n\t\tObject.entries(form).filter(([key]) =>\n\t\t\tINPUT_FORM_KEYS.includes(key as any),\n\t\t),\n\t) as InputForm;\n};\n\n/** Check if attribute value is empty/undefined */\nexport const isEmptyValue = (value: any): boolean => {\n\tif (value === void 0 || value == null) return true;\n\tif (value.length === 0) return true;\n\t// if (typeof value === 'string' && !value.trim().length) return true;\n\treturn false;\n};\n\n/** Check attribute values match */\nexport const valuesMatch = (\n\tcurrentValue: any,\n\toriginalValue: any,\n\tmultipleValues = false,\n): boolean => {\n\tcurrentValue = Array.isArray(currentValue)\n\t\t? currentValue.join()\n\t\t: currentValue;\n\toriginalValue = Array.isArray(originalValue)\n\t\t? originalValue.join()\n\t\t: originalValue;\n\n\t// Overriding mutliple values with a value\n\tif (multipleValues && currentValue != null) return false;\n\n\t// Treat null as empty\n\tif (currentValue === '' && originalValue == null) return true;\n\n\t// Difference in how java sends back dates mm/dd/yyyy\n\t// and we send/manage in yyyy-mm-dd\n\tif (\n\t\toriginalValue &&\n\t\toriginalValue.toString().match(/^\\d{2}\\/\\d{2}\\/\\d{4}$/)\n\t) {\n\t\toriginalValue = originalValue.replace(/(..).(..).(....)/, '$3-$1-$2');\n\t}\n\tif (currentValue && currentValue.toString().match(/^\\d{2}\\/\\d{2}\\/\\d{4}$/)) {\n\t\tcurrentValue = currentValue.replace(/(..).(..).(....)/, '$3-$1-$2');\n\t}\n\n\tif (currentValue == null && originalValue == null) return true;\n\tif (currentValue == null && originalValue != null) return false;\n\tif (currentValue != null && originalValue == null) return false;\n\n\treturn JSON.stringify(currentValue) === JSON.stringify(originalValue);\n};\n","// TODO: only supports vertical shadows right now - add support for horizontal\nconst shadow = [\n\t'radial-gradient(farthest-side at 50% 0px, rgba(0,0,0,.2), rgba(0,0,0,0))', // Top\n\t'radial-gradient(farthest-side at 50% 100%, rgba(0,0,0,.2), rgba(0,0,0,0)) 0 100%', // Bottom\n];\nconst shadowSize = ['100% 6px', '100% 14px'];\nexport const createShadow = (side: 'top' | 'bottom' | 'all') => {\n\tconst styles = {\n\t\tbackgroundRepeat: 'no-repeat',\n\t};\n\tswitch (side) {\n\t\tcase 'top':\n\t\t\treturn {\n\t\t\t\t...styles,\n\t\t\t\tbackground: shadow[0],\n\t\t\t\tbackgroundSize: shadowSize.join(),\n\t\t\t};\n\t\tcase 'bottom':\n\t\t\treturn {\n\t\t\t\t...styles,\n\t\t\t\tbackground: shadow[1],\n\t\t\t\tbackgroundSize: shadowSize.join(),\n\t\t\t};\n\t\tcase 'all':\n\t\t\treturn {\n\t\t\t\t...styles,\n\t\t\t\tbackground: shadow.join(),\n\t\t\t\tbackgroundSize: `${shadowSize[0]}, ${shadowSize[0]}, ${shadowSize[1]}, ${shadowSize[1]}`,\n\t\t\t};\n\t}\n};\n\nexport default createShadow;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface ScrollSentinelClasses {\n\t/** styles applied to the root element */\n\troot: string;\n}\n\nexport const getSentinelUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('Sentinel', slot);\n\nexport const scrollSentinelClasses = generateUtilityClasses<\n\tkeyof ScrollSentinelClasses\n>('Sentinel', ['root']);\nexport default scrollSentinelClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {composeClasses, styled, WithClasses} from '../Theme';\nimport {\n\tgetSentinelUtilityClass,\n\tScrollSentinelClasses,\n} from './scrollSentinelClasses';\n\ntype ScrollSentinelUtilityClasses = WithClasses;\n\nconst useUtilityClasses = (ownerState: ScrollSentinelUtilityClasses) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getSentinelUtilityClass, classes);\n};\n\nconst ScrollSentinelRoot = styled('div', {\n\tname: 'ScrollSentinel',\n\tslot: 'Root',\n})(({theme}) => ({\n\tflex: '0 0 auto',\n\theight: 1,\n\twidth: 1,\n}));\n\nexport interface ScrollSentinelProps\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes,\n\t\t\tHTMLDivElement\n\t\t>,\n\t\tWithClasses {}\n\nexport const ScrollSentinel = React.forwardRef<\n\tHTMLDivElement,\n\tScrollSentinelProps\n>(({classes: _classes, className, ...props}, ref) => {\n\tconst classes = useUtilityClasses({classes: _classes});\n\treturn (\n\t\t\n\t);\n});\n\nexport default ScrollSentinel;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface ScrollBorderClasses {\n\t/** styles applied to the root element */\n\troot: string;\n\thasOverflow: string;\n\tscrolled: string;\n\tscrolledToEnd: string;\n\tuseShadow: string;\n\tscrollSentinel: string;\n\n\tscrollBorderBottom: string;\n\tscrollBorderTop: string;\n\tscrollWrapper: string;\n}\n\nexport const getScrollBorderUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('ScrollBorder', slot);\n\nexport const scrollBorderClasses = generateUtilityClasses<\n\tkeyof ScrollBorderClasses\n>('ScrollBorder', [\n\t'root',\n\t'hasOverflow',\n\t'scrolled',\n\t'scrolledToEnd',\n\t'scrollBorderBottom',\n\t'scrollBorderTop',\n\t'scrollSentinel',\n\t'scrollWrapper',\n\t'useShadow',\n]);\nexport default scrollBorderClasses;\n","import {useCallback, useEffect, useRef} from 'react';\n\n/**\n * Manage intersection observation for `n` items\n * @param cb Callback when entries are updated\n * @param opts Options\n */\nexport const useIntersectionObserver = (\n\tcb: (entries: IntersectionObserverEntry[]) => void,\n\topts?: Omit,\n) => {\n\tconst ref = useRef(null);\n\n\tconst refs = useRef<\n\t\t{\n\t\t\tindex: number;\n\t\t\telement: HTMLDivElement;\n\t\t}[]\n\t>([]);\n\n\tconst observer = useRef(null);\n\t// \tnew IntersectionObserver(cb, {threshold: 0.51, ...opts, root: ref.current}),\n\t// );\n\n\tuseEffect(() => {\n\t\tobserver.current = new IntersectionObserver(cb, {\n\t\t\tthreshold: 0.51,\n\t\t\t...opts,\n\t\t\troot: ref.current,\n\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\trefs.current.forEach((ref) => {\n\t\t\t\tobserver.current?.unobserve(ref.element);\n\t\t\t});\n\t\t\trefs.current = [];\n\t\t\tobserver.current?.disconnect();\n\t\t};\n\t}, []);\n\n\t/**\n\t * Register child ref\n\t */\n\tconst registerRef = useCallback((index, node) => {\n\t\tconst currentObserver = observer.current;\n\t\tconst exists = refs.current.find((ref) => ref.index === index);\n\n\t\t// If the node is `null` then remove it\n\t\tif (!node) {\n\t\t\tif (exists) {\n\t\t\t\tcurrentObserver?.unobserve(exists.element);\n\t\t\t\trefs.current = refs.current.filter((ref) => ref.index !== index);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Just needs to be updated\n\t\tif (exists) {\n\t\t\texists.element = node;\n\t\t\tcurrentObserver?.unobserve(exists.element);\n\t\t\tcurrentObserver?.observe(node);\n\t\t}\n\t\t// Brand new\n\t\telse {\n\t\t\trefs.current = refs.current.concat([\n\t\t\t\t{\n\t\t\t\t\tindex,\n\t\t\t\t\telement: node,\n\t\t\t\t},\n\t\t\t]);\n\t\t\tcurrentObserver?.observe(node);\n\t\t}\n\t}, []);\n\n\t/**\n\t * Un-register child ref\n\t */\n\tconst unregisterRef = useCallback((index) => {\n\t\tconst exists = refs.current.find((ref) => ref.index === index);\n\t\tif (!exists) return;\n\n\t\tconst currentObserver = observer.current;\n\t\tcurrentObserver?.unobserve(exists.element);\n\t\trefs.current = refs.current.filter((ref) => ref.index !== index);\n\t}, []);\n\n\treturn {\n\t\tregisterRef,\n\t\tunregisterRef,\n\t\tref,\n\t};\n};\n\nexport default useIntersectionObserver;\n","import React, {useState, useLayoutEffect} from 'react';\nimport clsx from 'clsx';\nimport ResizeObserver from 'resize-observer-polyfill';\n\nimport {composeClasses, styled} from '@netx/core-components/Theme';\n\nimport {ScrollSentinel} from './ScrollSentinel';\nimport {\n\tgetScrollBorderUtilityClass,\n\tscrollBorderClasses,\n\tScrollBorderClasses,\n} from './scrollBorderClasses';\nimport createShadow from './createShadow';\nimport useSharedRef from '../hooks/useSharedRef';\nimport useIntersectionObserver from '../hooks/useIntersectionObserver';\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {hasOverflow, scrolled, scrolledToEnd, useShadow, classes} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\thasOverflow && 'hasOverflow',\n\t\t\tscrolled && 'scrolled',\n\t\t\tscrolledToEnd && 'scrolledToEnd',\n\t\t\tuseShadow && 'useShadow',\n\t\t],\n\t\tscrollBorderBottom: ['scrollBorderBottom'],\n\t\tscrollBorderTop: ['scrollBorderTop'],\n\t\tscrollWrapper: ['scrollWrapper'],\n\t\tscrollSentinel: ['scrollSentinel'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetScrollBorderUtilityClass,\n\t\tclasses as typeof scrollBorderClasses,\n\t);\n};\n\nconst ScrollBorderBottom = styled('div', {\n\tname: 'ScrollBorder',\n\tslot: 'ScrollBorderBottom',\n})(({theme}) => ({\n\tposition: 'absolute',\n\tbottom: 0,\n\twidth: '100%',\n\theight: 25,\n\tzIndex: 99,\n\tpointerEvents: 'none',\n}));\n\nconst ScrollBorderTop = styled('div', {\n\tname: 'ScrollBorder',\n\tslot: 'ScrollBorderTop',\n})(({theme}) => ({\n\tposition: 'absolute',\n\ttop: 0,\n\twidth: '100%',\n\theight: 25,\n\tzIndex: 99,\n\tpointerEvents: 'none',\n}));\n\nconst ScrollBorderRoot = styled('div', {\n\tname: 'ScrollBorder',\n\tslot: 'Root',\n})(({theme}) => ({\n\toverflow: 'hidden',\n\tposition: 'relative',\n\t[`&:not(.${scrollBorderClasses.scrolled})`]: {\n\t\t[`& .${scrollBorderClasses.scrollBorderTop}`]: {\n\t\t\tdisplay: 'none',\n\t\t},\n\t},\n\t[`&:not(.${scrollBorderClasses.hasOverflow}), &.${scrollBorderClasses.scrolledToEnd}`]:\n\t\t{\n\t\t\t[`& .${scrollBorderClasses.scrollBorderBottom}`]: {\n\t\t\t\tdisplay: 'none',\n\t\t\t},\n\t\t},\n\t[`&:not(.${scrollBorderClasses.useShadow})`]: {\n\t\t[`& .${scrollBorderClasses.scrollBorderBottom}`]: {\n\t\t\tborderBottom: `1px solid ${theme.palette.custom.border}`,\n\t\t},\n\t\t[`& .${scrollBorderClasses.scrollBorderTop}`]: {\n\t\t\tborderTop: `1px solid ${theme.palette.custom.border}`,\n\t\t},\n\t},\n\t[`&.${scrollBorderClasses.useShadow}`]: {\n\t\t[`& .${scrollBorderClasses.scrollBorderBottom}`]: createShadow('bottom'),\n\t\t[`& .${scrollBorderClasses.scrollBorderTop}`]: createShadow('top'),\n\t},\n}));\n\nconst ScrollBorderScrollWrapper = styled('div', {\n\tname: 'ScrollBorder',\n\tslot: 'ScrollWrapper',\n})(({theme}) => ({\n\t...theme.mixins.scrollable,\n}));\n\nimport {CSSProperties} from '@mui/styles/withStyles';\n\nexport interface ScrollBorderProps\n\textends React.DetailedHTMLProps<\n\t\tReact.HTMLAttributes,\n\t\tHTMLElement\n\t> {\n\tclasses?: Partial;\n\tchildren?: React.ReactNode;\n\tref?: React.ForwardedRef;\n\tuseShadow?: boolean;\n\tinnerRef?: React.ForwardedRef;\n\tcontentPadding?: CSSProperties['padding']; // ['padding'];\n}\n\nconst ScrollBorderPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tScrollBorderProps\n>((props, ref) => {\n\tconst [scrolled, setScrolled] = useState(false);\n\tconst [scrolledToEnd, setScrolledToEnd] = useState(false);\n\tconst [hasOverflow, setHasOverflow] = useState(false);\n\n\tconst {\n\t\tclasses: _classes,\n\t\tchildren,\n\t\tclassName,\n\t\tcontentPadding,\n\t\tinnerRef,\n\t\tuseShadow,\n\t\t...sendProps\n\t} = props;\n\n\tconst internalRef = useSharedRef(null, [innerRef]);\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\tscrolled,\n\t\tscrolledToEnd,\n\t\thasOverflow,\n\t\tuseShadow,\n\t});\n\n\tconst intersectionObserver = useIntersectionObserver(\n\t\t(entries) => {\n\t\t\tentries.forEach((entry) => {\n\t\t\t\tconst end = entry.target.getAttribute('data-id');\n\t\t\t\tif (end === 'top') {\n\t\t\t\t\tsetScrolled(!entry.isIntersecting);\n\t\t\t\t} else if (end === 'bottom') {\n\t\t\t\t\tsetScrolledToEnd(entry.isIntersecting);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t{\n\t\t\tthreshold: 1,\n\t\t},\n\t);\n\n\t// Resize listener\n\tuseLayoutEffect(() => {\n\t\tif (!internalRef.current) return;\n\n\t\tconst RO = new ResizeObserver(() => {\n\t\t\tif (!internalRef.current) return;\n\t\t\tsetHasOverflow(\n\t\t\t\tinternalRef.current.clientHeight < internalRef.current.scrollHeight,\n\t\t\t);\n\t\t});\n\t\tRO.observe(internalRef.current);\n\n\t\treturn () => {\n\t\t\tRO.disconnect();\n\t\t};\n\t}, [internalRef]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t intersectionObserver.registerRef(0, node)}\n\t\t\t\t\tdata-id=\"top\"\n\t\t\t\t/>\n\t\t\t\t{children}\n\t\t\t\t intersectionObserver.registerRef(1, node)}\n\t\t\t\t\tdata-id=\"bottom\"\n\t\t\t\t\tstyle={{marginBottom: 1}}\n\t\t\t\t/>\n\t\t\t\n\t\t\t\n\t\t\n\t);\n});\n\nexport const ScrollBorder = ScrollBorderPrimitive;\nexport default ScrollBorder;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface ScrollBorderReactWindowClasses {\n\t/** styles applied to the root element */\n\troot: string;\n\thasOverflow: string;\n\tscrolled: string;\n\tscrolledToEnd: string;\n\tuseShadow: string;\n\tscrollSentinel: string;\n\n\tscrollBorderBottom: string;\n\tscrollBorderTop: string;\n\tscrollWrapper: string;\n}\n\nexport const getScrollBorderReactWindowUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('ScrollBorderReactWindow', slot);\n\nexport const scrollBorderReactWindowClasses = generateUtilityClasses<\n\tkeyof ScrollBorderReactWindowClasses\n>('ScrollBorderReactWindow', [\n\t'root',\n\t'hasOverflow',\n\t'scrolled',\n\t'scrolledToEnd',\n\t'scrollBorderBottom',\n\t'scrollBorderTop',\n\t'scrollSentinel',\n\t'scrollWrapper',\n\t'useShadow',\n]);\nexport default scrollBorderReactWindowClasses;\n","import React, {useState, useLayoutEffect} from 'react';\nimport clsx from 'clsx';\nimport ResizeObserver from 'resize-observer-polyfill';\n\nimport {composeClasses, styled} from '@netx/core-components/Theme';\n\nimport {ScrollSentinel} from './ScrollSentinel';\nimport {\n\tgetScrollBorderReactWindowUtilityClass,\n\tscrollBorderReactWindowClasses,\n\tScrollBorderReactWindowClasses,\n} from './scrollBorderReactWindowClasses';\nimport useSharedRef from '../hooks/useSharedRef';\nimport useEnhancedRef from '../hooks/useEnhancedRef';\nimport useIntersectionObserver from '../hooks/useIntersectionObserver';\nimport {useWhenChangedEffect} from '../hooks';\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {hasOverflow, scrolled, scrolledToEnd, classes} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\thasOverflow && 'hasOverflow',\n\t\t\tscrolled && 'scrolled',\n\t\t\tscrolledToEnd && 'scrolledToEnd',\n\t\t],\n\t\tscrollBorderBottom: ['scrollBorderBottom'],\n\t\tscrollBorderTop: ['scrollBorderTop'],\n\t\tscrollWrapper: ['scrollWrapper'],\n\t\tscrollSentinel: ['scrollSentinel'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetScrollBorderReactWindowUtilityClass,\n\t\tclasses as typeof scrollBorderReactWindowClasses,\n\t);\n};\n\n// const ScrollBorderReactWindowRoot = styled('div', {\n// \tname: 'ScrollBorderReactWindow',\n// \tslot: 'Root',\n// })(({theme}) => ({\n// \tposition: 'relative',\n// \t[`&:not(.${scrollBorderReactWindowClasses.scrolled})`]: {\n// \t\t[`& .${scrollBorderReactWindowClasses.scrollBorderTop}`]: {\n// \t\t\tdisplay: 'none',\n// \t\t},\n// \t},\n// \t[`&:not(.${scrollBorderReactWindowClasses.hasOverflow}), &.${scrollBorderReactWindowClasses.scrolledToEnd}`]: {\n// \t\t[`& .${scrollBorderReactWindowClasses.scrollBorderBottom}`]: {\n// \t\t\tdisplay: 'none',\n// \t\t},\n// \t},\n// }));\n\nconst ScrollBorderReactWindowWrapper = styled('div', {\n\tname: 'ScrollBorderReactWindow',\n\tslot: 'Wrapper',\n})(({theme}) => ({\n\tborderTop: '1px solid transparent',\n}));\n\nconst ScrollBorderReactWindowSentinel = styled(ScrollSentinel, {\n\tname: 'ScrollBorderReactWindow',\n\tslot: 'ScrollSentinel',\n})(({theme}) => ({\n\twidth: '100%',\n}));\n\nconst ScrollBorderReactWindowBorder = styled('div', {\n\tname: 'ScrollBorderReactWindow',\n\tslot: 'ScrollBorder',\n})(({theme}) => ({\n\ttransform: 'translate3d(0px, 0px, 0px)',\n\tposition: 'absolute',\n\tpointerEvents: 'none',\n\theight: 1,\n\twidth: '100%',\n\tzIndex: 99,\n}));\n\nconst ScrollBorderReactWindowBottom = styled(ScrollBorderReactWindowBorder, {\n\tname: 'ScrollBorderReactWindow',\n\tslot: 'ScrollBorderBottom',\n})(({theme}) => ({\n\tbottom: 0,\n\tborderBottom: `1px solid ${theme.palette.custom.border}`,\n}));\n\nconst ScrollBorderReactWindowTop = styled(ScrollBorderReactWindowBorder, {\n\tname: 'ScrollBorderReactWindow',\n\tslot: 'ScrollBorderTop',\n})(({theme, ownerState}) => ({\n\ttop: 0,\n\tborderTop: `1px solid ${theme.palette.custom.border}`,\n}));\n\nexport interface ScrollBorderReactWindowProps\n\textends React.DetailedHTMLProps<\n\t\tReact.HTMLAttributes,\n\t\tHTMLElement\n\t> {\n\tclasses?: Partial;\n\tchildren?: React.ReactNode;\n\tref?: React.ForwardedRef;\n\tuseShadow?: boolean;\n\tinnerRef?: React.MutableRefObject;\n\tonOverflowChange?: (overflown: boolean) => void;\n}\n\nexport const ScrollBorderReactWindowPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tScrollBorderReactWindowProps\n>((props, ref) => {\n\tconst [scrolled, setScrolled] = useState(false);\n\tconst [scrolledToEnd, setScrolledToEnd] = useState(false);\n\tconst [hasOverflow, setHasOverflow] = useState(false);\n\n\tconst {\n\t\tclasses: _classes,\n\t\tchildren,\n\t\tclassName,\n\t\tinnerRef,\n\t\tuseShadow,\n\t\tonOverflowChange,\n\t\t...sendProps\n\t} = props;\n\n\tconst internalRef = useSharedRef(null, [ref, innerRef]);\n\tconst [onOverflowChangeRef] = useEnhancedRef(onOverflowChange);\n\n\tconst ownerState = {\n\t\tclasses: _classes,\n\t\tscrolled,\n\t\tscrolledToEnd,\n\t\thasOverflow,\n\t\tuseShadow,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst intersectionObserver = useIntersectionObserver(\n\t\t(entries) => {\n\t\t\tif (internalRef.current) {\n\t\t\t\tsetHasOverflow(\n\t\t\t\t\tinternalRef.current.clientHeight < internalRef.current.scrollHeight,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tentries.forEach((entry) => {\n\t\t\t\tconst end = entry.target.getAttribute('data-id');\n\t\t\t\tif (end === 'top') {\n\t\t\t\t\tsetScrolled(\n\t\t\t\t\t\tentry.intersectionRect.y !== entry.boundingClientRect.y &&\n\t\t\t\t\t\t\tentry.intersectionRatio.toFixed(3) !== '1.000' &&\n\t\t\t\t\t\t\t!entry.isIntersecting,\n\t\t\t\t\t);\n\t\t\t\t} else if (end === 'bottom') {\n\t\t\t\t\tsetScrolledToEnd(entry.isIntersecting);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t{\n\t\t\tthreshold: 1,\n\t\t},\n\t);\n\n\tuseLayoutEffect(() => {\n\t\tif (!internalRef.current) return;\n\n\t\tconst RO = new ResizeObserver(() => {\n\t\t\tif (!internalRef.current) return;\n\t\t\tsetHasOverflow(\n\t\t\t\tinternalRef.current.clientHeight < internalRef.current.scrollHeight,\n\t\t\t);\n\t\t\tonOverflowChangeRef.current?.(\n\t\t\t\tinternalRef.current.clientHeight < internalRef.current.scrollHeight,\n\t\t\t);\n\t\t});\n\t\tRO.observe(internalRef.current);\n\n\t\tsetHasOverflow(\n\t\t\tinternalRef.current.clientHeight < internalRef.current.scrollHeight,\n\t\t);\n\t\tonOverflowChangeRef.current?.(\n\t\t\tinternalRef.current.clientHeight < internalRef.current.scrollHeight,\n\t\t);\n\n\t\treturn () => {\n\t\t\tRO.disconnect();\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t<>\n\t\t\t{scrolled ? (\n\t\t\t\t\n\t\t\t) : null}\n\t\t\t\n\t\t\t\t intersectionObserver.registerRef(0, node)}\n\t\t\t\t\tdata-id=\"top\"\n\t\t\t\t/>\n\t\t\t\t{children}\n\t\t\t\t intersectionObserver.registerRef(1, node)}\n\t\t\t\t\tdata-id=\"bottom\"\n\t\t\t\t\tstyle={{marginBottom: 1}}\n\t\t\t\t/>\n\t\t\t\n\t\t\t{hasOverflow && !scrolledToEnd ? (\n\t\t\t\t\n\t\t\t) : null}\n\t\t\n\t);\n});\n\nexport const ScrollBorderReactWindow = ScrollBorderReactWindowPrimitive;\nexport default ScrollBorderReactWindow;\n","import React from 'react';\n\nimport {\n\tAvatar,\n\tListItem,\n\tListItemAvatar,\n\tListItemText,\n\tListItemIcon,\n} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport ColoredAvatar from '@netx/core-components/ColoredAvatar';\n\nimport {\n\tFontAwesomeIcon,\n\tFontAwesomeIconProps,\n} from '@fortawesome/react-fontawesome';\nimport {faBookMedical as PlusIcon} from '@fortawesome/pro-solid-svg-icons';\n\nconst StyledListItemIcon = withStyles((theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tminWidth: 36,\n\t\t},\n\t}),\n)(ListItemIcon);\n\nconst styles = ({palette, spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'inline-flex',\n\t\t\talignItems: 'center',\n\t\t\toverflow: 'hidden',\n\t\t\tpadding: spacing(1, 2),\n\t\t},\n\t\tavatar: {\n\t\t\tflex: '0 0 auto',\n\t\t\tmarginRight: 16,\n\t\t\theight: 32,\n\t\t\twidth: 32,\n\t\t\tfontSize: 18,\n\t\t},\n\t\ticon: {\n\t\t\tflex: '0 0 auto',\n\t\t\tlineHeight: 1,\n\t\t\tpaddingRight: spacing(1),\n\t\t\t'& svg': {\n\t\t\t\tcolor: palette.primary.main,\n\t\t\t\theight: 20,\n\t\t\t},\n\t\t},\n\t\ttext: {\n\t\t\tflex: '1 1 auto',\n\t\t},\n\t});\n\nexport interface AutoListOptionProps {\n\tavatar?: boolean;\n\ticon?: FontAwesomeIconProps['icon'];\n\tvalue: T;\n\tuncontrolled?: boolean;\n}\n\nconst AutoListOption = ({\n\tclasses,\n\tavatar,\n\ticon,\n\tuncontrolled,\n\tvalue,\n\t...props\n}: WithStyles & AutoListOptionProps) => {\n\treturn (\n\t\t\n\t\t\t{avatar ? (\n\t\t\t\t\n\t\t\t\t\t{icon ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t) : null}\n\t\t\t{uncontrolled ? (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t) : null}\n\t\t\t\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(React.memo(AutoListOption)) as <\n\tT extends string\n>(\n\tprops: Omit, 'classes'>,\n) => JSX.Element;\n","import React, {useCallback} from 'react';\n\nimport type {AutocompleteGetTagProps} from '@mui/material';\nimport ValueChip from '../../../SelectField/components/ValueChip';\nimport {ChipSkeleton} from '@netx/core-components/Chip';\n\nexport interface AutoListSelectionProps {\n\tdisabled?: boolean;\n\tgetTagProps: AutocompleteGetTagProps;\n\tgetValueLabel?: (value: T) => string;\n\tloading?: boolean;\n\tonSearch?: (value: string) => void;\n\tuncontrolledValues: string[];\n\tvalues: T[];\n}\n\nconst AutoListSelection = ({\n\tgetTagProps,\n\tgetValueLabel,\n\tloading,\n\tonSearch,\n\tuncontrolledValues,\n\tvalues,\n\t...props\n}: AutoListSelectionProps) => {\n\tconst _getValueLabel = useCallback(\n\t\t(value: T) => {\n\t\t\tif (getValueLabel) return getValueLabel(value);\n\t\t\treturn typeof value === 'string' ? value : '';\n\t\t},\n\t\t[getValueLabel],\n\t);\n\n\tif (loading) return ;\n\n\treturn (\n\t\t<>\n\t\t\t{values.map((value, index) => {\n\t\t\t\tconst label = _getValueLabel(value);\n\t\t\t\tconst uncontrolledValue = uncontrolledValues.includes(label);\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t})}\n\t\t\n\t);\n};\n\nexport default React.memo(AutoListSelection) as (\n\tprops: AutoListSelectionProps,\n) => JSX.Element;\n","import {i18n} from '@netx/core/i18n';\n\nexport const noInput = i18n.t('i18n.startTypingForOptions');\nexport const noMatches = i18n.t('i18n.noMatches');\n\nexport default {\n\tnoInput,\n\tnoMatches,\n};\n","export const isValidQueryInput = (input?: string) =>\n\ttypeof input === 'string' && input.trim() !== '';\n\nexport const isValidUncontrolledInput = (input: string) =>\n\tisValidQueryInput(input) && input !== '\"' && input !== '\"\"';\n","import React, {useCallback, useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\nimport type {AutocompleteProps, AutocompleteValue} from '@mui/material';\n\nimport {addToArrayUnique} from '@netx/core/lib/utils';\nimport {useWhenChangedEffect} from '@netx/core-components/hooks';\nimport {compareProps} from '@netx/core-components/util';\n\nimport {Option, Selection} from './components';\n\nexport {\n\tOption,\n\tAutoListOptionProps,\n\tSelection,\n\tAutoListSelectionProps,\n} from './components';\n\nimport locales from './locales';\nimport {IGNORE_INPUT_CHANGE_EVENTS} from './';\nimport SelectField, {SelectFieldProps} from '../SelectField';\n\nimport {uniqueArray} from '@netx/core/utils';\nimport {isValidQueryInput, isValidUncontrolledInput} from './util';\n\nexport type AutoListRef = React.ForwardedRef;\n\nconst isInValue = (\n\tinput: string | null,\n\tvalue: string | string[] | null,\n\tgetValueLabel?: (value: any) => string,\n) => {\n\t// Check that the normalizedValue is not already selected\n\t// values are not case-sensitive on the server and so not case-sensitive\n\t// in the values\n\tif (getValueLabel) input = getValueLabel(input);\n\n\tinput = input == null ? '' : input.toLowerCase();\n\t// The selection is multiple and the option is already in the array\n\tif (Array.isArray(value))\n\t\treturn value.some(\n\t\t\t(val) =>\n\t\t\t\t(getValueLabel ? getValueLabel(val) : val)?.toLowerCase() === input,\n\t\t);\n\t// Loose check for numbers/strings\n\treturn (getValueLabel ? getValueLabel(value) : value)?.toLowerCase() == input;\n};\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {},\n\t\tnoOptions: {\n\t\t\tdisplay: 'inline-flex',\n\t\t\talignItems: 'center',\n\t\t\twidth: '100%',\n\t\t},\n\t\tnoOptionsText: {\n\t\t\tflex: '1 1 auto',\n\t\t\toverflow: 'hidden',\n\t\t\tpaddingRight: theme.spacing(1),\n\t\t\ttextOverflow: 'ellipsis',\n\t\t},\n\t\trefresh: {\n\t\t\tflex: '0 0 auto',\n\t\t},\n\t\tlabelHidden: {\n\t\t\t'& .MuiInputBase-root.MuiFilledInput-root': {\n\t\t\t\tpaddingTop: 0,\n\t\t\t\theight: 48,\n\t\t\t},\n\t\t},\n\t});\n\nexport type CommenExtendProps<\n\tT,\n\tMultiple extends boolean = true,\n\tDisableClearable extends boolean = false,\n\tFreeSolo extends boolean = false,\n> = Pick<\n\tAutoListFieldProps,\n\t| 'clearOnClose'\n\t| 'disabled'\n\t| 'error'\n\t| 'hiddenLabel'\n\t| 'onChange'\n\t| 'placeholder'\n\t| 'loading'\n\t| 'loadingValue'\n\t| 'label'\n\t| 'multiple'\n\t| 'required'\n\t| 'style'\n\t| 'variant'\n\t| 'value'\n\t| 'InputLabelProps'\n\t| 'InputProps'\n\t| 'inputProps'\n> & {\n\thideLabel?: boolean;\n\tname?: string;\n\tAutocompleteProps?: Omit<\n\t\tAutoListFieldProps<\n\t\t\tT,\n\t\t\tMultiple,\n\t\t\tDisableClearable,\n\t\t\tFreeSolo\n\t\t>['AutocompleteProps'],\n\t\t'multiple'\n\t>;\n};\n\nexport type AutolistLookupResults =\n\tPromise[]>;\nexport interface AutoListFieldProps<\n\tT,\n\tMultiple extends boolean = true,\n\tDisableClearable extends boolean = false,\n\tFreeSolo extends boolean = false,\n> extends Omit<\n\t\tSelectFieldProps,\n\t\t'value'\n\t> {\n\t/** For cases where we have cached options in some way */\n\tadditionalOptions?: T[];\n\t/** User can input uncontrolled values */\n\tflexible?: boolean;\n\thideLabel?: boolean;\n\tgetValueLabel?: (value: T) => string;\n\tclearOnClose?: boolean;\n\tonLookup(value: string): Promise;\n\tonSearch?: (value: string) => void;\n\ttestValueContainsInput?: (\n\t\tinput: string | null,\n\t\tvalue?: AutocompleteValue,\n\t) => boolean;\n\ttestValueContainsOption?: (\n\t\toption: T,\n\t\tvalue?: AutocompleteValue,\n\t) => boolean;\n\tvalue?: AutocompleteValue;\n}\n\nconst AutoListFieldInner = <\n\tT,\n\tMultiple extends boolean = true,\n\tDisableClearable extends boolean = false,\n\tFreeSolo extends boolean = false,\n>(\n\t{\n\t\tclasses,\n\t\tclassName,\n\t\tadditionalOptions,\n\t\tchanged,\n\t\tclearOnClose,\n\t\tdisabled,\n\t\tflexible,\n\t\thideLabel,\n\t\tlabel,\n\t\tloading,\n\t\t// Multiple is opt out as single selection is used far less for lookups\n\t\t// at least for now anyways\n\t\t// And this is a pita to type out properly... still investigating what I might be missing\n\t\tmultiple = true as any,\n\t\trequired,\n\t\tonLookup,\n\t\tonSearch,\n\t\ttestValueContainsInput,\n\t\ttestValueContainsOption,\n\t\tvalue,\n\n\t\tAutocompleteProps,\n\t\t...props\n\t}: WithStyles &\n\t\tAutoListFieldProps,\n\tref: AutoListRef,\n) => {\n\tlet _value = !multiple\n\t\t? AutocompleteProps?.getOptionLabel\n\t\t\t? AutocompleteProps?.getOptionLabel(value as any)\n\t\t\t: value\n\t\t: '';\n\tif (_value == null) _value = '';\n\n\tconst [inputValue, setInputValue] = useState(_value);\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [open, setOpen] = useState(false);\n\tconst [options, setOptions] = useState([]);\n\tconst [searchInput, setSearchInput] = useState('');\n\t// These are atrings regardless of whatever value(s)\n\t// There is no mechanism, currently, for allowing the input of any\n\t// uncontrolled value that is more complex than a string\n\tconst [uncontrolledValue, setUncontrolledValue] = useState('');\n\tconst [uncontrolledValues, setUncontrolledValues] = useState([]);\n\n\tuseWhenChangedEffect(\n\t\t[value, multiple] as const,\n\t\tuseCallback(\n\t\t\t([value, multiple]) => {\n\t\t\t\tif (multiple) return;\n\t\t\t\tlet _value = AutocompleteProps?.getOptionLabel\n\t\t\t\t\t? AutocompleteProps?.getOptionLabel(value as any)\n\t\t\t\t\t: value;\n\t\t\t\tif (_value == null) _value = '';\n\t\t\t\tsetInputValue(_value);\n\t\t\t},\n\t\t\t[AutocompleteProps?.getOptionLabel],\n\t\t),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\t// Combine and make unique\n\tuseEffect(() => {\n\t\tsetOptions((options) => [\n\t\t\t...new Set(options.concat(additionalOptions || [])),\n\t\t]);\n\t}, [additionalOptions]);\n\n\t// When our `changed` prop changes, reset the uncontrolled values\n\t// When the data is saved the `changed` prop is reset\n\tuseEffect(() => {\n\t\tsetUncontrolledValues([]);\n\t}, [changed]);\n\n\tconst testValueCb = (\n\t\tinput: string,\n\t\tvalue?: AutocompleteValue,\n\t) => {\n\t\tif (testValueContainsInput) return testValueContainsInput(input, value);\n\t\treturn (\n\t\t\tArray.isArray(value) &&\n\t\t\tisInValue(input, value, AutocompleteProps?.getOptionLabel)\n\t\t);\n\t};\n\n\tconst testValueOptionCb = (\n\t\toption: T,\n\t\tvalue?: AutocompleteValue,\n\t) => {\n\t\tif (testValueContainsOption) return testValueContainsOption(option, value);\n\t\treturn (\n\t\t\ttypeof option === 'string' &&\n\t\t\ttypeof value === 'string' &&\n\t\t\tisInValue(option, value)\n\t\t);\n\t};\n\n\tconst testOptionsContainInputCb = (inputValue: string, options: T[]) => {\n\t\treturn options.some((option) =>\n\t\t\ttestValueOptionCb(option, inputValue as any),\n\t\t);\n\t};\n\n\t// When value changes check what of those values should be considered uncontrolled\n\tuseWhenChangedEffect(\n\t\tvalue,\n\t\tuseCallback(\n\t\t\t(value) => {\n\t\t\t\t// Reset input since we already have the options for the value\n\t\t\t\t// and we do not want a false positive when all options have been selected\n\t\t\t\tsetSearchInput('');\n\t\t\t\tif (multiple) setInputValue('');\n\n\t\t\t\tsetUncontrolledValues((uncontrolledValues) => {\n\t\t\t\t\t// Remove any uncontrolled values that no longer exist in or as `value`\n\t\t\t\t\tconst newUncontrolledValues = uncontrolledValues.filter(\n\t\t\t\t\t\t(uncontrolledValue) => testValueCb(uncontrolledValue, value),\n\t\t\t\t\t);\n\t\t\t\t\t// Check and see if our last uncontrolled value was responsible for `value` or any value within\n\t\t\t\t\treturn isValidQueryInput(uncontrolledValue) &&\n\t\t\t\t\t\ttestValueCb(uncontrolledValue, value)\n\t\t\t\t\t\t? addToArrayUnique(newUncontrolledValues, uncontrolledValue)\n\t\t\t\t\t\t: newUncontrolledValues;\n\t\t\t\t});\n\n\t\t\t\t// If there are no unselected options left, close the dropdwon\n\t\t\t\tif (\n\t\t\t\t\t!options.filter(\n\t\t\t\t\t\t(option) => multiple && !testValueOptionCb(option, value),\n\t\t\t\t\t).length\n\t\t\t\t)\n\t\t\t\t\tsetOpen(false);\n\t\t\t},\n\t\t\t[uncontrolledValue, options, testValueCb, testValueOptionCb, multiple],\n\t\t),\n\t);\n\n\tconst handleClose = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['onClose']\n\t>(() => {\n\t\tsetOpen(false);\n\t\t// When the dropdown is closed, empty the options\n\t\t// TODO: when we get websockets we can subscribe to our data changing on the server and not have\n\t\t// to empty and refresh\n\t\tsetOptions([]);\n\t\tif (clearOnClose) {\n\t\t\tsetInputValue('');\n\t\t} else {\n\t\t\t!multiple && setInputValue(_value != null ? _value : '');\n\t\t}\n\t}, [clearOnClose, multiple, _value]);\n\n\t// Custom options filter\n\t// Note: `filterSelectedOptions` is separate from this and takes precedence\n\tconst handleFilterOptions = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['filterOptions']\n\t>(\n\t\t(options, state) => {\n\t\t\tif (isLoading) return options;\n\n\t\t\tconst inputValue = state.inputValue.trim();\n\n\t\t\tif (\n\t\t\t\tflexible &&\n\t\t\t\tisValidUncontrolledInput(inputValue) &&\n\t\t\t\t// Not already in options\n\t\t\t\t!testOptionsContainInputCb(inputValue, options) &&\n\t\t\t\t// Not already in values\n\t\t\t\t!testValueCb(inputValue, value)\n\t\t\t) {\n\t\t\t\t// Store our inputted value for tracking what selected options were\n\t\t\t\t// controlled and which were uncontrolled\n\t\t\t\tsetUncontrolledValue(inputValue);\n\t\t\t\t// Add to the top of the options list\n\t\t\t\toptions.unshift(inputValue as any);\n\t\t\t} else {\n\t\t\t\tsetUncontrolledValue('');\n\t\t\t}\n\n\t\t\treturn options.filter(\n\t\t\t\t(option) =>\n\t\t\t\t\t!multiple || !testValueCb(option as unknown as string, value),\n\t\t\t);\n\t\t},\n\t\t[\n\t\t\tflexible,\n\t\t\tisLoading,\n\t\t\ttestValueCb,\n\t\t\ttestOptionsContainInputCb,\n\t\t\tmultiple,\n\t\t\tvalue,\n\t\t],\n\t);\n\n\t// Run lookup on server\n\tconst handleLookup = useCallback(\n\t\tasync (str?: string) => {\n\t\t\t// If not a valid input, just search it all\n\t\t\tif (!isValidQueryInput(str)) {\n\t\t\t\tstr = '\"\"';\n\t\t\t\tsetSearchInput('');\n\t\t\t} else {\n\t\t\t\tsetSearchInput(str as string);\n\t\t\t}\n\n\t\t\tsetIsLoading(true);\n\n\t\t\tconst results = await onLookup(str as string);\n\t\t\tsetOptions(\n\t\t\t\tuniqueArray(results.concat((additionalOptions as any[]) || [])).filter(\n\t\t\t\t\t(result) =>\n\t\t\t\t\t\t(typeof result !== 'string' || isValidQueryInput(result)) &&\n\t\t\t\t\t\t(!multiple || !testValueCb(result as unknown as string, value)),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tsetIsLoading(false);\n\t\t},\n\t\t[additionalOptions, onLookup, testValueCb, value, multiple],\n\t);\n\n\t// When the input changes, run the lookup\n\tconst handleInputChange = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['onInputChange']\n\t>(\n\t\t(event, str) => {\n\t\t\tif (\n\t\t\t\t!event ||\n\t\t\t\tIGNORE_INPUT_CHANGE_EVENTS.includes(\n\t\t\t\t\tevent.type as typeof IGNORE_INPUT_CHANGE_EVENTS[number],\n\t\t\t\t)\n\t\t\t)\n\t\t\t\treturn;\n\t\t\tsetInputValue(str);\n\t\t\thandleLookup(str);\n\t\t},\n\t\t[handleLookup],\n\t);\n\n\tconst handleBlur = useCallback(() => {\n\t\tmultiple && setInputValue('');\n\t}, [multiple, _value]);\n\n\tconst handleOpen = useCallback(() => {\n\t\tsetOpen(true);\n\t\t// (Re-)Query all values on server\n\t\thandleLookup();\n\t}, [handleLookup]);\n\n\tconst renderOption = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['renderOption']\n\t>(\n\t\t(props, option, state) => (\n\t\t\t\n\t\t),\n\t\t[uncontrolledValue, AutocompleteProps?.getOptionLabel],\n\t);\n\n\tconst renderTags = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['renderTags']\n\t>(\n\t\t(value, getTagProps) => {\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tgetTagProps={getTagProps}\n\t\t\t\t\tgetValueLabel={AutocompleteProps?.getOptionLabel}\n\t\t\t\t\tonSearch={onSearch}\n\t\t\t\t\tloading={props.loadingValue}\n\t\t\t\t\tvalues={value}\n\t\t\t\t\tuncontrolledValues={uncontrolledValues}\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t\t[disabled, props.loadingValue, uncontrolledValues, value, onSearch],\n\t);\n\n\treturn (\n\t\t\n\t\t\tdata-testid=\"auto-list-field-autocomplete\"\n\t\t\tref={ref}\n\t\t\t{...props}\n\t\t\tclassName={clsx(classes.root, className, {\n\t\t\t\t[classes.labelHidden]: hideLabel,\n\t\t\t})}\n\t\t\tlabel={hideLabel ? undefined : label}\n\t\t\tchanged={changed}\n\t\t\tdisabled={disabled}\n\t\t\tloading={isLoading || loading}\n\t\t\tmultiple={multiple}\n\t\t\toptions={options}\n\t\t\trequired={required}\n\t\t\tvalue={value}\n\t\t\tAutocompleteProps={{\n\t\t\t\tonBlur: handleBlur,\n\t\t\t\tfilterOptions: handleFilterOptions,\n\t\t\t\t// Even though we filter out already selected option\n\t\t\t\t// when running the query, we still need to filter out\n\t\t\t\t// selected options in between queries\n\t\t\t\tfilterSelectedOptions: false,\n\t\t\t\tinputValue: inputValue as string,\n\t\t\t\tnoOptionsText: searchInput === '' ? locales.noInput : locales.noMatches,\n\t\t\t\tonClose: handleClose,\n\t\t\t\tonInputChange: handleInputChange,\n\t\t\t\tonOpen: handleOpen,\n\t\t\t\topen,\n\t\t\t\trenderOption,\n\t\t\t\trenderTags,\n\t\t\t\t...AutocompleteProps,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const AutoListFieldPrimitive = React.forwardRef(AutoListFieldInner) as <\n\tT,\n\tMultiple extends boolean,\n\tDisableClearable extends boolean = false,\n\tFreeSolo extends boolean = false,\n>(\n\tprops: AutoListFieldProps<\n\t\tAutoListFieldProps\n\t>,\n\tref: AutoListRef,\n) => JSX.Element;\n\nexport const AutoListField = withStyles(styles)(\n\tReact.memo(AutoListFieldPrimitive, compareProps()),\n) as <\n\tT,\n\tMultiple extends boolean,\n\tDisableClearable extends boolean = false,\n\tFreeSolo extends boolean = false,\n>(\n\tprops: Omit<\n\t\tAutoListFieldProps,\n\t\t'classes'\n\t>,\n) => JSX.Element;\n\nexport default AutoListField;\n","export const IGNORE_INPUT_CHANGE_EVENTS = ['blur', 'click', 'keydown'];\n","import React from 'react';\n\nimport {\n\tSkeleton,\n\tSkeletonProps,\n\tTypography,\n\tTypographyProps,\n} from '@mui/material';\n\nexport interface PrimaryTitleProps extends TypographyProps {\n\tloading?: boolean;\n\tSkeletonProps?: SkeletonProps;\n}\n\n/**\n * NetX Primary Title\n */\nconst PrimaryTitlePrimitive = ({\n\tloading,\n\tSkeletonProps,\n\t...props\n}: PrimaryTitleProps) => {\n\tif (loading && !props.children)\n\t\treturn ;\n\treturn ;\n};\n\nexport const PrimaryTitle = PrimaryTitlePrimitive;\nexport default PrimaryTitle;\n","import React from 'react';\n\nimport {\n\tSkeleton,\n\tSkeletonProps,\n\tTypography,\n\tTypographyProps,\n} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nconst styles = ({palette}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tcolor:\n\t\t\t\tpalette.mode === 'light'\n\t\t\t\t\t? 'rgba(0, 0, 0, 0.55)'\n\t\t\t\t\t: palette.text.secondary,\n\t\t},\n\t});\n\nexport interface SecondaryTitleProps extends TypographyProps {\n\tloading?: boolean;\n\tsekeleton?: React.ReactNode;\n\tSkeletonProps?: Partial;\n}\n\n/**\n * NetX Secondary Title\n */\nconst SecondaryTitlePrimitive = ({\n\tclasses,\n\tchildren,\n\tloading,\n\tsekeleton,\n\tvariant = 'body2',\n\tSkeletonProps,\n}: WithStyles & SecondaryTitleProps) => {\n\tif (loading)\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{sekeleton || (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport const SecondaryTitle = withStyles(styles)(\n\tReact.memo(SecondaryTitlePrimitive),\n);\nexport default SecondaryTitle;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const TITLE_CLASS_NAME = 'Title';\nexport const TITLE_CLASS_SLOTS = [\n\t'root',\n\t'icon',\n\t'iconArea',\n\t'titleArea',\n] as const;\n\nexport type TitleClassSlot = typeof TITLE_CLASS_SLOTS[number];\n\nexport interface TitleClasses {\n\troot: string;\n\ticon: string;\n\ticonArea: string;\n\ttitleArea: string;\n}\n\nexport type TitleClassKey = keyof TitleClasses;\n\nexport const getTitleUtilityClass = (slot: TitleClassSlot) =>\n\tgenerateUtilityClass(TITLE_CLASS_NAME, slot);\n\nexport const titleClasses: TitleClasses = generateUtilityClasses(\n\tTITLE_CLASS_NAME,\n\t['root', 'icon', 'iconArea', 'titleArea'],\n);\n\nexport default titleClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport type {Variant} from '@mui/material/styles/createTypography';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\n\nimport PrimaryTitle, {PrimaryTitleProps} from '../PrimaryTitle';\nimport SecondaryTitle, {SecondaryTitleProps} from '../SecondaryTitle';\n\nimport {\n\tFontAwesomeIconProps,\n\tFontAwesomeIcon,\n} from '@fortawesome/react-fontawesome';\n\nimport {\n\ttitleClasses,\n\tgetTitleUtilityClass,\n\tTitleClasses,\n\tTITLE_CLASS_NAME,\n} from './titleClasses';\n\ntype TitleUtiltiyClassProps = WithClasses;\n\nconst useUtilityClasses = (ownerState: TitleUtiltiyClassProps) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t\ticon: ['icon'],\n\t\ticonArea: ['iconArea'],\n\t\ttitleArea: ['titleArea'],\n\t};\n\treturn composeClasses(slots, getTitleUtilityClass, classes);\n};\n\nconst TitleRoot = styled('div', {\n\tname: TITLE_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\talignItems: 'center',\n\tminWidth: 0,\n}));\n\nconst TitleIcon = styled('div', {\n\tname: TITLE_CLASS_NAME,\n\tslot: 'Icon',\n})(({theme}) => ({\n\tflex: '0 0 auto',\n\tborderRadius: '100%',\n\tbackground: theme.palette.primary.main,\n\theight: 42,\n\twidth: 42,\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tcolor: theme.palette.background.paper,\n\tfontSize: 18,\n\tmarginRight: 16,\n}));\n\nconst TitleIconArea = styled('div', {\n\tname: TITLE_CLASS_NAME,\n\tslot: 'IconArea',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\talignItems: 'center',\n}));\n\nconst TitleTitleArea = styled('div', {\n\tname: TITLE_CLASS_NAME,\n\tslot: 'TitleArea',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tflex: '1 1 auto',\n\toverflow: 'hidden',\n}));\n\nexport interface TitleProps\n\textends WithClasses<\n\t\tTitleClasses,\n\t\t{\n\t\t\tactionButton?: React.ReactElement;\n\t\t\ticon?: FontAwesomeIconProps['icon'];\n\t\t\tloading?: boolean;\n\t\t\tprimary: React.ReactNode;\n\t\t\tsecondary?: React.ReactNode;\n\t\t\tPrimaryTitleProps?: PrimaryTitleProps;\n\t\t\tSecondaryTitleProps?: SecondaryTitleProps;\n\t\t\tvariant?: Variant;\n\t\t}\n\t> {}\n\n/**\n * NetX Title\n */\nexport const TitlePrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\tactionButton,\n\ticon,\n\tloading,\n\tprimary,\n\tsecondary,\n\tPrimaryTitleProps,\n\tSecondaryTitleProps,\n\t...props\n}: TitleProps) => {\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t});\n\n\treturn (\n\t\t\n\t\t\t{actionButton ? (\n\t\t\t\t\n\t\t\t\t\t{actionButton}\n\t\t\t\t\n\t\t\t) : icon ? (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t) : null}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{primary}\n\t\t\t\t\n\t\t\t\t{secondary != null ? (\n\t\t\t\t\t\n\t\t\t\t\t\t{secondary}\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\t\t\n\t);\n};\n\nexport const Title = React.memo(TitlePrimitive);\n\nexport default Title;\n","import {ATTRIBUTE_SYSTEM_ID} from '@netx/core-attribute/constants';\nimport {SearchType} from './rules/constants';\n\nexport enum SearchMatchCriteria {\n\tAND = 0,\n\tOR = 1,\n\tNOT = 2,\n}\n\nexport enum SearchSortOrder {\n\tASC = 0,\n\tDESC = 1,\n}\n\nexport const DEFAULT_SEARCH_SORT_FIELD = 'file';\nexport const DEFAULT_SEARCH_SORT_ORDER = SearchSortOrder.ASC;\nexport const DEFAULT_SEARCH_MATCH_CRITERIA = SearchMatchCriteria.AND;\n\nexport enum MetadataSubType1 {\n\tMATCH_ALL_WHOLE_WORDS = 0,\n\tMATCH_EXACTLY = 1,\n\tMATCH_ANY_WHOLE_WORDS = 2,\n\tEXCLUDE = 3,\n\tMATCH_ALL_WILD_CARDS = 4,\n\tMATCH_ANY_WILD_CARDS = 5,\n\tMATCH_ANY_RANGE = 6,\n\tNO_VALUE = 11,\n\tANY_VALUE = 12,\n}\n\nexport const NON_SORTABLE_SEARCH_TYPES = [SearchType.CUSTOM, SearchType.VISUAL];\n\nexport const SEARCH_SORT_SYSTEM_ATTRIBUTES = [\n\tATTRIBUTE_SYSTEM_ID.checksum,\n\tATTRIBUTE_SYSTEM_ID.expireDate,\n\tATTRIBUTE_SYSTEM_ID.file,\n\tATTRIBUTE_SYSTEM_ID.name,\n\tATTRIBUTE_SYSTEM_ID.assetId,\n\tATTRIBUTE_SYSTEM_ID.fileFormatFamily,\n\tATTRIBUTE_SYSTEM_ID.fileSize2,\n\tATTRIBUTE_SYSTEM_ID.filetypelabel,\n\tATTRIBUTE_SYSTEM_ID.height,\n\tATTRIBUTE_SYSTEM_ID.importDate,\n\tATTRIBUTE_SYSTEM_ID.moddate,\n\tATTRIBUTE_SYSTEM_ID.creationdate,\n\tATTRIBUTE_SYSTEM_ID.dimensions,\n\tATTRIBUTE_SYSTEM_ID['smart labels'],\n\tATTRIBUTE_SYSTEM_ID.width,\n];\n\nexport const FACETS_SUPPORT_SEARCH_TYPES = [\n\tSearchType.ACTIVE_TEMPLATES,\n\tSearchType.ADVANCED_RAW,\n\tSearchType.ATTRIBUTE_HISTORY,\n\tSearchType.CART,\n\tSearchType.CATEGORY_ID,\n\tSearchType.CATEGORY_NAME,\n\tSearchType.CHECKOUTS,\n\tSearchType.CONTENTS,\n\tSearchType.DATE,\n\tSearchType.FILE_ASPECT,\n\tSearchType.FILE_FORMAT,\n\tSearchType.FILE_FORMAT_FAMILY,\n\tSearchType.FILE_SIZE,\n\tSearchType.KEYWORD,\n\tSearchType.METADATA,\n\tSearchType.SAVED_SEARCH,\n\tSearchType.THESAURUS,\n\tSearchType.VISUAL,\n];\n\nexport const SALO_STRING_MAP = {\n\ta: 'sortField',\n\tb: 'sortOrder',\n\tc: 'matchCriteria',\n\td: 'elementTypes',\n\te: 'elementSubType1s',\n\tf: 'elementSubType2s',\n\tg: 'elementValue1s',\n\th: 'elementValue2s',\n\ti: 'elementValue3s',\n};\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const SUBMIT_BUTTON_CLASS_NAME = 'SubmitButton';\nexport const SUBMIT_BUTTON_CLASS_SLOTS = [\n\t'root',\n\t'button',\n\t'progress',\n] as const;\n\nexport type SubmitButtonClassSlot = typeof SUBMIT_BUTTON_CLASS_SLOTS[number];\n\nexport interface SubmitButtonClasses {\n\troot: string;\n\tbutton: string;\n\tprogress: string;\n\tfullWidth: string;\n\ticonOnly: string;\n\tsubmitting: string;\n}\n\nexport type SubmitButtonClassKey = keyof SubmitButtonClasses;\n\nexport const getSubmitButtonUtilityClass = (slot: SubmitButtonClassSlot) =>\n\tgenerateUtilityClass(SUBMIT_BUTTON_CLASS_NAME, slot);\n\nexport const submitButtonClasses: SubmitButtonClasses = generateUtilityClasses(\n\tSUBMIT_BUTTON_CLASS_NAME,\n\t['root', 'button', 'progress', 'fullWidth', 'iconOnly', 'submitting'],\n);\n\nexport default submitButtonClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faSave as SaveIcon} from '@fortawesome/pro-solid-svg-icons';\nimport {Button, ButtonProps, LinearProgress} from '@mui/material';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithClasses,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\nimport {\n\tsubmitButtonClasses,\n\tgetSubmitButtonUtilityClass,\n\tSubmitButtonClasses,\n\tSUBMIT_BUTTON_CLASS_NAME,\n} from './submitButtonClasses';\n\ntype SubmitButtonUtiltiyClassProps = WithClasses<\n\tSubmitButtonClasses,\n\t{\n\t\tfullWidth?: boolean;\n\t\ticonOnly?: boolean;\n\t\tsubmitting?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: SubmitButtonUtiltiyClassProps) => {\n\tconst {classes, fullWidth, iconOnly, submitting} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\tfullWidth && 'fullWidth',\n\t\t\ticonOnly && 'iconOnly',\n\t\t\tsubmitting && 'submitting',\n\t\t],\n\t\tprogress: ['actions'],\n\t\tbutton: ['button'],\n\t};\n\treturn composeClasses(slots, getSubmitButtonUtilityClass, classes);\n};\n\nconst SubmitButtonRoot = styled('div', {\n\tname: SUBMIT_BUTTON_CLASS_NAME,\n\tslot: 'Root',\n})(({theme, ownerState}) => {\n\tconst {\n\t\tfullWidth,\n\t\ticonOnly,\n\t\tsubmitting,\n\t} = ownerState as SubmitButtonUtiltiyClassProps;\n\treturn {\n\t\twidth: fullWidth ? '100%' : undefined,\n\t\t[`& .${submitButtonClasses.button}`]: {\n\t\t\t...(iconOnly\n\t\t\t\t? {\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\t'& svg': {\n\t\t\t\t\t\t\theight: '20px !important',\n\t\t\t\t\t\t\twidth: 20,\n\t\t\t\t\t\t},\n\t\t\t\t }\n\t\t\t\t: null),\n\t\t\t...(submitting\n\t\t\t\t? {\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t }\n\t\t\t\t: null),\n\t\t},\n\t};\n});\n\nconst SubmitButtonButton = styled(Button, {\n\tname: SUBMIT_BUTTON_CLASS_NAME,\n\tslot: 'Button',\n})(({theme}) => ({\n\ttransition: theme.transitions.create('opacity'),\n}));\n\nconst SubmitButtonProgress = styled(LinearProgress, {\n\tname: SUBMIT_BUTTON_CLASS_NAME,\n\tslot: 'Progress',\n})(({theme}) => ({\n\tposition: 'absolute',\n\ttop: '50%',\n\tmarginTop: -2,\n\tleft: theme.spacing(1),\n\tright: theme.spacing(1),\n}));\n\nexport interface SubmitButtonProps\n\textends Omit, 'classes'>,\n\t\tWithClasses {\n\ticonOnly?: boolean;\n\tlabel?: string;\n\tprogress?: number | null;\n\tshowWorking?: boolean;\n}\n\nexport const SubmitButtonPrimitive = React.memo(\n\t({\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tdisabled,\n\t\tfullWidth,\n\t\ticonOnly,\n\t\tlabel,\n\t\tprogress,\n\t\tshowWorking,\n\t\t...props\n\t}: SubmitButtonProps) => {\n\t\tconst ownerState: SubmitButtonUtiltiyClassProps = {\n\t\t\tclasses: _classes,\n\t\t\tfullWidth,\n\t\t\ticonOnly,\n\t\t\tsubmitting: showWorking,\n\t\t};\n\n\t\tconst classes = useUtilityClasses(ownerState);\n\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{iconOnly ? (\n\t\t\t\t\t\t\n\t\t\t\t\t) : (\n\t\t\t\t\t\tlabel || i18n.t('i18n.submit')\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t\t{showWorking ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\t\t);\n\t},\n);\n\nexport const SubmitButton = SubmitButtonPrimitive;\n\nexport default SubmitButton;\n","import React, {useCallback, useRef} from 'react';\nimport clsx from 'clsx';\nimport type {FixedSizeList} from 'react-window';\nimport {i18n} from '@netx/core/i18n';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCheck} from '@fortawesome/pro-solid-svg-icons';\nimport {\n\tListItem,\n\tListItemText,\n\tListSubheader,\n\tAutocompleteValue,\n\tPopper,\n} from '@mui/material';\nimport Autocomplete, {\n\tAutocompleteProps,\n\tautocompleteClasses,\n} from '@mui/material/Autocomplete';\nimport {inputBaseClasses} from '@mui/material/InputBase';\nimport {inputLabelClasses} from '@mui/material/InputLabel';\nimport {ChipSkeleton} from '@netx/core-components/Chip';\nimport {composeClasses, styled} from '@netx/core-components/Theme';\nimport {compareProps} from '@netx/core-components/util';\nimport selectFieldClasses, {\n\tgetSelectFieldUtilityClass,\n\tSelectFieldClasses,\n} from './selectFieldClasses';\nimport Input from '../Input';\nimport ListBox from '../ListBox';\nimport ValueChip from '../ValueChip';\nimport {useErrorFocus} from '../../../hooks/useErrorFocus';\nimport {\n\tCommonFieldPropsWithTextField,\n\tErrorField,\n\tuseFormInput,\n} from '../../../';\n\nexport type SelectFieldElement = HTMLDivElement;\nexport type SelectFieldRef = React.ForwardedRef;\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {classes, multiple} = ownerState;\n\tconst slots = {\n\t\troot: ['root', multiple && 'multiple'],\n\t\tautocomplete: ['autocomplete'],\n\t\tselectedIcon: ['selectedIcon'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetSelectFieldUtilityClass,\n\t\tclasses as typeof selectFieldClasses,\n\t);\n};\n\nconst SelectFieldRoot = styled('div', {\n\tname: 'SelectField',\n\tslot: 'Root',\n\toverridesResolver: (props, styles) => styles.root,\n})(({theme}) => ({\n\tdisplay: 'inline-flex',\n\tflexDirection: 'column',\n\twidth: '100%',\n\t// TODO: this is related to our size override for fa icons in theme\n\t// need to better handle this issue as using `important` is code smell\n\t// at this stage\n\t'& .MuiSvgIcon-root': {\n\t\tminWidth: `8px !important`,\n\t\tminHeight: `8px !important`,\n\t},\n\t[`&.${selectFieldClasses.multiple}`]: {\n\t\t// Make the input area minimum size match the size it would be if it had a value\n\t\t// otherwise we wind up with the interface jumping slightly betweem value and no\n\t\t// value\n\t\t[`& .${inputLabelClasses.root}`]: {\n\t\t\tlineHeight: '1rem',\n\t\t},\n\t\t[`& .${inputBaseClasses.root}`]: {\n\t\t\tminHeight: 50,\n\t\t\t[`& .${inputBaseClasses.input}`]: {\n\t\t\t\tminHeight: 28,\n\t\t\t},\n\t\t},\n\t\t[`& .${inputLabelClasses.outlined}:not(${inputLabelClasses.shrink})`]: {\n\t\t\ttransform: 'translate(14px, 18px) scale(1)',\n\t\t},\n\t},\n}));\n\nconst ListItemIconRoot = styled(FontAwesomeIcon, {\n\tname: 'SelectField',\n\tslot: 'SelectedIcon',\n\toverridesResolver: (props, styles) => styles.selectedIcon,\n})(({theme}) => ({\n\tcolor: theme.palette.secondary.main,\n}));\n\nconst AutocompleteRoot = styled(Autocomplete, {\n\tname: 'SelectField',\n\tslot: 'Autocomplete',\n\toverridesResolver: (props, styles) => styles.autocomplete,\n})(({theme}) => ({\n\twidth: '100%',\n})) as <\n\tT,\n\tMultiple extends boolean | undefined = undefined,\n\tDisableClearable extends boolean | undefined = undefined,\n\tFreeSolo extends boolean | undefined = undefined,\n>(\n\tprops: AutocompleteProps,\n) => JSX.Element;\n\nconst PopperRoot = styled(Popper)(({theme}) => ({\n\t[`& .${autocompleteClasses.loading}, & .${autocompleteClasses.noOptions}`]: {\n\t\tcolor: theme.palette.text.primary,\n\t},\n}));\n\nexport interface SelectFieldProps<\n\tT,\n\tMultiple extends boolean | undefined,\n\tDisableClearable extends boolean | undefined,\n\tFreeSolo extends boolean | undefined,\n> extends Omit, 'value' | 'onChange'> {\n\tclasses?: Partial;\n\tlabelKey?: string;\n\tmultiple?: Multiple;\n\tonChange?: (\n\t\tvalue: [DisableClearable] extends [true]\n\t\t\t? AutocompleteValue\n\t\t\t: AutocompleteValue | null,\n\t) => void;\n\toptions?: T[];\n\toptionLabels?: Record;\n\tvalue: AutocompleteValue | undefined;\n\tAutocompleteProps?: Partial<\n\t\tOmit<\n\t\t\tAutocompleteProps,\n\t\t\t| 'className'\n\t\t\t| 'onChange'\n\t\t\t| 'options'\n\t\t\t| 'renderInput'\n\t\t\t| 'value'\n\t\t\t| 'multiple'\n\t\t>\n\t>;\n}\n\nconst getSafeValues = (values?: any[]) =>\n\tvalues && Array.isArray(values) ? values : [];\n\nconst renderGroup = (params) => [\n\tparams.group !== '' ? (\n\t\t\n\t\t\t{params.group}\n\t\t\n\t) : null,\n\tparams.children,\n];\n\nconst SelectFieldInner = <\n\tT,\n\tMultiple extends boolean | undefined,\n\tDisableClearable extends boolean | undefined,\n\tFreeSolo extends boolean | undefined,\n>(\n\tprops: SelectFieldProps,\n\tref: SelectFieldRef,\n) => {\n\tconst {\n\t\tchanged,\n\t\tclassName,\n\t\tdisabled,\n\t\terror,\n\t\tform,\n\t\tformFieldOptions,\n\t\thideErrorMessage,\n\t\tlabelKey,\n\t\tloading,\n\t\tloadingValue,\n\t\tmultiple,\n\t\tname,\n\t\tonChange,\n\t\tonSearch,\n\t\toptions,\n\t\toptionLabels,\n\t\treadOnly,\n\t\trequired,\n\t\tvalue,\n\n\t\tAutocompleteProps,\n\t\tclasses: _classes,\n\t\t...sendProps\n\t} = props;\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\tmultiple,\n\t});\n\n\tconst inputRef = useRef();\n\tconst fixedSizeListRef = useRef();\n\n\tuseFormInput(name, value, form, {required, ...formFieldOptions});\n\tuseErrorFocus({\n\t\terror,\n\t\tinputRef,\n\t});\n\n\tconst getOptionLabel = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['getOptionLabel']\n\t>(\n\t\t(option) => {\n\t\t\tif (loading) return 'loading...';\n\t\t\treturn labelKey\n\t\t\t\t? option[labelKey]\n\t\t\t\t: optionLabels\n\t\t\t\t? optionLabels[option as unknown as string]\n\t\t\t\t: option;\n\t\t},\n\t\t[optionLabels, loading],\n\t);\n\n\tconst handleChange = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['onChange']\n\t>(\n\t\t(event, value) => {\n\t\t\tif (!event) return;\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tvalue = value.filter(\n\t\t\t\t\t(value) => value !== '' && value != null,\n\t\t\t\t) as AutocompleteValue;\n\t\t\t}\n\t\t\tform?.setValue(name, value);\n\t\t\tonChange?.(value);\n\t\t},\n\t\t[form?.setValue, name, onChange],\n\t);\n\n\tconst renderInput = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['renderInput']\n\t>(\n\t\t(params) => (\n\t\t\t\n\t\t),\n\t\t[error, loading, loadingValue, name, required, sendProps],\n\t);\n\n\tconst renderOption = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['renderOption']\n\t>(\n\t\t(props, option, state) => (\n\t\t\t\n\t\t\t\t\t) : null\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t\n\t\t\t\n\t\t),\n\t\t[optionLabels, AutocompleteProps?.getOptionLabel],\n\t);\n\n\tconst renderTags = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps\n\t\t>['renderTags']\n\t>(\n\t\t(values, getTagProps) =>\n\t\t\tloadingValue ? (\n\t\t\t\t\n\t\t\t) : (\n\t\t\t\tgetSafeValues(values).map((value, index) => {\n\t\t\t\t\tconst label = optionLabels ? optionLabels[value] : value;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t),\n\t\t[disabled, loadingValue, optionLabels, onSearch],\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\tref={ref}\n\t\t\t\tautoHighlight\n\t\t\t\tblurOnSelect={!multiple}\n\t\t\t\tclearOnBlur\n\t\t\t\t// Yeah, kind of breaking the generic typing here to hard\n\t\t\t\t// enforce this for required fields\n\t\t\t\tdisableClearable={required as any}\n\t\t\t\t// auto select input text when field is focused\n\t\t\t\t// for easier filtering/value replacement\n\t\t\t\t// non multiselect only\n\t\t\t\tselectOnFocus={!multiple}\n\t\t\t\tdisableCloseOnSelect={multiple}\n\t\t\t\tgetOptionLabel={getOptionLabel}\n\t\t\t\t// We handle this in the `ListBox`\n\t\t\t\thandleHomeEndKeys={false}\n\t\t\t\tmultiple={multiple}\n\t\t\t\tnoOptionsText={i18n.t('i18n.noMatches')}\n\t\t\t\topenOnFocus\n\t\t\t\trenderGroup={renderGroup}\n\t\t\t\trenderInput={renderInput}\n\t\t\t\trenderOption={renderOption}\n\t\t\t\trenderTags={renderTags}\n\t\t\t\t{...AutocompleteProps}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tdisabled={disabled || loadingValue}\n\t\t\t\tid={props.id}\n\t\t\t\tloading={loading || loadingValue}\n\t\t\t\t// This is a hack to show loading state when values are being \"loaded\"\n\t\t\t\t// the autocomplete will not run `renderTags` if there is no value\n\t\t\t\toptions={options || []}\n\t\t\t\tvalue={multiple && loadingValue ? ([''] as any) : value}\n\t\t\t\tListboxComponent={ListBox}\n\t\t\t\tPopperComponent={PopperRoot}\n\t\t\t\tListboxProps={{\n\t\t\t\t\t...AutocompleteProps?.ListboxProps,\n\t\t\t\t\t// TODO: the typing changed here in v5-alpha\n\t\t\t\t\t// there is no way (that i know of atm) to get\n\t\t\t\t\t// it to recognize the `props` of `ListBox` as\n\t\t\t\t\t// valid `props` to pass to `ListboxComponent`\n\t\t\t\t\t// https://github.com/mui-org/material-ui/issues/26342\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tfixedSizeListRef,\n\t\t\t\t\tinputRef,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{!hideErrorMessage ? (\n\t\t\t\t\n\t\t\t) : null}\n\t\t\n\t);\n};\n\nexport const SelectFieldPrimitive = React.forwardRef(SelectFieldInner) as <\n\tT,\n\tMultiple extends boolean | undefined,\n\tDisableClearable extends boolean | undefined,\n\tFreeSolo extends boolean | undefined,\n>(\n\tprops: SelectFieldProps,\n) => React.ReactElement;\n\nexport const SelectField = React.memo(SelectFieldPrimitive, compareProps()) as <\n\tT,\n\tMultiple extends boolean | undefined,\n\tDisableClearable extends boolean | undefined,\n\tFreeSolo extends boolean | undefined,\n>(\n\tprops: SelectFieldProps,\n) => JSX.Element;\n\nexport default SelectField;\n","export {default} from './FormDialog';\nexport * from './FormDialog';\nexport * from './formDialogClasses';\nexport * from './withFormDialog';\nexport * from './types';\n","export const ACTIONS = {\n\tINVALIDATE: 'INVALIDATE',\n\tSET_ENFORCE: 'SET_ENFORCE',\n\tSET_HIDE_SYSTEM_ATTRIBUTES: 'SET_HIDE_SYSTEM_ATTRIBUTES',\n\tSET_LOOKUPS_ALLOWED: 'SET_LOOKUPS_ALLOWED',\n\tSET_SELECTED: 'SET_SELECTED',\n\tSET_TEMPLATES: 'SET_TEMPLATES',\n\tSET_ORDER: 'SET_ORDER',\n\tSET_LOADING_TEMPLATES: 'SET_LOADING_TEMPLATES',\n};\n","import React from 'react';\n\nimport {ACTIONS} from './constants';\nimport {State} from './reducer';\n\nexport type Action =\n\t| {type: typeof ACTIONS.INVALIDATE}\n\t| {type: typeof ACTIONS.SET_ENFORCE; enforce: State['enforce']}\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_HIDE_SYSTEM_ATTRIBUTES;\n\t\t\thideSystemAttributes: State['hideSystemAttributes'];\n\t }\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_LOOKUPS_ALLOWED;\n\t\t\tlookupsAllowed: State['lookupsAllowed'];\n\t }\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_LOADING_TEMPLATES;\n\t\t\tloadingTemplates: State['loadingTemplates'];\n\t }\n\t| {type: typeof ACTIONS.SET_SELECTED; ids: State['selected']}\n\t| {type: typeof ACTIONS.SET_ORDER; ids: State['selected']}\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_TEMPLATES;\n\t\t\tattributeTemplates: State['attributeTemplates'];\n\t };\n\nexport const Actions = (dispatch: React.Dispatch) => ({\n\tsetOrder: (ids: State['selected']) =>\n\t\tdispatch({type: ACTIONS.SET_ORDER, ids}),\n});\n\nexport default Actions;\n","import type {AttributeSetId} from '@netx/core-attribute-set';\nimport {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nimport {uniqueArray} from '@netx/core/utils';\nimport type {\n\tAttributeId,\n\tAttributeTemplate,\n\tLookups,\n} from '@netx/core-attribute';\n\ntype AttributeSetTemplates = Record;\n\nexport type State = {\n\t/** a unique list of all attribute template ids involved in selection */\n\tattributeTemplateIds: AttributeId[];\n\t/** an object index by attribute set id with an array of attribute templates */\n\tattributeTemplates: AttributeSetTemplates;\n\t/** attribute set ids to enforce in selection */\n\tenforce: AttributeSetId[];\n\t/** hide system attributes in selection */\n\thideSystemAttributes: boolean;\n\t/** update to invalidate the loading process and start again */\n\tinvalidator: number;\n\t/** sets that have been loaded and have all the data needed */\n\tloaded: AttributeSetId[];\n\t/**\n\t * a queue of ids waiting to be loaded\\\n\t * note: this will not be \"resolved\" until all set ids are loaded\\\n\t * if you wish to get immediate access to a set's readiness, look\n\t * to the `loaded` array\n\t */\n\tloading: AttributeSetId[];\n\t/** attribute templates are loading */\n\tloadingTemplates: boolean;\n\t/** the key/targets that are within the combined selection */\n\tlookupsAllowed: Lookups;\n\tselected: AttributeSetId[];\n};\n\nexport const initialState: State = {\n\tattributeTemplateIds: [],\n\tattributeTemplates: {},\n\tenforce: [],\n\thideSystemAttributes: false,\n\tinvalidator: 0,\n\tloaded: [],\n\tloading: [],\n\tloadingTemplates: false,\n\tlookupsAllowed: {\n\t\tkeys: [],\n\t\ttargets: [],\n\t},\n\tselected: [],\n};\n\nconst notEmpty = (arr: T) =>\n\tarr.filter((id) => id !== '' && id != null);\n\nconst reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.INVALIDATE:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tinvalidator: Date.now(),\n\t\t\t\tloaded: [],\n\t\t\t\tloading: state.selected,\n\t\t\t};\n\t\tcase ACTIONS.SET_ENFORCE: {\n\t\t\tconst selected = [...state.selected];\n\t\t\t[...action.enforce].reverse().forEach((id) => {\n\t\t\t\tif (!selected.includes(id)) selected.unshift(id);\n\t\t\t});\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tenforce: action.enforce,\n\t\t\t\tselected,\n\t\t\t\tinvalidator: Date.now(),\n\t\t\t\tloading: selected.filter((id) => !state.loaded.includes(id)),\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_HIDE_SYSTEM_ATTRIBUTES: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\thideSystemAttributes: action.hideSystemAttributes,\n\t\t\t\tinvalidator: Date.now(),\n\t\t\t\tloaded: [],\n\t\t\t\tloading: state.selected,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_LOOKUPS_ALLOWED:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tlookupsAllowed: action.lookupsAllowed,\n\t\t\t};\n\t\tcase ACTIONS.SET_SELECTED: {\n\t\t\tconst selected = uniqueArray(notEmpty(action.ids));\n\t\t\t[...state.enforce].reverse().forEach((id) => {\n\t\t\t\tif (!selected.includes(id)) selected.unshift(id);\n\t\t\t});\n\n\t\t\tconst attributeTemplates = {...state.attributeTemplates};\n\t\t\tstate.selected.forEach((id) => {\n\t\t\t\tif (selected.includes(id)) return;\n\t\t\t\tdelete attributeTemplates[id];\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tattributeTemplates,\n\t\t\t\tattributeTemplateIds: uniqueArray(\n\t\t\t\t\tObject.values(attributeTemplates)\n\t\t\t\t\t\t.map((attrs) => attrs.map((attr) => attr.attributeid))\n\t\t\t\t\t\t.flat(),\n\t\t\t\t),\n\t\t\t\tselected: selected,\n\t\t\t\tloaded: state.loaded.filter((id) => selected.includes(id)),\n\t\t\t\tloading: selected.filter((id) => !state.loaded.includes(id)),\n\t\t\t\tinvalidator: Date.now(),\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_LOADING_TEMPLATES:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tloadingTemplates: action.loadingTemplates,\n\t\t\t\tloaded: [],\n\t\t\t\tloading: state.selected,\n\t\t\t\tinvalidator: !action.loadingTemplates ? Date.now() : state.invalidator,\n\t\t\t};\n\t\tcase ACTIONS.SET_TEMPLATES: {\n\t\t\tconst ids = Object.keys(action.attributeTemplates);\n\t\t\tconst loaded = uniqueArray(state.loaded.concat(ids));\n\t\t\tconst leftToLoad = state.selected.filter((id) => !loaded.includes(id));\n\t\t\tconst attributeTemplates = {\n\t\t\t\t...state.attributeTemplates,\n\t\t\t\t...action.attributeTemplates,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tloaded: uniqueArray(state.loaded.concat(ids)),\n\t\t\t\tloading: leftToLoad.length ? state.loading : [],\n\t\t\t\tattributeTemplates,\n\t\t\t\tattributeTemplateIds: uniqueArray(\n\t\t\t\t\tObject.values(attributeTemplates)\n\t\t\t\t\t\t.map((attrs) => attrs.map((attr) => attr.attributeid))\n\t\t\t\t\t\t.flat(),\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_ORDER:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tselected: uniqueArray(notEmpty(action.ids)),\n\t\t\t};\n\t}\n};\n\nexport default reducer;\n","import React, {\n\tcreateContext,\n\tuseContext,\n\tuseMemo,\n\tuseReducer,\n\tuseCallback,\n\tuseRef,\n\tuseState,\n\tuseEffect,\n} from 'react';\n\nimport Netx, {dispatcher} from '@netx/core/bootstrap';\nimport {i18n} from '@netx/core/i18n';\nimport {asyncForEach} from '@netx/core/utils';\n\nimport actions from './actions';\nimport {ACTIONS} from './constants';\nimport reducer, {initialState, State} from './reducer';\nimport {\n\tuseAttributeSetProvider,\n\tAttributeSetContextType,\n\tAttributeSetId,\n} from '@netx/core-attribute-set';\nimport {\n\tuseUpdateEffect,\n\tuseWhenChangedEffect,\n\tuseUserPref,\n} from '@netx/core-components/hooks';\nimport {useConfirmation} from '@netx/core-components/Confirmation';\n\nexport type AttributeSetSelectionContextType = {\n\tactions: ReturnType & {\n\t\t/** set selected attribute set ids */\n\t\tsetSelected(ids: AttributeSetId[]): void;\n\t};\n\tstate: State;\n\tcancelled: number;\n\t// TODO: find what is needed and pipe from here\n\t// nothing should need to reach up like this (ideally)\n\tattributeSetCtx: AttributeSetContextType;\n};\n\nconst StoreContext = createContext<\n\tAttributeSetSelectionContextType | undefined\n>(undefined);\n\nexport const useAttributeSetSelectionProvider = () => {\n\tconst context = useContext(StoreContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t'`useAttributeSetSelectionProvider` must be used within a `AttributeSetSelectionProvider`',\n\t\t);\n\t}\n\treturn context;\n};\n\nexport interface AttributeSetSelectionProviderProps {\n\t/** default set ids if no user pref (found) */\n\tdefaultSelection?: AttributeSetId[];\n\t/** regardless of anything else, these sets will always be selected and at the top */\n\tenforce?: string[];\n\thideSystemAttributes?: boolean;\n\t/** force selected set ids */\n\tselected?: AttributeSetId[];\n\t/** if provided, will load from pref and save to pref (when changed) */\n\tuserPrefKey?: string;\n\t/** if `true`, confrim changing set selection */\n\tconfirm?: boolean;\n\t/** callback when selection changes */\n\tonChange?: (selected: AttributeSetId[]) => void;\n}\n\nconst AttributeSetSelectionProvider = ({\n\tchildren,\n\tconfirm,\n\tdefaultSelection,\n\thideSystemAttributes,\n\tenforce,\n\tonChange,\n\tuserPrefKey,\n\tselected,\n}: React.PropsWithChildren) => {\n\tconst attributesSetProvider = useAttributeSetProvider();\n\tconst confirmation = useConfirmation();\n\n\tconst [state, dispatch] = useReducer(reducer, {\n\t\t...initialState,\n\t\tenforce: enforce || [],\n\t\thideSystemAttributes: hideSystemAttributes === true,\n\t\tloadingTemplates: attributesSetProvider.loadingTemplates,\n\t});\n\tconst [cancelled, setCancelled] = useState(0);\n\n\tconst loadingTemplatesRef = useRef(attributesSetProvider.loadingTemplates);\n\tloadingTemplatesRef.current = attributesSetProvider.loadingTemplates;\n\n\t// Flag so that we do not see the changing of state\n\t// as a user intended one because it was loaded from prefs\n\tconst justPulledFromPrefsRef = useRef(false);\n\n\tuseUpdateEffect(() => {\n\t\tdispatch({type: ACTIONS.SET_ENFORCE, enforce: enforce || []});\n\t}, [enforce]);\n\n\tuseUpdateEffect(() => {\n\t\tdispatch({\n\t\t\ttype: ACTIONS.SET_LOADING_TEMPLATES,\n\t\t\tloadingTemplates: attributesSetProvider.loadingTemplates,\n\t\t});\n\t}, [attributesSetProvider.loadingTemplates]);\n\n\tconst [userPref, setUserPref] = useUserPref(\n\t\tuserPrefKey || '',\n\t\t{\n\t\t\tparseIn: (value) => {\n\t\t\t\tconst ids: string[] =\n\t\t\t\t\tvalue == null\n\t\t\t\t\t\t? defaultSelection || []\n\t\t\t\t\t\t: value.toString().trim().replace('', '').split(',');\n\t\t\t\treturn ids;\n\t\t\t},\n\t\t\tparseOut: (value) => value.join(),\n\t\t},\n\t);\n\n\tuseWhenChangedEffect(\n\t\tuserPref,\n\t\tuseCallback(\n\t\t\t(userPref) => {\n\t\t\t\tjustPulledFromPrefsRef.current = true;\n\t\t\t\tdispatch({type: ACTIONS.SET_SELECTED, ids: userPref});\n\t\t\t},\n\t\t\t[selected],\n\t\t),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\tuseWhenChangedEffect(\n\t\tselected,\n\t\tuseCallback((selected) => {\n\t\t\tdispatch({type: ACTIONS.SET_SELECTED, ids: selected || []});\n\t\t}, []),\n\t);\n\n\tuseEffect(() => {\n\t\tif (state.loadingTemplates) return;\n\n\t\tlet continueFetching = true;\n\t\tconst fetch = async () => {\n\t\t\tawait asyncForEach(state.loading, async (id) => {\n\t\t\t\tif (!continueFetching) return;\n\t\t\t\tconst attributeTemplates =\n\t\t\t\t\tawait attributesSetProvider.getAttributeTemplatesById(\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tstate.hideSystemAttributes,\n\t\t\t\t\t);\n\t\t\t\tif (!continueFetching) return;\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.SET_TEMPLATES,\n\t\t\t\t\tattributeTemplates: {\n\t\t\t\t\t\t[id]: attributeTemplates,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.SET_LOOKUPS_ALLOWED,\n\t\t\t\tlookupsAllowed: await attributesSetProvider.getMetadataLookupsByIds(\n\t\t\t\t\tstate.selected,\n\t\t\t\t),\n\t\t\t});\n\t\t};\n\t\tfetch();\n\n\t\treturn () => {\n\t\t\tcontinueFetching = false;\n\t\t};\n\t}, [\n\t\tstate.loading,\n\t\tstate.loadingTemplates,\n\t\tstate.hideSystemAttributes,\n\t\tstate.invalidator,\n\t]);\n\n\tuseUpdateEffect(() => {\n\t\tdispatch({type: ACTIONS.INVALIDATE});\n\t}, [\n\t\tattributesSetProvider.getAttributeTemplatesById,\n\t\tattributesSetProvider.getMetadataLookupsByIds,\n\t]);\n\n\tconst setSelected = useCallback(\n\t\t(ids: AttributeSetId[]) => {\n\t\t\tids = ids.filter((id) => id != null);\n\t\t\tPromise.all(\n\t\t\t\tconfirm\n\t\t\t\t\t? [\n\t\t\t\t\t\t\tconfirmation({\n\t\t\t\t\t\t\t\ttitle: i18n.t('i18n.switchAttributeSetsConfirmTitle'),\n\t\t\t\t\t\t\t\tdescription: i18n.t('i18n.switchAttributeSetsConfirmMessage'),\n\t\t\t\t\t\t\t\tcatchOnCancel: true,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t ]\n\t\t\t\t\t: [],\n\t\t\t)\n\t\t\t\t.then(() => {\n\t\t\t\t\tdispatch({type: ACTIONS.SET_SELECTED, ids});\n\t\t\t\t\tonChange?.(ids);\n\n\t\t\t\t\t// If we have a valid user and a user pref key was provided, save to user prefs\n\t\t\t\t\tif (!userPrefKey || Netx.getUserLevel() < 1) return;\n\t\t\t\t\tsetUserPref(ids.length ? ids : ['']);\n\t\t\t\t\t//setUserPref(ids.length ? ids.join() : '');\n\t\t\t\t\t// Netx.setPreference(userPrefKey, ids.length ? ids.join() : '');\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:attributeSets:selected:hack',\n\t\t\t\t\t\tids,\n\t\t\t\t\t\tuserPrefKey,\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\tsetCancelled((n) => n + 1);\n\t\t\t\t});\n\t\t},\n\t\t[confirm, onChange, userPrefKey],\n\t);\n\n\t// The reducer actions to expose to outside components\n\tconst dispatchActions = useMemo(\n\t\t() => ({\n\t\t\t...actions(dispatch),\n\t\t\tsetSelected,\n\t\t}),\n\t\t[setSelected],\n\t);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport default AttributeSetSelectionProvider;\n","export const BASE_RULE = {\n\telementType: 1,\n\telementSubType1: 4,\n\telementSubType2: 0,\n\telementValue1: '',\n\telementValue2: '',\n\telementValue3: '',\n};\n\nexport default BASE_RULE;\n","import {i18n} from '@netx/core/i18n';\nimport {SearchType} from './rules/constants';\nimport {SearchMatchCriteria} from './constants';\n\nexport const SearchTypeLabel = {\n\t[SearchType.ACTIVE_TEMPLATES]: i18n.t('i18n.activeTemplates'),\n\t[SearchType.ADVANCED_RAW]: i18n.t('i18n.advancedRaw'),\n\t[SearchType.ATTRIBUTE_HISTORY]: i18n.t('i18n.attributeHistory'),\n\t[SearchType.BRANCH_CHILDREN]: i18n.t('i18n.branchChildren'),\n\t[SearchType.CART]: i18n.t('i18n.cart'),\n\t[SearchType.CATEGORY_ID]: i18n.t('i18n.category'),\n\t[SearchType.CATEGORY_NAME]: i18n.t('i18n.categoryName'),\n\t[SearchType.CHECKOUTS]: i18n.t('i18n.checkouts'),\n\t[SearchType.CONTENTS]: i18n.t('i18n.contents'),\n\t[SearchType.CUSTOM]: i18n.t('i18n.custom'),\n\t[SearchType.DATE]: i18n.t('i18n.date'),\n\t[SearchType.EXPIRE]: i18n.t('i18n.expires'),\n\t[SearchType.FILE_ASPECT]: i18n.t('i18n.fileAspect'),\n\t[SearchType.FILE_FORMAT]: i18n.t('i18n.fileFormat'),\n\t[SearchType.FILE_FORMAT_FAMILY]: i18n.t('i18n.fileFormatFamily'),\n\t[SearchType.FILE_SIZE]: i18n.t('i18n.fileSize'),\n\t[SearchType.FILE_STATUS]: i18n.t('i18n.fileStatus'),\n\t[SearchType.KEYWORD]: i18n.t('i18n.keywords'),\n\t[SearchType.LAST_SEARCH]: i18n.t('i18n.lastSearch'),\n\t[SearchType.LOCATION]: i18n.t('i18n.location'),\n\t[SearchType.METADATA]: i18n.t('i18n.attributes'),\n\t[SearchType.METADATA_HISTORY]: i18n.t('i18n.metadataHistory'),\n\t[SearchType.PROOF]: i18n.t('i18n.proof'),\n\t[SearchType.RATING]: i18n.t('i18n.rating'),\n\t[SearchType.RELATED_ASSETS]: i18n.t('i18n.relatedAssets'),\n\t[SearchType.REVIEWS]: i18n.t('i18n.reviews'),\n\t[SearchType.SAVED_SEARCH]: i18n.t('i18n.savedSearch'),\n\t[SearchType.THESAURUS]: i18n.t('i18n.thesaurus'),\n\t[SearchType.USER]: i18n.t('i18n.user'),\n\t[SearchType.VISUAL]: i18n.t('i18n.visual'),\n};\n\nexport const SearchMatchCriteriaLabel = {\n\t[SearchMatchCriteria.AND]: i18n.t('i18n.matchAll'),\n\t[SearchMatchCriteria.NOT]: i18n.t('i18n.matchNot'),\n\t[SearchMatchCriteria.OR]: i18n.t('i18n.matchAny'),\n};\n\nexport const SearchSubTypeLabel = i18n.t('i18n.matchType');\n\nexport const SearchRulesActionLabel = {\n\tADD_RULE: i18n.t('i18n.addRule'),\n\tDELETE_RULE: i18n.t('i18n.remove'),\n\tRESET: i18n.t('i18n.reset'),\n\tSEARCH: i18n.t('i18n.search'),\n};\n\nexport const SearchDataUnavailableMessage = i18n.t(\n\t'i18n.searchRulesSomeDataUnavailableWarning',\n);\n","import {makeObservable, IReactionDisposer, action, observable} from 'mobx';\nimport {nanoid} from 'nanoid';\nimport {SearchType} from './constants';\nimport {SearchRuleBase, RuleValidationErrors} from './types';\n\nexport abstract class RuleModel {\n\tabstract get isValid(): boolean;\n\n\telementValue1Label = '';\n\telementValue2Label = '';\n\telementValue3Label = '';\n\n\telementValue1Loading = false;\n\telementValue2Loading = false;\n\telementValue3Loading = false;\n\n\telementValue1Unavailable = false;\n\telementValue2Unavailable = false;\n\telementValue3Unavailable = false;\n\n\t_id: string;\n\n\treactionDisposers: IReactionDisposer[] = [];\n\n\tvalidationErrors?: RuleValidationErrors;\n\n\tdirty = false;\n\n\treadonly elementType: T;\n\tabstract elementSubType1: number;\n\tabstract elementSubType2: number;\n\tabstract elementValue1: string | number | string[];\n\tabstract elementValue2: string | number;\n\tabstract elementValue3: string | number;\n\n\tabstract setElementSubType1(elementSubType1: number): void;\n\tabstract setElementSubType2(elementSubType2: number): void;\n\tabstract setElementValue1(elementValue1: number | string | string[]): void;\n\tabstract setElementValue2(elementValue1: number | string): void;\n\tabstract setElementValue3(elementValue1: number | string): void;\n\n\tget elementSubType1Options(): number[] {\n\t\treturn [];\n\t}\n\n\tget elementSubType2Options(): number[] {\n\t\treturn [];\n\t}\n\n\tconstructor() {\n\t\tthis._id = nanoid();\n\t\tmakeObservable(this, {\n\t\t\telementValue1Label: observable,\n\t\t\telementValue1Loading: observable,\n\t\t\telementValue1Unavailable: observable,\n\t\t\telementValue2Label: observable,\n\t\t\telementValue2Loading: observable,\n\t\t\telementValue2Unavailable: observable,\n\t\t\telementValue3Label: observable,\n\t\t\telementValue3Loading: observable,\n\t\t\telementValue3Unavailable: observable,\n\t\t\tsetElementValue1Label: action,\n\t\t\tsetElementValue1Loading: action,\n\t\t\tsetElementValue1Unavailable: action,\n\t\t\tsetElementValue2Label: action,\n\t\t\tsetElementValue2Loading: action,\n\t\t\tsetElementValue2Unavailable: action,\n\t\t\tsetElementValue3Label: action,\n\t\t\tsetElementValue3Loading: action,\n\t\t\tsetElementValue3Unavailable: action,\n\t\t\tsetValidationErrors: action,\n\t\t\tdirty: observable,\n\t\t});\n\t}\n\n\tdispose() {\n\t\tthis.reactionDisposers.forEach((dispose) => dispose());\n\t}\n\n\tsetValidationErrors(validationErrors?: RuleValidationErrors) {\n\t\tthis.validationErrors = validationErrors;\n\t}\n\n\tsetElementValue1Label(elementValue1Label: string) {\n\t\tthis.elementValue1Label = elementValue1Label;\n\t}\n\n\tsetElementValue2Label(elementValue2Label: string) {\n\t\tthis.elementValue2Label = elementValue2Label;\n\t}\n\n\tsetElementValue3Label(elementValue3Label: string) {\n\t\tthis.elementValue3Label = elementValue3Label;\n\t}\n\n\tsetElementValue1Loading(loading: boolean) {\n\t\tthis.elementValue1Loading = loading;\n\t}\n\n\tsetElementValue2Loading(loading: boolean) {\n\t\tthis.elementValue2Loading = loading;\n\t}\n\n\tsetElementValue3Loading(loading: boolean) {\n\t\tthis.elementValue3Loading = loading;\n\t}\n\n\tsetElementValue1Unavailable(unavailable: boolean) {\n\t\tthis.elementValue1Unavailable = unavailable;\n\t}\n\n\tsetElementValue2Unavailable(unavailable: boolean) {\n\t\tthis.elementValue2Unavailable = unavailable;\n\t}\n\n\tsetElementValue3Unavailable(unavailable: boolean) {\n\t\tthis.elementValue3Unavailable = unavailable;\n\t}\n\n\ttoRuleObject(): SearchRuleBase | SearchRuleBase[] {\n\t\tif (Array.isArray(this.elementValue1)) {\n\t\t\treturn this.elementValue1.map((elementValue1) => ({\n\t\t\t\telementType: this.elementType,\n\t\t\t\telementSubType1: this.elementSubType1,\n\t\t\t\telementSubType2: this.elementSubType2,\n\t\t\t\telementValue1,\n\t\t\t\telementValue2: this.elementValue2,\n\t\t\t\telementValue3: this.elementValue3,\n\t\t\t})) as SearchRuleBase[];\n\t\t}\n\n\t\treturn {\n\t\t\telementType: this.elementType,\n\t\t\telementSubType1: this.elementSubType1,\n\t\t\telementSubType2: this.elementSubType2,\n\t\t\telementValue1: this.elementValue1,\n\t\t\telementValue2: this.elementValue2,\n\t\t\telementValue3: this.elementValue3,\n\t\t} as SearchRuleBase;\n\t}\n}\n\nexport default RuleModel;\n","import React from 'react';\n\nimport {Tabs as MuiTabs, TabsProps as MuiTabsProps} from '@mui/material';\n\nimport {useTabsProvider} from './';\nimport {styled, WithMuiPropOverrides} from '../Theme';\n\nconst TabsRoot = styled(MuiTabs, {\n\tslot: 'Root',\n})(({theme}) => ({\n\tflex: '0 0 auto',\n}));\n\nexport interface TabsProps\n\textends Omit, 'onChange'> {\n\t// Overriding to enforce `number` as tab value\n\tonChange?: (event: React.SyntheticEvent, value: number) => void;\n}\n\n/**\n * Wrapper for `@material-ui/Tabs`\\\n * Provides some common overrides, and accepts all the same props as the component it wraps\n */\nexport const TabsPrimitive = (props: TabsProps) => {\n\tconst tabs = useTabsProvider();\n\treturn (\n\t\t\n\t);\n};\n\nexport const Tabs = React.memo(TabsPrimitive);\nexport default Tabs;\n","import {useCallback, useEffect, useState} from 'react';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\n\nexport interface UseTabsProps {\n\tafterChange?: (newIndex: number, oldIndex: number) => void;\n\t/**\n\t * Provides the ability to check the new tab index vs the current tab index\n\t * and return `false` if the switch should be ignored\n\t */\n\tbeforeChange?: (newIndex: number, currentIndex: number) => boolean | void;\n\t/**\n\t * Index to be considered `active`\\\n\t * NOTE: Changes from this will supress before/after callbacks\n\t */\n\tindex?: number;\n}\n\n/**\n * Active tab management\n * @param options \n * @example\n const handleBeforeChange = useCallback((newIndex, currentIndex) => {\n return foo !== \"bar\";\n }, [foo]);\n const tabs = useTabs({\n beforeChange: handleBeforeChange,\n });\n return (\n \n \n \n \n );\n */\nexport const useTabs = ({\n\tafterChange,\n\tbeforeChange,\n\tindex,\n}: UseTabsProps = {}) => {\n\tconst [activeTabIndex, setActiveTabIndex] = useState(index || 0);\n\n\tuseEffect(() => {\n\t\tsetActiveTabIndex(index || 0);\n\t}, [index]);\n\n\t// useWhenChangedEffect(index, setActiveTabIndex);\n\n\tconst setTab = useCallback(\n\t\t(index: number) => {\n\t\t\tsetActiveTabIndex((activeTabIndex) => {\n\t\t\t\t// If the index is the same, or the `beforeChange` callback opts to prevent\n\t\t\t\tif (\n\t\t\t\t\tactiveTabIndex === index ||\n\t\t\t\t\tbeforeChange?.(index, activeTabIndex) === false\n\t\t\t\t)\n\t\t\t\t\treturn activeTabIndex;\n\n\t\t\t\t// Notify and update\n\t\t\t\tafterChange?.(index, activeTabIndex);\n\t\t\t\treturn index;\n\t\t\t});\n\t\t},\n\t\t[afterChange, beforeChange],\n\t);\n\n\tconst handleChange = useCallback((event, index: number) => setTab(index), [\n\t\tsetTab,\n\t]);\n\n\treturn {\n\t\tactiveTabIndex,\n\t\thandleChange,\n\t\tsetTab,\n\t};\n};\n\nexport default useTabs;\n","import React, {createContext, useContext, useImperativeHandle} from 'react';\n\nimport type {ArgumentsType} from '@netx/core/typings';\nimport {useTabs} from './useTabs';\n\nexport type TabsContextType = ReturnType;\n\nexport type TabsProviderRef = React.RefObject;\n\nexport type TabsProviderChildrenProps = TabsContextType;\n\nexport const TabsContext = createContext(\n\tundefined,\n);\n\nexport const useTabsProvider = () => {\n\tconst context = useContext(TabsContext);\n\tif (context === undefined) {\n\t\tthrow new Error('`useTabsProvider` must be used within a `TabsProvider`');\n\t}\n\treturn context;\n};\n\nexport type TabsProviderProps = ArgumentsType[0] & {\n\tref?: TabsProviderRef;\n\tchildren:\n\t\t| React.ReactNode\n\t\t| ((props: TabsProviderChildrenProps) => React.ReactNode);\n};\n\nconst TabsProviderInner = (\n\t{children, ...props}: TabsProviderProps,\n\tref: TabsProviderRef,\n) => {\n\tconst tabs = useTabs(props);\n\n\tuseImperativeHandle(ref, () => tabs, [tabs]);\n\n\treturn (\n\t\t\n\t\t\t{typeof children === 'function' ? children(tabs) : children}\n\t\t\n\t);\n};\n\nexport const TabsProviderPrimitive = React.forwardRef<\n\tTabsContextType,\n\tTabsProviderProps\n>(TabsProviderInner);\n\n/**\n * Tabs context provider\n * @example\n * \n * \t...\n * \n * @example\n * \n * \t{(tabs) => (\n * \t\t...\n * \t)}\n * \n */\nexport const TabsProvider = TabsProviderPrimitive;\n\nexport default TabsProvider;\n","import {useCallback, useLayoutEffect, useRef} from 'react';\n\nexport const useComponentIsMounted = () => {\n\tconst componentIsMounted = useRef(false);\n\tuseLayoutEffect(() => {\n\t\tcomponentIsMounted.current = true;\n\t\treturn () => {\n\t\t\tcomponentIsMounted.current = false;\n\t\t};\n\t}, []);\n\n\tconst shouldAct = useCallback(() => componentIsMounted.current === true, []);\n\n\tconst act = useCallback(\n\t\t any>(cb: T): undefined | ReturnType => {\n\t\t\tif (!shouldAct()) return;\n\t\t\treturn cb();\n\t\t},\n\t\t[],\n\t);\n\n\treturn {\n\t\tact,\n\t\tcomponentIsMounted,\n\t\tshouldAct,\n\t};\n};\n\nexport default useComponentIsMounted;\n","import React from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {IconButton, IconButtonProps} from '@netx/core-components';\nimport {faSearch as SearchIcon} from '@fortawesome/pro-regular-svg-icons';\n\nexport interface SearchProps extends Partial {}\n\nexport const Search = (props: SearchProps) => {\n\treturn (\n\t\t\n\t);\n};\n\nexport default Search;\n","import React, {useCallback, useRef} from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport type {AttributeId, Permission} from '@netx/core-asset/models/attribute';\nimport {Search} from '../../components/Action';\nimport AttributeComponent, {\n\tAttributeProps as AttributeComponentProps,\n} from '../../components/Attribute';\n\nimport {compareProps, isEmptyValue} from '@netx/core-components';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'inline-flex',\n\t\t\twidth: '100%',\n\t\t},\n\n\t\tleadingControls: {\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflex: '0 0 auto',\n\t\t\theight: 'max-content',\n\t\t\tmarginTop: theme.spacing(1),\n\t\t\t'& > *': {\n\t\t\t\tmarginRight: theme.spacing(1),\n\t\t\t},\n\t\t},\n\n\t\tlimitHeightToContainer: {\n\t\t\tmaxHeight: '100%',\n\t\t\theight: '100%',\n\t\t},\n\t\tmatchContainerHeight: {\n\t\t\theight: '100%',\n\t\t},\n\t});\n\nexport interface AttributeContainerProps\n\textends Omit {\n\tonSearch?: (id: AttributeId, value: any) => void;\n\tpermission?: Permission;\n\t// This currently is only supported properly for autocomplets (tags/multiselect/select)\n\tlimitHeightToContainer?: boolean;\n\tmatchContainerHeight?: boolean;\n\talignActions?: 'top' | 'bottom' | 'center';\n}\n\nconst AttributeContainerComponent = ({\n\tclasses,\n\talignActions,\n\tlimitHeightToContainer,\n\tmatchContainerHeight,\n\tpermission,\n\tonSearch,\n\t...props\n}: WithStyles & AttributeContainerProps) => {\n\tconst {attrData, disabled, loadingValue, readOnly, value} = props;\n\n\tpermission = permission || attrData.permission;\n\n\tconst isReadOnly = !props.form || readOnly || permission === 'r';\n\n\tconst valueRef = useRef(value);\n\tvalueRef.current = value;\n\n\tconst handleValueSearch = useCallback(() => {\n\t\tonSearch?.(attrData.attributeid, valueRef.current);\n\t}, [attrData.attributeid, onSearch]);\n\n\tconst handleValueItemSearch = useCallback(\n\t\t(value: string) => {\n\t\t\tonSearch?.(attrData.attributeid, value);\n\t\t},\n\t\t[attrData.attributeid, onSearch],\n\t);\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t{onSearch ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t
\n\t\t\t\n\t\t\n\t);\n};\n\nexport const AttributeContainer = withStyles(styles, {\n\tname: 'AttributeContainer',\n})(React.memo(AttributeContainerComponent, compareProps()));\n\nexport default AttributeContainer;\n","import {UserLevel} from '@netx/core-user/constants';\n\nexport const MINIMUM_USER_LEVEL = UserLevel.ADMIN;\n\n// This is what is reflected in a attribute object (technically there is a 'd' but for the purposes\n// of this service, there are only the two)\nexport const PERMISSION_TYPE = {\n\tREAD: 'r',\n\tWRITE: 'w',\n};\n\n// This is what is reflected on the permission object\nexport const PERMISSION_MODE = {\n\t[PERMISSION_TYPE.READ]: 'read',\n\t[PERMISSION_TYPE.WRITE]: 'write',\n};\n","import {i18n} from '@netx/core/i18n';\nimport {PERMISSION_TYPE} from './constants';\n\nexport const PERMISSION_ACTION = {\n\tDISABLE: i18n.t('i18n.disablePermissions'),\n\tEDIT: i18n.t('i18n.editPermission'),\n\tENABLE: i18n.t('i18n.enablePermissions'),\n};\n\nexport const PERMISSION_CONFIRMATION = {\n\tDISABLE: i18n.t('i18n.attributePermissionConfirmationDisable'),\n\tENABLE: i18n.t('i18n.attributePermissionConfirmEnable'),\n};\n\nexport const PERMISSION_MESSAGES = {\n\tNO_PERMISSIONS: i18n.t('i18n.noPermissionsYet'),\n};\n\nexport const PERMISSION_TITLES = {\n\tEDIT: i18n.t('i18n.attributePermissions'),\n};\n\nexport const PERMISSION_TYPE_LABEL: Record<\n\ttypeof PERMISSION_TYPE[keyof typeof PERMISSION_TYPE],\n\tstring\n> = {\n\t[PERMISSION_TYPE.READ]: i18n.t('i18n.view'),\n\t[PERMISSION_TYPE.WRITE]: i18n.t('i18n.edit'),\n};\n","import React, {useState, useCallback, useEffect} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {Menu, MenuItem, MenuProps} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport Button, {ButtonProps} from '@netx/core-components/Button';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCaretDown} from '@fortawesome/pro-solid-svg-icons';\nimport {faCheck} from '@fortawesome/pro-solid-svg-icons';\n\nimport {PERMISSION_TYPE_LABEL} from '../../locales';\nimport type {PermissionMode} from '../../types';\nimport {PERMISSION_MODE, PERMISSION_TYPE} from '../../constants';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\nimport useSharedRef from '@netx/core-components/hooks/useSharedRef';\n\nexport type PermissionItemMenuProps = {\n\tvalue: PermissionMode;\n\tonChange(value: PermissionMode): void;\n\tonRemove(): void;\n\tonClose?: () => void;\n\tonOpen?: () => void;\n\topen?: boolean;\n\n\tButtonProps?: Partial;\n\tMenuProps?: Partial;\n};\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\tdropdownIcon: {\n\t\t\tmarginLeft: 8,\n\t\t},\n\t\t// TODO: make a menu component that handles this checkmark stuff\n\t\tactiveIcon: {\n\t\t\twidth: 32,\n\t\t\tcolor: theme.palette.secondary.main,\n\t\t\tposition: 'absolute',\n\t\t\tright: 8,\n\t\t\ttop: 0,\n\t\t\tbottom: 0,\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t},\n\t\tmenu: {\n\t\t\t// TODO: make a decision on our menus - they get bigger at smaller screens\n\t\t\t// this layout works better with the sizing from that breakpoint\n\t\t\t'& .MuiMenuItem-root': {\n\t\t\t\tminHeight: '48px !important',\n\t\t\t},\n\t\t\t// TODO: something funky in the menu is preventing this from happening\n\t\t\t// when using arrow keys to navigate menu items\n\t\t\t'& li:focus': {\n\t\t\t\tbackgroundColor: theme.palette.action.hover,\n\t\t\t},\n\t\t},\n\t\tpermissionModeItem: {\n\t\t\tpaddingRight: 48,\n\t\t},\n\t});\n\nexport const PermissionItemMenu = ({\n\tclasses,\n\tvalue,\n\tonChange,\n\tonClose,\n\tonOpen,\n\tonRemove,\n\topen,\n\tButtonProps,\n\tMenuProps,\n}: PermissionItemMenuProps & WithStyles) => {\n\tconst [anchorEl, setAnchorEl] = useState(null);\n\tconst internalButtonRef = useSharedRef(null, [\n\t\tButtonProps?.ref,\n\t]);\n\n\tuseEffect(() => {\n\t\topen ? setAnchorEl(internalButtonRef.current) : setAnchorEl(null);\n\t}, [open]);\n\n\tuseWhenChangedEffect(\n\t\tanchorEl,\n\t\tuseCallback(\n\t\t\t(anchorEl) => {\n\t\t\t\tanchorEl ? onOpen?.() : onClose?.();\n\t\t\t},\n\t\t\t[onOpen, onClose],\n\t\t),\n\t);\n\n\tconst handleOpenClick = useCallback(\n\t\t(event: React.MouseEvent) =>\n\t\t\tsetAnchorEl(event.currentTarget),\n\t\t[onOpen],\n\t);\n\n\tconst handleClose = useCallback(() => setAnchorEl(null), []);\n\n\tconst selectPermission = useCallback(\n\t\t(perm: PermissionMode) => () => {\n\t\t\tonChange(perm);\n\t\t\tsetAnchorEl(null);\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst handleRemove = useCallback(() => {\n\t\tsetAnchorEl(null);\n\t\tonRemove();\n\t}, [onRemove]);\n\n\tconst modeEntries = Object.entries(PERMISSION_MODE);\n\tconst modeCount = modeEntries.length;\n\n\treturn (\n\t\t<>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{\n\t\t\t\t\t\tPERMISSION_TYPE_LABEL[\n\t\t\t\t\t\t\tvalue === 'write' ? PERMISSION_TYPE.WRITE : PERMISSION_TYPE.READ\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t{/** TODO: Make/adjust menu component to handle this checkmark active stuff */}\n\t\t\t\n\t\t\t\t{modeEntries.map(([key, mode], index) => (\n\t\t\t\t\t\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{PERMISSION_TYPE_LABEL[key]}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{value === mode ? : null}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\t\n\t\t\t\t\t{i18n.t('i18n.remove')}\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(PermissionItemMenu) as (\n\tprops: Omit,\n) => JSX.Element;\n","import React, {useCallback} from 'react';\nimport clsx from 'clsx';\nimport {RequiredKeys} from '@netx/core/typings';\n\nimport {\n\tListItem,\n\tListItemProps,\n\tListItemAvatar,\n\tListItemText,\n} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport ColoredAvatar from '@netx/core-components/ColoredAvatar';\n\nimport {PERMISSION_TYPE_LABEL} from '../../locales';\nimport {AttributePermission} from '../../types';\nimport PermissionItemMenu, {PermissionItemMenuProps} from '../ListItemMenu';\n\nexport type {PermissionItemMenuProps} from '../ListItemMenu';\nexport type MinimumPermissionItemMenuProps = Pick<\n\tPermissionItemMenuProps,\n\tRequiredKeys\n>;\n\nexport type PermissionListItemProps<\n\tMenuProps extends MinimumPermissionItemMenuProps = PermissionItemMenuProps\n> = Partial, 'button' | 'onChange'>> & {\n\tonChange(permission: AttributePermission, newPerm: 'read' | 'write'): void;\n\tonRemove(permission: AttributePermission): void;\n\tpermission: AttributePermission;\n\tPermissionItemMenuComponent?: React.ComponentType;\n\tPermissionItemMenuProps?: Partial;\n};\n\nconst styles = ({palette, spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tborderRadius: '28px 0 0 28px',\n\t\t\toutline: 'none !important',\n\t\t\tpaddingLeft: 10,\n\t\t\tmarginLeft: spacing(2),\n\t\t\twidth: `calc(100% - ${spacing(2)}) !important`,\n\t\t\t'&:hover, &:focus': {\n\t\t\t\tbackgroundColor: palette.action.hover,\n\t\t\t},\n\t\t},\n\t\tlistItemAction: {\n\t\t\tflex: '0 0 auto',\n\t\t\tpaddingLeft: spacing(2),\n\t\t},\n\t\tselected: {\n\t\t\tbackgroundColor: palette.action.hover,\n\t\t},\n\t});\n\nconst PermissionListItem = <\n\tMenuProps extends MinimumPermissionItemMenuProps = PermissionItemMenuProps\n>({\n\tclasses,\n\tpermission,\n\tonChange,\n\tonRemove,\n\tselected,\n\tPermissionItemMenuProps,\n\tPermissionItemMenuComponent = PermissionItemMenu,\n\t...props\n}: PermissionListItemProps & WithStyles) => {\n\tconst handleChange = useCallback(\n\t\t(perm: 'read' | 'write') => onChange(permission, perm),\n\t\t[permission, onChange],\n\t);\n\n\tconst handleRemove = useCallback(() => onRemove(permission), [\n\t\tpermission,\n\t\tonRemove,\n\t]);\n\n\treturn (\n\t\t\n\t\t\taria-label={`${permission.groupName}: ${\n\t\t\t\tPERMISSION_TYPE_LABEL[permission.write ? 'w' : 'r']\n\t\t\t}`}\n\t\t\tclassName={clsx(classes.root, {\n\t\t\t\t[classes.selected]: selected,\n\t\t\t})}\n\t\t\tcomponent=\"li\"\n\t\t\tid={`permission-${permission.groupId.toString()}`}\n\t\t\t{...props}\n\t\t>\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(PermissionListItem) as <\n\tMenuProps extends MinimumPermissionItemMenuProps = PermissionItemMenuProps\n>(\n\tprops: Omit, 'classes'>,\n) => JSX.Element;\n","import React, {useCallback} from 'react';\n\nimport {Skeleton} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport PermissionListItem, {\n\tPermissionListItemProps,\n\tPermissionItemMenuProps,\n\tMinimumPermissionItemMenuProps,\n} from '../ListItem';\n\nimport type {AttributePermissionIndexed} from '../../types';\nimport type {VirtualizedListItemProps} from '@netx/core-components/VirtualizedList';\n\nexport interface VirtualizedPermissionListItemDataProps<\n\tMenuProps extends MinimumPermissionItemMenuProps = PermissionItemMenuProps\n> extends Omit, 'permission' | 'onClick'> {\n\tonClick?: (index: number) => void;\n}\n\nexport interface VirtualizedPermissionListItemProps<\n\tMenuProps extends MinimumPermissionItemMenuProps = PermissionItemMenuProps\n>\n\textends VirtualizedListItemProps<\n\t\tAttributePermissionIndexed,\n\t\tVirtualizedPermissionListItemDataProps\n\t> {}\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\tskeleton: {\n\t\t\theight: 'calc(100% - 1px)',\n\t\t\twidth: '100%',\n\t\t\tposition: 'absolute',\n\t\t\ttop: 0,\n\t\t\tleft: 0,\n\t\t\tbottom: 0,\n\t\t\tright: 0,\n\t\t},\n\t});\n\nconst VirtualizedPermissionListItem = <\n\tMenuProps extends MinimumPermissionItemMenuProps = PermissionItemMenuProps\n>({\n\tclasses,\n\tdata,\n\tindex,\n\tstyle,\n}: VirtualizedPermissionListItemProps &\n\tWithStyles) => {\n\tconst {rows, onClick, viewportWidth, ...props} = data;\n\n\tconst permission = rows[index];\n\n\tconst handleClick = useCallback(() => onClick?.(index), [index, onClick]);\n\n\tif (!permission)\n\t\treturn (\n\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t);\n\n\treturn (\n\t\t\n\t\t\tid={`permission-${index.toString()}`}\n\t\t\tonClick={handleClick}\n\t\t\tpermission={permission}\n\t\t\trole=\"group\"\n\t\t\t{...props}\n\t\t\tstyle={{...style, ...props.style}}\n\t\t/>\n\t);\n};\n\nexport default withStyles(styles)(\n\tReact.memo(VirtualizedPermissionListItem),\n) as <\n\tMenuProps extends MinimumPermissionItemMenuProps = PermissionItemMenuProps\n>(\n\tprops: Omit, 'classes'>,\n) => JSX.Element;\n","import React from 'react';\n\nimport FallbackMessage from '@netx/core-components/FallbackMessage';\nimport {faUserShield as PermissionsIcon} from '@fortawesome/pro-solid-svg-icons';\n\nimport type {AttributePermissionIndexed} from '../../types';\nimport {PERMISSION_MESSAGES} from '../../locales';\n\nimport VirtualizedList, {\n\tVirtualizedListProps,\n} from '@netx/core-components/VirtualizedList';\n\nimport VirtualizedPermissionListItem, {\n\tVirtualizedPermissionListItemDataProps,\n} from '../VirtualizedListItem';\n\ntype OurVirtualizedListProps<\n\tP extends VirtualizedPermissionListItemDataProps = VirtualizedPermissionListItemDataProps\n> = VirtualizedListProps;\n\nexport interface VirtualizedPermissionsListProps<\n\tP extends VirtualizedPermissionListItemDataProps = VirtualizedPermissionListItemDataProps\n>\n\textends Omit<\n\t\tOurVirtualizedListProps

,\n\t\t'ListItemComponent' | 'ListItemComponentProps'\n\t> {\n\t// Allow for the passing of different components so long as their props\n\t// are compatible with the base `VirtualizedPermissionListItem`\n\tListItemComponent?: OurVirtualizedListProps

['ListItemComponent'];\n\tListItemComponentProps: Required<\n\t\tOurVirtualizedListProps

\n\t>['ListItemComponentProps'];\n}\n\nconst VirtualizedPermissionsList = <\n\tP extends VirtualizedPermissionListItemDataProps = VirtualizedPermissionListItemDataProps\n>({\n\tListItemComponent = VirtualizedPermissionListItem,\n\tListItemComponentProps,\n\t...props\n}: VirtualizedPermissionsListProps

) => {\n\treturn (\n\t\t<>\n\t\t\t{!props.dataReady || props.total > 0 ? (\n\t\t\t\t\n\t\t\t\t\tuseIsScrolling\n\t\t\t\t\tinnerElementType=\"ul\"\n\t\t\t\t\t{...props}\n\t\t\t\t\tListItemComponent={ListItemComponent}\n\t\t\t\t\tListItemComponentProps={ListItemComponentProps}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport default React.memo(VirtualizedPermissionsList) as <\n\tP extends VirtualizedPermissionListItemDataProps = VirtualizedPermissionListItemDataProps\n>(\n\tprops: Omit, 'classes'>,\n) => JSX.Element;\n","import React, {useState, useCallback, useRef, useEffect} from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport PermissionItemMenu, {PermissionItemMenuProps} from '../ListItemMenu';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\n\nexport type PermissionItemFocusTrapMenuProps = Omit<\n\tPermissionItemMenuProps,\n\t'onOpen' | 'onClose'\n> & {\n\tcanTab?: boolean;\n\tindex?: number;\n\tfocused?: boolean;\n\tonBlur?: (event: React.FocusEvent) => void;\n\tonOpen?: (requested: boolean) => void;\n\tonClose?: (requested: boolean) => void;\n};\n\nconst styles = ({palette}: Theme) =>\n\tcreateStyles({\n\t\tbutton: {\n\t\t\t'&$active, &:focus': {\n\t\t\t\tbackgroundColor: palette.action.hover,\n\t\t\t},\n\t\t},\n\t\tactive: {},\n\t});\n\nexport const PermissionItemFocusTrapMenu = ({\n\tclasses,\n\tcanTab,\n\tfocused,\n\tonOpen,\n\tonClose,\n\tonBlur,\n\topen,\n\t...props\n}: PermissionItemFocusTrapMenuProps & WithStyles) => {\n\tconst buttonRef = useRef(null);\n\tconst requestedCloseRef = useRef(false);\n\tconst requestedOpenRef = useRef(false);\n\n\tconst [menuOpen, setMenuOpen] = useState(open);\n\n\tuseEffect(() => {\n\t\trequestedCloseRef.current = open === false;\n\t\trequestedOpenRef.current = open === true;\n\t\tsetMenuOpen(open);\n\t}, [open]);\n\n\tuseWhenChangedEffect(\n\t\tmenuOpen,\n\t\tuseCallback(\n\t\t\t(menuOpen) => {\n\t\t\t\tmenuOpen\n\t\t\t\t\t? onOpen?.(requestedOpenRef.current)\n\t\t\t\t\t: onClose?.(requestedCloseRef.current);\n\t\t\t\trequestedCloseRef.current = requestedOpenRef.current = false;\n\t\t\t},\n\t\t\t[onClose, onOpen],\n\t\t),\n\t);\n\n\tconst handleMenuToggled = useCallback(\n\t\t(open: boolean) => () => {\n\t\t\tsetMenuOpen(open);\n\t\t},\n\t\t[],\n\t);\n\n\tuseEffect(() => {\n\t\t// If we can no longer initiate focus, is no longer focused, or the menu is open:\n\t\t// trigger `blur` on button\n\t\tif (!focused || !canTab || menuOpen) {\n\t\t\tbuttonRef.current?.blur();\n\t\t\treturn;\n\t\t}\n\t\t// Otherwise, if focused, trigger `focus` on the button\n\t\tfocused && buttonRef.current?.focus();\n\t}, [canTab, focused, menuOpen]);\n\n\treturn (\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(PermissionItemFocusTrapMenu) as (\n\tprops: Omit,\n) => JSX.Element;\n","import React, {useRef, useState, useCallback, useEffect} from 'react';\n\nimport {AttributePermissionIndexed} from '../../types';\nimport type {VirtualizedListItemProps} from '@netx/core-components/VirtualizedList';\nimport VirtualizedPermissionListItem, {\n\tVirtualizedPermissionListItemDataProps,\n} from '../VirtualizedListItem';\n\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\nimport useUpdateEffect from '@netx/core-components/hooks/useUpdateEffect';\n\nimport PermissionItemFocusTrapMenu, {\n\tPermissionItemFocusTrapMenuProps,\n} from './PermissionItemMenuFocusTrap';\n\nimport {useDocumentKeyDown} from '@netx/core-components/hooks/useDocumentKeyDown';\n\nconst preventBubble = (event: React.FocusEvent) => event.stopPropagation();\nexport interface VirtualizedPermissionListItemFocusTrapDataProps\n\textends VirtualizedPermissionListItemDataProps {\n\tactiveIndex: number;\n\tfocusTrapActive?: boolean;\n\tonInteracting?: (index: number, interacting: boolean) => void;\n}\nexport interface VirtualizedPermissionListItemFocusTrapProps\n\textends VirtualizedListItemProps<\n\t\tAttributePermissionIndexed,\n\t\tVirtualizedPermissionListItemFocusTrapDataProps\n\t> {}\n\nconst VirtualizedPermissionListItemFocusTrap = ({\n\tdata,\n\tindex,\n\t...props\n}: VirtualizedPermissionListItemFocusTrapProps) => {\n\tconst itemMenuRef = useRef(null);\n\tconst justTabbedForwardRef = useRef(false);\n\tconst [menuOpen, setMenuOpen] = useState(false);\n\n\tconst {rows, onClick} = data;\n\tconst {activeIndex, focusTrapActive, onInteracting, ...sendProps} = data;\n\tconst permission = rows[index];\n\n\tconst [menuActive, setMenuActive] = useState(false);\n\n\t// When the `groupId` changes, reset the menu states\n\tuseUpdateEffect(() => {\n\t\tsetMenuOpen(false);\n\t\tsetMenuActive(false);\n\t}, [permission?.groupId]);\n\n\t// When the menu closes, remove the activeness so the user can get to the next\n\t// item without having to shift+tab\n\tuseUpdateEffect(() => {\n\t\tif (!menuOpen) setMenuActive(false);\n\t}, [menuOpen]);\n\n\t// Let the outside world know when this item is being interacted with\n\tuseWhenChangedEffect(\n\t\t[menuOpen, menuActive] as const,\n\t\tuseCallback(\n\t\t\t([menuOpen, menuActive]) => {\n\t\t\t\tonInteracting?.(index, menuOpen || menuActive);\n\t\t\t},\n\t\t\t[onInteracting, index],\n\t\t),\n\t);\n\n\t// Reset some things when `activeIndex` no longer matches this `index`\n\tuseWhenChangedEffect(\n\t\t[activeIndex, index] as const,\n\t\tuseCallback(\n\t\t\t([activeIndex, index]) => {\n\t\t\t\tif (activeIndex === index) return;\n\t\t\t\tsetMenuActive(false);\n\t\t\t\tmenuOpen && itemMenuRef.current?.close();\n\t\t\t},\n\t\t\t[menuOpen],\n\t\t),\n\t);\n\n\t// TODO: move this to a shared hook or whatever if we continue down this path\n\t// this handles focus within the item and triggering a menu\n\tuseDocumentKeyDown(\n\t\tuseCallback(\n\t\t\t(event) => {\n\t\t\t\tswitch (event.key) {\n\t\t\t\t\tcase ' ':\n\t\t\t\t\t\t// The damn space key!\n\t\t\t\t\t\tsetTimeout(() => setMenuOpen(true), 101);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tcase 'Enter':\n\t\t\t\t\t\tsetMenuOpen(true);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\tcase 'ArrowUp':\n\t\t\t\t\t\tif (menuActive) {\n\t\t\t\t\t\t\tsetMenuOpen(true);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'Tab':\n\t\t\t\t\t\tjustTabbedForwardRef.current = false;\n\t\t\t\t\t\tif (menuActive && event.shiftKey) {\n\t\t\t\t\t\t\tsetMenuActive(false);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!menuActive && !event.shiftKey) {\n\t\t\t\t\t\t\tsetMenuActive(true);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (menuActive) {\n\t\t\t\t\t\t\tjustTabbedForwardRef.current = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t},\n\t\t\t[menuActive],\n\t\t),\n\t\t{\n\t\t\tdisabled: !focusTrapActive || activeIndex !== index || menuOpen,\n\t\t},\n\t);\n\n\t// When the menu opens or closes, need to get that focus back to the item at this index\n\tconst handleMenuOpenedToggle = useCallback(\n\t\t(open: boolean) => (requested: boolean) => {\n\t\t\tsetMenuOpen((wasOpen) => {\n\t\t\t\t// If it was not requested and it changed, ensure focus is brought back to the item at this index\n\t\t\t\tif (wasOpen !== open) !requested && onClick?.(index);\n\t\t\t\treturn open;\n\t\t\t});\n\t\t},\n\t\t[onClick],\n\t);\n\n\t// When the menu fires off a blur\n\tconst handleMenuBlur = useCallback(\n\t\t(event: React.FocusEvent) => {\n\t\t\t// The user is trying to escape the \"focus trap\"\n\t\t\tif (justTabbedForwardRef.current) return;\n\t\t\tjustTabbedForwardRef.current = false;\n\t\t\t// Do not let this bubble up\n\t\t\tpreventBubble(event);\n\t\t\t// Ensure focus is brought back to the item at this index\n\t\t\tonClick?.(index);\n\t\t},\n\t\t[onClick],\n\t);\n\n\tconst menuToggleId = `permission-menu-toggle-${index.toString()}`;\n\tconst selected = (focusTrapActive || menuOpen) && index === activeIndex;\n\n\treturn (\n\t\t\n\t\t\t{...props}\n\t\t\tindex={index}\n\t\t\tdata={{\n\t\t\t\t...sendProps,\n\t\t\t\tselected,\n\t\t\t\t'aria-selected': selected,\n\t\t\t\t'aria-owns': menuToggleId,\n\t\t\t\tonFocusCapture: preventBubble,\n\t\t\t\ttabIndex: -1,\n\t\t\t\tPermissionItemMenuComponent: PermissionItemFocusTrapMenu,\n\t\t\t\tPermissionItemMenuProps: {\n\t\t\t\t\t...data.PermissionItemMenuProps,\n\t\t\t\t\tcanTab: activeIndex === index && focusTrapActive,\n\t\t\t\t\tfocused: menuActive,\n\t\t\t\t\tonBlur: handleMenuBlur,\n\t\t\t\t\tonClose: handleMenuOpenedToggle(false),\n\t\t\t\t\tonOpen: handleMenuOpenedToggle(true),\n\t\t\t\t\topen: menuOpen,\n\t\t\t\t\tButtonProps: {\n\t\t\t\t\t\t...data.PermissionItemMenuProps?.ButtonProps,\n\t\t\t\t\t\tid: menuToggleId,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport default VirtualizedPermissionListItemFocusTrap;\n","import React from 'react';\n\nimport {styled} from '@netx/core-components/Theme';\n\nimport useSharedRef from '@netx/core-components/hooks/useSharedRef';\nimport {\n\tVirtualizedListArrowTabTrapProvider,\n\tuseVirtualizedListArrowTabTrapProvider,\n} from '@netx/core-components/VirtualizedList';\n\nimport VirtualizedPermissionsList, {\n\tVirtualizedPermissionsListProps,\n} from '../VirtualizedList';\nimport VirtualizedPermissionListItem, {\n\tVirtualizedPermissionListItemFocusTrapDataProps,\n} from './VirtualizedPermissionListItemFocusTrap';\n\nexport type PermissionsProps = VirtualizedPermissionsListProps & {\n\theight?: number;\n\taddedAtIndex?: number;\n};\n\nconst VirtualizedListTrapFocusRoot = styled('div', {\n\tname: 'VirtualizedListTrapFocus',\n\tslot: 'Root',\n})(({theme}) => ({\n\toutline: 'none',\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tminHeight: 56,\n\twidth: '100%',\n\tflex: '1 1 auto',\n\toverflow: 'hidden',\n\t'& ul': {\n\t\tmargin: 0,\n\t},\n}));\n\nexport const PermissionsPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tPermissionsProps\n>(({height, virtualListRef, addedAtIndex = -1, ...props}, ref) => {\n\tconst itemProvider = useVirtualizedListArrowTabTrapProvider();\n\n\tconst internalVirtualListRef = useSharedRef(null, [virtualListRef]);\n\tconst rootRef = useSharedRef(null, [ref, itemProvider.rootRef]);\n\n\treturn (\n\t\t// We are a \"tab\" trap of sorts\n\t\t// If a user tabs to this area arrow keys are now in play\n\t\t// to navigate through the contents\n\t\t\n\t\t\t\n\t\t\t\t{...props}\n\t\t\t\tinnerElementType=\"ul\"\n\t\t\t\tvirtualListRef={internalVirtualListRef}\n\t\t\t\tonScrollIndexUpdate={itemProvider.onScrollIndexUpdate}\n\t\t\t\tListItemComponent={VirtualizedPermissionListItem}\n\t\t\t\tListItemComponentProps={{\n\t\t\t\t\t...props.ListItemComponentProps,\n\t\t\t\t\tactiveIndex: itemProvider.state.activeIndex,\n\t\t\t\t\tfocusTrapActive: itemProvider.state.active,\n\t\t\t\t\ttabIndex: -1,\n\t\t\t\t\tonInteracting: itemProvider.onItemInteracting,\n\t\t\t\t\tonClick: itemProvider.onItemClick,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\n\t);\n});\n\nexport const Permissions = React.memo(\n\tReact.forwardRef(\n\t\t({virtualListRef, ...props}, ref) => {\n\t\t\tconst internalVirtualListRef = useSharedRef(null, [virtualListRef]);\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t);\n\t\t},\n\t),\n);\n\nexport default Permissions;\n","import React from 'react';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {i18n} from '@netx/core/i18n';\nimport type {Optional} from '@netx/core/typings';\n\nimport SelectField, {\n\tSelectFieldProps,\n} from '@netx/core-components/Form/SelectField';\n\nimport {UserLevel} from '../../constants';\nimport {USER_LEVEL_LABEL} from '../../locales';\n\nexport type UserLevelSelectorProps<\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false\n> = Optional<\n\tOmit<\n\t\tSelectFieldProps,\n\t\t'options'\n\t>,\n\t'name' | 'value'\n> & {};\n\nconst OPTIONS = enumToValues(UserLevel);\n\nexport const UserLevelSelector = <\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false\n>({\n\tmultiple,\n\t...props\n}: UserLevelSelectorProps) => {\n\treturn (\n\t\t\n\t\t\tlabel={i18n.t('i18n.userLevel')}\n\t\t\tname=\"userLevel\"\n\t\t\toptions={OPTIONS}\n\t\t\toptionLabels={USER_LEVEL_LABEL}\n\t\t\t// TODO: fix the typing here, read only variant is mucking it up\n\t\t\tvalue={multiple ? ([] as any) : UserLevel.NO_ACCESS}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nexport default UserLevelSelector;\n","import React, {useRef, useCallback, useEffect, useState} from 'react';\nimport {i18n} from '@netx/core/i18n';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport Permissions, {PermissionsProps} from '../VirtualizedListTrapFocus';\nimport type {PartialAttributePermission} from '../../types';\nimport type {AttributeTemplate} from '@netx/core-attribute';\n\nimport {\n\tGroupAutoList,\n\tGroupAutoListProps,\n\tGroupAutoListItem,\n} from '@netx/core-user/components';\nimport type {FixedSizeList} from 'react-window';\n\nexport interface PermissionsFormProps extends PermissionsProps {\n\tattributeTemplate?: AttributeTemplate;\n\tcontainerRef?: React.RefObject;\n\tonAdd(permission: PartialAttributePermission): void;\n\tonClose?: () => void;\n}\n\nconst styles = ({spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {},\n\t\tpermissionListWrapper: {\n\t\t\twidth: '100%',\n\t\t},\n\t\tcontainer: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tflexDirection: 'column',\n\t\t\toverflow: 'hidden',\n\t\t},\n\t\tinput: {\n\t\t\tflex: '0 0 auto',\n\t\t\tpadding: spacing(0, 2, 2, 2),\n\t\t},\n\t});\n\nconst PermissionsForm = ({\n\tclasses,\n\tcontainerRef,\n\tonClose,\n\tonAdd,\n\t...props\n}: PermissionsFormProps & WithStyles) => {\n\tconst groupRef = useRef(null);\n\tconst virtualListRef = useRef(null);\n\n\tconst [stageHeight, setStageHeight] = useState(window.innerHeight);\n\tconst [listHeight, setListHeight] = useState(40);\n\t// TODO: get this value (56) from a constant\n\tconst [maxHeight, setMaxHeight] = useState(props.total * 56);\n\tconst [addedAtIndex, setAddedAtIndex] = useState(-1);\n\n\tuseEffect(() => {\n\t\t// TODO: get this value (56) from a constant\n\t\tsetMaxHeight(props.total * 56);\n\t}, [props.total]);\n\n\tuseEffect(() => {\n\t\tconst onResize = () => setStageHeight(window.innerHeight);\n\t\twindow.addEventListener('resize', onResize);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('resize', onResize);\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!groupRef.current) return;\n\n\t\t// TODO: find a way to make this clean\n\t\tconst availableHeight =\n\t\t\t(containerRef?.current?.clientHeight || stageHeight) -\n\t\t\t68 - // footer\n\t\t\tgroupRef.current.clientHeight -\n\t\t\t64 - // margin\n\t\t\t84; // header\n\n\t\tconst minMeight = Math.min(availableHeight, 300);\n\n\t\tsetListHeight(\n\t\t\tMath.min(\n\t\t\t\tavailableHeight,\n\t\t\t\t// Prevent a jump in size between no items and 1 item\n\t\t\t\tmaxHeight < 300 ? minMeight : maxHeight,\n\t\t\t),\n\t\t);\n\t}, [stageHeight, maxHeight]);\n\n\tconst handleAdd = useCallback<\n\t\tRequired>['onChange']\n\t>(\n\t\t(group) => {\n\t\t\tif (!group) return;\n\t\t\tonAdd({groupId: group.value, groupName: group.label, read: true});\n\t\t\tsetAddedAtIndex(props.total);\n\t\t},\n\t\t[onAdd, props.total],\n\t);\n\n\tconst handleFilterGroups = useCallback(\n\t\t(groups: GroupAutoListItem[]) =>\n\t\t\tgroups.filter(\n\t\t\t\t(group) => !props.data.find((d) => d.groupId === group.value),\n\t\t\t),\n\t\t[props.data],\n\t);\n\n\treturn (\n\t\t

\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\tfilterGroups={handleFilterGroups}\n\t\t\t\t\tclearOnClose\n\t\t\t\t\tlabel={i18n.t('i18n.addGroup')}\n\t\t\t\t\tmultiple={false}\n\t\t\t\t\tonChange={handleAdd}\n\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(PermissionsForm);\n","import React, {useRef, useState, useEffect} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\nimport {PERMISSION_TITLES} from '../../locales';\n\nimport Dialog, {FormDialogProps} from '@netx/core-components/FormDialog';\n\nimport PermissionFormBody, {PermissionsFormProps} from '../FormBody';\n\nimport {faUsersMedical} from '@fortawesome/pro-solid-svg-icons';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\toverflow: 'hidden',\n\t\t},\n\t\tdialogContent: {\n\t\t\toverflow: 'hidden',\n\t\t\tpadding: 0,\n\t\t},\n\t});\n\nexport type PermissionsDialogProps = Omit &\n\tPick<\n\t\tFormDialogProps,\n\t\t'hasChanged' | 'onSubmit' | 'keepMounted' | 'TransitionProps'\n\t> & {\n\t\topen?: boolean;\n\t};\n\nconst PermissionsDialog = ({\n\tclasses,\n\thasChanged,\n\topen,\n\tonClose,\n\tonSubmit,\n\tTransitionProps,\n\t...props\n}: PermissionsDialogProps & WithStyles) => {\n\tconst backdropRef = useRef(null);\n\tconst [isOpen, setIsOpen] = useState(open);\n\n\tuseEffect(() => {\n\t\tsetIsOpen(open);\n\t}, [open]);\n\n\treturn (\n\t\t\n\t\t\tconfirmLabel={i18n.t('i18n.save')}\n\t\t\tfullWidth\n\t\t\thasChanged={hasChanged}\n\t\t\ticon={faUsersMedical}\n\t\t\tisValid={true}\n\t\t\tmaxWidth=\"sm\"\n\t\t\tonClose={(event, reason) => {\n\t\t\t\tif (reason !== 'backdropClick') {\n\t\t\t\t\tonClose?.();\n\t\t\t\t}\n\t\t\t}}\n\t\t\tonSubmit={onSubmit}\n\t\t\topen={isOpen}\n\t\t\trequiresChanges\n\t\t\tsecondaryTitle={props.attributeTemplate?.name || '...'}\n\t\t\ttitle={PERMISSION_TITLES.EDIT}\n\t\t\tBackdropProps={{\n\t\t\t\tref: backdropRef,\n\t\t\t}}\n\t\t\tDialogContentProps={{\n\t\t\t\tclasses: {\n\t\t\t\t\troot: classes.dialogContent,\n\t\t\t\t},\n\t\t\t}}\n\t\t\tTransitionProps={TransitionProps}\n\t\t>\n\t\t\t {\n\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t}}\n\t\t\t/>\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(PermissionsDialog);\n","export const ACTIONS = {\n\tRESET: 'RESET',\n\tUPDATE: 'UPDATE',\n\n\tSET_LOADING: 'SET_LOADING',\n\tSET_SAVING: 'SET_SAVING',\n\tSET_TEMPLATE_ID: 'SET_TEMPLATE_ID',\n\n\tADD_PERMISSION: 'ADD_PERMISION',\n\tDELETE_PERMISSION: 'DELETE_PERMISSION',\n\tUPDATE_PERMISSION: 'UPDATE_PERMISSION',\n};\n","import type {AttributePermissionIndexed} from '../types';\nimport {ACTIONS} from './constants';\nimport type {Action} from './actions';\nimport equal from 'fast-deep-equal';\n\nexport type State = {\n\tdata: AttributePermissionIndexed[];\n\toriginalData: AttributePermissionIndexed[];\n\tloading: boolean;\n\tready: boolean;\n\tsaving: boolean;\n\ttemplateId?: number;\n\tunsavedChanges: boolean;\n};\n\nexport const initialState: State = {\n\tdata: [],\n\toriginalData: [],\n\tloading: false,\n\tready: false,\n\tsaving: false,\n\tunsavedChanges: false,\n};\n\nconst reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.RESET:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdata: state.originalData,\n\t\t\t\tunsavedChanges: false,\n\t\t\t};\n\n\t\tcase ACTIONS.UPDATE:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdata: action.data,\n\t\t\t\toriginalData: action.data,\n\t\t\t\tunsavedChanges: false,\n\t\t\t\tready: true,\n\t\t\t};\n\n\t\tcase ACTIONS.SET_LOADING:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tloading: action.loading,\n\t\t\t};\n\n\t\tcase ACTIONS.SET_SAVING:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tsaving: action.saving,\n\t\t\t};\n\n\t\tcase ACTIONS.SET_TEMPLATE_ID:\n\t\t\tif (state.templateId === action.templateId) return state;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdata: [],\n\t\t\t\toriginalData: [],\n\t\t\t\ttemplateId: action.templateId,\n\t\t\t\tready: false,\n\t\t\t};\n\n\t\tcase ACTIONS.ADD_PERMISSION: {\n\t\t\tif (!state.templateId) return state;\n\n\t\t\tconst data = state.data.filter(\n\t\t\t\t(d) => d.groupId !== action.permission.groupId,\n\t\t\t);\n\t\t\tdata.push({\n\t\t\t\ttemplateId: state.templateId,\n\t\t\t\tid: state.templateId,\n\t\t\t\tread: false,\n\t\t\t\twrite: false,\n\t\t\t\tindex: data.length,\n\t\t\t\t...action.permission,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdata,\n\t\t\t\tunsavedChanges: !equal(\n\t\t\t\t\tdata.filter((d) => d.read || d.write),\n\t\t\t\t\tstate.originalData,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tcase ACTIONS.DELETE_PERMISSION: {\n\t\t\tconst data = state.data.filter((d) => d.groupId !== action.groupId);\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdata,\n\t\t\t\tunsavedChanges: !equal(\n\t\t\t\t\tdata.filter((d) => d.read || d.write),\n\t\t\t\t\tstate.originalData,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tcase ACTIONS.UPDATE_PERMISSION: {\n\t\t\tconst data = JSON.parse(\n\t\t\t\tJSON.stringify(state.data),\n\t\t\t) as AttributePermissionIndexed[];\n\t\t\tconst existingRecord = data.find(\n\t\t\t\t(data) => data.groupId === action.permission.groupId,\n\t\t\t);\n\n\t\t\tif (action.permission.write) action.permission.read = true;\n\n\t\t\t!existingRecord\n\t\t\t\t? data.unshift({...action.permission, index: 0})\n\t\t\t\t: Object.assign(existingRecord, action.permission);\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdata: data.map((d, index) => ({...d, index})),\n\t\t\t\tunsavedChanges: !equal(\n\t\t\t\t\tdata.filter((d) => d.read || d.write),\n\t\t\t\t\tstate.originalData,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t}\n};\n\nexport default reducer;\n","import React from 'react';\n\nimport {ACTIONS} from './constants';\nimport type {State} from './reducer';\n\nimport {AttributePermission, PartialAttributePermission} from '../types';\n\nexport type Action =\n\t| {type: typeof ACTIONS.RESET}\n\t| {type: typeof ACTIONS.UPDATE; data: State['data']}\n\t| {type: typeof ACTIONS.SET_LOADING; loading: State['loading']}\n\t| {\n\t\t\ttype: typeof ACTIONS.DELETE_PERMISSION;\n\t\t\tgroupId: AttributePermission['groupId'];\n\t }\n\t| {\n\t\t\ttype: typeof ACTIONS.ADD_PERMISSION;\n\t\t\tpermission: PartialAttributePermission;\n\t }\n\t| {type: typeof ACTIONS.SET_SAVING; saving: State['saving']}\n\t| {type: typeof ACTIONS.SET_TEMPLATE_ID; templateId: State['templateId']}\n\t| {type: typeof ACTIONS.UPDATE_PERMISSION; permission: AttributePermission};\n\nexport const Actions = (dispatch: React.Dispatch) => ({\n\taddPermission: (permission: PartialAttributePermission) =>\n\t\tdispatch({type: ACTIONS.ADD_PERMISSION, permission}),\n\n\tdeletePermission: (groupId: AttributePermission['groupId']) =>\n\t\tdispatch({type: ACTIONS.DELETE_PERMISSION, groupId}),\n\n\tresetPermissions: () => dispatch({type: ACTIONS.RESET}),\n\n\tupdatePermission: (permission: AttributePermission) =>\n\t\tdispatch({type: ACTIONS.UPDATE_PERMISSION, permission}),\n});\n\nexport default Actions;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {AttributePermission} from '../types';\n\n/**\n * `getAttributePermissions` request params\n * (what is used to send to server)\n */\nexport type GetAttributePermissionsRequestOptions = Pick<\n\tAttributePermission,\n\t'templateId'\n>;\n\n/**\n * `getAttributePermissions` request\n * (what gets sent to the server)\n */\nexport type GetAttributePermissionsRequest = [\n\tGetAttributePermissionsRequestOptions['templateId'],\n];\n\n/**\n * `getAttributePermissions` response\n * (what comes back from the server)\n */\nexport type GetAttributePermissionsResponse = SuccessResponse<\n\tGetAttributePermissionsResult\n>;\n\n/**\n * `getAttributePermissions` result\n * (what is utilized from the server response)\n */\nexport type GetAttributePermissionsResult = AttributePermission[];\n\nexport const getAttributePermissionsEndpoint = 'getAttributePermissions';\n\n/**\n * Get attribute permissions\n */\nexport const getAttributePermissions = async ({\n\ttemplateId,\n}: GetAttributePermissionsRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetAttributePermissionsRequest = [templateId];\n\n\treturn client\n\t\t.post(\n\t\t\tgetAttributePermissionsEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default getAttributePermissions;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {AttributePermission, GroupAttributePermission} from '../types';\n\n/**\n * `setAttributePermissions` request params\n * (what is used to send to server)\n */\nexport type SetAttributePermissionsRequestOptions = {\n\ttemplateId: AttributePermission['templateId'];\n\tgroupAttributePermissions: GroupAttributePermission[];\n};\n\n/**\n * `setAttributePermissions` request\n * (what gets sent to the server)\n */\nexport type SetAttributePermissionsRequest = [\n\tSetAttributePermissionsRequestOptions['templateId'],\n\tSetAttributePermissionsRequestOptions['groupAttributePermissions'],\n];\n\n/**\n * `setAttributePermissions` response\n * (what comes back from the server)\n */\nexport type SetAttributePermissionsResponse = SuccessResponse<\n\tSetAttributePermissionsResult\n>;\n\n/**\n * `setAttributePermissions` result\n * (what is utilized from the server response)\n */\nexport type SetAttributePermissionsResult = AttributePermission[];\n\nexport const setAttributePermissionsEndpoint = 'setAttributePermissions';\n\n/**\n * Set attribute permissions\n */\nexport const setAttributePermissions = async ({\n\tgroupAttributePermissions,\n\ttemplateId,\n}: SetAttributePermissionsRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: SetAttributePermissionsRequest = [\n\t\ttemplateId,\n\t\tgroupAttributePermissions,\n\t];\n\n\treturn client\n\t\t.post(\n\t\t\tsetAttributePermissionsEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default setAttributePermissions;\n","import React, {\n\tcreateContext,\n\tuseContext,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseReducer,\n\tuseEffect,\n\tuseCallback,\n\tuseRef,\n} from 'react';\n\nimport {\n\tuseMutation,\n\tuseQuery,\n\tQueryClient,\n\tQueryClientProvider,\n} from 'react-query';\n\nimport reducer, {initialState, State} from './reducer';\nimport actions from './actions';\nimport {\n\tgetAttributePermissions,\n\tGetAttributePermissionsRequestOptions,\n\tGetAttributePermissionsResult,\n\tsetAttributePermissions,\n\tSetAttributePermissionsResult,\n\tSetAttributePermissionsRequestOptions,\n\tQueryError,\n} from '../api';\n\nimport type {AttributePermission} from '../types';\n\nimport {ACTIONS} from './constants';\n\nimport {useAttributeProvider} from '@netx/core-attribute';\n\nexport type AttributePermissionContextType = {\n\tactions: ReturnType & {\n\t\tedit(): void;\n\t\tendEdit(): void;\n\t\tsave(): Promise;\n\t};\n\tstate: State;\n\n\tgetAttributeTemplate(): ReturnType<\n\t\tReturnType['getById']\n\t>;\n};\n\nconst queryClient = new QueryClient();\n\ntype QueryParams = {\n\tqueryKey: [string, GetAttributePermissionsRequestOptions];\n};\n\nconst reactQueryGetAttributePermissions = async (params: QueryParams) => {\n\tconst [, queryParams] = params.queryKey;\n\treturn getAttributePermissions(queryParams);\n};\n\nconst StoreContext = createContext(\n\tundefined,\n);\n\nexport const useAttributePermissionProvider = () => {\n\tconst context = useContext(StoreContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t'`useAttributePermissionProvider` must be used within a `AttributePermissionProvider`',\n\t\t);\n\t}\n\treturn context;\n};\n\nexport interface AttributePermissionProviderProps {\n\ttemplateId?: AttributePermission['templateId'];\n}\n\nconst AttributePermissionProvider = ({\n\tchildren,\n\ttemplateId,\n}: React.PropsWithChildren) => {\n\tconst [state, dispatch] = useReducer(reducer, {...initialState, templateId});\n\tconst attributesProvider = useAttributeProvider();\n\n\t// Hold onto a ref of the data\n\t// some of the methods here do not need to respond to data changes\n\t// but would like to access the current state of it when time\n\tconst dataRef = useRef(state.data);\n\tdataRef.current = state.data;\n\n\t// When the `templateId` changes\n\t// `templateId` drives all the data fetching\n\tuseEffect(() => {\n\t\tdispatch({type: ACTIONS.SET_TEMPLATE_ID, templateId});\n\t}, [templateId]);\n\n\t// MUTATION\n\tconst attributePermissionsMutation = useMutation<\n\t\tSetAttributePermissionsResult,\n\t\tQueryError,\n\t\tSetAttributePermissionsRequestOptions\n\t>(setAttributePermissions, {\n\t\tonError: (error) => {\n\t\t\tconsole.error(error);\n\t\t},\n\t\tonSuccess: (attributePermissions) => {\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.UPDATE,\n\t\t\t\tdata: attributePermissions.map((d, index) => ({...d, index})),\n\t\t\t});\n\t\t},\n\t});\n\n\t// QUERY\n\tconst attributePermissionsQuery = useQuery<\n\t\tGetAttributePermissionsResult,\n\t\tQueryError,\n\t\tGetAttributePermissionsResult,\n\t\tQueryParams['queryKey']\n\t>(\n\t\t[\n\t\t\t'getAttributePermissions',\n\t\t\t{templateId: state.templateId},\n\t\t] as QueryParams['queryKey'],\n\t\treactQueryGetAttributePermissions,\n\t\t{\n\t\t\tenabled: state.templateId != null,\n\t\t\trefetchOnReconnect: false,\n\t\t\trefetchOnWindowFocus: false,\n\t\t\tretry: false,\n\t\t\tonError: (error) => {\n\t\t\t\tconsole.error(error);\n\t\t\t},\n\t\t\tonSuccess: (attributeData) => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.UPDATE,\n\t\t\t\t\tdata: attributeData.map((d, index) => ({\n\t\t\t\t\t\t...d,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tid: d.templateId,\n\t\t\t\t\t})),\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t);\n\n\t// The attribute context will handle showing the editor\n\tconst edit = useCallback(() => {\n\t\tif (state.templateId == null) return;\n\t\tattributesProvider.setPermissionEdit(state.templateId);\n\t}, [state.templateId, attributesProvider.setPermissionEdit]);\n\n\t// The attribute context will handle showing the editor\n\tconst endEdit = useCallback(() => {\n\t\tattributesProvider.setPermissionEdit(false);\n\t}, [attributesProvider.setPermissionEdit]);\n\n\t// Pass the request along to the attibute context\n\tconst getAttributeTemplate = useCallback(\n\t\t() =>\n\t\t\tstate.templateId != null\n\t\t\t\t? attributesProvider.getById(state.templateId)\n\t\t\t\t: undefined,\n\t\t[state.templateId, attributesProvider.getById],\n\t);\n\n\t// Save the current state of our data\n\tconst save = useCallback(async () => {\n\t\tif (state.templateId == null) return;\n\t\tawait attributePermissionsMutation.mutateAsync({\n\t\t\ttemplateId: state.templateId,\n\t\t\t// `templateId` is not needed in `groupAttributePermissions`\n\t\t\tgroupAttributePermissions: dataRef.current.map(\n\t\t\t\t({templateId, ...rest}) => rest,\n\t\t\t),\n\t\t});\n\t\tendEdit();\n\t}, [endEdit, state.templateId]);\n\n\t// The reducer actions to expose to outside components\n\tconst dispatchActions = useMemo(\n\t\t() => ({\n\t\t\t...actions(dispatch),\n\t\t\tedit,\n\t\t\tendEdit,\n\t\t\tsave,\n\t\t}),\n\t\t[state.templateId, edit, endEdit, save],\n\t);\n\n\t// Reflect saving\n\tuseLayoutEffect(() => {\n\t\tdispatch({\n\t\t\ttype: ACTIONS.SET_SAVING,\n\t\t\tsaving: attributePermissionsMutation.status === 'loading',\n\t\t});\n\t}, [attributePermissionsMutation.status]);\n\n\t// Reflect loading\n\tuseLayoutEffect(() => {\n\t\tdispatch({\n\t\t\ttype: ACTIONS.SET_LOADING,\n\t\t\tloading:\n\t\t\t\tattributePermissionsQuery.isLoading ||\n\t\t\t\tattributePermissionsQuery.isFetching,\n\t\t});\n\t}, [\n\t\tattributePermissionsQuery.isLoading,\n\t\tattributePermissionsQuery.isFetching,\n\t]);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport default React.memo(\n\t(props: React.PropsWithChildren) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t},\n);\n","import React, {useCallback, useEffect, useState} from 'react';\n\nimport PermissionsDialog, {\n\tPermissionsDialogProps,\n} from '../../components/Dialog';\nimport AttributePermissionsProvider, {\n\tuseAttributePermissionProvider,\n} from '../../context';\n\nimport {AttributeProvider, useAttributeProvider} from '@netx/core-attribute';\n\nimport {AttributePermission, PermissionMode} from '../../types';\n\nexport type PermissionsContainerProps = Omit<\n\tPermissionsDialogProps,\n\t| 'ListItemComponentProps'\n\t| 'attributeTemplate'\n\t| 'data'\n\t| 'isItemLoaded'\n\t| 'loadMoreItems'\n\t| 'templateId'\n\t| 'total'\n\t| 'onSubmit'\n\t| 'onAdd'\n> & {\n\tListItemComponentProps?: PermissionsDialogProps['ListItemComponentProps'];\n\ttemplateId?: number;\n};\n\n/** we are not paging items (at this time) */\nconst isItemLoaded = () => true;\n\nconst PermissionsContainer = ({\n\tonClose,\n\t...props\n}: PermissionsContainerProps) => {\n\tconst {actions, state, getAttributeTemplate} =\n\t\tuseAttributePermissionProvider();\n\n\tconst [dialogReady, setDialogReady] = useState(false);\n\n\tconst handlePermissionItemChange = useCallback(\n\t\t(permission: AttributePermission, newPerm: PermissionMode) => {\n\t\t\tactions.updatePermission({\n\t\t\t\t...permission,\n\t\t\t\tread: false,\n\t\t\t\twrite: false,\n\t\t\t\t[newPerm]: true,\n\t\t\t});\n\t\t},\n\t\t[actions.updatePermission],\n\t);\n\n\tconst handlePermissionItemRemove = useCallback(\n\t\t(permission: AttributePermission) => {\n\t\t\tactions.deletePermission(permission.groupId);\n\t\t},\n\t\t[actions.deletePermission],\n\t);\n\n\tconst handleClose = useCallback(() => {\n\t\tactions.resetPermissions();\n\t\tonClose?.();\n\t}, [onClose]);\n\n\t// We are not utilizing `useForm`\n\tconst handleSubmit = useCallback(\n\t\tasync (event: React.FormEvent) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn actions.save();\n\t\t},\n\t\t[actions.save],\n\t);\n\n\treturn (\n\t\t undefined}\n\t\t\tonClose={handleClose}\n\t\t\tonSubmit={handleSubmit}\n\t\t\t/** show _n_ loading items if data has not been loaded yet */\n\t\t\ttotal={state.ready ? state.data.length : 25}\n\t\t\thasChanged={state.unsavedChanges}\n\t\t\topen={false}\n\t\t\t{...props}\n\t\t\tTransitionProps={{\n\t\t\t\t...props.TransitionProps,\n\t\t\t\t// TODO: this is a hack of sorts for now - will want to transition over to tanstack virtualizer lib\n\t\t\t\t// and if this stil lproves to be neccessary we should abstract this logic for all dialogs wit hvirtualized content\n\t\t\t\tonEntered: (node, isAppearing) => {\n\t\t\t\t\tsetDialogReady(true);\n\t\t\t\t\tprops.TransitionProps?.onEntered?.(node, isAppearing);\n\t\t\t\t},\n\t\t\t}}\n\t\t\tListItemComponentProps={{\n\t\t\t\t...props.ListItemComponentProps,\n\t\t\t\tonChange: handlePermissionItemChange,\n\t\t\t\tonRemove: handlePermissionItemRemove,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nconst Wrapped = (props: PermissionsContainerProps) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nconst BackbonePermissions = ({\n\ttemplateId,\n\t...props\n}: PermissionsContainerProps) => {\n\tconst attributesProvider = useAttributeProvider();\n\tuseEffect(() => {\n\t\tif (templateId == null) return;\n\t\tattributesProvider.setPermissionEdit(templateId);\n\t}, [templateId]);\n\treturn ;\n};\n\nexport const BackbonePermissionsContainer = (\n\tprops: PermissionsContainerProps,\n) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default function (props: PermissionsContainerProps) {\n\treturn ;\n}\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseState,\n} from 'react';\n\nimport {QueryClient, QueryClientProvider} from 'react-query';\nimport type {ArgumentsType} from '@netx/core/typings';\nimport Permissions from '@netx/core-attribute-permission/containers/Permissions';\nimport {useAttributes} from '../hooks/useAttributes/useAttributes';\n\nexport type AttributeProviderRef = React.RefObject;\n\nexport type AttributeContextType = ReturnType & {\n\tsetPermissionEdit: (id: number | false) => void;\n};\n\nexport type AttributeChildrenProps = AttributeContextType;\n\nconst AttributeContext = createContext({\n\tstate: {\n\t\tdata: [],\n\t\tloading: false,\n\t\thasMandatoryUserDefinedTemplates: false,\n\t\tlookups: {\n\t\t\tkeys: [],\n\t\t\ttargets: [],\n\t\t},\n\t},\n\tgetAll: () => [],\n\tgetById: () => undefined,\n\tgetByIds: () => [],\n\tgetByName: () => undefined,\n\tgetByNames: () => [],\n\tgetByType: () => [],\n\tgetDefaultValues: () => ({}),\n\tgetLabelById: () => '',\n\tlookup: async () => ({}),\n\tsearchValue: () => {},\n\tsetPermissionEdit: () => {},\n});\n\nconst queryClient = new QueryClient();\n\nexport const useAttributeProvider = () => {\n\tconst context = useContext(AttributeContext);\n\treturn context;\n};\n\nexport type AttributeProviderProps = ArgumentsType[0] & {\n\tref?: AttributeProviderRef;\n\tchildren:\n\t\t| React.ReactNode\n\t\t| ((props: AttributeChildrenProps) => React.ReactNode);\n};\n\nconst AttributeProviderInner = (\n\t{children, ...props}: AttributeProviderProps,\n\tref: AttributeProviderRef,\n) => {\n\tconst attributes = useAttributes(props);\n\n\tconst [editPermission, setEditPermission] = useState();\n\n\tconst setPermissionEdit = useCallback((id: number | false) => {\n\t\tsetEditPermission(id ? id : undefined);\n\t}, []);\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\t...attributes,\n\t\t\tsetPermissionEdit,\n\t\t}),\n\t\t[attributes, setPermissionEdit],\n\t);\n\n\tuseImperativeHandle(ref, () => contextValue, [contextValue]);\n\n\treturn (\n\t\t\n\t\t\t{typeof children === 'function' ? children(contextValue) : children}\n\n\t\t\t {\n\t\t\t\t\tsetPermissionEdit(false);\n\t\t\t\t}}\n\t\t\t/>\n\t\t\n\t);\n};\n\nexport const AttributeProviderPrimitive = React.forwardRef<\n\tAttributeContextType,\n\tAttributeProviderProps\n>(AttributeProviderInner) as (\n\tprops: AttributeProviderProps,\n\tref?: AttributeProviderRef,\n) => JSX.Element;\n\nexport const AttributeProvider = React.memo((props: AttributeProviderProps) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n});\n\nexport default AttributeProvider;\n","import React from 'react';\n\nimport Dropdown, {AttributeDropdownProps} from '../../components/Dropdown';\nimport {useAttributeProvider} from '../../context';\nimport type {AttributeObjectType} from '../../types';\n\nexport type AttributeDropdownContainerProps<\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false\n> = Omit, 'attributes'> & {\n\tomitReadOnly?: boolean;\n\tomitSystem?: boolean;\n\tobjectType?: AttributeObjectType;\n};\n\nexport const AttributeDropdownContainer = <\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false\n>({\n\tomitReadOnly,\n\tomitSystem,\n\tobjectType,\n\t...props\n}: AttributeDropdownContainerProps) => {\n\tconst attributeProvider = useAttributeProvider();\n\treturn (\n\t\t\n\t);\n};\n\nexport default AttributeDropdownContainer;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface TextFieldClasses {\n\t/** styles applied to the root element */\n\troot: string;\n}\n\nexport function getTextFieldUtilityClass(slot: string) {\n\treturn generateUtilityClass('TextField', slot);\n}\n\nconst textFieldClasses = generateUtilityClasses(\n\t'TextField',\n\t['root'],\n);\nexport default textFieldClasses;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface StyledTextFieldClasses {\n\t/** styles applied to the root element */\n\troot: string;\n\tloading: string;\n\ttextarea: string;\n\tinherit: string;\n}\n\nexport function getStyledTextFieldUtilityClass(slot: string) {\n\treturn generateUtilityClass('StyledTextField', slot);\n}\n\nconst styledTextFieldClasses = generateUtilityClasses<\n\tkeyof StyledTextFieldClasses\n>('StyledTextField', ['root', 'inherit', 'loading', 'textarea']);\nexport default styledTextFieldClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {\n\tCircularProgress,\n\tTextField as MuiTextField,\n\tTextFieldProps as MuiTextFieldProps,\n} from '@mui/material';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\n\nimport textFieldClasses, {\n\tgetStyledTextFieldUtilityClass,\n} from './styledTextFieldClasses';\nimport {outlinedInputClasses} from '@mui/material/OutlinedInput';\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {classes, inherit, multiline} = ownerState;\n\tconst slots = {\n\t\troot: ['root', multiline && 'textarea', inherit && 'inherit'],\n\t\tloading: ['loading'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetStyledTextFieldUtilityClass,\n\t\tclasses as typeof textFieldClasses,\n\t);\n};\n\nconst StyledTextFieldRoot = styled(MuiTextField, {\n\tname: 'StyledTextField',\n\tslot: 'Root',\n\toverridesResolver: (props, styles) => styles.root,\n})(({theme}) => ({\n\t[`&.${textFieldClasses.textarea} textarea`]: {\n\t\tminHeight: 42,\n\t},\n\t[`&.${textFieldClasses.inherit}`]: {\n\t\tcolor: 'inherit',\n\t\t[`& .${outlinedInputClasses.root}`]: {\n\t\t\tbackground: `rgba(0, 0, 0, 0.16)`,\n\t\t\tpaddingRight: 8,\n\t\t\tcolor: 'inherit',\n\t\t\t[`&.${outlinedInputClasses.focused}`]: {\n\t\t\t\t[`& .${outlinedInputClasses.notchedOutline}`]: {\n\t\t\t\t\tborderColor: `rgba(0, 0, 0, 0.32)`,\n\t\t\t\t},\n\t\t\t},\n\t\t\t[`&:not(.${outlinedInputClasses.focused})`]: {\n\t\t\t\t[`& .${outlinedInputClasses.notchedOutline}`]: {\n\t\t\t\t\tborderColor: 'transparent',\n\t\t\t\t},\n\t\t\t},\n\t\t\t[`& .${outlinedInputClasses.input}`]: {\n\t\t\t\tpaddingLeft: 8,\n\t\t\t\ttextAlign: 'center',\n\t\t\t\tcolor: 'inherit',\n\t\t\t},\n\t\t},\n\t},\n}));\n\nconst LoadingRoot = styled(CircularProgress, {\n\tname: 'StyledTextField',\n\tslot: 'Loading',\n\toverridesResolver: (props, styles) => styles.loading,\n})(({theme}) => ({\n\tposition: 'absolute',\n\tright: 10,\n\ttop: 10,\n\t'& circle': {\n\t\tstrokeWidth: 2,\n\t},\n}));\n\nexport type StyledTextFieldProps = WithMuiPropOverrides & {\n\t// TODO: this currently only supports outlined inputs\n\tinherit?: boolean;\n\tloadingValue?: boolean;\n\treadOnly?: boolean;\n};\n\nexport const StyledTextFieldPrimitive = (props: StyledTextFieldProps) => {\n\tconst {\n\t\tclassName,\n\t\tloadingValue,\n\t\tdisabled,\n\t\tinherit,\n\t\treadOnly,\n\t\t...sendProps\n\t} = props;\n\n\tconst classes = useUtilityClasses({\n\t\t...sendProps,\n\t\tinherit,\n\t});\n\n\treturn (\n\t\t\n\t\t\t\t\t\t{loadingValue ? (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{sendProps.InputProps?.endAdornment}\n\t\t\t\t\t\n\t\t\t\t),\n\t\t\t}}\n\t\t\tinputProps={{\n\t\t\t\tautoComplete: 'off',\n\t\t\t\treadOnly,\n\t\t\t\t...sendProps.inputProps,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const StyledTextField = React.memo(StyledTextFieldPrimitive);\nexport default StyledTextField;\n","import React, {useCallback, useRef} from 'react';\n\nimport {composeClasses, styled} from '@netx/core-components/Theme';\n\nimport textFieldClasses, {getTextFieldUtilityClass} from './textFieldClasses';\nimport {StyledTextField} from './StyledTextField';\nimport {CommonFieldPropsWithTextField, ErrorField, useFormInput} from '..';\nimport {useErrorFocus} from '../hooks/useErrorFocus';\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetTextFieldUtilityClass,\n\t\tclasses as typeof textFieldClasses,\n\t);\n};\n\nconst TextFieldRoot = styled('div', {\n\tname: 'TextField',\n\tslot: 'Root',\n\toverridesResolver: (props, styles) => styles.root,\n})(({theme}) => ({\n\tdisplay: 'inline-flex',\n\tflexDirection: 'column',\n\twidth: '100%',\n}));\n\nexport interface TextFieldProps extends CommonFieldPropsWithTextField {\n\tonChange?: (value: string) => void;\n\tinherit?: boolean;\n}\n\nconst TextFieldPrimitive = ({\n\tchanged,\n\tdisabled,\n\terror,\n\tform,\n\tformFieldOptions,\n\thideErrorMessage,\n\tloadingValue,\n\tname,\n\tonChange,\n\treadOnly,\n\trequired,\n\tvalue,\n\n\t...props\n}: TextFieldProps) => {\n\tvalue = value == null ? '' : value;\n\n\tconst classes = useUtilityClasses(props);\n\n\tconst inputRef = useRef(null);\n\n\tuseFormInput(name, value, form, {required, ...formFieldOptions});\n\n\tuseErrorFocus({\n\t\terror,\n\t\tinputRef,\n\t});\n\n\tconst handleChange = useCallback(\n\t\t(event: React.ChangeEvent) => {\n\t\t\t// Sometimes a change event will come through that was not related to\n\t\t\t// interacting directly with the input\n\t\t\t// I cannot seem to recreate this in the tests yet, but this is an\n\t\t\t// important chack\n\t\t\tif (!event) return;\n\n\t\t\tconst {value} = event.target;\n\t\t\tform && form.setValue(name, value);\n\t\t\tonChange && onChange(value);\n\t\t},\n\t\t[form?.setValue, name, onChange],\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t{!hideErrorMessage ? (\n\t\t\t\t\n\t\t\t) : null}\n\t\t\n\t);\n};\n\nexport const TextField = React.memo(TextFieldPrimitive);\nexport default TextField;\n","import React from 'react';\n\nimport TextField, {TextFieldProps} from './TextField';\nimport ReadOnlyTextField, {ReadOnlyTextFieldProps} from './ReadOnlyTextField';\n\nexport {default as ReadOnlyTextField} from './ReadOnlyTextField';\nexport * from './ReadOnlyTextField';\n\nexport {default as TextField} from './TextField';\nexport * from './TextField';\n\ntype ExternalProps = TextFieldProps | ReadOnlyTextFieldProps;\n\ntype InternalProps = {\n\treadOnly?: boolean;\n};\n\nexport default function ({readOnly, ...props}: InternalProps & ExternalProps) {\n\treturn !readOnly ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface TabPanelClasses {\n\t/** Styles applied to the root element. */\n\troot: string;\n\tactive: string;\n\tpad: string;\n}\n\nexport function getTabPanelClass(slot: string) {\n\treturn generateUtilityClass('TabPanel', slot);\n}\n\nexport const tabPanelClasses = generateUtilityClasses('TabPanel', [\n\t'root',\n\t'active',\n\t'pad',\n]);\nexport default tabPanelClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {styled, composeClasses} from '@netx/core-components/Theme';\nimport tabPanelClasses, {\n\tgetTabPanelClass,\n\tTabPanelClasses,\n} from './tabPanelClasses';\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {classes, active, disablePadding} = ownerState;\n\tconst slots = {\n\t\troot: ['root', active && 'active', !disablePadding && 'pad'],\n\t};\n\treturn composeClasses(slots, getTabPanelClass, classes);\n};\n\nconst TabPanelRoot = styled('div', {\n\tname: 'TabPanel',\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tminHeight: 0,\n\toverflow: 'hidden',\n\t[`&:not(.${tabPanelClasses.active})`]: {\n\t\tdisplay: 'none',\n\t},\n\t[`&.${tabPanelClasses.active}.${tabPanelClasses.pad}`]: {\n\t\tpadding: theme.spacing(2, 0, 0),\n\t},\n}));\n\nexport interface TabPanelProps\n\textends React.PropsWithChildren> {\n\tclasses?: TabPanelClasses;\n\tdisablePadding?: boolean;\n\tkeepMounted?: boolean;\n\tindex: number;\n\tvalue: number;\n}\n\n/**\n * A wrapper for tab content\\\n * To be used in conjunction with `useTabs`\n * @example\n const tabs = useTabs(options);\n return (\n <>\n \n \n \n \n ...\n ...\n \n );\n */\nconst TabPanelPrimitive = (props: TabPanelProps) => {\n\tconst {\n\t\tchildren,\n\t\tclassName,\n\t\tdisablePadding,\n\t\tindex,\n\t\tkeepMounted,\n\t\tvalue,\n\t\t...sendProps\n\t} = props;\n\n\tconst active = value === index;\n\n\tconst ownerState = {\n\t\t...props,\n\t\tactive,\n\t};\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t\n\t\t\t{keepMounted || active ? children : null}\n\t\t\n\t);\n};\n\nexport const TabPanel = React.memo(TabPanelPrimitive);\nexport default TabPanel;\n","import {SearchTypeAdvancedRaw} from './advancedRaw/constants';\nimport {SearchTypeAttributeHistory} from './attributeHistory/constants';\nimport {SearchTypeCart} from './cart/constants';\nimport {SearchTypeCategoryId} from './categoryId/constants';\nimport {SearchTypeCheckouts} from './checkouts/constants';\nimport {SearchTypeContents} from './contents/constants';\nimport {SearchTypeDate} from './date/constants';\nimport {SearchTypeExpiration} from './expiration/constants';\nimport {SearchTypeFileAspect} from './fileAspect/constants';\nimport {SearchTypeFileFormat} from './fileFormat/constants';\nimport {SearchTypeFileFormatFamily} from './fileFormatFamily/constants';\nimport {SearchTypeFileSize} from './fileSize/constants';\nimport {SearchTypeKeyword} from './keyword/constants';\nimport {SearchTypeMetadata} from './metadata/constants';\nimport {SearchTypeSavedSearch} from './savedSearch/constants';\nimport {SearchTypeUser} from './user/constants';\nimport {SearchTypeVisual} from './visual/constants';\n\nexport enum SearchType {\n\tACTIVE_TEMPLATES = 28 as const,\n\tADVANCED_RAW = SearchTypeAdvancedRaw,\n\tATTRIBUTE_HISTORY = SearchTypeAttributeHistory,\n\tBRANCH_CHILDREN = 15 as const,\n\tCART = SearchTypeCart,\n\tCATEGORY_ID = SearchTypeCategoryId,\n\t/** not used - see CATEGORY_ID */\n\tCATEGORY_NAME = 5 as const,\n\tCHECKOUTS = SearchTypeCheckouts,\n\tCONTENTS = SearchTypeContents,\n\tCUSTOM = 9 as const,\n\tDATE = SearchTypeDate,\n\tEXPIRE = SearchTypeExpiration,\n\tFILE_ASPECT = SearchTypeFileAspect,\n\tFILE_FORMAT = SearchTypeFileFormat,\n\tFILE_FORMAT_FAMILY = SearchTypeFileFormatFamily,\n\tFILE_SIZE = SearchTypeFileSize,\n\tFILE_STATUS = 25 as const,\n\tKEYWORD = SearchTypeKeyword,\n\tLAST_SEARCH = 12 as const,\n\tLOCATION = 20 as const,\n\tMETADATA = SearchTypeMetadata,\n\tMETADATA_HISTORY = 18 as const,\n\tPROOF = 21 as const,\n\tRATING = 19 as const,\n\tRELATED_ASSETS = 11 as const,\n\tREVIEWS = 16 as const,\n\tSAVED_SEARCH = SearchTypeSavedSearch,\n\t/** no longer a thing really but still there */\n\tTHESAURUS = 14 as const,\n\tUSER = SearchTypeUser,\n\tVISUAL = SearchTypeVisual,\n}\n\nexport const EditableRuleTypes = [\n\tSearchType.ADVANCED_RAW,\n\tSearchType.CATEGORY_ID,\n\tSearchType.CHECKOUTS,\n\tSearchType.CONTENTS,\n\tSearchType.DATE,\n\tSearchType.FILE_ASPECT,\n\tSearchType.FILE_FORMAT,\n\tSearchType.FILE_FORMAT_FAMILY,\n\tSearchType.FILE_SIZE,\n\tSearchType.KEYWORD,\n\tSearchType.METADATA,\n\tSearchType.USER,\n\tSearchType.VISUAL,\n];\n","import type {Asset} from '../types';\n\nexport const createAssetObject = (overrides?: Partial): Asset => ({\n\tassetId: 0,\n\tattribute1: '',\n\tattribute10: '',\n\tattribute11: '',\n\tattribute12: '',\n\tattribute13: '',\n\tattribute14: '',\n\tattribute15: '',\n\tattribute16: '',\n\tattribute17: '',\n\tattribute18: '',\n\tattribute19: '',\n\tattribute2: '',\n\tattribute20: '',\n\tattribute3: '',\n\tattribute4: '',\n\tattribute5: '',\n\tattribute6: '',\n\tattribute7: '',\n\tattribute8: '',\n\tattribute9: '',\n\tattributeIds: [],\n\tattributeNames: [],\n\tattributePermissions: [],\n\tattributeValues: [],\n\taudioBitRate: 0,\n\taudioChannelCount: 0,\n\taudioChannelLayout: '',\n\taudioSampleRate: 0,\n\tcategories: [],\n\tcategoryPaths: [],\n\tcategoryid: 0,\n\tcheckout: 0,\n\tcheckoutUserLabel: '',\n\tcommitAttributes: false,\n\tconstituentIds: [],\n\tconstituentType: '',\n\tcreationdate: '',\n\tduration: 0,\n\texpirationDate: 0,\n\tfile: '',\n\tfileSize2: 0,\n\tfileheight: 0,\n\tfilesize: 0,\n\tfiletype: 0,\n\tfiletypelabel: '',\n\tfilewidth: 0,\n\tfileFormatFamily: [],\n\tflvPreview: false,\n\tgeoLocationLabel: '',\n\thasChildren: false,\n\thidden: 0,\n\timageid: 0,\n\timportDate: '',\n\timportUserLabel: '',\n\tinCurrentCart: false,\n\tlatitude: 0,\n\tlocationContext: '',\n\tlocationid: 1,\n\tlongitude: 0,\n\tmetadata: '',\n\tmetadataAvailable: false,\n\tmoddate: '',\n\tmoduserid: 0,\n\tmoduserlabel: '',\n\tname: '',\n\tparentId: 0,\n\tpath: '',\n\tpermissionMatrix: [1, 1, 1, 1, 1, 1],\n\tpreviewHeight: 0,\n\tpreviewUrl: '',\n\tpreviewWidth: 0,\n\tproofAvailable: false,\n\trating: 0,\n\treadOnly: 0,\n\trelatedAvailable: false,\n\trepurposeAvailability: 1,\n\treviewAvailable: false,\n\tstatDeliveries: 0,\n\tstatPreviews: 0,\n\tstatus: 1,\n\tthumb: '',\n\tthumbUrl: '',\n\ttimeScale: 0,\n\tversionIds: [],\n\tviewIds: [],\n\tviewNames: [],\n\tvisible: 1,\n\tzoomAvailable: false,\n\tdpi: 0,\n\tmd5sum: '',\n\tbitDepth: 0,\n\tcolorProfile: '',\n\talphaChannel: '',\n\ttemplatable: false,\n\ttemplate: false,\n\ttemplateCustomizable: false,\n\tiiifManifestUrl: null,\n\t...overrides,\n});\n\nexport default createAssetObject;\n","import {DocumentFormatFamilies} from '../constants';\n\nexport const isDocumentFileTypeAsset = (fileFormatFamily: string[]) =>\n\tfileFormatFamily.some((format) =>\n\t\tDocumentFormatFamilies.includes(\n\t\t\tformat as typeof DocumentFormatFamilies[number],\n\t\t),\n\t);\n\nexport default isDocumentFileTypeAsset;\n","import {ImageFormatFamilies} from '../constants';\n\nexport const isImageFileTypeAsset = (fileFormatFamily: string[]) =>\n\tfileFormatFamily.some((format) =>\n\t\tImageFormatFamilies.includes(format as typeof ImageFormatFamilies[number]),\n\t);\n\nexport default isImageFileTypeAsset;\n","import {VideoFormatFamilies} from '../constants';\n\nexport const isVideoFileTypeAsset = (fileFormatFamily: string[]) =>\n\tfileFormatFamily.some((format) =>\n\t\tVideoFormatFamilies.includes(format as typeof VideoFormatFamilies[number]),\n\t);\n\nexport default isVideoFileTypeAsset;\n","import {isDocumentFileTypeAsset} from './isDocumentFileTypeAsset';\nimport {isImageFileTypeAsset} from './isImageFileTypeAsset';\nimport {isMediaFileTypeAsset} from './isMediaFileTypeAsset';\nimport {isVideoFileTypeAsset} from './isVideoFileTypeAsset';\n\nexport const getGeneralAssetFileType = (\n\tfileFormatFamily: string[] = [],\n\tspecific = false,\n) => {\n\tif (isDocumentFileTypeAsset(fileFormatFamily)) return 'document';\n\tif (isImageFileTypeAsset(fileFormatFamily)) return 'image';\n\tif (isMediaFileTypeAsset(fileFormatFamily)) {\n\t\treturn specific\n\t\t\t? isVideoFileTypeAsset(fileFormatFamily)\n\t\t\t\t? 'video'\n\t\t\t\t: 'audio'\n\t\t\t: 'media';\n\t}\n};\n\nexport default getGeneralAssetFileType;\n","import {i18n} from '@netx/core/i18n';\n\nexport const getDocumentFileTypeAssetInfoLabel = (pageCount: number) =>\n\t// Do not display when there are no pages\n\tpageCount ? i18n.t('i18n.nPages', {count: pageCount}) : undefined;\n\nexport default getDocumentFileTypeAssetInfoLabel;\n","import {secondsToHms} from '@netx/core/lib/utils';\n\n/**\n * @param duration Duration in milliseconds\n * @returns Duration label\n */\nexport const getMediaFileTypeAssetInfoLabel = (duration: number) =>\n\tsecondsToHms(duration / 1000);\n\nexport default getMediaFileTypeAssetInfoLabel;\n","export const getImageFileTypeAssetInfoLabel = (\n\tfilewidth: number,\n\tfileheight: number,\n) => (filewidth || fileheight ? `${filewidth}x${fileheight}` : undefined);\n\nexport default getImageFileTypeAssetInfoLabel;\n","import {getGeneralAssetFileType} from './getGeneralAssetFileType';\nimport {getDocumentFileTypeAssetInfoLabel} from './getDocumentFileTypeAssetInfoLabel';\nimport {getMediaFileTypeAssetInfoLabel} from './getMediaFileTypeAssetInfoLabel';\nimport {getImageFileTypeAssetInfoLabel} from './getImageFileTypeAssetInfoLabel';\nimport type {Asset} from '../types';\n\nexport const getAssetFileTypeInfoLabel = ({\n\tduration,\n\tfileFormatFamily,\n\tfileheight,\n\tfilewidth,\n\tconstituentIds,\n}: Pick<\n\tAsset,\n\t| 'constituentIds'\n\t| 'duration'\n\t| 'fileFormatFamily'\n\t| 'fileheight'\n\t| 'filewidth'\n>) => {\n\tswitch (getGeneralAssetFileType(fileFormatFamily)) {\n\t\tcase 'document':\n\t\t\treturn getDocumentFileTypeAssetInfoLabel(constituentIds.length);\n\t\tcase 'media':\n\t\t\treturn getMediaFileTypeAssetInfoLabel(duration);\n\t\tdefault:\n\t\t\t//case 'image':\n\t\t\treturn getImageFileTypeAssetInfoLabel(filewidth, fileheight);\n\t}\n};\n\nexport default getAssetFileTypeInfoLabel;\n","import type {Asset} from '../types';\nimport {status as assetStatuses} from '../properties/asset';\n\nexport const isAssetCheckedOut = (asset: Asset) =>\n\tasset.status === assetStatuses.CHECKOUT;\n\nexport default isAssetCheckedOut;\n","export const ASSET_DEFAULT_ICON_TEST = /icons\\/(.*)\\.png/;\n\nexport const isDefaultIcon = (previewUrl?: string) =>\n\tpreviewUrl?.match(ASSET_DEFAULT_ICON_TEST);\n\nexport default isDefaultIcon;\n","import Netx from '@netx/core/bootstrap';\nimport type {AssetId} from '../types';\n\nexport const routeToAsset = (id: AssetId) =>\n\tNetx.router.navigate(`asset/${id}`, true);\n\nexport default routeToAsset;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nexport type SemanticObjectAutoListItem = {\n\tlabel: string;\n\tvalue: string; // value id\n};\n\n/**\n * `getSemanticObjectAutoList` request params\n * (what is used to send to server)\n */\nexport type GetSemanticObjectAutoListRequestOptions = {\n\tvalue: string;\n\tid: number; // TODO: semantic object id\n};\n\n/**\n * `getSemanticObjectAutoList` request\n * (what gets sent to the server)\n */\nexport type GetSemanticObjectAutoListRequest = [\n\tGetSemanticObjectAutoListRequestOptions['value'],\n\tGetSemanticObjectAutoListRequestOptions['id'],\n];\n\n/**\n * `getSemanticObjectAutoList` response\n * (what comes back from the server)\n */\nexport type GetSemanticObjectAutoListResponse = SuccessResponse<\n\tSemanticObjectAutoListItem[]\n>;\n\n/**\n * `getSemanticObjectAutoList` result\n * (what is utilized from the server response)\n */\nexport type GetSemanticObjectAutoListResult = SemanticObjectAutoListItem[];\n\nexport const getSemanticObjectAutoListEndpoint = 'getSemanticObjectAutoList';\n\n/**\n * Semantic object auto list\n */\nexport const getSemanticObjectAutoList = async ({\n\tid,\n\tvalue,\n}: GetSemanticObjectAutoListRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetSemanticObjectAutoListRequest = [value, id];\n\n\treturn client\n\t\t.post(\n\t\t\tgetSemanticObjectAutoListEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default getSemanticObjectAutoList;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {AttributeId} from '../types';\n\n/**\n * `metadataAutoCompleteLookup` request params\n * (what is used to send to server)\n */\nexport type MetadataAutoCompleteLookupRequestOptions = {\n\tid: AttributeId;\n\tvalue: string;\n};\n\n/**\n * `metadataAutoCompleteLookup` request\n * (what gets sent to the server)\n */\nexport type MetadataAutoCompleteLookupRequest = [\n\tMetadataAutoCompleteLookupRequestOptions['id'],\n\tMetadataAutoCompleteLookupRequestOptions['value'],\n];\n\n/**\n * `metadataAutoCompleteLookup` response\n * (what comes back from the server)\n */\nexport type MetadataAutoCompleteLookupResponse = SuccessResponse<\n\tMetadataAutoCompleteLookupResult\n>;\n\n/**\n * `metadataAutoCompleteLookup` result\n * (what is utilized from the server response)\n */\nexport type MetadataAutoCompleteLookupResult = string[];\n\nexport const metadataAutoCompleteLookupEndpoint = 'metadataAutoCompleteLookup';\n\n/**\n * Metadata auto list (tags, which get the data from datasets)\n */\nexport const metadataAutoCompleteLookup = async ({\n\tid,\n\tvalue,\n}: MetadataAutoCompleteLookupRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: MetadataAutoCompleteLookupRequest = [id, value];\n\n\treturn client\n\t\t.post(\n\t\t\tmetadataAutoCompleteLookupEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default metadataAutoCompleteLookup;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {AttributeId} from '../types';\n\n/**\n * `metadataDatasetAutoList` request params\n * (what is used to send to server)\n */\nexport type MetadataDatasetAutoListRequestOptions = {\n\tid: AttributeId;\n\tvalue: string;\n};\n\n/**\n * `metadataDatasetAutoList` request\n * (what gets sent to the server)\n */\nexport type MetadataDatasetAutoListRequest = [\n\tMetadataDatasetAutoListRequestOptions['id'],\n\tMetadataDatasetAutoListRequestOptions['value'],\n];\n\n/**\n * `metadataDatasetAutoList` response\n * (what comes back from the server)\n */\nexport type MetadataDatasetAutoListResponse = SuccessResponse<\n\tMetadataDatasetAutoListResult\n>;\n\n/**\n * `metadataDatasetAutoList` result\n * (what is utilized from the server response)\n */\nexport type MetadataDatasetAutoListResult = string[];\n\nexport const metadataDatasetAutoListEndpoint = 'metadataDatasetAutoList';\n\n/**\n * Metadata dataset auto list\n */\nexport const metadataDatasetAutoList = async ({\n\tid,\n\tvalue,\n}: MetadataDatasetAutoListRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: MetadataDatasetAutoListRequest = [id, value];\n\n\treturn client\n\t\t.post(\n\t\t\tmetadataDatasetAutoListEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default metadataDatasetAutoList;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {AttributeId} from '../types';\n\n/**\n * `vocabularyValueLookup` request params\n * (what is used to send to server)\n */\nexport type VocabularyValueLookupRequestOptions = {\n\tid: AttributeId;\n\tvalue: string;\n};\n\n/**\n * `vocabularyValueLookup` request\n * (what gets sent to the server)\n */\nexport type VocabularyValueLookupRequest = [\n\tVocabularyValueLookupRequestOptions['id'],\n\tVocabularyValueLookupRequestOptions['value'],\n];\n\n/**\n * `vocabularyValueLookup` response\n * (what comes back from the server)\n */\nexport type VocabularyValueLookupResponse = SuccessResponse<\n\tVocabularyValueLookupResult\n>;\n\n/**\n * `vocabularyValueLookup` result\n * (what is utilized from the server response)\n */\nexport type VocabularyValueLookupResult = string[];\n\nexport const vocabularyValueLookupEndpoint = 'vocabularyValueLookup';\n\n/**\n * Vocabulary value auto list\n */\nexport const vocabularyValueLookup = async ({\n\tid,\n\tvalue,\n}: VocabularyValueLookupRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: VocabularyValueLookupRequest = [id, value];\n\n\treturn client\n\t\t.post(\n\t\t\tvocabularyValueLookupEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default vocabularyValueLookup;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const CONTEXT_MENU_CLASS_NAME = 'ContextMenu';\nexport const CONTEXT_MENU_CLASS_SLOTS = ['root'] as const;\n\nexport type ContextMenuClassSlot = typeof CONTEXT_MENU_CLASS_SLOTS[number];\n\nexport interface ContextMenuClasses {\n\troot: string;\n}\n\nexport type ContextMenuClassKey = keyof ContextMenuClasses;\n\nexport const getContextMenuUtilityClass = (slot: ContextMenuClassSlot) =>\n\tgenerateUtilityClass(CONTEXT_MENU_CLASS_NAME, slot);\n\nexport const contextMenuClasses: ContextMenuClasses = generateUtilityClasses(\n\tCONTEXT_MENU_CLASS_NAME,\n\t['root'],\n);\n\nexport default contextMenuClasses;\n","import React, {useCallback, useEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {\n\tcapitalize,\n\tClickAwayListener,\n\tPopover,\n\tPopoverProps,\n\tpopoverClasses,\n} from '@mui/material';\nimport {ReactAction as Action} from '@netx/core/bootstrap';\nimport {\n\tcomposeClasses,\n\tgetSeverityColors,\n\tstyled,\n\tWithClasses,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\nimport Title, {titleClasses} from '@netx/core-components/Title';\nimport {useWhenChangedEffect} from '../hooks';\nimport ActionMenuList from '../ActionMenuList';\nimport {\n\tcontextMenuClasses,\n\tgetContextMenuUtilityClass,\n\tContextMenuClasses,\n\tCONTEXT_MENU_CLASS_NAME,\n} from './contextMenuClasses';\n\ntype ContextMenuHeaderSeverity =\n\t| 'default'\n\t| 'primary'\n\t| 'secondary'\n\t| 'inherit'\n\t| 'error'\n\t| 'info'\n\t| 'success'\n\t| 'warning';\n\ntype ContextMenuUtiltiyClassProps = WithClasses<\n\tContextMenuClasses,\n\t{\n\t\theaderSeverity?: ContextMenuHeaderSeverity;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: ContextMenuUtiltiyClassProps) => {\n\tconst {classes, headerSeverity} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t\theader: [\n\t\t\t'header',\n\t\t\theaderSeverity && `severity${capitalize(headerSeverity)}`,\n\t\t],\n\t};\n\treturn composeClasses(slots, getContextMenuUtilityClass, classes);\n};\n\nconst ContextMenuRoot = styled(Popover, {\n\tname: CONTEXT_MENU_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\t[`& .${popoverClasses.paper}`]: {\n\t\tmarginRight: theme.spacing(2),\n\t\tdisplay: 'flex',\n\t\tflexDirection: 'column',\n\t\toverflow: 'hidden',\n\t\tminHeight: 0,\n\t},\n}));\n\nconst ContextMenuWrapper = styled('div', {\n\tname: CONTEXT_MENU_CLASS_NAME,\n\tslot: 'Wrapper',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tflexDirection: 'column',\n\toverflow: 'hidden',\n}));\n\nconst ContextMenuList = styled('div', {\n\tname: CONTEXT_MENU_CLASS_NAME,\n\tslot: 'Wrapper',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tflexDirection: 'column',\n\t...theme.mixins.scrollable,\n}));\n\nconst ContextMenuHeader = styled('div', {\n\tname: CONTEXT_MENU_CLASS_NAME,\n\tslot: 'Header',\n})(({theme, ownerState}) => {\n\tconst colors = getSeverityColors(theme);\n\treturn {\n\t\tflex: '0 0 auto',\n\t\tpadding: theme.spacing(1, 2),\n\t\t...(ownerState.headerSeverity === 'default'\n\t\t\t? {\n\t\t\t\t\tbackgroundColor: theme.palette.background.paper,\n\t\t\t\t\tcolor: theme.palette.text.primary,\n\t\t\t }\n\t\t\t: {\n\t\t\t\t\tbackgroundColor: colors[ownerState.headerSeverity]?.default,\n\t\t\t\t\tcolor: colors[ownerState.headerSeverity]?.text,\n\t\t\t }),\n\t\t[`& .${titleClasses.icon}`]: {\n\t\t\theight: 24,\n\t\t\twidth: 24,\n\t\t\tbackground: 'transparent',\n\t\t\t...(ownerState.headerSeverity !== 'default'\n\t\t\t\t? {\n\t\t\t\t\t\tcolor: colors[ownerState.headerSeverity]?.text,\n\t\t\t\t }\n\t\t\t\t: null),\n\t\t},\n\t};\n});\n\nexport interface ContextMenuOptions {\n\tactions: Array;\n\theaderIcon?: any;\n\tleft: number;\n\ttop: number;\n\theaderSeverity?: ContextMenuHeaderSeverity;\n\theaderPrimary?: React.ReactElement | string;\n\theaderSecondary?: React.ReactElement | string;\n}\n\nexport interface ContextMenuProps\n\textends ContextMenuOptions,\n\t\tPartial<\n\t\t\tOmit<\n\t\t\t\tWithMuiPropOverrides,\n\t\t\t\t| 'classes'\n\t\t\t\t| 'className'\n\t\t\t\t| 'anchorReference'\n\t\t\t\t| 'anchorPosition'\n\t\t\t\t| 'onExited'\n\t\t\t\t| 'open'\n\t\t\t\t| 'role'\n\t\t\t>\n\t\t>,\n\t\tWithClasses<\n\t\t\tContextMenuClasses,\n\t\t\t{\n\t\t\t\tonExited(action?: Action): void;\n\t\t\t\topen: boolean;\n\t\t\t}\n\t\t> {}\n\nexport const ContextMenuPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\n\tactions,\n\theaderSeverity = 'default',\n\theaderIcon,\n\theaderPrimary,\n\theaderSecondary,\n\tleft,\n\ttop,\n\tonExited,\n\topen,\n\t...props\n}: ContextMenuProps) => {\n\tconst [isOpen, setIsOpen] = useState(open);\n\tconst selectedAction = useRef();\n\n\tconst ownerState = {\n\t\tclasses: _classes,\n\t\theaderSeverity,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tuseEffect(() => {\n\t\tsetIsOpen(open);\n\t}, [open]);\n\n\tconst handleAction = useCallback(\n\t\t(action: Action) => {\n\t\t\tselectedAction.current = action;\n\t\t\tsetIsOpen(false);\n\t\t},\n\t\t[actions],\n\t);\n\n\tconst handleClickAway = useCallback(() => setIsOpen(false), []);\n\n\tconst handleExited = useCallback(\n\t\t(node: HTMLElement) => {\n\t\t\tonExited(selectedAction.current);\n\t\t\tselectedAction.current = undefined;\n\t\t},\n\t\t[actions, onExited],\n\t);\n\n\tuseWhenChangedEffect(\n\t\tisOpen,\n\t\tuseCallback((isOpen) => {\n\t\t\tif (!isOpen) return;\n\n\t\t\tconst listener = (e: MouseEvent) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tselectedAction.current = undefined;\n\t\t\t\tsetIsOpen(false);\n\t\t\t};\n\n\t\t\tdocument.addEventListener('contextmenu', listener);\n\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener('contextmenu', listener);\n\t\t\t};\n\t\t}, []),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\tconst handleListKeyDown = useCallback(\n\t\t(event: React.KeyboardEvent) => {\n\t\t\t// These events keep this inline with what you would expect using\n\t\t\t// the mui menu component itself\n\t\t\tif (event.key === 'Tab' || event.key === 'Escape') {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tsetIsOpen(false);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tif (left == null || top == null) return null;\n\n\t// MUI menus require an anchor ref and will not accept anchor position\n\t// but popover will\n\t// This is essentially how a MUI menu works - it just does not expose the\n\t// anchor position options\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{headerPrimary ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t) : null}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport const ContextMenu = ContextMenuPrimitive;\n\nexport default ContextMenu;\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport ContextMenu, {ContextMenuOptions} from './ContextMenu';\n\nimport {ReactAction as Action, ReactAction} from '@netx/core/bootstrap';\n\nexport type ContextMenuServiceContextType = {\n\ttrigger: (options: ContextMenuOptions) => Promise;\n\tisOpen: boolean;\n\tclose: (action?: ReactAction) => void;\n};\n\nconst ContextMenuServiceContext = createContext<\n\tContextMenuServiceContextType | undefined\n>(undefined);\n\nexport const useContextMenu = () => {\n\tconst context = useContext(ContextMenuServiceContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t'`useContextMenu` must be used within a `ContextMenuServiceProvider`',\n\t\t);\n\t}\n\treturn context;\n};\n\nexport const ContextMenuServiceProvider = ({\n\tchildren,\n}: React.PropsWithChildren<{}>) => {\n\tconst [contextMenuState, setContextMenuState] = useState<\n\t\tContextMenuOptions\n\t>();\n\n\tconst awaitingPromiseRef = useRef<{\n\t\tresolve(action?: Action): void;\n\t\treject(): void;\n\t}>();\n\n\tconst openContextMenu = useCallback((options: ContextMenuOptions) => {\n\t\tsetContextMenuState(options);\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tawaitingPromiseRef.current = {resolve, reject};\n\t\t});\n\t}, []);\n\n\tconst handleExited = useCallback((action?: Action) => {\n\t\tawaitingPromiseRef.current?.resolve(action);\n\t\tawaitingPromiseRef.current = undefined;\n\t\tsetContextMenuState(undefined);\n\t}, []);\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\ttrigger: openContextMenu,\n\t\t\tisOpen: Boolean(contextMenuState),\n\t\t\tclose: handleExited,\n\t\t}),\n\t\t[openContextMenu, contextMenuState],\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t\n\n\t\t\t\n\t\t\n\t);\n};\n","import React from 'react';\n\nimport {ContextMenuServiceProvider} from './ContextMenuService';\n\n/**\n * wrap component in context menu\n * @example\n\tconst WrappedComponenet = withContextMenu(Componenet);\n */\nexport const withContextMenu = function (\n\tComponent: C,\n) {\n\treturn (\n\t\tprops: JSX.IntrinsicAttributes &\n\t\t\tJSX.LibraryManagedAttributes>,\n\t) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t};\n};\n\nexport default withContextMenu;\n","import React, {FunctionComponent, useEffect, useState} from 'react';\n\nimport _ from 'underscore';\n\nimport {Tooltip as MuiTooltip, TooltipProps} from '@mui/material';\nimport {useUpdateEffect} from '../hooks/useUpdateEffect';\nexport type {TooltipProps} from '@mui/material';\n\n/**\n * Wrapper for MUI Tolltip\n *\n * Dismiss tooltip on scroll\n */\nexport const Tooltip: FunctionComponent<\n\tTooltipProps & {\n\t\tdisabled?: boolean;\n\t}\n> = ({disabled, children, title, open: _open, ...props}) => {\n\tconst [open, setOpen] = useState(_open || false);\n\n\tuseEffect(() => {\n\t\tif (!open) return;\n\n\t\tconst listener = _.throttle(() => {\n\t\t\tsetOpen(false);\n\t\t}, 50);\n\n\t\twindow.addEventListener('scroll', listener, true);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('scroll', listener, true);\n\t\t};\n\t}, [open]);\n\n\tconst toggleOpen = (open: boolean) => () => setOpen(disabled ? false : open);\n\n\tuseUpdateEffect(() => {\n\t\t_open != null && setOpen(_open);\n\t}, [_open]);\n\n\tuseUpdateEffect(() => {\n\t\tdisabled && setOpen(false);\n\t}, [disabled]);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport default Tooltip;\n","import {AttributeAction, AttributeValue} from '../types';\nimport {ATTRIBUTE_ACTION} from '../constants';\n\nimport {isEmptyValue, valuesMatch} from '@netx/core-components/Form/util';\n\n/**\n * Does the applied action change the attributes value\n */\nexport const actionChangesValue = (\n\tcurrentValue: AttributeValue,\n\toriginalValue: AttributeValue,\n\taction: AttributeAction,\n) => {\n\treturn (\n\t\taction === ATTRIBUTE_ACTION.CLEAR ||\n\t\t([ATTRIBUTE_ACTION.APPEND, ATTRIBUTE_ACTION.REMOVE].includes(\n\t\t\taction as any,\n\t\t) &&\n\t\t\t!isEmptyValue(currentValue) &&\n\t\t\t!valuesMatch(currentValue, originalValue))\n\t);\n};\n\nexport default actionChangesValue;\n","import {\n\tDateAttribute,\n\tMultiSelectAttribute,\n\tNumberAttribute,\n\tSelectAttribute,\n\tSemanticAttribute,\n\tTagAttribute,\n\tTagVocabAttribute,\n\tTextAttribute,\n} from '../components/EditableAttribute';\n\nimport {AttributeType} from '../types';\n\n/** Given an attribute type, will return the attribute component */\nexport const getAttributeComponent = (type: AttributeType) => {\n\tswitch (type) {\n\t\tcase 1:\n\t\tcase 2: // Textarea\n\t\t\treturn TextAttribute;\n\t\tcase 3:\n\t\t\treturn SelectAttribute;\n\t\tcase 4:\n\t\t\treturn DateAttribute;\n\t\tcase 5:\n\t\t\treturn MultiSelectAttribute;\n\t\tcase 6:\n\t\t\treturn TagAttribute;\n\t\tcase 7:\n\t\t\treturn NumberAttribute;\n\t\tcase 12:\n\t\t\treturn SemanticAttribute;\n\t\tcase 13:\n\t\t\treturn TagVocabAttribute;\n\t}\n};\n\nexport default getAttributeComponent;\n","import type {AttributeTemplate, AttributesWorking} from '../types';\n\n/**\n * Get attribute templates that will be effected by a lookup\n * @param attributeTemplate The attribute template being lookup up from\n * @param attributeTemplates The attribute templates that could be involved\n * @return Attribute templates effected\n */\nexport const getTemplatesEffectedByLookup = (\n\tattributeTemplate: AttributeTemplate,\n\tattributeTemplates: AttributeTemplate[],\n) => {\n\treturn attributeTemplate.keyDatasets.reduce(\n\t\t(attributesWorking, id) => {\n\t\t\treturn {\n\t\t\t\t...attributesWorking,\n\t\t\t\t...attributeTemplates.reduce(\n\t\t\t\t\t(attributesWorking, attr) => {\n\t\t\t\t\t\tif (!attr.targetDatasets.includes(id)) return attributesWorking;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...attributesWorking,\n\t\t\t\t\t\t\t[attr.attributeid]: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t\t{},\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t// the template passed in will be considered part of this\n\t\t\t[attributeTemplate.attributeid]: true,\n\t\t},\n\t);\n};\n\nexport default getTemplatesEffectedByLookup;\n","import {AttributeType} from '../types';\nimport {ATTRIBUTE_APPENDABLE_TYPES} from '../constants';\n\n/** Is appendable attribute type */\nexport const isAppendable = (type: AttributeType) =>\n\tATTRIBUTE_APPENDABLE_TYPES.includes(\n\t\ttype as typeof ATTRIBUTE_APPENDABLE_TYPES[number],\n\t);\n\nexport default isAppendable;\n","export const isSystemAttribute = (id: number) => {\n\treturn id < 0;\n};\n\nexport default isSystemAttribute;\n","import {isEmptyValue} from '@netx/core-components/Form/util';\nimport {AttributeValue} from '../types';\n\n/**\n * Normalize attribute value to array\\\n * In a lot of cases saving attribute values to the server, it wants an array\n * regardless of the multi-value ability of an attribute template type\\\n */\nexport const normalizeValue = (value: AttributeValue) => {\n\tif (isEmptyValue(value)) return [];\n\tif (!Array.isArray(value)) return [value];\n\treturn value;\n};\n\nexport default normalizeValue;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {FormLabel, Skeleton} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport type {TextFieldProps} from './TextField';\nimport {isEmptyValue} from '@netx/core-components/Form';\n\nconst styles = ({mixins, palette, spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tmargin: spacing(0.75, 0),\n\t\t\tpadding: spacing(0, 1.75),\n\t\t\twidth: '100%',\n\t\t\t'&.disabled': {\n\t\t\t\t...mixins.disabled,\n\t\t\t},\n\t\t\t'&.pseudoValue': {\n\t\t\t\t'& $value': {\n\t\t\t\t\tcolor: palette.text.secondary,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&$limitHeightToContainer': {\n\t\t\t\tmaxHeight: '100%',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflexDirection: 'column',\n\t\t\t\t'& $label': {\n\t\t\t\t\tflex: '0 0 auto',\n\t\t\t\t},\n\t\t\t\t'& $value': {\n\t\t\t\t\t...mixins.scrollable,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&$wrapLabel $label': {\n\t\t\t\twhiteSpace: 'initial',\n\t\t\t},\n\t\t},\n\t\tlabel: {\n\t\t\t...mixins.readOnlyLabel,\n\t\t},\n\t\tlimitHeightToContainer: {},\n\t\tvalue: {\n\t\t\t// for \\n etc (no need to parse a string and add
s etc)\n\t\t\twhiteSpace: 'pre-wrap',\n\t\t\twidth: '100%',\n\t\t\twordBreak: 'break-word',\n\t\t},\n\t\tskeleton: {},\n\t\twrapLabel: {},\n\t});\n\nexport interface ReadOnlyTextFieldProps\n\textends Omit {\n\tlimitHeightToContainer?: boolean;\n\twrapLabel?: boolean;\n}\n\nconst ReadOnlyTextField = ({\n\tclasses,\n\tclassName,\n\tdisabled,\n\tlabel = '',\n\tlimitHeightToContainer,\n\tloading,\n\tloadingValue,\n\tmultipleValues,\n\twrapLabel,\n\tvalue,\n}: WithStyles & ReadOnlyTextFieldProps) => {\n\tvalue = value == null ? '' : value;\n\n\tconst pseudoValue = isEmptyValue(value) || multipleValues;\n\n\tconst displayLabel = useMemo(() => {\n\t\tif (label == null || label === '') return null;\n\t\tif (loading) return ;\n\t\treturn (\n\t\t\t\n\t\t\t\t{label}\n\t\t\t\n\t\t);\n\t}, [label]);\n\n\tconst displayValue = useMemo(() => {\n\t\tif (loading || loadingValue)\n\t\t\treturn ;\n\t\tif (multipleValues) return i18n.t('i18n.multipleValues');\n\t\tif (value === '') return '(none)';\n\t\treturn value;\n\t}, [loading, loadingValue, multipleValues, value]);\n\n\treturn (\n\t\t\n\t\t\t{displayLabel}\n\t\t\t
{displayValue}
\n\t\t\n\t);\n};\n\nexport default withStyles(styles, {\n\tname: 'ReadOnlyTextField',\n})(React.memo(ReadOnlyTextField));\n","export enum DrawerAnchor {\n\tLEFT = 'left',\n\tRIGHT = 'right',\n\tTOP = 'top',\n\tBOTTOM = 'bottom',\n}\n\nexport enum DrawerVariant {\n\tPERMANENT = 'permanent',\n\tTEMPORARY = 'temporary',\n}\n","import {i18n} from '@netx/core/i18n';\n\nexport const DrawerActionLabel = {\n\tCOLLAPSE: i18n.t('i18n.collapse'),\n\tCLOSE: i18n.t('i18n.close'),\n\tUNCOLLAPSE: i18n.t('i18n.uncollapse'),\n};\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const DRAWER_TOOLBAR_CLASS_NAME = 'DrawerToolbar';\nexport const DRAWER_TOOLBAR_CLASS_SLOTS = ['root', 'title', 'toggle'] as const;\n\nexport type DrawerToolbarClassSlot = typeof DRAWER_TOOLBAR_CLASS_SLOTS[number];\n\nexport interface DrawerToolbarClasses {\n\troot: string;\n\ttitle: string;\n\ttoggle: string;\n\n\tanchorLeft: string;\n\tanchorRight: string;\n\topen: string;\n}\n\nexport type DrawerToolbarClassKey = keyof DrawerToolbarClasses;\n\nexport const getDrawerToolbarUtilityClass = (slot: DrawerToolbarClassSlot) =>\n\tgenerateUtilityClass(DRAWER_TOOLBAR_CLASS_NAME, slot);\n\nexport const drawerToolbarClasses: DrawerToolbarClasses = generateUtilityClasses(\n\tDRAWER_TOOLBAR_CLASS_NAME,\n\t['root', 'anchorLeft', 'anchorRight', 'open', 'title', 'toggle'],\n);\n\nexport default drawerToolbarClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\n\nimport {\n\tfaChevronLeft as ToggleIcon,\n\tfaTimes as TimesIcon,\n} from '@fortawesome/pro-solid-svg-icons';\nimport {unstable_capitalize as capitalize} from '@mui/utils';\nimport {\n\tIconButton,\n\tIconButtonProps,\n\ticonButtonClasses,\n} from '@netx/core-components/IconButton';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {Title} from '@netx/core-components/Title';\nimport {DrawerAnchor} from './constants';\nimport {DrawerActionLabel} from './locales';\nimport {\n\tdrawerToolbarClasses,\n\tgetDrawerToolbarUtilityClass,\n\tDrawerToolbarClasses,\n\tDRAWER_TOOLBAR_CLASS_NAME,\n} from './drawerToolbarClasses';\n\nexport type DrawerOwnerState = WithClasses<\n\tDrawerToolbarClasses,\n\t{\n\t\tanchor: DrawerAnchor;\n\t\topen: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: DrawerOwnerState) => {\n\tconst {classes, anchor, open} = ownerState;\n\tconst slots = {\n\t\troot: ['root', `anchor${capitalize(anchor)}`, open && 'open'],\n\t\ttoggle: ['toggle'],\n\t\ttitle: ['title'],\n\t};\n\treturn composeClasses(slots, getDrawerToolbarUtilityClass, classes);\n};\n\nconst DrawerToolbarRoot = styled('div', {\n\tname: DRAWER_TOOLBAR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'flex-start',\n\tpadding: theme.spacing(0, 1.5, 0, 0.75),\n\tzIndex: 3,\n\t...(theme.mixins.toolbar as React.CSSProperties),\n\t[`&.${drawerToolbarClasses.anchorLeft}`]: {\n\t\t[`& .${drawerToolbarClasses.title}`]: {\n\t\t\tmarginRight: theme.spacing(1),\n\t\t},\n\t},\n\t[`&.${drawerToolbarClasses.anchorRight}`]: {\n\t\t[`& .${drawerToolbarClasses.title}`]: {\n\t\t\tmarginLeft: theme.spacing(1),\n\t\t},\n\t},\n\t[`&:not(.${drawerToolbarClasses.open})`]: {\n\t\t[`& .${drawerToolbarClasses.title}`]: {\n\t\t\tvisibility: 'hidden',\n\t\t\tmargin: 0,\n\t\t},\n\t},\n}));\n\nconst DrawerTitle = styled(Title, {\n\tname: DRAWER_TOOLBAR_CLASS_NAME,\n\tslot: 'Title',\n})(({theme}) => ({\n\tflex: '1 1 auto',\n\toverflow: 'hidden',\n\ttextOverflow: 'ellipsis',\n}));\n\nconst DrawerToggle = styled(IconButton, {\n\tname: DRAWER_TOOLBAR_CLASS_NAME,\n\tslot: 'Toggle',\n})(({theme}) => ({\n\t[`& .${iconButtonClasses.icon}`]: {\n\t\ttransition: theme.transitions.create('transform'),\n\t},\n}));\n\ntype IconButtonMethods = Required>;\n\nexport interface DrawerToolbarProps\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes,\n\t\t\tHTMLDivElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tDrawerToolbarClasses,\n\t\t\t{\n\t\t\t\t// TODO: top and bottom are not supported just yet\n\t\t\t\tanchor: DrawerAnchor;\n\t\t\t\tcancelAsClose?: boolean;\n\t\t\t\tactions?: React.ReactNode;\n\t\t\t\tonCollapseToggle?: IconButtonMethods['onClick'];\n\t\t\t\topen?: boolean;\n\t\t\t\tsecondaryTitle?: React.ReactNode;\n\t\t\t\ttitle?: string;\n\t\t\t}\n\t\t> {}\n\nexport const DrawerToolbarPrimitive = ({\n\tclasses: _classes,\n\tchildren,\n\tclassName,\n\n\tactions,\n\tanchor,\n\tcancelAsClose,\n\tonCollapseToggle,\n\topen,\n\tsecondaryTitle,\n\ttitle = '',\n\t...props\n}: DrawerToolbarProps) => {\n\tconst ownerState = {\n\t\tclasses: _classes,\n\t\tanchor,\n\t\topen: open === true,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst Toggle = useMemo(\n\t\t() => (\n\t\t\t\n\t\t),\n\t\t[classes, anchor, open, onCollapseToggle, cancelAsClose],\n\t);\n\n\tconst Title = useMemo(\n\t\t() => (\n\t\t\t\n\t\t),\n\t\t[classes, secondaryTitle, title],\n\t);\n\n\tconst Actions = (open && actions) || null;\n\n\treturn (\n\t\t\n\t\t\t{anchor === DrawerAnchor.RIGHT ? (\n\t\t\t\t<>\n\t\t\t\t\t{Toggle}\n\t\t\t\t\t{Title}\n\t\t\t\t\t{Actions}\n\t\t\t\t\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{Actions}\n\t\t\t\t\t{Title}\n\t\t\t\t\t{Toggle}\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport const DrawerToolbar = React.memo(DrawerToolbarPrimitive);\n\nexport default DrawerToolbar;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const DRAWER_CLASS_NAME = 'Drawer';\nexport const DRAWER_CLASS_SLOTS = ['root', 'content', 'drawer'] as const;\n\nexport type DrawerClassSlot = typeof DRAWER_CLASS_SLOTS[number];\n\nexport interface DrawerClasses {\n\troot: string;\n\tcontent: string;\n\tdrawer: string;\n\n\tresizing: string;\n\topen: string;\n\ttemporary: string;\n}\n\nexport type DrawerClassKey = keyof DrawerClasses;\n\nexport const getDrawerUtilityClass = (slot: DrawerClassSlot) =>\n\tgenerateUtilityClass(DRAWER_CLASS_NAME, slot);\n\nexport const drawerClasses: DrawerClasses = generateUtilityClasses(\n\tDRAWER_CLASS_NAME,\n\t['root', 'content', 'drawer', 'open', 'resizing', 'temporary'],\n);\n\nexport default drawerClasses;\n","import React, {useCallback, useEffect, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {FocusTrap} from '@mui/base';\nimport {\n\tDrawer as MuiDrawer,\n\tDrawerProps as MuiDrawerProps,\n\tpaperClasses,\n} from '@mui/material';\nimport {duration} from '@mui/material/styles/createTransitions';\nimport {\n\tDragResize,\n\tDragResizeDirection,\n\tdragResizeHandleClasses,\n} from '@netx/core-components/DragResize';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\nimport {useDocumentKeyDown} from '@netx/core-components/hooks/useDocumentKeyDown';\nimport {IconButtonProps} from '@netx/core-components/IconButton';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithClasses,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\nimport {DrawerToolbar} from './DrawerToolbar';\nimport {DrawerAnchor, DrawerVariant} from './constants';\nimport {\n\tdrawerClasses,\n\tgetDrawerUtilityClass,\n\tDrawerClasses,\n\tDRAWER_CLASS_NAME,\n} from './drawerClasses';\n\nexport type DrawerOwnerState = WithClasses<\n\tDrawerClasses,\n\t{\n\t\topen: boolean;\n\t\tresizing: boolean;\n\t\ttemporary: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: DrawerOwnerState) => {\n\tconst {classes, open, resizing, temporary} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\topen && 'open',\n\t\t\tresizing && 'resizing',\n\t\t\ttemporary && 'temporary',\n\t\t],\n\t\tcontent: ['content'],\n\t\tdrawer: ['drawer', temporary && 'temporary'],\n\t};\n\treturn composeClasses(slots, getDrawerUtilityClass, classes);\n};\n\nconst DEFAULT_WIDTH = 300;\n\nconst DrawerRoot = styled(DragResize, {\n\tname: DRAWER_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tposition: 'relative',\n\twhiteSpace: 'nowrap',\n\t[`&:not(:hover):not(.${drawerClasses.resizing}) .${dragResizeHandleClasses.root}`]:\n\t\t{\n\t\t\topacity: 0,\n\t\t},\n\t[`&.${drawerClasses.resizing}`]: {\n\t\twillChange: 'width',\n\t\t[`& .${drawerClasses.content}`]: {\n\t\t\tpointerEvents: 'none',\n\t\t},\n\t},\n\t[`&.${drawerClasses.open}`]: {\n\t\twidth: DEFAULT_WIDTH,\n\t\t[`&:not(.${drawerClasses.resizing})`]: {\n\t\t\ttransition: theme.transitions.create(['width', 'min-width'], {\n\t\t\t\teasing: theme.transitions.easing.sharp,\n\t\t\t\tduration: theme.transitions.duration.enteringScreen,\n\t\t\t}),\n\t\t},\n\t},\n\t[`&:not(.${drawerClasses.open})`]: {\n\t\ttransition: theme.transitions.create(['width', 'min-width'], {\n\t\t\teasing: theme.transitions.easing.sharp,\n\t\t\tduration: theme.transitions.duration.leavingScreen,\n\t\t}),\n\t\toverflowX: 'hidden',\n\t\twidth: `61px !important`,\n\t\tcursor: 'pointer',\n\t\t[`& .${drawerClasses.content}`]: {\n\t\t\tdisplay: 'none',\n\t\t},\n\t},\n\t[`&.${drawerClasses.temporary}`]: {\n\t\tposition: 'absolute',\n\t\tright: 0,\n\t\tbottom: 0,\n\t\ttop: 0,\n\t\t[`&:not(.${drawerClasses.open})`]: {\n\t\t\tposition: 'absolute',\n\t\t\twidth: `0 !important`,\n\t\t},\n\t},\n\t[`&:not(.${drawerClasses.temporary})`]: {\n\t\tminWidth: 61,\n\t},\n}));\n\nconst DrawerWrapper = styled(MuiDrawer)(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tminHeight: 0,\n\t// Undo some paper styles in the drawer\n\t[`& .${paperClasses.root}`]: {\n\t\tflex: '1 1 auto',\n\t\theight: 'auto',\n\t\tminHeight: 0,\n\t\toverflow: 'visible',\n\t\tposition: 'relative',\n\t\twidth: '100%',\n\t\tzIndex: 'initial',\n\t},\n}));\n\nconst DrawerContent = styled('div')(({theme}) => ({\n\tflex: '1 1 auto',\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tminHeight: 0,\n\toverflow: 'hidden',\n\tposition: 'relative',\n}));\n\ntype MuiDrawerMethods = Required>;\ntype IconButtonMethods = Required>;\n\nexport interface DrawerProps\n\textends Omit<\n\t\t\tWithMuiPropOverrides,\n\t\t\t'anchor' | 'classes' | 'variant'\n\t\t>,\n\t\tWithClasses<\n\t\t\tDrawerClasses,\n\t\t\t{\n\t\t\t\tanchor?: DrawerAnchor;\n\t\t\t\tcancelAsClose?: boolean;\n\t\t\t\theaderActions?: React.ReactNode;\n\t\t\t\tkeepMounted?: boolean;\n\t\t\t\tonCollapseToggle?: (collapsed: boolean) => void;\n\t\t\t\tonEntered?: () => void;\n\t\t\t\tonExited?: () => void;\n\t\t\t\tonResized?: (width: number) => void;\n\t\t\t\toverflowParent: React.RefObject;\n\t\t\t\tsecondaryTitle?: React.ReactNode;\n\t\t\t\ttitle?: string;\n\t\t\t\twidth?: number;\n\t\t\t\tvariant?: DrawerVariant;\n\t\t\t}\n\t\t> {}\n\nexport const DrawerPrimitive = ({\n\tclasses: _classes,\n\tchildren,\n\tclassName,\n\n\tanchor = DrawerAnchor.RIGHT,\n\tcancelAsClose,\n\theaderActions,\n\tkeepMounted = true,\n\tonCollapseToggle,\n\tonEntered,\n\tonExited,\n\tonResized,\n\topen = true,\n\toverflowParent,\n\tsecondaryTitle,\n\tstyle,\n\ttitle = '',\n\twidth = 0,\n\tvariant = DrawerVariant.PERMANENT,\n\t...props\n}: DrawerProps) => {\n\tconst [exited, setExited] = useState(!open);\n\tconst [isOpen, setIsOpen] = useState(open);\n\tconst [resizing, setResizing] = useState(false);\n\n\tconst temporary = variant === DrawerVariant.TEMPORARY;\n\n\tuseEffect(() => {\n\t\tsetIsOpen(open);\n\t}, [open]);\n\n\tuseWhenChangedEffect(\n\t\tisOpen,\n\t\tuseCallback(\n\t\t\t(isOpen) => {\n\t\t\t\tif (!isOpen) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsetExited(true);\n\t\t\t\t\t\tonExited?.();\n\t\t\t\t\t}, duration.leavingScreen);\n\t\t\t\t} else {\n\t\t\t\t\tsetExited(false);\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tonEntered?.();\n\t\t\t\t\t}, duration.enteringScreen + 20);\n\t\t\t\t}\n\n\t\t\t\tonCollapseToggle?.(isOpen);\n\t\t\t},\n\t\t\t[onEntered, onExited, onCollapseToggle],\n\t\t),\n\t);\n\n\tuseDocumentKeyDown(\n\t\t(event) => {\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'Escape':\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tdisabled: !isOpen || !cancelAsClose,\n\t\t},\n\t);\n\n\tconst handleDrawerToggle = useCallback(\n\t\t(event) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tsetIsOpen((isOpen) => !isOpen);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleDrawerClick = useCallback(\n\t\t(event) => {\n\t\t\tif (isOpen) return;\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tsetIsOpen(true);\n\t\t},\n\t\t[isOpen],\n\t);\n\n\tconst handleDrawerKeyDown = useCallback(\n\t\t(event) => {\n\t\t\tif (isOpen) return;\n\t\t\tconst key = event.keyCode || event.which;\n\t\t\t// Only `enter` and `spacebar` keys\n\t\t\tif (![13, 32].includes(key)) return;\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tsetIsOpen(true);\n\t\t},\n\t\t[isOpen],\n\t);\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\topen: isOpen,\n\t\tresizing,\n\t\ttemporary,\n\t});\n\n\treturn (\n\t\t setResizing(true)}\n\t\t\tonResizeEnded={(size) => {\n\t\t\t\tsetResizing(false);\n\t\t\t\tonResized?.(size);\n\t\t\t}}\n\t\t>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{exited && !keepMounted ? null : children}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport const Drawer = React.memo(DrawerPrimitive);\n\nexport default Drawer;\n","import React from 'react';\nimport Drawer, {DrawerProps} from './Drawer';\n\nexport interface WithDrawerProps {\n\tDrawerProps: DrawerProps;\n}\n\nexport default function withDrawer(Component: C) {\n\treturn ({\n\t\tDrawerProps,\n\t\t...props\n\t}: WithDrawerProps &\n\t\tJSX.IntrinsicAttributes &\n\t\tJSX.LibraryManagedAttributes>) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t>)}\n\t\t\t\t/>\n\t\t\t\n\t\t);\n\t};\n}\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const MENU_ITEM_CLASS_NAME = 'MenuItem';\n\nexport const MENU_ITEM_CLASS_SLOTS = ['root', 'icon'] as const;\n\nexport type MenuItemClassSlot = typeof MENU_ITEM_CLASS_SLOTS[number];\n\nexport interface MenuItemClasses {\n\troot: string;\n\ticon: string;\n\tseverityDefault: string;\n\tseverityError: string;\n}\n\nexport type MenuItemClassKey = keyof MenuItemClasses;\n\nexport const getMenuItemUtilityClass = (slot: MenuItemClassSlot) =>\n\tgenerateUtilityClass(MENU_ITEM_CLASS_NAME, slot);\n\nexport const menuItemClasses: MenuItemClasses = generateUtilityClasses(\n\tMENU_ITEM_CLASS_NAME,\n\t['root', 'icon', 'severityError', 'severityDefault'],\n);\n\nexport default menuItemClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {IconProp} from '@fortawesome/fontawesome-svg-core';\nimport {\n\tListItemIcon,\n\tListItemText,\n\tMenuItem as MuiMenuItem,\n\tMenuItemProps as MuiMenuItemProps,\n} from '@mui/material';\nimport {unstable_capitalize} from '@mui/utils';\nimport {ColoredAvatar} from '@netx/core-components/ColoredAvatar';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithClasses,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\nimport {\n\tmenuItemClasses,\n\tgetMenuItemUtilityClass,\n\tMenuItemClasses,\n\tMENU_ITEM_CLASS_NAME,\n} from './menuItemClasses';\n\ntype MenuItemUtiltiyClassProps = WithClasses<\n\tMenuItemClasses,\n\t{\n\t\tseverity: 'default' | 'error';\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: MenuItemUtiltiyClassProps) => {\n\tconst {classes, severity} = ownerState;\n\tconst slots = {\n\t\troot: ['root', severity && `severity${unstable_capitalize(severity)}`],\n\t\ticon: ['icon'],\n\t};\n\treturn composeClasses(slots, getMenuItemUtilityClass, classes);\n};\n\nconst MenuItemRoot = styled(MuiMenuItem, {\n\tname: MENU_ITEM_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\t[`&.${menuItemClasses.severityError}`]: {\n\t\tbackground: theme.palette.error.main,\n\t\t[`&, & .${menuItemClasses.icon}`]: {\n\t\t\tcolor: theme.palette.error.contrastText,\n\t\t},\n\t\t'&:hover, &:active, &:focus': {\n\t\t\tbackground: theme.palette.error.dark,\n\t\t},\n\t},\n}));\n\nconst MenuItemIcon = styled(ListItemIcon, {\n\tname: MENU_ITEM_CLASS_NAME,\n\tslot: 'Icon',\n})(({theme}) => ({\n\t// TODO: this is repeated in multiple places\n\t// need to see about getting it under one roof - possibly under the overrides in mui theme file\n\t// It is just too darn wide\n\tminWidth: 42,\n}));\n\nconst MenuItemColorAvatar = styled(ColoredAvatar)(({theme}) => ({\n\theight: 20,\n\twidth: 20,\n\tfontSize: 12,\n\tmarginRight: theme.spacing(2),\n}));\n\nexport interface MenuItemProps\n\textends Omit>, 'classes'>,\n\t\tWithClasses<\n\t\t\tMenuItemClasses,\n\t\t\t{\n\t\t\t\tcolorAvatar?: boolean;\n\t\t\t\ticon?: IconProp;\n\t\t\t\tsecondaryText?: string;\n\t\t\t\tseverity?: 'default' | 'error';\n\t\t\t\ttext: string;\n\t\t\t}\n\t\t> {}\n\nexport const MenuItemPrimitive = React.forwardRef(\n\t(\n\t\t{\n\t\t\tclasses: _classes,\n\t\t\tclassName,\n\t\t\tcolorAvatar,\n\t\t\ticon,\n\t\t\tsecondaryText,\n\t\t\tseverity = 'default',\n\t\t\ttext,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst classes = useUtilityClasses({classes: _classes, severity});\n\n\t\treturn (\n\t\t\t\n\t\t\t\t{icon ? (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t) : colorAvatar ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\t\n\t\t\t\n\t\t);\n\t},\n);\n\nexport const MenuItem = MenuItemPrimitive;\n\nexport default MenuItem;\n","import {useEffect, useState, useCallback, useRef} from 'react';\n\n// NOTE: ultimately we should have a user preference context but atm it is not worth doing since we\n// are so far from having our entire app wrapped/converted to react\nimport Netx from '@netx/core/bootstrap';\nimport {getPreference} from '@netx/core-user/utils/getPreference';\n\ntype PrefValue = Bool extends true\n\t? boolean\n\t: string | undefined;\ntype PrefInValue = Bool extends true\n\t? boolean\n\t: any | undefined;\ntype PrefOutValue = Bool extends true\n\t? boolean\n\t: boolean | string | number | undefined;\ntype ParseInFn> = (\n\tvalue: PrefValue,\n) => I;\ntype ParseOutFn<\n\tBool extends boolean = false,\n\tI = PrefInValue,\n\tO = PrefOutValue\n> = (value: I) => O;\n\ntype DefaultValue<\n\tBool extends boolean = false,\n\tI = PrefInValue\n> = I extends undefined ? PrefValue : I;\n\ntype Options<\n\tBool extends boolean = false,\n\tI extends PrefInValue | undefined = undefined,\n\tO extends PrefOutValue | undefined = PrefOutValue\n\t// D extends DefaultValue | undefined = undefined,\n> = {\n\tasBoolean?: Bool;\n\tdefaultValue?: DefaultValue;\n\tparseOut?: ParseOutFn : I, O>;\n} & (I extends PrefInValue\n\t? {parseIn: ParseInFn}\n\t: {parseIn?: (value: PrefValue) => PrefValue});\n\n// type UseUserPrefProps<\n// \tBool extends boolean = false,\n// \tI extends PrefInValue | undefined = undefined,\n// \tO extends PrefOutValue | undefined = PrefOutValue,\n// \tD extends DefaultValue | undefined = undefined,\n// > = {\n\n// } & (I extends PrefInValue ? {options: Options} : {options?: Options})\n\n/**\n * Get and track value for a user preference\n * @param preference User preference\n * @param asBoolean Value as boolean\n * @example\n const metadataLookupsEnabled = useUserPref('category.metadataDatasetLookupEnabled', true);\n */\nexport function useUserPref<\n\tBool extends boolean = false,\n\tI extends PrefInValue | undefined = undefined,\n\tO extends PrefOutValue | undefined = PrefOutValue\n>(preference = '', options?: Options) {\n\tconst {asBoolean, parseIn, parseOut, defaultValue = null} = options || {};\n\n\tconst parseInRef = useRef(parseIn);\n\tparseInRef.current = parseIn;\n\n\tconst parseOutRef = useRef(parseOut);\n\tparseOutRef.current = parseOut;\n\n\tconst [value, setValue] = useState : I>(\n\t\tparseIn\n\t\t\t? parseIn(getPreference(preference, asBoolean))\n\t\t\t: getPreference(preference, asBoolean),\n\t);\n\n\tuseEffect(() => {\n\t\tif (preference === '') return;\n\n\t\tconst update = () => {\n\t\t\tconst prefValue = getPreference(preference, asBoolean);\n\t\t\tsetValue(\n\t\t\t\tparseInRef.current\n\t\t\t\t\t? parseInRef.current(prefValue)\n\t\t\t\t\t: prefValue == null\n\t\t\t\t\t? defaultValue\n\t\t\t\t\t: prefValue,\n\t\t\t);\n\t\t};\n\t\tNetx.user?.prefs?.on('change sync saved', update);\n\n\t\tupdate();\n\n\t\treturn () => {\n\t\t\tNetx.user?.prefs?.off('change sync saved', update);\n\t\t};\n\t}, [preference, asBoolean, defaultValue]);\n\n\t// No need to re-evaluate the `setPref` callback when `preference` changes\n\tconst preferenceRef = useRef(preference);\n\tpreferenceRef.current = preference;\n\tconst setPref = useCallback(\n\t\t(value: I extends undefined ? PrefValue : I) => {\n\t\t\tconst prefValue = parseOutRef.current\n\t\t\t\t? parseOutRef.current(value)\n\t\t\t\t: value;\n\t\t\tsetValue(value);\n\t\t\tif (preferenceRef.current === '') return;\n\t\t\tNetx.setPreference(preferenceRef.current, prefValue);\n\t\t},\n\t\t[],\n\t);\n\n\treturn [value, setPref] as const;\n}\nexport default useUserPref;\n","// import {csvToArray} from '@netx/core/utils';\n\nexport const base = (value: any) => {\n\t// // Some things still use csv (gross)\n\t// if (value != null && !Array.isArray(value) && value.toString().includes('\"'))\n\t// \treturn csvToArray(value);\n\n\treturn value;\n};\n\nexport default base;\n","export const SearchTypeMetadata = 3 as const;\nexport type TSearchTypeMetadata = typeof SearchTypeMetadata;\n\n/** elementSubType1 */\nexport enum MetadataType {\n\tMATCH_ALL_WHOLE_WORDS = 0,\n\tMATCH_EXACTLY = 1,\n\tMATCH_ANY_WHOLE_WORDS = 2,\n\tEXCLUDE = 3,\n\tMATCH_ALL_WILD_CARDS = 4,\n\tMATCH_ANY_WILD_CARDS = 5,\n\tMATCH_ANY_RANGE = 6,\n\tMATCH_VALUE_IS_EMPTY = 11,\n\tMATCH_VALUE_IS_NOT_EMPTY = 12,\n\t// Removed per https://jira.netx.net/browse/DAM-8229\n\t// Possibly related to attributes of type heirarchical?\n\t// {label: \"Options [OPTS]\", val: 7}\n}\n\nexport const MetadataNoValueTypes = [\n\tMetadataType.MATCH_VALUE_IS_NOT_EMPTY,\n\tMetadataType.MATCH_VALUE_IS_EMPTY,\n] as const;\n\nexport const MetadataSingleValueTypes = [\n\tMetadataType.EXCLUDE,\n\tMetadataType.MATCH_ALL_WHOLE_WORDS,\n\tMetadataType.MATCH_ALL_WILD_CARDS,\n\tMetadataType.MATCH_ANY_WHOLE_WORDS,\n\tMetadataType.MATCH_ANY_WILD_CARDS,\n\tMetadataType.MATCH_EXACTLY,\n] as const;\n","import {useEffect, useRef} from 'react';\n\nexport const useEnhancedRef = (value: T) => {\n\tconst oldRef = useRef(value);\n\tconst ref = useRef(value);\n\tuseEffect(() => {\n\t\toldRef.current = ref.current;\n\t\tref.current = value;\n\t}, [value]);\n\treturn [ref, oldRef] as const;\n};\n\nexport default useEnhancedRef;\n","import {i18n} from '@netx/core/i18n';\n\nexport const createValidationObject = () => {\n\treturn {\n\t\ttype: 'invalid',\n\t\tmessage: i18n.t('i18n.invalidValue'),\n\t};\n};\n\nexport default createValidationObject;\n","export const ACTIONS = {\n\tADD_CHANGES: 'ADD_CHANGES' as const,\n\tREMOVE_CHANGES: 'REMOVE_CHANGES' as const,\n\tRESET: 'RESET' as const,\n\tSET_COUNT: 'SET_COUNT' as const,\n};\n","import React, {useCallback, useEffect, useReducer, useState} from 'react';\n\nimport {ACTIONS} from './constants';\n\nexport type ID = string | number;\nexport type Field = string;\n\nexport type Action =\n\t| {type: typeof ACTIONS.ADD_CHANGES; changes: Changes}\n\t| {type: typeof ACTIONS.REMOVE_CHANGES; changes: Changes}\n\t| {type: typeof ACTIONS.RESET; changes?: Changes}\n\t| {type: typeof ACTIONS.SET_COUNT; count: number};\n\nexport type Change = Field[];\n\nexport type Changes = {\n\t[primary: string]: Change;\n};\nexport type State = {\n\tcount: number;\n\tchanges: Changes;\n};\n\nexport const initialState: State = {\n\tchanges: {},\n\tcount: 0,\n};\n\nconst reducer = (state: State, action: Action) => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.SET_COUNT:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tcount: action.count,\n\t\t\t};\n\t\tcase ACTIONS.ADD_CHANGES: {\n\t\t\tconst currentChanges = JSON.parse(JSON.stringify(state.changes));\n\t\t\tfor (const key in action.changes) {\n\t\t\t\tconst changes = action.changes[key];\n\t\t\t\tcurrentChanges[key] = !currentChanges[key]\n\t\t\t\t\t? [...new Set([...changes])]\n\t\t\t\t\t: [...new Set([...currentChanges[key], ...changes])];\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tchanges: currentChanges,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.REMOVE_CHANGES: {\n\t\t\tconst currentChanges: typeof state.changes = JSON.parse(\n\t\t\t\tJSON.stringify(state.changes),\n\t\t\t);\n\t\t\tfor (const key in action.changes) {\n\t\t\t\tconst changes = action.changes[key];\n\t\t\t\tif (currentChanges[key]) {\n\t\t\t\t\tcurrentChanges[key] = currentChanges[key].filter(\n\t\t\t\t\t\t(field) => !changes.includes(field),\n\t\t\t\t\t);\n\t\t\t\t\tif (!currentChanges[key].length) delete currentChanges[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tchanges: currentChanges,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.RESET:\n\t\t\treturn {\n\t\t\t\t...initialState,\n\t\t\t\tchanges: action.changes || initialState.changes,\n\t\t\t};\n\t}\n};\n\nexport default reducer;\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseReducer,\n} from 'react';\n\nimport {ACTIONS} from './constants';\nimport reducer, {initialState, Change, Changes, ID} from './reducer';\n\ntype ChangeContextType = {\n\tstate: typeof initialState;\n\n\tadd(primary: ID, field: string): void;\n\tget(primary: ID): Change;\n\tchanged(primary: ID, field: string): boolean;\n\tremove(primary: ID, field: string): void;\n\treset(changes?: Changes): void;\n};\n\nconst StoreContext = createContext({} as any);\n\nexport const useChangeStore = () => useContext(StoreContext);\n\nexport const ChangeStoreProvider = ({children, gridEditor}) => {\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\n\t// When update changes updates, update the count\n\tuseEffect(() => {\n\t\tconst changes = state.changes;\n\t\tlet count = 0;\n\t\tfor (const key in changes) count += changes[key].length;\n\t\tdispatch({\n\t\t\ttype: ACTIONS.SET_COUNT,\n\t\t\tcount,\n\t\t});\n\t}, [state.changes]);\n\n\tconst reset = useCallback((changes?: Changes) => {\n\t\tdispatch({type: ACTIONS.RESET, changes});\n\t}, []);\n\n\tconst get = useCallback((primary: ID) => state.changes[primary] || [], [\n\t\tstate.changes,\n\t]);\n\n\tconst changed = useCallback(\n\t\t(primary: ID, field: string) => get(primary).includes(field),\n\t\t[get],\n\t);\n\n\tconst addFieldTimeout = React.useRef();\n\tconst addField = useCallback(() => {\n\t\tconst toAdd: Changes = {};\n\t\tconst reset = () => {\n\t\t\taddFieldTimeout.current && clearTimeout(addFieldTimeout.current);\n\t\t\taddFieldTimeout.current = setTimeout(() => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.ADD_CHANGES,\n\t\t\t\t\tchanges: toAdd,\n\t\t\t\t});\n\t\t\t}, 25);\n\t\t};\n\t\treturn (primary: ID, field: string) => {\n\t\t\treset();\n\t\t\t!toAdd[primary] ? (toAdd[primary] = [field]) : toAdd[primary].push(field);\n\t\t};\n\t}, []);\n\n\tconst removeFieldTimeout = React.useRef();\n\tconst removeField = useCallback(() => {\n\t\tconst toRemove: Changes = {};\n\t\tconst reset = () => {\n\t\t\tremoveFieldTimeout.current && clearTimeout(removeFieldTimeout.current);\n\t\t\tremoveFieldTimeout.current = setTimeout(() => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.REMOVE_CHANGES,\n\t\t\t\t\tchanges: toRemove,\n\t\t\t\t});\n\t\t\t}, 25);\n\t\t};\n\t\treturn (primary: ID, field: string) => {\n\t\t\treset();\n\t\t\t!toRemove[primary]\n\t\t\t\t? (toRemove[primary] = [field])\n\t\t\t\t: toRemove[primary].push(field);\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n","export const ACTIONS = {\n\tCLEAR_STORED_DATA: 'CLEAR_STORED_DATA' as const,\n\tRESET: 'RESET' as const,\n\tSET_FIELDS: 'SET_FIELDS' as const,\n\tSET_LOADING: 'SET_LOADING' as const,\n\tSET_OVERFLOW_X: 'SET_OVERFLOW_X' as const,\n\tSET_OVERFLOW_Y: 'SET_OVERFLOW_Y' as const,\n\tSET_SAVING: 'SET_SAVING' as const,\n\tSET_STORED_DATA: 'SET_STORED_DATA' as const,\n};\n","import _ from 'underscore';\n\nimport {ACTIONS} from './constants';\nimport {AttributeValues} from '../../types';\n\nexport type State = {\n\tloading: boolean;\n\toverflownX: boolean;\n\toverflownY: boolean;\n\tsaving: boolean;\n\tstoredData: AttributeValues | null;\n};\n\nexport type Action =\n\t| {type: typeof ACTIONS.CLEAR_STORED_DATA}\n\t| {type: typeof ACTIONS.RESET}\n\t| {type: typeof ACTIONS.SET_LOADING; loading: boolean}\n\t| {type: typeof ACTIONS.SET_OVERFLOW_X; overflown: boolean}\n\t| {type: typeof ACTIONS.SET_OVERFLOW_Y; overflown: boolean}\n\t| {type: typeof ACTIONS.SET_SAVING; saving: boolean}\n\t| {type: typeof ACTIONS.SET_STORED_DATA; data: AttributeValues};\n\nexport const initialState: State = {\n\tloading: false,\n\toverflownX: false,\n\toverflownY: false,\n\tsaving: false,\n\tstoredData: null,\n};\n\nconst reducer = (state: State, action: Action) => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.CLEAR_STORED_DATA: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tstoredData: null,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.RESET: {\n\t\t\treturn initialState;\n\t\t}\n\t\tcase ACTIONS.SET_LOADING: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tloading: action.loading,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_OVERFLOW_X: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\toverflownX: action.overflown,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_OVERFLOW_Y: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\toverflownY: action.overflown,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_SAVING: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tsaving: action.saving,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_STORED_DATA: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tstoredData: action.data,\n\t\t\t};\n\t\t}\n\t}\n};\n\nexport default reducer;\n","export const base = (value: any) => value;\nexport default base;\n","import base from './base';\n\nexport const date = (value: any) => {\n\tvalue = base(value);\n\tif (Array.isArray(value)) {\n\t\tvalue = value\n\t\t\t.map((value) => {\n\t\t\t\treturn Number.isInteger(value)\n\t\t\t\t\t? value\n\t\t\t\t\t: value.replace(/(\\d+)-(\\d+)-(\\d+)/, '$2/$3/$1');\n\t\t\t})\n\t\t\t.map((value) =>\n\t\t\t\ttypeof value === 'string'\n\t\t\t\t\t? value\n\t\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t\t.map((piece) => piece.padStart(2, '0'))\n\t\t\t\t\t\t\t.join('/')\n\t\t\t\t\t: value,\n\t\t\t);\n\t} else if (typeof value === 'string') {\n\t\tvalue = value\n\t\t\t.replace(/(\\d+)-(\\d+)-(\\d+)/, '$2/$3/$1')\n\t\t\t.split('/')\n\t\t\t.map((piece) => piece.padStart(2, '0'))\n\t\t\t.join('/');\n\t}\n\treturn value;\n};\n\nexport default date;\n","import base from './base';\n\nexport const multiSelect = (value: any) => base(value);\nexport default multiSelect;\n","import base from './base';\n\nexport const number = (value: any) => base(value);\nexport default number;\n","import base from './base';\n\nexport const select = (value: any) => base(value);\nexport default select;\n","import multiSelect from './multi-select';\n\nexport const tag = (value: any) => multiSelect(value);\nexport default tag;\n","import tag from './tag';\n\nexport const semantic = (value: any) => tag(value);\nexport default semantic;\n","import tag from './tag';\n\nexport const tagVocab = (value: any) => tag(value);\nexport default tagVocab;\n","import base from './base';\n\nexport const text = (value: any) => base(value);\nexport default text;\n","import text from './text';\n\nexport const textarea = (value: any) => text(value);\nexport default textarea;\n","export * from './date';\nexport * from './multi-select';\nexport * from './number';\nexport * from './select';\nexport * from './semantic';\nexport * from './tag';\nexport * from './tag-vocab';\nexport * from './text';\nexport * from './textarea';\n\nimport date from './date';\nimport multiSelect from './multi-select';\nimport number from './number';\nimport select from './select';\nimport semantic from './semantic';\nimport tag from './tag';\nimport tag_vocab from './tag-vocab';\nimport text from './text';\nimport textarea from './textarea';\n\nimport {ATTRIBUTE_TYPE} from '../constants';\n\nexport default {\n\t[ATTRIBUTE_TYPE.DATE]: date,\n\t[ATTRIBUTE_TYPE.MULTISELECT]: multiSelect,\n\t[ATTRIBUTE_TYPE.NUMBER]: number,\n\t[ATTRIBUTE_TYPE.SELECT]: select,\n\t[ATTRIBUTE_TYPE.SEMANTIC]: semantic,\n\t[ATTRIBUTE_TYPE.TAG]: tag,\n\t[ATTRIBUTE_TYPE.TAG_VOCAB]: tag_vocab,\n\t[ATTRIBUTE_TYPE.TEXT]: text,\n\t[ATTRIBUTE_TYPE.TEXTAREA]: textarea,\n};\n","export const ACTIONS = {\n\tRESET: 'RESET' as const,\n\tSET_ALL: 'SET_ALL' as const,\n\tSET_CELLS: 'SET_CELLS' as const,\n\tSET_COLUMNS: 'SET_COLUMNS' as const,\n\tSET_COUNT: 'SET_COUNT' as const,\n\tSET_ROWS: 'SET_ROWS' as const,\n};\n","import {ACTIONS} from './constants';\n\nimport _ from 'underscore';\n\nexport type Cells = {\n\t[y: string]: number[];\n};\nexport type State = {\n\tall: boolean;\n\tcells: Cells;\n\tcolumnCount: number;\n\tcolumns: string[];\n\tcount: number;\n\tinSingleColumn: false | string;\n\tinSingleRow: false | number;\n\tloose: boolean;\n\trowCount: number;\n\trows: number[];\n};\n\nexport type Action =\n\t| {type: typeof ACTIONS.RESET}\n\t| {type: typeof ACTIONS.SET_ALL; all: boolean}\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_CELLS;\n\t\t\tcells: Cells;\n\t\t\thasColumns: boolean;\n\t\t\thasRows: boolean;\n\t }\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_COLUMNS;\n\t\t\tcolumns: string[];\n\t\t\thasRows: boolean;\n\t\t\thasSelections: boolean;\n\t }\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_COUNT;\n\t\t\tcount: number;\n\t\t\tsingleColumn: string | false;\n\t\t\tsingleRow: number | false;\n\t }\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_ROWS;\n\t\t\trows: number[];\n\t\t\thasColumns: boolean;\n\t\t\thasSelections: boolean;\n\t };\n\nexport const initialState: State = {\n\tall: false,\n\tcells: {},\n\tcolumnCount: 0,\n\tcolumns: [],\n\tcount: 0,\n\tinSingleColumn: false,\n\tinSingleRow: false,\n\tloose: false,\n\trowCount: 0,\n\trows: [],\n};\n\nconst reducer = (state: State, action: Action) => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.RESET: {\n\t\t\treturn initialState;\n\t\t}\n\t\tcase ACTIONS.SET_ALL: {\n\t\t\treturn {\n\t\t\t\t...initialState,\n\t\t\t\tcount: state.count,\n\t\t\t\tall: action.all,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_COUNT: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tcount: action.count,\n\t\t\t\tinSingleColumn: action.singleColumn,\n\t\t\t\tinSingleRow: action.singleRow,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_ROWS: {\n\t\t\tconst rows = action.rows;\n\t\t\tconst rowCount = rows.length;\n\t\t\tconst columns = action.hasColumns ? state.columns : [];\n\t\t\tconst columnCount = columns.length;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tall: false,\n\t\t\t\tcells: action.hasSelections ? state.cells : {},\n\t\t\t\tcolumnCount,\n\t\t\t\tcolumns,\n\t\t\t\tloose: action.hasSelections,\n\t\t\t\trowCount,\n\t\t\t\trows,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_COLUMNS: {\n\t\t\tconst columns = action.columns;\n\t\t\tconst columnCount = columns.length;\n\t\t\tconst rows = action.hasRows ? state.rows : [];\n\t\t\tconst rowCount = rows.length;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tall: false,\n\t\t\t\tcells: action.hasSelections ? state.cells : {},\n\t\t\t\tcolumnCount,\n\t\t\t\tcolumns,\n\t\t\t\tloose: action.hasSelections,\n\t\t\t\trowCount,\n\t\t\t\trows,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_CELLS: {\n\t\t\tconst columns = action.hasColumns ? state.columns : [];\n\t\t\tconst columnCount = columns.length;\n\t\t\tconst rows = action.hasRows ? state.rows : [];\n\t\t\tconst rowCount = rows.length;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tall: false,\n\t\t\t\tcells: action.cells,\n\t\t\t\tcolumnCount,\n\t\t\t\tcolumns,\n\t\t\t\tloose: !_.isEmpty(action.cells),\n\t\t\t\trowCount,\n\t\t\t\trows,\n\t\t\t};\n\t\t}\n\t}\n};\n\nexport default reducer;\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseReducer,\n} from 'react';\nimport equal from 'fast-deep-equal';\n\nimport {ACTIONS} from './constants';\nimport reducer, {initialState, Cells} from './reducer';\nimport {inSingleColumn, inSingleRow} from './utils';\nimport {HypergridCellEvent} from '../../types';\n\nimport PointsWebWorker from '@netx/core-grid/lib/webworkers/selection_points';\nimport {getInlineWorker} from '@netx/core/lib/underscore-netx';\n\nimport {getColumnsByName} from '../../utils';\n\ntype StoreContextType = {\n\t// dispatch: React.Dispatch;\n\tstate: typeof initialState;\n\n\tgetPoints(): Promise;\n\treset(): void;\n\tselectAll(): void;\n};\n\nconst StoreContext = createContext({} as any);\n\nexport const useSelectionStore = () =>\n\tuseContext(StoreContext);\n\nexport const SelectionStoreProvider = ({children, gridEditor}) => {\n\t// TODO: Ideally what we would do with all this data is start compressing selection down\n\t// as we check for loose cells - if someone loosely selects an entire column or row, remove\n\t// the selection from the loose data and add it it columns/rows as necessary\n\t// But hypergrid stores selections as custom rects that represent start.y, end.y, start.x, end.x\n\t// so we would need to tap deeper into hypergrid to recreate these rectangles as needed - ultimately\n\t// it proves to take a lot of work for something that may not happen and if it does, the chances\n\t// the user is dealing with a small data set is very high\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\n\tconst _inSingleColumn = inSingleColumn(gridEditor);\n\tconst _inSingleRow = inSingleRow(gridEditor);\n\n\tconst [progress, setProgress] = React.useState(null);\n\tconst timeoutRef = React.useRef();\n\n\tconst handleSelectionChangeCheck = useCallback(\n\t\t(event: HypergridCellEvent) => {\n\t\t\tif (gridEditor.selectionModel.allRowsSelected) {\n\t\t\t\tdispatch({type: ACTIONS.SET_ALL, all: true});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\t[gridEditor],\n\t);\n\n\tconst handleColumnSelectionChange = useCallback(\n\t\tasync (event: HypergridCellEvent) => {\n\t\t\tif (!handleSelectionChangeCheck(event)) return;\n\n\t\t\tconst {detail} = event;\n\t\t\tconst {columns} = gridEditor.behavior;\n\n\t\t\t// No need to update (not sure why hypergrid doesn't check this)\n\t\t\tconst columnNames = detail.columns.map((column) => columns[column]?.name);\n\t\t\tif (\n\t\t\t\tcolumnNames.length === 1 &&\n\t\t\t\tstate.columns.length === 1 &&\n\t\t\t\tcolumnNames[0] === state.columns[0]\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.SET_COLUMNS,\n\t\t\t\tcolumns: columnNames,\n\t\t\t\thasRows: !!detail.rows.length,\n\t\t\t\thasSelections: !!detail.selections.length,\n\t\t\t});\n\t\t},\n\t\t[handleSelectionChangeCheck, state.columns],\n\t);\n\n\tconst handleRowSelectionChange = useCallback(\n\t\tasync (event: HypergridCellEvent) => {\n\t\t\tif (!handleSelectionChangeCheck(event)) return;\n\n\t\t\tconst {detail} = event;\n\n\t\t\t// No need to update (not sure why hypergrid doesn't check this)\n\t\t\tif (\n\t\t\t\tdetail.rows.length === 1 &&\n\t\t\t\tstate.rows.length === 1 &&\n\t\t\t\tdetail.rows[0] === state.rows[0]\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.SET_ROWS,\n\t\t\t\thasColumns: !!detail.columns.length,\n\t\t\t\thasSelections: !!detail.selections.length,\n\t\t\t\trows: detail.rows,\n\t\t\t});\n\t\t},\n\t\t[handleSelectionChangeCheck, state.rows],\n\t);\n\n\tconst handleSelectionChange = useCallback(\n\t\tasync (event: HypergridCellEvent) => {\n\t\t\tif (!handleSelectionChangeCheck(event)) return;\n\n\t\t\tconst {detail} = event;\n\n\t\t\tconst selections = gridEditor.getSelections();\n\t\t\tconst selectionCount = selections.length;\n\n\t\t\tconst cells: Cells = {};\n\n\t\t\t// No sense in doing any of this if the grid isn't even claiming a selection\n\t\t\tif (!selectionCount) {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.SET_CELLS,\n\t\t\t\t\tcells,\n\t\t\t\t\thasRows: !!detail.rows.length,\n\t\t\t\t\thasColumns: !!detail.columns.length,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst columnCount = gridEditor.numColumns;\n\t\t\tconst rowCount = gridEditor.numRows;\n\n\t\t\t// Unfortuantely it will trigger this event for out of bound cells (cells that you may not think exist)\n\t\t\t// If I recall correctly this was on their radar but someone said that clicking in out of bound area\n\t\t\t// was to signify you want to add columns or rows - it would be nice if they just dispatched a different event\n\t\t\t// but such is life.\n\t\t\tfor (let i = 0; i < selectionCount; i++) {\n\t\t\t\tconst rect = selections[i];\n\t\t\t\tlet endX = rect.right;\n\t\t\t\tlet endY = rect.bottom;\n\t\t\t\tconst startX = rect.left;\n\t\t\t\tlet startY = rect.top;\n\t\t\t\tlet xSelected = 0;\n\t\t\t\tlet ySelected = 0;\n\n\t\t\t\t// Out of bounds - 0 cells are selected for this rect\n\t\t\t\tif (startX >= columnCount || endY < 0) return;\n\n\t\t\t\t//////////////////////////////\n\t\t\t\t// Y AXIS\n\t\t\t\t//////////////////////////////\n\t\t\t\t// If filters are on, this is absolutely necessary\n\t\t\t\t// The column header being clicked causes an entire column to be selected and a sepearate event\n\t\t\t\t// Adjust start y\n\t\t\t\tif (startY < 0) startY = 0;\n\t\t\t\t// Adjust end y\n\t\t\t\tif (endY >= rowCount) endY = rowCount - 1;\n\t\t\t\t// Our selection on the y axis\n\t\t\t\tySelected = endY - startY;\n\t\t\t\t// 0 cells selected for this rect\n\t\t\t\tif (ySelected < 0) return;\n\t\t\t\t//////////////////////////////\n\t\t\t\t// !Y AXIS\n\t\t\t\t//////////////////////////////\n\n\t\t\t\t//////////////////////////////\n\t\t\t\t// X AXIS\n\t\t\t\t//////////////////////////////\n\t\t\t\t// Clicking the row header (which would normally be out of bounds for the x axis)\n\t\t\t\t// causes an entire row selection and a spearate event - so we only need to worry about the right side bounds\n\t\t\t\t// Adjust end x\n\t\t\t\tif (endX >= columnCount) endX = columnCount - 1;\n\t\t\t\t// Our selection on the x axis\n\t\t\t\txSelected = endX - startX;\n\t\t\t\t// 0 cells selected for this rect\n\t\t\t\tif (xSelected < 0) return;\n\t\t\t\t//////////////////////////////\n\t\t\t\t// !X AXIS\n\t\t\t\t//////////////////////////////\n\n\t\t\t\t// DO NOT DO THIS- YOU HAVE NO IDEA THE SIZE OF AN ARRAY YOU MIGHT CREATE\n\t\t\t\t// Store points\n\t\t\t\t// for( var x = startX; x <= endX; x++ ) {\n\t\t\t\t// \tfor( var y = startY; y <= endY; y++ ) {\n\t\t\t\t// \t\tvar point = { x: x, y: y };\n\t\t\t\t// \t\tif( !_.findWhere( self.cells, point ) ) {\n\t\t\t\t// \t\t\tself.cells.push( point );\n\t\t\t\t// \t\t}\n\t\t\t\t// \t}\n\t\t\t\t// }\n\n\t\t\t\t// Instead- let's just track the rows and columns and not each individual point\n\t\t\t\t// TODO: what would be nice is if we could determine whole row / column selections, add them to the selectedRows / selectedColumns array and remove them from\n\t\t\t\t// the selection. Unfortunately hypergrid deals in rectangles with bounds - so it gets complicated - you would need to go through them\n\t\t\t\t// all, recreate the rectangle without the row / column. This would be preferred - but not something I want to spend the time on right now\n\t\t\t\t// as it could utlimately result in just as much (if not more) lag\n\t\t\t\t// The important thing here is that even though we are storing (potentially) a lot of data - the calculations to determine selections are better\n\t\t\t\t// and will not have to parse over each point (in most cases)\n\t\t\t\tfor (let y = startY; y <= endY; y++) {\n\t\t\t\t\tif (cells[y] === void 0) cells[y] = [];\n\t\t\t\t\tfor (let x = startX; x <= endX; x++) {\n\t\t\t\t\t\tif (cells[y].indexOf(x) < 0) cells[y].push(x);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (state.count === 1 && equal(cells, state.cells)) return;\n\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.SET_CELLS,\n\t\t\t\tcells,\n\t\t\t\thasRows: !!detail.rows.length,\n\t\t\t\thasColumns: !!detail.columns.length,\n\t\t\t});\n\t\t},\n\t\t[handleSelectionChangeCheck, state.count, state.cells],\n\t);\n\n\t// Hook up listeners\n\tuseEffect(() => {\n\t\tif (!gridEditor) return;\n\n\t\tgridEditor.addEventListener(\n\t\t\t'fin-column-selection-changed',\n\t\t\thandleColumnSelectionChange,\n\t\t);\n\t\tgridEditor.addEventListener('fin-selection-changed', handleSelectionChange);\n\t\tgridEditor.addEventListener(\n\t\t\t'fin-row-selection-changed',\n\t\t\thandleRowSelectionChange,\n\t\t);\n\t\treturn () => {\n\t\t\ttry {\n\t\t\t\tgridEditor.removeEventListener(\n\t\t\t\t\t'fin-column-selection-changed',\n\t\t\t\t\thandleColumnSelectionChange,\n\t\t\t\t);\n\t\t\t\tgridEditor.removeEventListener(\n\t\t\t\t\t'fin-selection-changed',\n\t\t\t\t\thandleSelectionChange,\n\t\t\t\t);\n\t\t\t\tgridEditor.removeEventListener(\n\t\t\t\t\t'fin-row-selection-changed',\n\t\t\t\t\thandleRowSelectionChange,\n\t\t\t\t);\n\t\t\t} catch (ex) {}\n\t\t};\n\t}, [\n\t\thandleColumnSelectionChange,\n\t\thandleSelectionChange,\n\t\thandleRowSelectionChange,\n\t]);\n\n\tuseEffect(() => {\n\t\ttimeoutRef.current && clearTimeout(timeoutRef.current);\n\n\t\tif (!gridEditor) return;\n\n\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\tconst singleColumn = _inSingleColumn(state);\n\t\t\tconst singleRow = _inSingleRow(state);\n\n\t\t\tconst columns = gridEditor.getColumns();\n\n\t\t\tconst {numColumns, numRows} = gridEditor;\n\n\t\t\tlet count = 0;\n\t\t\tif (state.all) {\n\t\t\t\tcount = numRows * numColumns;\n\t\t\t} else {\n\t\t\t\tconst cells = state.cells;\n\t\t\t\tlet cellCount = 0;\n\n\t\t\t\t// Do not include cells within selected columns/rows\n\t\t\t\tfor (const key in cells) {\n\t\t\t\t\tif (!cells.hasOwnProperty(key)) continue;\n\n\t\t\t\t\tconst row = parseInt(key);\n\t\t\t\t\tif (state.rows.includes(row)) continue;\n\n\t\t\t\t\tconst cols = cells[key];\n\t\t\t\t\tfor (let i = 0, c = cols.length; i < c; i++) {\n\t\t\t\t\t\tconst column = columns[cols[i]];\n\t\t\t\t\t\tif (!column || !state.columns.includes(column.name)) cellCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Total cells that will be collected\n\t\t\t\tcount =\n\t\t\t\t\tcellCount +\n\t\t\t\t\tstate.columnCount * numRows +\n\t\t\t\t\tstate.rowCount * numColumns -\n\t\t\t\t\tstate.columnCount * state.rowCount;\n\t\t\t}\n\n\t\t\tdispatch({type: ACTIONS.SET_COUNT, count, singleColumn, singleRow});\n\t\t}, 50);\n\t}, [state.all, state.cells, state.columns, state.rows, gridEditor]);\n\n\tconst reset = useCallback(() => {\n\t\tdispatch({type: ACTIONS.RESET});\n\t\tgridEditor.selectionModel.clear();\n\t\tgridEditor.repaint();\n\t}, [gridEditor]);\n\n\tconst selectAll = useCallback(() => {\n\t\tif (state.all) return;\n\t\tgridEditor.toggleSelectAllRows();\n\t}, [state.all, gridEditor]);\n\n\tconst getPoints = useCallback((): Promise => {\n\t\t// 10,000 rows at 1,000 columns (10,000,000 points) takes 56ms\n\t\t// Which is 3.5 times longer than the refresh rete (16ms)\n\t\t// Using a web worker increaes this delay to 200ms but does not cause any\n\t\t// hesitation in the browser\n\n\t\t// 30,000 rows at 250 columns (7,500,000 points) 298ms\n\t\t// 20,000 rows at 500 columns (10,000,000 points) 264ms\n\t\t// 15,000 rows at 1000 columns (15,000,000 points) 1.378s\n\n\t\tconst columnsByName = getColumnsByName(gridEditor.behavior.columns);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst worker = getInlineWorker(PointsWebWorker);\n\t\t\t// @ts-ignore\n\t\t\tworker.onmessage = _.throttle(\n\t\t\t\tfunction (e) {\n\t\t\t\t\tconst {data} = e;\n\t\t\t\t\tsetProgress(data.progress);\n\t\t\t\t\tif (data.progress === 100) {\n\t\t\t\t\t\tsetProgress(100);\n\t\t\t\t\t\tresolve(data.points);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t16,\n\t\t\t\t{trailing: true},\n\t\t\t);\n\n\t\t\tworker.postMessage({\n\t\t\t\tall: state.all,\n\t\t\t\tcells: state.cells,\n\t\t\t\tcolumns: state.columns.map(\n\t\t\t\t\t(columnName) => columnsByName[columnName]?._index,\n\t\t\t\t),\n\t\t\t\trows: state.rows,\n\t\t\t\ttotalColumns: gridEditor.numColumns,\n\t\t\t\ttotalRows: gridEditor.numRows,\n\t\t\t});\n\t\t});\n\t}, [state.all, state.cells, state.columns, state.rows, gridEditor]);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n","import {State} from './reducer';\nimport _ from 'underscore';\n\nexport const inSingleColumn = (plugin) => (state: State) => {\n\tconst looseRowCount = Object.keys(state.cells).length;\n\tif (\n\t\tstate.columnCount > 1 ||\n\t\t(state.columnCount > 0 && looseRowCount) ||\n\t\tstate.rowCount > 1 ||\n\t\t(state.rowCount === 1 && plugin.numColumns > 1)\n\t) {\n\t\treturn false;\n\t}\n\n\tconst selections = state.cells;\n\tif (!_.isEmpty(selections)) {\n\t\tlet selectedColumn = false as string | false;\n\t\tconst columns = plugin.behavior.columns;\n\t\t// Let's go old school so we can break out of the loop when all is lost\n\t\t// Not breaking at that point could be disasterous on the broswer as we could have a lot\n\t\t// of selections\n\t\tfor (const key in selections) {\n\t\t\tif (!selections.hasOwnProperty(key)) continue;\n\n\t\t\tconst columnIndex = selections[key][0];\n\t\t\tconst column = columns[columnIndex];\n\t\t\tif (!column) return false;\n\n\t\t\t// Must have only one column\n\t\t\t// Column must match any previous column found\n\t\t\tif (\n\t\t\t\tselections[key].length === 1 &&\n\t\t\t\t(selectedColumn === false || selectedColumn === column.name)\n\t\t\t) {\n\t\t\t\tselectedColumn = column.name;\n\t\t\t}\n\t\t\t// Everything is ruined\n\t\t\telse {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn selectedColumn;\n\t}\n\n\tif (state.columnCount === 1) {\n\t\treturn state.columns[0];\n\t}\n\n\treturn false;\n};\n\nexport const inSingleRow = (plugin) => (state: State) => {\n\tconst looseRowCount = Object.keys(state.cells).length;\n\tif (\n\t\tstate.rowCount > 1 ||\n\t\t(state.columnCount && plugin.numRows > 1) ||\n\t\t(state.rowCount > 0 && looseRowCount)\n\t) {\n\t\treturn false;\n\t}\n\n\tconst cells = state.cells;\n\n\tconst {numColumns} = plugin;\n\n\t// Check loose selections\n\tif (!_.isEmpty(cells) && !state.rows.length) {\n\t\tconst keys = Object.keys(cells);\n\t\tlet selectedRow = false as number | false;\n\t\t// Must have only one row key\n\t\t// And that row must have an array with all the column indexes in it\n\t\tif (keys.length === 1 && cells[keys[0]].length === numColumns) {\n\t\t\tselectedRow = parseInt(keys[0]);\n\t\t}\n\t\treturn selectedRow;\n\t}\n\n\t// Else we must have only 1 row in the row selection\n\tif (state.rowCount === 1) {\n\t\treturn state.rows[0];\n\t}\n\n\treturn false;\n};\n","export const ACTIONS = {\n\tUPDATE: 'UPDATE' as const,\n};\n","import {ACTIONS} from './constants';\n\nexport type Action = {type: typeof ACTIONS.UPDATE; progress: number};\n\nexport type State = {\n\tmessage: string;\n\tprogress: number;\n\tworking: boolean;\n};\n\nexport const initialState: State = {\n\tmessage: '',\n\tprogress: 0,\n\tworking: false,\n};\n\nconst reducer = (state: State, action: Action) => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.UPDATE: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tprogress: action.progress,\n\t\t\t\tworking: action.progress > 0 && action.progress < 100,\n\t\t\t};\n\t\t}\n\t}\n};\n\nexport default reducer;\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseReducer,\n\tuseRef,\n} from 'react';\n\nimport {ACTIONS} from './constants';\n\nimport _ from 'underscore';\n\nimport reducer, {initialState} from './reducer';\n\ntype StoreContextType = {\n\tstate: typeof initialState;\n\n\tupdate(progress: number): void;\n};\n\nconst StoreContext = createContext({} as any);\n\nexport const useProgressStore = () =>\n\tuseContext(StoreContext);\n\nexport const ProgressStoreProvider = ({children}) => {\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\n\tconst updateTimeoutRef = useRef();\n\tconst updateRequestedAtRef = useRef(0);\n\n\tconst update = useCallback((progress: number) => {\n\t\tupdateTimeoutRef.current && clearTimeout(updateTimeoutRef.current);\n\n\t\tconst now = Date.now();\n\t\tif (!updateRequestedAtRef.current) updateRequestedAtRef.current = now;\n\n\t\tif (now - updateRequestedAtRef.current > 20 || progress === 100) {\n\t\t\tdispatch({type: ACTIONS.UPDATE, progress});\n\t\t\tupdateTimeoutRef.current = setTimeout(() => {\n\t\t\t\tdispatch({type: ACTIONS.UPDATE, progress});\n\t\t\t}, 30);\n\t\t}\n\n\t\tif (progress === 100) {\n\t\t\tupdateRequestedAtRef.current = 0;\n\t\t}\n\n\t\treturn () => {\n\t\t\tupdateTimeoutRef.current && clearTimeout(updateTimeoutRef.current);\n\t\t};\n\t}, []);\n\n\tconst storeValue: StoreContextType = useMemo(\n\t\t() => ({\n\t\t\tstate,\n\t\t\tupdate,\n\t\t}),\n\t\t[state, update],\n\t);\n\n\treturn (\n\t\t{children}\n\t);\n};\n","import {useCallback} from 'react';\n\nimport {dispatcher} from '@netx/core/bootstrap';\n\nimport BatchJobModel, {BatchJobId} from '@netx/core-app/models/batchJob';\nimport {useRpc} from '@netx/core-components/hooks';\nimport {useSnackbar} from '@netx/core-components/Snackbar';\n\nimport {useProgressStore} from '../../';\nimport {errors, messages} from '../../../properties';\nimport {SetAssetAttributesSchema} from '../../../schema';\n\nexport const poll = (\n\tuuid: BatchJobId,\n\tupdatedData: SetAssetAttributesSchema[],\n\tprogress: ReturnType,\n) => {\n\tconst batchJob = new BatchJobModel({uuid}, {pollInterval: 500});\n\n\treturn new Promise((resolve, reject) => {\n\t\tbatchJob\n\t\t\t.on('progress', (model, prog) => progress.update(prog))\n\t\t\t.on('complete', () => {\n\t\t\t\tbatchJob.garbageCollect();\n\t\t\t\tdispatcher.trigger('asset:tagPanel:grid:submit:succeeded', updatedData);\n\t\t\t\tresolve();\n\t\t\t})\n\t\t\t.on('error', reject);\n\t}).finally(() => {\n\t\tbatchJob.garbageCollect();\n\t});\n};\n\nexport default function useSet() {\n\tconst rpc = useRpc();\n\tconst snackbar = useSnackbar();\n\n\tconst save = useCallback(\n\t\tasync (\n\t\t\tupdatedData: SetAssetAttributesSchema[],\n\t\t\tprogress: ReturnType,\n\t\t) => {\n\t\t\ttry {\n\t\t\t\tconst uuid = await rpc('setAssetAttributes', [updatedData]);\n\t\t\t\tawait poll(uuid, updatedData, progress);\n\t\t\t\tsnackbar({\n\t\t\t\t\tmessage: messages.saveSuccess,\n\t\t\t\t\tseverity: 'success',\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tsnackbar({\n\t\t\t\t\tmessage: errors.update[error?.code] || errors.update.default,\n\t\t\t\t\tseverity: 'error',\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\t[],\n\t);\n\n\treturn save;\n}\n","import {breakItUp, getColumnsFromGrid, getDataFromGrid} from '../../../utils';\nimport {AttributeValues, GridEditor, Permissions} from '../../../types';\nimport equal from 'fast-deep-equal';\n\nconst getAllValues = async (\n\tgridEditor: GridEditor,\n\tpermissions: Permissions,\n\tsetProgress?: (progress: number) => void,\n): Promise => {\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.time('get-values/all');\n\t}\n\n\tconst {round} = Math;\n\n\tconst data = getDataFromGrid(gridEditor);\n\tconst columns = getColumnsFromGrid(gridEditor);\n\n\tconst attrValues: AttributeValues = {};\n\tconst size = data.length;\n\tconst amount = size <= 10 ? 1 : 10;\n\n\tconst valuesWritables: Record = {};\n\n\tawait breakItUp(\n\t\t{\n\t\t\tamount,\n\t\t\tsize,\n\t\t},\n\t\t(index) => {\n\t\t\tsetProgress && setProgress(round(((index + 1) / size) * 100));\n\n\t\t\tconst rowData = data[index];\n\t\t\tconst perms = permissions[rowData.assetId];\n\n\t\t\tcolumns.forEach(({name, properties}) => {\n\t\t\t\tconst existing = attrValues[name];\n\n\t\t\t\tif (!valuesWritables[name]) valuesWritables[name] = [];\n\t\t\t\tvaluesWritables[name].push(\n\t\t\t\t\t!properties.readOnly && (!perms || !perms.includes(name)),\n\t\t\t\t);\n\n\t\t\t\tif (\n\t\t\t\t\t//properties.readOnly ||\n\t\t\t\t\tattrValues[name]?.multipleValues // ||\n\t\t\t\t\t//(perms && perms.includes(name))\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tconst value = properties.parseOutValue\n\t\t\t\t\t? properties.parseOutValue(rowData[name])\n\t\t\t\t\t: rowData[name];\n\n\t\t\t\tif (existing === void 0) {\n\t\t\t\t\tattrValues[name] = {value};\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (equal(value, existing.value)) return;\n\n\t\t\t\tattrValues[name] = {\n\t\t\t\t\tmultipleValues: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t);\n\n\tObject.entries(valuesWritables).forEach(([name, writable]) => {\n\t\tattrValues[name].readOnly = !writable.some((w) => w === true);\n\t});\n\n\tsetProgress && setProgress(100);\n\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.timeEnd('get-values/all');\n\t}\n\n\treturn attrValues;\n};\n\nexport default getAllValues;\n","import {\n\tbreakItUp,\n\tgetDataFromGrid,\n\tgetColumnsFromGrid,\n\tgetSortIndexesFromGrid,\n} from '../../../utils';\nimport equal from 'fast-deep-equal';\nimport {AttributeValues, GridEditor, Permissions} from '../../../types';\n\nimport {useSelectionStore} from '../../selection';\n\nimport all from './all';\n\nconst getValues = (\n\tgridEditor: GridEditor,\n\tselectionStore: ReturnType,\n\tpermissions: Permissions,\n\tsetProgress: (progress: number) => void,\n\tignoreParseOut?: boolean,\n) => {\n\tlet aborted = false;\n\tlet completed = false;\n\n\tconst worker = async () => {\n\t\tif (selectionStore.state.all)\n\t\t\treturn all(gridEditor, permissions, setProgress);\n\n\t\tconst {round} = Math;\n\n\t\tconst data = getDataFromGrid(gridEditor);\n\t\tconst columns = getColumnsFromGrid(gridEditor);\n\t\tconst sortIndex = getSortIndexesFromGrid(gridEditor);\n\t\tconst {numColumns} = gridEditor;\n\n\t\tconst selectedColumnObjects = columns.filter((column) =>\n\t\t\tselectionStore.state.columns.includes(column.name),\n\t\t);\n\t\tconst selectedColumnCount = selectedColumnObjects.length;\n\n\t\tconst attrValues: AttributeValues = {};\n\t\tconst valuesWritables: Record = {};\n\n\t\tconst selectedRows = selectionStore.state.rows;\n\t\tconst selectedRowCount = selectionStore.state.rowCount;\n\n\t\tconst rowIndexesUpdating: number[] = selectedRows;\n\t\tconst columnIndexesUpdating: number[] = selectedColumnObjects.map(\n\t\t\t(column) => column._index,\n\t\t);\n\n\t\tlet processCount = 3;\n\t\tif (!selectedRowCount) processCount--;\n\t\tif (!selectedColumnCount) processCount--;\n\t\tif (!selectionStore.state.loose) processCount--;\n\n\t\tif (selectedRowCount) {\n\t\t\t// First rows\n\t\t\tconst rowAmount = selectedRowCount <= 100 ? 25 : 100;\n\t\t\tawait breakItUp(\n\t\t\t\t{\n\t\t\t\t\tamount: rowAmount,\n\t\t\t\t\tsize: selectedRowCount,\n\t\t\t\t},\n\t\t\t\t(index) => {\n\t\t\t\t\tif (aborted) return false;\n\n\t\t\t\t\tsetProgress(\n\t\t\t\t\t\tround(((index + 1) / selectedRowCount / processCount) * 100),\n\t\t\t\t\t);\n\n\t\t\t\t\tconst rowIndex = selectedRows[index];\n\t\t\t\t\tconst realIndex = sortIndex[rowIndex];\n\t\t\t\t\tconst rowData = data[realIndex];\n\t\t\t\t\tif (!rowData) return;\n\n\t\t\t\t\tconst perms = permissions[rowData.assetId];\n\n\t\t\t\t\tfor (let x = 0, y = numColumns; x < y; x++) {\n\t\t\t\t\t\tconst column = columns[x];\n\t\t\t\t\t\tif (!column) continue;\n\n\t\t\t\t\t\tconst {name, properties} = column;\n\t\t\t\t\t\tconst existing = attrValues[name];\n\n\t\t\t\t\t\tif (!valuesWritables[name]) valuesWritables[name] = [];\n\t\t\t\t\t\tvaluesWritables[name].push(\n\t\t\t\t\t\t\t!properties.readOnly && (!perms || !perms.includes(name)),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t// properties.readOnly ||\n\t\t\t\t\t\t\texisting?.multipleValues // ||\n\t\t\t\t\t\t\t// (perms && perms.includes(name))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tconst value = ignoreParseOut\n\t\t\t\t\t\t\t? rowData[name]\n\t\t\t\t\t\t\t: properties.parseOutValue\n\t\t\t\t\t\t\t? properties.parseOutValue(rowData[name])\n\t\t\t\t\t\t\t: rowData[name];\n\n\t\t\t\t\t\tif (existing === void 0) {\n\t\t\t\t\t\t\tattrValues[name] = {value};\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!equal(value, existing.value)) {\n\t\t\t\t\t\t\tattrValues[name] = {\n\t\t\t\t\t\t\t\tmultipleValues: true,\n\t\t\t\t\t\t\t\tvalue: undefined,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tif (aborted) return;\n\n\t\t// Then get columns\n\t\tif (selectedColumnCount) {\n\t\t\tconst dataSize = data.length;\n\t\t\tconst columnAmount = dataSize <= 100 ? 25 : 100;\n\t\t\tconst multiValueFields: string[] = [];\n\t\t\tawait breakItUp(\n\t\t\t\t{\n\t\t\t\t\tamount: columnAmount,\n\t\t\t\t\tsize: data.length,\n\t\t\t\t},\n\t\t\t\t(index) => {\n\t\t\t\t\tif (aborted) return false;\n\n\t\t\t\t\tsetProgress(round(((index + 1) / dataSize / processCount) * 100));\n\n\t\t\t\t\tif (rowIndexesUpdating.includes(index)) return;\n\n\t\t\t\t\tconst realIndex = sortIndex[index];\n\t\t\t\t\tconst rowData = data[realIndex];\n\t\t\t\t\tif (!rowData) return;\n\n\t\t\t\t\tconst perms = permissions[rowData.assetId];\n\n\t\t\t\t\tif (multiValueFields.length === selectedColumnCount) return false;\n\n\t\t\t\t\tfor (let x = 0, total = selectedColumnCount; x < total; x++) {\n\t\t\t\t\t\tconst columnObject = selectedColumnObjects[x];\n\t\t\t\t\t\tif (!columnObject) continue;\n\n\t\t\t\t\t\tconst {name, properties} = columnObject;\n\t\t\t\t\t\tconst existing = attrValues[name];\n\n\t\t\t\t\t\tif (!valuesWritables[name]) valuesWritables[name] = [];\n\t\t\t\t\t\tvaluesWritables[name].push(\n\t\t\t\t\t\t\t!properties.readOnly && (!perms || !perms.includes(name)),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\texisting?.multipleValues // ||\n\t\t\t\t\t\t\t//properties.readOnly ||\n\t\t\t\t\t\t\t// (perms && perms.includes(name))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tconst value = ignoreParseOut\n\t\t\t\t\t\t\t? rowData[name]\n\t\t\t\t\t\t\t: properties.parseOutValue\n\t\t\t\t\t\t\t? properties.parseOutValue(rowData[columnObject.name])\n\t\t\t\t\t\t\t: rowData[name];\n\n\t\t\t\t\t\tif (existing === void 0) {\n\t\t\t\t\t\t\tattrValues[name] = {value};\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (equal(value, existing.value)) continue;\n\n\t\t\t\t\t\tmultiValueFields.push(name);\n\t\t\t\t\t\tattrValues[name] = {\n\t\t\t\t\t\t\tmultipleValues: true,\n\t\t\t\t\t\t\tvalue: undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tif (aborted) return;\n\n\t\t// Then points\n\t\tif (selectionStore.state.loose) {\n\t\t\tconst points = await selectionStore.getPoints();\n\t\t\tconst pointsSize = points.length;\n\t\t\tconst amount = pointsSize <= 100 ? 25 : 100;\n\t\t\tawait breakItUp(\n\t\t\t\t{\n\t\t\t\t\tamount,\n\t\t\t\t\tsize: pointsSize,\n\t\t\t\t\tincrement: 2,\n\t\t\t\t},\n\t\t\t\t(index) => {\n\t\t\t\t\tif (aborted) return false;\n\n\t\t\t\t\tsetProgress(round(((index + 1) / pointsSize / processCount) * 100));\n\n\t\t\t\t\tconst x = points[index];\n\t\t\t\t\tconst y = points[index + 1];\n\n\t\t\t\t\tconst realIndex = sortIndex[y];\n\t\t\t\t\tconst rowData = data[realIndex];\n\t\t\t\t\tconst column = columns[x];\n\t\t\t\t\tif (!rowData || !column) return;\n\n\t\t\t\t\tconst {name, properties} = column;\n\t\t\t\t\tconst existing = attrValues[name];\n\t\t\t\t\tconst perms = permissions[rowData.assetId];\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tcolumnIndexesUpdating.includes(x) ||\n\t\t\t\t\t\trowIndexesUpdating.includes(y)\n\t\t\t\t\t)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif (!valuesWritables[name]) valuesWritables[name] = [];\n\t\t\t\t\tvaluesWritables[name].push(\n\t\t\t\t\t\t!properties.readOnly && (!perms || !perms.includes(name)),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t// columnIndexesUpdating.includes(x) ||\n\t\t\t\t\t\t// rowIndexesUpdating.includes(y) ||\n\t\t\t\t\t\texisting?.multipleValues // ||\n\t\t\t\t\t\t// properties.readOnly ||\n\t\t\t\t\t\t// (perms && perms.includes(name))\n\t\t\t\t\t)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tconst value = ignoreParseOut\n\t\t\t\t\t\t? rowData[name]\n\t\t\t\t\t\t: properties.parseOutValue\n\t\t\t\t\t\t? properties.parseOutValue(rowData[name])\n\t\t\t\t\t\t: rowData[name];\n\n\t\t\t\t\tif (existing === void 0) {\n\t\t\t\t\t\tattrValues[name] = {value};\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (equal(value, existing.value)) return;\n\n\t\t\t\t\tattrValues[name] = {\n\t\t\t\t\t\tmultipleValues: true,\n\t\t\t\t\t\tvalue: undefined,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tif (aborted) return;\n\n\t\tObject.entries(valuesWritables).forEach(([name, writable]) => {\n\t\t\tattrValues[name].readOnly = !writable.some((w) => w === true);\n\t\t});\n\n\t\tsetProgress(100);\n\t\tcompleted = true;\n\n\t\treturn attrValues;\n\t};\n\n\treturn {\n\t\tabort() {\n\t\t\tif (aborted) return;\n\t\t\taborted = true;\n\t\t\t!completed && setProgress(100);\n\t\t},\n\t\tjob: worker(),\n\t};\n};\n\nexport default getValues;\n","import {useChangeStore} from '../../change';\nimport {GridEditor, Permissions} from '../../../types';\nimport {breakItUp, getAppendChar, getUpdatedValueData} from '../../../utils';\nimport {FormActions, FormValues} from '@netx/core-components/Form';\n\nconst updateAllValues = async (\n\tgridEditor: GridEditor,\n\tchangeStore: ReturnType,\n\tinitialValues: FormValues[],\n\tvalues: FormValues,\n\tpermissions: Permissions,\n\tactions: FormActions = {},\n\tsetProgress?: (progress: number) => void,\n) => {\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.time('set-values/all');\n\t}\n\n\tconst {round} = Math;\n\n\tconst updatingFields = Object.keys(values);\n\n\tconst data = gridEditor.behavior.dataModel.dataSource.data;\n\tconst columns = gridEditor.behavior.columns;\n\tconst sortIndex = gridEditor.behavior.dataModel.sortIndex;\n\n\tconst updatingColumnObjects = columns.filter((column) =>\n\t\tupdatingFields.includes(column.name),\n\t);\n\tconst updatingFieldCount = updatingColumnObjects.length;\n\n\tconst appendChar = getAppendChar();\n\tconst size = data.length;\n\n\tconst amount = size <= 10 ? 1 : 10;\n\tawait breakItUp(\n\t\t{\n\t\t\tamount,\n\t\t\tsize,\n\t\t},\n\t\t(index) => {\n\t\t\tsetProgress && setProgress(round(((index + 1) / size) * 100));\n\n\t\t\tconst realIndex = sortIndex.indexOf(index);\n\t\t\tconst rowData = data[realIndex];\n\t\t\tif (!rowData) return;\n\n\t\t\tconst {assetId} = rowData;\n\t\t\tconst perms = permissions[assetId];\n\n\t\t\tfor (let x = 0; x < updatingFieldCount; x++) {\n\t\t\t\tconst column = updatingColumnObjects[x];\n\t\t\t\tif (!column) continue;\n\t\t\t\tconst {name} = column;\n\n\t\t\t\tif (perms && perms.includes(name)) continue;\n\n\t\t\t\tconst valueData = getUpdatedValueData(\n\t\t\t\t\tassetId,\n\t\t\t\t\tvalues,\n\t\t\t\t\trowData,\n\t\t\t\t\tinitialValues,\n\t\t\t\t\tcolumn,\n\t\t\t\t\tactions,\n\t\t\t\t\tappendChar,\n\t\t\t\t);\n\n\t\t\t\tif (!valueData) continue;\n\n\t\t\t\tvalueData.changed\n\t\t\t\t\t? changeStore.add(assetId, name)\n\t\t\t\t\t: changeStore.remove(assetId, name);\n\n\t\t\t\trowData[name] = valueData.value;\n\t\t\t}\n\t\t},\n\t);\n\n\tgridEditor.repaint();\n\tgridEditor.takeFocus();\n\n\tsetProgress && setProgress(100);\n\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.timeEnd('set-values/all');\n\t}\n};\n\nexport default updateAllValues;\n","import {useChangeStore} from '../../change';\nimport {GridEditor} from '../../../types';\nimport {\n\tbreakItUp,\n\tgetColumnsFromGrid,\n\tgetColumnsByName,\n\tgetDataFromGrid,\n} from '../../../utils';\n\nimport {FormValues} from '@netx/core-components/Form';\n\nexport default async function all(\n\tgridEditor: GridEditor,\n\tchangeStore: ReturnType,\n\tinitialValues: FormValues[],\n\tsetProgress?: (progress: number) => void,\n) {\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.time('reset-values/all');\n\t}\n\n\tconst {round} = Math;\n\n\tconst changes = changeStore.state.changes;\n\tconst data = getDataFromGrid(gridEditor);\n\tconst columns = getColumnsFromGrid(gridEditor);\n\tconst columnsByNames = getColumnsByName(columns);\n\n\tconst keys = Object.keys(changes);\n\tconst size = keys.length;\n\n\tconst amount = size <= 10 ? 1 : 10;\n\n\tawait breakItUp(\n\t\t{\n\t\t\tamount,\n\t\t\tsize,\n\t\t},\n\t\t(index) => {\n\t\t\tsetProgress && setProgress(round(((index + 1) / size) * 100));\n\n\t\t\tconst assetId = parseInt(keys[index]);\n\n\t\t\tconst rowData = data.find((d) => d.assetId === assetId);\n\t\t\tif (!rowData) return;\n\n\t\t\tconst originalRowData = initialValues.find((d) => d.assetId === assetId);\n\t\t\tif (!originalRowData) return;\n\n\t\t\tchanges[assetId].forEach((field) => {\n\t\t\t\tconst column = columnsByNames[field];\n\t\t\t\tif (!column) return;\n\t\t\t\trowData[field] = column.properties.parseInValue\n\t\t\t\t\t? column.properties.parseInValue(originalRowData[field])\n\t\t\t\t\t: originalRowData[field];\n\t\t\t});\n\t\t},\n\t);\n\tchangeStore.reset();\n\tgridEditor.repaint();\n\n\tsetProgress && setProgress(100);\n\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.timeEnd('reset-values/all');\n\t}\n}\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseReducer,\n\tuseRef,\n} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\nimport {dispatcher} from '@netx/core/bootstrap';\n\nimport {isEmptyValue} from '@netx/core/lib/underscore-netx';\n\nimport _ from 'underscore';\n\nimport {ACTIONS} from './constants';\nimport reducer, {initialState} from './reducer';\n\nimport {\n\tbreakItUp,\n\tcheckEquality,\n\tgetColumnsByName,\n\tgetColumnFromGrid,\n\tgetColumnsFromGrid,\n\tgetDataFromGrid,\n\tgetDataPointFromCellEvent,\n\tgetSortIndexesFromGrid,\n} from '../../utils';\n\nimport {AttributeAttributes} from '@netx/core-asset/models/attribute';\nimport attributeValidators from '@netx/core-attribute/validators';\nimport attributeFormatters from '@netx/core-attribute/formatters';\nimport attributeParsersOut from '@netx/core-attribute/parsers-out';\nimport attributeParsers from '@netx/core-attribute/parsers';\nimport {FormActions, FormValues} from '@netx/core-components/Form';\n\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\n\nimport {useChangeStore} from '../change';\nimport {useSelectionStore} from '../selection';\nimport {useProgressStore} from '../progress';\n\nimport {SearchAssetAttributesSchema} from '../../schema/searchAssetAttributes';\nimport {\n\tSetAssetAttributesSchema,\n\tSetAssetAttributesAttribute,\n} from '../../schema';\nimport {parseValue} from '@netx/core-attribute/utils';\n\nimport {\n\tColumnProps,\n\tColumnSchema,\n\tDataRow,\n\tGridEditor,\n\tGridEditorColumn,\n\tHypergridCellEvent,\n\tPermissions,\n} from '../../types';\nimport {types} from '@netx/core-asset/properties/attributes';\n\nimport {useGetData, useSaveData} from './data';\n\nimport {useAttributeSetSelectionProvider} from '@netx/core-attribute-set-selection/context';\nimport {useCurrentCart} from '@netx/core-cart-current';\n\nimport {loose as _getSelectedValues} from './get-values';\nimport {\n\tloose as updateSelectedValues,\n\tspecific as updateSpecificValues,\n} from './set-values';\nimport {\n\tall as resetAllValues,\n\tloose as resetSelectedValues,\n} from './reset-values';\n\ntype GridContextType = {\n\tstate: typeof initialState;\n\t// attributeSetId: string;\n\tgetCloneData(\n\t\ty: number,\n\t):\n\t\t| {\n\t\t\t\tcloneData: Record;\n\t\t\t\tcloneFields: GridEditorColumn[];\n\t\t\t\tcloneSchema: Record[] | undefined;\n\t\t\t\tcloneTargets: Record[];\n\t\t }\n\t\t| undefined;\n\tgetSelectedValues(): Promise;\n\tresetAllChanges(): Promise;\n\tresetSelectedChanges(): Promise;\n\tresetStore(): void;\n\tsave(): Promise;\n\tsetData(data: FormValues[], schema: Record[]): void;\n\tupdateData(values: FormValues, actions?: FormActions): Promise;\n};\n\nconst StoreContext = createContext({} as any);\n\nexport const useGridStore = () => useContext(StoreContext);\n\nconst getColumnPropsForAttribute = (attr: AttributeAttributes) => {\n\tconst type = types[attr.type];\n\n\tconst props: ColumnProps = {\n\t\tname: attr.name,\n\t\theader: attr.name,\n\t\ttype,\n\t\tid: attr.attributeid,\n\t\titems: null,\n\t\tmultiline: attr.type === 2,\n\t\tmultivalue: attr.multivalue,\n\t\trequired: attr.mandatory === 1,\n\t\treadOnly: attr.permission === 'r',\n\t\ttypeId: attr.type,\n\t\t// Tags and semantics\n\t\tsemanticTypeId: attr.semanticTypeId,\n\t\tspec1: attr.spec1,\n\t\tspec2: attr.spec2,\n\n\t\t// For editing\n\t\tlocalizer: {\n\t\t\tformat: (value, opts) => attributeFormatters[attr.type](value, attr),\n\t\t\tparse: (value) => attributeParsers[attr.type](value),\n\t\t\tinvalid: (value: any) => {\n\t\t\t\tconst valid = attributeValidators[attr.type](value);\n\t\t\t\tif (valid === true) return false;\n\t\t\t\tif (valid instanceof Error) {\n\t\t\t\t\treturn valid.message;\n\t\t\t\t}\n\t\t\t\treturn i18n.t('i18n.invalid');\n\t\t\t},\n\t\t},\n\t\tparseOutValue: (value) => attributeParsersOut[attr.type](value),\n\t\t// For display\n\t\tformatValue: (value, opts) => attributeFormatters[attr.type](value, attr),\n\t\tparseInValue: (value) => attributeParsers[attr.type](value),\n\t};\n\n\tswitch (type) {\n\t\tcase 'select':\n\t\tcase 'multiselect':\n\t\t\tprops.items = attr.pulldownOptions;\n\t\t\tbreak;\n\t\tcase 'number':\n\t\t\tprops.type = attr.spec2 && attr.spec2 !== 4 ? 'float' : 'int';\n\t\t\tbreak;\n\t\tcase 'tagVocab':\n\t\t\tprops.type = 'tag';\n\t\t\tbreak;\n\t}\n\n\treturn props;\n};\n\nconst getCellEditor = (\n\tplugin: GridEditor,\n\tpermissionsRef: React.RefObject,\n): GridEditor['behavior']['dataModel']['getCellEditorAt'] => (\n\tx,\n\ty,\n\tdeclaredEditorName,\n\tcellEvent,\n) => {\n\tconst permissions = permissionsRef?.current || {};\n\n\tconst column = getColumnFromGrid(plugin, x);\n\tif (column.properties.readOnly) return null;\n\n\tif (y > 0) y--;\n\n\tconst data = getDataFromGrid(plugin);\n\tconst indexes = getSortIndexesFromGrid(plugin);\n\tconst realIndex = indexes[y];\n\tconst rowData = data[realIndex];\n\tif (!rowData) return;\n\tconst assetId = rowData.assetId;\n\tconst perms = permissions[assetId];\n\n\tif (perms && perms.includes(column.name)) return null;\n\n\tlet editorType = column.type || 'textfield';\n\tswitch (editorType) {\n\t\tcase 'int':\n\t\tcase 'float':\n\t\t\teditorType = 'number';\n\t\t\tbreak;\n\t\tcase 'date':\n\t\t\teditorType = 'datepicker';\n\t\t\tbreak;\n\t\tcase 'text':\n\t\t\teditorType = 'textfield';\n\t\t\tbreak;\n\t}\n\n\treturn plugin.cellEditors.create(\n\t\teditorType,\n\t\tObject.assign(cellEvent, {\n\t\t\titems: column.properties.items,\n\t\t}),\n\t);\n};\n\ninterface GridEditorProviderProps {\n\tonSetData: (data: DataRow[], schema: ColumnSchema) => void;\n\tgridEditor?: GridEditor;\n}\n\nexport const GridStoreProvider: React.FC = ({\n\tchildren,\n\tonSetData,\n\tgridEditor,\n}) => {\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\n\tconst getData = useGetData();\n\tconst saveData = useSaveData();\n\tconst {cart} = useCurrentCart();\n\n\tconst dataRef = useRef([]);\n\tconst rawDataRef = useRef([]);\n\tconst schemaRef = useRef();\n\tconst permissionRef = useRef({});\n\n\tconst progressStore = useProgressStore();\n\n\tconst changeStore = useChangeStore();\n\tconst changeStoreRef = useRef(changeStore);\n\tuseEffect(() => {\n\t\tchangeStoreRef.current = changeStore;\n\t\tgridEditor?.repaint();\n\t}, [changeStore, gridEditor]);\n\n\tconst selectionStore = useSelectionStore();\n\tconst selectionStoreRef = useRef(selectionStore);\n\tuseEffect(() => {\n\t\tselectionStoreRef.current = selectionStore;\n\t}, [selectionStore]);\n\n\tconst attributeSetSelectionProvider = useAttributeSetSelectionProvider();\n\n\tconst getGridData = useCallback(\n\t\tasync (data: SearchAssetAttributesSchema[]) => {\n\t\t\tconst size = data.length;\n\t\t\tconst gridData: DataRow[] = [];\n\t\t\t// indexed by asset id- will contain an array of read only field names\n\t\t\tconst permissions: Permissions = {};\n\t\t\tconst attributeTemplates = Object.values(\n\t\t\t\tattributeSetSelectionProvider.state.attributeTemplates,\n\t\t\t).flat();\n\n\t\t\treturn breakItUp(\n\t\t\t\t{\n\t\t\t\t\tsize,\n\t\t\t\t\tamount: 10,\n\t\t\t\t},\n\t\t\t\t(index) => {\n\t\t\t\t\tprogressStore.update(Math.round(((index + 1) / size) * 100));\n\n\t\t\t\t\tconst datum = data[index];\n\t\t\t\t\tconst {assetId, readOnly} = datum;\n\t\t\t\t\tconst rowData = {\n\t\t\t\t\t\tassetId,\n\t\t\t\t\t\tname: datum.name,\n\t\t\t\t\t\tthumbUrl: datum.thumbUrl,\n\t\t\t\t\t};\n\n\t\t\t\t\tdatum.attributes.forEach((record) => {\n\t\t\t\t\t\tconst attr = attributeTemplates.find(\n\t\t\t\t\t\t\t(attr) => attr.attributeid === record.templateId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!attr) return;\n\n\t\t\t\t\t\tconst {name, type} = attr;\n\t\t\t\t\t\t// We will only store fields that are no writable as I would argue\n\t\t\t\t\t\t// there should be less of them than the others (if one is usign grid editor)\n\t\t\t\t\t\tif (!record.writable || readOnly) {\n\t\t\t\t\t\t\t!permissions[assetId]\n\t\t\t\t\t\t\t\t? (permissions[assetId] = [name])\n\t\t\t\t\t\t\t\t: permissions[assetId].push(name);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst values = parseValue(type, record.values);\n\t\t\t\t\t\trowData[name] = values;\n\t\t\t\t\t});\n\t\t\t\t\tgridData.push(rowData);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\treturn {data: gridData, permissions};\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\t[\n\t\t\tattributeSetSelectionProvider.state.attributeTemplateIds,\n\t\t\tprogressStore.update,\n\t\t],\n\t);\n\n\tconst getSchema = useCallback(async () => {\n\t\t//const attributeIds = attributeSet.attributeIds;\n\t\tconst schema: ColumnProps[] = [\n\t\t\t{\n\t\t\t\tname: 'assetId',\n\t\t\t\theader: i18n.t('i18n.assetId'),\n\t\t\t\ttype: 'number',\n\t\t\t\treadOnly: true,\n\t\t\t\tid: 0,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'thumbUrl',\n\t\t\t\theader: i18n.t('i18n.thumbnail'),\n\t\t\t\ttype: 'image',\n\t\t\t\treadOnly: true,\n\t\t\t\tid: 0,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'name',\n\t\t\t\theader: i18n.t('i18n.name'),\n\t\t\t\ttype: 'text',\n\t\t\t\treadOnly: true,\n\t\t\t\tid: 0,\n\t\t\t},\n\t\t].concat(\n\t\t\t// TODO: make sure it is unique\n\t\t\tObject.values(attributeSetSelectionProvider.state.attributeTemplates)\n\t\t\t\t.flat()\n\t\t\t\t.filter((attr) => attr.attributeid > 0)\n\t\t\t\t.map((attr) => getColumnPropsForAttribute(attr)),\n\t\t);\n\t\treturn schema;\n\t}, [attributeSetSelectionProvider.state.attributeTemplates]);\n\n\tconst clone = useCallback(\n\t\tasync (cloneFromId: number, cloneToIds: number[], fields: string[]) => {\n\t\t\tif (!gridEditor) return;\n\n\t\t\tconst data = getDataFromGrid(gridEditor);\n\t\t\tconst permissions = permissionRef.current;\n\t\t\tconst cloneDataSource = data.find((d) => d.assetId === cloneFromId);\n\t\t\tif (!cloneDataSource) return;\n\n\t\t\tconst totalItemsToCloneTo = cloneToIds.length;\n\t\t\tconst columns = getColumnsFromGrid(gridEditor);\n\t\t\tconst columnsByName = getColumnsByName(columns);\n\n\t\t\tconst {round} = Math;\n\n\t\t\tconst updatedData: FormValues[] = [];\n\n\t\t\tprogressStore.update(0);\n\n\t\t\t// First build the data object that will be applied to each row\n\t\t\tconst cloneFromData: FormValues = {};\n\t\t\tfields.forEach((field) => {\n\t\t\t\tconst column = columnsByName[field];\n\t\t\t\tif (!column) return;\n\n\t\t\t\tconst {parseInValue, readOnly, required} = column.properties;\n\t\t\t\tif (readOnly) return;\n\n\t\t\t\tconst value = parseInValue\n\t\t\t\t\t? parseInValue(cloneDataSource[field])\n\t\t\t\t\t: cloneDataSource[field];\n\n\t\t\t\tif (!required || !isEmptyValue(value)) {\n\t\t\t\t\tcloneFromData[field] = value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Build our updated data by row\n\t\t\treturn breakItUp(\n\t\t\t\t{\n\t\t\t\t\tsize: totalItemsToCloneTo,\n\t\t\t\t},\n\t\t\t\t(index) => {\n\t\t\t\t\tconst assetId = cloneToIds[index];\n\t\t\t\t\tprogressStore.update(\n\t\t\t\t\t\tround(((index + 1) / totalItemsToCloneTo) * 100),\n\t\t\t\t\t);\n\t\t\t\t\tconst _cloneFromData = {...cloneFromData};\n\t\t\t\t\tif (permissions[assetId]) {\n\t\t\t\t\t\tpermissions[assetId].forEach((field) => {\n\t\t\t\t\t\t\tdelete _cloneFromData[field];\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tupdatedData.push({\n\t\t\t\t\t\t...cloneFromData,\n\t\t\t\t\t\tassetId,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\tawait updateSpecificValues(\n\t\t\t\t\t\tgridEditor,\n\t\t\t\t\t\tupdatedData,\n\t\t\t\t\t\tdataRef.current,\n\t\t\t\t\t\tchangeStoreRef.current,\n\t\t\t\t\t\tpermissionRef.current,\n\t\t\t\t\t\tprogressStore.update,\n\t\t\t\t\t);\n\t\t\t\t\tprogressStore.update(100);\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\t[gridEditor, progressStore.update],\n\t);\n\n\tconst getCloneData = useCallback(\n\t\t(y: number) => {\n\t\t\tif (!gridEditor) return;\n\n\t\t\tconst data = getDataFromGrid(gridEditor);\n\n\t\t\tconst indexes = getSortIndexesFromGrid(gridEditor);\n\t\t\tconst realIndex = indexes[y];\n\n\t\t\tconst cloneData = data[realIndex];\n\t\t\tconst cloneTargets = [...data];\n\t\t\tcloneTargets.splice(realIndex, 1);\n\t\t\treturn {\n\t\t\t\tcloneData,\n\t\t\t\tcloneFields: getColumnsFromGrid(gridEditor),\n\t\t\t\tcloneSchema: schemaRef.current,\n\t\t\t\tcloneTargets,\n\t\t\t};\n\t\t},\n\t\t[gridEditor],\n\t);\n\n\tconst workerAbortRef = useRef<() => void>();\n\tconst getSelectedValues = useCallback(\n\t\tasync (ignoreParseOut?: boolean) => {\n\t\t\tif (!gridEditor) return;\n\n\t\t\tif (workerAbortRef.current) {\n\t\t\t\tworkerAbortRef.current();\n\t\t\t\tworkerAbortRef.current = undefined;\n\t\t\t}\n\n\t\t\tconst worker = _getSelectedValues(\n\t\t\t\tgridEditor,\n\t\t\t\tselectionStoreRef.current,\n\t\t\t\tpermissionRef.current,\n\t\t\t\tprogressStore.update,\n\t\t\t\tignoreParseOut,\n\t\t\t);\n\t\t\tworkerAbortRef.current = worker.abort;\n\t\t\tconst data = await worker.job;\n\t\t\tif (!data) return;\n\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.SET_STORED_DATA,\n\t\t\t\tdata: data,\n\t\t\t});\n\n\t\t\tprogressStore.update(100);\n\t\t},\n\t\t[gridEditor, progressStore.update],\n\t);\n\n\tconst resetAllChanges = useCallback(async () => {\n\t\tif (!gridEditor) return;\n\n\t\tawait resetAllValues(\n\t\t\tgridEditor,\n\t\t\tchangeStoreRef.current,\n\t\t\tdataRef.current,\n\t\t\tprogressStore.update,\n\t\t);\n\t\tprogressStore.update(100);\n\n\t\tstate.storedData && getSelectedValues(true);\n\t}, [gridEditor, getSelectedValues, state.storedData, progressStore.update]);\n\n\tconst resetStore = useCallback(() => {\n\t\tif (selectionStoreRef.current.state.inSingleColumn === false) {\n\t\t\tif (workerAbortRef.current) {\n\t\t\t\tworkerAbortRef.current();\n\t\t\t\tworkerAbortRef.current = undefined;\n\t\t\t}\n\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.CLEAR_STORED_DATA,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tgetSelectedValues();\n\t}, [getSelectedValues]);\n\n\tconst resetSelectedChanges = useCallback(async () => {\n\t\tif (!gridEditor) return;\n\n\t\tawait resetSelectedValues(\n\t\t\tgridEditor,\n\t\t\tselectionStoreRef.current,\n\t\t\tchangeStoreRef.current,\n\t\t\tdataRef.current,\n\t\t\tprogressStore.update,\n\t\t);\n\t\tresetStore();\n\t}, [gridEditor, resetStore, state.storedData, progressStore.update]);\n\n\tconst setData = useCallback(\n\t\tasync (data: DataRow[]) => {\n\t\t\tif (!gridEditor) return;\n\n\t\t\tconst schema = await getSchema();\n\n\t\t\t// Store\n\t\t\tdataRef.current = JSON.parse(JSON.stringify(data));\n\t\t\tschemaRef.current = JSON.parse(JSON.stringify(schema));\n\t\t\t// Reset\n\t\t\tselectionStoreRef.current.reset();\n\t\t\tchangeStoreRef.current.reset();\n\n\t\t\t// Update grid\n\t\t\tonSetData(data, schema);\n\n\t\t\tsetTimeout(() => gridEditor.resized(), 50);\n\t\t},\n\t\t[getSchema, gridEditor, onSetData],\n\t);\n\n\t// When attributeSet or loading state changes, update grid data\n\tuseWhenChangedEffect(\n\t\t[\n\t\t\tattributeSetSelectionProvider.state.attributeTemplateIds,\n\t\t\tstate.loading,\n\t\t] as const,\n\t\tuseCallback(\n\t\t\t([attributeIds, loadingData]) => {\n\t\t\t\tif (loadingData) return;\n\t\t\t\tif (!attributeIds.length) {\n\t\t\t\t\tpermissionRef.current = {};\n\t\t\t\t\tsetData(dataRef.current);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tgetGridData(rawDataRef.current).then((details) => {\n\t\t\t\t\tpermissionRef.current = details.permissions;\n\t\t\t\t\tsetData(details.data);\n\t\t\t\t});\n\t\t\t},\n\t\t\t[setData, state.loading],\n\t\t),\n\t);\n\n\tconst updateData = useCallback(\n\t\tasync (values: FormValues, actions?: FormActions) => {\n\t\t\tif (!gridEditor) return;\n\n\t\t\tawait updateSelectedValues(\n\t\t\t\tgridEditor,\n\t\t\t\tselectionStoreRef.current,\n\t\t\t\tchangeStoreRef.current,\n\t\t\t\tdataRef.current,\n\t\t\t\tvalues,\n\t\t\t\tpermissionRef.current,\n\t\t\t\tactions,\n\t\t\t\tprogressStore.update,\n\t\t\t);\n\t\t\tprogressStore.update(100);\n\n\t\t\tresetStore();\n\t\t},\n\t\t[resetStore, progressStore.update],\n\t);\n\n\t// When gridEditor\n\tuseEffect(() => {\n\t\tif (!gridEditor) return;\n\n\t\tconst images: {\n\t\t\t[asset_id: string]: HTMLImageElement[];\n\t\t} = {};\n\n\t\tconst cellConfig_setAlignment = (config, column) => {\n\t\t\tif (config.isHandleColumn) {\n\t\t\t\tconfig.halign = 'center';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (column.name === 'assetId') {\n\t\t\t\tconfig.halign = 'center';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Do it like excel/pages\n\t\t\tswitch (column.getType()) {\n\t\t\t\tcase 'date':\n\t\t\t\tcase 'float':\n\t\t\t\tcase 'int':\n\t\t\t\t\tconfig.halign = 'right';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconfig.halign = 'left';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\n\t\tconst loadImage = (config) => {\n\t\t\tconst data = getDataFromGrid(gridEditor);\n\t\t\tconst sortIndex = getSortIndexesFromGrid(gridEditor);\n\n\t\t\tconst dataCell = config.dataCell;\n\t\t\tconst realIndex = sortIndex[dataCell.y];\n\t\t\tconst rowData = data[realIndex];\n\t\t\tconst primary = rowData.assetId;\n\t\t\tconst maxThumbnailHeight = 150;\n\t\t\tconst maxThumbnailWidth = 150;\n\n\t\t\tlet rowImages = images[primary];\n\t\t\tif (!rowImages) {\n\t\t\t\trowImages = images[primary] = [];\n\t\t\t}\n\n\t\t\tlet img = rowImages[dataCell.x];\n\n\t\t\t// Already cached\n\t\t\tif (img) {\n\t\t\t\tconfig.value = img;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// New image\n\t\t\timg = new Image();\n\t\t\timg.onload = () => {\n\t\t\t\tconst ratio = img.naturalWidth / img.naturalHeight;\n\t\t\t\tlet h = maxThumbnailHeight;\n\t\t\t\tlet w = h * ratio;\n\n\t\t\t\tif (w > maxThumbnailWidth) {\n\t\t\t\t\tw = maxThumbnailWidth;\n\t\t\t\t\th = w / ratio;\n\t\t\t\t}\n\t\t\t\timg.height = h;\n\t\t\t\timg.width = w;\n\t\t\t\tgridEditor.repaint();\n\t\t\t};\n\t\t\timg.src = config.value;\n\n\t\t\t// Cache and assign\n\t\t\trowImages[dataCell.x] = config.value = img;\n\t\t};\n\n\t\tconst cellConfig_setColor = (config, column) => {\n\t\t\tif (!config.isUserDataArea) return;\n\t\t\tconst data = getDataFromGrid(gridEditor);\n\t\t\tconst sortIndex = getSortIndexesFromGrid(gridEditor);\n\t\t\tconst rowData = data[sortIndex[config.dataCell.y]];\n\t\t\tconst columnProps = column.properties;\n\t\t\tconst perms = permissionRef.current[rowData.assetId];\n\n\t\t\tconst {properties} = gridEditor;\n\t\t\t// Uneditable cell\n\t\t\tif (\n\t\t\t\tcolumn.index < properties.fixedColumnCount ||\n\t\t\t\t(perms && perms.includes(column.name))\n\t\t\t) {\n\t\t\t\tconfig.backgroundColor = properties.cellReadOnlyColor;\n\t\t\t} else if (changeStoreRef.current.changed(rowData.assetId, column.name)) {\n\t\t\t\tconfig.backgroundColor = properties.cellChangedColor;\n\t\t\t}\n\t\t\t// Mandatory cell\n\t\t\telse if (columnProps.required) {\n\t\t\t\tconfig.backgroundColor = properties.cellMandatoryColor;\n\t\t\t}\n\t\t\t// Default background color\n\t\t\telse {\n\t\t\t\tconfig.backgroundColor = properties.cellDefaultColor;\n\t\t\t}\n\t\t};\n\n\t\tconst getCellRenderer = (config, declaredRendererName) => {\n\t\t\tconst point = config.dataCell;\n\n\t\t\tconst column = gridEditor.behavior.getColumn(point.x);\n\n\t\t\tcellConfig_setAlignment(config, column);\n\t\t\tcellConfig_setColor(config, column);\n\n\t\t\t// Not a data cell\n\t\t\tif (!config.isUserDataArea) {\n\t\t\t\t// No selection checkboxes at all\n\t\t\t\tif (gridEditor.properties.rowSelection) {\n\t\t\t\t\tif (point.x === -2) {\n\t\t\t\t\t\tconfig.centerIcon = config.leftIcon = null;\n\t\t\t\t\t\t// config.bounds.width = 40;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// No checkboxes on the data rows (maintain the select all one in the top left corner)\n\t\t\t\telse if (config.isHandleColumn) {\n\t\t\t\t\t// Header - center the icon\n\t\t\t\t\tif (config.gridCell.y === 0) {\n\t\t\t\t\t\tconfig.centerIcon = config.leftIcon;\n\t\t\t\t\t}\n\t\t\t\t\tconfig.leftIcon = null;\n\t\t\t\t\t// config.bounds.width = 40;\n\t\t\t\t}\n\t\t\t\treturn gridEditor.cellRenderers.get(declaredRendererName);\n\t\t\t}\n\n\t\t\t// This is my own deal that I will be submitting as a pull request when they merge the refactor branch into master\n\t\t\tconfig.multiline = true;\n\n\t\t\t// Check for schema formatting\n\t\t\tif (column.properties.formatValue) {\n\t\t\t\tconfig.value = column.properties.formatValue(config.value);\n\t\t\t}\n\n\t\t\tif (column.type === 'image') {\n\t\t\t\t// Value should now be an image url\n\t\t\t\tloadImage(config);\n\t\t\t}\n\n\t\t\t// Switch over field name\n\t\t\tswitch (column.getType()) {\n\t\t\t\tcase 'image':\n\t\t\t\t\treturn gridEditor.cellRenderers.get('ThumbnailCell');\n\t\t\t\tdefault:\n\t\t\t\t\treturn gridEditor.cellRenderers.get(declaredRendererName);\n\t\t\t}\n\t\t};\n\n\t\tgridEditor.behavior.dataModel.getCell = getCellRenderer;\n\t\tgridEditor.behavior.dataModel.getCellEditorAt = getCellEditor(\n\t\t\tgridEditor,\n\t\t\tpermissionRef,\n\t\t);\n\n\t\tconst handleCellClicked = (event: HypergridCellEvent) => {\n\t\t\tconst {detail} = event;\n\n\t\t\tlet point = detail.gridCell;\n\t\t\tif (!point || !gridEditor.isGridRow(point.y)) return;\n\n\t\t\tpoint = getDataPointFromCellEvent(event);\n\n\t\t\tconst indexes = getSortIndexesFromGrid(gridEditor);\n\t\t\tconst realIndex = indexes[point.y];\n\t\t\tconst rowData = getDataFromGrid(gridEditor)[realIndex];\n\t\t\tif (!rowData) return;\n\n\t\t\tconst column = getColumnFromGrid(gridEditor, point.x);\n\t\t\tif (column.name === 'thumbUrl') {\n\t\t\t\tdispatcher.trigger('asset:tagPanel:grid:preview', rowData.assetId);\n\t\t\t}\n\t\t};\n\n\t\tconst handleCellEditorDataChange = (event: HypergridCellEvent) => {\n\t\t\tconst {detail} = event;\n\t\t\tconst {input} = detail;\n\t\t\tconst {name} = input.column;\n\n\t\t\tconst data = getDataFromGrid(gridEditor);\n\t\t\tconst sortIndex = getSortIndexesFromGrid(gridEditor);\n\n\t\t\tconst realIndex = sortIndex[input.event.dataCell.y];\n\t\t\tconst rowData = data[realIndex];\n\n\t\t\tconst {assetId} = rowData;\n\t\t\tconst originalValue = dataRef.current.find(\n\t\t\t\t(data) => data.assetId === assetId,\n\t\t\t)?.[name];\n\n\t\t\t!checkEquality(detail.newValue, originalValue)\n\t\t\t\t? changeStoreRef.current.add(assetId, name)\n\t\t\t\t: changeStoreRef.current.remove(assetId, name);\n\n\t\t\tresetStore();\n\n\t\t\tgridEditor.repaint();\n\t\t\tsetTimeout(() => {\n\t\t\t\tgridEditor.takeFocus();\n\t\t\t}, 51);\n\t\t};\n\n\t\tconst handleResize = () => {\n\t\t\t// DAM-18842\n\t\t\tconst {sbHScroller, sbVScroller} = gridEditor;\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (sbHScroller) {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: ACTIONS.SET_OVERFLOW_X,\n\t\t\t\t\t\toverflown: sbHScroller.contentSize > sbHScroller.containerSize,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (sbVScroller) {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: ACTIONS.SET_OVERFLOW_Y,\n\t\t\t\t\t\toverflown: sbVScroller.contentSize > sbVScroller.containerSize,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, 51);\n\t\t};\n\n\t\tgridEditor.addEventListener('fin-click', handleCellClicked);\n\t\tgridEditor.addEventListener(\n\t\t\t'fin-editor-data-change',\n\t\t\thandleCellEditorDataChange,\n\t\t);\n\t\tgridEditor.addEventListener('fin-grid-resized', handleResize);\n\n\t\treturn () => {\n\t\t\tgridEditor.removeEventListener('fin-click', handleCellClicked);\n\t\t\tgridEditor.removeEventListener(\n\t\t\t\t'fin-editor-data-change',\n\t\t\t\thandleCellEditorDataChange,\n\t\t\t);\n\t\t\tgridEditor.removeEventListener('fin-grid-resized', handleResize);\n\t\t};\n\t}, [gridEditor, getSelectedValues, resetStore]);\n\n\t// When selection updates\n\tuseEffect(() => {\n\t\tresetStore();\n\t}, [selectionStore.state.cells, selectionStore.state.inSingleColumn]);\n\n\t// Listen for clone\n\tuseEffect(() => {\n\t\tif (!gridEditor) return;\n\n\t\tconst listener = (assetIds: number[], fields: string[]) => {\n\t\t\tconst {inSingleRow} = selectionStoreRef.current.state;\n\t\t\tif (inSingleRow === false) return;\n\n\t\t\tconst indexes = getSortIndexesFromGrid(gridEditor);\n\t\t\tconst realIndex = indexes[inSingleRow];\n\n\t\t\tconst data = getDataFromGrid(gridEditor);\n\t\t\tconst cloneData = data[realIndex];\n\t\t\tclone(cloneData.assetId, assetIds, fields);\n\t\t};\n\t\tdispatcher.on('asset:tagPanel:grid:clone:submit:confirmed', listener);\n\t\treturn () => {\n\t\t\tdispatcher.off('asset:tagPanel:grid:clone:submit:confirmed', listener);\n\t\t};\n\t}, [gridEditor, clone]);\n\n\t// When cart updates\n\tuseWhenChangedEffect(\n\t\t[cart.assetCount, cart.hasAssets],\n\t\tuseCallback(\n\t\t\t([assetCount, hasAssets]) => {\n\t\t\t\tif (!gridEditor || !hasAssets) return;\n\n\t\t\t\tprogressStore.update(0);\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.SET_LOADING,\n\t\t\t\t\tloading: true,\n\t\t\t\t});\n\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tconst data = await getData();\n\t\t\t\t\trawDataRef.current = data;\n\t\t\t\t\tconst gridDetails = await getGridData(data);\n\t\t\t\t\tdataRef.current = JSON.parse(JSON.stringify(gridDetails.data));\n\t\t\t\t\tpermissionRef.current = gridDetails.permissions;\n\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: ACTIONS.SET_LOADING,\n\t\t\t\t\t\tloading: false,\n\t\t\t\t\t});\n\t\t\t\t}, 500);\n\n\t\t\t\treturn () => {\n\t\t\t\t\tdataRef.current = [];\n\t\t\t\t\tpermissionRef.current = {};\n\t\t\t\t};\n\t\t\t},\n\t\t\t[gridEditor, progressStore.update, setData, getGridData],\n\t\t),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\tconst save = useCallback(async () => {\n\t\tif (!gridEditor) return;\n\n\t\tconst data = getDataFromGrid(gridEditor);\n\t\tconst columns = getColumnsFromGrid(gridEditor);\n\t\tconst columnsByName = getColumnsByName(columns);\n\n\t\tif (workerAbortRef.current) {\n\t\t\tworkerAbortRef.current();\n\t\t\tworkerAbortRef.current = undefined;\n\t\t}\n\n\t\tdispatch({\n\t\t\ttype: ACTIONS.SET_SAVING,\n\t\t\tsaving: true,\n\t\t});\n\n\t\tsetTimeout(async () => {\n\t\t\tconst updatedData: SetAssetAttributesSchema[] = [];\n\t\t\tconst changes = changeStoreRef.current.state.changes;\n\n\t\t\tconst assetIds = Object.keys(changes);\n\t\t\tconst size = assetIds.length;\n\n\t\t\tawait breakItUp(\n\t\t\t\t{\n\t\t\t\t\tsize,\n\t\t\t\t},\n\t\t\t\t(index) => {\n\t\t\t\t\tconst assetId = parseInt(assetIds[index]);\n\t\t\t\t\tconst attributes: SetAssetAttributesAttribute[] = [];\n\n\t\t\t\t\tconst rowData = data.find((d) => d.assetId === assetId);\n\t\t\t\t\tif (!rowData) return;\n\n\t\t\t\t\tchanges[assetId].forEach((field) => {\n\t\t\t\t\t\tconst column = columnsByName[field];\n\t\t\t\t\t\tif (!column) return;\n\n\t\t\t\t\t\tconst {properties} = column;\n\t\t\t\t\t\tconst value = properties.parseOutValue\n\t\t\t\t\t\t\t? properties.parseOutValue(rowData[field])\n\t\t\t\t\t\t\t: rowData[field];\n\n\t\t\t\t\t\tattributes.push({\n\t\t\t\t\t\t\tassetId,\n\t\t\t\t\t\t\ttemplateId: properties.id,\n\t\t\t\t\t\t\tvalues: Array.isArray(value) ? value : [value],\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\tattributes.length &&\n\t\t\t\t\t\tupdatedData.push({\n\t\t\t\t\t\t\tassetId,\n\t\t\t\t\t\t\tattributes,\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tawait saveData(updatedData, progressStore);\n\n\t\t\t// Reflect on our stored raw data\n\t\t\tconst updatedDataSize = updatedData.length;\n\t\t\tawait breakItUp(\n\t\t\t\t{\n\t\t\t\t\tsize: updatedDataSize,\n\t\t\t\t},\n\t\t\t\t(index) => {\n\t\t\t\t\tconst item = updatedData[index];\n\t\t\t\t\tconst rawData = rawDataRef.current.find(\n\t\t\t\t\t\t(d) => d.assetId === item.assetId,\n\t\t\t\t\t);\n\t\t\t\t\tif (!rawData) return;\n\t\t\t\t\titem.attributes.forEach((attr) => {\n\t\t\t\t\t\tconst rawAttr = rawData.attributes.find(\n\t\t\t\t\t\t\t(rawAttr) => rawAttr.templateId === attr.templateId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!rawAttr) return;\n\t\t\t\t\t\trawAttr.values = attr.values;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t\t// Store\n\t\t\tdataRef.current = JSON.parse(JSON.stringify(data));\n\t\t\t// Reset\n\t\t\tselectionStoreRef.current.reset();\n\t\t\tchangeStoreRef.current.reset();\n\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.SET_SAVING,\n\t\t\t\tsaving: false,\n\t\t\t});\n\t\t}, 100);\n\t}, [gridEditor, progressStore.update]);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n","import {useCallback} from 'react';\n\nimport {errors} from '../../../properties';\nimport {SearchAssetAttributesSchema} from '../../../schema/searchAssetAttributes';\n\nimport cartSingleton from '@netx/core-cart/collections/singleton/cart';\n\nimport {useRpc} from '@netx/core-components/hooks';\nimport {useSnackbar} from '@netx/core-components/Snackbar';\n\n// TODO: move service logic to an api folder\nexport default function useGet() {\n\tconst rpc = useRpc();\n\tconst snackbar = useSnackbar();\n\n\tconst get = useCallback(async () => {\n\t\ttry {\n\t\t\tconst search = cartSingleton.selection.createSearchObject();\n\n\t\t\tconst data = await rpc<{\n\t\t\t\tresults: SearchAssetAttributesSchema[];\n\t\t\t}>('searchAssetAttributes', [\n\t\t\t\tsearch.sortField,\n\t\t\t\tsearch.sortOrder,\n\t\t\t\tsearch.matchCriteria,\n\t\t\t\tsearch.elementTypes,\n\t\t\t\tsearch.elementSubType1s,\n\t\t\t\tsearch.elementSubType2s,\n\t\t\t\tsearch.elementValue1s,\n\t\t\t\tsearch.elementValue2s,\n\t\t\t\tsearch.elementValue3s,\n\t\t\t\t0,\n\t\t\t\t0xfff7,\n\t\t\t]);\n\t\t\treturn data.results;\n\t\t} catch (error) {\n\t\t\tsnackbar({\n\t\t\t\tmessage: errors.update[error?.code] || errors.update.default,\n\t\t\t\tseverity: 'error',\n\t\t\t});\n\t\t}\n\n\t\treturn [];\n\t}, []);\n\n\treturn get;\n}\n","import {useChangeStore} from '../../change';\nimport {GridEditor, Permissions} from '../../../types';\nimport {\n\tbreakItUp,\n\tgetColumnsFromGrid,\n\tgetColumnsByName,\n\tgetDataFromGrid,\n\tgetUpdatedValueData,\n} from '../../../utils';\n\nimport {FormValues} from '@netx/core-components/Form';\n\nexport default async function specific(\n\tgridEditor: GridEditor,\n\tvalues: FormValues[],\n\tinitialValues: FormValues[],\n\tchangeStore: ReturnType,\n\tpermissions: Permissions,\n\tprogress?: (progress: number) => void,\n) {\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.time('set-values/specific');\n\t}\n\n\tconst {round} = Math;\n\n\tconst data = getDataFromGrid(gridEditor);\n\tconst columns = getColumnsFromGrid(gridEditor);\n\tconst columnsByName = getColumnsByName(columns);\n\tconst size = values.length;\n\n\tconst amount = size <= 10 ? 1 : 10;\n\n\tawait breakItUp(\n\t\t{\n\t\t\tamount,\n\t\t\tsize,\n\t\t},\n\t\t(index) => {\n\t\t\tprogress && progress(round(((index + 1) / size) * 100));\n\n\t\t\tconst updateData = values[index];\n\t\t\tconst {assetId} = updateData;\n\n\t\t\tconst rowData = data.find((d) => d.assetId === assetId);\n\t\t\tif (!rowData) return;\n\n\t\t\tconst perms = permissions[assetId];\n\n\t\t\tfor (const field in updateData) {\n\t\t\t\tconst column = columnsByName[field];\n\t\t\t\tif (!column || (perms && perms.includes(field))) continue;\n\n\t\t\t\tconst {name} = column;\n\n\t\t\t\tconst valueData = getUpdatedValueData(\n\t\t\t\t\tassetId,\n\t\t\t\t\tupdateData,\n\t\t\t\t\trowData,\n\t\t\t\t\tinitialValues,\n\t\t\t\t\tcolumn,\n\t\t\t\t);\n\t\t\t\tif (!valueData) continue;\n\n\t\t\t\tvalueData.changed\n\t\t\t\t\t? changeStore.add(assetId, name)\n\t\t\t\t\t: changeStore.remove(assetId, name);\n\n\t\t\t\trowData[field] = valueData.value;\n\t\t\t}\n\t\t},\n\t);\n\n\tgridEditor.repaint();\n\n\tprogress && progress(100);\n\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.timeEnd('set-values/specific');\n\t}\n}\n","import all from './all';\nimport {useChangeStore} from '../../change';\nimport {useSelectionStore} from '../../selection';\nimport {GridEditor} from '../../../types';\nimport {\n\tbreakItUp,\n\tgetColumnsFromGrid,\n\tgetColumnsByName,\n\tgetDataFromGrid,\n\tgetSortIndexesFromGrid,\n} from '../../../utils';\n\nimport {FormValues} from '@netx/core-components/Form';\n\nexport default async function loose(\n\tgridEditor: GridEditor,\n\tselectionStore: ReturnType,\n\tchangeStore: ReturnType,\n\tinitialValues: FormValues[],\n\tsetProgress?: (progress: number) => void,\n) {\n\tif (selectionStore.state.all)\n\t\treturn all(gridEditor, changeStore, initialValues, setProgress);\n\n\tconst {round} = Math;\n\n\tconst data = getDataFromGrid(gridEditor);\n\tconst columns = getColumnsFromGrid(gridEditor);\n\tconst columnsByName = getColumnsByName(columns);\n\tconst sortIndex = getSortIndexesFromGrid(gridEditor);\n\n\tconst selectedRows = selectionStore.state.rows;\n\tconst selectedRowCount = selectionStore.state.rowCount;\n\n\tconst selectedColumnObjects = columns.filter((column) =>\n\t\tselectionStore.state.columns.includes(column.name),\n\t);\n\tconst selectedColumnCount = selectedColumnObjects.length;\n\n\tconst rowIndexesUpdating: number[] = selectedRows;\n\tconst columnIndexesUpdating: number[] = selectedColumnObjects.map(\n\t\t(column) => column._index,\n\t);\n\n\tconst changes = JSON.parse(JSON.stringify(changeStore.state.changes));\n\n\tlet processCount = 3;\n\tif (!selectedRowCount) processCount--;\n\tif (!selectedColumnCount) processCount--;\n\tif (!selectionStore.state.loose) processCount--;\n\n\tif (selectedRowCount) {\n\t\t// First update rows\n\t\tconst rowAmount = selectedRowCount <= 100 ? 25 : 100;\n\t\tawait breakItUp(\n\t\t\t{\n\t\t\t\tamount: rowAmount,\n\t\t\t\tsize: selectedRowCount,\n\t\t\t},\n\t\t\t(index) => {\n\t\t\t\tsetProgress &&\n\t\t\t\t\tsetProgress(\n\t\t\t\t\t\tround(((index + 1) / selectedRowCount / processCount) * 100),\n\t\t\t\t\t);\n\n\t\t\t\tconst rowIndex = selectedRows[index];\n\t\t\t\tconst realIndex = sortIndex[rowIndex];\n\t\t\t\tconst rowData = data[realIndex];\n\t\t\t\tif (!rowData) return;\n\n\t\t\t\tconst {assetId} = rowData;\n\t\t\t\tconst changedFields = changes[assetId];\n\t\t\t\tif (!changedFields) return;\n\n\t\t\t\tconst originalRowData = initialValues.find((d) => d.assetId == assetId);\n\n\t\t\t\tchangedFields.forEach((field) => {\n\t\t\t\t\tconst column = columnsByName[field];\n\t\t\t\t\tif (!column) return;\n\t\t\t\t\trowData[field] = column.properties.parseInValue\n\t\t\t\t\t\t? column.properties.parseInValue(originalRowData?.[field])\n\t\t\t\t\t\t: originalRowData?.[field];\n\t\t\t\t});\n\n\t\t\t\tdelete changes[assetId];\n\t\t\t},\n\t\t);\n\t}\n\n\tconst changesToDelete: string[] = [];\n\n\tif (selectedColumnCount) {\n\t\t// Then get columns\n\t\tconst dataSize = data.length;\n\t\tconst amount = dataSize <= 100 ? 25 : 100;\n\n\t\tawait breakItUp(\n\t\t\t{\n\t\t\t\tamount,\n\t\t\t\tsize: dataSize,\n\t\t\t},\n\t\t\t(index) => {\n\t\t\t\tsetProgress &&\n\t\t\t\t\tsetProgress(round(((index + 1) / dataSize / processCount) * 100));\n\n\t\t\t\tconst realIndex = sortIndex[index];\n\t\t\t\tconst rowData = data[realIndex];\n\n\t\t\t\tif (!rowData || rowIndexesUpdating.includes(index)) return;\n\n\t\t\t\tconst {assetId} = rowData;\n\t\t\t\tconst originalRowData = initialValues.find(\n\t\t\t\t\t(d) => d.assetId === assetId,\n\t\t\t\t);\n\t\t\t\tif (!originalRowData) return;\n\n\t\t\t\tfor (let x = 0, y = selectedColumnCount; x < y; x++) {\n\t\t\t\t\tconst column = selectedColumnObjects[x];\n\t\t\t\t\tif (!column) continue;\n\n\t\t\t\t\tconst {name, properties} = column;\n\t\t\t\t\tconst changedFields = changes[assetId];\n\t\t\t\t\tconst index = changedFields ? changedFields.indexOf(name) : -1;\n\t\t\t\t\tif (index < 0) continue;\n\n\t\t\t\t\tchangedFields.splice(index, 1);\n\t\t\t\t\t!changedFields.length && changesToDelete.push(assetId.toString());\n\n\t\t\t\t\trowData[name] = properties.parseInValue\n\t\t\t\t\t\t? properties.parseInValue(originalRowData?.[name])\n\t\t\t\t\t\t: originalRowData?.[name];\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tchangesToDelete.forEach((assetId) => {\n\t\t\tdelete changes[assetId];\n\t\t});\n\t}\n\n\t// Then points\n\tif (selectionStore.state.loose) {\n\t\tconst points = await selectionStore.getPoints();\n\t\tconst pointsSize = points.length;\n\t\tconst pointAmount = pointsSize <= 100 ? 25 : 100;\n\t\tawait breakItUp(\n\t\t\t{\n\t\t\t\tamount: pointAmount,\n\t\t\t\tsize: pointsSize,\n\t\t\t\tincrement: 2,\n\t\t\t},\n\t\t\t(index) => {\n\t\t\t\tsetProgress &&\n\t\t\t\t\tsetProgress(round(((index + 1) / pointsSize / processCount) * 100));\n\n\t\t\t\tconst x = points[index];\n\t\t\t\tconst y = points[index + 1];\n\t\t\t\tconst realIndex = sortIndex[y];\n\t\t\t\tconst rowData = data[realIndex];\n\t\t\t\tconst column = columns[x];\n\n\t\t\t\tif (\n\t\t\t\t\t!rowData ||\n\t\t\t\t\t!column ||\n\t\t\t\t\tcolumnIndexesUpdating.includes(x) ||\n\t\t\t\t\trowIndexesUpdating.includes(y)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tconst {assetId} = rowData;\n\t\t\t\tconst {name, properties} = column;\n\n\t\t\t\tconst changedFields = changes[assetId];\n\t\t\t\tif (!changedFields) return;\n\n\t\t\t\tconst changeIndex = changedFields ? changedFields.indexOf(name) : -1;\n\t\t\t\tif (changeIndex < 0) return;\n\n\t\t\t\tconst originalRowData = initialValues.find((d) => d.assetId == assetId);\n\t\t\t\tchangedFields.splice(changeIndex, 1);\n\t\t\t\tif (!changedFields.length) delete changes[assetId];\n\n\t\t\t\trowData[name] = properties.parseInValue\n\t\t\t\t\t? properties.parseInValue(originalRowData?.[name])\n\t\t\t\t\t: originalRowData?.[name];\n\t\t\t},\n\t\t);\n\t}\n\n\tchangeStore.reset(changes);\n\tgridEditor.repaint();\n\n\tsetProgress && setProgress(100);\n}\n","import all from './all';\nimport {useChangeStore} from '../../change';\nimport {useSelectionStore} from '../../selection';\nimport {GridEditor, Permissions} from '../../../types';\nimport {breakItUp, getAppendChar, getUpdatedValueData} from '../../../utils';\n\nimport {FormActions, FormValues} from '@netx/core-components/Form';\n\nexport default async function loose(\n\tgridEditor: GridEditor,\n\tselectionStore: ReturnType,\n\tchangeStore: ReturnType,\n\tinitialValues: FormValues[],\n\tvalues: FormValues,\n\tpermissions: Permissions,\n\tactions: FormActions = {},\n\tsetProgress?: (progress: number) => void,\n) {\n\tif (selectionStore.state.all)\n\t\treturn all(\n\t\t\tgridEditor,\n\t\t\tchangeStore,\n\t\t\tinitialValues,\n\t\t\tvalues,\n\t\t\tpermissions,\n\t\t\tactions,\n\t\t\tsetProgress,\n\t\t);\n\n\tconst {round} = Math;\n\n\tconst updatingFields = Object.keys(values);\n\n\tconst appendChar = getAppendChar();\n\n\tconst data = gridEditor.behavior.dataModel.dataSource.data;\n\tconst columns = gridEditor.behavior.columns;\n\tconst sortIndex = gridEditor.behavior.dataModel.sortIndex;\n\tconst valueColumnObjects = columns.filter((column) =>\n\t\tupdatingFields.includes(column.name),\n\t);\n\tconst updatingFieldCount = valueColumnObjects.length;\n\n\tconst selectedColumns = selectionStore.state.columns;\n\tconst selectedRows = selectionStore.state.rows;\n\tconst selectedRowCount = selectionStore.state.rowCount;\n\n\tconst selectedColumnObjects = valueColumnObjects.filter((column) =>\n\t\tselectedColumns.includes(column.name),\n\t);\n\tconst selectedColumnCount = selectedColumnObjects.length;\n\tconst columnIndexesUpdating: number[] = selectedColumnObjects.map(\n\t\t(column) => column._index,\n\t);\n\n\tlet processCount = 3;\n\tif (!selectedRowCount) processCount--;\n\tif (!selectedColumnCount) processCount--;\n\tif (!selectionStore.state.loose) processCount--;\n\n\tif (selectedRowCount) {\n\t\t// First row updates\n\t\tconst rowAmount = selectedRowCount <= 100 ? 25 : 100;\n\t\tawait breakItUp(\n\t\t\t{\n\t\t\t\tamount: rowAmount,\n\t\t\t\tsize: selectedRowCount,\n\t\t\t},\n\t\t\t(index) => {\n\t\t\t\tsetProgress &&\n\t\t\t\t\tsetProgress(\n\t\t\t\t\t\tround(((index + 1) / selectedRowCount / processCount) * 100),\n\t\t\t\t\t);\n\n\t\t\t\tconst rowIndex = selectedRows[index];\n\t\t\t\tconst realIndex = sortIndex[rowIndex];\n\t\t\t\tconst rowData = data[realIndex];\n\t\t\t\tif (!rowData) return;\n\n\t\t\t\tconst {assetId} = rowData;\n\t\t\t\tconst perms = permissions[assetId];\n\n\t\t\t\tfor (let x = 0, y = updatingFieldCount; x < y; x++) {\n\t\t\t\t\tconst column = valueColumnObjects[x];\n\t\t\t\t\tif (!column) continue;\n\t\t\t\t\tconst {name} = column;\n\n\t\t\t\t\tif (perms && perms.includes(name)) continue;\n\n\t\t\t\t\tconst valueData = getUpdatedValueData(\n\t\t\t\t\t\tassetId,\n\t\t\t\t\t\tvalues,\n\t\t\t\t\t\trowData,\n\t\t\t\t\t\tinitialValues,\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tactions,\n\t\t\t\t\t\tappendChar,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!valueData) continue;\n\n\t\t\t\t\tvalueData.changed\n\t\t\t\t\t\t? changeStore.add(assetId, name)\n\t\t\t\t\t\t: changeStore.remove(assetId, name);\n\n\t\t\t\t\trowData[name] = valueData.value;\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tif (selectedColumnCount) {\n\t\t// Then get columns\n\t\tconst dataSize = data.length;\n\t\tconst columnAmount = dataSize <= 100 ? 25 : 100;\n\t\tawait breakItUp(\n\t\t\t{\n\t\t\t\tamount: columnAmount,\n\t\t\t\tsize: dataSize,\n\t\t\t},\n\t\t\t(index) => {\n\t\t\t\tsetProgress &&\n\t\t\t\t\tsetProgress(round(((index + 1) / dataSize / processCount) * 100));\n\n\t\t\t\tconst realIndex = sortIndex[index];\n\t\t\t\tconst rowData = data[realIndex];\n\t\t\t\tif (!rowData || selectedRows.includes(index)) return;\n\n\t\t\t\tconst {assetId} = rowData;\n\t\t\t\tconst perms = permissions[assetId];\n\n\t\t\t\tfor (let x = 0, y = selectedColumnCount; x < y; x++) {\n\t\t\t\t\tconst column = selectedColumnObjects[x];\n\t\t\t\t\tif (!column) continue;\n\n\t\t\t\t\tconst {name} = column;\n\n\t\t\t\t\tif (perms && perms.includes(name)) continue;\n\n\t\t\t\t\tconst valueData = getUpdatedValueData(\n\t\t\t\t\t\tassetId,\n\t\t\t\t\t\tvalues,\n\t\t\t\t\t\trowData,\n\t\t\t\t\t\tinitialValues,\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tactions,\n\t\t\t\t\t\tappendChar,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!valueData) continue;\n\n\t\t\t\t\tvalueData.changed\n\t\t\t\t\t\t? changeStore.add(assetId, name)\n\t\t\t\t\t\t: changeStore.remove(assetId, name);\n\n\t\t\t\t\trowData[name] = valueData.value;\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t// Then points\n\tif (selectionStore.state.loose) {\n\t\tconst points = await selectionStore.getPoints();\n\t\tconst pointsSize = points.length;\n\t\tconst pointAmount = pointsSize <= 100 ? 25 : 100;\n\t\tawait breakItUp(\n\t\t\t{\n\t\t\t\tamount: pointAmount,\n\t\t\t\tsize: pointsSize,\n\t\t\t\tincrement: 2,\n\t\t\t},\n\t\t\t(index) => {\n\t\t\t\tsetProgress &&\n\t\t\t\t\tsetProgress(round(((index + 1) / pointsSize / processCount) * 100));\n\n\t\t\t\tconst x = points[index];\n\t\t\t\tconst y = points[index + 1];\n\n\t\t\t\tconst realIndex = sortIndex[y];\n\t\t\t\tconst column = columns[x];\n\t\t\t\tconst rowData = data[realIndex];\n\n\t\t\t\tif (\n\t\t\t\t\t!rowData ||\n\t\t\t\t\t!column ||\n\t\t\t\t\tselectedRows.includes(y) ||\n\t\t\t\t\tcolumnIndexesUpdating.includes(x)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tconst {name} = column;\n\t\t\t\tconst {assetId} = rowData;\n\n\t\t\t\tconst perms = permissions[assetId];\n\t\t\t\tif (perms && perms.includes(name)) return;\n\n\t\t\t\tconst valueData = getUpdatedValueData(\n\t\t\t\t\tassetId,\n\t\t\t\t\tvalues,\n\t\t\t\t\trowData,\n\t\t\t\t\tinitialValues,\n\t\t\t\t\tcolumn,\n\t\t\t\t\tactions,\n\t\t\t\t\tappendChar,\n\t\t\t\t);\n\t\t\t\tif (!valueData) return;\n\n\t\t\t\tvalueData.changed\n\t\t\t\t\t? changeStore.add(assetId, name)\n\t\t\t\t\t: changeStore.remove(assetId, name);\n\n\t\t\t\trowData[name] = valueData.value;\n\t\t\t},\n\t\t);\n\t}\n\n\tgridEditor.repaint();\n\tgridEditor.takeFocus();\n\n\tsetProgress && setProgress(100);\n}\n","import React, {createContext, useContext} from 'react';\n\nimport type {ArgumentsType} from '@netx/core/typings';\nimport {\n\tuseTableLayout,\n\tUseTableLayoutReturnType,\n\tUseTableLayoutArguments,\n} from '../../hooks';\nimport type {BaseItemData} from '../../types';\n\ntype TableLayoutContextType<\n\tItemData extends BaseItemData\n> = UseTableLayoutReturnType;\n\nconst TableLayoutStoreContext = createContext<\n\tTableLayoutContextType | undefined\n>(undefined);\n\nexport const createTreeDragContext = () => {\n\treturn createContext | undefined>(undefined);\n};\n\nexport const useTableLayoutProvider = () => {\n\tconst context = useContext>(\n\t\t(TableLayoutStoreContext as unknown) as React.Context<\n\t\t\tTableLayoutContextType\n\t\t>,\n\t);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t'`useTableLayoutProvider` must be used within a `TableLayoutProvider`',\n\t\t);\n\t}\n\treturn context;\n};\n\nexport interface TableLayoutProviderProps\n\textends React.PropsWithChildren[0]> {}\n\n/**\n * Table layout provider\\\n * Provides a consolidated state for managing data related to the table's layout\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n */\nexport const TableLayoutProvider = ({\n\tchildren,\n\t...props\n}: TableLayoutProviderProps) => {\n\tconst tableLayout = useTableLayout(props);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport default TableLayoutProvider;\n","import React, {createContext, useContext} from 'react';\n\nimport type {ArgumentsType} from '@netx/core/typings';\n\nimport {useTableRowSelection} from '../../hooks';\nimport type {BaseItemData} from '../../types';\n\ntype TableRowSelectionContextType = ReturnType;\n\nexport const TableRowSelectionStoreContext = createContext<\n\tTableRowSelectionContextType\n>({} as any);\n\nexport const useTableRowSelectionProvider = () =>\n\tuseContext(TableRowSelectionStoreContext);\n\nexport interface TableRowSelectionProviderProps\n\textends React.PropsWithChildren<\n\t\tArgumentsType[0]\n\t> {}\n\n/**\n * Table row selection provider\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n */\nexport const TableRowSelectionProvider = ({\n\tchildren,\n\t...props\n}: TableRowSelectionProviderProps) => {\n\tconst tableRowSelection = useTableRowSelection(props);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\nexport default TableRowSelectionProvider;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const DIALOG_TITLE_CLASS_NAME = 'DialogTitle';\nexport const DIALOG_TITLE_CLASS_SLOTS = [\n\t'root',\n\t'actions',\n\t'icon',\n\t'title',\n] as const;\n\nexport type DialogTitleClassSlot = typeof DIALOG_TITLE_CLASS_SLOTS[number];\n\nexport interface DialogTitleClasses {\n\troot: string;\n\tactions: string;\n\ticon: string;\n\ttitle: string;\n\n\thasIcon: string;\n}\n\nexport type DialogTitleClassKey = keyof DialogTitleClasses;\n\nexport const getDialogTitleUtilityClass = (slot: DialogTitleClassSlot) =>\n\tgenerateUtilityClass(DIALOG_TITLE_CLASS_NAME, slot);\n\nexport const dialogTitleClasses: DialogTitleClasses = generateUtilityClasses(\n\tDIALOG_TITLE_CLASS_NAME,\n\t['root', 'actions', 'hasIcon', 'icon', 'title'],\n);\n\nexport default dialogTitleClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {FontAwesomeIconProps} from '@fortawesome/react-fontawesome';\nimport {faTimes} from '@fortawesome/pro-solid-svg-icons';\nimport {\n\tDialogTitle as MuiDialogTitle,\n\tdialogTitleClasses as muiDialogClasses,\n\tDialogTitleProps as MuiDialogTitleProps,\n} from '@mui/material';\nimport IconButton from '@netx/core-components/IconButton';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithClasses,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\nimport Title, {TitleProps} from '../Title';\nimport {\n\tdialogTitleClasses,\n\tgetDialogTitleUtilityClass,\n\tDialogTitleClasses,\n\tDIALOG_TITLE_CLASS_NAME,\n} from './dialogTitleClasses';\n\ntype DialogTitleOwnerProps = WithClasses<\n\tDialogTitleClasses,\n\t{\n\t\thasIcon?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: DialogTitleOwnerProps) => {\n\tconst {classes, hasIcon} = ownerState;\n\n\tconst slots = {\n\t\troot: ['root', hasIcon && 'hasIcon'],\n\t\tactions: ['actions'],\n\t\tcontrols: ['controls'],\n\t\ticon: ['icon'],\n\t\ttitle: ['title'],\n\t};\n\treturn composeClasses(slots, getDialogTitleUtilityClass, classes);\n};\n\nconst DialogTitleRoot = styled(MuiDialogTitle, {\n\tname: DIALOG_TITLE_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\talignItems: 'center',\n\toverflow: 'hidden',\n\t[`&.${dialogTitleClasses.hasIcon}`]: {\n\t\tpaddingLeft: theme.spacing(2),\n\t},\n}));\n\nconst DialogTitleText = styled(Title, {\n\tname: DIALOG_TITLE_CLASS_NAME,\n\tslot: 'Title',\n})(({theme}) => ({\n\tflex: '1 1 auto',\n\toverflow: 'hidden',\n}));\n\nconst DialogTitleActions = styled('div', {\n\tname: DIALOG_TITLE_CLASS_NAME,\n\tslot: 'Title',\n})(({theme}) => ({\n\tflex: '0 0 auto',\n\tmarginLeft: theme.spacing(1),\n}));\n\nconst DialogTitleControls = styled('div', {\n\tname: DIALOG_TITLE_CLASS_NAME,\n\tslot: 'Controls',\n})(({theme}) => ({}));\n\nexport type DialogTitleProp =\n\t| string\n\t| {\n\t\t\tprimary: string;\n\t\t\tsecondary?: string;\n\t };\n\nexport interface DialogTitleProps\n\textends Omit<\n\t\t\tWithMuiPropOverrides,\n\t\t\t'classes' | 'variant'\n\t\t>,\n\t\tOmit,\n\t\tWithClasses<\n\t\t\tany,\n\t\t\t{\n\t\t\t\ticon?: FontAwesomeIconProps['icon'];\n\t\t\t\tonClose?: () => void;\n\t\t\t\tcontrols?: React.ReactNode;\n\t\t\t}\n\t\t> {}\n\nconst DialogTitleInner = ({\n\tclasses: _classes,\n\tclassName,\n\tcontrols,\n\ticon,\n\tloading,\n\tprimary,\n\tsecondary,\n\tonClose,\n\tPrimaryTitleProps,\n\tSecondaryTitleProps,\n\t...props\n}: DialogTitleProps) => {\n\tconst ownerState: DialogTitleOwnerProps = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t\thasIcon: icon != null,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t{controls ? (\n\t\t\t\t\n\t\t\t\t\t{controls}\n\t\t\t\t\n\t\t\t) : null}\n\t\t\t{onClose ? (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t) : null}\n\t\t\n\t);\n};\n\nexport const DialogTitlePrimitive = DialogTitleInner;\n\nexport const DialogTitle = DialogTitlePrimitive;\n\nexport default DialogTitle;\n","import AttributesSetsCollection from '../assetAttributeSets';\nimport {assetAttributes as assetAttributesSingleton} from './attributes';\n\nexport const attributeSets = new AttributesSetsCollection([], {\n\tassetAttributes: assetAttributesSingleton,\n});\n\nexport default attributeSets;\n","import {i18n} from '@netx/core/i18n';\n\nexport const ASSET_EXPIRATION_ACTION_LABELS = {\n\tEXPIRE: i18n.t('i18n.expire'),\n\tUNEXPIRE: i18n.t('i18n.unexpire'),\n};\n\nexport const ASSET_EXPIRATION_CONFIRMATIONS = {\n\tUNEXPIRE: i18n.t('i18n.unexpireConfirm'),\n};\n\nexport const ASSET_EXPIRATION_SUBMIT_LABELS = {\n\tEXPIRE: i18n.t('i18n.expire'),\n\tUNEXPIRE: i18n.t('i18n.unexpire'),\n};\n\nexport const ASSET_EXPIRATION_TITLES = {\n\tEXPIRE: i18n.t('i18n.setExpiration'),\n};\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const ARROW_FOCUS_TRAP_ITEM_CLASS_NAME = 'ArrowFocusTrapItem';\n\nexport const ARROW_FOCUS_TRAP_ITEM_CLASS_SLOTS = ['root'] as const;\n\nexport type ArrowFocusTrapItemClassSlot = typeof ARROW_FOCUS_TRAP_ITEM_CLASS_SLOTS[number];\n\nexport interface ArrowFocusTrapItemClasses {\n\troot: string;\n\tfocusActive: string;\n\tfocusDisabled: string;\n}\n\nexport type ArrowFocusTrapItemClassKey = keyof ArrowFocusTrapItemClasses;\n\nexport const getArrowFocusTrapItemUtilityClass = (\n\tslot: ArrowFocusTrapItemClassSlot,\n) => generateUtilityClass(ARROW_FOCUS_TRAP_ITEM_CLASS_NAME, slot);\n\nexport const arrowFocusTrapItemClasses: ArrowFocusTrapItemClasses = generateUtilityClasses(\n\tARROW_FOCUS_TRAP_ITEM_CLASS_NAME,\n\t['root', 'focusActive', 'focusDisabled'],\n);\n\nexport default arrowFocusTrapItemClasses;\n","import {createContext} from 'react';\n\nconst noop = () => {};\nconst nooop = () => () => {};\n\nimport type {InternalContextDescriptor, PublicContextDescriptor} from './types';\n\nexport const defaultPublicContext: PublicContextDescriptor = {\n\thandleItemClick: nooop,\n\thandleItemInteractStart: nooop,\n\thandleScrollIndexUpdate: noop,\n\tsetActiveIndex: noop,\n\tjustClickedItem: {current: false},\n\tdisableNextScrollUpdate: {current: false},\n\tdisabled: true,\n\tactiveIndex: 0,\n\tvirtualListRef: undefined,\n};\n\nexport const defaultInternalContext: InternalContextDescriptor = {\n\tkeysDisabled: false,\n\tclickKeysDisabled: false,\n\tdisableNextScrollUpdate: {current: false},\n\tdisabled: true,\n\tactiveIndex: 0,\n\treturnToIndexOnFocus: -1,\n\tjustClickedItem: {current: false},\n\tsendNextFocusToPreviousElement: {current: false},\n\tvirtualListRef: undefined,\n\tdispatch: noop,\n\thandleItemClick: nooop,\n\thandleItemInteractStart: nooop,\n\thandleScrollIndexUpdate: noop,\n\tsetActiveIndex: noop,\n\tsetReturnToIndexOnFocus: noop,\n};\n\nexport const InternalContext = createContext(\n\tdefaultInternalContext,\n);\n\nexport const PublicContext = createContext(\n\tdefaultPublicContext,\n);\n","import {useCallback, useContext, useMemo} from 'react';\nimport _ from 'underscore';\nimport {InternalContext} from '../../store/context';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\nexport interface UseArrowFocusTrapItemArguments {\n\tindex: number;\n\tref?: React.RefObject;\n}\n\nexport const useArrowFocusTrapItem = ({\n\tindex,\n\tref,\n}: UseArrowFocusTrapItemArguments) => {\n\tconst {\n\t\tactiveIndex,\n\t\tdisabled,\n\t\thandleItemClick,\n\t\thandleItemInteractStart,\n\t\tsetActiveIndex,\n\t\tjustClickedItem,\n\t} = useContext(InternalContext);\n\n\tconst isActive = !disabled && activeIndex === index;\n\tconst tabIndex = isActive ? 0 : -1;\n\n\tuseWhenChangedEffect(\n\t\tisActive,\n\t\tuseCallback(\n\t\t\t_.debounce((isActive) => {\n\t\t\t\tif (\n\t\t\t\t\t!ref?.current ||\n\t\t\t\t\t!isActive ||\n\t\t\t\t\tjustClickedItem?.current ||\n\t\t\t\t\tref.current.contains(document.activeElement)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tref.current.focus({preventScroll: true});\n\t\t\t}, 100),\n\t\t\t[],\n\t\t),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\tconst setActive = useCallback(() => setActiveIndex(index), [index]);\n\n\tconst memoizedAttributes = useMemo(\n\t\t() => ({\n\t\t\ttabIndex,\n\t\t}),\n\t\t[tabIndex],\n\t);\n\n\treturn {\n\t\tattributes: memoizedAttributes,\n\t\thandleItemClick: handleItemClick(index),\n\t\thandleItemInteractStart: handleItemInteractStart(index),\n\t\tsetActive,\n\t\tisActive,\n\t\tjustClickedItem,\n\t};\n};\n\nexport default useArrowFocusTrapItem;\n","import React, {useRef, useCallback} from 'react';\nimport clsx from 'clsx';\n\nimport {useSharedRef} from '@netx/core-components/hooks/useSharedRef';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {\n\tgetArrowFocusTrapItemUtilityClass,\n\tarrowFocusTrapItemClasses,\n\tArrowFocusTrapItemClasses,\n\tARROW_FOCUS_TRAP_ITEM_CLASS_NAME,\n} from './arrowFocusTrapItemClasses';\nimport {useArrowFocusTrapItem} from '../../hooks/useArrowFocusTrapItem';\n\nexport type ArrowFocusTrapItemElement = HTMLElement;\nexport type ArrowFocusTrapItemRef =\n\t| React.RefObject\n\t| ((element: HTMLElement | null) => void);\n\ntype ArrowFocusTrapItemUtiltiyClassProps = WithClasses<\n\tArrowFocusTrapItemClasses,\n\t{\n\t\tfocusActive?: boolean;\n\t\tfocusDisabled?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: ArrowFocusTrapItemUtiltiyClassProps) => {\n\tconst {classes, focusActive, focusDisabled} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\tfocusActive && 'focusActive',\n\t\t\tfocusDisabled && 'focusDisabled',\n\t\t],\n\t};\n\treturn composeClasses(slots, getArrowFocusTrapItemUtilityClass, classes);\n};\n\nconst ArrowFocusTrapItemRoot = styled('div', {\n\tname: ARROW_FOCUS_TRAP_ITEM_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\t[`&.${arrowFocusTrapItemClasses.focusActive}:not(.Mui-selected):not(:hover)`]: {\n\t\tbackgroundColor: theme.palette.custom.background.light,\n\t},\n}));\n\ntype TopLevelComponenetProps<\n\tC extends HTMLDivElement | HTMLLIElement | React.ElementType = HTMLDivElement\n> = C extends HTMLDivElement | HTMLLIElement\n\t? React.DetailedHTMLProps, C> // TODO: the typing is working from the outside, just need to dive a bit deeper and see what i am missing here that is // making ts unhappy but working...\n\t: JSX.IntrinsicAttributes &\n\t\t\t// @ts-ignore\n\t\t\tJSX.LibraryManagedAttributes>;\n\n// TODO: props for the component or for the element\nexport type ArrowFocusTrapItemProps<\n\tC extends HTMLDivElement | HTMLLIElement | React.ElementType = HTMLDivElement\n> = WithClasses<\n\tArrowFocusTrapItemClasses,\n\tReact.PropsWithChildren<\n\t\tTopLevelComponenetProps & {\n\t\t\tref?: ArrowFocusTrapItemRef;\n\t\t\tindex: number;\n\t\t\tonClick?: (\n\t\t\t\tevent: React.MouseEvent,\n\t\t\t\tindex: number,\n\t\t\t) => void;\n\t\t\tContainerComponent?: React.ElementType<\n\t\t\t\tReact.HTMLAttributes\n\t\t\t>;\n\t\t}\n\t>\n>;\n\nexport const ArrowFocusTrapItemPrimitive = <\n\tC extends HTMLDivElement | HTMLLIElement | React.ElementType = HTMLDivElement\n>(\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tchildren: childrenProp,\n\t\tindex,\n\t\tonClick,\n\t\tContainerComponent = 'div',\n\t\t...props\n\t}: ArrowFocusTrapItemProps,\n\tref: ArrowFocusTrapItemRef,\n) => {\n\tconst rootRef = useSharedRef(null, [ref]);\n\n\tconst {\n\t\tisActive,\n\t\tattributes,\n\t\thandleItemClick,\n\t\thandleItemInteractStart,\n\t} = useArrowFocusTrapItem({index, ref: rootRef});\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\tfocusActive: isActive,\n\t});\n\n\tconst handleClick = useCallback(\n\t\t(event: React.MouseEvent) => {\n\t\t\tonClick?.(event, index);\n\t\t\thandleItemClick(event);\n\t\t},\n\t\t[onClick, index],\n\t);\n\n\treturn (\n\t\t\n\t\t\t{childrenProp}\n\t\t\n\t);\n};\n\nexport const ArrowFocusTrapItem = React.forwardRef(\n\tArrowFocusTrapItemPrimitive,\n) as <\n\tC extends\n\t\t| HTMLDivElement\n\t\t| HTMLLIElement\n\t\t| React.ComponentType = HTMLDivElement\n>(\n\tprops: ArrowFocusTrapItemProps,\n\tref?: ArrowFocusTrapItemRef,\n) => JSX.Element;\n\nexport default ArrowFocusTrapItem;\n","export enum Action {\n\tDisable = 'disable',\n\tDisableClickKeys = 'disableClickKeys',\n\tDisableKeys = 'disableKeys',\n\tEnable = 'enable',\n\tEnableClickKeys = 'enableClickKeys',\n\tEnableKeys = 'enableKeys',\n\tEnd = 'end',\n\tHome = 'home',\n\tNextItem = 'nextItem',\n\tNextPage = 'nextPage',\n\tPrevItem = 'prevItem',\n\tPrevPage = 'prevPage',\n\tSetActiveItem = 'setActiveItem',\n\tSetTotal = 'setTotal',\n\tSetPageSize = 'setPageSize',\n\tSetReturnToIndexOnFocus = 'setReturnToIndexOnFocus',\n}\n\nexport type Actions =\n\t| {\n\t\t\ttype: Action.Disable;\n\t }\n\t| {\n\t\t\ttype: Action.DisableClickKeys;\n\t }\n\t| {\n\t\t\ttype: Action.DisableKeys;\n\t }\n\t| {\n\t\t\ttype: Action.Enable;\n\t }\n\t| {\n\t\t\ttype: Action.EnableClickKeys;\n\t }\n\t| {\n\t\t\ttype: Action.EnableKeys;\n\t }\n\t| {\n\t\t\ttype: Action.End;\n\t }\n\t| {\n\t\t\ttype: Action.Home;\n\t }\n\t| {\n\t\t\ttype: Action.NextItem;\n\t }\n\t| {\n\t\t\ttype: Action.NextPage;\n\t }\n\t| {\n\t\t\ttype: Action.PrevItem;\n\t }\n\t| {\n\t\t\ttype: Action.PrevPage;\n\t }\n\t| {\n\t\t\ttype: Action.SetActiveItem;\n\t\t\tindex: number;\n\t }\n\t| {\n\t\t\ttype: Action.SetPageSize;\n\t\t\tpageSize: number;\n\t }\n\t| {\n\t\t\ttype: Action.SetReturnToIndexOnFocus;\n\t\t\tindex: number;\n\t }\n\t| {\n\t\t\ttype: Action.SetTotal;\n\t\t\ttotal: number;\n\t };\n","import {useContext, useMemo} from 'react';\n\nimport {InternalContext} from '../../store/context';\nimport {Action} from '../../store/actions';\n\nexport interface UseArrowFocusTrapItemActionArguments {\n\tindex: number;\n}\n\nexport const useArrowFocusItemAction = ({\n\tindex,\n}: UseArrowFocusTrapItemActionArguments) => {\n\tconst {\n\t\tactiveIndex,\n\t\tdisabled,\n\t\thandleItemClick,\n\t\thandleItemInteractStart,\n\t\tdispatch,\n\t} = useContext(InternalContext);\n\n\tconst isActive = !disabled && activeIndex === index;\n\tconst tabIndex = isActive ? 0 : -1;\n\n\tconst memoizedAttributes = useMemo(\n\t\t() => ({\n\t\t\ttabIndex,\n\t\t\tonClick: (event: React.MouseEvent) => {\n\t\t\t\tevent.stopPropagation();\n\t\t\t},\n\t\t\tonBlur: (event?: React.FocusEvent) => {\n\t\t\t\tdispatch({type: Action.EnableClickKeys});\n\t\t\t},\n\t\t\tonFocus: (event?: React.FocusEvent) => {\n\t\t\t\tdispatch({type: Action.DisableClickKeys});\n\t\t\t},\n\t\t\thandleMenuOpen: (ocb?: (...args: any) => any) => (...args: any) => {\n\t\t\t\tdispatch({type: Action.DisableKeys});\n\t\t\t\tocb?.(...args);\n\t\t\t},\n\t\t\thandleMenuClose: (ocb?: (...args: any) => any) => (...args: any) => {\n\t\t\t\tdispatch({type: Action.EnableKeys});\n\t\t\t\tocb?.(...args);\n\t\t\t},\n\t\t}),\n\t\t[tabIndex],\n\t);\n\n\treturn {\n\t\tattributes: memoizedAttributes,\n\t\thandleItemClick,\n\t\thandleItemInteractStart,\n\t\tisActive,\n\t};\n};\n\nexport default useArrowFocusItemAction;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const ARROW_FOCUS_TRAP_ITEM_ACTIONS_CLASS_NAME =\n\t'ArrowFocusTrapItemActions';\nexport const ARROW_FOCUS_TRAP_ITEM_ACTIONS_CLASS_SLOTS = ['root'] as const;\n\nexport type ArrowFocusTrapItemActionsClassSlot = typeof ARROW_FOCUS_TRAP_ITEM_ACTIONS_CLASS_SLOTS[number];\n\nexport interface ArrowFocusTrapItemActionsClasses {\n\troot: string;\n}\n\nexport type ArrowFocusTrapItemActionsClassKey = keyof ArrowFocusTrapItemActionsClasses;\n\nexport const getArrowFocusTrapItemActionsUtilityClass = (\n\tslot: ArrowFocusTrapItemActionsClassSlot,\n) => generateUtilityClass(ARROW_FOCUS_TRAP_ITEM_ACTIONS_CLASS_NAME, slot);\n\nexport const arrowFocusTrapItemActionsClasses: ArrowFocusTrapItemActionsClasses = generateUtilityClasses(\n\tARROW_FOCUS_TRAP_ITEM_ACTIONS_CLASS_NAME,\n\t['root'],\n);\n\nexport default arrowFocusTrapItemActionsClasses;\n","import React from 'react';\nimport {isFragment} from 'react-is';\nimport clsx from 'clsx';\n\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {useArrowFocusItemAction} from '../../hooks/useArrowFocusItemAction';\nimport {\n\tgetArrowFocusTrapItemActionsUtilityClass,\n\tArrowFocusTrapItemActionsClasses,\n\tARROW_FOCUS_TRAP_ITEM_ACTIONS_CLASS_NAME,\n} from './arrowFocusTrapItemActionsClasses';\n\ntype ArrowFocusTrapItemActionsUtiltiyClassProps = WithClasses<\n\tArrowFocusTrapItemActionsClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (\n\townerState: ArrowFocusTrapItemActionsUtiltiyClassProps,\n) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetArrowFocusTrapItemActionsUtilityClass,\n\t\tclasses,\n\t);\n};\n\nconst ArrowFocusTrapItemActionsRoot = styled('div', {\n\tname: ARROW_FOCUS_TRAP_ITEM_ACTIONS_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n}));\n\nexport interface ArrowFocusTrapItemActionsProps\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes,\n\t\t\tHTMLDivElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tArrowFocusTrapItemActionsClasses,\n\t\t\tReact.PropsWithChildren<{\n\t\t\t\t//focusActive?: boolean;\n\t\t\t\tindex: number;\n\t\t\t}>\n\t\t> {}\n\nexport const ArrowFocusTrapItemActions = ({\n\tclasses: _classes,\n\tclassName,\n\tindex,\n\tchildren: childrenProp,\n\tonClick,\n\tonMouseDown,\n\t...props\n}: ArrowFocusTrapItemActionsProps) => {\n\tconst {isActive, attributes} = useArrowFocusItemAction({index});\n\tconst {tabIndex, handleMenuClose, handleMenuOpen, ...sendProps} = attributes;\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t});\n\n\tconst children = React.Children.map(childrenProp, (child) => {\n\t\tif (!React.isValidElement(child)) return null;\n\n\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\tif (isFragment(child)) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"The ArrowFocusTrapItemActions component doesn't accept a Fragment as a child.\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn React.cloneElement(child, {\n\t\t\ttabIndex,\n\t\t\t...child.props,\n\t\t\tTransitionProps: {\n\t\t\t\t...child.props?.TransitionProps,\n\t\t\t\tonEnter: handleMenuOpen(child.props?.TransitionProps?.onEnter),\n\t\t\t\tonExit: handleMenuClose(child.props?.TransitionProps?.onExit),\n\t\t\t},\n\t\t});\n\t});\n\n\treturn (\n\t\t {\n\t\t\t\t// prevents things like ListItemButton from showing animations\n\t\t\t\t// when clicking on actions/manus\n\t\t\t\tisActive && event.stopPropagation();\n\t\t\t\tonMouseDown?.(event);\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport default ArrowFocusTrapItemActions;\n","import {Action, Actions} from './actions';\n\nexport type State = {\n\tdisabled: boolean;\n\tclickKeysDisabled: boolean;\n\tkeysDisabled: boolean;\n\tactiveIndex: number;\n\ttotal: number;\n\tpageSize: number;\n\treturnToIndexOnFocus: number;\n};\n\nexport const getInitialState = (props: Partial): State => {\n\treturn {\n\t\tclickKeysDisabled: false,\n\t\tdisabled: true,\n\t\tactiveIndex: 0,\n\t\tkeysDisabled: false,\n\t\tpageSize: 25,\n\t\treturnToIndexOnFocus: -1,\n\t\ttotal: 0,\n\t\t...props,\n\t};\n};\n\nconst checkIndexLoop = (index: number, total: number) =>\n\tindex > total - 1 ? 0 : index < 0 ? total - 1 : index;\n\nconst keepInBounds = (index: number, total: number) =>\n\tMath.max(Math.min(index, total - 1), 0);\n\nexport const reducer = (state: State, action: Actions): State => {\n\tswitch (action.type) {\n\t\tcase Action.Disable:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdisabled: true,\n\t\t\t};\n\n\t\tcase Action.DisableClickKeys:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tclickKeysDisabled: true,\n\t\t\t};\n\n\t\tcase Action.DisableKeys:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tkeysDisabled: true,\n\t\t\t};\n\n\t\tcase Action.Enable:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdisabled: false,\n\t\t\t};\n\n\t\tcase Action.EnableClickKeys:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tclickKeysDisabled: false,\n\t\t\t};\n\n\t\tcase Action.EnableKeys:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tkeysDisabled: false,\n\t\t\t};\n\n\t\tcase Action.End:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: keepInBounds(state.total - 1, state.total),\n\t\t\t};\n\n\t\tcase Action.Home:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: 0,\n\t\t\t};\n\n\t\tcase Action.NextItem:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: checkIndexLoop(state.activeIndex + 1, state.total),\n\t\t\t};\n\n\t\tcase Action.NextPage:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: keepInBounds(\n\t\t\t\t\tstate.activeIndex + state.pageSize,\n\t\t\t\t\tstate.total,\n\t\t\t\t),\n\t\t\t};\n\n\t\tcase Action.PrevItem:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: checkIndexLoop(state.activeIndex - 1, state.total),\n\t\t\t};\n\n\t\tcase Action.PrevPage:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: keepInBounds(\n\t\t\t\t\tstate.activeIndex - state.pageSize,\n\t\t\t\t\tstate.total,\n\t\t\t\t),\n\t\t\t};\n\n\t\tcase Action.SetActiveItem:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: keepInBounds(action.index, state.total),\n\t\t\t};\n\n\t\tcase Action.SetPageSize:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tpageSize: action.pageSize || 25,\n\t\t\t};\n\n\t\tcase Action.SetReturnToIndexOnFocus:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\treturnToIndexOnFocus: action.index,\n\t\t\t};\n\n\t\tcase Action.SetTotal:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttotal: action.total,\n\t\t\t\tactiveIndex: keepInBounds(state.activeIndex, action.total),\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n};\n\nexport default reducer;\n","import React, {\n\tmemo,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseReducer,\n\tuseRef,\n} from 'react';\n\nimport {unstable_batchedUpdates} from 'react-dom';\nimport {FixedSizeList, VariableSizeList} from 'react-window';\nimport {useDocumentKeyDown} from '@netx/core-components/hooks/useDocumentKeyDown';\nimport {useEnhancedRef} from '@netx/core-components/hooks/useEnhancedRef';\nimport {createSyntheticEvent} from '@netx/core/utils';\n\nimport {\n\tAction,\n\tPublicContext,\n\tInternalContext,\n\tPublicContextDescriptor,\n\tInternalContextDescriptor,\n\tgetInitialState,\n\treducer,\n} from '../../store';\nimport {useWhenChangedEffect} from '@netx/core-components/hooks/useWhenChangedEffect';\n\nconst FOCUS_TRAP_NAVIGATION_KEYS = [\n\t'ArrowDown',\n\t'ArrowUp',\n\t'End',\n\t'Home',\n\t'PageDown',\n\t'PageUp',\n] as const;\n\nconst FOCUS_TRAP_NAVIGATION = {\n\tArrowDown: 'NextItem',\n\tArrowUp: 'PrevItem',\n\tEnd: 'End',\n\tHome: 'Home',\n\tPageDown: 'NextPage',\n\tPageUp: 'PrevPage',\n} as const;\n\nexport type ArrowFocusTrapContextProps = {\n\tchildren:\n\t\t| React.ReactNode\n\t\t| ((context: InternalContextDescriptor) => React.ReactNode);\n\tid?: string;\n\tinitialActiveIndex?: number;\n\tactiveDescendantLabel?: string;\n\tpageSize?: number;\n\treturnToIndexOnFocus?: number;\n\ttotal: number;\n\tvirtualListRef?: React.RefObject;\n\tonActiveIndexChange?: (index: number) => void;\n\tonItemClick?: (\n\t\tevent: React.MouseEvent,\n\t\tindex: number,\n\t) => void;\n\tonItemKeyDown?: (\n\t\tevent: React.KeyboardEvent,\n\t\tindex: number,\n\t) => void;\n};\n\nexport const ArrowFocusTrapContext = memo(\n\tReact.forwardRef(\n\t\tfunction ArrowFocusTrapContext(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tactiveDescendantLabel,\n\t\t\t\tinitialActiveIndex,\n\t\t\t\tpageSize,\n\t\t\t\tonActiveIndexChange,\n\t\t\t\tonItemClick,\n\t\t\t\tonItemKeyDown,\n\t\t\t\treturnToIndexOnFocus,\n\t\t\t\ttotal,\n\t\t\t\tchildren,\n\t\t\t\tvirtualListRef,\n\t\t\t},\n\t\t\tref,\n\t\t) {\n\t\t\tconst store = useReducer(\n\t\t\t\treducer,\n\t\t\t\t{\n\t\t\t\t\tactiveIndex: initialActiveIndex != null ? initialActiveIndex : 0,\n\t\t\t\t\tpageSize: pageSize || 25,\n\t\t\t\t\treturnToIndexOnFocus: returnToIndexOnFocus || -1,\n\t\t\t\t\ttotal,\n\t\t\t\t},\n\t\t\t\tgetInitialState,\n\t\t\t);\n\n\t\t\tconst [state, dispatch] = store;\n\t\t\tconst {\n\t\t\t\tkeysDisabled,\n\t\t\t\tclickKeysDisabled,\n\t\t\t\tdisabled,\n\t\t\t\tactiveIndex,\n\t\t\t\treturnToIndexOnFocus: _returnToIndexOnFocus,\n\t\t\t} = state;\n\n\t\t\tconst [stateRef] = useEnhancedRef(state);\n\t\t\tconst [activeIndexRef] = useEnhancedRef(activeIndex);\n\t\t\tconst [disabledRef] = useEnhancedRef(disabled);\n\t\t\tconst justClickedItem = useRef(false);\n\t\t\tconst sendNextFocusToPreviousElement = useRef(false);\n\t\t\tconst justUpdatedIndexFromKeyboard = useRef(false);\n\n\t\t\tuseWhenChangedEffect(state.activeIndex, (activeIndex) => {\n\t\t\t\tonActiveIndexChange?.(activeIndex);\n\t\t\t});\n\n\t\t\tuseEffect(() => {\n\t\t\t\tdispatch({type: Action.SetTotal, total});\n\t\t\t}, [total]);\n\n\t\t\tuseEffect(() => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: Action.SetReturnToIndexOnFocus,\n\t\t\t\t\tindex: returnToIndexOnFocus || -1,\n\t\t\t\t});\n\t\t\t}, [returnToIndexOnFocus]);\n\n\t\t\tuseEffect(() => {\n\t\t\t\tif (\n\t\t\t\t\t!justUpdatedIndexFromKeyboard.current ||\n\t\t\t\t\t(virtualListRef?.current?.state as any)?.isScrolling\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tjustUpdatedIndexFromKeyboard.current = false;\n\t\t\t\tvirtualListRef?.current?.scrollToItem(activeIndex, 'smart');\n\t\t\t}, [activeIndex]);\n\n\t\t\tconst itemClickedTimeout = useRef();\n\t\t\tconst itemClicked = useCallback((index) => {\n\t\t\t\t//if (index === activeIndexRef.current) return;\n\t\t\t\titemClickedTimeout.current && clearTimeout(itemClickedTimeout.current);\n\t\t\t\tjustClickedItem.current = true;\n\t\t\t\titemClickedTimeout.current = setTimeout(() => {\n\t\t\t\t\tjustClickedItem.current = false;\n\t\t\t\t}, 16);\n\t\t\t}, []);\n\n\t\t\tconst disableNextScrollUpdate = useRef(false);\n\t\t\tconst handleScrollIndexUpdate = useCallback(\n\t\t\t\t(index: number, page: number, stopIndex: number) => {\n\t\t\t\t\t// TODO: we should store this info and only use it when refocusing if there is not a return to\n\t\t\t\t\t// but then this needs to know about return to...\n\t\t\t\t\tif (!justClickedItem.current) {\n\t\t\t\t\t\tconst activeIndex = activeIndexRef.current;\n\t\t\t\t\t\tconst disabled = disabledRef.current;\n\t\t\t\t\t\tif (activeIndex < index || activeIndex > stopIndex) {\n\t\t\t\t\t\t\tif (!disableNextScrollUpdate.current || disabled) {\n\t\t\t\t\t\t\t\tdispatch({type: Action.SetActiveItem, index});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdisableNextScrollUpdate.current = false;\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\n\t\t\tconst setActiveIndex = useCallback((index: number) => {\n\t\t\t\tdispatch({type: Action.SetActiveItem, index});\n\t\t\t}, []);\n\n\t\t\tconst handleItemClick = useCallback(\n\t\t\t\t(index: number) =>\n\t\t\t\t\t(event: React.MouseEvent) => {\n\t\t\t\t\t\tsetActiveIndex(index);\n\t\t\t\t\t\tonItemClick?.(event, index);\n\t\t\t\t\t},\n\t\t\t\t[onItemClick],\n\t\t\t);\n\n\t\t\tuseDocumentKeyDown(\n\t\t\t\tuseCallback(\n\t\t\t\t\t(event) => {\n\t\t\t\t\t\tconst {activeIndex, clickKeysDisabled, keysDisabled} =\n\t\t\t\t\t\t\tstateRef.current;\n\t\t\t\t\t\t// TODO: rename/make an action for signifying that actions are focused\n\t\t\t\t\t\t// then we can make a better decision on how to handle things/decouple\n\t\t\t\t\t\t// keys being disabled from actions (as there may be other cases where\n\t\t\t\t\t\t// we want to disable keys when not dealing with actions)\n\t\t\t\t\t\tif (!clickKeysDisabled) {\n\t\t\t\t\t\t\tswitch (event.key) {\n\t\t\t\t\t\t\t\tcase 'Tab': {\n\t\t\t\t\t\t\t\t\tdisableNextScrollUpdate.current = true;\n\t\t\t\t\t\t\t\t\tsendNextFocusToPreviousElement.current = event.shiftKey;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!keysDisabled) {\n\t\t\t\t\t\t\tif (!clickKeysDisabled && activeIndex > -1) {\n\t\t\t\t\t\t\t\tonItemKeyDown?.(\n\t\t\t\t\t\t\t\t\tcreateSyntheticEvent(\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t) as React.KeyboardEvent,\n\t\t\t\t\t\t\t\t\tactiveIndex,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!FOCUS_TRAP_NAVIGATION_KEYS.includes(event.key as any))\n\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\tdisableNextScrollUpdate.current = true;\n\t\t\t\t\t\t\tdispatch({type: Action[FOCUS_TRAP_NAVIGATION[event.key]]});\n\t\t\t\t\t\t\tjustUpdatedIndexFromKeyboard.current = true;\n\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t[onItemKeyDown],\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tdisabled,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst handleItemInteractStart = useCallback(\n\t\t\t\t(index: number) =>\n\t\t\t\t\t(event: React.MouseEvent) => {\n\t\t\t\t\t\tif (!disabledRef.current || event.ctrlKey || event.button === 2)\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\titemClicked(index);\n\t\t\t\t\t\tdispatch({type: Action.SetActiveItem, index});\n\t\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\n\t\t\tconst setReturnToIndexOnFocus = useCallback((index: number) => {\n\t\t\t\tdispatch({type: Action.SetReturnToIndexOnFocus, index});\n\t\t\t}, []);\n\n\t\t\tconst publicContext = useMemo(() => {\n\t\t\t\tconst activeDescendant =\n\t\t\t\t\t!disabled && activeIndex > -1\n\t\t\t\t\t\t? `${activeDescendantLabel}-${activeIndex.toString()}`\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tconst context: PublicContextDescriptor = {\n\t\t\t\t\tactiveIndex,\n\t\t\t\t\tactiveDescendant,\n\t\t\t\t\tdisableNextScrollUpdate,\n\t\t\t\t\tdisabled,\n\t\t\t\t\tjustClickedItem,\n\t\t\t\t\tvirtualListRef,\n\t\t\t\t\thandleItemClick,\n\t\t\t\t\thandleItemInteractStart,\n\t\t\t\t\thandleScrollIndexUpdate,\n\t\t\t\t\tsetActiveIndex,\n\t\t\t\t};\n\n\t\t\t\treturn context;\n\t\t\t}, [\n\t\t\t\tactiveDescendantLabel,\n\t\t\t\tactiveIndex,\n\t\t\t\tdisabled,\n\t\t\t\thandleItemClick,\n\t\t\t\thandleItemInteractStart,\n\t\t\t\thandleScrollIndexUpdate,\n\t\t\t\tsetActiveIndex,\n\t\t\t]);\n\n\t\t\tconst internalContext = useMemo(() => {\n\t\t\t\tconst activeDescendant =\n\t\t\t\t\t!disabled && activeIndex > -1\n\t\t\t\t\t\t? `${activeDescendantLabel}-${activeIndex.toString()}`\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tconst context: InternalContextDescriptor = {\n\t\t\t\t\tactiveDescendant,\n\t\t\t\t\tactiveIndex,\n\t\t\t\t\tclickKeysDisabled,\n\t\t\t\t\tdisableNextScrollUpdate,\n\t\t\t\t\tdisabled,\n\t\t\t\t\tjustClickedItem,\n\t\t\t\t\tkeysDisabled,\n\t\t\t\t\treturnToIndexOnFocus: _returnToIndexOnFocus,\n\t\t\t\t\tsendNextFocusToPreviousElement,\n\t\t\t\t\tvirtualListRef,\n\t\t\t\t\tdispatch,\n\t\t\t\t\thandleItemClick,\n\t\t\t\t\thandleItemInteractStart,\n\t\t\t\t\thandleScrollIndexUpdate,\n\t\t\t\t\tsetActiveIndex,\n\t\t\t\t\tsetReturnToIndexOnFocus,\n\t\t\t\t};\n\n\t\t\t\treturn context;\n\t\t\t}, [\n\t\t\t\tactiveIndex,\n\t\t\t\tclickKeysDisabled,\n\t\t\t\tdisabled,\n\t\t\t\tkeysDisabled,\n\t\t\t\t_returnToIndexOnFocus,\n\t\t\t\tdispatch,\n\t\t\t\thandleItemClick,\n\t\t\t\thandleItemInteractStart,\n\t\t\t\thandleScrollIndexUpdate,\n\t\t\t\tsetActiveIndex,\n\t\t\t\tsetReturnToIndexOnFocus,\n\t\t\t]);\n\n\t\t\tuseImperativeHandle(ref, () => internalContext, [internalContext]);\n\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{typeof children === 'function'\n\t\t\t\t\t\t\t? // TODO: this is fixed with ts4\n\t\t\t\t\t\t\t (children as any)(internalContext)\n\t\t\t\t\t\t\t: children}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t);\n\t\t},\n\t),\n);\n\nexport default ArrowFocusTrapContext;\n","import React from 'react';\n\nimport {\n\tArrowFocusTrapContext,\n\tArrowFocusTrapContextProps,\n} from './contexts/ArrowFocusTrapContext';\n\ntype Props = JSX.IntrinsicAttributes &\n\tJSX.LibraryManagedAttributes> & {\n\t\tArrowFocusTrapContextProps: ArrowFocusTrapContextProps;\n\t};\n\n/**\n * wrap component in arrow focus trap provider\n * @example\n\tconst WrappedComponenet = withArrowFocusTrap(Componenet, {...});\n */\nexport const withArrowFocusTrap = function (\n\tComponent: C,\n\tdefaults?: Partial,\n) {\n\treturn React.forwardRef>(\n\t\t({ArrowFocusTrapContextProps, ...props}, ref) => {\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t>)}\n\t\t\t\t\t/>\n\t\t\t\t\n\t\t\t);\n\t\t},\n\t);\n};\n\nexport default withArrowFocusTrap;\n","import {useContext} from 'react';\n\nimport {InternalContext} from '../../store/context';\nexport interface UseArrowFocusTrapArguments {}\n\nexport const useArrowFocusTrap = (props?: UseArrowFocusTrapArguments) => {\n\tconst {\n\t\tactiveDescendant,\n\t\tdisabled,\n\t\tdispatch,\n\t\tactiveIndex,\n\t\tclickKeysDisabled,\n\t\tdisableNextScrollUpdate,\n\t\tkeysDisabled,\n\t\tjustClickedItem,\n\t\treturnToIndexOnFocus,\n\t\tsendNextFocusToPreviousElement,\n\t\thandleScrollIndexUpdate,\n\t\thandleItemClick,\n\t\tvirtualListRef,\n\t} = useContext(InternalContext);\n\n\treturn {\n\t\tactiveDescendant,\n\t\tactiveIndex,\n\t\tclickKeysDisabled,\n\t\tdisableNextScrollUpdate,\n\t\tdisabled,\n\t\tjustClickedItem,\n\t\tkeysDisabled,\n\t\treturnToIndexOnFocus,\n\t\tsendNextFocusToPreviousElement,\n\t\tdispatch,\n\t\thandleScrollIndexUpdate,\n\t\thandleItemClick,\n\t\tvirtualListRef,\n\t};\n};\n\nexport default useArrowFocusTrap;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const ARROW_FOCUS_TRAP_ITEMS_CLASS_NAME = 'ArrowFocusTrapItems';\n\nexport const ARROW_FOCUS_TRAP_ITEMS_CLASS_SLOTS = ['root'] as const;\n\nexport type ArrowFocusTrapItemsClassSlot = typeof ARROW_FOCUS_TRAP_ITEMS_CLASS_SLOTS[number];\n\nexport interface ArrowFocusTrapItemsClasses {\n\troot: string;\n\ttrapActive: string;\n}\n\nexport type ArrowFocusTrapItemsClassKey = keyof ArrowFocusTrapItemsClasses;\n\nexport const getArrowFocusTrapItemsUtilityClass = (\n\tslot: ArrowFocusTrapItemsClassSlot,\n) => generateUtilityClass(ARROW_FOCUS_TRAP_ITEMS_CLASS_NAME, slot);\n\nexport const arrowFocusTrapItemsClasses: ArrowFocusTrapItemsClasses = generateUtilityClasses(\n\tARROW_FOCUS_TRAP_ITEMS_CLASS_NAME,\n\t['root', 'trapActive'],\n);\n\nexport default arrowFocusTrapItemsClasses;\n","import React, {useCallback, useRef} from 'react';\nimport clsx from 'clsx';\nimport {FixedSizeList, VariableSizeList} from 'react-window';\n\nimport useSharedRef from '@netx/core-components/hooks/useSharedRef';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {withArrowFocusTrap} from '../../withArrowFocusTrap';\nimport {useArrowFocusTrap} from '../../hooks';\nimport {Action} from '../../store/actions';\nimport {\n\tgetArrowFocusTrapItemsUtilityClass,\n\tarrowFocusTrapItemsClasses,\n\tArrowFocusTrapItemsClasses,\n\tARROW_FOCUS_TRAP_ITEMS_CLASS_NAME,\n} from './arrowFocusTrapItemsClasses';\n\ntype Ref = React.Ref;\n\ntype ArrowFocusTrapItemsUtiltiyClassProps = WithClasses<\n\tArrowFocusTrapItemsClasses,\n\t{\n\t\ttrapActive?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (\n\townerState: ArrowFocusTrapItemsUtiltiyClassProps,\n) => {\n\tconst {classes, trapActive} = ownerState;\n\tconst slots = {\n\t\troot: ['root', trapActive && 'trapActive'],\n\t};\n\treturn composeClasses(slots, getArrowFocusTrapItemsUtilityClass, classes);\n};\n\nconst ArrowFocusTrapItemsRoot = styled('div', {\n\tname: ARROW_FOCUS_TRAP_ITEMS_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tflex: '1 1 auto',\n}));\n\nconst FOCUSABLE_ELEMENTS =\n\t'a:not([disabled]):not([tabindex=\"-1\"]), button:not([disabled]):not([tabindex=\"-1\"]), input[type=text]:not([disabled]), [tabindex]:not([disabled]):not([tabindex=\"-1\"])';\n\nfunction focusPreviousElement() {\n\tif (!document.activeElement) return;\n\n\tconst focussable = Array.prototype.filter.call(\n\t\tdocument.querySelectorAll(FOCUSABLE_ELEMENTS),\n\t\t(element: HTMLElement) =>\n\t\t\telement.offsetWidth > 0 ||\n\t\t\telement.offsetHeight > 0 ||\n\t\t\telement === document.activeElement,\n\t);\n\n\tconst index = focussable.indexOf(document.activeElement);\n\tif (index < 0) return;\n\n\tconst nextElement = focussable[index - 1] || focussable[0];\n\tnextElement?.focus();\n}\n\nexport interface ArrowFocusTrapItemsProps\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes,\n\t\t\tHTMLDivElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tArrowFocusTrapItemsClasses,\n\t\t\tReact.PropsWithChildren<{\n\t\t\t\talign?: 'auto' | 'smart' | 'center' | 'end' | 'start';\n\t\t\t\tdisableScrollToOnFocusCapture?: boolean;\n\t\t\t\treturnToIndexOnFocus?: number;\n\t\t\t\tref?: React.LegacyRef;\n\t\t\t\tvirtualListRef?: React.RefObject<\n\t\t\t\t\tFixedSizeList | VariableSizeList | null\n\t\t\t\t>;\n\t\t\t}>\n\t\t> {}\n\nconst ArrowFocusTrapItemsInner = (\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tchildren: childrenProp,\n\t\talign = 'smart',\n\t\tdisableScrollToOnFocusCapture,\n\t\treturnToIndexOnFocus,\n\t\tvirtualListRef,\n\t\t...props\n\t}: ArrowFocusTrapItemsProps,\n\tref: Ref,\n) => {\n\tconst {\n\t\tactiveDescendant,\n\t\tclickKeysDisabled,\n\t\tdisableNextScrollUpdate,\n\t\tsendNextFocusToPreviousElement,\n\t\tdisabled,\n\t\tdispatch,\n\t\tactiveIndex,\n\t\tkeysDisabled,\n\t\tjustClickedItem,\n\t\treturnToIndexOnFocus: _returnToIndexOnFocus,\n\t\tvirtualListRef: contextVirtualListRef,\n\t} = useArrowFocusTrap();\n\n\t// TODO: c'mon... gross\n\t// really we need to get rid of the items component (as well as all the others)\n\t// and converting what is left over to another hook (like items (item, action))\n\tconst __returnToIndexOnFocus =\n\t\t_returnToIndexOnFocus > -1 ? _returnToIndexOnFocus : returnToIndexOnFocus;\n\n\tconst stateRef = useRef({\n\t\tactiveIndex,\n\t\tclickKeysDisabled,\n\t\tdisabled,\n\t\tkeysDisabled,\n\t});\n\tstateRef.current = {\n\t\tactiveIndex,\n\t\tclickKeysDisabled,\n\t\tdisabled,\n\t\tkeysDisabled,\n\t};\n\n\tconst rootRef = useSharedRef(null, [ref]);\n\n\tconst blurTimeout = useRef();\n\tconst hasFocus = useRef(false);\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\ttrapActive: disabled,\n\t});\n\n\tuseWhenChangedEffect(\n\t\tactiveIndex,\n\t\tuseCallback(\n\t\t\t(activeIndex) => {\n\t\t\t\tconst listRef = virtualListRef || contextVirtualListRef;\n\t\t\t\tif (\n\t\t\t\t\tjustClickedItem.current ||\n\t\t\t\t\t!listRef?.current ||\n\t\t\t\t\t(listRef.current.state as any).isScrolling ||\n\t\t\t\t\tdisableScrollToOnFocusCapture\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tlistRef.current.scrollToItem(activeIndex, align);\n\t\t\t},\n\t\t\t[disabled, disableScrollToOnFocusCapture, align],\n\t\t),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\tconst handleBlur = useCallback((event: React.FocusEvent) => {\n\t\t// blur will occur when moving to anither element even if that\n\t\t// element is a descendant of ours (since that is how bubbled\n\t\t// events work)\n\t\tif (blurTimeout.current) clearTimeout(blurTimeout.current);\n\t\t// if (focusTimeout.current) clearTimeout(focusTimeout.current);\n\t\tblurTimeout.current = setTimeout(() => {\n\t\t\tdispatch({type: Action.Disable});\n\t\t\thasFocus.current = false;\n\t\t}, 16);\n\t}, []);\n\n\t// const focusTimeout = useRef();\n\tconst handleFocus = useCallback(\n\t\t(event: React.FocusEvent) => {\n\t\t\tif (blurTimeout.current) clearTimeout(blurTimeout.current);\n\t\t\t// if (focusTimeout.current) clearTimeout(focusTimeout.current);\n\n\t\t\tconst sendFocus = sendNextFocusToPreviousElement.current;\n\t\t\tsendNextFocusToPreviousElement.current = false;\n\n\t\t\tif (sendFocus) {\n\t\t\t\tfocusPreviousElement();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (hasFocus.current) {\n\t\t\t\tdispatch({type: Action.Enable});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thasFocus.current = true;\n\n\t\t\t//focusTimeout.current = setTimeout(() => {\n\t\t\tif (\n\t\t\t\t!justClickedItem.current &&\n\t\t\t\t__returnToIndexOnFocus != null &&\n\t\t\t\t__returnToIndexOnFocus > -1\n\t\t\t) {\n\t\t\t\tdispatch({type: Action.SetActiveItem, index: __returnToIndexOnFocus});\n\t\t\t}\n\n\t\t\tdispatch({type: Action.Enable});\n\n\t\t\tdisableNextScrollUpdate.current = true;\n\n\t\t\tconst listRef = virtualListRef || contextVirtualListRef;\n\n\t\t\tif (disableScrollToOnFocusCapture || !listRef?.current) return;\n\n\t\t\tconst {activeIndex} = stateRef.current;\n\t\t\tif (\n\t\t\t\t!(listRef.current.state as any).isScrolling &&\n\t\t\t\t!stateRef.current.disabled &&\n\t\t\t\tevent.target === rootRef.current\n\t\t\t) {\n\t\t\t\tlistRef.current.scrollToItem(activeIndex);\n\t\t\t}\n\t\t\t//}, 16);\n\t\t},\n\t\t[__returnToIndexOnFocus, disableScrollToOnFocusCapture],\n\t);\n\n\treturn (\n\t\t\n\t\t\t{childrenProp}\n\t\t\n\t);\n};\n\nexport const ArrowFocusTrapItemsPrimitive = React.forwardRef(\n\tArrowFocusTrapItemsInner,\n) as (props: ArrowFocusTrapItemsProps, ref?: Ref) => JSX.Element;\n\nexport const ArrowFocusTrapItems = withArrowFocusTrap(\n\tArrowFocusTrapItemsPrimitive,\n);\n\nexport default ArrowFocusTrapItems;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const ACTION_MENU_CLASS_NAME = 'ActionMenu';\nexport const ACTION_MENU_CLASS_SLOTS = ['root', 'skeleton'] as const;\n\nexport type ActionMenuClassSlot = typeof ACTION_MENU_CLASS_SLOTS[number];\n\nexport interface ActionMenuClasses {\n\troot: string;\n\tskeleton: string;\n\tfab: string;\n\ticon: string;\n}\n\nexport type ActionMenuClassKey = keyof ActionMenuClasses;\n\nexport const getActionMenuUtilityClass = (slot: ActionMenuClassSlot) =>\n\tgenerateUtilityClass(ACTION_MENU_CLASS_NAME, slot);\n\nexport const actionMenuClasses = generateUtilityClasses<\n\tkeyof ActionMenuClasses\n>(ACTION_MENU_CLASS_NAME, ['root', 'skeleton', 'fab', 'icon']);\nexport default actionMenuClasses;\n","// TODO: There is a way to combine this with the header action component\n// I just need a little more time\nimport React, {useCallback, useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\n\nimport {faEllipsisV as EllipsisIcon} from '@fortawesome/pro-solid-svg-icons';\nimport {\n\tMenu as MuiMenu,\n\tMenuProps as MuiMenuProps,\n\tPopoverProps,\n\tSkeleton,\n\tSkeletonProps,\n\tDivider,\n} from '@mui/material';\nimport type {ReactAction} from '@netx/core/bootstrap';\nexport type {ReactAction} from '@netx/core/bootstrap';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithClasses,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\nimport ActionButton, {ActionButtonProps} from '../ActionButton';\nimport MenuItem from '../MenuItem';\nimport {\n\tactionMenuClasses,\n\tgetActionMenuUtilityClass,\n\tActionMenuClasses,\n\tACTION_MENU_CLASS_NAME,\n} from './actionMenuClasses';\n\nexport type ActionMenuOwnerState = WithClasses<\n\tActionMenuClasses,\n\t{\n\t\tbuttonVariant: 'fab' | 'icon';\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: ActionMenuOwnerState) => {\n\tconst {buttonVariant, classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t\tskeleton: ['skeleton', buttonVariant],\n\t};\n\treturn composeClasses(slots, getActionMenuUtilityClass, classes);\n};\n\nconst ActionMenuSkeleton = styled(Skeleton, {\n\tname: ACTION_MENU_CLASS_NAME,\n\tslot: 'Skeleton',\n})(({theme}) => ({\n\t[`&.${actionMenuClasses.fab}`]: {\n\t\theight: 56,\n\t\twidth: 56,\n\t},\n\t[`&.${actionMenuClasses.icon}`]: {\n\t\theight: 42,\n\t\twidth: 42,\n\t},\n}));\n\nexport interface ActionMenuProps\n\textends Partial>>,\n\t\tWithClasses {\n\tactions: Array;\n\tbuttonVariant?: 'fab' | 'icon';\n\talwaysUseEllipsis?: boolean;\n\tdisabled?: boolean;\n\tloading?: boolean;\n\ttitle?: string;\n\tActionButtonProps?: Partial;\n\tSkeletonProps?: Partial;\n\tonAction?: (action: ReactAction) => void;\n\tonClick?: () => void;\n}\n\nconst onActionDefault = (action: ReactAction) => action?.cb();\n\nconst ActionMenu = React.forwardRef(\n\t(\n\t\t{\n\t\t\tclasses: _classes,\n\t\t\tclassName,\n\t\t\tactions,\n\t\t\talwaysUseEllipsis,\n\t\t\tbuttonVariant = 'icon',\n\t\t\tdisabled,\n\t\t\tloading,\n\t\t\ttabIndex,\n\t\t\ttitle,\n\t\t\tActionButtonProps,\n\t\t\tonAction = onActionDefault,\n\t\t\tonClose,\n\t\t\tonClick,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [anchorEl, setAnchorEl] = useState();\n\t\tconst [open, setOpen] = useState(false);\n\n\t\tconst ownerState: ActionMenuOwnerState = {\n\t\t\tbuttonVariant,\n\t\t};\n\t\tconst classes = useUtilityClasses(ownerState);\n\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tonClose?.({}, '' as any);\n\t\t\t};\n\t\t}, [onClose]);\n\n\t\tconst handleClose = useCallback['onClose']>(\n\t\t\t(event: React.MouseEvent, reason) => {\n\t\t\t\tevent.persist();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tsetOpen(false);\n\t\t\t\tonClose?.(event, reason);\n\t\t\t},\n\t\t\t[onClose],\n\t\t);\n\n\t\t/** Menu exited */\n\t\tconst handleExited = useCallback(\n\t\t\t(node) => {\n\t\t\t\tsetAnchorEl(undefined);\n\t\t\t\tprops.TransitionProps?.onExited?.(node);\n\t\t\t},\n\t\t\t[props.TransitionProps?.onExited],\n\t\t);\n\n\t\tconst handleShowClick = useCallback(\n\t\t\t(event: React.MouseEvent) => {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tonClick?.();\n\n\t\t\t\tsetAnchorEl(event.currentTarget);\n\t\t\t\tsetOpen(true);\n\t\t\t},\n\t\t\t[onClick],\n\t\t);\n\n\t\tconst handleActionClick = useCallback(\n\t\t\t(action: ReactAction) =>\n\t\t\t\t(\n\t\t\t\t\tevent: React.MouseEvent<\n\t\t\t\t\t\tHTMLAnchorElement | HTMLLIElement,\n\t\t\t\t\t\tMouseEvent\n\t\t\t\t\t>,\n\t\t\t\t) => {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tsetOpen(false);\n\t\t\t\t\tonAction(action);\n\t\t\t\t\tonClose?.(event, 'escapeKeyDown');\n\t\t\t\t},\n\t\t\t[onAction],\n\t\t);\n\n\t\tconst buttonTitle = title != null ? title : i18n.t('i18n.openMenu');\n\n\t\tif (!actions.length) return null;\n\t\t// TODO: we should just be doing this - need to see if anything is relying on us doing it the hard way below\n\t\t// if (loading) return \n\n\t\t// Just show the single action as an icon button\n\t\tif (\n\t\t\t!loading &&\n\t\t\t!alwaysUseEllipsis &&\n\t\t\tactions.length === 1 &&\n\t\t\t!Array.isArray(actions[0])\n\t\t) {\n\t\t\tconst action = actions[0];\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{loading ? (\n\t\t\t\t\t\n\t\t\t\t) : (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{anchorEl ? (\n\t\t\t\t\t {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tTransitionProps={{\n\t\t\t\t\t\t\t...props.TransitionProps,\n\t\t\t\t\t\t\tonExited: handleExited,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{actions.map((action, index) => {\n\t\t\t\t\t\t\tif (Array.isArray(action))\n\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\tindex > 0 ? : null,\n\t\t\t\t\t\t\t\t\t...action.map((action) => (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t)),\n\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\t\t);\n\t},\n);\n\nexport default ActionMenu;\n","// Error boundaries must currently be classes see `ErrorBoundary` for our function wrapper\n// If you use this file directly you will not have a good time trying to get themed styles in\n\nimport React, {PropsWithChildren} from 'react';\n\nimport Button from '@netx/core-components/Button';\nimport {faExclamationCircle as ExclamationIcon} from '@fortawesome/pro-regular-svg-icons';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport Fallback from '../Drawer/Fallback';\n\ninterface ErrorBoundaryState {\n\thasError: boolean;\n}\n\ninterface ErrorBoundaryProps {\n\tclassName?: string;\n\tstyles?: any;\n}\n\nclass ErrorBoundary extends React.Component<\n\tPropsWithChildren\n> {\n\tstate: ErrorBoundaryState;\n\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = {hasError: false};\n\t}\n\n\tstatic getDerivedStateFromError(error) {\n\t\t// Update state so the next render will show the fallback UI.\n\t\treturn {hasError: true};\n\t}\n\n\tcomponentDidCatch(error, errorInfo) {\n\t\t// You can also log the error to an error reporting service\n\t\tconsole.log(error, errorInfo);\n\t}\n\n\trender() {\n\t\tconst {className, styles} = this.props;\n\t\tif (this.state.hasError) {\n\t\t\treturn (\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{i18n.t('i18n.reload')}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t);\n\t\t}\n\n\t\treturn this.props.children;\n\t}\n\n\treset() {\n\t\tthis.setState({hasError: false});\n\t}\n}\n\nexport default ErrorBoundary;\n","// Wrapper for the error boundary class for easier passing of styles with theme support\nimport React from 'react';\nimport type {CSSProperties} from '@mui/styles/withStyles';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport {useTheme, Theme} from '@netx/core-components/Theme';\n\nimport ErrorBoundaryClass from './_ErrorBoundary';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tflexDirection: 'column',\n\t\t\twidth: '100%',\n\t\t},\n\t});\n\nexport interface ErrorBoundaryProps {\n\tstyles?: (theme: Theme) => CSSProperties | CSSProperties;\n}\n\n/**\n * Wrapper for the error boundary class for easier passing of styles with theme support\n *\n * DEVNOTE: It is advised to place an error boundary at the highest level possible \\\n * Due to the nature of our app we will currently be wrapping the highest level \\\n * of our components as we can (without having a react wrapper around the whole app) \\\n * As we move forward and make progress we can remove the wrapper from lower levels \\\n * and keep moving up the tree until (one day) we get to the top of the app\n */\n// TODO: convert this to styled and anything that wants to use it can just wrap in styled\n// and we can do away with this `any` (`WithStyles` is deprecated and does not play well\n// with ts)\nconst ErrorBoundary = ({\n\tclasses,\n\tchildren,\n\tstyles,\n}: React.PropsWithChildren & ErrorBoundaryProps>) => {\n\tconst theme = useTheme();\n\t// Support passing theme to callback for styles\n\tconst _styles = typeof styles === 'function' ? styles(theme) : styles;\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(ErrorBoundary);\n","import React from 'react';\nimport ErrorBoundary, {ErrorBoundaryProps} from './ErrorBoundary';\n\n/**\n * Wrap component in error boundary \\\n * An error boundary catches all (un-catched) errors within its children \n * \n * DEVNOTE: It is advised to place an error boundary at the highest level possible \\\n * Due to the nature of our app we will currently be wrapping the highest level \\\n * of our components as we can (without having a react wrapper around the whole app) \\\n * As we move forward and make progress we can remove the wrapper from lower levels \\\n * and keep moving up the tree until (one day) we get to the top of the app\n * @example\n import Component from 'my-component';\n const ErrorBoundariedComponent = withErrorBoundary(Component);\n ...\n const MyComponent = withErrorBoundary((props: Props) => {...});\n ...\n const MyComponent = (props: Props) => {...};\n export default withErrorBoundary(MyComponent);\n */\nconst withErrorBoundary = function <\n\tC extends React.ComponentType>\n>(Component: C, styles?: ErrorBoundaryProps['styles']) {\n\treturn (props: React.ComponentProps) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t{/** i do not have the energy to deal with this - the most important thing is the outside world is getting proper typing */}\n\t\t\t\t\n\t\t\t\n\t\t);\n\t};\n};\n\nexport default withErrorBoundary;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const TOGGLE_BUTTON_CLASS_NAME = 'ToggleButton';\nexport const TOGGLE_BUTTON_CLASS_SLOTS = ['root', 'background'] as const;\n\nexport type ToggleButtonClassSlot = typeof TOGGLE_BUTTON_CLASS_SLOTS[number];\n\nexport interface ToggleButtonClasses {\n\troot: string;\n\tbackground: string;\n\tactive: string;\n\tfill: string;\n}\n\nexport type ToggleButtonClassKey = keyof ToggleButtonClasses;\n\nexport const getToggleButtonUtilityClass = (slot: ToggleButtonClassSlot) =>\n\tgenerateUtilityClass(TOGGLE_BUTTON_CLASS_NAME, slot);\n\nexport const toggleButtonClasses: ToggleButtonClasses = generateUtilityClasses(\n\tTOGGLE_BUTTON_CLASS_NAME,\n\t['root', 'active', 'background', 'fill'],\n);\n\nexport default toggleButtonClasses;\n","import React, {useCallback, useEffect, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {darken, lighten} from '@mui/system';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {useConfirmation} from '../Confirmation/ConfirmationService';\nimport IconButton, {IconButtonProps} from '../IconButton';\nimport {\n\ttoggleButtonClasses,\n\tgetToggleButtonUtilityClass,\n\tToggleButtonClasses,\n\tTOGGLE_BUTTON_CLASS_NAME,\n} from './toggleButtonClasses';\n\ntype IconButtonMethods = Required>;\n\ntype ToggleButtonUtiltiyClassProps = WithClasses<\n\tToggleButtonClasses,\n\t{\n\t\tactive?: boolean;\n\t\tcolor: Required['color'];\n\t\tfill?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: ToggleButtonUtiltiyClassProps) => {\n\tconst {classes, active, fill} = ownerState;\n\tconst slots = {\n\t\troot: ['root', active && 'active', fill && 'fill'],\n\t\tbackground: ['background'],\n\t};\n\treturn composeClasses(slots, getToggleButtonUtilityClass, classes);\n};\n\nconst ToggleButtonRoot = styled(IconButton, {\n\tname: TOGGLE_BUTTON_CLASS_NAME,\n\tslot: 'Root',\n})(({theme, ...props}) => {\n\tconst light = theme.palette.mode === 'light';\n\tconst getBackgroundColor = light ? darken : lighten;\n\tconst ownerState = props.ownerState as ToggleButtonUtiltiyClassProps;\n\treturn {\n\t\t[`&.${toggleButtonClasses.active}`]: {\n\t\t\tcolor:\n\t\t\t\ttheme.palette[ownerState.color]?.contrastText ||\n\t\t\t\ttheme.palette.primary.contrastText,\n\t\t\t[`& .${toggleButtonClasses.background}`]: {\n\t\t\t\ttransform: 'scale(1)',\n\t\t\t},\n\t\t},\n\t\t[`& .${toggleButtonClasses.background}`]: {\n\t\t\tbackgroundColor:\n\t\t\t\townerState.color === 'inherit'\n\t\t\t\t\t? 'inherit'\n\t\t\t\t\t: getBackgroundColor(\n\t\t\t\t\t\t\ttheme.palette[ownerState.color]?.main ||\n\t\t\t\t\t\t\t\ttheme.palette.primary.main,\n\t\t\t\t\t\t\t0.05,\n\t\t\t\t\t ),\n\t\t\t...(ownerState.fill\n\t\t\t\t? {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\ttop: 4,\n\t\t\t\t\t\tright: 4,\n\t\t\t\t\t\tbottom: 4,\n\t\t\t\t\t\tleft: 4,\n\t\t\t\t }),\n\t\t},\n\t};\n});\n\nconst ToggleButtonBackground = styled('div', {\n\tname: TOGGLE_BUTTON_CLASS_NAME,\n\tslot: 'Background',\n})(({theme}) => ({\n\tdisplay: 'block',\n\tpointerEvents: 'none',\n\tborderRadius: '50%',\n\ttransformOrigin: 'center',\n\ttransform: 'scale(0)',\n\ttransition: 'transform .15s ease-in-out',\n\tposition: 'absolute',\n}));\n\ninterface ConfirmProps {\n\tmessage: string;\n\ttitle: string;\n}\n\nexport interface ToggleButtonProps\n\textends Omit,\n\t\tWithClasses<\n\t\t\tToggleButtonClasses,\n\t\t\t{\n\t\t\t\tconfirm?: ConfirmProps;\n\t\t\t\tfill?: boolean;\n\t\t\t\ton?: boolean;\n\t\t\t\tonToggle?: (\n\t\t\t\t\tevent: React.MouseEvent,\n\t\t\t\t\ton: boolean,\n\t\t\t\t) => void;\n\t\t\t}\n\t\t> {}\n\nexport const ToggleButtonPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\tcolor = 'default',\n\tconfirm,\n\tfill,\n\ton = false,\n\tonClick,\n\tonToggle,\n\t...props\n}: ToggleButtonProps) => {\n\tconst confirmation = useConfirmation();\n\n\t// TODO: fix this, on state should be solely controlled from the outside\n\tconst [isOn, setIsOn] = useState(on);\n\tuseEffect(() => {\n\t\tsetIsOn(on);\n\t}, [on]);\n\n\tconst ownerState = {\n\t\tclasses: _classes,\n\t\tactive: isOn,\n\t\tcolor,\n\t\tfill,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst toggle = useCallback(\n\t\t(event: React.MouseEvent) => {\n\t\t\tsetIsOn((isOn) => {\n\t\t\t\t// Gives the UI time to animate without choking on\n\t\t\t\t// what the toggle does\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tonToggle?.(event, !isOn);\n\t\t\t\t}, 1);\n\t\t\t\treturn !isOn;\n\t\t\t});\n\t\t},\n\t\t[onToggle],\n\t);\n\n\tconst handleClick = useCallback(\n\t\t(event: React.MouseEvent) => {\n\t\t\tevent.persist();\n\t\t\tonClick?.(event);\n\t\t\t// if (event.defaultPrevented) return;\n\n\t\t\tevent.stopPropagation();\n\t\t\tif (!confirm) return toggle(event);\n\t\t\tconfirmation({\n\t\t\t\tdescription: confirm.message,\n\t\t\t\ttitle: confirm.title,\n\t\t\t}).then(() => toggle(event));\n\t\t},\n\t\t[confirm, onClick, toggle],\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport const ToggleButton = ToggleButtonPrimitive;\n\nexport default ToggleButton;\n","import React from 'react';\n\nimport {WithMuiPropOverrides} from '@netx/core-components/Theme';\n\nimport MuiMenuList, {\n\tMenuListProps as MuiMenuListProps,\n} from '@mui/material/MenuList';\n\nexport interface MenuListProps\n\textends Partial> {}\n\nconst MenuList = React.forwardRef(\n\t(props, ref) => ,\n);\n\nexport default MenuList;\n","import React, {PropsWithChildren, useState, useCallback} from 'react';\n\nimport StylesEngineProvider from '@mui/material/StyledEngineProvider';\nimport {darken, lighten} from '@mui/system';\nimport type {CSSProperties} from '@mui/styles/withStyles';\nimport {createTheme, ThemeProvider} from '@mui/material/styles';\nimport {isPortal} from '@netx/core/lib/utils';\n\nimport {useDispatcher} from '@netx/core-components/hooks/useDispatcher';\n\nimport {\n\t// ThemeProvider,\n\tuseTheme as useThemeMui,\n\tStylesProvider,\n} from '@mui/styles';\n\nimport Netx, {dispatcher} from '@netx/core/bootstrap';\n\nexport type Type = 'dark' | 'light';\n\nexport type WatermarkPosition =\n\t| 'top-left'\n\t| 'top-right'\n\t| 'bottom-left'\n\t| 'bottom-right'\n\t| 'center';\nlet watermarkCacheBuster = Date.now();\ndispatcher.on('asset:watermark:update', () => {\n\twatermarkCacheBuster = Date.now();\n});\n\nexport enum Severity {\n\tDEFAULT = 'default',\n\tERROR = 'error',\n\tINFO = 'info',\n\tPRIMARY = 'primary',\n\tSECONDARY = 'secondary',\n\tSUCCESS = 'success',\n\tWARNING = 'warning',\n}\n\nexport const SEVERITIES = Object.values(Severity);\n\nexport type SeverityCSSProperties = Record;\nexport type SeverityColors = Record<\n\tSeverity,\n\t{\n\t\tdefault: string;\n\t\ttext: string;\n\t\thover: string;\n\t}\n>;\n\nconst getPortal = () =>\n\tisPortal() && (Netx as any).cms?.portal?.id && (Netx as any).cms?.portal;\n\nexport const getSeverityColors = (theme: Theme) => {\n\tconst light = theme.palette.mode === 'light';\n\tconst getBackgroundColor = light ? darken : lighten;\n\tconst severities: SeverityColors = {} as SeverityColors;\n\tSEVERITIES.forEach((key) => {\n\t\tseverities[key] =\n\t\t\tkey === 'default'\n\t\t\t\t? {\n\t\t\t\t\t\tdefault: theme.palette.secondary.main,\n\t\t\t\t\t\ttext: theme.palette.secondary.contrastText,\n\t\t\t\t\t\thover: getBackgroundColor(theme.palette.secondary.main, 0.05),\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\tdefault: theme.palette[key].main,\n\t\t\t\t\t\ttext: theme.palette[key].contrastText,\n\t\t\t\t\t\thover: getBackgroundColor(theme.palette[key].main, 0.05),\n\t\t\t\t };\n\t});\n\treturn severities;\n};\n\nexport const getButtonSeverityStyles = (\n\ttheme: Theme,\n\tinnerWrapper?: string,\n) => {\n\tconst light = theme.palette.mode === 'light';\n\tconst getBackgroundColor = light ? darken : lighten;\n\tconst buttonSeverities: SeverityCSSProperties = {} as SeverityCSSProperties;\n\tSEVERITIES.forEach((key) => {\n\t\tconst styles: CSSProperties =\n\t\t\tkey === 'default'\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\t'&, &disabled': {\n\t\t\t\t\t\t\t'&$contained': {\n\t\t\t\t\t\t\t\tcolor: `#fff !important`,\n\t\t\t\t\t\t\t\tfontWeight: theme.typography.fontWeightMedium,\n\t\t\t\t\t\t\t\tbackgroundColor: `${theme.palette[key].main} !important`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'&$outlined': {\n\t\t\t\t\t\t\t\tborderColor: `${theme.palette[key].main} !important`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'&$outlined, &$text': {\n\t\t\t\t\t\t\t\tcolor: `${theme.palette[key].main} !important`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'&$contained:hover': {\n\t\t\t\t\t\t\tbackgroundColor: getBackgroundColor(\n\t\t\t\t\t\t\t\ttheme.palette[key].main,\n\t\t\t\t\t\t\t\t0.05,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'&$disabled': {\n\t\t\t\t\t\t\topacity: 0.5,\n\t\t\t\t\t\t},\n\t\t\t\t };\n\t\tbuttonSeverities[key] = innerWrapper ? {[innerWrapper]: styles} : styles;\n\t});\n\treturn buttonSeverities;\n};\n\nexport const getStylePropertyDemo = (key: string, type: Type = 'light') => {\n\tconst light = type === 'light';\n\tswitch (key) {\n\t\tcase 'background':\n\t\tcase 'surface':\n\t\t\treturn light ? '#fafafa' : '#242424';\n\t\tcase 'custom-backdrop':\n\t\t\treturn light ? 'rgba(250, 250, 250, 0.85)' : 'rgba(36, 36, 36, 0.75)';\n\t\tcase 'custom-background-accent':\n\t\t\treturn light ? 'rgba(0, 0, 0, 0.02)' : 'rgba(255, 255, 255, 0.02)';\n\t\tcase 'custom-background-light':\n\t\t\treturn light ? 'rgba(0, 0, 0, 0.04)' : 'rgba(255, 255, 255, 0.04)';\n\t\tcase 'custom-border':\n\t\t\treturn light ? 'rgba(0, 0, 0, 0.08)' : 'rgba(255, 255, 255, 0.16)';\n\t\tcase 'on-primary':\n\t\tcase 'on-secondary':\n\t\t\treturn '#fff';\n\t\tcase 'primary':\n\t\tcase 'secondary':\n\t\t\treturn '#3884f8';\n\t\tcase 'text-icon-on-background':\n\t\t\treturn light ? 'rgba(0, 0, 0, 0.38)' : 'rgba(255, 255, 255, 0.87)';\n\t\tcase 'text-primary-on-background':\n\t\tcase 'text-secondary-on-background':\n\t\t\treturn light ? 'rgba(0, 0, 0, 0.87)' : 'rgba(255, 255, 255, 0.87)';\n\t}\n\treturn '';\n};\n\nexport const defaultMuiTheme = createTheme();\n\n// @ts-ignore\nexport const isSafari = window.safari != null;\n\nexport const getPlaceholderOpacity = (type: Type = 'light') => {\n\t// We need to get better contrast for accessibility\n\t// 0.618 gets us the exact color that the browser placeholder default color is\n\t// increaased the dark by .05 as well\n\treturn {opacity: type === 'light' ? 0.618 : 0.55};\n};\n\nexport const getOutlinedBorderColor = (type: Type = 'light') => {\n\t// Need our outlined input border colors to meet minimum contrast\n\treturn type === 'light' ? 'rgba(0, 0, 0, 0.42)' : 'rgba(255, 255, 255, 0.38)';\n};\n\nexport const getHintTextColor = (type: Type = 'light') => {\n\t// Increase for accessibilty\n\treturn type === 'light' ? 'rgba(0, 0, 0, 0.55)' : 'rgba(255, 255, 255, 0.48)';\n};\n\nexport const strToHslColor = (str: string, s: number, l: number) => {\n\tlet hash = 0;\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = str.charCodeAt(i) + ((hash << 5) - hash);\n\t}\n\tconst h = hash % 360;\n\treturn 'hsl(' + h + ', ' + s + '%, ' + l + '%)';\n};\n\nexport const baseTheme = (type: Type = 'light', demo = false) => {\n\tconst outlinedBorderColor = getOutlinedBorderColor(type);\n\tconst placeholderVisible = getPlaceholderOpacity(type);\n\n\tconst getStyleProperty =\n\t\t!demo && Netx.getStyleProperty\n\t\t\t? Netx.getStyleProperty\n\t\t\t: (key: string) => getStylePropertyDemo(key, type);\n\n\treturn createTheme({\n\t\tmixins: {\n\t\t\tabsoluteFill: {\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: 0,\n\t\t\t\tright: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\tleft: 0,\n\t\t\t},\n\t\t\tdisabled: {\n\t\t\t\topacity: 0.5,\n\t\t\t},\n\t\t\tflexFillColumn: {\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflex: '1 1 auto',\n\t\t\t\tflexDirection: 'column',\n\t\t\t\tminHeight: 0,\n\t\t\t},\n\t\t\tformFooter: {\n\t\t\t\talignItems: 'center',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflex: '0 0 auto',\n\t\t\t\tbackground: getStyleProperty('custom-background-light'),\n\t\t\t\tjustifyContent: 'center',\n\t\t\t\tpadding: defaultMuiTheme.spacing(1),\n\t\t\t\tminHeight: defaultMuiTheme.spacing(7.5),\n\t\t\t\ttextAlign: 'center',\n\t\t\t\t'& button': {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t},\n\t\t\t},\n\t\t\thideScrollbar: {\n\t\t\t\tscrollbarWidth: 'none',\n\t\t\t\tmsOverflowStyle: 'none',\n\t\t\t\toverscrollBehavior: 'none',\n\t\t\t\t'&::-webkit-scrollbar': {\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t},\n\t\t\t\twebkitOverflowScrolling: 'auto',\n\t\t\t},\n\t\t\tpositionSticky: {\n\t\t\t\tposition: isSafari ? '-webkit-sticky' : 'sticky',\n\t\t\t},\n\t\t\treadOnlyLabel: {\n\t\t\t\tdisplay: 'inline-block',\n\t\t\t\tfontSize: '0.75rem',\n\t\t\t\tlineHeight: '1rem',\n\t\t\t\toverflow: 'hidden',\n\t\t\t\ttextOverflow: 'ellipsis',\n\t\t\t\twidth: '100%',\n\t\t\t},\n\t\t\tscrollable: {\n\t\t\t\toverflow: 'auto',\n\t\t\t\tWebkitOverflowScrolling: 'touch',\n\t\t\t},\n\t\t\t// TODO: utilize container\n\t\t\t// https://material-ui.com/components/container/\n\t\t\tsettingsContainer: {\n\t\t\t\tmaxWidth: 1000,\n\t\t\t},\n\t\t\tforceScrollable: {\n\t\t\t\toverflow: 'auto !important',\n\t\t\t\tWebkitOverflowScrolling: 'touch !important' as any,\n\t\t\t},\n\t\t\twatermark: () => {\n\t\t\t\tconst portal = getPortal();\n\t\t\t\tconst watermarkPosition: WatermarkPosition =\n\t\t\t\t\t(portal && portal.get('watermarkPos')) || 'center';\n\t\t\t\tlet position: Record = {};\n\t\t\t\tswitch (watermarkPosition) {\n\t\t\t\t\tcase 'top-left':\n\t\t\t\t\t\tposition = {\n\t\t\t\t\t\t\tbackgroundPosition: 'top left',\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tmaxWidth: '50%',\n\t\t\t\t\t\t\tmaxHeight: '50%',\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'top-right':\n\t\t\t\t\t\tposition = {\n\t\t\t\t\t\t\tbackgroundPosition: 'top right',\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\tmaxWidth: '50%',\n\t\t\t\t\t\t\tmaxHeight: '50%',\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bottom-left':\n\t\t\t\t\t\tposition = {\n\t\t\t\t\t\t\tbackgroundPosition: 'bottom left',\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tmaxWidth: '50%',\n\t\t\t\t\t\t\tmaxHeight: '50%',\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bottom-right':\n\t\t\t\t\t\tposition = {\n\t\t\t\t\t\t\tbackgroundPosition: 'bottom right',\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\tmaxWidth: '50%',\n\t\t\t\t\t\t\tmaxHeight: '50%',\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tposition = {\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tbackgroundImage: `url(${Netx.URL.watermark}?cb=${watermarkCacheBuster})`,\n\t\t\t\t\tbackgroundPosition: 'center',\n\t\t\t\t\tbackgroundSize: 'contain',\n\t\t\t\t\tbackgroundRepeat: 'no-repeat',\n\t\t\t\t\topacity: 0.3,\n\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '100%',\n\t\t\t\t\t...position,\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\tpalette: {\n\t\t\tmode: type,\n\t\t\tbackground: {\n\t\t\t\tpaper: getStyleProperty('surface'),\n\t\t\t\tdefault: getStyleProperty('background'),\n\t\t\t},\n\t\t\tprimary: {\n\t\t\t\tcontrastText: getStyleProperty('on-primary'),\n\t\t\t\tmain: getStyleProperty('primary'),\n\t\t\t},\n\t\t\tsecondary: {\n\t\t\t\tcontrastText: getStyleProperty('on-secondary'),\n\t\t\t\tmain: getStyleProperty('secondary'),\n\t\t\t},\n\t\t\tsuccess: {\n\t\t\t\tmain: '#4caf50',\n\t\t\t},\n\t\t\ttext: {\n\t\t\t\tsecondary: getHintTextColor(type),\n\t\t\t},\n\t\t\tcustom: {\n\t\t\t\tbackground: {\n\t\t\t\t\taccent: getStyleProperty('custom-background-accent'),\n\t\t\t\t\tbackdrop: getStyleProperty('custom-backdrop'),\n\t\t\t\t\tlight: getStyleProperty('custom-background-light'),\n\t\t\t\t},\n\t\t\t\tborder:\n\t\t\t\t\ttype == 'light' ? 'rgba(0, 0, 0, 0.08)' : 'rgba(255, 255, 255, 0.16)',\n\t\t\t\ticon: {\n\t\t\t\t\tonBackground: getStyleProperty('text-icon-on-background'),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcomponents: {\n\t\t\tMuiAccordionSummary: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\texpandIconWrapper: {\n\t\t\t\t\t\tcolor: getStyleProperty('text-primary-on-background'),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiAutocomplete: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\t// Show pointer cursor if not focused\n\t\t\t\t\t\t'& [class*=\"MuiInputBase-root\"]:not([class*=\"Mui-focused\"])': {\n\t\t\t\t\t\t\t'&, & input': {\n\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'&.MuiAutocomplete-hasPopupIcon .MuiOutlinedInput-root': {\n\t\t\t\t\t\t\tpaddingRight: 42,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'& [class*=\"MuiInputLabel-root\"]': {\n\t\t\t\t\t\t\tmaxWidth: 'calc(100% - 56px)',\n\t\t\t\t\t\t\t'&:not([class*=\"MuiInputLabel-outlined\"])': {\n\t\t\t\t\t\t\t\tpaddingLeft: 16,\n\t\t\t\t\t\t\t\t'& + .MuiInput-root .MuiInput-input': {\n\t\t\t\t\t\t\t\t\tpaddingLeft: 16,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'&[class*=\"MuiInputLabel-shrink\"]': {\n\t\t\t\t\t\t\t\t\tpaddingLeft: 22,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'&[class*=\"MuiInputLabel-outlined\"]': {\n\t\t\t\t\t\t\t\t'&[class*=\"MuiInputLabel-shrink\"]': {\n\t\t\t\t\t\t\t\t\ttransform: `translate(14px, -6px) scale(0.75)`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tgroupUl: {\n\t\t\t\t\t\t'& .MuiAutocomplete-option': {\n\t\t\t\t\t\t\tpaddingLeft: defaultMuiTheme.spacing(2),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tnoOptions: {\n\t\t\t\t\t\tfontSize: 16,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiAvatar: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\t// Fix: in safari the image escapes the border-radius overflow until the transition\n\t\t\t\t\t\t// is complete\n\t\t\t\t\t\tWebkitMaskImage: '-webkit-radial-gradient(white, black)',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiButton: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\t// Messes with translations\n\t\t\t\t\t\ttextTransform: 'unset',\n\t\t\t\t\t},\n\t\t\t\t\ticonSizeMedium: {\n\t\t\t\t\t\t'& > *:first-of-type.svg-inline--fa': {\n\t\t\t\t\t\t\tfontSize: 16,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiButtonBase: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\tfontSize: '24px',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiChip: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t'& span': {\n\t\t\t\t\t\t\tdisplay: 'inline-block',\n\t\t\t\t\t\t\tflex: '1 1 auto',\n\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\ttextOverflow: 'ellipsis',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'& svg': {\n\t\t\t\t\t\t\tflex: '0 0 auto',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiFilledInput: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\ttype === 'light'\n\t\t\t\t\t\t\t\t? `rgba(0, 0, 0, 0.025)`\n\t\t\t\t\t\t\t\t: `rgba(255, 255, 255, 0.04)`,\n\t\t\t\t\t\t'&:hover': {\n\t\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\t\ttype === 'light'\n\t\t\t\t\t\t\t\t\t? `rgba(0, 0, 0, 0.04)`\n\t\t\t\t\t\t\t\t\t: `rgba(255, 255, 255, 0.08)`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'&$focused': {\n\t\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\t\ttype === 'light'\n\t\t\t\t\t\t\t\t\t? `rgba(0, 0, 0, 0.04)`\n\t\t\t\t\t\t\t\t\t: `rgba(255, 255, 255, 0.08)`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiFormHelperText: {\n\t\t\t\tdefaultProps: {\n\t\t\t\t\tvariant: 'outlined',\n\t\t\t\t},\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiIconButton: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\t'&:not([class*=\"MuiSwitch-switchBase\"]) svg:not(.svg-inline--fa)': {\n\t\t\t\t\t\t\tminHeight: 24,\n\t\t\t\t\t\t\tminWidth: 24,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// FontAwesome icons are just too dang big\n\t\t\t\t\t\t'& .svg-inline--fa': {\n\t\t\t\t\t\t\theight: 16,\n\t\t\t\t\t\t\twidth: 16,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tedgeEnd: {\n\t\t\t\t\t\tmarginRight: -defaultMuiTheme.spacing(2),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiInputLabel: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\tmaxWidth: 'calc(100% - 20px)',\n\t\t\t\t\t\ttextOverflow: 'ellipsis',\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\twordBreak: 'break-all',\n\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t\t'&:not([class*=\"MuiInputLabel-outlined\"])': {\n\t\t\t\t\t\t\tpaddingLeft: defaultMuiTheme.spacing(2),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tfilled: {\n\t\t\t\t\t\tcolor: type === 'light' ? `rgba(0, 0, 0, 0.64)` : undefined,\n\t\t\t\t\t},\n\t\t\t\t\tshrink: {\n\t\t\t\t\t\tmaxWidth: 'calc(100% * 1.25 - 15px) !important',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiInputBase: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\t// TODO: the override styles for `MuiOutlinedInput` below are not working\n\t\t\t\t\t\t// there is a bug ticket for this\n\t\t\t\t\t\t'@media (hover: none)': {\n\t\t\t\t\t\t\t'& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline': {\n\t\t\t\t\t\t\t\tborderColor: outlinedBorderColor,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'& .MuiOutlinedInput-notchedOutline': {\n\t\t\t\t\t\t\tborderColor: outlinedBorderColor,\n\t\t\t\t\t\t\t'& legend': {\n\t\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tinput: {\n\t\t\t\t\t\t'&::-webkit-input-placeholder': placeholderVisible,\n\t\t\t\t\t\t'&::-moz-placeholder': placeholderVisible,\n\t\t\t\t\t\t'&:-ms-input-placeholder': placeholderVisible,\n\t\t\t\t\t\t'&::-ms-input-placeholder': placeholderVisible,\n\t\t\t\t\t\t'label[data-shrink=false] + $formControl &': {\n\t\t\t\t\t\t\t'&:focus::-webkit-input-placeholder': placeholderVisible,\n\t\t\t\t\t\t\t'&:focus::-moz-placeholder': placeholderVisible,\n\t\t\t\t\t\t\t'&:focus::-ms-input-placeholder': placeholderVisible,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiLinearProgress: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\t// bar1Determinate: {\n\t\t\t\t\t// \tbackgroundColor: getStyleProperty('primary'),\n\t\t\t\t\t// },\n\t\t\t\t\t// bar1Indeterminate: {\n\t\t\t\t\t// \tbackgroundColor: getStyleProperty('primary'),\n\t\t\t\t\t// },\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiOutlinedInput: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\t// Reset on touch devices, it doesn't add specificity\n\t\t\t\t\t\t'@media (hover: none)': {\n\t\t\t\t\t\t\t'&:hover $notchedOutline': {\n\t\t\t\t\t\t\t\tborderColor: outlinedBorderColor,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tnotchedOutline: {\n\t\t\t\t\t\tborderColor: outlinedBorderColor,\n\t\t\t\t\t\t'& legend': {\n\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiPaper: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\tbackgroundImage: 'none',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tdefaultProps: {\n\t\t\t\t\televation: type === 'light' ? 2 : 5,\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiSelect: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\t// The typing is not correct here and mui will throw errors telling you to do it like this.\n\t\t\t\t\t// Ideally, and correctly typed, it would be:\n\t\t\t\t\t// \"disabled\": {\n\t\t\t\t\t// \t\"& ~ svg\": {\n\t\t\t\t\t// \t\topacity: 0.5,\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\troot: {\n\t\t\t\t\t\t'&.Mui-disabled': {\n\t\t\t\t\t\t\t'& ~ svg': {\n\t\t\t\t\t\t\t\topacity: 0.5,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiTab: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\t// Messes with translations\n\t\t\t\t\t\ttextTransform: 'unset',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiTextField: {\n\t\t\t\tdefaultProps: {\n\t\t\t\t\tvariant: 'outlined',\n\t\t\t\t\tsize: 'small',\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiTooltip: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\ttooltip: {\n\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tMuiTypography: {\n\t\t\t\tstyleOverrides: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\tMozOsxFontSmoothing: 'grayscale',\n\t\t\t\t\t\tWebkitFontSmoothing: 'antialiased',\n\t\t\t\t\t},\n\t\t\t\t\t// TODO: For the font size descepency between theme and portal\n\t\t\t\t\t// using the 'px' value over 'rem' until we rectify\n\t\t\t\t\tbody1: {\n\t\t\t\t\t\tfontSize: '16px',\n\t\t\t\t\t},\n\t\t\t\t\tbody2: {\n\t\t\t\t\t\tfontSize: '14px',\n\t\t\t\t\t},\n\t\t\t\t\tcaption: {\n\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t},\n\t\t\t\t\th5: {\n\t\t\t\t\t\tfontSize: '24px',\n\t\t\t\t\t},\n\t\t\t\t\th6: {\n\t\t\t\t\t\tfontSize: '20px',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n};\n\nexport type Theme = ReturnType;\nexport const useTheme = () => useThemeMui();\n\nexport interface NetxThemeProps {}\n\n/** Netx Theme Wrapper */\nconst NetxTheme = ({children}: PropsWithChildren) => {\n\tconst [theme, setTheme] = useState(baseTheme(Netx.getThemeMode()));\n\n\tuseDispatcher(\n\t\t'theme:toggled',\n\t\tuseCallback((themeMode: Type) => {\n\t\t\tsetTheme(baseTheme(themeMode));\n\t\t}, []),\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{children}\n\t\t\t\n\t\t\n\t);\n};\n\nexport default NetxTheme;\n","import type Collection from '@netx/core/lib/netx-collection';\nimport _ from 'underscore';\n\nimport {useEffect, useState} from 'react';\nimport useComponentIsMounted from './useComponentIsMounted';\n\nexport default function useBackboneCollection<\n\tTCollection extends Collection = Collection\n>(collection: TCollection, fetchOnMount = true) {\n\tconst {act} = useComponentIsMounted();\n\n\tconst [attributes, setAttributes] = useState<\n\t\tTCollection['models'][number]['attributes'][]\n\t>([...collection.models.map((model) => ({...model.attributes}))]);\n\n\t// Subscribe to the model or collection on first render only\n\tuseEffect(() => {\n\t\t// Pull the attributes or array of attributes from model or collection\n\t\t// Set them on state\n\t\tconst pullAndSetData = () =>\n\t\t\tact(() =>\n\t\t\t\tsetAttributes([\n\t\t\t\t\t...collection.models.map((model) => ({...model.attributes})),\n\t\t\t\t]),\n\t\t\t);\n\n\t\tpullAndSetData();\n\n\t\tconst debouncedPullAndSetData = _.debounce(pullAndSetData, 20);\n\t\tcollection.on('add change remove reset sort sync', debouncedPullAndSetData);\n\n\t\tconst preferredFetchMethod = collection.preferredFetchMethod || 'fetch';\n\t\tfetchOnMount !== false && collection[preferredFetchMethod]();\n\n\t\t// Unsubscribe when component unmounted\n\t\treturn () => {\n\t\t\tcollection.off(undefined, debouncedPullAndSetData);\n\t\t};\n\t}, []);\n\n\treturn attributes;\n}\n","import React from 'react';\n\nimport {\n\tEditableAttribute,\n\tEditableAttributeProps,\n\tReadOnlyAttribute,\n\tReadOnlyAttributeProps,\n} from '../';\nimport type {AttributeTemplate} from '../../types';\n\ntype CommonProps = {\n\tattrData: AttributeTemplate;\n\treadOnly?: boolean;\n};\n\nexport type AttributeProps = CommonProps &\n\tOmit &\n\tOmit;\n\nexport const Attribute = ({attrData, readOnly, ...props}: AttributeProps) => {\n\t// TODO: we did something wrong in our attributes collection and system attributes that\n\t// are editable have a boolean ¯\\_(ツ)_/¯\n\tif (\n\t\treadOnly ||\n\t\tattrData.permission === 'r' ||\n\t\tattrData.permission === (false as any)\n\t)\n\t\treturn ;\n\treturn ;\n};\n\nexport default Attribute;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const CHIP_CLASS_NAME = 'Chip';\nexport const CHIP_CLASS_SLOTS = ['root', 'deleteIcon', 'iconWrapper'] as const;\n\nexport type ChipClassSlot = typeof CHIP_CLASS_SLOTS[number];\n\nexport interface ChipClasses {\n\troot: string;\n\tdeleteIcon: string;\n\ticonWrapper: string;\n}\n\nexport type ChipClassKey = keyof ChipClasses;\n\nexport const getChipUtilityClass = (slot: ChipClassSlot) =>\n\tgenerateUtilityClass(CHIP_CLASS_NAME, slot);\n\nexport const chipClasses: ChipClasses = generateUtilityClasses(\n\tCHIP_CLASS_NAME,\n\t['root', 'deleteIcon', 'iconWrapper'],\n);\n\nexport default chipClasses;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface SelectFieldClasses {\n\t/** Styles applied to the root element. */\n\troot: string;\n\tmultiple: string;\n\tautocomplete: string;\n\tselectedIcon: string;\n}\n\nexport const getSelectFieldUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('SelectField', slot);\n\nexport const selectFieldClasses = generateUtilityClasses('SelectField', [\n\t'root',\n\t'autocomplete',\n\t'multiple',\n\t'selectedIcon',\n]);\nexport default selectFieldClasses;\n","import React from 'react';\n\nimport {CircularProgress, TextField} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {CommonFieldPropsWithTextField} from '../../../';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\tprogress: {\n\t\t\tposition: 'absolute',\n\t\t\tright: 11,\n\t\t\ttop: 'calc(50% - 10px)',\n\t\t},\n\t});\n\nexport interface VirtualizedInputProps\n\textends CommonFieldPropsWithTextField {\n\toptions?: string[];\n}\n\n/**\n * Input for virtualized select field\n */\nconst VirtualizedInput: React.FC<\n\tWithStyles & VirtualizedInputProps\n> = React.forwardRef(\n\t(\n\t\t{\n\t\t\tclasses,\n\t\t\terror,\n\t\t\tloading,\n\n\t\t\t...props\n\t\t},\n\t\tref: React.RefObject,\n\t) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{props.InputProps?.endAdornment}\n\t\t\t\t\t\t\n\t\t\t\t\t),\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nexport default withStyles(styles)(React.memo(VirtualizedInput));\n","import React, {\n\tcloneElement,\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tChildren,\n\tuseEffect,\n\tuseRef,\n} from 'react';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport {\n\tListChildComponentProps,\n\tFixedSizeListProps,\n\tFixedSizeList,\n\tareEqual,\n} from 'react-window';\nimport {styled, Theme} from '@netx/core-components/Theme';\n\nimport useSharedRef from '@netx/core-components/hooks/useSharedRef';\n\ntype FixedSizeListEnforcedProps = Required;\n\nconst LISTBOX_PADDING = 8;\nconst ADDITIONAL_ITEM_HEIGHT = 2 * LISTBOX_PADDING;\n\nconst styles = (theme: Theme) => createStyles({});\n\nexport interface OuterElementProps {\n\t'aria-labelledby': string;\n\tclassName: string;\n\tid: string;\n\tonMouseDown(event: React.MouseEvent): void;\n\trole: string;\n}\nconst OuterElementContext = React.createContext>({});\nconst OuterElementType = React.forwardRef(\n\t(props, ref: React.Ref) => {\n\t\tconst outerProps = useContext(OuterElementContext);\n\t\treturn
;\n\t},\n);\n\nconst InnerElementRoot = styled('ul')({\n\tpadding: 0,\n\tmargin: 0,\n});\n\nconst renderRow = React.memo(\n\t({data, index, style}: ListChildComponentProps) => {\n\t\treturn cloneElement(data[index], {\n\t\t\tstyle: {\n\t\t\t\t...style,\n\t\t\t\ttop: (style.top as number) + LISTBOX_PADDING,\n\t\t\t},\n\t\t});\n\t},\n\tareEqual,\n);\nexport interface ListboxComponentProps extends OuterElementProps {\n\tinputRef: React.MutableRefObject;\n\tlistRef?: React.MutableRefObject;\n\tfixedSizeListRef?: React.MutableRefObject;\n}\n\n/**\n * Adapter for react-window's `VariableSizeList`\n * @private\n */\nconst ListboxComponent = React.forwardRef<\n\tHTMLDivElement,\n\tWithStyles & ListboxComponentProps\n>(({classes, children, inputRef, listRef, fixedSizeListRef, ...props}, ref) => {\n\tconst itemData = Children.toArray(children);\n\tconst itemCount = itemData.length;\n\tconst itemSize = 48;\n\n\tconst innerRef = useSharedRef(null, [ref]);\n\tconst innerFixedSizeListRef = useSharedRef(null, [\n\t\tfixedSizeListRef,\n\t]);\n\n\tconst justLoopedToRef = useRef(-1);\n\n\t// The autocomplete dropdown is a little funky with keyboard navigation\n\t// and virtualization\n\tuseEffect(() => {\n\t\tconst handleKeydown = (event) => {\n\t\t\tif (!innerFixedSizeListRef.current || !inputRef.current) return;\n\t\t\tlet prevent = false;\n\t\t\tconst itemCount = innerFixedSizeListRef.current.props.itemCount;\n\t\t\tconst activeIndex = parseInt(\n\t\t\t\t(\n\t\t\t\t\tinputRef.current.getAttribute('aria-activedescendant') || '-1'\n\t\t\t\t)?.replace(/^.*-option-/, ''),\n\t\t\t);\n\t\t\tif (activeIndex < 0) return;\n\n\t\t\tjustLoopedToRef.current = -1;\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'ArrowUp': {\n\t\t\t\t\tif (activeIndex === 0 && itemCount > 1) {\n\t\t\t\t\t\tjustLoopedToRef.current = itemCount - 1;\n\t\t\t\t\t\tinnerFixedSizeListRef.current.scrollTo(\n\t\t\t\t\t\t\t(itemCount - 1) * itemSize + LISTBOX_PADDING,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tprevent = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'ArrowDown': {\n\t\t\t\t\tif (activeIndex === itemCount - 1 && itemCount > 1) {\n\t\t\t\t\t\tjustLoopedToRef.current = 0;\n\t\t\t\t\t\tinnerFixedSizeListRef.current.scrollTo(0);\n\t\t\t\t\t\tprevent = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'End':\n\t\t\t\t\tjustLoopedToRef.current = itemCount - 1;\n\t\t\t\t\tinnerFixedSizeListRef.current.scrollTo(\n\t\t\t\t\t\t(itemCount - 1) * itemSize + LISTBOX_PADDING,\n\t\t\t\t\t);\n\t\t\t\t\tprevent = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Home':\n\t\t\t\t\tjustLoopedToRef.current = 0;\n\t\t\t\t\tinnerFixedSizeListRef.current.scrollTo(0);\n\t\t\t\t\tprevent = true;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (prevent) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleKeydown, {capture: true});\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keydown', handleKeydown, {capture: true});\n\t\t};\n\t}, []);\n\n\t// The focus event from the underlying `useAutocomplete` is firing before the item can be rendered\n\t// because the call to render comes after the mouse event\n\tconst handleItemRendered = useCallback<\n\t\tFixedSizeListEnforcedProps['onItemsRendered']\n\t>((props) => {\n\t\tif (!innerFixedSizeListRef.current || !innerRef.current) return;\n\n\t\tconst event = new MouseEvent('mouseover', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\n\t\tconst hasFocused = () =>\n\t\t\tinnerRef.current?.querySelector('[data-focus=\"true\"]') !== null;\n\n\t\tif (justLoopedToRef.current > -1) {\n\t\t\tconst option = innerRef.current?.querySelector(\n\t\t\t\t`[id*=\"option-${justLoopedToRef.current}\"]`,\n\t\t\t);\n\t\t\tif (option && !hasFocused()) option.dispatchEvent(event);\n\t\t\tjustLoopedToRef.current = -1;\n\t\t}\n\t}, []);\n\n\t// if you give it the actual height of what all the items would be\n\t// it will actually render them all - just keep in mind:\n\t// this is just the height of the content we want to display/in the\n\t// DOM\n\tconst height = useMemo(\n\t\t() => (itemCount > 8 ? 8 * itemSize : itemCount * itemSize), //itemData.map(getChildSize).reduce((a, b) => a + b, 0),\n\t\t[itemCount, itemSize],\n\t);\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{renderRow}\n\t\t\t\t\n\t\t\t\n\t\t
\n\t);\n});\n\nexport default withStyles(styles)(React.memo(ListboxComponent));\n","import {i18n} from '@netx/core/i18n';\n\nimport {\n\tATTRIBUTE_TYPE,\n\tATTRIBUTE_SYSTEM,\n\tATTRIBUTE_SYSTEM_ID,\n} from './constants';\nimport {AttributeType, AttributeSystemType} from './types';\n\nexport const TYPE_LABELS: Record = {\n\t[ATTRIBUTE_TYPE.DATE]: i18n.t('i18n.date'),\n\t[ATTRIBUTE_TYPE.HIERARCHICAL]: i18n.t('i18n.hierarchical'),\n\t[ATTRIBUTE_TYPE.MULTISELECT]: i18n.t('i18n.multiSelectBox'),\n\t[ATTRIBUTE_TYPE.NUMBER]: i18n.t('i18n.number'),\n\t[ATTRIBUTE_TYPE.SELECT]: i18n.t('i18n.pulldown'),\n\t[ATTRIBUTE_TYPE.SEMANTIC]: i18n.t('i18n.semantic'),\n\t[ATTRIBUTE_TYPE.TAG]: i18n.t('i18n.tag'),\n\t[ATTRIBUTE_TYPE.TAG_VOCAB]: i18n.t('i18n.tagVocab'),\n\t[ATTRIBUTE_TYPE.TEXT]: i18n.t('i18n.text'),\n\t[ATTRIBUTE_TYPE.TEXTAREA]: i18n.t('i18n.textarea'),\n};\n\nexport const SYSTEM_ATTRIBUTE_LABELS: Record = <\n\tconst\n>{\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.ASSET_ID]]: i18n.t('i18n.assetId'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.CATEGORY_PATHS]]: i18n.t(\n\t\t'i18n.folderPath',\n\t),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.CHECKSUM]]: i18n.t('i18n.checksum'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.CREATION_DATE]]: i18n.t(\n\t\t'i18n.creationDate',\n\t),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.DIMENSIONS]]: i18n.t('i18n.dimensions'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.EXPIRE_DATE]]: i18n.t('i18n.expires'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.FILE]]: i18n.t('i18n.file'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.FILE_FORMAT_FAMILY]]: i18n.t(\n\t\t'i18n.fileFormatFamily',\n\t),\n\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.FILE_SIZE_2]]: i18n.t('i18n.fileSize'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.FILE_TYPE_LABEL]]: i18n.t(\n\t\t'i18n.fileType',\n\t),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.HEIGHT]]: i18n.t('i18n.height'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.IMPORT_DATE]]: i18n.t(\n\t\t'i18n.importDate',\n\t),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.MOD_DATE]]: i18n.t('i18n.modDate'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.MOD_USER]]: i18n.t('i18n.modUser'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.NAME]]: i18n.t('i18n.name'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.PATH]]: i18n.t('i18n.path'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.SMART_LABELS]]: i18n.t(\n\t\t'i18n.smartLabels',\n\t),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.THUMB_PATH]]: i18n.t('i18n.thumbPath'),\n\t[ATTRIBUTE_SYSTEM_ID[ATTRIBUTE_SYSTEM.WIDTH]]: i18n.t('i18n.width'),\n};\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {ConfirmationDialog, ConfirmationOptions} from './ConfirmationDialog';\n\nexport interface Options extends Omit {\n\tcatchOnCancel?: boolean;\n}\n\nexport type ConfirmationServiceContextType = (\n\toptions: Options,\n) => Promise;\n\nconst ConfirmationServiceContext = createContext<\n\tConfirmationServiceContextType | undefined\n>(undefined);\n\nexport const useConfirmation = () => {\n\tconst context = useContext(ConfirmationServiceContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t'`useConfirmation` must be used within a `ConfirmationServiceProvider`',\n\t\t);\n\t}\n\treturn context;\n};\n\n// due to how jsx is parsed, gernerics with only a single argument must extend\n// something or the parsing breaks\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint\nexport const ConfirmationServiceProvider = ({\n\tchildren,\n}) => {\n\tconst [catchOnCancel, setCatchOnCancel] = useState(false);\n\tconst [confirmationState, setConfirmationState] = useState();\n\n\tconst awaitingPromiseRef = useRef<{\n\t\tresolve: (...args: any) => void | Promise;\n\t\treject: () => void;\n\t}>();\n\n\tconst openConfirmation = useCallback(\n\t\t({catchOnCancel = false, ...options}: Options) => {\n\t\t\tsetCatchOnCancel(catchOnCancel);\n\t\t\tsetConfirmationState(options);\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tawaitingPromiseRef.current = {resolve, reject};\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleClose = useCallback(() => {\n\t\tcatchOnCancel && awaitingPromiseRef.current?.reject();\n\t\tawaitingPromiseRef.current = undefined;\n\t\tsetConfirmationState(undefined);\n\t}, [catchOnCancel]);\n\n\tconst handleSubmit = useCallback((...args: any) => {\n\t\tawaitingPromiseRef.current?.resolve(...args);\n\t\tsetConfirmationState(undefined);\n\t}, []);\n\n\treturn (\n\t\t<>\n\t\t\t\n\n\t\t\t\n\t\t\n\t);\n};\n","export enum DragResizeDirection {\n\tBOTTOM = 'bottom',\n\tLEFT = 'left',\n\tRIGHT = 'right',\n\tTOP = 'top',\n}\n\nexport enum Axis {\n\tX = 'X',\n\tY = 'Y',\n}\n\nexport enum ClientPosition {\n\tX = 'clientX',\n\tY = 'clientY',\n}\n\nexport enum ClientDimension {\n\tX = 'clientWidth',\n\tY = 'clientHeight',\n}\n\nexport enum ScrollDimension {\n\tX = 'scrollWidth',\n\tY = 'scrollHeight',\n}\n\nexport enum OffsetDimension {\n\tX = 'offsetWidth',\n\tY = 'offsetHeight',\n}\n\nexport const DRAG_RESIZE_DEFAULT_DIRECTION = DragResizeDirection.LEFT;\n","import {MediaFormatFamilies} from '../constants';\n\nexport const isMediaFileTypeAsset = (fileFormatFamily: string[]) =>\n\tfileFormatFamily.some((format) =>\n\t\tMediaFormatFamilies.includes(format as typeof MediaFormatFamilies[number]),\n\t);\n\nexport default isMediaFileTypeAsset;\n","export const AudioFormatFamilyType = {\n\tAUDIO: 'audio',\n};\nexport const AudioFormatFamilies = Object.values(AudioFormatFamilyType);\n\nexport const DocumentFormatFamilyType = {\n\tDOCUMENT: 'document',\n\tLAYOUT: 'layout',\n};\nexport const DocumentFormatFamilies = Object.values(DocumentFormatFamilyType);\n\nexport const ImageFormatFamilyType = {\n\tCAMERA_RAW: 'cameraRaw',\n\tIMAGE: 'image',\n\tRAW: 'raw',\n\tVECTOR: 'vector',\n};\nexport const ImageFormatFamilies = Object.values(ImageFormatFamilyType);\n\nexport const VideoFormatFamilyType = {\n\tVIDEO: 'video',\n};\nexport const VideoFormatFamilies = Object.values(VideoFormatFamilyType);\n\nexport const MediaFormatFamilyType = {\n\t...AudioFormatFamilyType,\n\t...VideoFormatFamilyType,\n};\nexport const MediaFormatFamilies = Object.values(MediaFormatFamilyType);\n","import React, {useEffect, useState} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {\n\tButton,\n\tDialogContent,\n\tDialogActions,\n\tLinearProgress,\n\tTypography,\n} from '@mui/material';\n\nimport Dialog from '@netx/core-components/Dialog';\n\nexport interface DownloadOptions {\n\tdescription?: string;\n\ttitle?: string;\n\tonEmailWhenDone?: () => void;\n\tgetUUID(): Promise;\n}\n\nexport interface DownloadDialogProps extends DownloadOptions {\n\tcompleteUrl?: string;\n\tdisableEmailWhenDone?: boolean;\n\terror?: string;\n\temailWhenDoneLabel?: string;\n\topen: boolean;\n\tonClose?: () => void;\n\tprogress?: number;\n\tuuid?: string;\n}\n\nconst DownloadDialog: React.FunctionComponent<\n\tReact.PropsWithChildren\n> = ({\n\tcompleteUrl,\n\tdescription,\n\tdisableEmailWhenDone,\n\terror,\n\temailWhenDoneLabel,\n\topen,\n\tprogress,\n\ttitle,\n\tonClose,\n\tonEmailWhenDone,\n\tuuid,\n}) => {\n\treturn (\n\t\t\n\t\t\t{!error || description != null ? (\n\t\t\t\t\n\t\t\t\t\t{description != null ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\n\t\t\t\t\t) : null}\n\t\t\t\t\t{!error ? (\n\t\t\t\t\t\t\n\t\t\t\t\t) : null}\n\t\t\t\t\n\t\t\t) : null}\n\n\t\t\t\n\t\t\t\t{!disableEmailWhenDone && !error && uuid ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\t{error ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\t\t\n\t);\n};\n\nexport default DownloadDialog;\n","export const ACTIONS = {\n\tSET_ERROR: 'SET_ERROR',\n\tSET_PROGRESS: 'SET_PROGRESS',\n\tSET_SUCCESS: 'SET_SUCCESS',\n\tSET_UUID: 'SET_UUID',\n};\n","import {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nexport type State = {\n\tcompleteUrl?: string;\n\terror?: string;\n\tprogress?: number;\n\tsuccess: boolean;\n\tuuid?: string;\n};\n\nexport const initialState: State = {\n\tsuccess: false,\n};\n\nconst reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.SET_ERROR:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\terror: action.error,\n\t\t\t\tsuccess: false,\n\t\t\t\tuuid: undefined,\n\t\t\t};\n\t\tcase ACTIONS.SET_PROGRESS:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tprogress: action.progress,\n\t\t\t};\n\t\tcase ACTIONS.SET_SUCCESS:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tcompleteUrl: action.completeUrl,\n\t\t\t\tsuccess: action.success,\n\t\t\t\tuuid: undefined,\n\t\t\t};\n\t\tcase ACTIONS.SET_UUID:\n\t\t\treturn action.uuid != null\n\t\t\t\t? {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tcompleteUrl: undefined,\n\t\t\t\t\t\terror: undefined,\n\t\t\t\t\t\tuuid: action.uuid,\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tprogress: 0,\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tcompleteUrl: undefined,\n\t\t\t\t\t\terror: undefined,\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tprogress: undefined,\n\t\t\t\t\t\tuuid: undefined,\n\t\t\t\t };\n\t}\n};\n\nexport default reducer;\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseReducer,\n\tuseState,\n} from 'react';\n\nimport {openDownloadLink} from '@netx/core/utils';\nimport DownloadDialog, {DownloadOptions} from '../components/Dialog';\n\nimport {\n\tuseQuery,\n\tQueryClient,\n\tQueryClientProvider,\n\tQueryFunctionContext,\n} from '@tanstack/react-query';\n\nimport getProgressReport, {\n\tGetProgressReportResult,\n\tGetProgressReportRequestOptions,\n\tQueryError,\n} from './api/getProgressReport';\n\nimport setProgressReportNotify from './api/setProgressReportNotify';\n\nimport reducer, {initialState} from './reducer';\nimport {ACTIONS} from './constants';\n\nconst queryClient = new QueryClient();\n\nconst DownloadServiceContext = createContext<\n\t(options: DownloadOptions) => void\n>(() => {});\n\nexport const useDownload = () => useContext(DownloadServiceContext);\n\nexport type DownloadServiceProviderProps = React.PropsWithChildren<{\n\tdisableEmailWhenDone?: boolean;\n}>;\n\nexport const DownloadServiceProviderPrimitive = ({\n\tchildren,\n\tdisableEmailWhenDone,\n}: DownloadServiceProviderProps) => {\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\n\tconst [downloadState, setDownloadState] = useState();\n\n\tconst close = useCallback(() => setDownloadState(undefined), []);\n\n\tuseQuery({\n\t\tqueryKey: [\n\t\t\t'getProgressReport',\n\t\t\t{\n\t\t\t\tuuid: state.uuid,\n\t\t\t},\n\t\t],\n\t\tqueryFn: ({\n\t\t\tqueryKey,\n\t\t}: QueryFunctionContext<[string, GetProgressReportRequestOptions]>) =>\n\t\t\tgetProgressReport({...queryKey[1]}),\n\t\tenabled: !!state.uuid,\n\t\trefetchInterval: 500,\n\t\tonError: (error) => {\n\t\t\tdispatch({type: ACTIONS.SET_ERROR, error: error.message});\n\t\t},\n\t\t// Process data on success\n\t\tonSuccess: (data) => {\n\t\t\tdispatch({type: ACTIONS.SET_PROGRESS, progress: data.percentComplete});\n\t\t\tif (data.percentComplete >= 100 && data.completeUrl != null) {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.SET_SUCCESS,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tcompleteUrl: data.completeUrl,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t});\n\n\tuseEffect(() => {\n\t\tif (!state.completeUrl) return;\n\n\t\topenDownloadLink(state.completeUrl);\n\t\tclose();\n\t}, [state.completeUrl]);\n\n\tconst openDownload = useCallback((options: DownloadOptions) => {\n\t\tsetDownloadState(options);\n\t\toptions\n\t\t\t.getUUID()\n\t\t\t.then((uuid) => dispatch({type: ACTIONS.SET_UUID, uuid}))\n\t\t\t.catch((error) =>\n\t\t\t\tdispatch({type: ACTIONS.SET_ERROR, error: error.message}),\n\t\t\t);\n\t}, []);\n\n\tconst handleEmailWhenDone = useCallback(() => {\n\t\tstate.uuid && setProgressReportNotify({uuid: state.uuid, notify: true});\n\t\tclose();\n\t\tdispatch({type: ACTIONS.SET_UUID});\n\t}, [state.uuid]);\n\n\tconst handleClose = useCallback(() => {\n\t\tclose();\n\t\tdispatch({type: ACTIONS.SET_UUID});\n\t}, [downloadState]);\n\n\treturn (\n\t\t<>\n\t\t\t\n\n\t\t\t\n\t\t\n\t);\n};\n\nexport const DownloadServiceProvider = (\n\tprops: DownloadServiceProviderProps,\n) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default DownloadServiceProvider;\n","import NetxQueryDam from '@netx/core/lib/netx-query-dam';\nexport {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {BatchJobId as UUID} from '@netx/core-app/models/batchJob';\n\n/**\n * `getProgressReport` request params\n * (what is used to send to server)\n */\nexport interface GetProgressReportRequestOptions {\n\tuuid: UUID;\n}\n\n/**\n * `getProgressReport` request\n * (what gets sent to the server)\n */\nexport type GetProgressReportRequest = [\n\tGetProgressReportRequestOptions['uuid'],\n];\n\n/**\n * `getProgressReport` response\n * (what comes back from the server)\n */\nexport interface GetProgressReportResponse {\n\tresult: GetProgressReportResult;\n}\n\n/**\n * `getProgressReport` result\n * (what is utilized from the server response)\n */\nexport type GetProgressReportResult = {\n\tpercentComplete: number;\n\tjobTitle: string;\n\tsecondsToReload: number;\n\tcompleteUrl: null | string;\n\tdetails: string;\n\tincrement: number;\n\tstartTime: number;\n\trunningTime: number;\n\trunningTimeLabel: null | string;\n\testimatedTime: null | number;\n\tuserId: number;\n\tnotifyOnComplete: boolean;\n\tsize: number;\n\tprogressMessages: null | any; // TODO\n\tprogressMessageCount: number;\n\twarningObject: null | any; // TODO generic\n};\n\nexport const getProgressReportEndpoint = 'getProgressReport';\n\n/**\n * Get Progress\n * @param fetchParams Fetch params\n */\nexport default async function isTokenValid({\n\tuuid,\n}: GetProgressReportRequestOptions) {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetProgressReportRequest = [uuid];\n\n\treturn client\n\t\t.post(getProgressReportEndpoint, requestParams)\n\t\t.then((response) => response.data.result);\n}\n","import NetxQueryDam from '@netx/core/lib/netx-query-dam';\n\nimport {BatchJobId as UUID} from '@netx/core-app/models/batchJob';\n\n/**\n * `setProgressReportNotify` request params\n * (what is used to send to server)\n */\nexport interface SetProgressReportNotifyRequestOptions {\n\tuuid: UUID;\n\tnotify: boolean;\n}\n\n/**\n * `setProgressReportNotify` request\n * (what gets sent to the server)\n */\nexport type SetProgressReportNotifyRequest = [\n\tSetProgressReportNotifyRequestOptions['uuid'],\n\tSetProgressReportNotifyRequestOptions['notify'],\n];\n\n/**\n * `setProgressReportNotify` response\n * (what comes back from the server)\n */\nexport interface SetProgressReportNotifyResponse {\n\tresult: SetProgressReportNotifyResult;\n}\n\n/**\n * `setProgressReportNotify` result\n * (what is utilized from the server response)\n */\nexport type SetProgressReportNotifyResult = boolean;\n\nexport const setProgressReportNotifyEndpoint = 'setProgressReportNotify';\n\n/**\n * Notify when done\n * @param fetchParams Fetch params\n */\nexport default async function isTokenValid({\n\tuuid,\n\tnotify,\n}: SetProgressReportNotifyRequestOptions) {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: SetProgressReportNotifyRequest = [uuid, notify];\n\n\treturn client\n\t\t.post(\n\t\t\tsetProgressReportNotifyEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n}\n","import React from 'react';\n\nimport {DownloadServiceProvider, DownloadServiceProviderProps} from './store';\n\n/**\n * wrap component in download dialog provider\n * @example\n\tconst WrappedComponenet = withDownloadDialog(Componenet, {...});\n */\nexport const withDownloadDialog = function (\n\tComponent: C,\n\tdefaults?: Partial,\n) {\n\treturn ({\n\t\tDownloadServiceProviderProps,\n\t\t...props\n\t}: JSX.IntrinsicAttributes &\n\t\tJSX.LibraryManagedAttributes> & {\n\t\t\tDownloadServiceProviderProps?: Partial;\n\t\t}) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t>)}\n\t\t\t\t/>\n\t\t\t\n\t\t);\n\t};\n};\n\nexport default withDownloadDialog;\n","import React from 'react';\nimport {useCallback, useEffect} from 'react';\n\nimport scrollIntoView from 'scroll-into-view-if-needed';\n\nconst config = {childList: true};\n\ntype UseScrollAddedNodesIntoView = {\n\tenabled?: boolean;\n\tref: React.RefObject;\n};\n\nexport default function useScrollAddedNodesIntoView({\n\tenabled = true,\n\tref,\n}: UseScrollAddedNodesIntoView) {\n\tconst callback = useCallback((mutationsList) => {\n\t\tlet removed: Node[] = [];\n\t\tlet added: Node[] = [];\n\t\tfor (const {addedNodes, removedNodes, type} of mutationsList) {\n\t\t\tif (type !== 'childList') continue;\n\n\t\t\tremoved = removed.concat(Array.from(removedNodes));\n\n\t\t\tif (!addedNodes.length) continue;\n\n\t\t\tconst el = addedNodes[0] as HTMLElement;\n\t\t\t// If it was removed in this mutation as well, it was just a reorder\n\t\t\t// we only want to scroll into view new items in the container\n\t\t\tif (!removed.includes(el)) {\n\t\t\t\tadded = added.concat(Array.from(addedNodes));\n\t\t\t}\n\t\t}\n\n\t\t// If we added multiples lets just ignore\n\t\tif (added.length > 1 || added.length === 0) return;\n\n\t\t// TODO: scroll into view if it is not visible somehow?\n\t\t// If we want to do that we can use the browser version\n\t\t// which will scroll all parent elements\n\t\tscrollIntoView(added[0] as HTMLElement, {\n\t\t\tbehavior: 'smooth',\n\t\t\tblock: 'end',\n\t\t\tscrollMode: 'if-needed',\n\t\t\tskipOverflowHiddenElements: true,\n\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!ref.current || !enabled) return;\n\n\t\tconst observer = new MutationObserver(callback);\n\t\tobserver.observe(ref.current, config);\n\t\treturn () => observer.disconnect();\n\t}, [callback, ref, enabled]);\n}\n","// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// DEPRECATED: please see ScrollBorder\n// We can add support for shadow over border there - but it does not use scroll events\n// and i do not have the time atm to track down the few components that may be using this\n\n// (ORIGINAL) TODO: This is not the best - it tries to do too much\n// the scroll added nodes into view should be handled elsewhere\n// I wrote this before I fully understood how to combine refs\n\nimport React, {useCallback, useReducer, useRef} from 'react';\nimport clsx from 'clsx';\nimport _ from 'underscore';\n\nimport ReactResizeDetector from 'react-resize-detector';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport useScrollAddedNodesIntoView from './useScrollAddedNodesIntoView';\nimport useScrollListener from './useScrollListener';\n\nconst shadow = [\n\t'radial-gradient(farthest-side at 50% 0px, rgba(0,0,0,.2), rgba(0,0,0,0))', // Top\n\t'radial-gradient(farthest-side at 50% 100%, rgba(0,0,0,.2), rgba(0,0,0,0)) 0 100%', // Bottom\n];\nconst shadowSize = ['100% 6px', '100% 14px'];\nconst createShadow = (side: 'top' | 'bottom' | 'all') => {\n\tconst styles = {\n\t\tbackgroundRepeat: 'no-repeat',\n\t};\n\tswitch (side) {\n\t\tcase 'top':\n\t\t\treturn {\n\t\t\t\t...styles,\n\t\t\t\tbackground: shadow[0],\n\t\t\t\tbackgroundSize: shadowSize.join(),\n\t\t\t};\n\t\tcase 'bottom':\n\t\t\treturn {\n\t\t\t\t...styles,\n\t\t\t\tbackground: shadow[1],\n\t\t\t\tbackgroundSize: shadowSize.join(),\n\t\t\t};\n\t\tcase 'all':\n\t\t\treturn {\n\t\t\t\t...styles,\n\t\t\t\tbackground: shadow.join(),\n\t\t\t\tbackgroundSize: `${shadowSize[0]}, ${shadowSize[0]}, ${shadowSize[1]}, ${shadowSize[1]}`,\n\t\t\t};\n\t}\n};\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\toverflown: {\n\t\t\t'&:not($scrolled)': createShadow('bottom'),\n\t\t\t'&$scrollEnd': createShadow('top'),\n\t\t\t'&$scrolled:not($scrollEnd)': createShadow('all'),\n\t\t},\n\t\tscrolled: {},\n\t\tscrollEnd: {},\n\t});\n\nexport interface ScrollShadowWrapperProps {\n\tclassName?: string;\n\tscrollNewItemsIntoView?: boolean;\n}\n\nexport interface ScrollShadowWrapperChildProps {\n\tclassName: string;\n\tref:\n\t\t| ((instance: HTMLDivElement | null) => void)\n\t\t| React.RefObject\n\t\t| null;\n}\n\nconst initialState = {\n\tclientHeight: 0,\n\tisOverflown: false,\n\tisScrolled: false,\n\treachedScrollEnd: false,\n};\n\nconst reducer = (state = initialState, action): typeof initialState => {\n\tswitch (action.type) {\n\t\tcase 'RESIZE': {\n\t\t\tconst {clientHeight, scrollHeight, scrollTop} = action.data;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tclientHeight,\n\t\t\t\tisOverflown: clientHeight < scrollHeight,\n\t\t\t\tisScrolled: scrollTop > 0,\n\t\t\t\treachedScrollEnd: scrollTop === scrollHeight - clientHeight,\n\t\t\t};\n\t\t}\n\t\tcase 'SCROLL': {\n\t\t\tconst {scrollHeight, scrollTop} = action.data;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisScrolled: scrollTop > 0,\n\t\t\t\treachedScrollEnd: scrollTop === scrollHeight - state.clientHeight,\n\t\t\t};\n\t\t}\n\t\tdefault:\n\t\t\treturn state;\n\t}\n};\n\n// TODO: this only works for vertical scrolling ATM\n/**\n * Provide some auto-scroll/shadow functionality to your list components\n *\n * This will only look for nodes added as direct descendants so be sure\n * to apply this to the last level of your list\n *\n * The component being wrapped must utilize `React.forwardRef`\n * @deprecated\n * @example\n * const ListWrapper = ScrollShadowWrapper(\n * React.forwardRef((props, ref) => {\n * return
;\n * })\n * );\n * ...list items\n */\nconst ScrollShadowWrapper = (\n\tComponent: React.ForwardRefExoticComponent,\n) => {\n\treturn withStyles(styles)(\n\t\tReact.memo(\n\t\t\t({\n\t\t\t\tclasses,\n\t\t\t\tclassName,\n\t\t\t\tscrollNewItemsIntoView = false,\n\t\t\t\t...props\n\t\t\t}: WithStyles & ScrollShadowWrapperProps) => {\n\t\t\t\tconst [state, dispatch] = useReducer(reducer, initialState);\n\n\t\t\t\tconst ref = useRef(null);\n\n\t\t\t\tuseScrollAddedNodesIntoView({\n\t\t\t\t\tenabled: scrollNewItemsIntoView,\n\t\t\t\t\tref,\n\t\t\t\t});\n\n\t\t\t\tuseScrollListener({\n\t\t\t\t\tref,\n\t\t\t\t\tonScroll: useCallback(\n\t\t\t\t\t\t(container) => {\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: 'SCROLL',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\tscrollHeight: container.scrollHeight,\n\t\t\t\t\t\t\t\t\tscrollTop: container.scrollTop,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[dispatch],\n\t\t\t\t\t),\n\t\t\t\t});\n\n\t\t\t\tconst handleResize = useCallback(() => {\n\t\t\t\t\tif (!ref.current) return;\n\t\t\t\t\tconst {scrollTop, scrollHeight, clientHeight} = ref.current;\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'RESIZE',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tclientHeight,\n\t\t\t\t\t\t\tscrollHeight,\n\t\t\t\t\t\t\tscrollTop,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}, []);\n\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t},\n\t\t),\n\t);\n};\n\nexport default ScrollShadowWrapper;\n","import React from 'react';\nimport _ from 'underscore';\n\ntype UseScrollListener = {\n\tref: React.RefObject;\n\tonScroll(el: HTMLElement): void;\n};\n\nexport default function useScrollListener({ref, onScroll}: UseScrollListener) {\n\tReact.useEffect(() => {\n\t\tif (!ref.current) return;\n\t\tconst scrollListener = _.throttle(\n\t\t\t() => {\n\t\t\t\tif (!ref.current) return;\n\t\t\t\tonScroll(ref.current);\n\t\t\t},\n\t\t\t16,\n\t\t\t{trailing: true},\n\t\t);\n\n\t\tref.current.addEventListener('scroll', scrollListener, true);\n\t\treturn () => {\n\t\t\tref.current?.removeEventListener('scroll', scrollListener, true);\n\t\t};\n\t}, [ref, onScroll]);\n}\n","export const ACTIONS = {\n\tUPDATE: 'UPDATE',\n\tSET_LOADING: 'SET_LOADING',\n};\n","import type {AttributeTemplate, Lookups} from '../../types';\nimport {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nexport type State = {\n\tdata: AttributeTemplate[];\n\thasMandatoryUserDefinedTemplates: boolean;\n\tloading: boolean;\n\tlookups: Lookups;\n};\n\nexport const initialState: State = {\n\tdata: [],\n\thasMandatoryUserDefinedTemplates: false,\n\tloading: false,\n\tlookups: {\n\t\tkeys: [],\n\t\ttargets: [],\n\t},\n};\n\nconst reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.SET_LOADING:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tloading: action.loading,\n\t\t\t};\n\t\tcase ACTIONS.UPDATE: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdata: action.data,\n\t\t\t\thasMandatoryUserDefinedTemplates: action.data.some(\n\t\t\t\t\t(d) => !d.system && d.mandatory === 1,\n\t\t\t\t),\n\t\t\t\t// Get lookup keys/targets from data\n\t\t\t\tlookups: action.data.reduce(\n\t\t\t\t\t(lookups, attr) => {\n\t\t\t\t\t\tif (attr.keyDatasets.length) lookups.keys.push(attr.attributeid);\n\t\t\t\t\t\tif (attr.targetDatasets.length)\n\t\t\t\t\t\t\tlookups.targets.push(attr.attributeid);\n\t\t\t\t\t\treturn lookups;\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tkeys: [],\n\t\t\t\t\t\ttargets: [],\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t}\n};\n\nexport default reducer;\n","import {\n\tuseReducer,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseCallback,\n\tuseRef,\n} from 'react';\n\nimport attributesSingleton from '@netx/core-asset/collections/singleton/attributes';\nimport useBackboneCollection from '@netx/core-components/hooks/useBackboneCollection';\nimport useUpdateEffect from '@netx/core-components/hooks/useUpdateEffect';\nimport {metadataDatasetLookup} from '../../api/metadataDatasetLookup';\nimport {SYSTEM_ATTRIBUTE_LABELS} from '../../locales';\nimport type {\n\tAttributeId,\n\tAttributeDefaultValues,\n\tAttributeFormValues,\n\tAttributeObjectType,\n\tAttributeTemplate,\n\tAttributeType,\n} from '../../types';\nimport parseValue from '../../utils/parseValue';\nimport {isMultiValue} from '../../utils/isMultiValue';\nimport {ACTIONS} from './constants';\nimport reducer, {initialState} from './reducer';\n\nexport type UseAttributesParams = {\n\twritableOnly?: boolean;\n\tuserDefinedOnly?: boolean;\n};\n\nexport const useAttributes = ({\n\twritableOnly = false,\n\tuserDefinedOnly = false,\n}: UseAttributesParams = {}) => {\n\t// TODO: until we can wrap the entire app in we just need to utilize the singleton\n\t// and provide some bridging between that and the context\n\tconst attributes = useBackboneCollection(attributesSingleton, false);\n\n\tconst [state, dispatch] = useReducer(reducer, {\n\t\t...initialState,\n\t\tdata: attributes.filter(\n\t\t\t(attr) =>\n\t\t\t\t(!userDefinedOnly || attr.attributeid > -1) &&\n\t\t\t\t(!writableOnly || attr.permission !== 'r'),\n\t\t),\n\t});\n\n\tconst dataRef = useRef(state.data);\n\tdataRef.current = state.data;\n\n\tuseUpdateEffect(() => {\n\t\tconst _attributes = attributes.filter(\n\t\t\t(attr) =>\n\t\t\t\t(!userDefinedOnly || attr.attributeid > -1) &&\n\t\t\t\t(!writableOnly || attr.permission !== 'r'),\n\t\t);\n\n\t\tdispatch({type: ACTIONS.UPDATE, data: _attributes});\n\t}, [attributes, writableOnly, userDefinedOnly]);\n\n\t// Some basic getters\n\n\t/**\n\t * Get all attribute templates\n\t * @param omitReadOnly Omit read only attribute templates\n\t * @return Array of attribute templates\n\t */\n\tconst getAll = useCallback(\n\t\t(\n\t\t\tomitSystem?: boolean,\n\t\t\tomitReadOnly?: boolean,\n\t\t\tobjectType?: AttributeObjectType,\n\t\t) =>\n\t\t\tdataRef.current.filter(\n\t\t\t\t(attr) =>\n\t\t\t\t\t(!omitReadOnly || attr.permission !== 'r') &&\n\t\t\t\t\t(!omitSystem || !attr.system) &&\n\t\t\t\t\t(!objectType || attr.objectTypes.includes(objectType)),\n\t\t\t),\n\t\t[],\n\t);\n\n\t/**\n\t * get attribute template by id\n\t * @param id Attribute template id\n\t * @return Attribute template, if found\n\t */\n\tconst getById = useCallback(\n\t\t(id: AttributeId) =>\n\t\t\tdataRef.current.find((attr) => attr.attributeid === id),\n\t\t[],\n\t);\n\n\t/**\n\t * get attribute templates by ids\n\t * @param ids Attribute template ids\n\t * @return Array of attribute templates found\n\t */\n\tconst getByIds = useCallback(\n\t\t(\n\t\t\tids: AttributeId[],\n\t\t\tomitSystem?: boolean,\n\t\t\tobjectType?: AttributeObjectType,\n\t\t\tomitReadOnly?: boolean,\n\t\t) =>\n\t\t\tids\n\t\t\t\t.map((id) => getById(id))\n\t\t\t\t.filter(\n\t\t\t\t\t(attr) =>\n\t\t\t\t\t\tattr != null &&\n\t\t\t\t\t\t(attr.attributeid > -1 || !omitSystem) &&\n\t\t\t\t\t\t(attr.permission != 'r' || !omitReadOnly) &&\n\t\t\t\t\t\t(!objectType || attr.objectTypes.includes(objectType)),\n\t\t\t\t) as AttributeTemplate[],\n\t\t[],\n\t);\n\n\t/**\n\t * get attribute template by name\\\n\t * _frowned upon but still neccessary in some cases_\n\t * @param name Attribute template name\n\t * @return Attribute template, if found\n\t */\n\tconst getByName = useCallback(\n\t\t(name: string) => dataRef.current.find((attr) => attr.name === name),\n\t\t[],\n\t);\n\n\t/**\n\t * get attribute templates by names\\\n\t * _frowned upon but still neccessary in some cases_\n\t * @param names Attribute template names\n\t * @return Array of attribute templates found\n\t */\n\tconst getByNames = useCallback(\n\t\t(names: string[]) =>\n\t\t\tnames\n\t\t\t\t.map((name) => getByName(name))\n\t\t\t\t.filter((attr) => attr != null) as AttributeTemplate[],\n\t\t[],\n\t);\n\n\tconst getByType = useCallback(\n\t\t(type: AttributeType, omitSystem?: boolean) =>\n\t\t\tdataRef.current.filter(\n\t\t\t\t(attr) => attr.type === type && (attr.attributeid > -1 || !omitSystem),\n\t\t\t),\n\t\t[],\n\t);\n\n\t/**\n\t * get attribute template label by id\n\t * @param id Attribute template id\n\t * @return Attribute template label, if found\n\t */\n\tconst getLabelById = useCallback((id: AttributeId) => {\n\t\tconst attr = getById(id);\n\t\tif (!attr) return `!${id} unknown!`;\n\t\tif (!attr.system) return attr.name;\n\t\treturn SYSTEM_ATTRIBUTE_LABELS[id] || i18n.t(`i18n.${attr.name}`);\n\t}, []);\n\n\t/**\n\t * get default attribute template values\n\t * @param limitToIds Limit the returned values to the provided attribute template ids\n\t * @return Attribute values indexed by id\n\t */\n\tconst getDefaultValues = useCallback((limitToIds?: AttributeId[]) => {\n\t\tconst defaults = dataRef.current.reduce(\n\t\t\t(defaultValues, d) => {\n\t\t\t\tif (\n\t\t\t\t\t(limitToIds && !limitToIds.includes(d.attributeid)) ||\n\t\t\t\t\td.value == null ||\n\t\t\t\t\td.value === ''\n\t\t\t\t)\n\t\t\t\t\treturn defaultValues;\n\t\t\t\treturn {\n\t\t\t\t\t...defaultValues,\n\t\t\t\t\t[d.attributeid]: parseValue(d.type, d.value) as string[], // TODO: get the attribute values wrangled\n\t\t\t\t};\n\t\t\t},\n\t\t\t{},\n\t\t);\n\t\treturn defaults;\n\t}, []);\n\n\t// Some utils\n\n\t/**\n\t * perform attribute metadata lookup\n\t * @param attribute Attribute template to perform lookup from\n\t * @param lookupValue Value to perform lookup with\n\t * @param limitToIds Attribute template id\n\t * @return Attribute values indexed by id\n\t */\n\tconst lookup = useCallback(\n\t\tasync (\n\t\t\tattribute: AttributeTemplate,\n\t\t\tlookupValue: string,\n\t\t\tlimitToIds?: AttributeId[],\n\t\t) => {\n\t\t\tconst lookupResults = await metadataDatasetLookup({\n\t\t\t\tname: attribute.name,\n\t\t\t\tvalue: lookupValue,\n\t\t\t});\n\n\t\t\t// For each result, update the attribute values if possible\n\t\t\treturn lookupResults.reduce((values, result) => {\n\t\t\t\t// See, frowned upon but ¯\\_(ツ)_/¯\n\t\t\t\tconst attributeTemplate = getByName(result.label);\n\t\t\t\tif (\n\t\t\t\t\t!attributeTemplate ||\n\t\t\t\t\tattributeTemplate.permission === 'r' ||\n\t\t\t\t\t(limitToIds && !limitToIds.includes(attributeTemplate.attributeid))\n\t\t\t\t)\n\t\t\t\t\treturn values;\n\t\t\t\treturn {\n\t\t\t\t\t...values,\n\t\t\t\t\t[attributeTemplate.attributeid]: isMultiValue(attributeTemplate.type)\n\t\t\t\t\t\t? [result.value]\n\t\t\t\t\t\t: result.value,\n\t\t\t\t};\n\t\t\t}, {});\n\t\t},\n\t\t[],\n\t);\n\n\t/**\n\t * search by attribute value\n\t * @param id Attribute template id to search from\n\t * @param value Value to search with\n\t */\n\tconst searchValue = useCallback((id: AttributeId, value: any) => {\n\t\tconst attributeTemplate = getById(id);\n\t\tif (!attributeTemplate) return;\n\t\tdispatcher.trigger('search:attribute:value', attributeTemplate.name, value);\n\t}, []);\n\n\treturn {\n\t\tstate,\n\n\t\tgetAll,\n\t\tgetById,\n\t\tgetByIds,\n\t\tgetByName,\n\t\tgetByNames,\n\t\tgetByType,\n\t\tgetDefaultValues,\n\t\tgetLabelById,\n\t\tlookup,\n\t\tsearchValue,\n\t};\n};\n\nexport default useAttributes;\n","import React, {useMemo} from 'react';\n\nimport {Divider} from '@mui/material';\nimport MenuList, {MenuListProps} from '../MenuList';\nimport MenuItem from '../MenuItem';\n\nimport {ReactAction as Action} from '@netx/core/bootstrap';\n\nexport interface ActionMenuList {\n\tactions: Array;\n\tonAction: (action: Action) => void;\n}\n\nconst ActionMenuList: React.FunctionComponent<\n\tActionMenuList & MenuListProps\n> = React.forwardRef(\n\t({actions, onAction, ...props}, ref: React.RefObject) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t{actions.map((action, index) => {\n\t\t\t\t\tif (Array.isArray(action)) {\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tindex > 0 ? : null,\n\t\t\t\t\t\t\t...action.map((action) => (\n\t\t\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\t\t\tonAction(action);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tseverity={action.severity}\n\t\t\t\t\t\t\t\t\ttext={action.label}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)),\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t\treturn (\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\tonAction(action);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tseverity={action.severity}\n\t\t\t\t\t\t\ttext={action.label}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\n\t\t);\n\t},\n);\n\nexport default ActionMenuList;\n","import React from 'react';\n\nimport {Tab as MuiTab, TabProps as MuiTabProps} from '@mui/material';\nimport type {WithMuiPropOverrides} from '@netx/core-components/Theme';\n\nexport interface TabProps extends WithMuiPropOverrides {}\n\n/**\n * Wrapper for `@material-ui/Tab`\\\n * Provides some common overrides, and accepts all the same props as the component it wraps\n */\nexport const Tab = (props: TabProps) => {\n\treturn ;\n};\n\nexport default Tab;\n","import React from 'react';\n\nimport {compareProps} from '@netx/core-components/util';\nimport {FormType, FormValues} from './';\n\ntype Ref = React.ForwardedRef;\n\nexport interface FormProps\n\textends Omit<\n\t\tReact.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes,\n\t\t\tHTMLFormElement\n\t\t>,\n\t\t'noValidate' | 'onSubmit'\n\t> {\n\tform?: FormType;\n\tonSubmit?: (\n\t\tvalues: FormType['values'],\n\t\tchanges?: FormType['changes'],\n\t\tactions?: FormType['actions'],\n\t) => Promise;\n}\n\n/**\n * A helpful wrapper
that deals with some boiler plate settings\n */\nconst FormInner = (\n\t{\n\t\tchildren,\n\n\t\tform,\n\t\tonSubmit,\n\t\t...props\n\t}: FormProps,\n\tref?: Ref,\n) => {\n\tconst sendProps: any = {};\n\tif (form && form.options?.onSubmit) {\n\t\tsendProps.onSubmit = form.handleSubmit(form.options?.onSubmit);\n\t} else if (form && onSubmit) {\n\t\tsendProps.onSubmit = form.handleSubmit(onSubmit);\n\t} else {\n\t\tsendProps.onSubmit = onSubmit;\n\t}\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport const FormPrimitive = React.forwardRef(FormInner) as (\n\tprops: FormProps,\n\tref?: Ref,\n) => JSX.Element;\n\nexport const Form = React.memo(FormPrimitive, compareProps([]));\n\nexport default Form;\n","import {useEffect, useState} from 'react';\nimport useMuiMediaQuery, {Options} from '@mui/material/useMediaQuery';\nimport {Theme} from '@netx/core-components/Theme';\n\n// The beauty of browsers not being on the same damn spec\nconst inFullScreen = () => {\n\treturn (\n\t\t(document.fullscreenElement ||\n\t\t\t(document as any).webkitFullscreenElement ||\n\t\t\t(document as any).mozFullScreenElement) != null\n\t);\n};\n\n/**\n * Wrapper for MUI useMediaQuery\n * When entering fullscreen mode the browser resizes, if you have components depending\n * on the screen size - it can get kind of gross\n * This makes sure that mediaQuery result is not updated while entering/being in fullscreen\n */\nexport const useMediaQuery = (\n\tquery: string | ((theme: T) => string),\n\toptions?: Options,\n) => {\n\tconst _mediaQuery = useMuiMediaQuery(query, options);\n\tconst [mediaQuery, setMediaQuery] = useState(_mediaQuery);\n\n\tuseEffect(() => {\n\t\tif (inFullScreen()) return;\n\t\tsetMediaQuery(_mediaQuery);\n\t}, [_mediaQuery]);\n\n\treturn mediaQuery;\n};\n\nexport default useMediaQuery;\n","/**\n * The current selection of assets\n * @class\n */\nimport Base from './cartAssets';\n\nimport CoreCollection from '@netx/core/lib/netx-collection';\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\nimport AssetAttributeModel from '@netx/core-asset/models/attribute';\n\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\nimport attributeProperties from '@netx/core-asset/properties/attributes';\n\nimport {resyncScopes} from '../properties/cart';\n\nimport {dispatcher} from '@netx/core/bootstrap';\nimport {i18n} from '@netx/core/i18n';\n\nexport default class CurrentCart extends Base {\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tsearchAssetBeanObjects: 'Loading selected assets',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tsearchAssetBeanObjects: 'Loaded selected assets',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this Collection\n\t * @property {method} methods.addReviewAssetsToCart - Add project review assets to cart based on decision\n\t * @property {method} methods.addToCategory - Add cart assets to category\n\t * @property {method} methods.bulkEditCartAttributes - Bulk edit asset attributes\n\t * @property {method} methods.categorize - Batch categorize assets in cart\n\t * @property {method} methods.createPDFWithOptions - Create PDF, from cart assets, with options\n\t * @property {method} methods.delink - Batch delink cart assets\n\t * @property {method} methods.editMetadata - Batch edit cart asset metadata\n\t * @property {method} methods.exportMetadata - Export cart asset metadata\n\t * @property {method} methods.link - Batch link cart assets\n\t * @property {method} methods.manualRepurpose - Manually repurpose cart assets\n\t * @property {method} methods.moveToCategory - Move cart assets to category\n\t * @property {method} methods.removeFromCategory - Remove cart assets from category\n\t * @property {method} methods.replace - Replace cart asset metadata values\n\t * @property {method} methods.repurpose - Preset repurpose cart assets\n\t * @property {method} methods.resync - Resync cart assets\n\t * @property {method} methods.save - Save cart\n\t * @property {method} methods.share - Download cart\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t...super.methods,\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {number} projectId Project id\n\t\t\t * @param {string} decision Decision\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\taddReviewAssetsToCart(projectId, decision, opts) {\n\t\t\t\treturn ['addReviewAssetsToCart', projectId, decision];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Add cart assets to category\n\t\t\t * @method\n\t\t\t */\n\t\t\taddToCategory: [\n\t\t\t\t'batchCategorizeAssets',\n\t\t\t\t'batch',\n\t\t\t\t'categorizeArgs.targetCat',\n\t\t\t\t'categorizeArgs.add',\n\t\t\t],\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {array} attributes Attributes\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tbulkEditCartAttributes(attributes, opts) {\n\t\t\t\treturn ['bulkEditCartAttributes', attributes];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Add/move cart assets to category\n\t\t\t * @method\n\t\t\t * @param {number} targetCat Target category id\n\t\t\t * @param {string} action Action (\"Add\"/\"Move\"/\"Remove\")\n\t\t\t * @param {object} opts options\n\t\t\t */\n\t\t\tcategorize(targetCat, action, opts) {\n\t\t\t\tconst categorizeArgs = this.categorizeArgs;\n\t\t\t\treturn [\n\t\t\t\t\t'batchCategorizeAssets',\n\t\t\t\t\t[],\n\t\t\t\t\ttargetCat || categorizeArgs.targetCat,\n\t\t\t\t\taction || categorizeArgs.action,\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Create PDF with options from cart\n\t\t\t * @method\n\t\t\t */\n\t\t\tcreatePDFWithOptions: [\n\t\t\t\t'createPDFWithOptions',\n\t\t\t\t[], // empty asset list means \"use current cart contents\"\n\t\t\t\t'cpwo.sortField',\n\t\t\t\t'cpwo.portrait',\n\t\t\t\t'cpwo.cols',\n\t\t\t\t'cpwo.rows',\n\t\t\t\t'cpwo.attrNames',\n\t\t\t\t'cpwo.attrLines',\n\t\t\t\t'cpwo.highRes',\n\t\t\t\t'cpwo.templateName',\n\t\t\t\t'cpwo.titleStr',\n\t\t\t\t'cpwo.pdfExportPreset',\n\t\t\t],\n\t\t\t/**\n\t\t\t * Delink cart assets\n\t\t\t * @method\n\t\t\t * @param {string} scope Scope (\"All Links\"/\"Cart Relationships\")\n\t\t\t */\n\t\t\tdelink(scope, opts) {\n\t\t\t\tconst validScopes = ['all', 'searchOnly', 'cart'];\n\t\t\t\tif (scope == null || !validScopes.includes(scope)) scope = 'all';\n\n\t\t\t\treturn ['batchDelinkAssets', [], scope];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Edit cart assets metadata\n\t\t\t * @method\n\t\t\t */\n\t\t\teditMetadata: [\n\t\t\t\t'batchEditAssetMetadata',\n\t\t\t\t'batch',\n\t\t\t\t'editMetaArgs.changes',\n\t\t\t\t'editMetaArgs.action',\n\t\t\t],\n\t\t\t/**\n\t\t\t * Export cart assets metadata\n\t\t\t * @method\n\t\t\t */\n\t\t\texportMetadata: ['batchExportAssetMetadata', 'batch'],\n\t\t\t/**\n\t\t\t * Link cart assets\n\t\t\t * @method\n\t\t\t */\n\t\t\tlink(opts) {\n\t\t\t\treturn ['batchLinkAssets', []];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Manual repurpose assets in cart\n\t\t\t * @method\n\t\t\t */\n\t\t\tmanualRepurpose() {\n\t\t\t\treturn [\n\t\t\t\t\t'repurposeAssets',\n\t\t\t\t\tthis.repurposeAssetIds.length\n\t\t\t\t\t\t? this.repurposeAssetIds\n\t\t\t\t\t\t: // TODO - this aint good, you will only get what has been fetched\n\t\t\t\t\t\t this.pluck('assetId'),\n\t\t\t\t\t'repurposeOtherIds',\n\t\t\t\t\t'repurposeMethods',\n\t\t\t\t\t'repurposeValues',\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Find and replace strings in an attribute of assets\n\t\t\t * @method\n\t\t\t * @param {object} args Arguments object:\n\t\t\t * args.attributeid ID of an attribute, or an attribute model\n\t\t\t * args.find Search string\n\t\t\t * args.replace Replacement string\n\t\t\t * @param {object} opts Backbone.sync options\n\t\t\t */\n\t\t\treplace(args, opts) {\n\t\t\t\tlet attrId;\n\t\t\t\tif (_.isNumeric(args.attributeid)) {\n\t\t\t\t\tattrId = args.attributeid;\n\t\t\t\t} else if (args.attributeid instanceof AssetAttributeModel) {\n\t\t\t\t\t// Convert attribute to ID\n\t\t\t\t\tattrId = args.attributeid.id;\n\t\t\t\t} else if (_.isString(args.attributeid)) {\n\t\t\t\t\t// Look up attribute by code or name\n\t\t\t\t\t// TODO: should we even encourge this usage? Esp. with i18n of attr names coming soon?\n\t\t\t\t\tattrId =\n\t\t\t\t\t\t_.findWhere(attributeProperties, {code: args.attributeid}) ||\n\t\t\t\t\t\t_.findWhere(attributeProperties, {name: args.attributeid});\n\t\t\t\t\tattrId = attrId.attributeid;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('bad attribute:', args.attributeid);\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t'batchReplaceAssets',\n\t\t\t\t\t[], // empty array means \"current cart contents\"\n\t\t\t\t\tattrId,\n\t\t\t\t\targs.find,\n\t\t\t\t\targs.replace,\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Preset repurpose cart assets\n\t\t\t * @method\n\t\t\t */\n\t\t\trepurpose: [\n\t\t\t\t'repurposeAssetsWithPresetProcess',\n\t\t\t\t'inspection.imageAssetIds',\n\t\t\t\t'inspection.otherAssetIds',\n\t\t\t\t'repurposeId',\n\t\t\t\t'repurposeDownloadOverride',\n\t\t\t],\n\t\t\t/**\n\t\t\t * Resync cart assets\n\t\t\t * @method\n\t\t\t * @param {string} scope Scope (\"all\"/\"searchOnly\")\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tresync(scope, opts) {\n\t\t\t\tif (resyncScopes[scope] == null) {\n\t\t\t\t\tscope = 'all';\n\t\t\t\t}\n\t\t\t\treturn ['batchResyncAssets', [], scope];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Create a saved cart from the current cart\n\t\t\t * @method\n\t\t\t */\n\t\t\tsave(title, opts) {\n\t\t\t\treturn ['setCart', 0, title];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Download the current cart contents\n\t\t\t * @method\n\t\t\t * @todo Rename to 'download'\n\t\t\t */\n\t\t\tshare: ['downloadAssetsFromSavedCart', 0, true],\n\n\t\t\t/**\n\t\t\t * Switch the visibility status of current cart assets\n\t\t\t * @method\n\t\t\t * @param {string} state Desired visibility state: `visible` or `hidden`\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\ttoggleVisibility(state, opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'batchToggleVisibility',\n\t\t\t\t\t[], // Sending empty array tells server to use current cart\n\t\t\t\t\tstate,\n\t\t\t\t];\n\t\t\t},\n\n\t\t\t//////////////////////////\n\t\t\t// TEST\n\t\t\t//////////////////////////\n\t\t\t// test methods that do nothing:\n\t\t\ttestBatchFailure: ['batchTest'],\n\t\t\ttestBatchForever: ['runJob', 'runJobArgs.infinite'],\n\t\t\t//////////////////////////\n\t\t\t// !TEST\n\t\t\t//////////////////////////\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Parsers for this collection\n\t * @property {function} parsets.addReviewAssetsToCart - Added review assets to cart\n\t * @property {object} parsers.bulkEditCartAttributes - Bulk edited asset attributes\n\t * @property {function} parsers.repurpose - Repurposed assets with preset\n\t * @property {function} parsers.replace - Replaced attribute values\n\t * @property {function} parsers.resync - Resynced assets\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t...super.parsers,\n\t\t\t/**\n\t\t\t * Added assets to cart based on project review decisions\n\t\t\t * @function\n\t\t\t * @param {mixed} data Cart asset data\n\t\t\t * @param {number} projectId Project id\n\t\t\t * @param {string} decision Decision\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\taddReviewAssetsToCart(data, projectId, decision, opts) {\n\t\t\t\tthis.cartResultParser(data);\n\t\t\t\treturn data;\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {string} uuid UUID\n\t\t\t * @param {array} data Attribute data\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\treplace(uuid, data, opts) {\n\t\t\t\tif (!uuid) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Poll\n\t\t\t\treturn this.trackBatchJob(uuid, [data]);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Repurposed assets with preset\n\t\t\t * @function\n\t\t\t * @param {mixed} data Cart asset data\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\trepurpose(data, opts) {\n\t\t\t\tif (data == false) {\n\t\t\t\t\t// TODO: move away from this throwing-excetion-in-parser pattern. Return false or something.\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'repurposeAssetsWithPresetProcess returned failure as success',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/**\n\t\t\t * Repurposed assets with preset\n\t\t\t * @function\n\t\t\t * @param {string} uuid UUID\n\t\t\t * @param {string} scope Scope\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tresync(uuid, scope, opts) {\n\t\t\t\tif (!uuid) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Custom events for resyncing\n\t\t\t\tthis.trigger('resyncing', this);\n\n\t\t\t\t// Poll\n\t\t\t\tconst batchJob = this.trackBatchJob(uuid);\n\n\t\t\t\t// When completed\n\t\t\t\tbatchJob.completed.then(() => {\n\t\t\t\t\tthis.trigger('resynced', this);\n\t\t\t\t});\n\n\t\t\t\treturn batchJob;\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @fires module:asset#asset:deleted\n\t * @fires module:asset#asset:added:to:category\n\t * @listens module:asset#asset:deleted\n\t * @listens module:asset#asset:attributes:bulk:edit:succeeded\n\t * @listens module:cart#cart:add:assets:to:category:succeeded\n\t * @listens module:cart#cart:fetch\n\t * @listens module:cart#cart:delete:succeeded\n\t * @listens module:upload#upload:bulk:succeeded\n\t */\n\tconstructor(models, opts = {}) {\n\t\tsuper(models, opts);\n\n\t\t// This is non negotiable\n\t\tthis.id = 0;\n\n\t\t/**\n\t\t * @memberof Netx.Collections.CurrentCart\n\t\t * @property {object} editMetaArgs - Arguments to the edit metadata method\n\t\t * @property {array} editMetaArgs.changes - Changes [ { label: foo, value:'bar' }, { ...} ]\n\t\t * @property {string} editMetaArgs.action - Action to rake (\"Replace\", \"Append\")\n\t\t */\n\t\tthis.editMetaArgs = {\n\t\t\tchanges: [],\n\t\t\taction: '',\n\t\t\t// actions: {\n\t\t\t// \treplace: 'Replace',\n\t\t\t// \tappend: 'Append'\n\t\t\t// }\n\t\t};\n\n\t\t/**\n\t\t * Assets to repurpose\n\t\t * @memberof Netx.Collections.CurrentCart\n\t\t * @type {array}\n\t\t */\n\t\tthis.repurposeAssetIds = [];\n\n\t\t/**\n\t\t * @type {string}\n\t\t */\n\t\tthis.repurposeDownloadOverride = opts.repurposeDownloadOverride || '';\n\n\t\t/**\n\t\t * Preset repurpose\n\t\t * If image repurpose, use its id\n\t\t * If video repurpose, the name is id\n\t\t * Audio does not have any presets currently\n\t\t * @type {number|string}\n\t\t */\n\t\tthis.repurposeId = opts.repurposeId || 0;\n\n\t\t/**\n\t\t * repurposeOtherIds: meaning varies by process.\n\t\t * @memberof Netx.Collections.CurrentCart\n\t\t * @type {array}\n\t\t */\n\t\tthis.repurposeOtherIds = [];\n\t\t/**\n\t\t * Manual repurpose method name\n\t\t * @memberof Netx.Collections.CurrentCart\n\t\t * @type {array}\n\t\t */\n\t\tthis.repurposeMethods = [];\n\t\t/**\n\t\t * Manual repurpose method values\n\t\t * @memberof Netx.Collections.CurrentCart\n\t\t * @type {array}\n\t\t */\n\t\tthis.repurposeValues = [];\n\n\t\t/**\n\t\t * @memberof Netx.Collections.CurrentCart\n\t\t * @property {object} runJobArgs - Arguments to the run test job method\n\t\t * @property {string} runJobArgs.infinite - Run an infinte test job\n\t\t */\n\t\tthis.runJobArgs = {\n\t\t\tinfinite: 'com.netxposure.products.imageportal.util.InfiniteTestJob',\n\t\t};\n\n\t\t/**\n\t\t * Add to the collections within to enjoy the advantage of a 200ms queue\n\t\t * Like selecting a lot of individual assets at once would send off a request to the server n times\n\t\t * Now we debounce this call and provide the collection within - then reset it\n\t\t */\n\t\tconst addQueue = (this.addQueue = {\n\t\t\tassets: new CoreCollection([]),\n\t\t});\n\t\tthis.addSubCollection(this.addQueue.assets);\n\t\tconst removeQueue = (this.removeQueue = {\n\t\t\tassets: new CoreCollection([]),\n\t\t});\n\t\tthis.addSubCollection(this.removeQueue.assets);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'counted', this.triggerCartCount)\n\t\t\t// TODO: Why does this exist? Fetch should be called directly on model/collection instances\n\t\t\t// Having a cart:fetch event seems like an unnecessary layer.\n\t\t\t.listenTo(dispatcher, 'cart:fetch', (options) => {\n\t\t\t\tthis.fetch(options);\n\t\t\t})\n\t\t\t.listenTo(dispatcher, 'asset:deleted', (id) => {\n\t\t\t\tvar asset = this.get(id);\n\t\t\t\tasset && this.remove(asset);\n\t\t\t})\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'cart:add:assets:to:category:succeeded',\n\t\t\t\t(assetIds, catId) => {\n\t\t\t\t\tassetIds.forEach((id) => {\n\t\t\t\t\t\tdispatcher.trigger('asset:added:to:category', id, catId);\n\t\t\t\t\t\tdispatcher.trigger(`asset:added:to:category:${id}`, catId);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t)\n\t\t\t// Add asset queue (for large selections and stuff - so we do not end up with a million individual requests)\n\t\t\t.listenTo(\n\t\t\t\tthis.addQueue.assets,\n\t\t\t\t'add',\n\t\t\t\t_.debounce(() => {\n\t\t\t\t\tif (!addQueue.assets.length) return;\n\t\t\t\t\tthis.addAssetsToCart(addQueue.assets.pluck('id'));\n\t\t\t\t\taddQueue.assets.reset();\n\t\t\t\t}, 200),\n\t\t\t)\n\t\t\t.listenTo(addQueue.assets, 'add remove reset', this.queueUpdated)\n\t\t\t// Remove asset queue (for large selections and stuff - so we do not end up with a million individual requests)\n\t\t\t.listenTo(\n\t\t\t\tremoveQueue.assets,\n\t\t\t\t'add',\n\t\t\t\t_.debounce(() => {\n\t\t\t\t\tif (removeQueue.assets.length) {\n\t\t\t\t\t\tthis.removeAssets(removeQueue.assets.pluck('id'));\n\t\t\t\t\t\tremoveQueue.assets.reset();\n\t\t\t\t\t}\n\t\t\t\t}, 200),\n\t\t\t)\n\t\t\t.listenTo(removeQueue.assets, 'add remove reset', this.queueUpdated)\n\t\t\t// Cart asset attributes have been bulk edited\n\t\t\t.listenTo(dispatcher, 'asset:attributes:bulk:edit:succeeded', () => {\n\t\t\t\tthis.fetch({duplicateQueryPolicy: 'abort'});\n\t\t\t})\n\t\t\t.listenTo(dispatcher, 'upload:bulk:succeeded', this.checkRoute);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} data Attribute data\n\t * @param {object} opts Request options\n\t */\n\tbulkEdit(data, opts) {\n\t\tvar assetAttributes = Netx.getAttributesByObjectType('asset'),\n\t\t\tattrModel;\n\n\t\treturn this.bulkEditCartAttributes(\n\t\t\t_.compact(\n\t\t\t\t_.map(data, (v, k) => {\n\t\t\t\t\tattrModel = assetAttributes.findWhere({name: k});\n\t\t\t\t\tif (!attrModel) return;\n\n\t\t\t\t\tif (!_.isArray(v)) {\n\t\t\t\t\t\tv = _.isEmpty(v) ? [] : [v];\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttemplateId: attrModel.id,\n\t\t\t\t\t\tvalues: v,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t),\n\t\t\topts,\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @return {array} Repurposeable assets\n\t */\n\tgetRepurposableAssets() {\n\t\tconst assets = [];\n\t\tthis.each((asset, idx, all) => {\n\t\t\tif (asset.get('repurposeAvailability') > 0) {\n\t\t\t\tassets.push(asset);\n\t\t\t}\n\t\t});\n\t\treturn assets;\n\t}\n\n\t/**\n\t * Returns the ids of the subset of this collection's assets that are repurposable.\n\t * NOTE: it seems that the legacy behavior is to pass the entire cart contents to repurpose,\n\t * and then the DAM creates an archive of all those assets with only the repurposable ones changed.\n\t * So this function may not be so useful.\n\t * @method\n\t * @return {array} Array of repurposeable asset ids\n\t */\n\tgetRepurposableIds() {\n\t\treturn _.map(this.getRepurposableAssets(), (asset, idx, all) => {\n\t\t\treturn asset.id;\n\t\t});\n\t}\n\n\t/**\n\t * Current cart is not sortable\n\t * @override\n\t * @return {boolen}\n\t */\n\tisSortable() {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Queue has been updated (asset added or removed)\n\t * @method\n\t */\n\tqueueUpdated() {\n\t\tconst queueCount =\n\t\t\tthis.addQueue.assets.length + this.removeQueue.assets.length;\n\t\tthis.queueing = queueCount > 0;\n\t\tthis.trigger('nx:queue:change', this, queueCount);\n\t}\n\n\t/**\n\t * Remove assets from current cart\n\t * @override\n\t * @param {array} assets Array of asset models\n\t * @fires modules:cart#cart:removed\n\t */\n\tremoveAssets(assets, opts) {\n\t\tconst assetsList = _.tidyAssetList(assets);\n\n\t\treturn this.removeAssetsFromCart(assetsList, opts).then(() => {\n\t\t\tdispatcher.trigger('cart:removed', assetsList);\n\t\t\tthis.remove(assetsList);\n\t\t\treturn assetsList;\n\t\t});\n\t}\n\n\t/**\n\t * Return an assetSet model defining the set of this cart's assets\n\t * @method\n\t * @return {module:asset/models/assetSet} AssetSet model\n\t */\n\ttoAssetSet() {\n\t\treturn new AssetSetModel({\n\t\t\ttype: assetSetTypes.cart,\n\t\t\tids: [this.id],\n\t\t\tmodels: undefined,\n\t\t\tlabel: i18n.t('i18n.cartAssets'),\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CurrentCart';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-asset/collections/assets';\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\n\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\n\nexport default class LocalSelection extends Base {\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.routeContext = opts.routeContext || 'cart';\n\n\t\tsuper(models, opts);\n\n\t\tthis.localStoragePathKey =\n\t\t\topts.localStoragePathKey ||\n\t\t\t`${Netx.URL.host}-${Netx.cms.portal.get('path')}`;\n\n\t\t_.defer(() => {\n\t\t\tthis.stopListening(this.pager, 'change:itemTotal');\n\n\t\t\tthis.pager\n\t\t\t\t.set({routesToPage: true})\n\t\t\t\t.stopListening(this, 'add')\n\t\t\t\t.stopListening(this, 'sync');\n\t\t});\n\t}\n\n\t/** @method */\n\tassetCount() {\n\t\treturn this.pager.get('itemTotal') || this.length;\n\t}\n\n\tfetch() {\n\t\tconsole.log('fetch local');\n\t\treturn this.loadLocalAssets(1);\n\t}\n\t/**\n\t * @method\n\t * @param {number} page Page\n\t * @param {object} opts Options\n\t */\n\tloadLocalAssets(page = 1, opts = {}) {\n\t\tlet ids = Netx.store.get(this.localStoragePathKey);\n\n\t\tif (!ids || !ids.length) {\n\t\t\treturn this.empty();\n\t\t}\n\n\t\tconst count = ids.length;\n\t\tthis.pager.set('itemTotal', count);\n\n\t\tconst endSlice =\n\t\t\tids.length > this.pageSize ? this.pageSize * page - 1 : ids.length;\n\n\t\tids = ids.slice((page - 1) * this.pageSize, endSlice);\n\n\t\treturn this.fetchSpecificAssets(ids, opts).then(() => {\n\t\t\tthis.trigger('counted', count);\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} page Page number\n\t * @param {object} opts Options\n\t */\n\tgotoPage(page, opts) {\n\t\tthis.curPage = parseInt(page);\n\t\tthis.loadPage(this.curPage, opts);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} page Page\n\t * @param {object} opts Options\n\t */\n\tloadPage(page, opts) {\n\t\tthis.loadLocalAssets(page, opts);\n\t}\n\n\t/**\n\t * @method\n\t * @param {arrray} idArr IDs\n\t */\n\t// todo: only fetch the assets we don't have\n\t// or only fetch when we arrive at the cart\n\taddLocalAssets(idArr) {\n\t\tlet ids = Netx.store.get(this.localStoragePathKey);\n\t\tids = _.union(idArr, ids);\n\n\t\tNetx.store.set(this.localStoragePathKey, ids);\n\n\t\t// keep the pager in the know\n\t\tthis.pager.set('itemTotal', ids.length);\n\n\t\t// fetch and add\n\t\tthis.loadLocalAssets(1);\n\t\tdispatcher.trigger('cart:added', idArr);\n\n\t\treturn new $.Deferred().resolve();\n\t}\n\n\t/**\n\t * @method\n\t * @param {arrray} idArr IDs\n\t */\n\tremoveLocalAssets(idArr) {\n\t\tlet ids = Netx.store.get(this.localStoragePathKey);\n\t\tids = _.difference(ids, idArr);\n\t\tconst count = ids.length;\n\n\t\tNetx.store.set(this.localStoragePathKey, ids);\n\n\t\t// keep the pager in the know\n\t\tthis.pager.set('itemTotal', count);\n\n\t\tthis.remove(idArr);\n\t\tdispatcher.trigger('cart:removed', idArr);\n\n\t\tthis.trigger('counted', count);\n\t}\n\n\t/** @method */\n\treturnAssetIdArray() {\n\t\treturn Netx.store.get(this.localStoragePathKey);\n\t}\n\n\t/** @method */\n\tempty() {\n\t\tNetx.store.set(this.localStoragePathKey, []);\n\t\tthis.pager.set('itemTotal', 0);\n\t\tthis.reset();\n\t\tthis.trigger('counted', 0);\n\t\treturn new $.Deferred().resolve();\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} assetId Asset ID\n\t * @return {boolen} Sortable\n\t */\n\tisInCart(assetId) {\n\t\tlet ids = Netx.store.get(this.localStoragePathKey);\n\t\treturn ids && ids.indexOf(assetId) > -1;\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolen} Sortable\n\t */\n\tisSortable() {\n\t\treturn false;\n\t}\n\t/**\n\t * @override\n\t */\n\ttoAssetSet() {\n\t\tconst assetIds = this.returnAssetIdArray();\n\t\t// THEM-1814 - in assets.js type gets set to types.asset, we need multiple assets\n\t\t// see share controller form.accessType === 'assetSet'\n\t\treturn new AssetSetModel({\n\t\t\ttype: assetSetTypes.assetSet,\n\t\t\tids: assetIds,\n\t\t\tlabel: i18n.t('asset:i18n.nAssets', {count: assetIds.length}),\n\t\t\t// models: this.models,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'LocalSelection';\n\t}\n}\n","import CurrentCart from '@netx/core-cart/collections/currentCart';\n// @ts-ignore\nimport LocalAssetsCollection from '@netx/core-cart/collections/localSelection';\nimport {dispatcher} from '@netx/core/bootstrap';\nimport {isPublicUser} from '@netx/core-user/utils/isPublicUser';\n\nconst cart = isPublicUser()\n\t? new LocalAssetsCollection([])\n\t: new CurrentCart([]);\n\ncart.on('counted', (count: number) => {\n\tdispatcher\n\t\t// 'updated' is kind of vague. We should move away from this\n\t\t.trigger('cart:updated', count)\n\t\t// 'counted' is better -- symmetrical to the collection's 'counted' event. Use this in the future.\n\t\t.trigger('cart:counted', count);\n});\n\nexport default cart;\n","import {useEffect} from 'react';\nimport {dispatcher} from '@netx/core/bootstrap';\n\n/**\n * Use Netx Backbone `dispatcher`\n * @param event `dispatcher` event\n * @param cb `dispatcher` callback\n * @param once listen once\n */\nexport const useDispatcher = (\n\tevent: string,\n\tcb: (...args: any) => void,\n\tonce?: boolean,\n) => {\n\tuseEffect(() => {\n\t\tonce ? dispatcher.once(event, cb) : dispatcher.on(event, cb);\n\t\treturn () => {\n\t\t\tdispatcher.off(event, cb);\n\t\t};\n\t}, [cb]);\n};\n\nexport default useDispatcher;\n","import {useCallback, useEffect, useRef, useState} from 'react';\nimport {unstable_batchedUpdates} from 'react-dom';\nimport useComponentIsMounted from './useComponentIsMounted';\n\nconst loadRegular = (src: string) => {\n\tlet cancelled = false;\n\tconst image = new Image();\n\tconst p = new Promise((resolve, reject) => {\n\t\timage.onload = () => {\n\t\t\tif (cancelled) return;\n\t\t\tif (!image.naturalHeight && !image.naturalWidth)\n\t\t\t\treject(new Error('image not found'));\n\t\t\tresolve(image);\n\t\t};\n\t\timage.onerror = (err) => {\n\t\t\t!cancelled && reject(err);\n\t\t};\n\t\timage.src = src;\n\t});\n\treturn {\n\t\tpromise: p,\n\t\tcancel: () => {\n\t\t\tcancelled = true;\n\t\t\timage.src = '';\n\t\t},\n\t};\n};\n\nexport const useImageLoader = (\n\tdisableXHR = false,\n\tonLoaded?: (src: string) => void,\n) => {\n\tconst [, setFallbackUrls] = useState([]);\n\tconst [error, setError] = useState();\n\tconst [loading, setLoading] = useState(false);\n\tconst [progress, setProgress] = useState(0);\n\tconst [src, setSrc] = useState();\n\tconst [url, setUrl] = useState();\n\tconst lastUrlRef = useRef();\n\n\tconst {act} = useComponentIsMounted();\n\n\tconst currentlyLoadingUrl = useRef(url);\n\tconst disableXHRRef = useRef(disableXHR);\n\tconst loadingRegularCancel = useRef<() => void | undefined>();\n\tconst onLoadedRef = useRef(onLoaded);\n\tconst xmlHttpRef = useRef();\n\n\tdisableXHRRef.current = disableXHR;\n\tonLoadedRef.current = onLoaded;\n\n\tconst cancelLoad = useCallback(() => {\n\t\tact(() => setLoading(false));\n\t\txmlHttpRef.current?.abort();\n\t\txmlHttpRef.current = undefined;\n\t\tloadingRegularCancel.current?.();\n\t\tloadingRegularCancel.current = undefined;\n\t}, []);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tcancelLoad();\n\t\t};\n\t}, []);\n\n\t// On each error, move on tothe next fallback url\n\tuseEffect(() => {\n\t\tif (error == null) return;\n\t\tact(() => {\n\t\t\tconsole.warn('trying fallback if available');\n\t\t\tsetFallbackUrls((fallbackUrls) => {\n\t\t\t\tif (!fallbackUrls.length) {\n\t\t\t\t\tconsole.warn('fallback unavailable');\n\t\t\t\t\tsetLoading(false);\n\t\t\t\t\treturn fallbackUrls;\n\t\t\t\t}\n\t\t\t\tconst _fallbackUrls = [...fallbackUrls];\n\t\t\t\tsetUrl(_fallbackUrls.shift());\n\t\t\t\treturn _fallbackUrls;\n\t\t\t});\n\t\t});\n\t}, [error]);\n\n\t// When it is time to load the image\n\tuseEffect(() => {\n\t\tcancelLoad();\n\n\t\tcurrentlyLoadingUrl.current = url;\n\n\t\tif (!url) return;\n\n\t\tsetError(undefined);\n\n\t\tif (disableXHRRef.current) {\n\t\t\tsetLoading(true);\n\t\t\tconst _loadRegular = loadRegular(url);\n\t\t\tloadingRegularCancel.current = _loadRegular.cancel;\n\t\t\t_loadRegular.promise\n\t\t\t\t.then((image) => {\n\t\t\t\t\tact(() => {\n\t\t\t\t\t\tonLoadedRef.current?.(url);\n\t\t\t\t\t\tsetSrc(url);\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error) =>\n\t\t\t\t\tact(() => {\n\t\t\t\t\t\tsetError(error);\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.finally(() =>\n\t\t\t\t\tact(() => {\n\t\t\t\t\t\tloadingRegularCancel.current = undefined;\n\t\t\t\t\t\tunstable_batchedUpdates(() => {\n\t\t\t\t\t\t\tsetLoading(false);\n\t\t\t\t\t\t\tsetUrl(undefined);\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst xmlHTTP = (xmlHttpRef.current = new XMLHttpRequest());\n\t\txmlHTTP.open('GET', url, true);\n\t\txmlHTTP.responseType = 'arraybuffer';\n\n\t\txmlHTTP.onerror = (e) =>\n\t\t\tact(() => setError('Error communicating with server'));\n\n\t\txmlHTTP.onload = (e) =>\n\t\t\tact(() => {\n\t\t\t\tif (xmlHTTP.status !== 200) {\n\t\t\t\t\tsetError('Error downloading image');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst headers = xmlHTTP.getAllResponseHeaders();\n\t\t\t\tconst matchMime = headers.match(/^Content-Type\\:\\s*(.*?)$/im);\n\t\t\t\tconst blob = new Blob([xmlHTTP.response], {\n\t\t\t\t\ttype: matchMime ? matchMime[1] : 'image/jpg',\n\t\t\t\t});\n\t\t\t\tsetTimeout(\n\t\t\t\t\t() =>\n\t\t\t\t\t\tact(() => {\n\t\t\t\t\t\t\tlastUrlRef.current &&\n\t\t\t\t\t\t\t\twindow.URL.revokeObjectURL(lastUrlRef.current);\n\t\t\t\t\t\t\tconst url = (lastUrlRef.current = window.URL.createObjectURL(\n\t\t\t\t\t\t\t\tblob,\n\t\t\t\t\t\t\t));\n\t\t\t\t\t\t\tonLoadedRef.current?.(url);\n\t\t\t\t\t\t\tunstable_batchedUpdates(() => {\n\t\t\t\t\t\t\t\tsetSrc(url);\n\t\t\t\t\t\t\t\tsetLoading(false);\n\t\t\t\t\t\t\t\tsetUrl(undefined);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}),\n\t\t\t\t\t200,\n\t\t\t\t);\n\t\t\t});\n\n\t\txmlHTTP.onloadend = () =>\n\t\t\tact(() => {\n\t\t\t\tsetProgress(100);\n\t\t\t\txmlHttpRef.current = undefined;\n\t\t\t});\n\n\t\txmlHTTP.onloadstart = () => act(() => setProgress(0));\n\n\t\txmlHTTP.onprogress = (e) =>\n\t\t\tact(() => {\n\t\t\t\tif (!e.lengthComputable) return;\n\t\t\t\tsetProgress((e.loaded / e.total) * 100);\n\t\t\t});\n\n\t\tsetLoading(true);\n\t\txmlHTTP.send();\n\t}, [url]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tlastUrlRef.current && window.URL.revokeObjectURL(lastUrlRef.current);\n\t\t};\n\t}, []);\n\n\tconst load = useCallback((url: string | string[]) => {\n\t\tif (!Array.isArray(url)) url = [url];\n\n\t\tconst _url = url.shift();\n\t\tif (!_url) return;\n\n\t\t// only cancel the current load if the requested url differs from what was already loading\n\t\tif (_url !== currentlyLoadingUrl.current) {\n\t\t\tcancelLoad();\n\t\t}\n\n\t\tunstable_batchedUpdates(() => {\n\t\t\tsetSrc(undefined);\n\t\t\tsetLoading(false);\n\t\t\tsetError(undefined);\n\t\t\tsetFallbackUrls(url as string[]);\n\t\t\tsetUrl(_url);\n\t\t});\n\t}, []);\n\n\treturn {\n\t\terror,\n\t\tloading,\n\t\tprogress,\n\t\tsrc,\n\n\t\tload,\n\t};\n};\n\nexport default useImageLoader;\n","export const SearchTypeCheckouts = 13 as const;\nexport type TSearchTypeCheckouts = typeof SearchTypeCheckouts;\n\n// elementSubType1\nexport enum CheckoutType {\n\tALL = 0,\n\tUSER_ID = 1,\n}\n","export const SearchTypeDate = 4 as const;\nexport type TSearchTypeDate = typeof SearchTypeDate;\n\n/** elementSubType1 */\nexport enum DateType {\n\tCREATION_DATE = 0,\n\tLAST_MODIFIED = 1,\n\tUSER_DEFINED_ATTRIBUTE = 2,\n\tIMPORT_DATE = 3,\n}\n\n/** elementSubType2 */\nexport enum DateSubType {\n\tLAST_THREE_MONTHS = 1,\n\tLAST_SIX_MONTHS = 2,\n\tLAST_YEAR = 3,\n\tBEFORE = 4,\n\tAFTER = 5,\n\tIN_BETWEEN = 6,\n\tLAST_WEEK = 7,\n\tLAST_MONTH = 8,\n\tTODAY = 9,\n\tYESTERDAY = 10,\n}\n\n/**\n * DateSubTypes that do not require a value\n */\nexport const DateNoValueTypes = [\n\tDateSubType.LAST_MONTH,\n\tDateSubType.LAST_SIX_MONTHS,\n\tDateSubType.LAST_THREE_MONTHS,\n\tDateSubType.LAST_WEEK,\n\tDateSubType.LAST_YEAR,\n\tDateSubType.TODAY,\n\tDateSubType.YESTERDAY,\n] as const;\n\n/**\n * DateSubTypes that require a single value\n */\nexport const DateSingleValueTypes = [\n\tDateSubType.AFTER,\n\tDateSubType.BEFORE,\n] as const;\n\n/**\n * DateTypes related to system attributes\n */\nexport const DateSystemDefinedTypes = [\n\tDateType.IMPORT_DATE,\n\tDateType.CREATION_DATE,\n\tDateType.LAST_MODIFIED,\n] as const;\n\nexport type DoesNotRequireDate = typeof DateNoValueTypes[number];\nexport type RequiresSingleDate = typeof DateSingleValueTypes[number];\nexport type SystemDefined = typeof DateSystemDefinedTypes[number];\n","export const SearchTypeKeyword = 1 as const;\nexport type TSearchTypeKeyword = typeof SearchTypeKeyword;\n\nexport enum KeywordType {\n\tMATCH_ALL_FRAGMENTS = 4,\n\tMATCH_ANY_FRAGMENT = 5,\n\tMATCH_EXACTLY = 1,\n\tMATCH_EXACTLY_INCLUDING_DIACRITICAL_MARKS = 10,\n\tMATCH_EXCLUDE = 3,\n\tMATCH_ALL_WHOLE_WORDS_AND = 0,\n\tMATCH_ANY_WHOLE_WORDS_OR = 2,\n}\n","export const SearchTypeVisual = 27 as const;\nexport type TSearchTypeVisual = typeof SearchTypeVisual;\n\nexport enum VisualType {\n\tASSET = 1,\n\tCOLOR = 2,\n}\n","import {\n\tfaCloudUploadAlt,\n\tfaFile,\n\tfaFolder,\n\tfaTimes,\n} from '@fortawesome/pro-solid-svg-icons';\n\nexport const UPLOAD_ASSET_ACTION_ICON = {\n\tGOTO_ASSET: faFile,\n\tGOTO_FOLDER: faFolder,\n\tREMOVE: faTimes,\n\tSTATUS: faCloudUploadAlt,\n\tUPLOAD: faCloudUploadAlt,\n};\n\nexport type UploadAssetBaseEvent = typeof UPLOAD_ASSET_BASE_EVENT;\n\nexport const UPLOAD_ASSET_BASE_EVENT = `upload:asset`;\n\nexport const UPLOAD_ASSET_EVENT = {\n\tGOTO_ASSET: `${UPLOAD_ASSET_BASE_EVENT}:goto:asset`,\n\tGOTO_FOLDER: `${UPLOAD_ASSET_BASE_EVENT}:goto:folder`,\n\tIMPORT_ERROR: `${UPLOAD_ASSET_BASE_EVENT}:error`,\n\tIMPORT_FAILURE: `${UPLOAD_ASSET_BASE_EVENT}:failure`,\n\tIMPORT_SUCCESS: `${UPLOAD_ASSET_BASE_EVENT}:success`,\n\tIMPORT_WARNING: `${UPLOAD_ASSET_BASE_EVENT}:warning`,\n\tREMOVE: `${UPLOAD_ASSET_BASE_EVENT}:remove`,\n\tSTATUS: `${UPLOAD_ASSET_BASE_EVENT}:status`,\n\tUPLOAD: `${UPLOAD_ASSET_BASE_EVENT}:upload`,\n};\n","import {useCallback, useMemo} from 'react';\nimport _ from 'underscore';\nimport {InfiniteQueryObserverResult as LegacyInfiniteQueryObserverResult} from 'react-query';\nimport {\n\tInfiniteQueryObserverResult,\n\tuseQueryClient,\n\tInfiniteData,\n\tQueryKey,\n} from '@tanstack/react-query';\nimport {debouncePromise} from '@netx/core/lib/utils';\n\nexport const useReactQueryUtils = <\n\tTResult,\n\tTError,\n\tTData extends React.MutableRefObject\n>(\n\treactQuery:\n\t\t| InfiniteQueryObserverResult\n\t\t| LegacyInfiniteQueryObserverResult,\n\tdataRef: TData,\n) => {\n\tconst queryClient = useQueryClient();\n\n\tconst invalidate = useCallback((key: QueryKey | string) => {\n\t\tdataRef.current = [];\n\t\tqueryClient.invalidateQueries(\n\t\t\ttypeof key !== 'string'\n\t\t\t\t? (key as any)\n\t\t\t\t: {\n\t\t\t\t\t\tpredicate: ({queryKey}) => queryKey[0] === key,\n\t\t\t\t\t\trefetchPage: (lastPage, index, allPages) => {\n\t\t\t\t\t\t\t// console.log('lastPage', lastPage, 'index', index, 'allPages', allPages);\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t},\n\t\t\t\t },\n\t\t);\n\t}, []);\n\n\tconst loadMoreItems = useCallback(\n\t\tasync (startIndex: number, stopIndex: number) => {\n\t\t\tif (!dataRef.current.length) return;\n\n\t\t\tfor (let i = startIndex, c = stopIndex + 1; i < c; i++) {\n\t\t\t\tif (dataRef.current[i] != null) startIndex++;\n\t\t\t}\n\n\t\t\tif (startIndex > stopIndex) return undefined;\n\t\t\t// console.log('load more items', startIndex, stopIndex + 1);\n\t\t\tawait reactQuery.fetchNextPage({\n\t\t\t\tpageParam: {\n\t\t\t\t\tstartIndex: startIndex,\n\t\t\t\t\tstopIndex: stopIndex + 1,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\t[reactQuery.fetchNextPage],\n\t);\n\n\t/** Check if item has been loaded */\n\tconst isItemLoaded = useCallback(\n\t\t(index: number) => dataRef.current[index] != null,\n\t\t[],\n\t);\n\n\t/** Debounced load more items */\n\tconst debouncedLoadMoreItems = useMemo(\n\t\t() => debouncePromise(loadMoreItems, 300),\n\t\t[loadMoreItems],\n\t);\n\n\tconst debouncedRefetch = useMemo(() => _.debounce(reactQuery.refetch, 300), [\n\t\treactQuery.refetch,\n\t]);\n\n\tconst removeItemFromCache = useCallback((key: QueryKey | string, id: any) => {\n\t\tlet itemRemoved = false;\n\t\tconst update = (data: InfiniteData<{results: {id: any}[]}>) => {\n\t\t\tif (!data) return data;\n\t\t\tdata.pages = data.pages.map((page) => {\n\t\t\t\tconst lengthBefore = page.results.length;\n\t\t\t\tpage.results = page.results.filter((result) => result.id !== id);\n\t\t\t\tif (page.results.length !== lengthBefore) itemRemoved = true;\n\t\t\t\treturn page;\n\t\t\t});\n\t\t\tif (itemRemoved) {\n\t\t\t\t// TODO: gross, obvs\n\t\t\t\tif ((data.pages[data.pages.length - 1] as any).size) {\n\t\t\t\t\t(data.pages[data.pages.length - 1] as any).size--;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t};\n\n\t\tif (typeof key !== 'string') {\n\t\t\tqueryClient.setQueryData(key, update);\n\t\t\treturn;\n\t\t}\n\n\t\tqueryClient.setQueriesData(\n\t\t\t{\n\t\t\t\tpredicate: ({queryKey}) => queryKey[0] === key,\n\t\t\t},\n\t\t\tupdate,\n\t\t);\n\t}, []);\n\n\tconst updateItemInCache = useCallback(\n\t\t(key: QueryKey | string, updatedData: any) => {\n\t\t\tconst update = (data: InfiniteData<{results: {id: any}[]}>) => {\n\t\t\t\tif (!data) return data;\n\t\t\t\tdata.pages = data.pages.map((page) => {\n\t\t\t\t\tpage.results = page.results.map((result) => {\n\t\t\t\t\t\tif (result.id !== updatedData.id) return result;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...result,\n\t\t\t\t\t\t\t...updatedData,\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t\treturn page;\n\t\t\t\t});\n\t\t\t\treturn data;\n\t\t\t};\n\n\t\t\tif (typeof key !== 'string') {\n\t\t\t\tqueryClient.setQueryData(key, update);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tqueryClient.setQueriesData(\n\t\t\t\t{\n\t\t\t\t\tpredicate: ({queryKey}) => queryKey[0] === key,\n\t\t\t\t},\n\t\t\t\tupdate,\n\t\t\t);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleDeleteMutationSuccess = useCallback(\n\t\t({queryKey, cb}: {queryKey: QueryKey | string; cb?: () => void}) => (\n\t\t\tid: any,\n\t\t) => {\n\t\t\tremoveItemFromCache(queryKey, id);\n\t\t\t// invalidate(queryKey);\n\t\t\tcb?.();\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleEditMutationSuccess = useCallback(\n\t\t(params: {\n\t\t\tqueryKey: QueryKey | string;\n\t\t\tcb?: () => void;\n\t\t\teditEffectsOrder?: (params: {originalData: T; updatedData: T}) => boolean;\n\t\t\teditRemovesFromFilter?: (params: {\n\t\t\t\toriginalData: T;\n\t\t\t\tupdatedData: T;\n\t\t\t}) => boolean;\n\t\t}) => (updatedData: T) => {\n\t\t\tconst {queryKey, cb, editEffectsOrder, editRemovesFromFilter} = params;\n\n\t\t\tconst existing = dataRef.current.find((d) => d?.id === updatedData.id);\n\n\t\t\t// new\n\t\t\tif (!existing) {\n\t\t\t\tinvalidate(queryKey);\n\t\t\t\tcb?.();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// no longer pertinent to the filters\n\t\t\tif (\n\t\t\t\teditRemovesFromFilter?.({\n\t\t\t\t\toriginalData: existing,\n\t\t\t\t\tupdatedData: updatedData,\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\tremoveItemFromCache(queryKey, updatedData.id);\n\t\t\t\tinvalidate(queryKey);\n\t\t\t\tcb?.();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// preemptive update\n\t\t\tupdateItemInCache(queryKey, updatedData);\n\n\t\t\t// may not be in the correct order any longer\n\t\t\tif (\n\t\t\t\teditEffectsOrder?.({\n\t\t\t\t\toriginalData: existing,\n\t\t\t\t\tupdatedData: updatedData,\n\t\t\t\t})\n\t\t\t)\n\t\t\t\tinvalidate(queryKey);\n\n\t\t\tcb?.();\n\t\t},\n\t\t[],\n\t);\n\n\tconst loading = reactQuery.isFetching || reactQuery.isLoading;\n\n\treturn {\n\t\tloading,\n\t\tdebouncedLoadMoreItems,\n\t\tdebouncedRefetch,\n\t\thandleDeleteMutationSuccess,\n\t\thandleEditMutationSuccess,\n\t\tinvalidate,\n\t\tisItemLoaded,\n\t\tloadMoreItems,\n\t\tremoveItemFromCache,\n\t\tupdateItemInCache,\n\t};\n};\n\nexport default useReactQueryUtils;\n","export const ACTIONS = {\n\tDISABLE: 'DISABLE',\n\tENABLE: 'ENABLE',\n\tEND: 'END',\n\tHOME: 'HOME',\n\tNEXT_ITEM: 'NEXT_ITEM',\n\tNEXT_PAGE: 'NEXT_PAGE',\n\tPREV_ITEM: 'PREV_ITEM',\n\tPREV_PAGE: 'PREV_PAGE',\n\tSET_ACTIVE: 'SET_ACTIVE',\n\tSET_ACTIVE_ITEM: 'SET_ACTIVE_ITEM',\n\tSET_INTERACTING_WITH_ITEM: 'SET_INTERACTING_WITH_ITEM',\n\tSET_PAGE_SIZE: 'SET_PAGE_SIZE',\n\tSET_TOTAL: 'SET_TOTAL',\n};\n","import {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nexport type State = {\n\tdisabled: boolean;\n\tactiveIndex: number;\n\tactive: boolean;\n\tinteractingWithItem: boolean;\n\ttotal: number;\n\tpageSize: number;\n};\n\nexport const initialState: State = {\n\tdisabled: false,\n\tactiveIndex: 0,\n\tactive: false,\n\tinteractingWithItem: false,\n\tpageSize: 25,\n\ttotal: 0,\n};\n\nconst checkIndexLoop = (index: number, total: number) =>\n\tindex > total - 1 ? 0 : index < 0 ? total - 1 : index;\n\nconst keepInBounds = (index: number, total: number) =>\n\tMath.max(Math.min(index, total - 1), 0);\n\nexport const reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.DISABLE:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdisabled: true,\n\t\t\t};\n\t\tcase ACTIONS.ENABLE:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdisabled: false,\n\t\t\t};\n\t\tcase ACTIONS.END:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: keepInBounds(state.total - 1, state.total),\n\t\t\t};\n\t\tcase ACTIONS.HOME:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: 0,\n\t\t\t};\n\t\tcase ACTIONS.NEXT_ITEM:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: checkIndexLoop(state.activeIndex + 1, state.total),\n\t\t\t};\n\t\tcase ACTIONS.NEXT_PAGE:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: keepInBounds(\n\t\t\t\t\tstate.activeIndex + state.pageSize,\n\t\t\t\t\tstate.total,\n\t\t\t\t),\n\t\t\t};\n\t\tcase ACTIONS.PREV_ITEM:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: checkIndexLoop(state.activeIndex - 1, state.total),\n\t\t\t};\n\t\tcase ACTIONS.PREV_PAGE:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: keepInBounds(\n\t\t\t\t\tstate.activeIndex - state.pageSize,\n\t\t\t\t\tstate.total,\n\t\t\t\t),\n\t\t\t};\n\t\tcase ACTIONS.SET_ACTIVE:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactive: action.active,\n\t\t\t};\n\t\tcase ACTIONS.SET_ACTIVE_ITEM:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveIndex: keepInBounds(action.activeIndex, state.total),\n\t\t\t};\n\t\tcase ACTIONS.SET_INTERACTING_WITH_ITEM:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tinteractingWithItem: action.interactingWithItem,\n\t\t\t};\n\t\tcase ACTIONS.SET_TOTAL:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttotal: action.total,\n\t\t\t\tinteractingWithItem: false,\n\t\t\t\tactiveIndex: keepInBounds(state.activeIndex, action.total),\n\t\t\t};\n\t\tcase ACTIONS.SET_PAGE_SIZE:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tpageSize: action.pageSize || initialState.pageSize,\n\t\t\t};\n\t}\n};\n\nexport default reducer;\n","import React from 'react';\n\nimport {ACTIONS} from './constants';\nimport type {State} from './reducer';\n\nexport type Action =\n\t| {type: typeof ACTIONS.SET_ACTIVE_ITEM; activeIndex: State['activeIndex']}\n\t| {type: typeof ACTIONS.SET_ACTIVE; active: State['active']}\n\t| {type: typeof ACTIONS.DISABLE}\n\t| {type: typeof ACTIONS.ENABLE}\n\t| {type: typeof ACTIONS.END}\n\t| {type: typeof ACTIONS.HOME}\n\t| {type: typeof ACTIONS.NEXT_ITEM}\n\t| {type: typeof ACTIONS.NEXT_PAGE}\n\t| {type: typeof ACTIONS.PREV_ITEM}\n\t| {type: typeof ACTIONS.PREV_PAGE}\n\t| {type: typeof ACTIONS.SET_PAGE_SIZE; pageSize: State['pageSize']}\n\t| {type: typeof ACTIONS.SET_TOTAL; total: State['total']}\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_INTERACTING_WITH_ITEM;\n\t\t\tinteractingWithItem: State['interactingWithItem'];\n\t };\n\nexport const Actions = (dispatch: React.Dispatch) => ({\n\tdisable: () => dispatch({type: ACTIONS.DISABLE}),\n\tenable: () => dispatch({type: ACTIONS.ENABLE}),\n\tend: () => dispatch({type: ACTIONS.END}),\n\thome: () => dispatch({type: ACTIONS.HOME}),\n\tnextItem: () => dispatch({type: ACTIONS.NEXT_ITEM}),\n\tnextPage: () => dispatch({type: ACTIONS.NEXT_PAGE}),\n\tprevItem: () => dispatch({type: ACTIONS.PREV_ITEM}),\n\tprevPage: () => dispatch({type: ACTIONS.PREV_PAGE}),\n\n\tsetActive: (active: State['active']) =>\n\t\tdispatch({type: ACTIONS.SET_ACTIVE, active}),\n\tsetActiveIndex: (activeIndex: State['activeIndex']) =>\n\t\tdispatch({type: ACTIONS.SET_ACTIVE_ITEM, activeIndex}),\n\tsetInteractingWithItem: (interactingWithItem: State['interactingWithItem']) =>\n\t\tdispatch({type: ACTIONS.SET_INTERACTING_WITH_ITEM, interactingWithItem}),\n});\n\nexport default Actions;\n","import React, {\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseReducer,\n\tuseRef,\n} from 'react';\n\nimport reducer, {initialState} from './reducer';\nimport actions from './actions';\nimport {ACTIONS} from './constants';\nimport type {FixedSizeList, VariableSizeList} from 'react-window';\n\nimport useUpdateEffect from '@netx/core-components/hooks/useUpdateEffect';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\nimport useDocumentKeyDown from '@netx/core-components/hooks/useDocumentKeyDown';\n\nexport interface UseVirtualizedListArrowTabTrapParams {\n\tactiveDescendantLabel?: string;\n\taddedAtIndex?: number;\n\tpageSize?: number;\n\tvirtualListRef: React.RefObject;\n\ttotal: number;\n\talign?: 'auto' | 'smart' | 'center' | 'end' | 'start';\n\tdisableScrollToOnFocusCapture?: boolean;\n\n\tonItemKeyDown?: (\n\t\tevent: KeyboardEvent,\n\t\trowIndex: number,\n\t\tclick: boolean,\n\t) => void;\n}\n\nconst FOCUS_TRAP_NAVIGATION_KEYS = [\n\t'ArrowDown',\n\t'ArrowUp',\n\t'End',\n\t'Home',\n\t'PageDown',\n\t'PageUp',\n] as const;\n\nconst FOCUS_TRAP_NAVIGATION = {\n\tArrowDown: 'nextItem',\n\tArrowUp: 'prevItem',\n\tEnd: 'end',\n\tHome: 'home',\n\tPageDown: 'nextPage',\n\tPageUp: 'prevPage',\n} as const;\n\nexport const useVirtualizedListArrowTabTrap = ({\n\tactiveDescendantLabel = 'row',\n\taddedAtIndex = -1,\n\tpageSize = 25,\n\ttotal,\n\tvirtualListRef,\n\talign,\n\tdisableScrollToOnFocusCapture,\n\tonItemKeyDown,\n}: UseVirtualizedListArrowTabTrapParams) => {\n\tconst [state, dispatch] = useReducer(reducer, {\n\t\t...initialState,\n\t\tpageSize,\n\t\ttotal,\n\t});\n\n\tconst rootRef = useRef(null);\n\n\tconst activeIndexRef = useRef(state.activeIndex);\n\tactiveIndexRef.current = state.activeIndex;\n\n\tconst disabledRef = useRef(state.disabled);\n\tdisabledRef.current = state.disabled;\n\n\tconst activeRef = useRef(state.active);\n\tactiveRef.current = state.active;\n\n\tconst interactingWithItemRef = useRef(state.interactingWithItem);\n\tinteractingWithItemRef.current = state.interactingWithItem;\n\n\tconst focusedOnceRef = useRef(false);\n\n\tconst disableNextFocusCapture = useRef(false);\n\tconst disableNextScrollUpdate = useRef(false);\n\tconst disableNextIndexUpdate = useRef(false);\n\n\t// The reducer actions to expose to outside components\n\tconst dispatchActions = useMemo(() => actions(dispatch), []);\n\n\tconst activeDescendant =\n\t\t!state.disabled && state.activeIndex > -1\n\t\t\t? `${activeDescendantLabel}-${state.activeIndex.toString()}`\n\t\t\t: undefined;\n\n\t// TODO: we need to make this support \"classic paging\" - utlize page/pageSize/chunkSize\n\t// when available\n\tuseUpdateEffect(() => {\n\t\tdispatch({type: ACTIONS.SET_PAGE_SIZE, pageSize});\n\t}, [pageSize]);\n\n\tuseUpdateEffect(() => {\n\t\tdispatch({type: ACTIONS.SET_TOTAL, total});\n\t}, [total]);\n\n\tuseEffect(() => {\n\t\tif (!state.active) return;\n\t\tfocusedOnceRef.current = true;\n\t}, [state.active]);\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\tdisabledRef.current ||\n\t\t\t!virtualListRef?.current ||\n\t\t\t(virtualListRef.current.state as any).isScrolling\n\t\t)\n\t\t\treturn;\n\t\tvirtualListRef.current.scrollToItem(state.activeIndex, align);\n\t}, [state.activeIndex]);\n\n\t// Fix for table rows\n\tuseWhenChangedEffect(\n\t\t[state.activeIndex, total] as const,\n\t\tuseCallback(([activeIndex, total]) => {\n\t\t\tconst shouldFocus = !disableNextIndexUpdate.current;\n\t\t\tdisableNextIndexUpdate.current = false;\n\t\t\tif (\n\t\t\t\t!activeRef.current ||\n\t\t\t\tdisabledRef.current ||\n\t\t\t\t!rootRef.current ||\n\t\t\t\tactiveIndex < 0\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tconst row = rootRef.current.querySelector(\n\t\t\t\t`[aria-rowindex=\"${activeIndex}\"]`,\n\t\t\t);\n\t\t\t// force blur on any active elements\n\t\t\t// testing for and using `document.activeElement.focus()` does not\n\t\t\t// acheive what we want (and may be a shortcoming of some deeper logic\n\t\t\t// in the \"focus trap\")\n\t\t\tif (row && shouldFocus) {\n\t\t\t\t(row as HTMLElement).click();\n\t\t\t\trootRef.current?.focus({\n\t\t\t\t\tpreventScroll: true,\n\t\t\t\t});\n\t\t\t}\n\t\t}, []),\n\t);\n\n\tuseDocumentKeyDown(\n\t\tuseCallback(\n\t\t\t(event) => {\n\t\t\t\tif (activeIndexRef.current > -1) {\n\t\t\t\t\tonItemKeyDown?.(\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tactiveIndexRef.current,\n\t\t\t\t\t\t[' ', 'Enter'].includes(event.key as any),\n\t\t\t\t\t);\n\t\t\t\t\tif (event.defaultPrevented) return;\n\t\t\t\t}\n\n\t\t\t\tif (!FOCUS_TRAP_NAVIGATION_KEYS.includes(event.key as any)) return;\n\n\t\t\t\tdisableNextScrollUpdate.current = true;\n\t\t\t\tdispatchActions[FOCUS_TRAP_NAVIGATION[event.key]]();\n\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\t[onItemKeyDown],\n\t\t),\n\t\t{\n\t\t\tdisabled: state.disabled || !state.active || state.interactingWithItem,\n\t\t},\n\t);\n\n\tconst onBlur = useCallback((event: React.FocusEvent) => {\n\t\tif (event.currentTarget.contains(event.relatedTarget as Node)) return;\n\t\tdispatchActions.setActive(false);\n\t}, []);\n\n\tconst onFocusCapture = useCallback(\n\t\t(event: React.FocusEvent) => {\n\t\t\tdispatchActions.setActive(true);\n\n\t\t\tif (disableNextFocusCapture.current) {\n\t\t\t\tdisableNextFocusCapture.current = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tdisabledRef.current ||\n\t\t\t\tdisableScrollToOnFocusCapture ||\n\t\t\t\t!virtualListRef.current\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tif (\n\t\t\t\t!(virtualListRef.current.state as any).isScrolling &&\n\t\t\t\t!activeRef.current &&\n\t\t\t\tevent.target === rootRef.current\n\t\t\t) {\n\t\t\t\tvirtualListRef.current.scrollToItem(activeIndexRef.current);\n\t\t\t}\n\t\t},\n\t\t[disableScrollToOnFocusCapture],\n\t);\n\n\tconst onItemClick = useCallback((index: number) => {\n\t\tdispatchActions.setActive(true);\n\t\tif (activeIndexRef.current !== index) {\n\t\t\tdispatchActions.setActiveIndex(index);\n\t\t}\n\t\trootRef.current?.focus({\n\t\t\tpreventScroll: true,\n\t\t});\n\t}, []);\n\n\tconst onItemInteracting = useCallback(\n\t\t(index: number, interacting: boolean) => {\n\t\t\tdispatchActions.setInteractingWithItem(interacting);\n\t\t\t// Get \"focus\" back on the `activeIndex`\n\t\t\tif (activeIndexRef.current === index && !interacting) {\n\t\t\t\tonItemClick(index);\n\t\t\t}\n\t\t},\n\t\t[onItemClick],\n\t);\n\n\tuseWhenChangedEffect(\n\t\taddedAtIndex,\n\t\tuseCallback(\n\t\t\t(addedAtIndex) => {\n\t\t\t\tif (addedAtIndex < 0) return;\n\t\t\t\tdisableNextFocusCapture.current = true;\n\t\t\t\tdisableNextScrollUpdate.current = true;\n\t\t\t\tonItemClick(addedAtIndex);\n\t\t\t},\n\t\t\t[onItemClick],\n\t\t),\n\t);\n\n\tconst onScrollIndexUpdate = useCallback(\n\t\t(index: number, page: number, visibleStopIndex: number) => {\n\t\t\tif (!disableNextScrollUpdate.current || !activeRef.current) {\n\t\t\t\tdisableNextIndexUpdate.current = !activeRef.current;\n\t\t\t\tdispatchActions.setActiveIndex(index);\n\t\t\t\tdispatchActions.setInteractingWithItem(false);\n\t\t\t}\n\t\t\tdisableNextScrollUpdate.current = false;\n\t\t},\n\t\t[],\n\t);\n\n\treturn {\n\t\tstate,\n\t\tactions: dispatchActions,\n\t\tvirtualListRef,\n\n\t\tactiveDescendant,\n\t\tonBlur,\n\t\tonFocusCapture,\n\t\tonItemClick,\n\t\tonItemInteracting,\n\t\tonScrollIndexUpdate,\n\t\trootRef,\n\t};\n};\n\nexport default useVirtualizedListArrowTabTrap;\n","/**\n * @module core/functionality/select2\n */\n\nconst NAME = 'select2';\n\nimport {\n\tdetectAutocomplete,\n\tgetCompletion,\n\tinquiry,\n} from '@netx/core/lib/netx-autocomplete';\n\nimport Select2 from 'select2/dist/js/select2.full';\nimport ArrayData from 'select2/src/js/select2/data/array';\nimport MinimumInputLength from 'select2/src/js/select2/data/minimumInputLength';\nimport Tags from 'select2/src/js/select2/data/tags';\nimport Dropdown from 'select2/src/js/select2/dropdown';\nimport AttachBody from 'select2/src/js/select2/dropdown/attachBody';\nimport AttachContainer from 'select2/src/js/select2/dropdown/attachContainer';\nimport CloseOnSelect from 'select2/src/js/select2/dropdown/closeOnSelect';\nimport DropdownSearch from 'select2/src/js/select2/dropdown/search';\nimport 'select2/dist/js/i18n/de';\nimport 'select2/dist/js/i18n/es';\nimport 'select2/dist/js/i18n/fr';\nimport 'select2/dist/js/i18n/ja';\nimport 'select2/dist/js/i18n/ko';\nimport 'select2/dist/js/i18n/nl';\nimport 'select2/dist/js/i18n/zh-CN';\n\nimport Utils from 'select2/src/js/select2/utils';\n\nexport const supports = [\n\t'asset',\n\t'assets',\n\t'attributeHistory',\n\t'attributeProfile',\n\t'cart',\n\t'category',\n\t'categoryName',\n\t'domain',\n\t'group',\n\t'metadataLookup',\n\t'page',\n\t'savedCart',\n\t'savedSearch',\n\t'search',\n\t'semanticObjects',\n\t'semanticObjectTypes',\n\t'sharedResource',\n\t'tag',\n\t'user',\n\t'users',\n\t'user/group', // TODO: rename userOrGroup\n\t'userOrGroup',\n\t'vocabulary',\n\t'vocabularyValue',\n];\n\n/**\n * @method\n * @param {array} results Query results\n * @return {array} Parsed query results\n */\nconst LVBHandler = function (results) {\n\t// Sort\n\tresults = _.sortBy(results, (v) => v.label);\n\treturn _.map(results, (r) => {\n\t\treturn {id: r.value, text: r.label};\n\t});\n};\n\n/**\n * {Id/Name} handler\n * @method\n * @param {array} results Query results\n * @return {array} Parsed query results\n */\nconst INBHandler = function (results) {\n\t// Sort\n\tresults = _.sortBy(results, (v) => v.name);\n\treturn _.map(results, (r) => {\n\t\treturn {id: r.id, text: r.name};\n\t});\n};\n\n/**\n * @method\n * @param {array} results Query results\n * @return {array} Parsed query results\n */\nconst stringHandler = function (results) {\n\treturn _.map(results, (r) => {\n\t\treturn {\n\t\t\tid: !_.isUndefined(r.label) ? r.label : r,\n\t\t\ttext: !_.isUndefined(r.label) ? r.label : r,\n\t\t};\n\t});\n};\n\nconst AttachBodyProto = AttachBody.prototype;\n// DAM-15580\n// Select2 is not calculating the window bounds correctly\nAttachBodyProto._positionDropdown = _.wrap(\n\tAttachBodyProto._positionDropdown,\n\tfunction (_positionDropdown) {\n\t\t_positionDropdown.call(this);\n\n\t\tvar $dropdown = this.$dropdown;\n\t\t// This only seems to affect dropdown\n\t\tif ($dropdown.hasClass('select2-dropdown--above')) {\n\t\t\tvar $container = this.$container;\n\t\t\tvar $dropdownContainer = this.$dropdownContainer;\n\t\t\t// Fix for not completely hiding the input (so you can still see the bottom border)\n\t\t\tvar top =\n\t\t\t\t$container.offset().top +\n\t\t\t\t$container.height() -\n\t\t\t\t$dropdownContainer.height() -\n\t\t\t\t2;\n\t\t\t$dropdownContainer.css('top', top);\n\t\t\treturn;\n\t\t}\n\n\t\tconst offset = $dropdown.offset();\n\t\tconst height = $dropdown.height();\n\t\tconst maxY = window.innerHeight;\n\n\t\tif (offset.top + height > maxY) {\n\t\t\t$dropdown\n\t\t\t\t.removeClass('select2-dropdown--below')\n\t\t\t\t.addClass('select2-dropdown--above');\n\t\t\t// Re-position\n\t\t\tthis._positionDropdown();\n\t\t}\n\t},\n);\n\n/**\n * @method\n * @param {string} completion Completion type (category, asset, user, etc)\n * @param {object} extra Extra data to return with results\n * @param {object} opts Options to pass along (has the plugin name)\n * @param {Netx.View} view View that contains the autocomplete\n *\n * @return {object} Autocomplete plugin\n */\nexport const getOptions = function (completion, extra, opts, view) {\n\t// You could call it whatever you want - \"CustomAdapter\" is not a required name\n\tfunction CustomAdapter($element, options) {\n\t\tthis.$element = $element;\n\t\tthis.options = options;\n\t\t// Super\n\t\tCustomAdapter.__super__.constructor.call(this, $element, options);\n\t}\n\t// Always extend after making the constructor\n\tUtils.Extend(CustomAdapter, ArrayData);\n\n\t///////////////////////////\n\t// QUERY\n\t///////////////////////////\n\topts = getCompletion({\n\t\tcompletion,\n\t\textra,\n\t\tINBHandler,\n\t\tLVBHandler,\n\t\tstringHandler,\n\t\t...opts,\n\t});\n\n\t// TODO: Carve outs like this should not be necessary - we should make the server return the data we want in 1 call\n\tif (opts.completion === 'userOrGroup') {\n\t\tCustomAdapter.prototype.query = function (params, callback) {\n\t\t\treturn $.when(\n\t\t\t\tinquiry('user', params.term, null, opts, view),\n\t\t\t\tinquiry('group', params.term, null, opts, view),\n\t\t\t).then(function (user, group) {\n\t\t\t\t// label\n\t\t\t\tconst users = _.map(user, (u) => {\n\t\t\t\t\treturn _.extend(u, {\n\t\t\t\t\t\ttype: 'user',\n\t\t\t\t\t\ttext: i18n.t('i18n.user') + ': ' + u.text,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tconst groups = _.map(group, (g) => {\n\t\t\t\t\treturn _.extend(g, {\n\t\t\t\t\t\ttype: 'group',\n\t\t\t\t\t\ttext: i18n.t('i18n.group') + ': ' + g.text,\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\t// TODO: smuggle user/group type onto that object & get it to the page.\n\t\t\t\t// Select2 docs are unhelpful - going through the code it looks like there is no valuable callback events we can pass at init\n\t\t\t\t// So the event we need needs to be listened to directly on the input\n\t\t\t\t// So, we basically need to go over our autocomplete type switch case after we init\n\t\t\t\t// Could get messy. -jse-\n\n\t\t\t\t// sort\n\t\t\t\tlet results = _.sortBy(users.concat(groups), function (d) {\n\t\t\t\t\treturn d.text.split(/: /)[1].toLowerCase();\n\t\t\t\t});\n\n\t\t\t\t// // Give the view a chance to filter\n\t\t\t\t// if( view && _.isFunction( view.filterAutocompleteResults ) ) {\n\t\t\t\t// \tresults = view.filterAutocompleteResults( results );\n\t\t\t\t// }\n\n\t\t\t\treturn callback({results: results});\n\t\t\t});\n\t\t};\n\t}\n\t// Standard [ the way it should just be ]\n\telse {\n\t\tCustomAdapter.prototype.query = function (params, callback) {\n\t\t\treturn inquiry(\n\t\t\t\topts.completion,\n\t\t\t\tparams.term,\n\t\t\t\topts.extra,\n\t\t\t\t_.omit(opts, 'completion', 'extra'),\n\t\t\t\tview,\n\t\t\t).then(function (results) {\n\t\t\t\treturn callback({results: results});\n\t\t\t});\n\t\t};\n\t}\n\t///////////////////////////\n\t// !QUERY\n\t///////////////////////////\n\n\t///////////////////////////\n\t// DECORATORS\n\t///////////////////////////\n\t// Select2 does not apply decorators to custom data adpaters as to not risk double decoration\n\t// Data Adapter\n\t// Decorate after the adapter is built\n\tlet DataAdapter = Utils.Decorate(CustomAdapter, MinimumInputLength);\n\t// If we are supporting tags (not to be confused with attribute tags - this is custom input \"flexible\")\n\tif (opts.flexible) {\n\t\tDataAdapter = Utils.Decorate(DataAdapter, Tags);\n\t}\n\n\tif (!opts.multiple && !opts.dropdownAdapter) {\n\t\t// If not multiple selection then we want a dropdown search\n\t\t// Dropdown Adapter\n\t\t// This is the only real bitch about it all- in order to support container and force a dropdown we must recreate\n\t\t// the dropdown adapater in its entirety\n\t\t// Force dropdown (never up)\n\t\tlet DropdownAdapter = Utils.Decorate(\n\t\t\tDropdown,\n\t\t\t// You get two options: the container or the body - we default to container\n\t\t\topts.container == 'body' ? AttachBody : AttachContainer,\n\t\t);\n\n\t\tDropdownAdapter = Utils.Decorate(DropdownAdapter, DropdownSearch);\n\n\t\t// We could always move this to the !opts.multiple if we want to keep it open for tags\n\t\tDropdownAdapter = Utils.Decorate(DropdownAdapter, CloseOnSelect);\n\n\t\topts.dropdownAdapter = DropdownAdapter;\n\t}\n\t///////////////////////////\n\t// !DECORATORS\n\t///////////////////////////\n\n\treturn {\n\t\t// These are different than the options you would nest in the plugin\n\t\t// object above - anything placed above is the global config for that plugin\n\t\t// These options are per instance\n\t\tdataAdapter: DataAdapter,\n\t\tminimumInputLength: opts['minimum-length'] || 1,\n\t\tallowClear: opts['allow-clear'] !== 'false',\n\t\tautocompleteSearchable: opts.autocompleteSearchable || false,\n\t\tplaceholder: opts.placeholder || '',\n\t\tselectOnClose: opts.selectOnClose !== false,\n\t\tselectionAdapter: opts.selectionAdapter,\n\t\tdropdownAdapter: opts.dropdownAdapter,\n\t\tresultsAdapter: opts.resultsAdapter,\n\t\tlanguage: opts.language || i18n.lnaguage,\n\t};\n};\n\nexport const Props = {\n\t/** @method */\n\tcleanUpSelect2() {\n\t\tthis.Plugins.Destroy('select2');\n\t},\n\n\t/**\n\t * This is meant to be overriden\n\t * In your view you can filter out results from an autocomplete depending on your needs\n\t * YOU MUST RETURN THE RESULTS OBJECT OR YOU WILL NOT GET ANY AUTOCOMPLETE SUGGESTIONS\n\t * @param {object} results Autocomplete results object\n\t * @return {object} Filtered autocomplete results\n\t */\n\tfilterAutocompleteResults(results) {\n\t\tif (Array.isArray(results)) {\n\t\t\tresults = results.filter(\n\t\t\t\t(result) =>\n\t\t\t\t\ttypeof result === 'string' ||\n\t\t\t\t\tresult?.text !== '... and more; please add more criteria.',\n\t\t\t);\n\t\t}\n\t\treturn results;\n\t},\n\n\t/**\n\t * @method\n\t */\n\t_prepareSelect2(el, type, opts) {\n\t\t// Get our object\n\t\t// Pass it the completion type, any additional options and this view\n\t\tconst autocomplete = getOptions(type, null, opts, this);\n\t\t// Got it\n\t\tif (autocomplete && el) {\n\t\t\tthis.Plugins && this.Plugins.Initialize('select2', el, autocomplete);\n\t\t} else if (el) {\n\t\t\t// Warn/error?\n\t\t\tconsole.warn(`${opts.plugin} autocomplete plugin could not be loaded`);\n\t\t}\n\n\t\t// avoid autocompleting twice.\n\t\tel && el.setAttribute('data-autocomplete-added', 'true');\n\n\t\treturn autocomplete;\n\t},\n\n\t/**\n\t * @method\n\t */\n\tprepareSelect2() {\n\t\tconst els = detectAutocomplete(this.el, 's2');\n\t\tels.map((el) => {\n\t\t\tconst opts = {};\n\t\t\t// The canonical list of supported data-autocomplete options:\n\t\t\t_.each(\n\t\t\t\t[\n\t\t\t\t\t'allow-clear',\n\t\t\t\t\t'container',\n\t\t\t\t\t'template-id',\n\t\t\t\t\t'dataset-id',\n\t\t\t\t\t'flexible',\n\t\t\t\t\t'minimum-length',\n\t\t\t\t\t'plugin',\n\t\t\t\t\t'placeholder',\n\t\t\t\t\t'resource-name',\n\t\t\t\t\t'semantic-object-type-id',\n\t\t\t\t\t'permission',\n\t\t\t\t\t'permission-matrix-level',\n\t\t\t\t\t'vocabulary-id',\n\t\t\t\t],\n\t\t\t\t(opt) => {\n\t\t\t\t\t// jQuery.data() camelcases data-* names, as spec'd in the dataset API: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset\n\t\t\t\t\topts[opt] = el.getAttribute(`data-autocomplete-${opt}`);\n\t\t\t\t\tif (opt === 'permission-matrix-level')\n\t\t\t\t\t\topts[opt] = parseInt(opts[opt]);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\topts.flexible = opts.flexible === 'true';\n\n\t\t\tconst type = el.getAttribute('data-autocomplete');\n\n\t\t\t// This is helpful for various reasons - your plugin can decide how to interpet it\n\t\t\tif (el.getAttribute('multiple')) opts.multiple = true;\n\n\t\t\t// Allow the autocomplete plugin to take into consideration where you would like it to live\n\t\t\t// In s2 it defaults to the container initialized in or the body (you cannot define a random selector)\n\t\t\t// But who knows what other plugins might support- so this is a helper attribute more than anything\n\t\t\topts.container = el.getAttribute('data-nx-autocomplete-container');\n\n\t\t\tthis._prepareSelect2(el, type, opts);\n\t\t});\n\t},\n};\n\nexport default function (target) {\n\tif (!target || target.hasFunctionality(NAME)) return target;\n\n\ttarget.extendFunctionality(Props);\n\n\ttarget.addInitializer((instance, opts = {}) => {\n\t\tinstance.Plugins.Register({\n\t\t\tselect2: {\n\t\t\t\tname: 'select2',\n\t\t\t\tmultiple: true,\n\t\t\t\tdestroyMethod(instance) {\n\t\t\t\t\tinstance.destroy();\n\t\t\t\t},\n\t\t\t\tinitializeMethod(pluginObj, $pluginEl, initOpts, cb) {\n\t\t\t\t\t// Return instance to callback\n\t\t\t\t\tcb(\n\t\t\t\t\t\tnew (initOpts.select2 ? initOpts.select2 : Select2)($pluginEl, {\n\t\t\t\t\t\t\t...pluginObj.options,\n\t\t\t\t\t\t\t..._.omit(initOpts, 'select2'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tinstance\n\t\t\t.on('preRenderHook', instance.cleanUpSelect2)\n\t\t\t.on('postRenderHook', instance.prepareSelect2)\n\t\t\t.on('removeHook', instance.cleanUpSelect2);\n\t}, NAME);\n\n\treturn target;\n}\n\n// For grid editor until I can sit down and go thorugh their newest version\n// and actually import the stuff needed when building hypergrid\nconst Netx = (window.Netx = window.Netx || {});\nNetx.getSelect2Options = Props._prepareSelect2;\n","//import './css/select2.less';\n\nimport {Props} from '@netx/core/functionality/select2';\n\nimport AllowClear from 'select2/src/js/select2/selection/allowClear';\nimport AttachBody from 'select2/src/js/select2/dropdown/attachBody';\nimport EventRelay from 'select2/src/js/select2/selection/eventRelay';\nimport HidePlaceholder from 'select2/src/js/select2/dropdown/hidePlaceholder';\nimport Placeholder from 'select2/src/js/select2/selection/placeholder';\nimport Results from 'select2/src/js/select2/results';\nimport SelectOnClose from 'select2/src/js/select2/dropdown/selectOnClose';\nimport SelectionSearch from 'select2/src/js/select2/selection/search';\nimport SingleSelection from 'select2/src/js/select2/selection/single';\nimport Utils from 'select2/src/js/select2/utils';\n\nimport Select2Chips from 'theme-libs/select2/select2chips';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {faCaretDown} from '@fortawesome/pro-solid-svg-icons';\n\nconst icons = {\n\tfaCaretDown: icon(faCaretDown).html,\n};\n\n// Make our single selection look like our selectpickers... which look like material design\nSingleSelection.prototype.render = _.wrap(\n\tSingleSelection.prototype.render,\n\tfunction (render) {\n\t\tconst $selection = render.apply(this);\n\t\t$selection.addClass('dropdown-toggle');\n\t\tconst $caret = $selection.find('.select2-selection__arrow');\n\t\t$caret.addClass('bs-caret').html(icons.faCaretDown);\n\n\t\t$selection\n\t\t\t.on('focus', function (e) {\n\t\t\t\t$selection.closest('.mdc-select').addClass('mdc-select--focused');\n\t\t\t})\n\t\t\t.on('blur', function (e) {\n\t\t\t\t$selection.closest('.mdc-select').removeClass('mdc-select--focused');\n\t\t\t});\n\n\t\treturn $selection;\n\t},\n);\nSingleSelection.prototype.destroy = _.wrap(\n\tSingleSelection.prototype.destroy,\n\tfunction (destroy) {\n\t\tthis.$selection.off();\n\t\tdestroy.apply(this);\n\t},\n);\n\nResults.prototype.render = function () {\n\tconst $results = $(\n\t\t'
    ',\n\t);\n\n\tif (this.options.get('multiple')) {\n\t\t$results.attr('aria-multiselectable', 'true');\n\t}\n\n\tthis.$results = $results;\n\treturn $results;\n};\n\nResults.prototype.option = _.wrap(Results.prototype.option, function (\n\toption,\n\tdata,\n) {\n\tconst _option = option.call(this, data);\n\t_option.classList.add('mdc-list-item');\n\treturn _option;\n});\n\nProps._prepareSelect2 = _.wrap(Props._prepareSelect2, function (\n\t_prepareSelect2,\n\tel,\n\ttype,\n\topts,\n) {\n\topts.multiple = opts.multiple || el.getAttribute('multiple') ? true : false;\n\topts.allowClear =\n\t\topts.allowClear ||\n\t\t(el && el.getAttribute('data-autocomplete-allow-clear') !== 'false');\n\n\tlet otherOpts = {};\n\n\tlet ResultsAdapter = Results;\n\tif (opts.placeholder != null) {\n\t\tResultsAdapter = Utils.Decorate(ResultsAdapter, HidePlaceholder);\n\t}\n\tif (opts.selectOnClose) {\n\t\tResultsAdapter = Utils.Decorate(ResultsAdapter, SelectOnClose);\n\t}\n\n\totherOpts.resultsAdapter = ResultsAdapter;\n\n\tif (!opts.multiple) {\n\t\t// Since we modified the selection adapter we need to decorate it as select2 would have by default\n\t\tlet SelectionAdapter = SingleSelection;\n\t\t// Add the placeholder mixin if a placeholder was specified\n\t\tif (opts.placeholder != null) {\n\t\t\tSelectionAdapter = Utils.Decorate(SelectionAdapter, Placeholder);\n\t\t}\n\n\t\tif (opts.allowClear) {\n\t\t\tSelectionAdapter = Utils.Decorate(SelectionAdapter, AllowClear);\n\t\t}\n\n\t\tSelectionAdapter = Utils.Decorate(SelectionAdapter, EventRelay);\n\t\totherOpts.selectionAdapter = SelectionAdapter;\n\t} else {\n\t\totherOpts = {...otherOpts, ...Select2Chips(opts)};\n\t}\n\n\treturn _prepareSelect2.call(this, el, type, {\n\t\t...otherOpts,\n\t\t...opts,\n\t});\n});\n\nexport {default} from '@netx/core/functionality/select2';\n","import React from 'react';\n\nimport {Avatar, AvatarProps} from '@mui/material';\n\nimport {\n\tstyled,\n\tstrToHslColor,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\n\nconst AvatarRoot = styled(Avatar)({\n\tpaddingTop: 2,\n});\n\nexport type ColoredAvatarProps = Omit<\n\tWithMuiPropOverrides,\n\t'children'\n> & {\n\tlabel: string;\n\tloading?: boolean;\n};\n\nexport const ColoredAvatar = ({\n\tlabel,\n\tloading,\n\t...props\n}: ColoredAvatarProps) => {\n\treturn (\n\t\t\n\t\t\t{loading ? '' : label.charAt(0).toLocaleUpperCase()}\n\t\t\n\t);\n};\n\nexport default ColoredAvatar;\n","import React from 'react';\n\nimport {\n\tFormType,\n\tFormOptions,\n\tFormValues,\n\tInputForm,\n\tgetInputFormObject,\n\tuseForm,\n} from './';\n\nexport type WithFormProps<\n\tT extends object = {},\n\tTValues extends FormValues = FormValues\n> = WithFormPropsIn & WithFormPropsOut;\n\nexport type WithFormPropsIn<\n\tT extends object = {},\n\tTValues extends FormValues = FormValues\n> = T & {\n\tformOptions?: FormOptions;\n\trefreshAt?: number;\n\tvalues?: TValues;\n};\n\nexport type WithFormPropsOut<\n\tT extends object = {},\n\tTValues extends FormValues = FormValues\n> = Omit & {\n\tform: FormType;\n\tinputForm: InputForm;\n};\n\nexport interface WithFormOptions\n\textends FormOptions {}\n\n/** Wrap component with form support */\nexport default function withForm<\n\tP extends {},\n\tTValues extends FormValues = FormValues,\n\tOptions extends WithFormOptions = {}\n>(\n\tComponent: React.ComponentType

    ,\n\toptions?: Options,\n): React.FunctionComponent {\n\treturn ({formOptions, refreshAt, values, ...props}) => {\n\t\tconst form: FormType = useForm(\n\t\t\tvalues as TValues,\n\t\t\t{\n\t\t\t\t...options,\n\t\t\t\t...formOptions,\n\t\t\t} as FormOptions,\n\t\t);\n\t\tconst inputForm = getInputFormObject(form);\n\n\t\treturn (\n\t\t\t\n\t\t);\n\t};\n}\n","import {useEffect, useRef} from 'react';\n\nexport type UseDocumentKeyDownOptions = {\n\tdisabled?: boolean;\n};\n\nexport const USE_DOCUMENT_KEY_DOWN_DEFAULTS = {\n\tdisabled: false,\n};\n\nexport const useDocumentKeyDown = (\n\tcb: (event: KeyboardEvent) => boolean | void,\n\t{disabled}: UseDocumentKeyDownOptions = USE_DOCUMENT_KEY_DOWN_DEFAULTS,\n) => {\n\tconst cbRef = useRef(cb);\n\tuseEffect(() => {\n\t\tcbRef.current = cb;\n\t});\n\n\tuseEffect(() => {\n\t\tif (disabled) return;\n\n\t\tconst onKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (cbRef.current(event) === false) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('keydown', onKeyDown, {capture: true});\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keydown', onKeyDown, {capture: true});\n\t\t};\n\t}, [disabled]);\n};\n\nexport default useDocumentKeyDown;\n","import {\n\tfaArchive,\n\tfaArrowCircleDown,\n\tfaBook,\n\tfaCalendar,\n\tfaClipboardList,\n\tfaClone,\n\tfaCube,\n\tfaEye,\n\tfaFileExport,\n\tfaFilePdf,\n\tfaInboxIn,\n\tfaList,\n\tfaRecycle,\n\tfaSearch,\n\tfaShare,\n\tfaTimes,\n\tfaTrashAlt,\n\tfaUndoAlt,\n} from '@fortawesome/pro-solid-svg-icons';\n\nexport const CART_CURRENT_ACTION_ICON = {\n\tCATEGORIZE: faBook,\n\tCREATE_PDF: faFilePdf,\n\tCREATE_TMS_OBJECT_PACKAGE: faCube,\n\tDELETE: faTrashAlt,\n\tDOWNLOAD: faArrowCircleDown,\n\tDOWNLOAD_METADATA: faFileExport,\n\tEDIT_ATTRIBUTES: faList,\n\tEMPTY: faTimes,\n\tFIND_REPLACE: faSearch,\n\tMANAGE_ARCHIVE: faArchive,\n\tMANAGE_EXPIRATION: faCalendar,\n\tMENU: faShare,\n\tRELATIONSHIPS: faClone,\n\tREPURPOSE: faRecycle,\n\tRESYNC: faUndoAlt,\n\tREVIEW: faClipboardList,\n\tSAVE: faInboxIn,\n\tVISIBILITY: faEye,\n};\n\nexport type CartCurrentBaseEvent = typeof CART_CURRENT_BASE_EVENT;\n\nexport const CART_CURRENT_BASE_EVENT = `cart:current`;\n\nexport const CART_CURRENT_EVENT = {\n\tCATEGORIZE: `${CART_CURRENT_BASE_EVENT}:categorize`,\n\tCREATE_PDF: `${CART_CURRENT_BASE_EVENT}:createPDF`,\n\tCREATE_TMS_OBJECT_PACKAGE: `${CART_CURRENT_BASE_EVENT}:create:tmsObjectPackage`,\n\tDELETE: `${CART_CURRENT_BASE_EVENT}:delete:assets`,\n\tDOWNLOAD: `${CART_CURRENT_BASE_EVENT}:download`,\n\tDOWNLOAD_METADATA: `${CART_CURRENT_BASE_EVENT}:downloadMetadata`,\n\tEMPTY: `${CART_CURRENT_BASE_EVENT}:empty`,\n\tEDIT_ATTRIBUTES: `${CART_CURRENT_BASE_EVENT}:edit:attributes`,\n\tFIND_REPLACE: `${CART_CURRENT_BASE_EVENT}:findReplace`,\n\tMANAGE_ARCHIVE: `${CART_CURRENT_BASE_EVENT}:manage:archive`,\n\tMANAGE_EXPIRATION: `${CART_CURRENT_BASE_EVENT}:manage:expiration`,\n\tMENU: `${CART_CURRENT_BASE_EVENT}:menu`,\n\tRELATIONSHIPS: `${CART_CURRENT_BASE_EVENT}:relationships`,\n\tREPURPOSE: `${CART_CURRENT_BASE_EVENT}:repurpose`,\n\tRESYNC: `${CART_CURRENT_BASE_EVENT}:resync`,\n\tREVIEW: `${CART_CURRENT_BASE_EVENT}:review`,\n\tSAVE: `${CART_CURRENT_BASE_EVENT}:save`,\n\tVISIBILITY: `${CART_CURRENT_BASE_EVENT}:visibility`,\n};\n","export * from './api';\nexport * from './components';\nexport * from './containers';\nexport * from './types';\n\nexport * from './contexts';\nexport {default as AttributeSetProvider} from './contexts/AttributeSetContext';\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\nimport {Avatar} from '@mui/material';\nimport {styled} from '@netx/core-components/Theme';\nimport Chip, {ChipProps} from '../Chip';\n\nexport type ChipElement = HTMLDivElement;\nexport type CountChipRef = React.ForwardedRef;\n\nconst CountChipRoot = styled(Chip)(({theme}) => ({\n\tflex: '0 0 auto',\n}));\n\nexport interface CountChipProps extends Partial> {\n\tcount?: number;\n\thideAvatar?: boolean;\n\tref?: React.Ref;\n\tonClear?: () => void;\n}\n\nexport const CountChipPrimitive = React.forwardRef(\n\t(\n\t\t{count, disabled, hideAvatar, label, loading = false, onClear, ...props},\n\t\tref,\n\t) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t\t\t\t{loading || count == null ? '-' : count > 99 ? '99+' : count}\n\t\t\t\t\t\t\n\t\t\t\t\t) : undefined\n\t\t\t\t}\n\t\t\t\t{...props}\n\t\t\t\tdisabled={disabled || loading}\n\t\t\t\tlabel={label != null ? label : i18n.t('i18n.selected')}\n\t\t\t\tonDelete={!loading && !!count ? onClear : undefined}\n\t\t\t/>\n\t\t);\n\t},\n) as React.ForwardRefExoticComponent;\n\nexport const CountChip = CountChipPrimitive;\n\nexport default CountChip;\n","import React from 'react';\n\nimport {styled, WithMuiPropOverrides} from '@netx/core-components/Theme';\n\nimport {\n\tAlert as MuiAlert,\n\tAlertProps as MuiAlertProps,\n\talertClasses,\n} from '@mui/material';\n\nconst AlertRoot = styled(MuiAlert)(({theme}) => ({\n\tdisplay: 'flex',\n\talignItems: 'center',\n\t[`& .${alertClasses.action}`]: {\n\t\tpadding: theme.spacing(0, 0, 0, 2),\n\t},\n}));\n\nexport interface AlertProps extends WithMuiPropOverrides {}\n\nexport const Alert = React.forwardRef(\n\t(props: AlertProps, ref) => {\n\t\treturn ;\n\t},\n);\n\nexport default Alert;\n","import base from './base';\nimport {dateToHTML} from '@netx/core/utils';\n\ntype Value = number | string | Array;\n\nexport const date = (value?: Value) => {\n\tvalue = base(value);\n\tif (value == null) return value;\n\tif (Array.isArray(value)) {\n\t\tvalue = value.map((v) => {\n\t\t\tif (v.toString().includes('/') || Number.isInteger(v)) v = dateToHTML(v);\n\t\t\treturn v;\n\t\t});\n\t} else if (Number.isInteger(value) || value.toString().includes('/')) {\n\t\tvalue = dateToHTML(value);\n\t}\n\n\treturn value;\n};\n\nexport default date;\n","export const SearchTypeFileAspect = 22 as const;\nexport type TSearchTypeFileAspect = typeof SearchTypeFileAspect;\n\n/** elementSubType1 */\nexport enum FileAspectType {\n\tORIENTATION = 0,\n\t/** seconds */\n\tDURATION = 1,\n\tWIDTH = 2,\n\tHEIGHT = 3,\n}\n\n/** elementSubType2 */\nexport enum FileAspectSubType {\n\tAPPROXIMATELY = 0,\n\tGREATER_THAN = 1,\n\tLESS_THAN = 2,\n\tEQUAL_TO = 3,\n}\n\n/** elementValue1 if `ORIENTATION` */\nexport enum FileAspectOrientationValue {\n\tPORTRAIT = 1,\n\tLANDSCAPE = 2,\n}\n","import React, {useEffect, useRef, useCallback} from 'react';\nimport clsx from 'clsx';\nimport _ from 'underscore';\n\nimport type {ArgumentsType} from '@netx/core/typings';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {\n\tdragResizeClasses,\n\tgetDragResizeUtilityClass,\n\tDragResizeClasses,\n\tDRAG_RESIZE_CLASS_NAME,\n} from './dragResizeClasses';\nimport {DragResizeDirection} from './constants';\nimport {dragResizeHandleClasses} from './dragResizeHandleClasses';\nimport {DragResizeHandle} from './DragResizeHandle';\nimport {useDragResize} from './useDragResize';\n\ntype Ref = React.LegacyRef;\n\ntype DragResizeUtiltiyClassProps = WithClasses<\n\tDragResizeClasses,\n\t{\n\t\tdragging?: boolean;\n\t\tdirection: DragResizeDirection;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: DragResizeUtiltiyClassProps) => {\n\tconst {classes, direction, dragging} = ownerState;\n\tconst slots = {\n\t\troot: ['root', direction, dragging && 'dragging'],\n\t\tcontent: ['content'],\n\t\tsentinel: ['sentinel', direction],\n\t};\n\treturn composeClasses(slots, getDragResizeUtilityClass, classes);\n};\n\nconst DragResizeRoot = styled('div', {\n\tname: DRAG_RESIZE_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tposition: 'relative',\n\t[`&:not(:hover):not(.${dragResizeClasses.dragging}) .${dragResizeHandleClasses.root}`]: {\n\t\topacity: 0,\n\t},\n}));\n\nconst DragResizeContent = styled('div', {\n\tname: DRAG_RESIZE_CLASS_NAME,\n\tslot: 'Content',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tflexDirection: 'column',\n\toverflow: 'hidden',\n\twidth: '100%',\n}));\n\nconst DragResizeSentinel = styled('div')(({theme}) => ({\n\tposition: 'absolute',\n\tpointerEvents: 'none',\n\t[`&.${dragResizeClasses.bottom}`]: {\n\t\tright: 0,\n\t\tbottom: 0,\n\t\tleft: 0,\n\t\theight: 1,\n\t},\n\t[`&.${dragResizeClasses.left}`]: {\n\t\tright: 0,\n\t\ttop: 0,\n\t\tbottom: 0,\n\t\twidth: 1,\n\t},\n\t[`&.${dragResizeClasses.right}`]: {\n\t\tleft: 0,\n\t\ttop: 0,\n\t\tbottom: 0,\n\t\twidth: 1,\n\t},\n\t[`&.${dragResizeClasses.top}`]: {\n\t\tright: 0,\n\t\ttop: 0,\n\t\tleft: 0,\n\t\theight: 1,\n\t},\n}));\n\nconst SIDES = {\n\t[DragResizeDirection.LEFT]: 'right',\n\t[DragResizeDirection.RIGHT]: 'left',\n\t[DragResizeDirection.TOP]: 'bottom',\n\t[DragResizeDirection.BOTTOM]: 'top',\n} as const;\n\nexport type DragResizeProps = WithClasses<\n\tDragResizeClasses,\n\tReact.PropsWithChildren<\n\t\tArgumentsType[0] & {\n\t\t\tref?: Ref;\n\t\t}\n\t>\n>;\n\nconst DragResizeInner = (\n\t{classes: _classes, children, className, ...props}: DragResizeProps,\n\tref: Ref,\n) => {\n\tconst {\n\t\tisDragging,\n\t\tcheckLimits,\n\t\tdirection,\n\t\thandleMouseDown,\n\t\tstyles,\n\t} = useDragResize(props);\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\tdragging: isDragging,\n\t\tdirection,\n\t});\n\n\tconst handleObserver = useCallback(() => checkLimits(), []);\n\n\tconst observer = useRef(\n\t\tnew IntersectionObserver(handleObserver, {\n\t\t\tthreshold: 1,\n\t\t\troot: props.overflowParentEl?.current,\n\t\t}),\n\t);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tobserver.current.disconnect();\n\t\t};\n\t}, []);\n\n\tconst registerRef = useCallback((node) => {\n\t\tif (!node) return;\n\t\tobserver.current?.observe(node);\n\t}, []);\n\n\tconst side = SIDES[direction];\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{children}\n\t\t\t\n\t\t\t\n\t\t\t{!props.disabled ? (\n\t\t\t\t\n\t\t\t) : null}\n\t\t\n\t);\n};\n\nexport const DragResizePrimitive = React.forwardRef(DragResizeInner) as (\n\tprops: DragResizeProps,\n\tref?: Ref,\n) => JSX.Element;\n\nexport const DragResize = DragResizePrimitive;\n\nexport default DragResize;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const DRAG_RESIZE_HANDLE_CLASS_NAME = 'DragResizeHandle';\nexport const DRAG_RESIZE_HANDLE_CLASS_SLOTS = ['root', 'ellipsis'] as const;\n\nexport type DragResizeHandleClassSlot = typeof DRAG_RESIZE_HANDLE_CLASS_SLOTS[number];\n\nexport interface DragResizeHandleClasses {\n\troot: string;\n\tellipsis: string;\n\n\tdragging: string;\n\tbottom: string;\n\tleft: string;\n\tright: string;\n\ttop: string;\n}\n\nexport type DragResizeHandleClassKey = keyof DragResizeHandleClasses;\n\nexport const getDragResizeHandleUtilityClass = (\n\tslot: DragResizeHandleClassSlot,\n) => generateUtilityClass(DRAG_RESIZE_HANDLE_CLASS_NAME, slot);\n\nexport const dragResizeHandleClasses: DragResizeHandleClasses = generateUtilityClasses(\n\tDRAG_RESIZE_HANDLE_CLASS_NAME,\n\t['root', 'dragging', 'ellipsis', 'left', 'right', 'top', 'bottom'],\n);\n\nexport default dragResizeHandleClasses;\n","import React, {useCallback, useEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {\n\tButton,\n\tDialogActions,\n\tDialogContent,\n\tDialogContentProps,\n\tLinearProgress,\n} from '@mui/material';\nimport useMediaQuery from '../hooks/useMediaQuery';\nimport Dialog, {DialogProps} from '../Dialog';\nimport {Form, FormActions, FormChanges, FormType, FormValues} from '../Form';\nimport SubmitButton from '../SubmitButton';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tuseTheme,\n\tWithClasses,\n\tWithMuiPropOverrides,\n} from '../Theme';\n\ntype OverridenDialogContentProps = WithMuiPropOverrides;\n\nimport {\n\tformDialogClasses,\n\tgetFormDialogUtilityClass,\n\tFormDialogClasses,\n\tFORM_DIALOG_CLASS_NAME,\n} from './formDialogClasses';\n\ntype FormDialogUtiltiyClassProps = WithClasses<\n\tFormDialogClasses,\n\t{\n\t\tdisabled?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: FormDialogUtiltiyClassProps) => {\n\tconst {classes, disabled} = ownerState;\n\tconst slots = {\n\t\troot: ['root', disabled && 'disabled'],\n\t\tactions: ['actions'],\n\t\tcancelButton: ['cancelButton'],\n\t\tcontent: ['content'],\n\t\tform: ['form'],\n\t\tprogress: ['progress'],\n\t\tsubmitButton: ['submitButton'],\n\t};\n\treturn composeClasses(slots, getFormDialogUtilityClass, classes);\n};\n\nconst FormDialogRoot = styled(Dialog, {\n\tname: FORM_DIALOG_CLASS_NAME,\n\tslot: 'Root',\n})(({theme, ownerState}) => {\n\tconst {disabled} = ownerState as FormDialogUtiltiyClassProps;\n\treturn {\n\t\t...(disabled\n\t\t\t? {\n\t\t\t\t\t[`& .${formDialogClasses.form}`]: {\n\t\t\t\t\t\topacity: 0.5,\n\t\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t\t},\n\t\t\t }\n\t\t\t: null),\n\t};\n});\n\nconst FormDialogContent = styled(DialogContent, {\n\tname: FORM_DIALOG_CLASS_NAME,\n\tslot: 'Content',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tposition: 'relative',\n}));\n\nconst FormDialogForm = styled(Form, {\n\tname: FORM_DIALOG_CLASS_NAME,\n\tslot: 'Form',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tflex: '1 1 auto',\n\toverflow: 'hidden',\n\t'&.disabled': {\n\t\t...theme.mixins.disabled,\n\t},\n}));\n\nconst FormDialogActions = styled(DialogActions, {\n\tname: FORM_DIALOG_CLASS_NAME,\n\tslot: 'Actions',\n})(({theme}) => ({\n\tpadding: theme.spacing(2),\n}));\n\nconst FormDialogCancelButton = styled(Button, {\n\tname: FORM_DIALOG_CLASS_NAME,\n\tslot: 'CancelButton',\n})(({theme}) => ({\n\t// marginRight: theme.spacing(1),\n\t[`& + .${formDialogClasses.submitButton}`]: {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nconst FormDialogSubmitButton = styled(SubmitButton, {\n\tname: FORM_DIALOG_CLASS_NAME,\n\tslot: 'SubmitButton',\n})(({theme}) => ({\n\t[theme.breakpoints.down('sm')]: {\n\t\twidth: '100%',\n\t},\n}));\n\nexport type FormDialogProps<\n\tWithForm extends boolean = false,\n\tTValues extends FormValues = FormValues\n> = Omit &\n\tWithClasses<\n\t\tFormDialogClasses,\n\t\t{\n\t\t\tform?: FormType;\n\t\t\tcancelLabel?: string;\n\t\t\tconfirmLabel?: string;\n\t\t\thasChanged?: boolean;\n\t\t\tinvalid?: boolean;\n\t\t\tisValid?: boolean;\n\t\t\topen?: boolean;\n\t\t\tprogress?: null | number;\n\t\t\trequiresChanges?: boolean;\n\t\t\tsubmitting?: boolean;\n\t\t\tDialogContentProps?: Partial<\n\t\t\t\tOmit\n\t\t\t>;\n\t\t}\n\t> &\n\t(WithForm extends true\n\t\t? {\n\t\t\t\tform: FormType;\n\t\t\t\tonSubmit?: (\n\t\t\t\t\tvalues: TValues,\n\t\t\t\t\tchanges: FormChanges,\n\t\t\t\t\tactions: FormActions,\n\t\t\t\t) => Promise;\n\t\t }\n\t\t: {\n\t\t\t\tonSubmit: (event: React.FormEvent) => Promise;\n\t\t });\n\n/**\n * Standard dialog for forms\n */\nexport const FormDialogPrimitive = ({\n\tchildren,\n\tclasses: _classes,\n\tclassName,\n\n\tcancelLabel,\n\tdisabled,\n\tconfirmLabel,\n\tdisableEscapeKeyDown,\n\tform,\n\thasChanged,\n\tinvalid,\n\tisValid,\n\tonClose,\n\tonSubmit,\n\tprogress,\n\trequiresChanges = true,\n\tsubmitting,\n\n\tDialogContentProps,\n\n\t...props\n}: FormDialogProps) => {\n\tcancelLabel = cancelLabel != null ? cancelLabel : i18n.t('i18n.cancel');\n\tconfirmLabel = confirmLabel != null ? confirmLabel : i18n.t('i18n.submit');\n\n\tconst isUncontrolled = useRef(props.open == null);\n\tconst open = props.open == null ? true : props.open === true;\n\n\tuseEffect(() => {\n\t\topen != null && setIsOpen(open);\n\t\tif (isUncontrolled.current && open != null) {\n\t\t\tconsole.warn('switching from uncontrolled to controlled');\n\t\t\t// isUncontrolled.current = false;\n\t\t}\n\t}, [props.open]);\n\n\tconst theme = useTheme();\n\n\tconst smallScreen = useMediaQuery(theme.breakpoints.down('sm'));\n\n\tconst [isOpen, setIsOpen] = useState(open);\n\n\tconst changed = form?.hasChanged || hasChanged;\n\tconst valid = form?.isValid || isValid;\n\tconst isSubmitting = form?.isSubmitting || submitting;\n\n\tconst ownerState: FormDialogUtiltiyClassProps = {\n\t\tclasses: _classes,\n\t\tdisabled,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst submitEnabled =\n\t\tinvalid !== true && valid && (!requiresChanges || changed);\n\n\tconst handleClose = useCallback(\n\t\t(event, reason) => {\n\t\t\tif (!isSubmitting && reason !== 'backdropClick') {\n\t\t\t\tisUncontrolled.current && setIsOpen(false);\n\t\t\t\tonClose?.(event, reason);\n\t\t\t}\n\t\t},\n\t\t[onClose, isSubmitting],\n\t);\n\n\tconst handleCancel = useCallback(\n\t\t(event) => {\n\t\t\tisUncontrolled.current && setIsOpen(false);\n\t\t\tonClose?.(event, 'escapeKeyDown');\n\t\t},\n\t\t[onClose],\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{progress != null ? (\n\t\t\t\t\t\t\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>{children}\n\t\t\t\t\t)}\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t{!smallScreen ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{cancelLabel}\n\t\t\t\t\t\t\n\t\t\t\t\t) : null}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport const FormDialog = FormDialogPrimitive;\n\nexport default FormDialog;\n","import {AttributeTemplate} from '../types';\nimport {\n\tATTRIBUTE_NUMBER_SPEC_2_TYPE,\n\tATTRIBUTE_NUMBER_MAX_DECIMAL,\n\tATTRIBUTE_NUMBER_TESTS,\n} from '../constants';\n\n/**\n * @return Decimals\n */\nexport const getDecimalCount = (value: number | string) => {\n\tvalue = value.toString();\n\tconst decimalSeparator = whatDecimalSeparator();\n\tconst decimals = value.split(decimalSeparator);\n\treturn decimals[1]?.length || 0;\n};\n\n/**\n * https://stackoverflow.com/questions/11665884/how-can-i-parse-a-string-with-a-comma-thousand-separator-to-a-number\n */\nexport const parseNumber = (value: string | number, locale?: string) => {\n\tvalue = value.toString();\n\tlocale = locale || navigator.language;\n\tconst example = Intl.NumberFormat(locale).format(1.1);\n\tconst cleanPattern = new RegExp('[^-+0-9' + example.charAt(1) + ']', 'g');\n\treturn parseFloat(\n\t\tvalue.replace(cleanPattern, '').replace(example.charAt(1), '.'),\n\t);\n};\n\n/**\n * @return Decimal separator for locale\n */\nexport const whatDecimalSeparator = () =>\n\t(1.1).toLocaleString().substring(1, 2);\n\nexport const number = (\n\tvalue: any,\n\t{spec1, spec2}: Pick,\n) => {\n\tif (value === '' || value == null) return true;\n\n\tconst maxLength = spec1 || Infinity;\n\tconst numberType = spec2;\n\n\t// const test = STR_TESTS[numberType];\n\tconst maxDecimal = ATTRIBUTE_NUMBER_MAX_DECIMAL[numberType];\n\n\tvalue = value.toString();\n\n\tconst decimalIndex = value.indexOf('.');\n\tif (decimalIndex > -1 && decimalIndex + 1 === value.length)\n\t\treturn new Error('Invalid number');\n\n\tif (value.length > maxLength)\n\t\treturn new Error(`Exceeds max length of ${maxLength}`);\n\n\tif (isNaN(parseNumber(value))) return new Error('Invalid number format');\n\n\t// Negative numbers are not allowed by the DAM\n\tif (numberType === ATTRIBUTE_NUMBER_SPEC_2_TYPE.UNLIMITED && value < 0)\n\t\treturn new Error('Negative numbers are not allowed');\n\n\tconst decimalCount = getDecimalCount(value);\n\tif (numberType === ATTRIBUTE_NUMBER_SPEC_2_TYPE.WHOLE && !!decimalCount)\n\t\treturn new Error(`Must be a whole number`);\n\tif (decimalCount > maxDecimal)\n\t\treturn new Error(`Exceeds max decimals of ${maxDecimal}`);\n\n\treturn true;\n};\n\nexport default number;\n","import base from './base';\n\nexport const number = (value: any) => base(value);\n\nexport default number;\n","export * from './getIndexedResults';\nexport * from './getNextPageParam';\nexport * from './types';\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport type {LabelValue} from '@netx/core/types';\n\nexport type GroupAutoListItem = Omit & {\n\t/** group id */\n\tvalue: number;\n};\n\n/**\n * `getGroupAutoList` request params\n * (what is used to send to server)\n */\nexport interface GetGroupAutoListRequestOptions {\n\tquery: string;\n}\n\n/**\n * `getGroupAutoList` request\n * (what gets sent to the server)\n */\nexport type GetGroupAutoListRequest = [GetGroupAutoListRequestOptions['query']];\n\n/**\n * `getGroupAutoList` response\n * (what comes back from the server)\n */\nexport type GetGroupAutoListResponse = SuccessResponse;\n\n/**\n * `getGroupAutoList` result\n * (what is utilized from the server response)\n */\nexport type GetGroupAutoListResult = GroupAutoListItem[];\n\nexport const getGroupAutoListEndpoint = 'getGroupAutoList';\n\n/**\n * Autolist groups\n * @param fetchParams Fetch params\n */\nexport const getGroupAutoList = async ({\n\tquery,\n}: GetGroupAutoListRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetGroupAutoListRequest = [query];\n\n\treturn client\n\t\t.post(getGroupAutoListEndpoint, requestParams)\n\t\t.then((response) =>\n\t\t\tresponse.data.result.map((d) => ({\n\t\t\t\t...d,\n\t\t\t\tvalue: parseInt(d.value),\n\t\t\t})),\n\t\t);\n};\nexport default getGroupAutoList;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport type {LabelValue} from '@netx/core/types';\nimport {UserPermission} from '../constants';\n\nexport type UserAutoListItem = Omit & {\n\t/** user id */\n\tvalue: number;\n};\n\n/**\n * `getUserAutoList` request params\n * (what is used to send to server)\n */\nexport interface GetUserAutoListRequestOptions {\n\tquery: string;\n\tpermission?: UserPermission;\n}\n\n/**\n * `getUserAutoList` request\n * (what gets sent to the server)\n */\nexport type GetUserAutoListRequest = [\n\tGetUserAutoListRequestOptions['query'],\n\tRequired['permission'],\n];\n\n/**\n * `getUserAutoList` response\n * (what comes back from the server)\n */\nexport type GetUserAutoListResponse = SuccessResponse;\n\n/**\n * `getUserAutoList` result\n * (what is utilized from the server response)\n */\nexport type GetUserAutoListResult = UserAutoListItem[];\n\nexport const getUserAutoListEndpoint = 'getUserAutoList';\n\n/**\n * Autolist users\n * @param fetchParams Fetch params\n */\nexport const getUserAutoList = async ({\n\tquery,\n\tpermission = UserPermission.READ,\n}: GetUserAutoListRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetUserAutoListRequest = [query, permission];\n\n\treturn client\n\t\t.post(getUserAutoListEndpoint, requestParams)\n\t\t.then((response) =>\n\t\t\tresponse.data.result.map((d) => ({\n\t\t\t\t...d,\n\t\t\t\tvalue: parseInt(d.value),\n\t\t\t})),\n\t\t);\n};\nexport default getUserAutoList;\n","import {UserLevel} from '@netx/core-user/constants';\n\nexport const CUSTOM_THUMBNAIL_MINIMUM_USER_LEVEL = UserLevel.PRODUCER;\n","import Netx from '@netx/core/bootstrap';\nimport {isMobile} from '@netx/core/utils/isMobile';\nimport {assetProjectEnabled} from '@netx/core-asset-project';\nimport {canUseGridEditor} from '@netx/core-attribute-grid-editor';\n\nimport {cart} from '@netx/core-cart/collections/singleton';\nimport {getPreference} from '@netx/core-user/utils/getPreference';\nimport {\n\tcurrentUserMeetsUserLevel,\n\tUserLevel,\n} from '@netx/core-user/utils/currentUserMeetsUserLevel';\nimport {canRepurpose} from '@netx/core-asset-repurpose';\nimport {assetExpirationEnabled} from '@netx/core-asset-expiration';\n\nexport const currentCartIsEmpty = () => !cart.getTotal();\n\nexport const currentCartIsNotEmpty = () => !currentCartIsEmpty();\n\nexport const currentCartNotEmpty = () => !currentCartIsEmpty();\n\nexport const canCategorizeCurrentCartAssets = () =>\n\tcurrentCartIsNotEmpty() && currentUserMeetsUserLevel(UserLevel.MANAGER);\n\nexport const canDeleteCurrentCartAssets = () =>\n\tcurrentCartIsNotEmpty() && currentUserMeetsUserLevel(UserLevel.MANAGER);\n\nexport const canCreatePdfFromCurrentCart = () =>\n\tcurrentCartIsNotEmpty() && currentUserMeetsUserLevel(UserLevel.CONSUMER);\n\nexport const canCreateTMSObjectFromCurrentCart = () =>\n\tcurrentCartIsNotEmpty() &&\n\tgetPreference('tms.webserviceEndpoint') != null &&\n\tgetPreference('tms.actionMessage') != null;\n\nexport const canDownloadCurrentCart = () =>\n\tcurrentCartIsNotEmpty() && currentUserMeetsUserLevel(UserLevel.CONSUMER);\n\nexport const canDownloadCurrentCartMetadata = () =>\n\tcurrentCartIsNotEmpty() && currentUserMeetsUserLevel(UserLevel.CONSUMER);\n\nexport const canEditCurrentCartAttributes = () =>\n\tcurrentCartIsNotEmpty() && canUseGridEditor();\n\nexport const canFindReplaceCurrentCart = () =>\n\tcurrentCartIsNotEmpty() && currentUserMeetsUserLevel(UserLevel.PRODUCER);\n\nexport const canManageCurrentCartArchive = () =>\n\tcurrentCartIsNotEmpty() &&\n\tNetx.getPreference('glacier.archiveEnabled', true) &&\n\tcurrentUserMeetsUserLevel(UserLevel.DIRECTOR);\n\nexport const canManageCurrentCartExpiration = () =>\n\tcurrentCartIsNotEmpty() &&\n\tassetExpirationEnabled() &&\n\tcurrentUserMeetsUserLevel(UserLevel.MANAGER);\n\nexport const canManageCurrentCartRelationships = () =>\n\tcurrentCartIsNotEmpty() && currentUserMeetsUserLevel(UserLevel.PRODUCER);\n\nexport const canManageCurrentCartVisibility = () =>\n\tcurrentCartIsNotEmpty() && currentUserMeetsUserLevel(UserLevel.ADMIN);\n\nexport const canRepurposeCurrentCart = () =>\n\tcurrentCartIsNotEmpty() && canRepurpose();\n\nexport const canResyncCurrentCart = () =>\n\tcurrentCartIsNotEmpty() && currentUserMeetsUserLevel(UserLevel.PRODUCER);\n\nexport const canReviewCurrentCart = () =>\n\tcurrentCartIsNotEmpty() && !isMobile() && assetProjectEnabled();\n\n// TODO: this is incomplete at the moment... more, it is a holdover for react until we get the share menu\n// reworked one day\nexport const canShareCurrentCart = () => {\n\t// TODO: `share:assetSet:users` enabler test is wrong and assumes we have all assets available in a saved cart\n\t// it should be safe (atm) to assume that if this action is not available, then none of the other actions would be\n\treturn (\n\t\t(currentCartIsNotEmpty() &&\n\t\t\t// share:feed:new -> [Netx.getPublicProperty('mediaServices.enabled', true)]\n\t\t\tcurrentUserMeetsUserLevel(UserLevel.DIRECTOR) &&\n\t\t\tNetx.getPublicProperty('mediaServices.enabled', true)) ||\n\t\t// share:assetSet:token -> matrix: 'download',\n\t\t// share:assetSet:media:service -> [mediaServicesEnabled, downloadOptionSelected], matrix: 'download',\n\t\t// share:token:embed -> [canEmbed], matrix: 'download',\n\t\tcurrentUserMeetsUserLevel(UserLevel.CONSUMER)\n\t);\n};\n","import React, {useCallback, useEffect, useRef, useState, useMemo} from 'react';\nimport _ from 'underscore';\n\nimport {dispatcher} from '@netx/core/bootstrap';\n\n// @ts-ignore\nimport hypergrid from 'core-libs/fin-hypergrid/fin-hypergrid';\n// Do not remove\n// If we do not do anything with this it gets discarded in builds\n// you can console.log or assign it to a variable to keep it around\n// `hypergrid` itself resolves to be `{}` - they install it in the\n// `global.fin` namespace\nconst someWeirdTreeShakingIsHappening = hypergrid;\n\nimport columns from '../../columns';\n// import {GridEditor, GridEditorProps} from './containers';\nimport {cellKeyboardNavigationHack, scrollHack} from '../../hacks';\nimport {AttributeSetSelectionProvider} from '@netx/core-attribute-set-selection';\nimport {AttributeSetProvider} from '@netx/core-attribute-set';\nimport {AttributeProvider} from '@netx/core-attribute';\nimport GridEditor, {GridEditorProps} from '../../components/GridEditor';\nimport {\n\tChangeStoreProvider,\n\tGridStoreProvider,\n\tProgressStoreProvider,\n\tSelectionStoreProvider,\n} from '../../store';\nimport {ColumnSchema, DataRow, GridEditor as GridEditorType} from '../../types';\n\nimport properties from '@netx/core-grid/properties/grid';\nimport {getDefaults} from '@netx/core-grid/lib/configs/default';\nimport ClientSort from '@netx/core-grid/lib/sorters/client';\nimport ServerSort from '@netx/core-grid/lib/sorters/server';\n\nimport {\n\tConfirmationServiceProvider,\n\tSnackbarServiceProvider,\n\twithErrorBoundary,\n} from '@netx/core-components';\n\nconst Sorters = {\n\tclient: ClientSort,\n\tserver: ServerSort,\n};\n\nexport type GridEditorContainerProps = GridEditorProps;\n\nconst GridEditorContainer = ({\n\tonChange,\n\t...props\n}: GridEditorContainerProps) => {\n\tconst elementRef = useRef(null);\n\tconst pluginRef = useRef();\n\tconst configurationRef = useRef>({});\n\tconst [pluginReady, setPluginReady] = useState(false);\n\n\tconst schemaRef = useRef[]>([]);\n\tconst columnsRef = useRef>();\n\tconst [hasChanges, setHasChanges] = useState(false);\n\n\tconst defaultSelection = useMemo(() => ['all'], []);\n\n\t// Setup hypergrid plugin\n\tuseEffect(() => {\n\t\tif (!elementRef.current) {\n\t\t\tsetPluginReady(false);\n\t\t\treturn;\n\t\t}\n\n\t\t// @ts-ignore\n\t\tconst plugin: GridEditorType = (pluginRef.current =\n\t\t\tnew global.fin.Hypergrid(elementRef.current, {\n\t\t\t\tdata: [],\n\t\t\t}));\n\n\t\tcellKeyboardNavigationHack(plugin);\n\t\tscrollHack(plugin);\n\n\t\tplugin.addProperties(properties);\n\n\t\tconst updateConfiguration = (type?: string) => {\n\t\t\tconfigurationRef.current = {...getDefaults(type), fixedColumnCount: 3};\n\t\t\tplugin.setState(configurationRef.current);\n\t\t};\n\n\t\tupdateConfiguration();\n\n\t\t// Setup columns\n\t\tconst _columns = (columnsRef.current = columns(plugin));\n\n\t\tconst themeListener = (type: string) => {\n\t\t\tupdateConfiguration(type);\n\t\t\t// Have to resetup schema after updating the configuration\n\t\t\t_columns.updateSchema(schemaRef.current);\n\t\t};\n\t\tdispatcher.on('theme:toggled', themeListener);\n\n\t\tsetPluginReady(true);\n\n\t\treturn () => {\n\t\t\tdispatcher.off('theme:toggled', themeListener);\n\t\t\ttry {\n\t\t\t\tpluginRef.current = undefined;\n\t\t\t\tplugin.removeAllEventListeners();\n\t\t\t\tplugin.terminate();\n\t\t\t\twhile (plugin.div.hasChildNodes()) {\n\t\t\t\t\tplugin.div.lastChild && plugin.div.removeChild(plugin.div.lastChild);\n\t\t\t\t}\n\t\t\t} catch (ex) {}\n\t\t};\n\t}, []);\n\n\tconst handleSetData = useCallback((data: DataRow[], schema: ColumnSchema) => {\n\t\tconst plugin = pluginRef.current;\n\t\tif (!plugin) return;\n\n\t\tplugin.setData(data, {\n\t\t\tschema: schema.map((schema) => {\n\t\t\t\treturn {\n\t\t\t\t\theader: schema.header,\n\t\t\t\t\tname: schema.name,\n\t\t\t\t};\n\t\t\t}),\n\t\t});\n\n\t\tcolumnsRef.current?.updateSchema((schemaRef.current = schema));\n\n\t\tplugin.installPlugins(Sorters.client);\n\n\t\tsetTimeout(() => {\n\t\t\tplugin.fireSyntheticGridResizedEvent(new Event('resize'));\n\t\t}, 51);\n\t}, []);\n\n\tconst handleChange = useCallback(\n\t\t(hasChanges: boolean) => {\n\t\t\tsetHasChanges(hasChanges);\n\t\t\tonChange?.(hasChanges);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default withErrorBoundary(GridEditorContainer);\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport FallbackMessage from '@netx/core-components/FallbackMessage';\n\nimport type {AttributeSetId} from '../../types';\nimport {\n\tAttributeContainer,\n\tAttributeContainerProps,\n\tAttributeAction,\n\tAttributeSkeleton,\n\tAttributeSkeletonProps,\n\tAttributeTemplate,\n\tAttributePermissions,\n\tAttributesWorking,\n\tLookups,\n} from '@netx/core-attribute';\nimport type {\n\tFormValidationErrors,\n\tFormActions,\n\tFormValues,\n} from '@netx/core-components/Form/hooks/useForm';\nimport {isEmptyValue} from '@netx/core-components/Form/util';\nimport useUserPref from '@netx/core-components/hooks/useUserPref';\n\nexport interface AttributeSetComponentProps\n\textends Omit {\n\tactions?: FormActions;\n\terrors?: FormValidationErrors;\n\tallowSystemAttributes?: boolean;\n\thideReadOnlyAttributes?: boolean;\n\thideReadOnlyAttribuetesWithoutValues?: boolean;\n\tattributes: AttributeTemplate[];\n\tattributesWorking?: AttributesWorking;\n\tid: AttributeSetId;\n\tinputForm: any;\n\tlimitToValues?: boolean;\n\tloading?: boolean;\n\tloadingValues?: boolean;\n\tlookupsAllowed?: Lookups;\n\tlookupsDisabled?: boolean;\n\tmultipleValues?: Record;\n\tonLookup?: (\n\t\tattribute: AttributeTemplate,\n\t\tlookupValue: string,\n\t) => Promise;\n\toriginalValues?: FormValues;\n\tpermissions?: AttributePermissions;\n\treadOnlyAttributes?: Record;\n\tvalues?: FormValues;\n}\n\n// Named a little different due to a conflict with the type `AttributeSet`\nexport const AttributeSetComponent = ({\n\tactions,\n\tallowSystemAttributes,\n\tattributes = [],\n\tattributesWorking,\n\terrors,\n\thideReadOnlyAttributes,\n\thideReadOnlyAttribuetesWithoutValues,\n\tid,\n\tinputForm,\n\tlimitToValues,\n\tloading,\n\tloadingValues,\n\tlookupsAllowed,\n\tlookupsDisabled,\n\tmultipleValues,\n\tonLookup,\n\tform,\n\toriginalValues,\n\tpermissions,\n\treadOnly,\n\treadOnlyAttributes,\n\tvalues,\n\t...props\n}: AttributeSetComponentProps) => {\n\t// TODO: move this logic up higher to the attribute context\n\tconst [metadataLookupsEnabled] = useUserPref(\n\t\t'category.metadataDatasetLookupEnabled',\n\t\t{\n\t\t\tasBoolean: true,\n\t\t},\n\t);\n\tconst canMetadataLookup = metadataLookupsEnabled && onLookup != null;\n\n\t// TODO: fix this stuff;\n\tif (!actions && form) actions = (form as any).actions;\n\tif (!values && form) values = (form as any).values;\n\tif (!errors && form) errors = (form as any).errors;\n\n\tconst ids = Object.keys(values || {}).map((id) => parseInt(id));\n\tconst displayableAttributes = attributes.filter((attr) => {\n\t\tconst permReadOnly =\n\t\t\treadOnlyAttributes?.[attr.attributeid] === true ||\n\t\t\t(attr.permission !== 'd' && attr.permission !== 'w');\n\t\treturn (\n\t\t\t(!limitToValues || ids.includes(attr.attributeid)) &&\n\t\t\t(allowSystemAttributes || !attr.system) &&\n\t\t\t(!hideReadOnlyAttribuetesWithoutValues ||\n\t\t\t\t(!permReadOnly && !readOnly) ||\n\t\t\t\t!isEmptyValue(values?.[attr.attributeid])) &&\n\t\t\t((!permReadOnly && !readOnly) || !hideReadOnlyAttributes)\n\t\t);\n\t});\n\n\tif (\n\t\t((limitToValues || (readOnly && hideReadOnlyAttribuetesWithoutValues)) &&\n\t\t\tloadingValues) ||\n\t\tloading\n\t) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{[0, 1, 2].map((val) => (\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\n\t\t);\n\t}\n\n\tif (!attributes.length) {\n\t\treturn (\n\t\t\t\n\t\t);\n\t}\n\n\tif (!displayableAttributes.length) {\n\t\treturn (\n\t\t\t\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{displayableAttributes.map((attr) => {\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t})}\n\t\t\n\t);\n};\n\nexport default AttributeSetComponent;\n","import {i18n} from '@netx/core/i18n';\n\nimport {CART_CURRENT_EVENT} from './actions';\n\nexport const CART_CURRENT_ACTION_LABELS: Record<\n\tkeyof typeof CART_CURRENT_EVENT,\n\tstring\n> = {\n\tCATEGORIZE: i18n.t('i18n.organize'),\n\tCREATE_PDF: i18n.t('i18n.createPDF'),\n\tCREATE_TMS_OBJECT_PACKAGE: i18n.t('i18n.createObjectPackageInTMS'),\n\tDELETE: i18n.t('i18n.deleteCurrentCartAssets'),\n\tDOWNLOAD: i18n.t('i18n.download'),\n\tDOWNLOAD_METADATA: i18n.t('i18n.exportMetadata'),\n\tEDIT_ATTRIBUTES: i18n.t('i18n.editAttributes'),\n\tEMPTY: i18n.t('i18n.clearCart'),\n\tFIND_REPLACE: i18n.t('i18n.findReplace'),\n\tMANAGE_ARCHIVE: i18n.t('i18n.manageArchive'),\n\tMANAGE_EXPIRATION: i18n.t('i18n.manageAssetExpiration'),\n\tMENU: i18n.t('i18n.share'),\n\tRELATIONSHIPS: i18n.t('i18n.relationships'),\n\tREPURPOSE: i18n.t('i18n.repurpose'),\n\tRESYNC: i18n.t('i18n.resync'),\n\tREVIEW: i18n.t('i18n.review'),\n\tSAVE: i18n.t('i18n.collect'),\n\tVISIBILITY: i18n.t('i18n.visibility'),\n};\n","import {UserLevel} from '@netx/core-user/constants';\n\nexport const REPURPOSE_MINIMUM_USER_LEVEL = UserLevel.CONSUMER;\n\nexport const REPURPOSE_SUPPORTED_VIEW_NAMES = ['previewH264', 'previewMp3'];\n\nexport const REPURPOSE_SUPPORTED_FILE_FORMAT_FAMILIES = ['image'];\n","import type {Asset} from '@netx/core-asset/types';\nimport {getPreference} from '@netx/core-user/utils/getPreference';\nimport {SearchVisualPref} from './constants';\n\nexport const visualSearchEnabled = () =>\n\tgetPreference(SearchVisualPref.ENABLED, true);\n\nexport const canVisualSearch = (asset?: Asset) =>\n\tvisualSearchEnabled() && asset?.fileFormatFamily.includes('image') === true;\n","import React from 'react';\nimport {useLayoutEffect, useState} from 'react';\n\nimport {\n\tTableCell as MuiTableCell,\n\tTableCellProps as MuiTableCellProps,\n} from '@mui/material';\n\nimport useSharedRef from '@netx/core-components/hooks/useSharedRef';\n\nexport interface TableCellProps extends MuiTableCellProps {\n\tcolumn?: {\n\t\ttype?: 'number' | 'string' | 'date';\n\t};\n\tfreezeSize?: boolean;\n}\n\nconst TableCell: React.FunctionComponent = React.forwardRef(\n\t({column, freezeSize, ...props}, ref: React.RefObject) => {\n\t\tconst innerRef = useSharedRef(null, [ref]);\n\t\tconst [width, setWidth] = useState();\n\n\t\t// TODO: We could also just do this:\n\t\t// Need to see what the cost would be if that were to be checked each time\n\t\t// I am leaning towards `useLayoutEffect` but this is \"much cleaner\"\n\t\t// const width = freezeSize ? ref.current?.clientWidth : undefined;\n\t\tuseLayoutEffect(() => {\n\t\t\tif (!freezeSize || innerRef.current == null) return;\n\t\t\tsetWidth(innerRef.current.clientWidth);\n\t\t\treturn () => setWidth(undefined);\n\t\t}, [freezeSize]);\n\n\t\tconst align = column?.type === 'number' ? 'right' : 'left';\n\n\t\tconst style = props.style || ({} as React.CSSProperties);\n\t\tif (width != null) style.width = width;\n\n\t\treturn (\n\t\t\t\n\t\t);\n\t},\n);\n\nexport default TableCell;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport ActionMenu, {ActionMenuProps} from '../../ActionMenu';\nimport TableCell, {TableCellProps} from '.';\n\nconst styles = ({spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\t// Remove top/bottom padding\n\t\t\tpadding: spacing(0, 2),\n\t\t},\n\t});\n\nexport interface ActionTableCellProps extends Partial {\n\tdata: any;\n\tActionMenuProps: ActionMenuProps;\n}\n\nconst ActionCell: React.FunctionComponent<\n\tWithStyles & ActionTableCellProps\n> = ({\n\tclasses,\n\n\tdata,\n\tActionMenuProps,\n\t...props\n}) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(React.memo(ActionCell));\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCaretDown as CaretIcon} from '@fortawesome/pro-solid-svg-icons';\nimport TableCell, {TableCellProps} from '../TableCell';\n\n// @ts-ignore\nconst isSafari = window.safari !== undefined;\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\t...theme.mixins.positionSticky,\n\t\t\tbackgroundColor: theme.palette.background.paper,\n\t\t\tborderBottom: 0,\n\t\t\ttop: 0,\n\t\t\tzIndex: 3,\n\t\t\t'&::after': {\n\t\t\t\tcontent: '\"\"',\n\t\t\t\tbottom: 0,\n\t\t\t\tbackground: theme.palette.custom.border,\n\t\t\t\tdisplay: 'block',\n\t\t\t\tposition: 'absolute',\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\theight: 1,\n\t\t\t},\n\t\t\t'&.disabled': {\n\t\t\t\tcolor: '#999',\n\t\t\t\tpointerEvents: 'none',\n\t\t\t},\n\t\t\t'&.sortable': {\n\t\t\t\tcursor: 'pointer',\n\t\t\t},\n\t\t\t'&.sorted': {\n\t\t\t\tpaddingRight: 36,\n\t\t\t},\n\t\t},\n\t\tsort: {\n\t\t\talignItems: 'center',\n\t\t\tbottom: 0,\n\t\t\tdisplay: 'flex',\n\t\t\tjustifyContent: 'center',\n\t\t\tposition: 'absolute',\n\t\t\tright: 12,\n\t\t\ttop: 0,\n\t\t\t'& svg': {\n\t\t\t\ttransition: 'transform 0.2s ease',\n\t\t\t},\n\t\t\t'&.sortedAscending': {\n\t\t\t\t'& svg': {\n\t\t\t\t\ttransform: 'rotate(180deg)',\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&.sortedDescending': {\n\t\t\t\t'& svg': {\n\t\t\t\t\ttransform: 'rotate(0deg)',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\nexport interface TableColumnProps extends TableCellProps {\n\talign?: 'left' | 'right';\n\tclassName?: string;\n\tcolumn?: any;\n\tdisabled?: boolean;\n\tsortable?: boolean;\n\tsorted?: false | 'asc' | 'desc';\n\tonSort?: (order: false | 'asc' | 'desc') => void;\n\twidth?: number;\n}\n\nconst TableColumn: React.FunctionComponent<\n\tWithStyles & TableColumnProps\n> = React.forwardRef(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tclasses,\n\n\t\t\tcolumn,\n\t\t\tdisabled = false,\n\t\t\tonSort,\n\t\t\tsortable = false,\n\t\t\tsorted = false,\n\t\t\twidth,\n\n\t\t\t...props\n\t\t},\n\t\tref?: React.Ref,\n\t) => {\n\t\tconst handleClick = React.useCallback(\n\t\t\t(event: React.MouseEvent) => {\n\t\t\t\tif (!sortable || disabled) return;\n\n\t\t\t\tlet sortOrder: false | 'asc' | 'desc' = 'desc';\n\t\t\t\tif (sorted === 'asc') sortOrder = false;\n\t\t\t\tif (sorted === 'desc') sortOrder = 'asc';\n\t\t\t\tonSort && onSort(sortOrder);\n\t\t\t},\n\t\t\t[onSort, sorted],\n\t\t);\n\n\t\treturn (\n\t\t\t\n\t\t\t\t{children}\n\t\t\t\t{sortable && sorted !== false ? (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t

    \n\t\t\t\t) : null}\n\t\t\t\n\t\t);\n\t},\n);\n\nexport default withStyles(styles)(React.memo(TableColumn));\n","import React, {useCallback, useLayoutEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {useUpdateEffect} from '@netx/core-components';\nimport _ from 'underscore';\n\nimport TableColumn, {TableColumnProps} from './TableColumn';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faEllipsisV as EllipsisIcon} from '@fortawesome/pro-light-svg-icons';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tminWidth: 100,\n\t\t\t'&:hover #dragger': {\n\t\t\t\topacity: 1,\n\t\t\t},\n\t\t\t'&.dragging': {\n\t\t\t\ttransition: 'none !important',\n\t\t\t\twillChange: 'width',\n\t\t\t\t//transform: 'translate3d(0)',\n\t\t\t\t'& #dragger': {\n\t\t\t\t\tborderColor: theme.palette.secondary.main,\n\t\t\t\t\topacity: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tdummy: {\n\t\t\tpadding: '0 !important',\n\t\t\tzIndex: 2,\n\t\t\tminWidth: '0 !important',\n\t\t\twidth: 'auto !important',\n\t\t},\n\t\tdragger: {\n\t\t\tbackground: 'rgba(0, 0, 0, 0.02)',\n\t\t\tborderRight: '1px solid transparent',\n\t\t\twidth: 8,\n\t\t\tcursor: 'col-resize',\n\t\t\topacity: 0,\n\t\t\toverflow: 'hidden',\n\t\t\tposition: 'absolute',\n\t\t\ttransition: 'opacity 0.3s ease',\n\t\t\ttop: 0,\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t\tzIndex: 1201,\n\t\t\tMozUserSelect: '-moz-none',\n\t\t\tWebkitUserSelect: 'none',\n\t\t\tuserSelect: 'none',\n\t\t\t'&:hover': {\n\t\t\t\tborderColor: theme.palette.secondary.main,\n\t\t\t},\n\t\t\t'& .ellipsis': {\n\t\t\t\tcolor:\n\t\t\t\t\ttheme.palette.mode === 'light'\n\t\t\t\t\t\t? 'rgba(0, 0, 0, 0.2)'\n\t\t\t\t\t\t: 'rgba(255, 255, 255, 0.2)',\n\t\t\t\tfontSize: 24,\n\t\t\t\tposition: 'absolute',\n\t\t\t\tleft: -11,\n\t\t\t\tmarginTop: -12,\n\t\t\t\ttop: '50%',\n\t\t\t},\n\t\t},\n\t});\n\nconst body = document.body;\nconst minWidth = 100;\n\nexport interface ResizableTableColumnProps extends TableColumnProps {\n\tonResize?: (width: number) => void;\n}\n\nexport const DummyColumn = withStyles(styles)(\n\t({classes}: WithStyles) => {\n\t\treturn (\n\t\t\t\n\t\t);\n\t},\n);\n\nconst ResizableTableColumn: React.FunctionComponent<\n\tWithStyles & React.PropsWithChildren\n> = ({\n\tclasses,\n\tonResize,\n\t...props\n}: WithStyles &\n\tReact.PropsWithChildren &\n\tTableColumnProps) => {\n\tconst [dims, setDims] = useState({\n\t\tcellWidth: 0,\n\t\txStart: 0,\n\t\twidth: props.width as number | undefined,\n\t});\n\tconst [isDragging, setIsDragging] = useState(false);\n\n\tconst lastMouseDown = useRef(Date.now());\n\tconst cellRef = useRef(null);\n\n\tuseUpdateEffect(() => {\n\t\tif (!onResize) return;\n\t\tonResize(dims.width as number);\n\t}, [dims.width]);\n\n\t// When we start/stop dragging\n\tuseLayoutEffect(() => {\n\t\tif (!isDragging) {\n\t\t\tbody.classList.remove('drag-resizing');\n\t\t\treturn;\n\t\t}\n\n\t\tbody.classList.add('drag-resizing');\n\n\t\tlet width: number;\n\t\tconst mousemove = _.throttle(\n\t\t\t(event: MouseEvent): void => {\n\t\t\t\twidth = dims.cellWidth + (event.clientX - dims.xStart);\n\t\t\t\tif (minWidth > width) {\n\t\t\t\t\twidth = minWidth;\n\t\t\t\t}\n\t\t\t\tsetDims((dims) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...dims,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\t\t\t16,\n\t\t\t{trailing: true},\n\t\t);\n\n\t\tconst mouseup = () => setIsDragging(false);\n\n\t\tdocument.addEventListener('mousemove', mousemove);\n\t\tdocument.addEventListener('mouseup', mouseup);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousemove', mousemove);\n\t\t\tdocument.removeEventListener('mouseup', mouseup);\n\t\t};\n\t}, [isDragging]);\n\n\tconst handleMouseDown = useCallback(\n\t\t(event: React.MouseEvent) => {\n\t\t\tevent.stopPropagation();\n\n\t\t\tif (Date.now() - lastMouseDown.current < 300) {\n\t\t\t\tsetDims((dims) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...dims,\n\t\t\t\t\t\twidth: undefined,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst cellWidth = cellRef.current?.offsetWidth || 0;\n\t\t\t\tconst clientX = event.clientX;\n\t\t\t\tsetDims((dims) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...dims,\n\t\t\t\t\t\txStart: clientX,\n\t\t\t\t\t\tcellWidth,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tsetIsDragging(true);\n\t\t\t}\n\t\t\tlastMouseDown.current = Date.now();\n\t\t},\n\t\t[],\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t{props.children}\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(React.memo(ResizableTableColumn));\n","import React from 'react';\n\nimport TableColumn, {TableColumnProps} from './TableColumn';\nimport ResizableTableColumn, {\n\tResizableTableColumnProps,\n} from './ResizableTableColumn';\n\nexport {TableColumn, ResizableTableColumn};\nexport * from './TableColumn';\nexport * from './ResizableTableColumn';\n\nexport interface TableColumnPropsComb\n\textends TableColumnProps,\n\t\tResizableTableColumnProps {\n\tresizable?: boolean;\n}\n\nexport default function ({\n\tresizable,\n\t...props\n}: React.PropsWithChildren) {\n\tif (resizable)\n\t\treturn ;\n\treturn ;\n}\n","import React, {useCallback} from 'react';\nimport clsx from 'clsx';\n\nimport {\n\tTableHead as MuiTableHead,\n\tTableHeadProps as MuiTableHeadProps,\n\tTableRow,\n} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {OnSort, SortOrder} from '../Table';\nimport TableColumn, {TableColumnPropsComb} from '../TableColumn';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tposition: 'relative',\n\t\t\t'&.disabled': {\n\t\t\t\tpointerEvents: 'none',\n\t\t\t},\n\t\t},\n\t\tactionColumn: {\n\t\t\twidth: 78,\n\t\t\tminWidth: 78,\n\t\t\tmaxWidth: 78,\n\t\t},\n\t\ticonColumn: {\n\t\t\twidth: 40,\n\t\t\tminWidth: 40,\n\t\t\tmaxWidth: 40,\n\t\t},\n\t});\n\nexport interface TableHeadProps extends Partial {\n\tdisabled?: boolean;\n\thasActions?: boolean;\n\tinEditMode?: boolean;\n\tloading?: boolean;\n\tonSort?: OnSort;\n\tresizable?: boolean;\n\treordering?: boolean;\n\tschema?: any;\n\tsortable?: string[];\n\tsortField?: string;\n\tsortOrder?: 'asc' | 'desc';\n\n\tTableColumnProps?: Partial;\n}\n\nconst TableHead = ({\n\tclasses,\n\n\tdisabled,\n\thasActions,\n\tinEditMode,\n\tloading,\n\tonSort,\n\treordering,\n\tresizable = true,\n\tschema,\n\tsortable,\n\tsortField,\n\tsortOrder,\n\n\tTableColumnProps,\n\t...props\n}: WithStyles & TableHeadProps) => {\n\tconst handleSort = useCallback(\n\t\t(field: string) => {\n\t\t\treturn (order: false | SortOrder) => {\n\t\t\t\tonSort && onSort(field, order);\n\t\t\t};\n\t\t},\n\t\t[onSort],\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{reordering ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\t{Object.keys(schema).map((key) => {\n\t\t\t\t\tconst column = schema[key];\n\t\t\t\t\tconst label = column.label != null ? column.label : key;\n\t\t\t\t\tconst sorted = (sortField === key ? sortOrder : false) as\n\t\t\t\t\t\t| 'asc'\n\t\t\t\t\t\t| 'desc'\n\t\t\t\t\t\t| false;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{hasActions || inEditMode ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(React.memo(TableHead));\n","import React, {useCallback, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {\n\tTableRow as MuiTableRow,\n\tTableRowProps as MuiTableRowProps,\n} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {TableRowData} from '..';\nimport {ActionTableCell} from '../TableCell';\nimport {ReactAction as Action} from '@netx/core/bootstrap';\n\nimport {useContextMenu} from '@netx/core-components';\n\nexport const getRowBackgroundColor = (theme: Theme) => ({\n\tdefault:\n\t\ttheme.palette.mode === 'light' ? 'rgb(250,250,250)' : 'rgb(36,36,36)',\n\tactive: theme.palette.mode === 'light' ? '#f0f0f0' : '#353535',\n});\n\nconst styles = (theme: Theme) => {\n\tconst rowStyles = getRowBackgroundColor(theme);\n\treturn createStyles({\n\t\troot: {\n\t\t\t'& td': {\n\t\t\t\tbackground: rowStyles.default,\n\t\t\t\t// Actions column\n\t\t\t\t'&:last-child': {\n\t\t\t\t\tposition: 'sticky',\n\t\t\t\t\tright: 0,\n\t\t\t\t\tlineHeight: '100%',\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&.clickable': {\n\t\t\t\tcursor: 'pointer',\n\t\t\t\t'&:hover td': {\n\t\t\t\t\tbackground: rowStyles.active,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&.disabled': {\n\t\t\t\topacity: 0.5,\n\t\t\t\tpointerEvents: 'none',\n\t\t\t},\n\t\t\t'&.menuActive': {\n\t\t\t\tuserSelect: 'none',\n\t\t\t\t'& td': {\n\t\t\t\t\tbackground: rowStyles.active,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n};\n\nexport interface TableRowProps extends MuiTableRowProps {\n\tactions?: Action[];\n\tcontextActions?: Action[];\n\tdata: TableRowData;\n\tdeleting?: boolean;\n\tdisabled?: boolean;\n\tonClick?: (data: TableRowData) => void;\n\trowDisabled?: boolean;\n\tschema?: any;\n\tsortable?: boolean;\n\tsorting?: boolean;\n}\n\nconst TableRow = React.forwardRef<\n\tHTMLTableRowElement,\n\tWithStyles & React.PropsWithRef\n>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tclasses,\n\n\t\t\tactions,\n\t\t\tclassName,\n\t\t\tcontextActions,\n\t\t\tdata,\n\t\t\tdeleting,\n\t\t\tdisabled,\n\t\t\tonClick,\n\t\t\trowDisabled,\n\t\t\tschema,\n\t\t\tsortable,\n\t\t\tsorting,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tdisabled = disabled || deleting || rowDisabled;\n\n\t\tconst contextMenu = useContextMenu();\n\n\t\tconst [menuIsOpen, setMenuIsOpen] = useState(false);\n\n\t\tconst handleAction = useCallback((action) => action.cb(data), [data]);\n\t\tconst handleActionsMenuClose = useCallback(() => setMenuIsOpen(false), []);\n\t\tconst handleActionsMenuOpen = useCallback(() => setMenuIsOpen(true), []);\n\n\t\t/** Row clicked */\n\t\tconst handleClick = useCallback(\n\t\t\t(event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tif (deleting) return;\n\t\t\t\t// https://github.com/facebook/react/issues/7407\n\t\t\t\t// Not really an issue but the browser causes this\n\t\t\t\tif (!onClick || (!event.clientX && !event.clientY)) return;\n\t\t\t\tonClick(data);\n\t\t\t},\n\t\t\t[data, onClick],\n\t\t);\n\n\t\t/** Row context menu */\n\t\tconst handleContextMenu = useCallback(\n\t\t\t(event) => {\n\t\t\t\tif (!contextActions) return;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tif (deleting) return;\n\n\t\t\t\tsetMenuIsOpen(true);\n\t\t\t\tcontextMenu\n\t\t\t\t\t.trigger({\n\t\t\t\t\t\tactions: contextActions,\n\t\t\t\t\t\tleft: event.clientX,\n\t\t\t\t\t\ttop: event.clientY,\n\t\t\t\t\t})\n\t\t\t\t\t.then((action) => action && handleAction(action))\n\t\t\t\t\t.finally(() => setMenuIsOpen(false));\n\t\t\t},\n\t\t\t[handleAction, contextActions],\n\t\t);\n\n\t\treturn (\n\t\t\t\n\t\t\t\t{children}\n\t\t\t\t{actions ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\t\t);\n\t},\n);\n\nexport default withStyles(styles)(React.memo(TableRow));\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {faEquals as EqualsIcon} from '@fortawesome/pro-solid-svg-icons';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\n\nimport TableCell, {TableCellProps} from '../TableCell';\n\nimport {SortableHandle} from 'react-sortable-hoc';\n\nconst styles = ({spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tcursor: 'grab',\n\t\t\theight: '100%',\n\t\t\twidth: 40,\n\t\t\tminWidth: 40,\n\t\t\tpadding: spacing(0, 1),\n\t\t},\n\t});\n\ninterface SortableTableRowHandleProps extends Partial {}\n\nconst SortableTableRowHandle = ({\n\tclasses,\n\t...props\n}: WithStyles & SortableTableRowHandleProps) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default SortableHandle(\n\twithStyles(styles)(React.memo(SortableTableRowHandle)),\n);\n","import React, {useEffect, useLayoutEffect} from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {SortableElement, SortableElementProps} from 'react-sortable-hoc';\n\nimport Row, {TableRowProps, getRowBackgroundColor} from './TableRow';\nimport SortableTableRowHandle from './SortableTableRowHandle';\n\nconst styles = (theme: Theme) => {\n\tconst background = getRowBackgroundColor(theme);\n\treturn createStyles({\n\t\troot: {\n\t\t\t'& td:first-of-type': {\n\t\t\t\tposition: 'sticky',\n\t\t\t\tleft: 0,\n\t\t\t\tzIndex: 2,\n\t\t\t},\n\t\t\t'&.sorting': {\n\t\t\t\t'&.dragging-item:hover, &.dragging-item': {\n\t\t\t\t\tborderTop:\n\t\t\t\t\t\ttheme.palette.mode === 'light'\n\t\t\t\t\t\t\t? '1px solid rgba(224, 224, 224, 1)'\n\t\t\t\t\t\t\t: '1px solid rgba(81, 81, 81, 1)',\n\t\t\t\t\tboxShadow:\n\t\t\t\t\t\ttheme.palette.mode === 'light'\n\t\t\t\t\t\t\t? '0px 1px 0px 0px rgba(0, 0, 0, 0.12)'\n\t\t\t\t\t\t\t: '0px 1px 0px 0px rgba(255, 255, 255, 0.22)',\n\t\t\t\t\tcursor: 'grabbing !important',\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tpointerEvents: 'all !important',\n\t\t\t\t\tuserSelect: 'none',\n\t\t\t\t\twillChange: 'transform',\n\t\t\t\t\tzIndex: 99999,\n\t\t\t\t\t'& td': {\n\t\t\t\t\t\tbackground: background.active,\n\t\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n};\n\nexport interface SortableRowProps\n\textends Omit,\n\t\tSortableElementProps {\n\tsorting?: boolean;\n\tsortableRef?: React.MutableRefObject; // TODO: find type definition for manager wrapper\n}\n\nconst SortableRow: React.FunctionComponent<\n\tWithStyles & SortableRowProps\n> = ({children, classes, sortableRef, sorting, ...props}) => {\n\tconst [style, setStyle] = React.useState<{\n\t\tmaxWidth: number;\n\t\ttransform: string;\n\t}>();\n\n\t// When sorting we need to add some styles to the item being dragged\n\t// The row could be wider than the wrapper\n\t// The wrapper could be scrolled\n\t// Keep in mind these styles are applied only to the item that will be dragged\n\t// the actual drag helper will use the position/size of this element to calculate\n\t// its position/size\n\tuseLayoutEffect(() => {\n\t\tif (!sorting) return;\n\n\t\tconst container = sortableRef?.current?.scrollContainer as HTMLElement;\n\t\tsetStyle({\n\t\t\t// Compensate for scroll left\n\t\t\t// This is the only we can shift a row to the right or left without changing its\n\t\t\t// position prop and removing it from the flow of the table\n\t\t\ttransform: `translate(${container.scrollLeft}px, 0)`,\n\t\t\t// Make sure we do not exceed the width of our container\n\t\t\tmaxWidth: container.clientWidth,\n\t\t});\n\n\t\treturn () => setStyle(undefined);\n\t}, [sorting]);\n\n\t// When we set the style hack we need to trigger a mousemove event\n\t// in order to get the sortable plugin to update the transfrom style\n\t// otherwise we get a gap on the left until the user moves the item\n\tuseEffect(() => {\n\t\tif (!style || !sortableRef) return;\n\t\tconst {x, y} = sortableRef.current.position;\n\t\t// TODO: might need to send a touch event\n\t\t// if this hack does not work on mobile, that is why\n\t\tsortableRef.current.handleSortMove(\n\t\t\tnew MouseEvent('mousemove', {\n\t\t\t\tclientX: x,\n\t\t\t\tclientY: y,\n\t\t\t\tscreenX: x,\n\t\t\t\tscreenY: y,\n\t\t\t}),\n\t\t);\n\t}, [style]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport default SortableElement(withStyles(styles)(SortableRow));\n","import React from 'react';\n\nexport * from './TableRow';\n\nimport SortableRow, {SortableRowProps} from './SortableTableRow';\nimport TableRow, {TableRowProps as BaseRowProps} from './TableRow';\n\nexport interface TableRowProps extends BaseRowProps, SortableRowProps {\n\treorderable?: boolean;\n\tsortableRef?: any;\n}\n\nexport default function ({reorderable, ...props}: TableRowProps) {\n\tif (reorderable) return ;\n\treturn ;\n}\n","// TODO: This was not well thought out / can only handle a single cell row with a\n// value type of text\n// We need to plan this as its own thing:\n// Handle full row editing of multiple fields\n// Validation in those fields\n// Multiple types of fields (data/number/etc)\nimport React, {useCallback, useEffect, useState} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {CircularProgress, TableRow} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {\n\tIconButton,\n\tTextField,\n\tuseForm,\n\tgetInputFormObject,\n} from '@netx/core-components';\n\nimport {TableRowData} from '../';\nimport TableCell from '../TableCell';\n\nimport {\n\tfaCheck as CheckIcon,\n\tfaTimes as TimesIcon,\n} from '@fortawesome/pro-solid-svg-icons';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {},\n\t\teditActions: {\n\t\t\tverticalAlign: 'baseline',\n\t\t},\n\t\tprogress: {\n\t\t\tposition: 'absolute',\n\t\t\ttop: 2,\n\t\t\tleft: 2,\n\t\t\tzIndex: 1,\n\t\t},\n\t\twrapper: {\n\t\t\tposition: 'relative',\n\t\t},\n\t});\n\nexport interface EditableTableRowProps {\n\tdata?: any;\n\tonCancel(): void;\n\tonRowUpdate?: (oldData: TableRowData, newData: TableRowData) => void;\n\tschema?: any;\n\tsubmitting?: boolean;\n\tsubmitError?: null | string;\n\tsortable?: boolean;\n}\n\nconst EditableTableRow: React.FunctionComponent<\n\tWithStyles & EditableTableRowProps\n> = ({\n\tclasses,\n\n\tdata,\n\tonCancel,\n\tonRowUpdate,\n\tschema,\n\tsortable,\n\tsubmitting = false,\n\tsubmitError,\n}) => {\n\tconst form = useForm(data);\n\tconst inputForm = getInputFormObject(form);\n\tconst inputRef = React.useRef(null);\n\tconst [isValid, setIsValid] = useState(true);\n\n\tconst handleCancel = useCallback(() => onCancel(), [onCancel]);\n\n\tuseEffect(() => {\n\t\tif (submitError != null) {\n\t\t\tform.setError(Object.keys(schema)[0], 'server', submitError);\n\t\t\treturn;\n\t\t}\n\t\tform.clearError(Object.keys(schema)[0]);\n\t}, [submitError, schema]);\n\n\tuseEffect(() => {\n\t\tsetIsValid(!Object.keys(form.errors).length);\n\t}, [form.errors]);\n\n\tuseEffect(() => {\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.which === 27) {\n\t\t\t\t// Escape\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\thandleCancel();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\n\t\tinputRef.current && inputRef.current.focus();\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keydown', handleKeyDown);\n\t\t};\n\t}, []);\n\n\tconst handleSubmit = useCallback(\n\t\tform.handleSubmit(async () => {\n\t\t\tif (!Object.keys(form.changesRef.current).length) {\n\t\t\t\tonCancel();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tonRowUpdate && onRowUpdate(data, form.valuesRef.current);\n\t\t}),\n\t\t[data, onRowUpdate],\n\t);\n\n\tconst handleKeyUp = useCallback(\n\t\t(event: React.KeyboardEvent) => {\n\t\t\tif (event.which === 13) {\n\t\t\t\t// Enter\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\thandleSubmit();\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleSubmitClick = useCallback(() => handleSubmit(), [handleSubmit]);\n\n\treturn (\n\t\t\n\t\t\t{sortable ? : null}\n\t\t\t{Object.keys(schema).map((key) => {\n\t\t\t\tconst column = schema[key];\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t})}\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\t\t{i18n.t('i18n.cancel')}\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t(esc)\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClick={handleCancel}\n\t\t\t\t\t/>\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t{submitting && (\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t);\n};\n\nexport default withStyles(styles)(EditableTableRow);\n","import React, {useCallback, useEffect, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {\n\tTableBody as MuiTableBody,\n\tTableBodyProps as MuiTableBodyProps,\n} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {ReactAction as Action} from '@netx/core/bootstrap';\n\nimport {TableRowData} from '..';\nimport TableCell from '../TableCell';\nimport TableRow, {TableRowProps} from '../TableRow';\nimport EditableTableRow from '../TableRow/EditableTableRow';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\t'&.disabled': {\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\topacity: 0.5,\n\t\t\t},\n\t\t},\n\t});\n\nexport interface TableBodyProps extends MuiTableBodyProps {\n\tactions?: Action[];\n\tclassName?: string;\n\tdata: TableRowData[];\n\tdeleting?: null | TableRowData;\n\tdisabled?: boolean;\n\teditable?: boolean;\n\tediting?: null | TableRowData;\n\tloading?: boolean;\n\tonEditing?: (isEditing: boolean, data?: TableRowData) => void;\n\tonEditModeToggle?: (isEditing: boolean) => void;\n\tonRowUpdate?: (oldData: TableRowData, newData: TableRowData) => void;\n\treorderable?: boolean;\n\trowSorting?: number;\n\tschema?: any;\n\tsubmitting?: boolean;\n\tsubmitError?: null | string;\n\n\tTableRowProps?: Partial;\n}\n\nconst TableBody: React.FunctionComponent<\n\tWithStyles & TableBodyProps\n> = ({\n\tclasses,\n\n\tactions,\n\tclassName,\n\tdata,\n\teditable,\n\tediting,\n\tdeleting,\n\tdisabled,\n\tloading,\n\tonEditing,\n\tonEditModeToggle,\n\tonRowUpdate,\n\treorderable,\n\trowSorting,\n\tschema,\n\tsubmitting,\n\tsubmitError,\n\n\tTableRowProps,\n\n\t...props\n}) => {\n\tconst deletingId = deleting && deleting.id;\n\tconst editingId = editing && editing.id;\n\n\tconst [isEditing, setIsEditing] = useState(editingId != null);\n\n\tuseEffect(() => {\n\t\tif (deleting) return;\n\t\tonEditing &&\n\t\t\tonEditing(\n\t\t\t\tisEditing,\n\t\t\t\tdata.find((d) => d.id === editingId),\n\t\t\t);\n\t\tonEditModeToggle && onEditModeToggle(isEditing);\n\t}, [data, isEditing]);\n\n\tuseEffect(() => {\n\t\tsetIsEditing(editingId != null);\n\t}, [editingId]);\n\n\tconst handleEditCancel = useCallback(() => {\n\t\tsetIsEditing(false);\n\t}, []);\n\n\tconst schemaKeys = Object.keys(schema);\n\n\treturn (\n\t\t\n\t\t\t{data.map((datum, idx) => {\n\t\t\t\tif (datum.id == null) return null;\n\t\t\t\tconst commonProps = {\n\t\t\t\t\tkey: datum.id,\n\t\t\t\t\tdata: datum,\n\t\t\t\t\tschema,\n\t\t\t\t};\n\t\t\t\t// TODO: make this a hook method\n\t\t\t\t// if we should not need to make any decisions about how a cell is edited\n\t\t\t\t// the component that wishes to offer an editable table should be the one\n\t\t\t\t// to provide this - just need to work some things out as far as needs\n\t\t\t\t// We need to deal with things like extra columns (drag/actions/etc) etc\n\t\t\t\tif (editable && editingId === datum.id) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t\t\t{schemaKeys.map((key) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{datum[key]}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t
    \n\t\t\t\t);\n\t\t\t})}\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(TableBody);\n","import React, {useCallback, useRef, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {SortableContainer, SortStart} from 'react-sortable-hoc';\n\nimport TableBody, {TableBodyProps} from './TableBody';\nconst SortableTableBody = SortableContainer(TableBody);\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\t'& tr': {\n\t\t\t\t'& td': {\n\t\t\t\t\tborderColor: 'transparent',\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t'&::after': {\n\t\t\t\t\t\tcontent: '\"\"',\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\tbackground: theme.palette.mode === 'light' ? '#e0e0e0' : '#515151',\n\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\tzIndex: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&.sorting': {\n\t\t\t\t// Make sure we take over transitions for this\n\t\t\t\ttransitionProperty: 'transform',\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\tuserSelect: 'none',\n\t\t\t},\n\t\t},\n\t});\n\ninterface SortableBodyProps extends TableBodyProps {\n\tclassName?: string;\n}\n\nexport interface SortableProps extends SortableBodyProps {\n\tclassName?: string;\n\tonReorder(oldIndex: number, newIndex: number): void;\n}\n\nconst Sortable: React.FunctionComponent<\n\tWithStyles & SortableProps\n> = ({className, classes, onReorder, TableRowProps, ...props}) => {\n\tconst [rowSorting, setRowSorting] = useState(-1);\n\t// will store the wrapper object for react-sortable-hoc\n\t// cannot seem to qork out a quick typing for it yet\n\tconst sortableRef = useRef();\n\n\tconst handleUpdateBeforeStart = useCallback(({index}: SortStart) => {\n\t\tsetRowSorting(index);\n\t}, []);\n\n\tconst handleSortEnd = useCallback(\n\t\t({oldIndex, newIndex}) => {\n\t\t\tsetRowSorting(-1);\n\t\t\tonReorder(oldIndex, newIndex);\n\t\t},\n\t\t[onReorder],\n\t);\n\n\treturn (\n\t\t -1,\n\t\t\t})}\n\t\t\treorderable={true}\n\t\t\tref={sortableRef}\n\t\t\trowSorting={rowSorting}\n\t\t\tTableRowProps={{\n\t\t\t\t...TableRowProps,\n\t\t\t\tsortableRef,\n\t\t\t\treorderable: true,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport default withStyles(styles)(Sortable);\n","import React from 'react';\n\nimport TableBody, {TableBodyProps} from './TableBody';\nimport SortableTableBody, {SortableProps} from './SortableTableBody';\n\nexport {TableBody, SortableTableBody};\nexport * from './TableBody';\nexport * from './SortableTableBody';\n\nexport default function ({onReorder, ...props}) {\n\tif (onReorder)\n\t\treturn (\n\t\t\t\n\t\t);\n\treturn ;\n}\n","import React, {useCallback} from 'react';\nimport clsx from 'clsx';\n\nimport {TablePagination as MuiTablePagination} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nconst styles = ({palette}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tborderTop: `1px solid ${palette.custom.border}`,\n\t\t\tflex: '0 0 auto',\n\t\t\tposition: 'relative',\n\t\t\t'&.disabled': {\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\t'& > *': {\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&.hideData': {\n\t\t\t\t'& .MuiTablePagination-caption': {\n\t\t\t\t\tdisplay: 'none',\n\t\t\t\t},\n\t\t\t},\n\t\t\t'& .MuiTablePagination-displayedRows': {\n\t\t\t\tmargin: 0,\n\t\t\t},\n\t\t},\n\t});\n\nexport interface TablePaginationProps {\n\tcount: number;\n\tdisabled?: boolean;\n\tloading?: boolean;\n\tonChangePage: (page: number) => void;\n\tpage?: number;\n\trowsPerPage?: number;\n}\n\n// TODO: Really not sure why mui TablePagination is using type instead of interface\n// ideally you would extend the interface on the props above - and all other components\n// I have encountered in mui are interfaces and not types :/\n// And it is excessively deep and possibly infinite\n\nconst TablePagination: React.FunctionComponent<\n\tWithStyles & TablePaginationProps\n> = ({\n\tclasses,\n\n\tcount,\n\tdisabled,\n\tloading,\n\tonChangePage,\n\tpage = 0,\n\trowsPerPage = 50,\n\n\t...props\n}) => {\n\tconst handleChangePage = useCallback(\n\t\t(\n\t\t\tevent: React.MouseEvent | null,\n\t\t\tpage: number,\n\t\t) => {\n\t\t\tonChangePage(page);\n\t\t},\n\t\t[onChangePage],\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default withStyles(styles)(TablePagination);\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {Toolbar as MuiToolbar, Typography} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport SearchFilter from '../../SearchFilter';\n\nconst styles = ({spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tflex: '0 0 auto',\n\t\t\tpaddingLeft: spacing(2),\n\t\t\tpaddingRight: spacing(2),\n\t\t\tposition: 'relative',\n\t\t\tzIndex: 2,\n\t\t\t'&.disabled': {\n\t\t\t\topacity: 0.5,\n\t\t\t\tpointerEvents: 'none',\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tflex: '0 0 auto',\n\t\t\tmarginRight: spacing(2),\n\t\t},\n\t\tcontrols: {\n\t\t\tmarginLeft: spacing(1),\n\t\t},\n\t\ttitle: {\n\t\t\tflex: '1 1 100%',\n\t\t},\n\t});\n\nexport type TableToolbarProps = React.PropsWithChildren<{\n\tclassName?: string;\n\tdisabled?: boolean;\n\tfilterStr?: string;\n\tinEditMode?: boolean;\n\tloading?: boolean;\n\tonFilter?: (filterStr: string) => void;\n\ttitle: string;\n\ttotalRows: number;\n}>;\n\nconst TableToolbar = ({\n\tchildren,\n\tclasses,\n\n\tclassName,\n\tdisabled,\n\tfilterStr = '',\n\tinEditMode,\n\tloading,\n\tonFilter,\n\ttitle,\n\ttotalRows,\n}: WithStyles & TableToolbarProps) => {\n\tdisabled = disabled || inEditMode;\n\n\treturn (\n\t\t\n\t\t\t{children ? (\n\t\t\t\t\n\t\t\t\t\t{children}\n\t\t\t\t\n\t\t\t) : null}\n\n\t\t\t\n\t\t\t\t{title}\n\t\t\t\n\n\t\t\t{onFilter ? (\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t) : null}\n\t\t
    \n\t);\n};\n\nexport default withStyles(styles)(TableToolbar);\n","import React, {useCallback, useEffect, useState} from 'react';\nimport clsx from 'clsx';\n\nimport arrayMove from 'array-move';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {\n\tLinearProgress,\n\tPaper,\n\tTable as MuiTable,\n\tTableContainer,\n} from '@mui/material';\nimport type {TableProps as MuiTableProps} from '@mui/material/Table';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {ReactAction as Action} from '@netx/core/bootstrap';\nimport {SortDTO, SortOrder} from '@netx/core-app/models/sorter';\n\nimport {withErrorBoundary} from '../ErrorBoundary';\n\nimport {TableRowData} from '.';\nimport TableHead, {TableHeadProps} from './TableHead';\nimport TableBody, {TableBodyProps} from './TableBody';\nimport TablePagination, {TablePaginationProps} from './TablePagination';\nimport TableToolbar, {TableToolbarProps} from './TableToolbar';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tflexDirection: 'column',\n\t\t\tmarginTop: theme.spacing(3),\n\t\t\tminHeight: 0,\n\t\t\tpadding: theme.spacing(0, 2),\n\t\t\twidth: '100%',\n\t\t},\n\t\tdisabled: {\n\t\t\topacity: 0.5,\n\t\t\tpointerEvents: 'none',\n\t\t},\n\t\tprogress: {\n\t\t\tmarginTop: -2,\n\t\t\tposition: 'absolute',\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\ttop: 0,\n\t\t},\n\t\tpaper: {\n\t\t\tborder: `1px solid ${theme.palette.custom.border}`,\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tflexDirection: 'column',\n\t\t\twidth: '100%',\n\t\t\tmarginBottom: theme.spacing(2),\n\t\t\tminHeight: 0,\n\t\t\toverflow: 'hidden',\n\t\t\tposition: 'relative',\n\t\t},\n\t\ttable: {\n\t\t\tminWidth: '100%',\n\t\t\tmargin: 'auto',\n\t\t\tmaxWidth: 'initial',\n\t\t\t//minWidth: 1280,\n\t\t\t//whiteSpace: 'nowrap',\n\t\t\t//tableLayout: 'fixed',\n\t\t\twidth: '100%',\n\t\t},\n\t\ttableContainer: {\n\t\t\tflex: '1 1 auto',\n\t\t\tminHeight: 0,\n\t\t\toverflow: 'auto',\n\t\t\tposition: 'relative',\n\t\t\twidth: '100%',\n\t\t\tzIndex: 1,\n\t\t},\n\t\temptyFallback: {\n\t\t\tborderTop: `1px solid ${theme.palette.custom.border}`,\n\t\t\tposition: 'absolute',\n\t\t\ttop: 0,\n\t\t\tbottom: 0,\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\tbackground: theme.palette.custom.background?.accent,\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\tflexDirection: 'column',\n\t\t},\n\t\temptyTable: {},\n\t});\n\nexport type OnSort = (\n\tfield: string,\n\torder: false | SortOrder,\n\ttableState?: any,\n) => void;\nexport {SortDTO, SortOrder};\n\nexport interface TableProps {\n\t/** Table actions (for rows) */\n\tactions?: Action[];\n\tcontextActions?: Action[];\n\tcanReorder?: boolean;\n\tonReorder?: (oldIndex: number, newIndex: number) => void;\n\t/** Table data */\n\tdata?: TableRowData[];\n\t/** Are we deleting a row */\n\tdeleting?: null | TableRowData;\n\t/** Need to implement */\n\tdisabled?: boolean;\n\t/** Are we editing a row */\n\tediting?: null | TableRowData;\n\t/** Will we be offering editable rows */\n\teditable?: boolean;\n\t/** What the use will see when there is no data */\n\temptyFallback?: React.ReactNode;\n\t/** Are the results filtered */\n\tfiltered?: boolean;\n\t/** What the results are filtered by */\n\tfilterStr?: string;\n\t/** What to display in the header actions of the table */\n\theaderActions?: React.ReactNode;\n\t/** Are we loading table data */\n\tloading?: boolean;\n\tonEditing?: (isEditing: boolean, data?: TableRowData) => void;\n\t/** Request to filter table data */\n\tonFilter?: (str: string, tableState?: any) => void;\n\t/** Request to update table page */\n\tonPageChange?: (page: number, tableState?: any) => void;\n\tonRowClick?: (data: TableRowData) => void;\n\tonRowUpdate?: (oldData: TableRowData, newData: TableRowData) => void;\n\t/** Request to sort table data */\n\tonSort?: OnSort;\n\t/** Current page of table data */\n\tpage?: number;\n\t/** The rows we are showing per page of table data */\n\trowsPerPage?: number;\n\t/** Are allwoing reszing of columns */\n\tresizable?: boolean;\n\t/** Schema to use (for alignment of data as well) */\n\tschema?: any;\n\t/** Should we show the empty fallback */\n\tshowEmptyFallback?: boolean;\n\t/** Column names that can be sorted */\n\tsortable?: string[];\n\t/** The current sorted field */\n\tsortField?: string;\n\t/** The current sorted order */\n\tsortOrder?: 'asc' | 'desc';\n\t/** If editable, are we submitting data */\n\tsubmitting?: boolean;\n\t/** If editable, do we have an error from submitting data */\n\tsubmitError?: null | string;\n\t/** Table title */\n\ttitle?: string;\n\t/** Total size of table data */\n\ttotal?: number;\n\n\tTableBodyProps?: Partial;\n\tTableHeadProps?: Partial;\n\tTablePaginationProps?: Partial;\n\tTableProps?: Partial;\n\tTableToolbarProps?: Partial;\n}\n\nconst Table: React.FunctionComponent<\n\tWithStyles & TableProps\n> = ({\n\tclasses,\n\n\tactions = [],\n\tcanReorder,\n\tcontextActions,\n\tdata = [],\n\tdeleting,\n\tdisabled,\n\tediting,\n\teditable = false,\n\temptyFallback,\n\tfiltered = false,\n\tfilterStr = '',\n\theaderActions,\n\tloading = false,\n\tonEditing,\n\tonFilter,\n\tonPageChange,\n\tonReorder,\n\tonRowClick,\n\tonRowUpdate,\n\tonSort,\n\tpage = 0,\n\ttotal,\n\tresizable = true,\n\trowsPerPage = 25,\n\tschema = {},\n\tshowEmptyFallback = true,\n\tsortable = [],\n\tsortField,\n\tsortOrder,\n\tsubmitting,\n\tsubmitError,\n\ttitle = '',\n\n\tTableBodyProps,\n\tTableHeadProps,\n\tTablePaginationProps,\n\tTableProps,\n\tTableToolbarProps,\n}) => {\n\tconst [tableData, setTableData] = useState(data);\n\tconst [inEditMode, setInEditMode] = useState(false);\n\n\tconst _canReorder = !filtered && canReorder && onReorder != null;\n\n\tuseEffect(() => {\n\t\tsetTableData(data);\n\t}, [data]);\n\n\tconst handleChangePage = useCallback((page: number) => onPageChange?.(page), [\n\t\tonPageChange,\n\t]);\n\n\tconst handleFilter = useCallback(\n\t\t(filterStr: string) => {\n\t\t\tif (onFilter) {\n\t\t\t\tonFilter(filterStr);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Defualt (client-side) filter\n\t\t\tconst keys = Object.keys(schema);\n\t\t\tfilterStr = filterStr.toLowerCase();\n\t\t\tsetTableData(\n\t\t\t\tdata.filter((d) =>\n\t\t\t\t\tkeys.some((key) => {\n\t\t\t\t\t\tconst value = (d[key] + '').toLowerCase();\n\t\t\t\t\t\treturn value.includes(filterStr) || value === filterStr;\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t},\n\t\t[data, onFilter],\n\t);\n\n\tconst handleReorder = useCallback(\n\t\t(oldIndex: number, newIndex: number) => {\n\t\t\tif (oldIndex === newIndex) return;\n\t\t\tsetTableData(arrayMove(tableData, oldIndex, newIndex));\n\t\t\tonReorder && onReorder(oldIndex, newIndex);\n\t\t},\n\t\t[onReorder, tableData],\n\t);\n\n\tconst handleSort = useCallback(\n\t\t(field, order) => {\n\t\t\t// TODO: if onSort is not defined we do a client side sort\n\t\t\tonSort && onSort(field, order);\n\t\t},\n\t\t[onSort],\n\t);\n\n\tconst rowCount = total !== void 0 ? total : tableData.length;\n\n\treturn (\n\t\t
    \n\t\t\t\n\t\t\t\t{loading ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\n\t\t\t\t\n\t\t\t\t\t{headerActions}\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{showEmptyFallback && !rowCount && !loading ? (\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t{emptyFallback || i18n.t('i18n.noRecords')}\n\t\t\t\t\t\t
    \n\t\t\t\t\t) : null}\n\t\t\t\t
    \n\n\t\t\t\t{onPageChange ? (\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t
    \n\t\t
    \n\t);\n};\n\nexport default withErrorBoundary(withStyles(styles)(React.memo(Table)));\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedListClasses {\n\troot: string;\n\tshowBorder: string;\n\twrapper: string;\n\tfooter: string;\n}\n\nexport const getVirtualizedListClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedList', slot);\n\nexport const virtualizedListClasses = generateUtilityClasses<\n\tkeyof VirtualizedListClasses\n>('VirtualizedList', ['root', 'showBorder', 'wrapper', 'footer']);\nexport default virtualizedListClasses;\n","import React, {useCallback, useRef, useState, useEffect} from 'react';\nimport _ from 'underscore';\nimport clsx from 'clsx';\nimport {\n\tFixedSizeList,\n\tFixedSizeListProps,\n\tListChildComponentProps,\n\tListOnItemsRenderedProps,\n} from 'react-window';\nimport ReactResizeDetector from 'react-resize-detector';\nimport InfiniteLoader from 'react-window-infinite-loader';\n\nimport {getScrollbarWidth} from '@netx/core/utils';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {combineRefs} from '@netx/core-components/util';\n\nimport {InfiniteLoaderComponentCommonProps, BaseItemData} from '../../types';\nimport {VirtualizedListPager, VirtualizedListClassicPager} from '../';\nimport {\n\tgetVirtualizedListClass,\n\tvirtualizedListClasses,\n\tVirtualizedListClasses,\n} from './virtualizedListClasses';\n\nimport {ScrollBorderReactWindow} from '@netx/core-components/ScrollBorder';\nimport useEnhancedRef from '@netx/core-components/hooks/useEnhancedRef';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\n\ntype VirtualizedListScrollBorderUtilityClassProps = WithClasses<\n\tVirtualizedListClasses,\n\t{\n\t\tshowBorder?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedListScrollBorderUtilityClassProps,\n) => {\n\tconst {classes, showBorder} = ownerState;\n\n\tconst slots = {\n\t\troot: ['root', showBorder && 'showBorder'],\n\t\tfooter: ['footer'],\n\t\twrapper: ['wrapper'],\n\t};\n\n\treturn composeClasses(slots, getVirtualizedListClass, classes);\n};\n\nconst VirtualizedListRoot = styled('div', {\n\tname: 'VirtualizedList',\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tflexDirection: 'column',\n\toverflow: 'hidden',\n\tposition: 'relative',\n\tminHeight: 0,\n}));\n\nconst VirtualizedListFooter = styled('div', {\n\tname: 'VirtualizedList',\n\tslot: 'Footer',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tpadding: theme.spacing(1),\n\talignItems: 'center',\n\tjustifyContent: 'flex-end',\n}));\n\nconst VirtualizedListWrapper = styled('div', {\n\tname: 'VirtualizedList',\n\tslot: 'Wrapper',\n})(({theme}) => ({\n\tflex: '1 1 auto',\n\toverflow: 'hidden',\n\tposition: 'relative',\n\tminHeight: 0,\n}));\n\n/**\n * Props that will be sent to the list item(s)\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n * `ChildProps` - Any additional data that should be passed to all children\n */\nexport type VirtualizedListItemProps<\n\tItemData extends BaseItemData,\n\tChildProps extends object\n> = Omit & {\n\tdata: {\n\t\trows: ItemData[];\n\t\tviewportWidth: number;\n\t\tgetListItemComponentProps?: (\n\t\t\tindex: number,\n\t\t\tdata: ItemData,\n\t\t) => Partial>;\n\t} & ChildProps;\n};\n\n/**\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n * `ChildProps` - Any additional data that should be passed to all children\n */\nexport interface VirtualizedListProps<\n\tItemData extends BaseItemData,\n\tChildProps extends object\n>\n\textends InfiniteLoaderComponentCommonProps,\n\t\tPartial<\n\t\t\tPick<\n\t\t\t\tFixedSizeListProps,\n\t\t\t\t| 'innerElementType'\n\t\t\t\t| 'outerElementType'\n\t\t\t\t| 'overscanCount'\n\t\t\t\t| 'useIsScrolling'\n\t\t\t\t| 'style'\n\t\t\t\t| 'innerRef'\n\t\t\t\t| 'outerRef'\n\t\t\t>\n\t\t>,\n\t\tWithClasses<\n\t\t\tVirtualizedListClasses,\n\t\t\t{\n\t\t\t\tchunkSize?: number;\n\t\t\t\tlistClassName?: string;\n\t\t\t\tdisableScrollShadow?: boolean;\n\t\t\t\tonOverflownChange?: (overflown: boolean) => void;\n\t\t\t\thidePager?: boolean;\n\t\t\t\tisScrolling?: (scrolling: boolean) => void;\n\t\t\t\tListItemComponent: React.ComponentType<\n\t\t\t\t\tVirtualizedListItemProps\n\t\t\t\t>;\n\t\t\t\tListItemComponentProps?: Partial<\n\t\t\t\t\tOmit\n\t\t\t\t>;\n\t\t\t\tgetListItemComponentProps?: (\n\t\t\t\t\tindex: number,\n\t\t\t\t\tdata: ItemData,\n\t\t\t\t) => Partial>;\n\t\t\t}\n\t\t> {}\n\n/**\n * Virtualized list\\\n * Virtualizes and loads data as needed\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n * `ChildProps` - Any additional data that should be passed to all children\n * @example\n {..props} />\n // if the data is all there and requires no additional fetching\n // just stub out these two methods\n \n isItemLoaded={() => true}\n loadMoreItems={async () => {}}\n />\n */\nexport const VirtualizedListPrimitive = <\n\tItemData extends BaseItemData,\n\tChildProps extends object\n>({\n\tclassName,\n\tclasses: _classes,\n\n\tdisableScrollShadow,\n\tisItemLoaded,\n\tloadMoreItems,\n\tscrollIndex = 0,\n\tonItemsRendered,\n\tonOverflownChange,\n\tonPageChange,\n\tonScrollIndexUpdate,\n\tonResize,\n\tdata,\n\tdataReady,\n\tlistClassName,\n\ttotal,\n\tvirtualListRef,\n\n\tchunkSize,\n\tpage = 1,\n\tpageSize = 25,\n\thidePager,\n\titemSize = 56,\n\tisScrolling,\n\tuseClassicPaging = false,\n\titemTotal,\n\tListItemComponent,\n\tListItemComponentProps,\n\tgetListItemComponentProps,\n\t...props\n}: VirtualizedListProps) => {\n\tconst infiniteLoaderRef = useRef(null);\n\tconst _virtualListRef = useRef(null);\n\tconst [currentPage, setCurrentPage] = useState(page || 1);\n\tconst [overflown, setOverflown] = useState(false);\n\tconst [stageSize, setStageSize] = useState({width: 0, height: 0});\n\n\tconst lastRendered = useRef({\n\t\toverscanStartIndex: 0,\n\t\toverscanStopIndex: 0,\n\t\tvisibleStartIndex: 0,\n\t\tvisibleStopIndex: 0,\n\t});\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\tshowBorder: disableScrollShadow,\n\t});\n\n\t// Store to deal with `` renders and actual size changes\n\tconst sizeRef = useRef({height: 0, width: 0});\n\n\tconst [visibleIndexes, setVisibleIndexes] = useState({\n\t\tstart: 0,\n\t\tstop: 0,\n\t});\n\n\tif (!itemTotal) itemTotal = total;\n\tif (!chunkSize) chunkSize = pageSize;\n\n\t// If data is not ready, set to `chunkSize` for skeleton loading\n\tconst totalItems = total > 0 || dataReady ? total : chunkSize;\n\tconst pageCount = Math.ceil(totalItems / pageSize);\n\tconst pageCountRef = useRef(pageCount);\n\tpageCountRef.current = pageCount;\n\n\tuseEffect(() => {\n\t\tsetCurrentPage(page || 1);\n\t}, [page]);\n\n\tuseWhenChangedEffect(page, () => {\n\t\tif (!useClassicPaging) return;\n\t\tinfiniteLoaderRef.current?.resetloadMoreItemsCache();\n\t});\n\n\tuseEffect(() => {\n\t\tinfiniteLoaderRef.current?.resetloadMoreItemsCache();\n\t\t_virtualListRef.current?.scrollTo(0);\n\t}, [dataReady]);\n\n\tuseWhenChangedEffect([currentPage], () => {\n\t\tif (!useClassicPaging) return;\n\t\t_virtualListRef.current?.scrollTo(0);\n\t});\n\n\tconst [onOverflownChangeRef] = useEnhancedRef(onOverflownChange);\n\tconst OuterElement = React.useMemo(\n\t\t() =>\n\t\t\tReact.forwardRef((props, ref) => (\n\t\t\t\t {\n\t\t\t\t\t\tonOverflownChangeRef.current?.(overflown);\n\t\t\t\t\t\tsetOverflown(overflown);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)),\n\t\t[],\n\t);\n\n\tconst handleItemsRendered = useCallback(\n\t\t(_onItemsRendered: (props: ListOnItemsRenderedProps) => void) => (\n\t\t\tprops: ListOnItemsRenderedProps,\n\t\t) => {\n\t\t\tconst {visibleStartIndex, visibleStopIndex} = props;\n\n\t\t\tlastRendered.current = props;\n\n\t\t\thandleVisiableStartIndexUpdate(visibleStartIndex, visibleStopIndex);\n\t\t\t_onItemsRendered(props);\n\t\t\tonItemsRendered?.(props);\n\t\t\tinfiniteLoaderRef.current?.forceUpdate();\n\t\t},\n\t\t[onScrollIndexUpdate, useClassicPaging, currentPage, onItemsRendered],\n\t);\n\n\tconst handleIsItemLoaded = useCallback(\n\t\t(index: number) => (!dataReady ? true : isItemLoaded(index)),\n\t\t[dataReady, isItemLoaded],\n\t);\n\n\tconst handleLoadMoreItems = useCallback(\n\t\tasync (startIndex: number, stopIndex: number) => {\n\t\t\treturn !dataReady ? undefined : loadMoreItems(startIndex, stopIndex);\n\t\t},\n\t\t[dataReady, loadMoreItems],\n\t);\n\n\t// When page changes, scroll to the item\n\tconst handlePageChange = useCallback(\n\t\t(event: any, page: number) => {\n\t\t\t_virtualListRef.current?.scrollToItem(page * pageSize, 'start');\n\t\t},\n\t\t[pageSize],\n\t);\n\n\t// Pass up the current visible start index\n\tconst handleVisiableStartIndexUpdate = useCallback(\n\t\t(visibleStartIndex: number, visibleStopIndex: number) => {\n\t\t\tif (!useClassicPaging) {\n\t\t\t\tif (isNaN(visibleStartIndex)) return;\n\t\t\t\tconst currentPage = Math.max(\n\t\t\t\t\tMath.ceil((visibleStartIndex + 1) / pageSize),\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tsetCurrentPage(currentPage);\n\t\t\t\tonScrollIndexUpdate?.(visibleStartIndex, currentPage, visibleStopIndex);\n\t\t\t} else {\n\t\t\t\tonScrollIndexUpdate?.(visibleStartIndex, page, visibleStopIndex);\n\t\t\t}\n\t\t\tsetVisibleIndexes({\n\t\t\t\tstart: visibleStartIndex,\n\t\t\t\tstop: visibleStopIndex,\n\t\t\t});\n\t\t},\n\t\t[onScrollIndexUpdate, pageSize, useClassicPaging, page],\n\t);\n\n\tconst scrollBarWidth = useRef(getScrollbarWidth());\n\n\tconst handleResize = useCallback(\n\t\t_.debounce((width: number, height: number) => {\n\t\t\tif (\n\t\t\t\tsizeRef.current.width !== width ||\n\t\t\t\tsizeRef.current.height !== height\n\t\t\t) {\n\t\t\t\tsizeRef.current = {width, height};\n\t\t\t\tsetStageSize({width, height});\n\t\t\t\tconst subtractFromWidth = overflown ? scrollBarWidth.current : 0;\n\t\t\t\tonResize?.(width - subtractFromWidth, height);\n\t\t\t}\n\t\t}, 16),\n\t\t[overflown, onResize],\n\t);\n\n\tuseWhenChangedEffect(overflown, (overflown) => {\n\t\tconst subtractFromWidth = overflown ? scrollBarWidth.current : 0;\n\t\tonResize?.(\n\t\t\tsizeRef.current.width - subtractFromWidth,\n\t\t\tsizeRef.current.height,\n\t\t);\n\t});\n\n\tuseEffect(() => {\n\t\tif (!infiniteLoaderRef.current) return;\n\t\thandleItemsRendered((infiniteLoaderRef.current as any)._onItemsRendered)(\n\t\t\tlastRendered.current,\n\t\t);\n\t}, [itemTotal, dataReady]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\thandleHeight\n\t\t\t\thandleWidth\n\t\t\t\tonResize={handleResize}\n\t\t\t>\n\t\t\t\t{({targetRef}) => (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{({onItemsRendered, ref}) => (\n\t\t\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\t\t\treturn data.id || index;\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\titemSize={itemSize}\n\t\t\t\t\t\t\t\t\t// Utilize the scroll index passed in to get to the right spot in the list\n\t\t\t\t\t\t\t\t\tinitialScrollOffset={itemSize * scrollIndex}\n\t\t\t\t\t\t\t\t\tonItemsRendered={handleItemsRendered(onItemsRendered)}\n\t\t\t\t\t\t\t\t\tref={combineRefs(\n\t\t\t\t\t\t\t\t\t\tref,\n\t\t\t\t\t\t\t\t\t\t_virtualListRef,\n\t\t\t\t\t\t\t\t\t\tvirtualListRef,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\twidth={stageSize.width}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ListItemComponent}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\n\t\t\t{!hidePager ? (\n\t\t\t\t\n\t\t\t\t\t{useClassicPaging ? (\n\t\t\t\t\t\t onPageChange?.(page + 1)}\n\t\t\t\t\t\t\tpage={page - 1}\n\t\t\t\t\t\t\trowsPerPage={pageSize}\n\t\t\t\t\t\t\tgetItemAriaLabel={(type) => `Go to ${type} page`}\n\t\t\t\t\t\t\tshowFirstButton={pageCount > 1}\n\t\t\t\t\t\t\tshowLastButton={pageCount > 1}\n\t\t\t\t\t\t\tloading={!dataReady}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t 1}\n\t\t\t\t\t\t\tshowLastButton={pageCount > 1}\n\t\t\t\t\t\t\tgetItemAriaLabel={(type) => `Go to ${type} page`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t) : null}\n\t\t\n\t);\n};\n\nexport const VirtualizedList = React.memo(VirtualizedListPrimitive) as <\n\tItemData extends BaseItemData,\n\tChildProps extends object\n>(\n\tprops: VirtualizedListProps,\n) => JSX.Element;\n\nexport default VirtualizedList;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedListScrollBorderClasses {\n\troot: string;\n\tactive: string;\n\tscrollEnd: string;\n\tscrolled: string;\n}\n\nexport const getVirtualizedListScrollBorderClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedListScrollBorder', slot);\n\nexport const virtualizedListScrollBorderClasses = generateUtilityClasses<\n\tkeyof VirtualizedListScrollBorderClasses\n>('VirtualizedListScrollBorder', ['root', 'active', 'scrollEnd', 'scrolled']);\nexport default virtualizedListScrollBorderClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {\n\tgetVirtualizedListScrollBorderClass,\n\tvirtualizedListScrollBorderClasses,\n\tVirtualizedListScrollBorderClasses,\n} from './virtualizedListScrollBorderClasses';\n\ntype VirtualizedListScrollBorderUtilityClassProps = WithClasses<\n\tVirtualizedListScrollBorderClasses,\n\t{\n\t\tactive?: boolean;\n\t\tscrolled?: boolean;\n\t\tscrollEnd?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedListScrollBorderUtilityClassProps,\n) => {\n\tconst {classes, active, scrollEnd, scrolled} = ownerState;\n\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\tactive && 'active',\n\t\t\tscrollEnd && 'scrollEnd',\n\t\t\tscrolled && 'scrolled',\n\t\t],\n\t};\n\n\treturn composeClasses(slots, getVirtualizedListScrollBorderClass, classes);\n};\n\nconst VirtualizedListScrollBorderRoot = styled('div', {\n\tname: 'VirtualizedList',\n\tslot: 'Root',\n})(({theme}) => ({\n\tbottom: 0,\n\tleft: 0,\n\tpointerEvents: 'none',\n\tposition: 'absolute',\n\ttop: 0,\n\twidth: '100%',\n\tzIndex: 5,\n\tborder: `1px solid transparent`,\n\tborderLeft: 0,\n\tborderRight: 0,\n\t[`&.${virtualizedListScrollBorderClasses.active}`]: {\n\t\t[`&.${virtualizedListScrollBorderClasses.scrolled}`]: {\n\t\t\tborderTopColor: theme.palette.custom.border,\n\t\t},\n\t\t[`&:not(.${virtualizedListScrollBorderClasses.scrollEnd})`]: {\n\t\t\tborderBottomColor: theme.palette.custom.border,\n\t\t},\n\t},\n}));\n\nexport interface VirtualizedListScrollBorderProps\n\textends WithClasses<\n\t\tVirtualizedListScrollBorderClasses,\n\t\t{\n\t\t\tscrolled: boolean;\n\t\t\tactive: boolean;\n\t\t\tscrollEnd: boolean;\n\t\t}\n\t> {}\n\nexport const VirtualizedListScrollBorderPrimitive = ({\n\tclassName,\n\t...props\n}: VirtualizedListScrollBorderProps) => {\n\tconst classes = useUtilityClasses(props);\n\n\treturn (\n\t\t\n\t);\n};\n\nexport const VirtualizedListScrollBorder = React.memo(\n\tVirtualizedListScrollBorderPrimitive,\n);\n\nexport default VirtualizedListScrollBorder;\n","import React from 'react';\n\nimport {\n\tstyled,\n\tSeverity,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\nimport Alert, {AlertProps} from '../Alert';\n\nconst DialogAlertRoot = styled(Alert, {\n\tname: 'DialogAlert',\n\tslot: 'Root',\n})(({theme}) => ({\n\tmargin: theme.spacing(1, 2, 2, 2),\n}));\n\nexport interface DialogAlertProps extends WithMuiPropOverrides {}\n\n/** NetX Dialog Alert */\nconst DialogAlertPrimitive = React.forwardRef(\n\t(props, ref) => (\n\t\t\n\t),\n);\n\nexport const DialogAlert = React.memo(DialogAlertPrimitive);\nexport default DialogAlert;\n","import React from 'react';\nimport type {SetOptional} from 'type-fest';\nimport {FontAwesomeIconProps} from '@fortawesome/react-fontawesome';\nimport {\n\tAlertColor,\n\tDialog as MuiDialog,\n\tDialogProps as MuiDialogProps,\n\tLinearProgress,\n\tSlide,\n\tSlideProps,\n} from '@mui/material';\nimport type {TransitionProps} from '@mui/material/transitions';\nimport {DialogAlert, DialogAlertProps} from '../DialogAlert';\nimport DialogTitle from '../DialogTitle';\nimport {styled, WithMuiPropOverrides} from '../Theme';\n\nconst DialogProgress = styled(LinearProgress, {\n\tslot: 'Progress',\n})(({theme}) => ({\n\t...theme.mixins.absoluteFill,\n\tbottom: 'initial',\n}));\n\nconst Transition: React.FunctionComponent = React.forwardRef<\n\tHTMLElement,\n\tSlideProps\n>(function Transition(props, ref) {\n\treturn ;\n});\n\nexport interface DialogProps\n\textends Omit, 'title'> {\n\t// TODO: why missing?\n\t'data-testid'?: string;\n\t// Not currently being used but here for future use\n\tdisabled?: boolean;\n\terror?: null | string;\n\tisWorking?: boolean;\n\tseverity?: AlertColor;\n\ttitle?: React.ReactNode;\n\tsecondaryTitle?: React.ReactNode;\n\ticon?: FontAwesomeIconProps['icon'];\n\tcontrols?: React.ReactNode;\n\tpreventBackdropClose?: boolean;\n\n\tDialogAlertProps?: Partial;\n}\n\nexport type WithDialogProps

    = P &\n\tPick & {\n\t\tDialogProps?: SetOptional, 'title'>;\n\t};\n\n/**\n * NetX Dialog\n * Provides a consistent animation/experience\n */\nconst DialogPrimitive = React.forwardRef(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tcontrols,\n\t\t\tdisabled,\n\t\t\terror,\n\t\t\ticon,\n\t\t\tisWorking,\n\t\t\tpreventBackdropClose,\n\t\t\tonClose,\n\t\t\tsecondaryTitle,\n\t\t\t// TODO: severity styling support for 'danger' / 'info' / 'warning' / 'success'\n\t\t\tseverity = 'info',\n\t\t\ttitle,\n\t\t\tDialogAlertProps,\n\t\t\t...props\n\t\t}: DialogProps,\n\t\tref,\n\t) => {\n\t\tconst handleClose = onClose\n\t\t\t? () => onClose({}, 'escapeKeyDown')\n\t\t\t: undefined;\n\n\t\treturn (\n\t\t\t {\n\t\t\t\t\tif (preventBackdropClose && reason === 'backdropClick') return;\n\t\t\t\t\tonClose?.(event, reason);\n\t\t\t\t}}\n\t\t\t\tref={ref}\n\t\t\t\tTransitionComponent={Transition}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{isWorking ? : null}\n\t\t\t\t{(title && (\n\t\t\t\t\t\n\t\t\t\t)) ||\n\t\t\t\t\tnull}\n\n\t\t\t\t{error != null ? (\n\t\t\t\t\t{error}\n\t\t\t\t) : null}\n\n\t\t\t\t{children}\n\t\t\t\n\t\t);\n\t},\n);\n\nexport const Dialog = React.memo(DialogPrimitive) as (\n\tprops: DialogProps,\n) => JSX.Element;\nexport default Dialog;\n","import {useCallback, useEffect, useRef, useState} from 'react';\nimport {asyncForEach, uniqueArray} from '@netx/core/utils';\nimport {getAttributeFieldSet} from '../api/getAttributeFieldSet';\nimport type {AttributeSet, AttributeSetId} from '../types';\nimport {useAttributeProvider, AttributeContextType} from '@netx/core-attribute';\nimport type {\n\tAttributeTemplate,\n\tAttributeId,\n\tLookups,\n\tAttributeObjectType,\n} from '@netx/core-attribute';\n\nimport attributeSetsSingleton from '@netx/core-asset/collections/singleton/attributeSets';\nimport useBackboneCollection from '@netx/core-components/hooks/useBackboneCollection';\nimport {useUpdateEffect} from '@netx/core-components/hooks/useUpdateEffect';\n\n// TODO: move to util or to the attributes context\n// The logic for these two things are identical, save the prop being checked\nconst getLookupThing = (\n\tlookups: Lookups,\n\tattributeTemplates: AttributeTemplate[],\n\tthing: keyof Lookups,\n) => {\n\treturn lookups[thing].filter((key) => {\n\t\tconst attr = attributeTemplates.find((attr) => attr.attributeid === key);\n\t\tconst prop = thing === 'keys' ? 'keyDatasets' : 'targetDatasets';\n\t\tconst otherProp = thing === 'keys' ? 'targetDatasets' : 'keyDatasets';\n\t\treturn attr?.[prop].some((keyId) =>\n\t\t\tattributeTemplates.some((attr) => attr[otherProp].includes(keyId)),\n\t\t);\n\t});\n};\n\nexport type UseAttributeSetParams = {\n\tinjectMandatory?: boolean;\n\tomitReadOnly?: boolean;\n\tobjectType?: AttributeObjectType;\n};\n\nexport const useAttributeSet = ({\n\tinjectMandatory,\n\tomitReadOnly: _omitReadOnly,\n\tobjectType,\n}: UseAttributeSetParams) => {\n\tconst attributesProvider = useAttributeProvider();\n\n\tconst [data, setData] = useState([]);\n\tconst [loading, setLoading] = useState(\n\t\t!attributeSetsSingleton.syncedOnce || attributeSetsSingleton.syncing,\n\t);\n\n\tconst userSetIdsRef = useRef>({});\n\n\t// TODO: until we can wrap the entire app in we just need to utilize the singleton\n\t// and provide some bridging between that and the context\n\tconst attributeSets = useBackboneCollection(attributeSetsSingleton, false);\n\tconst attributeSetFilters = useBackboneCollection(\n\t\tattributeSetsSingleton.filters,\n\t\tfalse,\n\t);\n\tconst attributeSetFiltersRef = useRef(attributeSetFilters);\n\n\t// track when the backbone collection is loading (syncing)\n\tuseUpdateEffect(() => {\n\t\tsetLoading(\n\t\t\t!attributeSetsSingleton.syncedOnce || attributeSetsSingleton.syncing,\n\t\t);\n\t}, [attributeSetsSingleton.syncedOnce, attributeSetsSingleton.syncing]);\n\n\t// track updates to the underlying backbone collection data\n\tuseEffect(() => {\n\t\tuserSetIdsRef.current = {};\n\t\tsetData(attributeSets);\n\t\t// dispatch({type: ACTIONS.UPDATE, data: attributeSets});\n\t}, [attributeSets]);\n\n\tconst getFilterById = useCallback(\n\t\t(id: AttributeSetId) =>\n\t\t\tattributeSetFiltersRef.current.find((attrSet) => attrSet.id === id),\n\t\t[],\n\t);\n\n\tconst getById = useCallback(\n\t\t(id: AttributeSetId, includeInactive = false) =>\n\t\t\tdata.find(\n\t\t\t\t(attrSet) =>\n\t\t\t\t\t(attrSet.active !== 0 || includeInactive) && attrSet.id === id,\n\t\t\t),\n\t\t[data],\n\t);\n\n\tconst getByIds = useCallback(\n\t\t(ids: AttributeSetId[], includeInactive = false) =>\n\t\t\tdata.filter(\n\t\t\t\t(attrSet) =>\n\t\t\t\t\t(attrSet.active !== 0 || includeInactive) && ids.includes(attrSet.id),\n\t\t\t),\n\t\t[data],\n\t);\n\n\t// do not confuse sets for sets selection, when \"all\" are requested, use `all`\n\tconst getAllAttributeTemplateIds = useCallback(\n\t\t(omitSystem = false) =>\n\t\t\t(data.find((d) => d.id === 'all')?.attributeIds || []).filter(\n\t\t\t\t(id) => id > -1 || !omitSystem,\n\t\t\t),\n\t\t[data],\n\t);\n\n\t// this is async due to user sets being shared resources\n\t// that need to be fetched in full to get the `attributeIds`\n\tconst getAttributeTemplatesById = useCallback(\n\t\tasync (id: AttributeSetId, omitSystem = false, omitReadOnly = false) => {\n\t\t\tconst attributeSet = getById(id);\n\t\t\tif (!attributeSet) return [];\n\n\t\t\tconst getTemplates = (attributeIds: number[]) => {\n\t\t\t\tconst mandatoryTemplates = attributesProvider\n\t\t\t\t\t.getAll(omitSystem, _omitReadOnly || omitReadOnly, objectType)\n\t\t\t\t\t.filter((attr) => attr.mandatory);\n\t\t\t\tconst mandatoryTemplateIds = mandatoryTemplates.map(\n\t\t\t\t\t(attr) => attr.attributeid,\n\t\t\t\t);\n\t\t\t\tconst templates = attributesProvider.getByIds(\n\t\t\t\t\tattributeIds,\n\t\t\t\t\tomitSystem,\n\t\t\t\t\tobjectType,\n\t\t\t\t\t_omitReadOnly || omitReadOnly,\n\t\t\t\t);\n\t\t\t\treturn injectMandatory\n\t\t\t\t\t? mandatoryTemplates.concat(\n\t\t\t\t\t\t\ttemplates.filter(\n\t\t\t\t\t\t\t\t(attr) => !mandatoryTemplateIds.includes(attr.attributeid),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t )\n\t\t\t\t\t: templates;\n\t\t\t};\n\n\t\t\tif (id.match(/^user-/)) {\n\t\t\t\tconst attributeIds = (userSetIdsRef.current[id] = userSetIdsRef.current[\n\t\t\t\t\tid\n\t\t\t\t]\n\t\t\t\t\t? userSetIdsRef.current[id]\n\t\t\t\t\t: (\n\t\t\t\t\t\t\tawait getAttributeFieldSet({\n\t\t\t\t\t\t\t\tid: parseInt(id.replace(/^user-/, '')),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t ).attributeIds);\n\n\t\t\t\treturn getTemplates(attributeIds);\n\t\t\t}\n\n\t\t\treturn getTemplates(attributeSet.attributeIds);\n\t\t},\n\t\t[\n\t\t\tgetById,\n\t\t\tattributesProvider.state,\n\t\t\tinjectMandatory,\n\t\t\t_omitReadOnly,\n\t\t\tobjectType,\n\t\t],\n\t);\n\n\tconst getAttributeTemplatesByIds = useCallback(\n\t\tasync (ids: AttributeSetId[], omitSystem = false, omitReadOnly = false) => {\n\t\t\tlet attributeTemplates: AttributeTemplate[] = [];\n\t\t\tawait asyncForEach(ids, async (id) => {\n\t\t\t\tattributeTemplates = attributeTemplates.concat(\n\t\t\t\t\tawait getAttributeTemplatesById(\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tomitSystem,\n\t\t\t\t\t\t_omitReadOnly || omitReadOnly,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn [...new Set(attributeTemplates)];\n\t\t},\n\t\t[getAttributeTemplatesById, _omitReadOnly],\n\t);\n\n\tconst getAttributeTemplateIdsById = useCallback(\n\t\tasync (id: AttributeSetId, omitSystem = false, omitReadOnly = false) =>\n\t\t\t(\n\t\t\t\tawait getAttributeTemplatesById(\n\t\t\t\t\tid,\n\t\t\t\t\tomitSystem,\n\t\t\t\t\t_omitReadOnly || omitReadOnly,\n\t\t\t\t)\n\t\t\t).map((attr) => attr.attributeid),\n\t\t[getAttributeTemplatesById, _omitReadOnly],\n\t);\n\n\tconst getAttributeTemplateIdsByIds = useCallback(\n\t\tasync (ids: AttributeSetId[], omitSystem = false, omitReadOnly = false) =>\n\t\t\t(\n\t\t\t\tawait getAttributeTemplatesByIds(\n\t\t\t\t\tids,\n\t\t\t\t\tomitSystem,\n\t\t\t\t\t_omitReadOnly || omitReadOnly,\n\t\t\t\t)\n\t\t\t).map((attr) => attr.attributeid),\n\t\t[getAttributeTemplatesByIds, _omitReadOnly],\n\t);\n\n\tconst getMetadataLookupsById = useCallback(\n\t\tasync (id: AttributeSetId) => {\n\t\t\tconst {lookups} = attributesProvider.state;\n\t\t\tconst attributeTemplates = await getAttributeTemplatesById(id);\n\t\t\treturn {\n\t\t\t\tkeys: getLookupThing(lookups, attributeTemplates, 'keys'),\n\t\t\t\ttargets: getLookupThing(lookups, attributeTemplates, 'targets'),\n\t\t\t};\n\t\t},\n\t\t[attributesProvider.state],\n\t);\n\n\tconst getMetadataLookupsByIds = useCallback(\n\t\tasync (ids: AttributeSetId[]) => {\n\t\t\tconst lookups = attributesProvider.state.lookups;\n\t\t\tconst attributeTemplates = await getAttributeTemplatesByIds(ids);\n\t\t\tconst mer = {\n\t\t\t\tkeys: uniqueArray(getLookupThing(lookups, attributeTemplates, 'keys')),\n\t\t\t\ttargets: uniqueArray(\n\t\t\t\t\tgetLookupThing(lookups, attributeTemplates, 'targets'),\n\t\t\t\t),\n\t\t\t};\n\t\t\treturn mer;\n\t\t},\n\t\t[attributesProvider.state, injectMandatory, _omitReadOnly],\n\t);\n\n\tconst getSelectable = useCallback(\n\t\t(ignoreSystemMandatory = false, ignoreUserMandatory = false) => {\n\t\t\tconst sets =\n\t\t\t\tignoreSystemMandatory &&\n\t\t\t\t(ignoreUserMandatory ||\n\t\t\t\t\t!attributesProvider.state.hasMandatoryUserDefinedTemplates)\n\t\t\t\t\t? data.filter((d) => d.id !== 'mandatory')\n\t\t\t\t\t: data;\n\n\t\t\t// filter out system sets that do not have any available attributes\n\t\t\treturn sets.filter(\n\t\t\t\t(set) =>\n\t\t\t\t\tset.id.includes('user') ||\n\t\t\t\t\tattributesProvider.getByIds(set.attributeIds, false, objectType)\n\t\t\t\t\t\t.length > 0,\n\t\t\t);\n\t\t},\n\t\t[\n\t\t\tdata,\n\t\t\tobjectType,\n\t\t\tattributesProvider.state.hasMandatoryUserDefinedTemplates,\n\t\t],\n\t);\n\n\treturn {\n\t\tdata,\n\t\tloading,\n\t\t// track loading of templates, sets cannot load templates until attributes are ready\n\t\tloadingTemplates: attributesProvider.state.loading,\n\n\t\tattributesCtx: attributesProvider,\n\n\t\tgetAllAttributeTemplateIds,\n\t\tgetAttributeTemplatesById,\n\t\tgetAttributeTemplatesByIds,\n\t\tgetAttributeTemplateIdsById,\n\t\tgetAttributeTemplateIdsByIds,\n\t\tgetById,\n\t\tgetByIds,\n\t\tgetFilterById,\n\t\tgetMetadataLookupsById,\n\t\tgetMetadataLookupsByIds,\n\t\tgetSelectable,\n\t};\n};\n\nexport default useAttributeSet;\n","import React, {\n\tcreateContext,\n\tuseContext,\n\tuseImperativeHandle,\n\tuseMemo,\n} from 'react';\n\nimport {useAttributeSet} from '../hooks/useAttributeSet';\nimport type {ArgumentsType} from '@netx/core/typings';\n\nexport type AttributeSetContextType = ReturnType;\n\nconst AttributeSetContext = createContext(\n\tundefined,\n);\n\nexport const useAttributeSetProvider = () => {\n\tconst context = useContext(AttributeSetContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t'`useAttributeSetProvider` must be used within a `AttributeSetProvider`',\n\t\t);\n\t}\n\treturn context;\n};\n\nexport type AttributeSetProviderRef = React.RefObject;\n\nexport type AttributeSetProviderChildrenProps = AttributeSetContextType;\n\nexport type AttributeSetProviderProps = ArgumentsType<\n\ttypeof useAttributeSet\n>[0] & {\n\tref?: AttributeSetProviderRef;\n\tchildren:\n\t\t| React.ReactNode\n\t\t| ((props: AttributeSetProviderChildrenProps) => React.ReactNode);\n};\n\nconst AttributeSetProviderInner = (\n\t{children, ...props}: AttributeSetProviderProps,\n\tref: AttributeSetProviderRef,\n) => {\n\tconst attributeSet = useAttributeSet(props);\n\n\tuseImperativeHandle(ref, () => attributeSet, [attributeSet]);\n\n\tconst contextValue = useMemo(() => attributeSet, [attributeSet]);\n\n\treturn (\n\t\t\n\t\t\t{typeof children === 'function' ? children(contextValue) : children}\n\t\t\n\t);\n};\n\nexport const AttributeSetProviderPrimitive = React.forwardRef<\n\tAttributeSetContextType,\n\tAttributeSetProviderProps\n>(AttributeSetProviderInner);\n\n/**\n * Attribute set context provider\n * @example\n * \n * \t...\n * \n * @example\n * \n * \t{(attributeSet) => (\n * \t\t...\n * \t)}\n * \n */\nexport const AttributeSetProvider = AttributeSetProviderPrimitive;\n\nexport default AttributeSetProvider;\n","import React, {useCallback} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {faUsers} from '@fortawesome/pro-solid-svg-icons';\nimport AutoListField, {\n\tCommenExtendProps,\n\tOption,\n} from '@netx/core-components/Form/AutoListField';\nimport getUserAutoList, {UserAutoListItem} from '../../api/getUserAutoList';\nexport {UserAutoListItem} from '../../api/getUserAutoList';\n\nexport type UserAutoListRef = React.ForwardedRef;\n\nexport type UserAutoListProps<\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false,\n> = CommenExtendProps & {\n\tavatar?: boolean;\n\tfilterUsers?: (users: UserAutoListItem[]) => UserAutoListItem[];\n};\n\nconst getOptionLabel = (option: UserAutoListItem) => option?.label;\nconst getOptionSelected = (\n\toption?: UserAutoListItem,\n\tvalue?: UserAutoListItem,\n) => {\n\treturn option?.value === value?.value;\n};\n\nconst UserAutoListInner = <\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false,\n>(\n\t{\n\t\tavatar,\n\t\tfilterUsers,\n\t\t...props\n\t}: UserAutoListProps,\n\tref: UserAutoListRef,\n) => {\n\tconst renderAvatarOption = useCallback(\n\t\t(props, option, state) => (\n\t\t\t\n\t\t),\n\t\t[],\n\t);\n\n\tconst handleLookup = useCallback(\n\t\tasync (query) => {\n\t\t\tconst users = await getUserAutoList({\n\t\t\t\tquery,\n\t\t\t});\n\t\t\treturn filterUsers ? filterUsers(users) : users;\n\t\t},\n\t\t[filterUsers],\n\t);\n\n\treturn (\n\t\t\n\t\t\tref={ref}\n\t\t\tname=\"user-auto-list\"\n\t\t\tonLookup={handleLookup}\n\t\t\tlabel={i18n.t('i18n.user')}\n\t\t\tmultiple={false as Multiple}\n\t\t\tplaceholder={!props.multiple ? i18n.t('i18n.pleaseSelect') : undefined}\n\t\t\t{...props}\n\t\t\tAutocompleteProps={{\n\t\t\t\tgetOptionLabel,\n\t\t\t\tisOptionEqualToValue: getOptionSelected,\n\t\t\t\trenderOption: avatar ? renderAvatarOption : undefined,\n\t\t\t\t...props?.AutocompleteProps,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const UserAutoListPrimitive = React.forwardRef(UserAutoListInner) as <\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false,\n>(\n\tprops: UserAutoListProps,\n) => JSX.Element;\n\nexport const UserAutoList = UserAutoListPrimitive;\n\nexport default UserAutoList;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nexport type CategoryAutoListItem = {\n\t/** group name */\n\tlabel: string;\n\t/** user id */\n\tvalue: number;\n};\n\n/**\n * `getCategoryAutoList` request params\n * (what is used to send to server)\n */\nexport interface GetCategoryAutoListRequestOptions {\n\tquery: string;\n\tpermissionMatrixLevel?: number;\n}\n\n/**\n * `getCategoryAutoList` request\n * (what gets sent to the server)\n */\nexport type GetCategoryAutoListRequest = [\n\tGetCategoryAutoListRequestOptions['query'],\n\tRequired['permissionMatrixLevel'],\n];\n\n/**\n * `getCategoryAutoList` response\n * (what comes back from the server)\n */\nexport type GetCategoryAutoListResponse = SuccessResponse<\n\tGetCategoryAutoListResult\n>;\n\n/**\n * `getCategoryAutoList` result\n * (what is utilized from the server response)\n */\nexport type GetCategoryAutoListResult = (Omit & {\n\tvalue: string;\n})[];\n\nexport const getCategoryAutoListEndpoint = 'getCategoryAutoList';\n\n/**\n * Autolist categories\n * @param fetchParams Fetch params\n */\nexport const getCategoryAutoList = async ({\n\tquery,\n\tpermissionMatrixLevel = 1,\n}: GetCategoryAutoListRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetCategoryAutoListRequest = [\n\t\tquery,\n\t\tpermissionMatrixLevel,\n\t];\n\n\treturn client\n\t\t.post(\n\t\t\tgetCategoryAutoListEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) =>\n\t\t\tresponse.data.result\n\t\t\t\t.map((d) => ({\n\t\t\t\t\t...d,\n\t\t\t\t\tvalue: parseInt(d.value),\n\t\t\t\t}))\n\t\t\t\t.filter((d) => d.value !== 0),\n\t\t);\n};\nexport default getCategoryAutoList;\n","// This pattern only matches strings that do NOT contain illegal chars for category names\nexport const invalidCharsPattern = /[~—|+<>:?*\\\\\\/]/g;\nexport const invalidPeriodsPattern = /^(?!\\.)(?!.*\\.$)(?!.*?\\.\\.)/;\n// This string is the human-readable translation of the above string, for explanatory messages:\nexport const invalidNameCharacters = '/ \\\\ . + \" : * | < > ?';\n\nexport default {\n\tinvalidNameCharacters,\n\tinvalidCharsPattern,\n\tinvalidPeriodsPattern,\n};\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\nimport CoreCollection from '@netx/core/lib/netx-collection';\n\nimport {argsToArray} from '@netx/core/lib/underscore-netx';\n\nimport {invalidCharsPattern, invalidPeriodsPattern} from '../properties/upload';\n\nexport default class Upload extends Base {\n\t/** @type {object} */\n\tget defaults() {\n\t\t// Initial storage lcoation\n\t\treturn {\n\t\t\t// for plupload\n\t\t\tautoStart: false,\n\t\t\tcontainer: undefined,\n\t\t\tbrowse_button: undefined,\n\t\t\tmulti_selection: true,\n\t\t\tdrop_element: undefined,\n\t\t\t// for import\n\t\t\tfileName: '',\n\t\t\tfileEncoding: 'utf-8',\n\t\t\tfileFormat: '',\n\t\t\tstorageLocation: 1,\n\t\t\t// for status\n\t\t\tuploading: false,\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attributes Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t/** @type {boolean} */\n\t\tthis.uploading = false;\n\n\t\t/**\n\t\t * Normalize files in a backbone collection for `chilView` use\n\t\t * @memberof Netx.Models.Upload\n\t\t * @alias files\n\t\t * @type {Netx.Collection}\n\t\t */\n\t\tthis.files = new CoreCollection([]);\n\t\tthis.files.comparator = (a, b) =>\n\t\t\tb.get('addedTimestamp') - a.get('addedTimestamp');\n\n\t\t/**\n\t\t * Normally this would be accessed view Netx.upload.options - but we like chicken egg problems\n\t\t * @memberof Netx.Models.Upload\n\t\t * @alias options\n\t\t * @type {object}\n\t\t */\n\t\tthis.options = opts.options || {};\n\n\t\t/**\n\t\t * Plupload options\n\t\t * @memberof Netx.Models.Upload\n\t\t * @alias pluploadOptions\n\t\t */\n\t\tthis.pluploadOptions = opts.pluploadOptions || {};\n\n\t\t/**\n\t\t * All storage locations\n\t\t * @memberof Netx.Models.Upload\n\t\t * @alias stoageLocations\n\t\t * @type {Netx.Collections.StorageLocations}\n\t\t */\n\t\tthis.storageLocations = opts.storageLocations || Netx.app.storageLocations;\n\n\t\t/**\n\t\t * See `this.createUploader`\n\t\t * @memberof Netx.Models.Upload\n\t\t * @alias uploader\n\t\t * @type {Plupload}\n\t\t * @default\n\t\t */\n\t\tthis.uploader = opts.uploader || undefined;\n\n\t\t// Debounced/throttled methods\n\t\tthis.progress = _.throttle(\n\t\t\tthis.progress,\n\t\t\tthis.options.PROGRESS_THROTTLE || 250,\n\t\t);\n\n\t\t// asset:views:remove:file\n\t\t// upload:import:remove:file\n\t\t// upload:bulkCartLoader:remove:file\n\t\tthis.listenTo(dispatcher, this.nsEventStr('remove:file'), function (id) {\n\t\t\tvar file = this.files.get(id);\n\t\t\tfile && this.uploader.removeFile(id);\n\t\t});\n\n\t\t////////////////////////////////////////////\n\t\t// Storage location\n\t\t////////////////////////////////////////////\n\t\tthis.listenTo(this.storageLocations, 'nx:change:defaultLocation', function (\n\t\t\tlocations,\n\t\t\tstorageLocation,\n\t\t) {\n\t\t\tthis.set('locationID', storageLocation.id);\n\t\t});\n\t\tthis.listenTo(this.storageLocations, 'sync', function () {\n\t\t\tvar defaultLocation = this.storageLocations.getDefaultLocation();\n\t\t\tdefaultLocation && this.set('locationID', defaultLocation.id);\n\t\t});\n\t\t// Initial value of storage location\n\t\tvar defaultLocation = this.storageLocations.getDefaultLocation();\n\t\tdefaultLocation && this.set('locationID', defaultLocation.id);\n\t\t////////////////////////////////////////////\n\t\t// !Storage location\n\t\t////////////////////////////////////////////\n\n\t\tthis.stashBrowseButton();\n\t}\n\t/** @override */\n\tdestroy() {\n\t\tthis.uploader && this.destroyUploader();\n\t\tthis.stopListening();\n\t\tthis.trigger('destroy', this, this.collection);\n\t}\n\n\t/**\n\t * Add dropped files from a drag+drop event\n\t * @method\n\t * @param {event} e jQuery event\n\t * @param {number} catId Category id\n\t * @fires moudle:upload#upload:addedDroppedFiles\n\t */\n\taddDroppedFiles(e, catId) {\n\t\tif (!e || this.get('uploading')) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar files = (e.originalEvent && e.originalEvent.dataTransfer.files) || [];\n\t\t// convert drop event to file list\n\t\tvar dropfiles = _.map(files, function (file) {\n\t\t\treturn new mOxie.file.File(null, file);\n\t\t});\n\t\tthis.uploader.addFile(dropfiles);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} uploader Uploader object\n\t * @param {object} file File object\n\t */\n\tbeforeUpload(uploader, file) {\n\t\t// DAM-15019\n\t\treturn;\n\t\t// if (!this.pluploadOptions['chunk_size']) return;\n\t\t// // So chunk uploading works on the backend\n\t\t// uploader.setOption('headers', {\n\t\t// \t'X-File-Size': file.size,\n\t\t// \t'X-File-Name': file.name,\n\t\t// \t'X-File-Type': file.type,\n\t\t// \t...uploader.getOption('headers'),\n\t\t// });\n\t}\n\n\t/**\n\t * Bind a plupload event directly to a dispatcher event, using a given prefix\n\t * For instance, to bind the FilesUploaded event to trigger asset:checkin:FilesUploaded on the dispatcher:\n\t * bindToDispatcher('FilesUploaded', 'asset:checkin')\n\t * @method\n\t * @param {string} event Event string\n\t * @param {string} prefix Prefix string for event string\n\t */\n\tbindToDispatcher(event) {\n\t\tconst binder = (...args) => {\n\t\t\t// add eventname before event arguments\n\t\t\tdispatcher.trigger.apply(\n\t\t\t\tdispatcher,\n\t\t\t\t[this.nsEventStr(event)].concat(...args),\n\t\t\t);\n\t\t};\n\n\t\tswitch (event) {\n\t\t\tcase 'UploadProgress':\n\t\t\t\t// DAM-4869 et. al. : UploadProgress events can happen many thousand times per sec! (In Safari, at least.)\n\t\t\t\tthis.uploader.bind(\n\t\t\t\t\tevent,\n\t\t\t\t\t_.throttle(binder, this.options.PROGRESS_THROTTLE),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.uploader.bind(event, binder);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Bind a set of functions to plupload's plupload-y events\n\t * @method\n\t */\n\tbindUploader(bindings, ctx) {\n\t\tconst uploader = this.uploader;\n\t\t_.pairs(bindings).forEach((binding, idx, all) => {\n\t\t\tif (_.isFunction(binding[1])) {\n\t\t\t\tuploader.bind(binding[0], binding[1], ctx);\n\t\t\t} else if (_.isString(binding[1]) && _.isFunction(ctx[binding[1]])) {\n\t\t\t\tuploader.bind(binding[0], ctx[binding[1]], ctx);\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\t// Each plupload instance need to attach to a DOM element for its upload button,\n\t// and plupload craps out if that element is destroyed. Because our views want to\n\t// destroy/create their elements at will, we'll stash a hidden button in the DOM just for\n\t// plupload clicks. Our views will forward the clicks on their visible 'select file'\n\t// buttons to this button.\n\t//\n\t// This is not quite MVC, but neither is plupload. One could argue that a model shouldn't contain any HTML.\n\t// Perhaps a view should do this stuff instead, but it would be \"out of its element\" ...\n\t// Because there's a 1/1/1 relationship between these buttons, plupload instances and Netx.Models.Upload instances,\n\t// I'm leaving it here for now.\n\t/**\n\t * Generate an unique ID for that hidden DOM element\n\t * @method\n\t * @return {string}\n\t */\n\tbrowseButtonId() {\n\t\treturn 'hidden-upload-button-' + this.cid;\n\t}\n\n\t/**\n\t * Stop uploading and clear the file list.\n\t * @method\n\t */\n\tcancel() {\n\t\tthis.uploader.stop();\n\t\t// remove all items from queue\n\t\tthis.uploader.splice();\n\t\t// TODO: move these to their respective dispatcher events for documentation\n\t\t// I just quickly added the ones I knew of\n\t\t// asset:views:cancelled\n\t\t// upload:import:cancelled\n\t\t// upload:attributeData:cancelled\n\t\t// upload:bulkCartLoader:cancelled\n\t\tdispatcher.trigger(this.nsEventStr('cancelled'), this);\n\t}\n\n\t/**\n\t * Clear out the queue (cancel previous file selections)\n\t * @method\n\t */\n\tclear() {\n\t\tif (this.get('uploading')) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.uploader && this.uploader.files.length) {\n\t\t\t// http://www.plupload.com/docs/Uploader#splice\n\t\t\t// This will trigger the plupload events FilesRemoved and QueueChanged\n\t\t\tthis.uploader.splice();\n\t\t}\n\t}\n\n\t/** @method */\n\tcreateUploader() {\n\t\t// Clean uploader\n\t\tthis.uploader && this.destroyUploader();\n\n\t\tvar container = this.has('container')\n\t\t\t\t? this.get('container')\n\t\t\t\t: [this.browseButtonId(), '-container'].join(''),\n\t\t\ttoken = Netx.getToken();\n\n\t\t// support for Netx.custom.path\n\t\tvar prefix = (Netx.custom.path && Netx.custom.path) || '';\n\t\t// Create uploader\n\t\tvar uploaderArgs = _.extend(\n\t\t\t{},\n\t\t\t{\n\t\t\t\truntimes: 'html5',\n\t\t\t\tbrowse_button: this.browseButtonId(),\n\t\t\t\tdrop_element: this.get('drop_element'),\n\t\t\t\t// if container hasn't been set, use the parent of the magic button\n\t\t\t\tcontainer: container,\n\t\t\t\t// if we're running with a token, add that to the header:\n\t\t\t\theaders: token ? {'NX-Auth-Token': token} : undefined,\n\t\t\t\turl: Netx.URL.upload,\n\t\t\t\tmulti_selection: this.get('multi_selection') === true,\n\t\t\t\t// require a filename extension (.anything)\n\t\t\t\tfilters: {\n\t\t\t\t\tmust_have_extension: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tthis.pluploadOptions,\n\t\t);\n\n\t\t// DAM-7088: always add sessionKey as a query param to servelets like uploadServlet:\n\t\tvar key = token || Netx.session.getKey();\n\t\tif (key) {\n\t\t\tuploaderArgs.multipart_params = uploaderArgs.multipart_params || {};\n\t\t\tuploaderArgs.multipart_params.sessionKey = key;\n\t\t}\n\n\t\tthis.uploader = new plupload.Uploader(uploaderArgs);\n\n\t\t// turn plupload events into Backbone events\n\t\tif (this.has('mapEvents') && this.has('mapEventPrefix')) {\n\t\t\t// map some plupload events to Backbone events\n\t\t\t_.each(\n\t\t\t\tthis.get('mapEvents'),\n\t\t\t\tfunction (event, idx, all) {\n\t\t\t\t\tthis.bindToDispatcher(event);\n\t\t\t\t},\n\t\t\t\tthis,\n\t\t\t);\n\t\t}\n\n\t\t// Add (circular) reference back to model, so we can get to it from uploader event handlers\n\t\t// NOTE that we have to un-do this manually when we destroy\n\t\tthis.uploader.model = this;\n\n\t\treturn this;\n\t}\n\n\t/** @method */\n\tdestroyUploader() {\n\t\t// first, remove circular reference:\n\t\tdelete this.uploader.model;\n\t\t// HACK: plupload is a finicky bastard.\n\t\t// its destroy() does just three things: stop(), trigger(), unbindAll().\n\t\t// But it seems to crash with a \"DOM Error 8\" if its DOM\n\t\t// element has already been deleted, which is a thing we do.\n\t\t// Switching the order of those three calls seems to fix it.\n\t\tthis.uploader.stop();\n\t\tthis.uploader.unbindAll();\n\t\tthis.uploader.trigger('Destroy');\n\t\t// Clean up els\n\t\tthis.$container && this.$container.empty();\n\t\t// possibly trigger() is a no-op after unbindAll(), and possibly\n\t\t// plupload's Destroy event is now busted. But it works for now.\n\t\tthis.set('uploading', false);\n\t\tthis.initializedUploader = false;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @method\n\t * @param {Plupload} uploader Uploader\n\t * @param {object} file File\n\t */\n\tfileUploaded(uploader, file) {\n\t\t//\n\t\tthis.trigger('fileUploaded', file);\n\t}\n\n\t/**\n\t * @method\n\t * @param {Plupload} uploader Uploader\n\t * @param {array} files Files\n\t */\n\tfilesAdded(uploader, files) {\n\t\tconst addedTimestamp = Date.now();\n\n\t\t//console.log( this.uploader, this );\n\t\tif (!this.get('multi_selection') && this.uploader.files.length > 1) {\n\t\t\tthis.uploader.removeFile(this.uploader.files[0]);\n\t\t}\n\n\t\tconst charsRegex = new RegExp(invalidCharsPattern);\n\t\tconst periodsRegex = new RegExp(invalidPeriodsPattern);\n\n\t\t// Add to this.files (for child views etc)\n\t\tconst mapEventPrefix = this.get('mapEventPrefix');\n\n\t\tfiles.forEach((file) => {\n\t\t\tfile.addedTimestamp = addedTimestamp;\n\t\t});\n\n\t\t// DAM-15752 Filter out invalid files\n\t\tlet invalidFiles = [];\n\t\tfiles = files.filter((file) => {\n\t\t\tif (!charsRegex.test(file.name) && periodsRegex.test(file.name)) {\n\t\t\t\treturn _.extend({}, file, {mapEventPrefix: mapEventPrefix});\n\t\t\t} else {\n\t\t\t\tinvalidFiles.push(file.name);\n\t\t\t}\n\t\t});\n\n\t\t// Show bad filenames and validation rules\n\t\tif (invalidFiles.length) {\n\t\t\tthis.uploadFilenameError(invalidFiles);\n\t\t}\n\n\t\t//files.reverse();\n\n\t\tif (files.length) {\n\t\t\tthis.files.set(files, {merge: true, remove: false});\n\n\t\t\t// If auto start - start it up\n\t\t\tif (this.options.AUTO_START || this.get('autoStart')) {\n\t\t\t\t// TODO: move these to their respective dispatcher events for documentation\n\t\t\t\t// I just quickly added the ones I knew of\n\t\t\t\t// asset:views:start\n\t\t\t\t// upload:import:start\n\t\t\t\t// upload:asset:reimport:started\n\t\t\t\t// upload:attributeData:start\n\t\t\t\t// upload:bulkCartLoader:start\n\t\t\t\tdispatcher.trigger(this.nsEventStr('start'), this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} files - array of file names\n\t * @fires module:upload#upload:import:filename:error\n\t */\n\tuploadFilenameError(files) {\n\t\tdispatcher.trigger(this.nsEventStr('filename:error'), files);\n\t}\n\n\t/**\n\t * annoyingly, plupload doesn't offer a handy way to get this information from a plupload instance:\n\t * return an array of just the files in state 1 (not uploaded yet)\n\t * @method\n\t * @return {array} Files waiting\n\t */\n\tfilesWaiting() {\n\t\tif (this.uploader && this.uploader.files) {\n\t\t\treturn _.filter(this.uploader.files, function (f) {\n\t\t\t\treturn f.state == 1;\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** @method */\n\tinitializeUploader() {\n\t\t// Instantiate uploader first, if that hasn't happened yet\n\t\t!this.uploader && this.createUploader();\n\n\t\t// Only ever do this once; otherwise we get weird errors\n\t\tif (this.initializedUploader) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Listen to uploader\n\t\tthis.uploader.bind('Init', _.bind(this.uploaderInitialized, this));\n\t\tthis.uploader.bind('Error', _.bind(this.uploadError, this));\n\t\tthis.uploader.bind('FileUploaded', _.bind(this.fileUploaded, this));\n\t\tthis.uploader.bind('FilesAdded', _.bind(this.filesAdded, this));\n\t\tthis.uploader.bind('BeforeUpload', _.bind(this.beforeUpload, this));\n\t\tthis.uploader.bind(\n\t\t\t'FilesRemoved',\n\t\t\t_.bind(function (uploader, files) {\n\t\t\t\tthis.files.remove(_.pluck(files, 'id'));\n\t\t\t}, this),\n\t\t);\n\t\tthis.uploader.bind('UploadComplete', _.bind(this.uploadComplete, this));\n\t\tthis.uploader.bind('UploadProgress', _.bind(this.progress, this));\n\n\t\t// Finally, initialize uploader\n\t\tthis.uploader.init();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Provided strings will be prepended with this model `mapEventPrefix`\n\t * @method\n\t * @param {string} eventStr Event str\n\t * @return {string}\n\t */\n\tnsEventStr(eventStr) {\n\t\tvar args = argsToArray(arguments),\n\t\t\tmapEventPrefix = this.get('mapEventPrefix');\n\n\t\treturn _.map(args, function (arg) {\n\t\t\treturn (mapEventPrefix ? mapEventPrefix + ':' : '') + arg;\n\t\t}).join(' ');\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} uploader Uploader object\n\t * @param {object} file File object\n\t */\n\tprogress(uploader, file) {\n\t\tvar f = this.files.findWhere({id: file.id});\n\t\tif (f) f.set(_.extend({}, f.attributes, _.omit(file, 'id')));\n\t\t// Leaving this global event as we reset session timeout when it is fired\n\t\tdispatcher.trigger('upload:progress', uploader, file);\n\t\tthis.trigger('progress', file);\n\t}\n\n\t/**\n\t * Click the hidden button\n\t * @method\n\t * @param {event} e jQuery event\n\t */\n\tselectFiles(e) {\n\t\te && _.isFunction(e.preventDefault) && e.preventDefault();\n\t\tthis.$button.click();\n\t}\n\n\t/**\n\t * Start uploading\n\t * @method\n\t * @fires module:upload#upload:started\n\t */\n\tstart() {\n\t\tthis.set('uploading', true);\n\t\t// FYI: plupload seems to send FilesAdded events asyncyronously, i.e. slightly before it's ready to\n\t\t// accept a start() command. This _.defer gives plupload a moment to aggregate its spoor:\n\t\t_.defer(_.bind(this.uploader.start, this.uploader));\n\n\t\t// TODO: move these to their respective dispatcher events for documentation\n\t\t// I just quickly added the ones I knew of\n\t\t// asset:views:started\n\t\t// upload:import:started\n\t\t// upload:attributeData:started\n\t\t// upload:bulkCartLoader:started\n\t\tdispatcher.trigger(this.nsEventStr('started'), this);\n\t}\n\n\t/**\n\t * Stash the hidden button\n\t * @method\n\t */\n\tstashBrowseButton() {\n\t\t// do this only once.\n\t\tif (this.buttonStashed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.buttonStashed = true;\n\n\t\tvar id = this.browseButtonId();\n\t\tthis.$button = $(\n\t\t\t'',\n\t\t);\n\t\tthis.$container = $(\n\t\t\t'

    ',\n\t\t);\n\t\tthis.$container\n\t\t\t.find('form:first')\n\t\t\t.append(this.$button)\n\t\t\t.end()\n\t\t\t.appendTo('body');\n\t}\n\n\t/**\n\t * Click the hidden button\n\t * @method\n\t * @param {element} el Browse button element(s)\n\t */\n\tsyncBrowseButtons(el) {\n\t\tvar $el;\n\n\t\tif (el instanceof Element) {\n\t\t\t$el = $(el);\n\t\t} else if (el instanceof jQuery) {\n\t\t\t$el = el;\n\t\t} else if (el) {\n\t\t\tthrow 'bogus argument ' + el;\n\t\t}\n\t\t// no argument -- fallback to defaults:\n\t\telse {\n\t\t\t$el = $('#' + this.get('browse_button'));\n\t\t}\n\n\t\t$el.off('click.NetxUpload'); // avoid a double-bind!\n\t\t$el.on('click.NetxUpload', _.bind(this.selectFiles, this));\n\n\t\t// Overcome an iOS+plupload+this bug:\n\t\t// It appears that in iOS, our fake input, rather than the hidden real one, receives the files.\n\t\t// I think only iOS does this, but I'm not sure that it's \"wrong\", just unexpected ...\n\t\t// THEREFORE: If ever our fake input receives files, add its files to the pluploader manually.\n\t\tvar pup = this.uploader;\n\n\t\tthis.$button.off('change.NetxUpload');\n\t\tthis.$button.on('change.NetxUpload', function (e) {\n\t\t\tpup.addFile(this);\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {Plupload} uploader Uploader\n\t */\n\tuploadComplete(uploader) {\n\t\tthis.set('uploading', false);\n\t\tthis.trigger('uploadComplete', this);\n\t}\n\n\t/**\n\t * @method\n\t * @param {Plupload} uploader Uploader\n\t */\n\tuploaderInitialized(uploader) {\n\t\t//DAM-4229 - the below conditional breaks firefox and ie reimport. Since there is no\n\t\t//interface with a browse button it never gets synced with the hidden one\n\t\tthis.initializedUploader = true;\n\t\t// We don't set this up until init time, when we assume DOM elements such as buttons are ready.)\n\t\t//if ( this.has('browse_button') ) {\n\t\tthis.syncBrowseButtons();\n\t\t//}\n\t\tthis.trigger('initialized', this, uploader);\n\t}\n\n\t/**\n\t * @method\n\t * @param {Plupload} uploader Uploader\n\t * @param {object} details Details\n\t */\n\tuploadError(uploader, details) {\n\t\tdispatcher.trigger(this.nsEventStr('error'), details);\n\t\tthis.trigger('uploadError', details);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Upload';\n\t}\n}\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport type {Category, CategoryId} from '../types';\n\n/**\n * `getCategoryData` request params\n * (what is used to send to server)\n */\nexport interface GetCategoryDataRequestOptions {\n\tid: CategoryId;\n}\n\n/**\n * `getCategoryData` request\n * (what gets sent to the server)\n */\nexport type GetCategoryDataRequest = [GetCategoryDataRequestOptions['id']];\n\n/**\n * `getCategoryData` response\n * (what comes back from the server)\n */\nexport type GetCategoryDataResponse = SuccessResponse;\n\n/**\n * `getCategoryData` result\n * (what is utilized from the server response)\n */\nexport type GetCategoryDataResult = Category;\n\nexport const getCategoryDataEndpoint = 'getCategoryData';\n\n/**\n * Autolist categories\n * @param fetchParams Fetch params\n */\nexport const getCategoryData = async (\n\t{id}: GetCategoryDataRequestOptions,\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetCategoryDataRequest = [id];\n\n\treturn client\n\t\t.post(getCategoryDataEndpoint, requestParams, {\n\t\t\tsignal,\n\t\t})\n\t\t.then((response) => {\n\t\t\tconst {result} = response.data;\n\t\t\tresult.id = result.categoryid;\n\t\t\tif (result.categoryid === 1) {\n\t\t\t\tresult.name = 'Top Level Folder (/)';\n\t\t\t\tresult.repositorydirectory = 'Top Level Folder (/)';\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n};\nexport default getCategoryData;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {Skeleton, SkeletonProps} from '@mui/material';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithClasses,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\n\nimport {\n\tchipSkeletonClasses,\n\tgetChipSkeletonUtilityClass,\n\tChipSkeletonClasses,\n\tCHIP_SKELETON_CLASS_NAME,\n} from './chipSkeletonClasses';\n\ntype AutoTaskEditorUtiltiyClassProps = WithClasses;\n\nconst useUtilityClasses = (ownerState: AutoTaskEditorUtiltiyClassProps) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getChipSkeletonUtilityClass, classes);\n};\n\nconst ChipSkeletonRoot = styled(Skeleton, {\n\tname: CHIP_SKELETON_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tborderRadius: 16,\n\tflex: '0 0 auto',\n\tdisplay: 'inline-flex',\n\tmargin: 3,\n\twidth: 70,\n}));\n\nexport interface ChipSkeletonProps\n\textends Omit, 'classes'>,\n\t\tWithClasses {\n\tcount?: number;\n}\n\nexport const ChipSkeletonPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\tcount,\n\t...props\n}: ChipSkeletonProps) => {\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t{Array(count || 1)\n\t\t\t\t.fill(null)\n\t\t\t\t.map((val, index) => (\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\n\t);\n};\n\nexport const ChipSkeleton = ChipSkeletonPrimitive;\nexport default ChipSkeleton;\n","export const SearchTypeCategoryId = 23 as const;\nexport type TSearchTypeCategoryId = typeof SearchTypeCategoryId;\n\n/** elementSubType1 */\nexport enum CategoryType {\n\tONLY = 2,\n\tONLY_RECURSIVE = 0,\n\tEXCLUDE = 3,\n\tEXCLUDE_RECURSIVE = 1,\n}\n","import {bytes} from '@netx/core/lib/underscore-netx';\n\nexport const getAssetFileSizeLabel = bytes; // (fileSize: number) => bytes(fileSize);\n\nexport default getAssetFileSizeLabel;\n","import React from 'react';\nimport NiceModal, {useModal} from '@ebay/nice-modal-react';\n\nexport const withNiceModalProvider = function (\n\tComponent: C,\n) {\n\treturn (\n\t\tprops: JSX.IntrinsicAttributes &\n\t\t\tJSX.LibraryManagedAttributes>,\n\t) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t};\n};\n\nexport const withNiceModal = function (\n\tComponent: C,\n) {\n\treturn NiceModal.create(\n\t\t({\n\t\t\topen,\n\t\t\tonClose,\n\t\t\tDialogProps = {},\n\t\t\t...props\n\t\t}: JSX.IntrinsicAttributes &\n\t\t\tJSX.LibraryManagedAttributes>) => {\n\t\t\tconst modal = useModal();\n\n\t\t\tconst {TransitionProps} = DialogProps;\n\n\t\t\tconst handleClose = (\n\t\t\t\tevent: {},\n\t\t\t\treason: 'backdropClick' | 'escapeKeyDown',\n\t\t\t) => {\n\t\t\t\tmodal.hide().catch((ex) => {\n\t\t\t\t\tconsole.log('nicemodal: hide error =>', ex);\n\t\t\t\t});\n\t\t\t\tonClose?.(event, reason);\n\t\t\t};\n\n\t\t\tconst handleExited = (node: HTMLElement) => {\n\t\t\t\tmodal.resolveHide();\n\t\t\t\tmodal.remove();\n\t\t\t\tTransitionProps?.onExited?.(node);\n\t\t\t};\n\n\t\t\treturn (\n\t\t\t\t>)}\n\t\t\t\t\topen={modal.visible}\n\t\t\t\t\tonClose={handleClose}\n\t\t\t\t\tDialogProps={{\n\t\t\t\t\t\topen: modal.visible,\n\t\t\t\t\t\tTransitionProps: {\n\t\t\t\t\t\t\t...TransitionProps,\n\t\t\t\t\t\t\tonExited: handleExited,\n\t\t\t\t\t\t\tonEntered: () => {\n\t\t\t\t\t\t\t\tmodal.resolve();\n\t\t\t\t\t\t\t\tTransitionProps?.onEntered?.();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t);\n};\n\nexport default withNiceModal;\n","import React from 'react';\n\nimport {compareProps} from '@netx/core-components/util';\n\nimport {DateField} from '@netx/core-components/Form';\nimport type {DateValue} from '@netx/core-asset/models/attribute';\nimport type {CommonProps} from '../../types';\nimport {usePlaceholder} from '../../../../hooks';\n\nexport interface DateAttributeProps extends CommonProps {}\n\nconst DateAttributeComponent = ({\n\taction,\n\tattrData,\n\tdisableFolksonomy,\n\thideLabel,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\tmultipleValues,\n\tonLookup,\n\tonSearch,\n\tplaceholder = '',\n\tvalue,\n\t...props\n}: DateAttributeProps) => {\n\tconst cleared = action === 'clear';\n\tconst defaultValue = value != null ? value : null;\n\tconst shrinkLabel = multipleValues || cleared;\n\n\tconst textfieldPlaceholder = usePlaceholder(attrData, placeholder, {\n\t\tcleared,\n\t\tmultipleValues,\n\t\tvalue: defaultValue,\n\t});\n\n\treturn (\n\t\t\n\t);\n};\n\nexport const DateAttribute = React.memo(\n\tDateAttributeComponent,\n\tcompareProps([], 'attribute-date'),\n);\nexport default DateAttribute;\n","import React, {useCallback} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport SelectField from '@netx/core-components/Form/SelectField';\nimport {compareProps} from '@netx/core-components/util';\nimport type {CommonProps} from '../../types';\nimport {usePlaceholder} from '../../../../hooks';\n\nexport interface MultiSelectAttributeProps extends CommonProps {\n\tonChange(value: string[]): void;\n}\n\nconst MultiSelectAttributeComponent = ({\n\taction,\n\tattrData,\n\tdisableFolksonomy,\n\thideLabel,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\tmultipleValues,\n\tonLookup,\n\tonSearch,\n\tplaceholder,\n\tvalue,\n\t...props\n}: MultiSelectAttributeProps) => {\n\tconst cleared = action === 'clear';\n\tconst options = attrData.pulldownOptions || [];\n\tconst defaultValue = value == null ? [] : value;\n\n\tconst textfieldPlaceholder = usePlaceholder(\n\t\tattrData,\n\t\tplaceholder !== '' ? placeholder : i18n.t('i18n.makeSelection'),\n\t\t{\n\t\t\tcleared,\n\t\t\tmultipleValues,\n\t\t\treadOnly: props.readOnly,\n\t\t\tvalue: defaultValue,\n\t\t},\n\t);\n\n\tconst handleSearch = useCallback(\n\t\t(value) => {\n\t\t\tonSearch?.(value);\n\t\t},\n\t\t[onSearch],\n\t);\n\n\treturn (\n\t\t\n\t\t\thideErrorMessage\n\t\t\tid={attrData.attributeid.toString()}\n\t\t\tlabel={hideLabel ? undefined : attrData.name}\n\t\t\tmultiple\n\t\t\t{...props}\n\t\t\toptions={options}\n\t\t\tonSearch={onSearch ? handleSearch : undefined}\n\t\t\tplaceholder={textfieldPlaceholder}\n\t\t\tvalue={defaultValue}\n\t\t\tInputLabelProps={{\n\t\t\t\tshrink: multipleValues || cleared ? true : undefined,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const MultiSelectAttribute = React.memo(\n\tMultiSelectAttributeComponent,\n\tcompareProps([], 'attribute-multiSelect'),\n);\nexport default MultiSelectAttributeComponent;\n","import React, {useEffect} from 'react';\nimport {useRef, useState} from 'react';\n\nimport {Autocomplete, AutocompleteRenderInputParams} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {AttributeAttributes} from '@netx/core-asset/models/attribute';\nimport {metadataDatasetAutoList} from '../../../../api';\n\nimport useUpdateEffect from '@netx/core-components/hooks/useUpdateEffect';\nimport {isEmptyValue} from '@netx/core-components/Form';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\twidth: '100%',\n\t\t\tposition: 'relative',\n\t\t},\n\t\tlabelIcon: {\n\t\t\tfontSize: '1em',\n\t\t\tmarginRight: 8,\n\t\t},\n\t\tlabelWrapper: {\n\t\t\talignItems: 'center',\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflex: '0 0 auto',\n\t\t},\n\t});\n\nexport interface LookupProps {\n\tattrData: AttributeAttributes;\n\tdisabled?: boolean;\n\tonChange?: (value: string | null | undefined) => void;\n\tonLookup: (lookupValue: string) => void;\n\trenderInput: (params: AutocompleteRenderInputParams) => React.ReactNode;\n\tvalue?: string;\n}\n\ntype Option = string;\n\nconst Lookup = ({\n\tclasses,\n\n\tattrData,\n\tdisabled = false,\n\tonChange,\n\tonLookup,\n\trenderInput,\n\tvalue,\n}: WithStyles & LookupProps) => {\n\tconst defaultValue: string = !isEmptyValue(value)\n\t\t? Array.isArray(value)\n\t\t\t? value[0]\n\t\t\t: value\n\t\t: '';\n\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [options, setOptions] = useState([]);\n\tconst [textValue, setTextValue] = useState(defaultValue);\n\n\tconst lookupRef = useRef('');\n\n\tuseEffect(() => {\n\t\tlookupRef.current = '';\n\t}, []);\n\n\tuseUpdateEffect(() => {\n\t\tsetTextValue(Array.isArray(value) ? value[0] : value);\n\t}, [value]);\n\n\tconst testLookup = (lookupValue: string) => {\n\t\t// TODO: We can attach listeners to the list component and deduce actual selection\n\t\t// I am making this behave as it does in core at this moment\n\t\tif (options.includes(lookupValue)) {\n\t\t\tif (lookupRef.current !== lookupValue) {\n\t\t\t\tlookupRef.current = lookupValue;\n\t\t\t\tonLookup(lookupValue);\n\t\t\t\t// Wipe out options otherwise they menu will open when we change the value\n\t\t\t\t// programatically (if the new value does not match all available options)\n\t\t\t\tsetOptions([]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tlookupRef.current = '';\n\t\treturn false;\n\t};\n\n\tconst autoList = async (lookupString: string) => {\n\t\tsetOptions([]);\n\n\t\tif (lookupString == null || !lookupString.length) return;\n\n\t\tsetIsLoading(true);\n\t\tconst results = await metadataDatasetAutoList({\n\t\t\tid: attrData.attributeid,\n\t\t\tvalue: lookupString,\n\t\t});\n\t\tsetIsLoading(false);\n\n\t\tsetOptions(results);\n\t\ttestLookup(lookupString);\n\t};\n\n\tconst handleInputChange = (event: React.SyntheticEvent, str: string) => {\n\t\tif (!event || disabled) return;\n\n\t\tsetTextValue(str);\n\t\tonChange?.(str);\n\n\t\tif (\n\t\t\tevent.type === 'click' ||\n\t\t\t(event.type === 'keydown' &&\n\t\t\t\t(event as React.KeyboardEvent).key === 'Enter')\n\t\t) {\n\t\t\ttestLookup(str);\n\t\t} else {\n\t\t\t!testLookup(str) && autoList(str);\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\tclassName={classes.root}\n\t\t\tfreeSolo\n\t\t\tautoComplete\n\t\t\tautoHighlight\n\t\t\tblurOnSelect\n\t\t\tdisableClearable\n\t\t\tloading={isLoading}\n\t\t\tid=\"autocomplete-text\"\n\t\t\tdisabled={disabled}\n\t\t\tinputValue={textValue}\n\t\t\tonChange={handleInputChange}\n\t\t\tonInputChange={handleInputChange}\n\t\t\toptions={options}\n\t\t\trenderInput={renderInput}\n\t\t\tvalue={defaultValue}\n\t\t/>\n\t);\n};\n\nexport default withStyles(styles, {\n\tname: 'Attributes-Attribute-Lookup',\n})(Lookup);\n","import React, {useCallback} from 'react';\n\nimport {compareProps} from '@netx/core-components/util';\n\nimport type {InputLabelProps, InputBaseComponentProps} from '@mui/material';\nimport Lookup from '../MetadataLookup/Lookup';\nimport {numberTypes} from '@netx/core-asset/properties/attributes';\nimport {usePlaceholder} from '../../../../hooks';\nimport type {AttributeTemplate} from '../../../../types';\nimport type {CommonProps} from '../../types';\n\nimport {NumberField, NumberFieldProps} from '@netx/core-components/Form';\ntype NumberFieldRequiredProps = Required;\n\nimport {NumberValue} from '@netx/core-asset/models/attribute';\n\nconst formatNumber = (attrData: AttributeTemplate, value: string) => {\n\tlet numberLength = value.length;\n\tif (!numberLength) return '';\n\n\tconst numberType = numberTypes[attrData.spec2];\n\tconst maxDecimal = (numberType && numberType.maxDecimal) || Infinity;\n\n\tnumberLength = value.length;\n\n\tif (!numberLength) return '';\n\tif (!numberType) return value;\n\n\tif (numberType.key === 'whole') {\n\t\treturn value.split('.')[0].substr(0, attrData.spec1 || value.length);\n\t}\n\n\tif (numberType.key === 'unlimited') {\n\t\treturn value;\n\t}\n\n\tconst decimalIndex = value.indexOf('.');\n\tif (maxDecimal !== Infinity) {\n\t\tif (decimalIndex > -1) {\n\t\t\tconst decimalDigitCount = numberLength - (decimalIndex + 1);\n\t\t\tif (decimalDigitCount > maxDecimal) {\n\t\t\t\tvalue = value.substr(\n\t\t\t\t\t0,\n\t\t\t\t\tnumberLength - (decimalDigitCount - maxDecimal),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nexport interface NumberAttributeProps extends CommonProps {}\n\nconst NumberAttributeComponent = ({\n\taction,\n\tattrData,\n\tdisableFolksonomy,\n\thideLabel,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\tmultipleValues,\n\tonChange,\n\tonLookup,\n\tonSearch,\n\tplaceholder,\n\treadOnly,\n\tvalue,\n\t...props\n}: NumberAttributeProps) => {\n\tconst cleared = action === 'clear';\n\tconst defaultValue = value == null ? '' : value.toString();\n\tconst maxLength =\n\t\tattrData.spec2 === 0 ? attrData.spec1 || undefined : undefined;\n\n\tconst textfieldPlaceholder = usePlaceholder(attrData, placeholder, {\n\t\tcleared,\n\t\tmultipleValues,\n\t\treadOnly,\n\t\tvalue: defaultValue,\n\t});\n\n\tconst handleChange = useCallback(\n\t\t(value) => onChange?.(formatNumber(attrData, value)),\n\t\t[attrData, onChange],\n\t);\n\n\tconst renderInput = useCallback(\n\t\t(params?: {\n\t\t\tinputProps: InputBaseComponentProps;\n\t\t\tInputLabelProps: InputLabelProps;\n\t\t}) => {\n\t\t\treturn (\n\t\t\t\t\n\t\t\t);\n\t\t},\n\t\t[defaultValue, props, handleChange, textfieldPlaceholder],\n\t);\n\n\tif (isMetadataLookup && onLookup) {\n\t\treturn (\n\t\t\t\n\t\t);\n\t}\n\n\treturn renderInput();\n};\n\nexport const NumberAttribute = React.memo(\n\tNumberAttributeComponent,\n\tcompareProps(),\n);\nexport default NumberAttribute;\n","import React, {useCallback} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\nimport SelectField from '@netx/core-components/Form/SelectField';\nimport {compareProps} from '@netx/core-components/util';\nimport type {CommonProps} from '../../types';\nimport {usePlaceholder} from '../../../../hooks';\n\nexport interface SelectAttributeProps extends CommonProps {\n\tonChange(value: string): void;\n}\n\nconst SelectAttributeComponent = ({\n\taction,\n\tattrData,\n\tdisableFolksonomy,\n\thideLabel,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\tmultipleValues,\n\tonChange,\n\tonLookup,\n\tonSearch,\n\tplaceholder = '',\n\treadOnly,\n\tvalue,\n\t...props\n}: SelectAttributeProps) => {\n\tconst cleared = action === 'clear';\n\tconst options = attrData.pulldownOptions || [];\n\n\tconst textfieldPlaceholder = usePlaceholder(\n\t\tattrData,\n\t\tplaceholder !== '' ? placeholder : i18n.t('i18n.chooseOne'),\n\t\t{\n\t\t\tcleared,\n\t\t\tmultipleValues,\n\t\t\treadOnly,\n\t\t\tvalue,\n\t\t},\n\t);\n\n\tconst handleChange = useCallback(\n\t\t(value) => {\n\t\t\tif (isMetadataLookup) onLookup?.(value);\n\t\t\tonChange?.(value);\n\t\t},\n\t\t[isMetadataLookup, onChange, onLookup],\n\t);\n\n\treturn (\n\t\t\n\t\t\thideErrorMessage\n\t\t\tid={attrData.attributeid.toString()}\n\t\t\tlabel={hideLabel ? undefined : attrData.name}\n\t\t\t{...props}\n\t\t\tonChange={handleChange}\n\t\t\toptions={options}\n\t\t\tplaceholder={textfieldPlaceholder}\n\t\t\treadOnly={readOnly}\n\t\t\tvalue={value}\n\t\t\tInputLabelProps={{\n\t\t\t\tshrink: multipleValues || cleared ? true : undefined,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const SelectAttribute = React.memo(\n\tSelectAttributeComponent,\n\tcompareProps(),\n);\nexport default SelectAttribute;\n","import React, {useCallback} from 'react';\n\nimport {compareProps} from '@netx/core-components/util';\n\nimport AutoListField from '@netx/core-components/Form/AutoListField';\n\nimport type {SemanticValue} from '@netx/core-asset/models/attribute';\nimport type {CommonProps} from '../../types';\nimport {usePlaceholder} from '../../../../hooks';\nimport {getSemanticObjectAutoList} from '../../../../api';\n\nexport interface SemanticAttributeProps extends CommonProps {}\n\nconst SemanticAttributeComponent = ({\n\taction,\n\tattrData,\n\tdisableFolksonomy,\n\thideLabel,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\tmultipleValues,\n\tonLookup,\n\tonSearch,\n\tplaceholder,\n\treadOnly,\n\tvalue,\n\t...props\n}: SemanticAttributeProps) => {\n\tconst cleared = action === 'clear';\n\tconst defaultValue = value == null ? [] : value;\n\n\tconst textfieldPlaceholder = usePlaceholder(\n\t\tattrData,\n\t\tplaceholder !== '' ? placeholder : i18n.t('i18n.typeToAddSemantics'),\n\t\t{\n\t\t\tcleared,\n\t\t\tmultipleValues,\n\t\t\treadOnly,\n\t\t\tvalue: defaultValue,\n\t\t},\n\t);\n\n\tconst handleLookup = useCallback(\n\t\tasync (value) => {\n\t\t\tconst results = await getSemanticObjectAutoList({\n\t\t\t\tid: attrData.semanticTypeId,\n\t\t\t\tvalue,\n\t\t\t});\n\t\t\treturn results.map((result) => result.label);\n\t\t},\n\t\t[attrData.semanticTypeId],\n\t);\n\n\tconst handleSearch = useCallback(\n\t\t(value) => {\n\t\t\tonSearch?.(value);\n\t\t},\n\t\t[onSearch],\n\t);\n\n\treturn (\n\t\t\n\t\t\t{...props}\n\t\t\thideErrorMessage\n\t\t\tid={attrData.attributeid.toString()}\n\t\t\tlabel={hideLabel ? undefined : attrData.name}\n\t\t\tmultiple\n\t\t\tonLookup={handleLookup}\n\t\t\tonSearch={onSearch ? handleSearch : undefined}\n\t\t\tplaceholder={textfieldPlaceholder}\n\t\t\treadOnly={readOnly}\n\t\t\tvalue={defaultValue}\n\t\t\tInputLabelProps={{\n\t\t\t\tshrink: multipleValues || cleared ? true : undefined,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const SemanticAttribute = React.memo(\n\tSemanticAttributeComponent,\n\tcompareProps(),\n);\nexport default SemanticAttribute;\n","import React, {useCallback} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {compareProps} from '@netx/core-components/util';\nimport {AutoListField} from '@netx/core-components/Form';\nimport type {TagValue} from '@netx/core-asset/models/attribute';\nimport type {CommonProps} from '../../types';\nimport {usePlaceholder} from '../../../../hooks';\nimport {metadataAutoCompleteLookup} from '../../../../api';\n\nexport interface TagAttributeProps extends CommonProps {}\n\nconst TagAttributeComponent = ({\n\taction,\n\tdisableFolksonomy,\n\tattrData,\n\thideLabel,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\tmultipleValues,\n\tonLookup,\n\tonSearch,\n\tplaceholder = '',\n\treadOnly,\n\tvalue,\n\n\t...props\n}: TagAttributeProps) => {\n\tconst cleared = action === 'clear';\n\tconst defaultValue = value == null ? [] : value;\n\tconst flexible = !disableFolksonomy && attrData.spec2 === 1;\n\n\tconst textfieldPlaceholder = usePlaceholder(\n\t\tattrData,\n\t\tplaceholder !== '' ? placeholder : i18n.t('i18n.typeToAddTags'),\n\t\t{\n\t\t\tcleared,\n\t\t\tdisable: props.loadingValue,\n\t\t\tmultipleValues,\n\t\t\treadOnly,\n\t\t\tvalue: defaultValue,\n\t\t},\n\t);\n\n\tconst handleLookup = useCallback(\n\t\t(value) =>\n\t\t\tmetadataAutoCompleteLookup({\n\t\t\t\tid: attrData.spec1,\n\t\t\t\tvalue,\n\t\t\t}),\n\t\t[attrData.spec1],\n\t);\n\n\tconst handleSearch = useCallback(\n\t\t(value) => {\n\t\t\tonSearch?.(value);\n\t\t},\n\t\t[onSearch],\n\t);\n\n\treturn (\n\t\t\n\t\t\t{...props}\n\t\t\thideErrorMessage\n\t\t\tflexible={flexible}\n\t\t\tonLookup={handleLookup}\n\t\t\tid={attrData.attributeid.toString()}\n\t\t\tlabel={hideLabel ? undefined : attrData.name}\n\t\t\tname={attrData.name}\n\t\t\tonSearch={onSearch ? handleSearch : undefined}\n\t\t\tplaceholder={textfieldPlaceholder}\n\t\t\tvalue={defaultValue}\n\t\t\tInputLabelProps={{\n\t\t\t\tshrink: multipleValues || cleared ? true : undefined,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const TagAttribute = React.memo(\n\tTagAttributeComponent,\n\tcompareProps([], 'attribute-tag'),\n);\nexport default TagAttribute;\n","import React, {useCallback} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\nimport {compareProps} from '@netx/core-components/util';\nimport {AutoListField} from '@netx/core-components/Form';\nimport type {TagValue} from '@netx/core-asset/models/attribute';\nimport type {CommonProps} from '../../types';\nimport {usePlaceholder} from '../../../../hooks';\nimport {vocabularyValueLookup} from '../../../../api';\n\nexport interface TagVocabAttributeProps extends CommonProps {}\n\nconst TagVocabAttributeComponent = ({\n\taction,\n\tattrData,\n\tdisableFolksonomy,\n\thideLabel,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\tmultipleValues,\n\tonLookup,\n\tonSearch,\n\tplaceholder = '',\n\treadOnly,\n\tvalue,\n\t...props\n}: TagVocabAttributeProps) => {\n\tconst cleared = action === 'clear';\n\tconst defaultValue = value == null || !Array.isArray(value) ? [] : value;\n\tconst flexible = !disableFolksonomy && attrData.spec2 === 1;\n\n\tconst textfieldPlaceholder = usePlaceholder(\n\t\tattrData,\n\t\tplaceholder !== '' ? placeholder : i18n.t('i18n.typeToAddTags'),\n\t\t{\n\t\t\tcleared,\n\t\t\tdisable: props.loadingValue,\n\t\t\tmultipleValues,\n\t\t\treadOnly,\n\t\t\tvalue: defaultValue,\n\t\t},\n\t);\n\n\tconst handleLookup = useCallback(\n\t\t(value) =>\n\t\t\tvocabularyValueLookup({\n\t\t\t\tid: attrData.spec1,\n\t\t\t\tvalue,\n\t\t\t}),\n\t\t[attrData.spec1],\n\t);\n\n\tconst handleSearch = useCallback(\n\t\t(value) => {\n\t\t\tonSearch?.(value);\n\t\t},\n\t\t[onSearch],\n\t);\n\n\treturn (\n\t\t\n\t\t\t{...props}\n\t\t\thideErrorMessage\n\t\t\tflexible={flexible}\n\t\t\tid={attrData.attributeid.toString()}\n\t\t\tlabel={hideLabel ? undefined : attrData.name}\n\t\t\tname={attrData.name}\n\t\t\tonLookup={handleLookup}\n\t\t\tonSearch={onSearch ? handleSearch : undefined}\n\t\t\tplaceholder={textfieldPlaceholder}\n\t\t\tvalue={defaultValue}\n\t\t\tInputLabelProps={{\n\t\t\t\tshrink: multipleValues || cleared ? true : undefined,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const TagVocabAttribute = React.memo(\n\tTagVocabAttributeComponent,\n\tcompareProps([], 'attribute-tagVocab'),\n);\nexport default TagVocabAttribute;\n","import React from 'react';\n\nimport {CircularProgress, Tooltip} from '@mui/material';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {AttributeAttributes} from '@netx/core-asset/models/attribute';\nimport {attributes as attributesSingleton} from '@netx/core-asset/collections/singleton/attributes';\n\nimport {\n\tTrackChanges as TargetIcon,\n\tVpnKey as KeyIcon,\n} from '@mui/icons-material';\n\nconst styles = (theme: Theme) => {\n\tconst ThemeProps = theme.components || {};\n\tconst TextFieldProps = ThemeProps.MuiTextField || {};\n\tconst InputVariant = TextFieldProps?.defaultProps?.variant || 'standard';\n\n\treturn createStyles({\n\t\tinputAdornmentStart: {\n\t\t\talignItems: 'center',\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflex: '0 0 auto',\n\t\t\tjustifyContent: 'center',\n\t\t\tborderRadius: InputVariant === 'outlined' ? '4px 0 0 4px' : undefined,\n\t\t\tborder:\n\t\t\t\tInputVariant === 'outlined'\n\t\t\t\t\t? `1px solid ${theme.palette.custom.border}`\n\t\t\t\t\t: undefined,\n\t\t\tborderRight: 0,\n\t\t\tmarginRight: 0,\n\t\t\tpadding: theme.spacing(0, 1),\n\t\t\t'& + div [class*=\"MuiOutlinedInput-root\"]': {\n\t\t\t\tborderRadius: '0 4px 4px 0',\n\t\t\t},\n\t\t},\n\t});\n};\n\nexport interface MetadataLookupAdornmentProps {\n\tattrData: AttributeAttributes;\n\tattributeWorking?: boolean;\n\tdisabled?: boolean;\n\tisMetadataLookup?: boolean;\n\tisMetadataTarget?: boolean;\n}\n\nconst MetadataLookupAdornment = ({\n\tclasses,\n\n\tattrData,\n\tattributeWorking = false,\n\tdisabled = false,\n\tisMetadataLookup = false,\n\tisMetadataTarget = false,\n}: WithStyles & MetadataLookupAdornmentProps) => {\n\tif (!isMetadataLookup && !isMetadataTarget) return null;\n\n\tconst title = isMetadataLookup\n\t\t? 'Metadata lookup key'\n\t\t: 'Metadata lookup target';\n\n\tconst Icon = isMetadataLookup ? KeyIcon : TargetIcon;\n\n\tconst attributeNames = new Set();\n\n\tif (isMetadataLookup) {\n\t\tattrData.keyDatasets.forEach((attributeId) => {\n\t\t\tattributesSingleton.forEach((attribute) => {\n\t\t\t\tif ((attribute.get('targetDatasets') || []).includes(attributeId)) {\n\t\t\t\t\tattributeNames.add(attribute.get('name'));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tattrData.targetDatasets.forEach((attributeId) => {\n\t\t\tattributesSingleton.forEach((attribute) => {\n\t\t\t\tif ((attribute.get('keyDatasets') || []).includes(attributeId)) {\n\t\t\t\t\tattributeNames.add(attribute.get('name'));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\t
    {title}
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{[...attributeNames].map((attributeName) => (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    {attributeName}
    \n\t\t\t\t\t
    \n\t\t\t\t}\n\t\t\t\tplacement=\"top\"\n\t\t\t\tstyle={{\n\t\t\t\t\topacity: disabled ? 0.7 : undefined,\n\t\t\t\t\tpointerEvents: disabled ? 'none' : undefined,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t
    \n\t\t\t\t\t{(attributeWorking && !isMetadataLookup && (\n\t\t\t\t\t\t\n\t\t\t\t\t)) || }\n\t\t\t\t
    \n\t\t\t\n\t\t\n\t);\n};\n\nexport default withStyles(styles, {\n\tname: 'Attributes-Attribute-MetadataLookupAdornment',\n})(MetadataLookupAdornment);\n","import React, {useCallback} from 'react';\n\nimport {compareProps} from '@netx/core-components/util';\n\nimport {TextField} from '@netx/core-components/Form';\nimport type {TextValue} from '@netx/core-asset/models/attribute';\nimport Lookup from '../MetadataLookup';\nimport type {CommonProps} from '../../types';\nimport {usePlaceholder} from '../../../../hooks';\nimport type {InputBaseComponentProps, InputLabelProps} from '@mui/material';\n\nexport interface TextAttributeProps extends CommonProps {}\n\nconst TextAttributeComponent = ({\n\taction,\n\tattrData,\n\tdisableFolksonomy,\n\thideLabel,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\tmultipleValues,\n\tonLookup,\n\tonSearch,\n\tplaceholder,\n\treadOnly,\n\tvalue,\n\t...props\n}: TextAttributeProps) => {\n\tconst cleared = action === 'clear';\n\tconst defaultValue = value == null ? '' : value;\n\tconst isTextArea = attrData.type === 2;\n\tconst shrinkLabel = multipleValues || cleared;\n\n\tconst textfieldPlaceholder = usePlaceholder(attrData, placeholder, {\n\t\tcleared,\n\t\tmultipleValues,\n\t\treadOnly,\n\t\tvalue: defaultValue,\n\t});\n\n\tconst renderInput = useCallback(\n\t\t(params?: {\n\t\t\tinputProps: InputBaseComponentProps;\n\t\t\tInputLabelProps: InputLabelProps;\n\t\t}) => {\n\t\t\treturn (\n\t\t\t\t\n\t\t\t);\n\t\t},\n\t\t[\n\t\t\tattrData,\n\t\t\tdefaultValue,\n\t\t\thideLabel,\n\t\t\tisTextArea,\n\t\t\tprops,\n\t\t\tshrinkLabel,\n\t\t\ttextfieldPlaceholder,\n\t\t],\n\t);\n\n\tif (isMetadataLookup && onLookup) {\n\t\treturn (\n\t\t\t\n\t\t);\n\t}\n\n\treturn renderInput();\n};\n\nexport const TextAttribute = React.memo(\n\tTextAttributeComponent,\n\tcompareProps([], 'attribute-text'),\n);\nexport default TextAttribute;\n","import React, {useCallback, useEffect, useState} from 'react';\n\nimport {faTrashAlt as TrashIcon} from '@fortawesome/pro-solid-svg-icons';\n\nimport {ToggleButton, useUpdateEffect} from '@netx/core-components';\n\nimport {i18n} from '@netx/core/i18n';\n\nexport interface ClearToggleProps {\n\tdisabled?: boolean;\n\ton?: boolean;\n\tonChange(cleared: boolean): void;\n}\n\nconst ClearToggle: React.FunctionComponent = ({\n\tdisabled,\n\ton,\n\tonChange,\n}) => {\n\tconst [cleared, setCleared] = useState(on === true);\n\n\tuseUpdateEffect(() => {\n\t\tsetCleared(on === true);\n\t}, [on]);\n\n\tuseEffect(() => {\n\t\tdisabled && setCleared(false);\n\t}, [disabled]);\n\n\tconst handleToggle = useCallback(\n\t\t(event, on: boolean) => {\n\t\t\tsetCleared(on);\n\t\t\tonChange(on);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t\n\t);\n};\n\nexport default React.memo(ClearToggle);\n","import React, {\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {useUpdateEffect, useRefState} from '@netx/core-components/hooks';\nimport ClearToggle from './components/Action/ClearToggle';\nimport {\n\tisEmptyValue,\n\tvaluesMatch,\n\tErrorField,\n\tFormValidationError,\n\tInputForm,\n} from '@netx/core-components/Form';\n\nimport {InputAdornment as MetadataLookupAdornment} from './components/MetadataLookup';\nimport validators from '../../validators';\nimport {ATTRIBUTE_APPENDABLE_TYPES} from '../../constants';\nimport {AttributeAction} from '../../types';\n\nimport {AttributeAttributes, Value} from '@netx/core-asset/models/attribute';\n\nimport {compareProps} from '@netx/core-components/util';\n\nimport {actionChangesValue, getAttributeComponent} from '../../utils';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\talignItems: 'flex-start',\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tflexDirection: 'column',\n\t\t\tminWidth: 0,\n\t\t\twidth: '100%',\n\t\t\tmargin: theme.spacing(1, 0),\n\t\t\t// Call out fields that are appendable\n\t\t\t// (appendable fields will be disabled)\n\t\t\t'&.append': {\n\t\t\t\t'&[data-nx-appendable=\"true\"] [class*=\"MuiInputBase-root\"]': {\n\t\t\t\t\t'& [class*=\"MuiOutlinedInput-notchedOutline\"]': {\n\t\t\t\t\t\tborderColor: theme.palette.primary.main,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&.error': {},\n\t\t\t'&.multipleValues': {},\n\t\t},\n\n\t\tleadingControls: {\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflex: '0 0 auto',\n\t\t\theight: 'max-content',\n\n\t\t\t'& > *': {\n\t\t\t\tmarginRight: theme.spacing(1),\n\t\t\t},\n\t\t},\n\n\t\tlimitHeightToContainer: {\n\t\t\t'&, & $matchContainerHeight': {\n\t\t\t\theight: '100%',\n\t\t\t\t'& textarea': {\n\t\t\t\t\theight: 'auto !important',\n\t\t\t\t\tmaxHeight: '100%',\n\t\t\t\t\toverflow: 'auto !important',\n\t\t\t\t},\n\t\t\t\t'& $inputWrapper': {\n\t\t\t\t\theight: '100%',\n\t\t\t\t},\n\t\t\t\t'& $input': {\n\t\t\t\t\tmaxHeight: '100%',\n\t\t\t\t},\n\t\t\t\t'& [class*=\"MuiAutocomplete-root\"]': {\n\t\t\t\t\theight: '100%',\n\t\t\t\t\tmaxHeight: '100%',\n\t\t\t\t},\n\t\t\t\t'& [class*=\"MuiFormControl-root\"]': {\n\t\t\t\t\theight: '100%',\n\t\t\t\t\tmaxHeight: '100%',\n\t\t\t\t},\n\t\t\t\t'& [class*=\"MuiInputBase-root\"]': {\n\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\tposition: 'static',\n\t\t\t\t\theight: '100%',\n\t\t\t\t},\n\t\t\t\t'& fieldset': {\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: -5,\n\t\t\t\t\tbottom: -1,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tmatchContainerHeight: {\n\t\t\t'&': {\n\t\t\t\tmargin: 0,\n\t\t\t},\n\t\t\t'& $input': {\n\t\t\t\theight: '100%',\n\t\t\t},\n\t\t\t'& textarea': {\n\t\t\t\theight: '100% !important',\n\t\t\t},\n\t\t},\n\n\t\ttrailingControls: {\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflex: '0 0 auto',\n\t\t\theight: 'max-content',\n\t\t\tmarginRight: -4,\n\t\t\t'& > *': {\n\t\t\t\tmarginLeft: theme.spacing(1),\n\t\t\t},\n\t\t},\n\n\t\tinput: {\n\t\t\talignSelf: 'center',\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tminWidth: 0,\n\t\t\t// \"temp\" fix for floating labels\n\t\t\t// minWidth: 150,\n\t\t},\n\n\t\tinputWrapper: {\n\t\t\talignItems: 'flex-start',\n\t\t\tdisplay: 'inline-flex',\n\t\t\twidth: '100%',\n\t\t},\n\t\t'align-top': {\n\t\t\t'& $inputWrapper': {\n\t\t\t\talignItems: 'flex-start',\n\t\t\t},\n\t\t},\n\t\t'align-bottom': {\n\t\t\t'& $inputWrapper': {\n\t\t\t\talignItems: 'flex-end',\n\t\t\t},\n\t\t},\n\t\t'align-center': {\n\t\t\t'& $inputWrapper': {\n\t\t\t\talignItems: 'center',\n\t\t\t},\n\t\t},\n\t});\n\nexport type AttributeEvent = {\n\tattribute: AttributeAttributes;\n\tvalue: Value;\n\taction: AttributeAction;\n};\n\nexport interface EditableAttributeProps {\n\taction?: AttributeAction;\n\talignActions?: 'top' | 'bottom' | 'center';\n\tappendable?: boolean;\n\tattrData: AttributeAttributes;\n\tattributeWorking?: boolean;\n\tchanged?: boolean;\n\tclearable?: boolean;\n\tdisabled?: boolean;\n\tdisableFolksonomy?: boolean;\n\tenforceMandatory?: boolean;\n\terror?: FormValidationError;\n\tform?: InputForm;\n\tforceClearable?: boolean;\n\thideLabel?: boolean;\n\t/** override attribute name label */\n\tlabel?: string;\n\tloadingValue?: boolean;\n\tlimitHeightToContainer?: boolean;\n\tmatchContainerHeight?: boolean;\n\tisMetadataLookup?: boolean;\n\tisMetadataTarget?: boolean;\n\tmode?: AttributeAction;\n\tmultipleValues?: boolean;\n\tname?: string;\n\tonLookup?: (\n\t\tattribute: AttributeAttributes,\n\t\tlookupValue: string,\n\t) => Promise | undefined;\n\tonSearch?: (value: string) => void;\n\tonValueChange?: (value: Value) => void;\n\toriginalValue?: Value;\n\tplaceholder?: string;\n\tvalue?: any;\n}\n\nconst hasChanged = (\n\tvalue: Value,\n\toriginalValue: Value,\n\tmultipleValues: boolean,\n\taction: AttributeAction,\n) =>\n\t!valuesMatch(value, originalValue, multipleValues) ||\n\tactionChangesValue(value, originalValue, action);\n\nconst EditableAttributeComponent = ({\n\tclasses,\n\talignActions = 'top',\n\tappendable,\n\tmode = 'overwrite',\n\taction = 'overwrite',\n\tchanged,\n\tclearable,\n\tdisableFolksonomy,\n\tenforceMandatory = true,\n\tform,\n\tforceClearable,\n\tattrData,\n\tattributeWorking,\n\tdisabled,\n\terror,\n\thideLabel,\n\tlabel,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\tlimitHeightToContainer,\n\tloadingValue,\n\tmatchContainerHeight,\n\tmultipleValues,\n\tname,\n\tonLookup,\n\tonSearch,\n\tonValueChange,\n\toriginalValue = null,\n\tplaceholder,\n\tvalue = null,\n}: WithStyles & EditableAttributeProps) => {\n\tconst fieldName = name || `${attrData.attributeid}`;\n\n\tconst attributeName =\n\t\tlabel != null\n\t\t\t? label\n\t\t\t: // TODO: handle this before we get here via the attributes context methods\n\t\t\tattrData.system\n\t\t\t? i18n.t(`i18n.${attrData.name}`)\n\t\t\t: attrData.name;\n\n\tconst AttributeComponent = getAttributeComponent(attrData.type);\n\tif (!AttributeComponent) {\n\t\treturn (\n\t\t\t
    \n\t\t\t\t<>Error finding component for attribute type {attrData.type}\n\t\t\t
    \n\t\t);\n\t}\n\n\tconst checkRequired = () => {\n\t\t// We are enforcing mandatory if we:\n\t\t// started with no value\n\t\t// do not have multiple values\n\t\t// If neither of those are true we fallback to the prop passed in\n\t\treturn (\n\t\t\tattrData.mandatory === 1 &&\n\t\t\t(!isEmptyValue(originalValue) && !multipleValues\n\t\t\t\t? true\n\t\t\t\t: enforceMandatory)\n\t\t);\n\t};\n\n\tconst canAppend =\n\t\tappendable && ATTRIBUTE_APPENDABLE_TYPES.includes(attrData.type as any);\n\tconst [required, requiredRef, setRequired] = useRefState(checkRequired());\n\n\tconst modeRef = useRef(mode);\n\tuseEffect(() => {\n\t\tmodeRef.current = mode;\n\t}, [mode]);\n\n\t// Will be sent to attribute component\n\tconst sendProps = {\n\t\taction,\n\t\tattrData: {\n\t\t\t...attrData,\n\t\t\tname: attributeName,\n\t\t},\n\t\tchanged,\n\t\tdisabled: attributeWorking || disabled || (mode === 'append' && !canAppend),\n\t\tdisableFolksonomy,\n\t\terror,\n\t\thideLabel,\n\t\tisMetadataLookup,\n\t\tisMetadataTarget,\n\t\tloadingValue,\n\t\tmultipleValues,\n\t\tname: fieldName,\n\t\tonSearch,\n\t\tplaceholder,\n\t\trequired,\n\t\tvalue: value as any,\n\t};\n\n\tconst lastActionRef = useRef(action);\n\tconst lastValueRef = useRef(value);\n\n\tconst getDisabledActions = () => {\n\t\tconst disabledActions: AttributeAction[] = [];\n\t\tif (!clearable || (!forceClearable && attrData.mandatory === 1)) {\n\t\t\tdisabledActions.push('clear');\n\t\t}\n\t\treturn disabledActions;\n\t};\n\n\tconst [disabledActions, setDisabledActions] = useState(\n\t\tgetDisabledActions(),\n\t);\n\n\t/**\n\t * Set attribute value\n\t * A helper so you do not need to keep proving `attrData.name`\n\t */\n\tconst setValue = useCallback(\n\t\t(value: Value) => form?.setValue(fieldName, value),\n\t\t[fieldName, form?.setValue],\n\t);\n\n\t/**\n\t * Set attribute action\n\t * A helper so you do not need to keep proving `attrData.name`\n\t */\n\tconst setAction = useCallback(\n\t\t(newAction: AttributeAction) => {\n\t\t\tif (newAction === 'clear') {\n\t\t\t\t// If the new `action` is `clear`, clear the value\n\t\t\t\tsetValue(null);\n\t\t\t} else if (action === 'clear') {\n\t\t\t\t// If the current `action` is `clear`, and the value is null,\n\t\t\t\t// set the value back to original\n\t\t\t\tvalue == null && setValue(originalValue);\n\t\t\t}\n\t\t\tform?.setAction(fieldName, newAction);\n\t\t},\n\t\t[fieldName, action, setValue, value],\n\t);\n\n\t// On every render we will check the value\n\t// We want to know if the value impacts the action\n\tuseLayoutEffect(() => {\n\t\t// Do nothing if there was no change\n\t\tif (lastValueRef.current === value) return;\n\n\t\tlastValueRef.current = value;\n\n\t\tconst cleared = action === 'clear';\n\t\tlet newAction = action;\n\t\tif (cleared && value != null) {\n\t\t\tnewAction = mode || 'overwrite';\n\t\t} else if (\n\t\t\tvalue == null &&\n\t\t\t!disabledActions.includes('clear') &&\n\t\t\t!isEmptyValue(originalValue) &&\n\t\t\t!multipleValues\n\t\t) {\n\t\t\tnewAction = 'clear';\n\t\t}\n\n\t\tnewAction !== action && setAction(newAction);\n\t});\n\n\t// On every render we will check the action\n\t// We want to know if the action impacts the value\n\t// or was an invalid action\n\tuseLayoutEffect(() => {\n\t\t// Do nothing if there was no change\n\t\tif (lastActionRef.current === action) return;\n\n\t\tconst lastAction = lastActionRef.current;\n\n\t\tlastActionRef.current = action;\n\t\t// We were passed down an action that is not allowed\n\t\tif (disabledActions.includes(action)) {\n\t\t\tsetAction(mode !== action ? mode : 'overwrite');\n\t\t\treturn;\n\t\t}\n\n\t\tlet newValue = value;\n\t\t// Put back original value when last action was `clear`\n\t\tif (lastAction === 'clear' && value === null) newValue = originalValue;\n\t\t// Empty value on action `clear`\n\t\tif (action === 'clear') newValue = null;\n\n\t\tsetValue(newValue);\n\t});\n\n\t// Setup and tear down of our component\n\t// This will cause an initial re-render due to the action\n\tuseEffect(() => {\n\t\tconst validator = (value: Value) =>\n\t\t\trequiredRef.current && isEmptyValue(value)\n\t\t\t\t? new Error(i18n.t('i18n.mandatory'))\n\t\t\t\t: validators[attrData.type](value, attrData);\n\n\t\tform?.register(fieldName, {\n\t\t\tvalidator,\n\t\t\thasChanged,\n\t\t\tvalue,\n\t\t\taction: modeRef.current,\n\t\t});\n\n\t\treturn () => {\n\t\t\tform?.unregister(fieldName);\n\t\t};\n\t}, [fieldName, attrData.type]);\n\n\t// Props related to the fields requirement have changed\n\tuseUpdateEffect(() => {\n\t\tsetRequired(checkRequired());\n\t}, [attrData.mandatory, enforceMandatory, originalValue]);\n\n\t// Props related to the fields validation have changed\n\tuseUpdateEffect(() => {\n\t\t// Only need to re-run validation for fields with an error already\n\t\t// if the field was not valid, it will be caught at submit\n\t\tform?.errorsRef.current[fieldName] && form?.validateField(fieldName, value);\n\t}, [attrData.mandatory, enforceMandatory]);\n\n\t// Props related to disabled/enabled actions have changed\n\tuseUpdateEffect(() => {\n\t\tsetDisabledActions(getDisabledActions());\n\t}, [clearable, forceClearable, attrData.mandatory]);\n\n\t/** Clear toggle */\n\tconst handleClearToggle = useCallback(\n\t\t(cleared: boolean) => {\n\t\t\tsetAction(cleared ? 'clear' : mode || 'overwrite');\n\t\t},\n\t\t[mode, setAction],\n\t);\n\n\t/** Metadata lookup */\n\tconst handleLookup = useCallback(\n\t\t(lookupValue: string) => onLookup?.(attrData, lookupValue),\n\t\t[attrData, onLookup],\n\t);\n\n\t/** Update value */\n\tconst handleValueChange = useCallback(\n\t\t(newValue: Value) => {\n\t\t\t// Empty value\n\t\t\tif (isEmptyValue(newValue)) {\n\t\t\t\t// If we opted to clear then there is nothing more to do\n\t\t\t\tif (action === 'clear') return;\n\t\t\t\t// Otherwise, normalize our empty values as `null`\n\t\t\t\tnewValue = null;\n\t\t\t}\n\t\t\tonValueChange?.(newValue);\n\t\t\tsetValue(newValue);\n\t\t},\n\t\t[action, setValue, onValueChange],\n\t);\n\n\treturn (\n\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t{isMetadataLookup || isMetadataTarget ? (\n\t\t\t\t\t\t\n\t\t\t\t\t) : null}\n\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t{clearable || forceClearable ? (\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t) : null}\n\t\t\t
    \n\n\t\t\t\n\t\t\n\t);\n};\n\nexport const EditableAttribute = withStyles(styles, {\n\tname: 'Attributes-Attribute-Editable',\n})(\n\tReact.memo(\n\t\tEditableAttributeComponent,\n\t\tcompareProps([], 'attribute-editable'),\n\t),\n);\n\nexport default EditableAttribute;\n","import type {SetOptional} from 'type-fest';\nimport type {EnhancedUserSelector} from '../types';\n\nexport const getCorrectedUserSelector = <\n\tT extends\n\t\t| SetOptional\n\t\t| EnhancedUserSelector\n>(\n\tuserSelector: T,\n): T => {\n\tif (userSelector.all) {\n\t\treturn {\n\t\t\t...userSelector,\n\t\t\tall: true,\n\t\t\tnone: false,\n\t\t\tgroups: [],\n\t\t\tusers: [],\n\t\t};\n\t}\n\n\tif (\n\t\tuserSelector.none ||\n\t\t(!userSelector.groups.length && !userSelector.users.length)\n\t) {\n\t\treturn {\n\t\t\t...userSelector,\n\t\t\tall: false,\n\t\t\tnone: true,\n\t\t\tgroups: [],\n\t\t\tusers: [],\n\t\t};\n\t}\n\n\treturn userSelector;\n};\n\nexport default getCorrectedUserSelector;\n","import Netx from '@netx/core/bootstrap';\n\nexport const setPreference = (key: string, value: any) =>\n\tNetx.setPreference(key, value);\n\nexport default setPreference;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport type {AssetId} from '@netx/core-asset/types';\n\n/**\n * `expireAsset` request params\n * (what is used to send to server)\n */\nexport interface ExpireAssetRequestOptions {\n\tid: AssetId;\n\texpirationDate: number;\n}\n\ntype RequiredExpireAssetRequestOptions = Required;\n\n/**\n * `expireAsset` request\n * (what gets sent to the server)\n */\nexport type ExpireAssetRequest = [\n\tRequiredExpireAssetRequestOptions['id'],\n\tRequiredExpireAssetRequestOptions['expirationDate'],\n];\n\n/**\n * `expireAsset` response\n * (what comes back from the server)\n */\nexport type ExpireAssetResponse = SuccessResponse;\n\n/**\n * `expireAsset` result\n * (what is utilized from the server response)\n */\nexport type ExpireAssetResult = boolean;\n\nexport const expireAssetEndpoint = 'expireAsset';\n\n/**\n * Expire/unexpire asset\n * @param expirtationParams\n */\nexport const expireAsset = async ({\n\tid,\n\texpirationDate,\n}: ExpireAssetRequestOptions): Promise => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: ExpireAssetRequest = [id, expirationDate];\n\n\tconst response = await client.post(\n\t\texpireAssetEndpoint,\n\t\trequestParams,\n\t);\n\n\tif (response.data.result === false)\n\t\tthrow new Error('Unable to set asset expiration');\n\treturn true;\n};\n\nexport default expireAsset;\n","export * from './components';\nexport * from './contexts';\nexport * from './hooks';\nexport * from './react-query';\nexport * from './utils';\nexport * from './types';\n\nexport {default} from './components/VirtualizedList';\n","export const SORT_ORDER = {\n\tASCENDING: 'asc',\n\tDESCENDING: 'desc',\n};\n","import {arrayToCsv} from '@netx/core/utils';\nimport type {SearchRule, SearchRules} from '../rules/types';\n\n/**\n * Need to convert any arrays of values to csv\n * @param value Search rule value\n * @returns Corrected value\n */\nconst correctValueIfNeeded = (value: string | number | string[] | number[]) =>\n\tArray.isArray(value) ? arrayToCsv(value) : value;\n\n/**\n * Convert _n_ rules to a combined search rules object\n * @param rules Search rules\n * @returns Combined search rules\n * @example\n\tconvertToRules(\n\t createKeywordRule({keyword: 'foo'}),\n\t createKeywordRule({keyword: 'bar'}),\n\t);\n\t// {\n\t//\telementTypes: [4, 4],\n\t//\telementSubType1s: [4, 4],\n\t//\telementSubType2s: [0, 0],\n\t//\telementValue1s: ['foo', 'bar],\n\t//\telementValue2s: ['', ''],\n\t//\telementValue3s: ['', ''],\n\t// }\n */\nexport const convertToRules = (...rules: SearchRule[]) => {\n\treturn rules.reduce(\n\t\t(accum, rule, index) => {\n\t\t\taccum.elementTypes[index] = rule.elementType;\n\t\t\taccum.elementSubType1s[index] = rule.elementSubType1;\n\t\t\taccum.elementSubType2s[index] = rule.elementSubType2;\n\t\t\taccum.elementValue1s[index] = correctValueIfNeeded(rule.elementValue1);\n\t\t\taccum.elementValue2s[index] = correctValueIfNeeded(rule.elementValue2);\n\t\t\taccum.elementValue3s[index] = correctValueIfNeeded(rule.elementValue3);\n\t\t\treturn accum;\n\t\t},\n\t\t{\n\t\t\telementTypes: [],\n\t\t\telementSubType1s: [],\n\t\t\telementSubType2s: [],\n\t\t\telementValue1s: [],\n\t\t\telementValue2s: [],\n\t\t\telementValue3s: [],\n\t\t},\n\t);\n};\n\nexport default convertToRules;\n","import React from 'react';\n\nimport {Typography, Skeleton} from '@mui/material';\nimport TablePaginationActions, {\n\tTablePaginationActionsProps,\n} from '@mui/material/TablePagination/TablePaginationActions';\n\nexport interface VirtualizedListClassicPagerProps\n\textends TablePaginationActionsProps {\n\tloading?: boolean;\n}\n\nimport {styled} from '@netx/core-components/Theme';\n\nconst VirtualizedListPagerRoot = styled('div', {\n\tname: 'VirtualizedListPager',\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\talignItems: 'center',\n}));\n\n// const VirtualizedListPagerLabelPages = styled(Typography, {\n// \tname: 'VirtualizedListPager',\n// \tslot: 'LabelWrapper',\n// })(({theme}) => ({\n// \tbackground: theme.palette.custom.background.accent,\n// \tborderRadius: 16,\n// \tpadding: theme.spacing(0.5, 2),\n// \tmarginLeft: theme.spacing(2),\n// }));\n\nconst VirtualizedListPagerLabel = styled('div', {\n\tname: 'VirtualizedListPager',\n\tslot: 'Label',\n})(({theme}) => ({\n\tpaddingRight: theme.spacing(1),\n\tdisplay: 'flex',\n\talignItems: 'center',\n}));\n\nexport const VirtualizedListClassicPagerPrimitive = (\n\tprops: VirtualizedListClassicPagerProps,\n) => {\n\tconst {count, loading, page, rowsPerPage, ...sendProps} = props;\n\n\t// const totalPages = Math.ceil(count / rowsPerPage);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{loading ? (\n\t\t\t\t\t\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{(rowsPerPage * page + 1).toLocaleString() + ' '}-{' '}\n\t\t\t\t\t\t\t{Math.min(\n\t\t\t\t\t\t\t\trowsPerPage * page + rowsPerPage,\n\t\t\t\t\t\t\t\tcount,\n\t\t\t\t\t\t\t).toLocaleString() + ' '}\n\t\t\t\t\t\t\tof {count.toLocaleString()}{' '}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/* \n\t\t\t\t\t\t\tPage {(page + 1).toLocaleString()} of {totalPages.toLocaleString()}\n\t\t\t\t\t\t */}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport const VirtualizedListClassicPager = VirtualizedListClassicPagerPrimitive;\nexport default VirtualizedListClassicPager;\n","import React from 'react';\n\nimport {Typography, Skeleton} from '@mui/material';\nimport TablePaginationActions, {\n\tTablePaginationActionsProps,\n} from '@mui/material/TablePagination/TablePaginationActions';\n\nexport interface VirtualizedListPagerProps extends TablePaginationActionsProps {\n\tloading?: boolean;\n\tvisibleStartIndex: number;\n\tvisibleStopIndex: number;\n}\n\nimport {styled} from '@netx/core-components/Theme';\n\nconst VirtualizedListPagerRoot = styled('div', {\n\tname: 'VirtualizedListPager',\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\talignItems: 'center',\n}));\n\nconst VirtualizedListPagerLabel = styled('div', {\n\tname: 'VirtualizedListPager',\n\tslot: 'Label',\n})(({theme}) => ({\n\tpaddingRight: theme.spacing(1),\n}));\n\nexport const VirtualizedListPagerPrimitive = (\n\tprops: VirtualizedListPagerProps,\n) => {\n\tconst {\n\t\tvisibleStartIndex,\n\t\tvisibleStopIndex,\n\t\tloading,\n\t\tpage,\n\t\t...sendProps\n\t} = props;\n\tlet currentPage = page;\n\tif (visibleStopIndex === props.count - 1)\n\t\tcurrentPage = Math.floor(props.count / props.rowsPerPage);\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{loading ? (\n\t\t\t\t\t\n\t\t\t\t) : (\n\t\t\t\t\t\n\t\t\t\t\t\t{(visibleStartIndex + 1).toLocaleString() + ' '}-{' '}\n\t\t\t\t\t\t{(visibleStopIndex + 1).toLocaleString() + ' '}of{' '}\n\t\t\t\t\t\t{props.count.toLocaleString()}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport const VirtualizedListPager = VirtualizedListPagerPrimitive;\nexport default VirtualizedListPager;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {AttributeTemplate} from '../types';\n\nexport type MetadataDatasetLookup = {\n\tlabel: AttributeTemplate['name'];\n\tvalue: string;\n};\n\n/**\n * `metadataDatasetLookup` request params\n * (what is used to send to server)\n */\nexport type MetadataDatasetLookupRequestOptions = {\n\tname: AttributeTemplate['name'];\n\tvalue: string;\n};\n\n/**\n * `metadataDatasetLookup` request\n * (what gets sent to the server)\n */\nexport type MetadataDatasetLookupRequest = [\n\tMetadataDatasetLookupRequestOptions['name'],\n\tMetadataDatasetLookupRequestOptions['value'],\n];\n\n/**\n * `metadataDatasetLookup` response\n * (what comes back from the server)\n */\nexport type MetadataDatasetLookupResponse = SuccessResponse<\n\tMetadataDatasetLookupResult\n>;\n\n/**\n * `metadataDatasetLookup` result\n * (what is utilized from the server response)\n */\nexport type MetadataDatasetLookupResult = MetadataDatasetLookup[];\n\nexport const metadataDatasetLookupEndpoint = 'metadataDatasetLookup';\n\n/**\n * Metadata dataset lookup\n */\nexport const metadataDatasetLookup = async ({\n\tname,\n\tvalue,\n}: MetadataDatasetLookupRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: MetadataDatasetLookupRequest = [name, value];\n\n\treturn client\n\t\t.post(\n\t\t\tmetadataDatasetLookupEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default metadataDatasetLookup;\n","import React, {useMemo, useEffect, useCallback} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\nimport type {Optional} from '@netx/core/typings';\n\nimport SelectField, {\n\tSelectFieldProps,\n} from '@netx/core-components/Form/SelectField';\nimport type {InputForm} from '@netx/core-components/Form/typings';\n\nimport {AttributeAttributes} from '@netx/core-asset/models/attribute';\nimport {getAttributeLabelFromId} from '@netx/core-asset/components/Attributes/Attribute/utils';\nexport interface AttributeDropdownProps<\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false\n>\n\textends Optional<\n\t\tSelectFieldProps,\n\t\t'name'\n\t> {\n\tattributes: AttributeAttributes[];\n\tselected?: number[];\n\tform?: InputForm;\n}\n\nconst getOptionSelected = (option, value) => option?.id === value?.id;\n\ntype Option = {\n\tvalue: string;\n\tid: number;\n};\n\nexport const AttributeDropdown = <\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false\n>({\n\tattributes,\n\tselected = [],\n\tform,\n\tonChange,\n\tname = 'attribute-select',\n\t...props\n}: AttributeDropdownProps) => {\n\tconst options = useMemo(() => {\n\t\treturn attributes\n\t\t\t.filter(({attributeid}) => !selected.includes(attributeid))\n\t\t\t.map(({attributeid}) => ({\n\t\t\t\tvalue: getAttributeLabelFromId(attributeid),\n\t\t\t\tid: attributeid,\n\t\t\t}));\n\t}, [attributes, selected]);\n\n\t// Form support\n\tuseEffect(() => {\n\t\tif (!form) return;\n\t\tform.register(name);\n\t\treturn () => {\n\t\t\tform.unregister(name);\n\t\t};\n\t}, [name]);\n\n\tconst handleChange = useCallback<\n\t\tRequired<\n\t\t\tSelectFieldProps\n\t\t>['onChange']\n\t>(\n\t\t(value) => {\n\t\t\tform?.setValue(name, value);\n\t\t\tonChange?.(value);\n\t\t},\n\t\t[onChange, form?.setValue, name],\n\t);\n\t// !Form support\n\n\treturn (\n\t\t\n\t\t\tlabel={i18n.t('i18n.attributes')}\n\t\t\t{...props}\n\t\t\tname={name}\n\t\t\tinputProps={{\n\t\t\t\t'aria-label': 'attribute select field',\n\t\t\t\tplaceholder: i18n.t('i18n.pleaseSelect'),\n\t\t\t\t...props.inputProps,\n\t\t\t}}\n\t\t\tlabelKey=\"value\"\n\t\t\toptions={options}\n\t\t\tonChange={handleChange}\n\t\t\tAutocompleteProps={{\n\t\t\t\tisOptionEqualToValue: getOptionSelected,\n\t\t\t\t...props.AutocompleteProps,\n\t\t\t\tfilterOptions: (options, state) => {\n\t\t\t\t\tconst inputValue = state.inputValue.toLowerCase();\n\t\t\t\t\tconst filteredOptions =\n\t\t\t\t\t\tinputValue === ''\n\t\t\t\t\t\t\t? options\n\t\t\t\t\t\t\t: options.filter((option) => {\n\t\t\t\t\t\t\t\t\treturn option.value.toLowerCase().includes(inputValue);\n\t\t\t\t\t\t\t });\n\t\t\t\t\tif (props.AutocompleteProps?.filterOptions)\n\t\t\t\t\t\treturn props.AutocompleteProps?.filterOptions(\n\t\t\t\t\t\t\tfilteredOptions,\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t);\n\t\t\t\t\treturn filteredOptions;\n\t\t\t\t},\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport default AttributeDropdown;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const CHIP_SKELETON_CLASS_NAME = 'ChipSkeleton';\nexport const CHIP_SKELETON_CLASS_SLOTS = ['root'] as const;\n\nexport type ChipSkeletonClassSlot = typeof CHIP_SKELETON_CLASS_SLOTS[number];\n\nexport interface ChipSkeletonClasses {\n\troot: string;\n}\n\nexport type ChipSkeletonClassKey = keyof ChipSkeletonClasses;\n\nexport const getChipSkeletonUtilityClass = (slot: ChipSkeletonClassSlot) =>\n\tgenerateUtilityClass(CHIP_SKELETON_CLASS_NAME, slot);\n\nexport const chipSkeletonClasses: ChipSkeletonClasses = generateUtilityClasses(\n\tCHIP_SKELETON_CLASS_NAME,\n\t['root'],\n);\n\nexport default chipSkeletonClasses;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport Chip, {ChipProps, ChipSkeleton} from '@netx/core-components/Chip';\n\nimport {Avatar, Tooltip} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {\n\tfaBookMedical as PlusIcon,\n\tfaSearch as SearchIcon,\n} from '@fortawesome/pro-solid-svg-icons';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\ticon: {\n\t\t\tflex: '0 0 auto',\n\t\t\tlineHeight: 1,\n\t\t},\n\t\tsearch: {\n\t\t\tcursor: 'pointer',\n\t\t},\n\t});\n\nexport type ValueChipProps = ChipProps & {\n\tloading?: boolean;\n\tonSearch?: (value: string) => void;\n\tuncontrolledValue?: boolean;\n\tvalue?: string;\n};\n\nconst ValueChip = ({\n\tclasses,\n\tloading,\n\tonSearch,\n\tuncontrolledValue,\n\tvalue,\n\t...props\n}: WithStyles & ValueChipProps) => {\n\tif (loading) return ;\n\tif (value == null) return null;\n\treturn (\n\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t) : onSearch ? (\n\t\t\t\t\t\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tonSearch(value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t) : undefined\n\t\t\t}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nexport default withStyles(styles)(ValueChip);\n","import React, {useEffect} from 'react';\nimport {FormValidationError} from '..';\n\ntype Options = {\n\terror?: FormValidationError | boolean;\n\tinputRef: React.RefObject;\n};\n\nconst IGNORE = ['INPUT', 'SELECT'];\n\nexport const useErrorFocus = ({error, inputRef}: Options) => {\n\tuseEffect(() => {\n\t\tif (\n\t\t\t!error ||\n\t\t\t(document.activeElement &&\n\t\t\t\tIGNORE.includes(document.activeElement?.nodeName))\n\t\t)\n\t\t\treturn;\n\n\t\t// console.log(document.activeElement?.nodeName);\n\t\tinputRef.current?.focus();\n\t}, [error]);\n};\n\nexport default useErrorFocus;\n","export * from './useAttributes';\nexport {default} from './useAttributes';\n","import {ATTRIBUTE_TYPE} from '../constants';\nimport {AttributeType, AttributeValue} from '../types';\n\nimport {isEmptyValue} from '@netx/core-components/Form/util';\nimport dateParser from '../parsers/date';\n\n/**\n * In a lot of cases our values come through as arrays regardless of the multi-value\n * ability of an attribute template type\\\n * When utilizing a value from the server, pass it through this utility to ensure the\n * value is in the proper format (array vs non array) for that attribute template type\n * @param type Attribute template type\n * @param value Value to parse\n */\nexport const parseValue = (type: AttributeType, value: AttributeValue) => {\n\tswitch (type) {\n\t\tcase ATTRIBUTE_TYPE.DATE:\n\t\t\tvalue = Array.isArray(value)\n\t\t\t\t? !isEmptyValue(value[0])\n\t\t\t\t\t? value[0]\n\t\t\t\t\t: null\n\t\t\t\t: value;\n\t\t\treturn dateParser(value as string);\n\t\tcase ATTRIBUTE_TYPE.NUMBER:\n\t\tcase ATTRIBUTE_TYPE.SELECT:\n\t\tcase ATTRIBUTE_TYPE.TEXT:\n\t\tcase ATTRIBUTE_TYPE.TEXTAREA:\n\t\t\treturn Array.isArray(value)\n\t\t\t\t? !isEmptyValue(value[0])\n\t\t\t\t\t? value[0]\n\t\t\t\t\t: null\n\t\t\t\t: value;\n\t\tcase ATTRIBUTE_TYPE.MULTISELECT:\n\t\tcase ATTRIBUTE_TYPE.SEMANTIC:\n\t\tcase ATTRIBUTE_TYPE.TAG:\n\t\tcase ATTRIBUTE_TYPE.TAG_VOCAB:\n\t\t\treturn Array.isArray(value) ? value : !isEmptyValue(value) ? [value] : [];\n\t}\n\treturn value;\n};\n\nexport default parseValue;\n","import {AttributeType} from '../types';\nimport {ATTRIBUTE_MULTIPLE_VALUE_TYPES} from '../constants';\n\n/**\n * Is multi value attribute template type\n * @param type Attribute template type\n * @return Is multivalue\n */\nexport const isMultiValue = (type: AttributeType) =>\n\tATTRIBUTE_MULTIPLE_VALUE_TYPES.includes(\n\t\ttype as typeof ATTRIBUTE_MULTIPLE_VALUE_TYPES[number],\n\t);\n\nexport default isMultiValue;\n","export {default as attributes} from './attributes';\nexport * from './attributes';\n\nexport {default as attributeSets} from './attributeSets';\nexport * from './attributeSets';\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\n\nimport PagerModel from '@netx/core-app/models/pager';\nimport SorterModel from '@netx/core-app/models/sorter';\n\nimport Netx, {dispatcher} from '@netx/core/bootstrap';\n\nexport default class SharedResources extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this collection\n\t * @property {method} methods.read - Fetch shared resources for current user\n\t * @property {method} methods.fetchForUser - Fetch shared resources for user\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'getSharedResources',\n\t\t\t\t\tNetx.getUser().id,\n\t\t\t\t\tthis.resourceName,\n\t\t\t\t\tthis.modeFilters,\n\t\t\t\t\tthis.filterStr,\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Admins only\n\t\t\t * @method\n\t\t\t * @param {number} userId User id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchForUser(userId, opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'getSharedResources',\n\t\t\t\t\tuserId,\n\t\t\t\t\tthis.resourceName,\n\t\t\t\t\tthis.modeFilters,\n\t\t\t\t\tthis.filterStr,\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Parsers for this collection\n\t * @property {method} parsers.fetchForUser - Parse response of user shared resources\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} data Shared resources\n\t\t\t * @param {number} userId User id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchForUser(data, userId, opts) {\n\t\t\t\topts = opts || {};\n\n\t\t\t\tthis.set(data, opts);\n\t\t\t\t!opts.silent && this.trigger('sync', this, data, opts);\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\tsuper(models, opts);\n\n\t\tthis.resourceName = opts.resourceName;\n\n\t\t/**\n\t\t * This is non negotiable - we use the fields supported by `sharedResourceSortDTO`\n\t\t * @memberof module:share/collections/sharedResources\n\t\t * @override\n\t\t * @alias sortableFields\n\t\t * @type {array}\n\t\t */\n\t\tthis.sortableFields = opts.sortableFields || [\n\t\t\t'id',\n\t\t\t'creationDate',\n\t\t\t'contentCount',\n\t\t\t'modDate',\n\t\t\t'title',\n\t\t];\n\n\t\t/**\n\t\t * Mode filters (read/write/delete/favorites)\n\t\t * @memberof module:share/collections/sharedResources\n\t\t * @alias modeFilters\n\t\t * @type {array}\n\t\t */\n\t\tthis.modeFilters = opts.modeFilters || null;\n\n\t\t/**\n\t\t * Paging model\n\t\t * @memberof module:share/collections/sharedResources\n\t\t * @alias pager\n\t\t * @type {module:app/models/pager}\n\t\t */\n\t\tthis.pager = new PagerModel(_.extend({}, opts.pager), {collection: this});\n\n\t\t/**\n\t\t * Sorting model\n\t\t * @memberof module:asset/models/assetProject\n\t\t * @alias sorter\n\t\t * @type {module:app/models/sorter}\n\t\t */\n\t\tthis.sorter = new SorterModel(\n\t\t\t{\n\t\t\t\tfield: opts.sortField || 'title',\n\t\t\t\torder: opts.sortOrder || 'desc',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcollection: this,\n\t\t\t\tsortableFields: this.sortableFields,\n\t\t\t},\n\t\t);\n\n\t\t/**\n\t\t * Update main collections when a shared resource is toggled as favorite\n\t\t * @listens share:sharedResource:toggle:favorite:success\n\t\t * @param {module:share/models/sharedResource} sharedResource Shared resource\n\t\t * @param {boolean} isFavorite Is favorite\n\t\t */\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'share:sharedResource:toggle:favorite:success',\n\t\t\t(sharedResource, isFavorite) => {\n\t\t\t\tif (sharedResource.resourceName !== this.resourceName) return;\n\n\t\t\t\tconst model = this.get(sharedResource.id);\n\n\t\t\t\t// Existing, reflect `isFavorite`\n\t\t\t\tmodel && model.set('isFavorite', isFavorite);\n\n\t\t\t\t// We are filtered down to favorites, add or remove the model\n\t\t\t\tif (this.hasModeFilter('favorites')) {\n\t\t\t\t\tisFavorite\n\t\t\t\t\t\t? this.add(sharedResource.attributes, {merge: true})\n\t\t\t\t\t\t: model && this.remove(model);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} mode Mode\n\t * @return {boolean} Has mode filter\n\t */\n\thasModeFilter(mode) {\n\t\treturn this.modeFilters && _.contains(this.modeFilters, mode);\n\t}\n\n\t/** @override */\n\tisFiltered() {\n\t\tconst filtered = super.isFiltered();\n\t\treturn filtered || this.filterStr !== '' || this.selectedMode != null;\n\t}\n\n\t/**\n\t * @method\n\t * @param {module:share/models/sharedResource} model Shared resource\n\t * @return {boolean}\n\t */\n\tmatchesFilters(model) {\n\t\tif (\n\t\t\tthis.filterStr !== '' &&\n\t\t\t!model.getTitle().toLowerCase().match(this.filterStr.toLowerCase())\n\t\t)\n\t\t\treturn false;\n\n\t\tif (this.hasModeFilter('favorites')) {\n\t\t\treturn model.isFavorite();\n\t\t}\n\n\t\treturn this.selectedMode ? model.allows(this.selectedMode) : true;\n\t}\n\n\t/**\n\t * Reset the mode filter and refetch\n\t * @method\n\t */\n\tresetModeFilter() {\n\t\t// Nothing to reset\n\t\tif (this.selectedMode == null) return new $.Deferred().resolve();\n\n\t\tthis.selectedMode = this.modeFilters = null;\n\t\t// Reset to first page\n\t\tthis.pager.firstPage();\n\t\t// Fetch the unfiltered data\n\t\treturn this.fetch({duplicateQueryPolicy: 'abort'});\n\t}\n\n\t/**\n\t * Set mode filter refetch\n\t * @method\n\t * @param {string} mode Mode filter\n\t */\n\tsetModeFilter(mode) {\n\t\t// No filter, reset\n\t\tif (!mode) return this.resetModeFilter();\n\n\t\t// Nothing to do\n\t\tif (this.selectedMode === mode) return new $.Deferred().resolve();\n\n\t\tthis.selectedMode = mode;\n\n\t\tswitch (mode) {\n\t\t\t// In cases of write (edit)- a user can write to anything they can delete\n\t\t\tcase 'write':\n\t\t\t\tthis.modeFilters = ['delete', 'write'];\n\t\t\t\tbreak;\n\t\t\t// Favorites\n\t\t\t// case 'favorites':\n\t\t\t// The following will enforce that permission ONLY for filtering\n\t\t\t// Manage\n\t\t\t// case 'delete':\n\t\t\t// Read-only\n\t\t\t// case 'read':\n\t\t\tdefault:\n\t\t\t\tthis.modeFilters = [mode];\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Reset to first page\n\t\tthis.pager.firstPage();\n\n\t\treturn this.fetch({duplicateQueryPolicy: 'abort'});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SharedResources';\n\t}\n}\n","export const SearchTypeCart = 10 as const;\nexport type TSearchTypeCart = typeof SearchTypeCart;\n","export const SearchTypeContents = 2 as const;\nexport type TSearchTypeContents = typeof SearchTypeContents;\n\n/** elementSubType1 */\nexport enum ContentsType {\n\tMATCH_ALL_FRAGMENTS = 4,\n\tMATCH_ALL_WHOLE_WORDS_AND = 0,\n\tMATCH_ANY_FRAGMENT = 5,\n\tMATCH_ANY_WHOLE_WORDS_OR = 2,\n\tMATCH_EXACTLY = 1,\n\tMATCH_EXCLUDE = 3,\n}\n","import {useEffect, useState} from 'react';\n\nimport type {AttributeId, Lookups} from '../types';\nimport {attributes as attributesSingleton} from '@netx/core-asset/collections/singleton';\n\nexport type LookupsAllowed = Lookups;\n\n/**\n * Get valid targets/keys for lookups in sets\n */\nexport const useMetadataLookupsAllowed = (\n\tattributeIds: AttributeId[],\n\tdisableLookups = false,\n): LookupsAllowed => {\n\tconst [lookupsAllowed, setLookupsAllowed] = useState({\n\t\tkeys: [],\n\t\ttargets: [],\n\t});\n\n\t/** Set the lookup keys and targets to empty */\n\tconst setEmpty = () => {\n\t\tsetLookupsAllowed({\n\t\t\tkeys: [],\n\t\t\ttargets: [],\n\t\t});\n\t};\n\n\tuseEffect(() => {\n\t\tif (disableLookups) {\n\t\t\tsetEmpty();\n\t\t\treturn;\n\t\t}\n\n\t\t// Get templates for ids\n\t\tconst templates = attributesSingleton.filter((attr) =>\n\t\t\tattributeIds.includes(attr.id),\n\t\t);\n\n\t\t// Get all key related attributes\n\t\tconst keys = templates.filter((attr) => !!attr.get('keyDatasets').length);\n\t\t// Get all target related attributes\n\t\tconst targets = templates.filter(\n\t\t\t(attr) => !!attr.get('targetDatasets').length,\n\t\t);\n\n\t\t// Nohting here\n\t\tif (!keys.length || !targets.length) {\n\t\t\tsetEmpty();\n\t\t\treturn;\n\t\t}\n\n\t\t// Get the attribute ids that are keys with target and targets with keys\n\t\t// we will not support lookups on keys that have no targets and vice versa\n\t\tsetLookupsAllowed({\n\t\t\tkeys: keys\n\t\t\t\t.filter((attr) =>\n\t\t\t\t\tattr\n\t\t\t\t\t\t.get('keyDatasets')\n\t\t\t\t\t\t.some((keyId: AttributeId) =>\n\t\t\t\t\t\t\ttemplates.some((attr) =>\n\t\t\t\t\t\t\t\tattr.get('targetDatasets').includes(keyId),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.map((attr) => attr.id),\n\t\t\ttargets: targets\n\t\t\t\t.filter((attr) =>\n\t\t\t\t\tattr\n\t\t\t\t\t\t.get('targetDatasets')\n\t\t\t\t\t\t.some((targetId: AttributeId) =>\n\t\t\t\t\t\t\ttemplates.some((attr) =>\n\t\t\t\t\t\t\t\tattr.get('keyDatasets').includes(targetId),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.map((attr) => attr.id),\n\t\t});\n\t}, [disableLookups, attributeIds]);\n\n\treturn lookupsAllowed;\n};\n\nexport default useMetadataLookupsAllowed;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const DRAG_RESIZE_CLASS_NAME = 'DragResize';\nexport const DRAG_RESIZE_CLASS_SLOTS = ['root', 'content', 'sentinel'] as const;\n\nexport type DragResizeClassSlot = typeof DRAG_RESIZE_CLASS_SLOTS[number];\n\nexport interface DragResizeClasses {\n\troot: string;\n\tcontent: string;\n\tsentinel: string;\n\n\tdragging: string;\n\tbottom: string;\n\tleft: string;\n\tright: string;\n\ttop: string;\n}\n\nexport type DragResizeClassKey = keyof DragResizeClasses;\n\nexport const getDragResizeUtilityClass = (slot: DragResizeClassSlot) =>\n\tgenerateUtilityClass(DRAG_RESIZE_CLASS_NAME, slot);\n\nexport const dragResizeClasses: DragResizeClasses = generateUtilityClasses(\n\tDRAG_RESIZE_CLASS_NAME,\n\t['root', 'content', 'dragging', 'left', 'right', 'sentinel', 'top', 'bottom'],\n);\n\nexport default dragResizeClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {DragResizeDirection, DRAG_RESIZE_DEFAULT_DIRECTION} from './constants';\nimport {\n\tdragResizeHandleClasses,\n\tgetDragResizeHandleUtilityClass,\n\tDragResizeHandleClasses,\n\tDRAG_RESIZE_HANDLE_CLASS_NAME,\n} from './dragResizeHandleClasses';\n\ntype DragResizeHandleUtiltiyClassProps = WithClasses<\n\tDragResizeHandleClasses,\n\t{\n\t\tdragging?: boolean;\n\t\tdirection: DragResizeDirection;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: DragResizeHandleUtiltiyClassProps) => {\n\tconst {classes, direction, dragging} = ownerState;\n\tconst slots = {\n\t\troot: ['root', direction, dragging && 'dragging'],\n\t\tellipsis: ['ellipsis'],\n\t};\n\treturn composeClasses(slots, getDragResizeHandleUtilityClass, classes);\n};\n\nconst DragResizeHandleRoot = styled('div', {\n\tname: DRAG_RESIZE_HANDLE_CLASS_NAME,\n\tslot: 'Root',\n})(({theme, ownerState}) => {\n\tconst {direction} = ownerState as DragResizeHandleUtiltiyClassProps;\n\treturn {\n\t\talignItems: 'center',\n\t\tbackground: theme.palette.custom.background.accent,\n\t\tdisplay: 'flex',\n\t\tjustifyContent: 'center',\n\t\t// opacity: 1,\n\t\tposition: 'absolute',\n\t\t// transition: theme.transitions.create('opacity', {\n\t\t// \tduration: theme.transitions.duration.short,\n\t\t// \teasing: theme.transitions.easing.easeInOut,\n\t\t// }),\n\t\tuserSelect: 'none !important',\n\t\tzIndex: theme.zIndex.drawer,\n\t\t...([DragResizeDirection.LEFT, DragResizeDirection.RIGHT].includes(\n\t\t\tdirection,\n\t\t)\n\t\t\t? {\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tcursor: 'col-resize',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\twidth: 3,\n\t\t\t\t\t...(direction === DragResizeDirection.LEFT\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tborderLeft: '1px solid transparent',\n\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tborderRight: '1px solid transparent',\n\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t }),\n\t\t\t\t\t[`& .${dragResizeHandleClasses.ellipsis}`]: {\n\t\t\t\t\t\theight: 17,\n\t\t\t\t\t\tmarginLeft: 8,\n\t\t\t\t\t\ttransform: 'rotate(90deg)',\n\t\t\t\t\t},\n\t\t\t }\n\t\t\t: {\n\t\t\t\t\tcursor: 'row-resize',\n\t\t\t\t\theight: 3,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\t...(direction === DragResizeDirection.TOP\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tborderTop: '1px solid transparent',\n\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tborderBottom: '1px solid transparent',\n\t\t\t\t\t\t\t\tbottom: -1,\n\t\t\t\t\t\t }),\n\t\t\t\t\t[`& .${dragResizeHandleClasses.ellipsis}`]: {\n\t\t\t\t\t\twidth: 17,\n\t\t\t\t\t},\n\t\t\t }),\n\t\t[`&:hover, &.${dragResizeHandleClasses.dragging}`]: {\n\t\t\tborderColor: theme.palette.secondary.main,\n\t\t},\n\t} as any;\n});\n\nconst DragResizeHandleEllipsis = styled('div', {\n\tname: DRAG_RESIZE_HANDLE_CLASS_NAME,\n\tslot: 'ellipsis',\n})(({theme}) => ({\n\tdisplay: 'none',\n\tcolor:\n\t\ttheme.palette.mode === 'light'\n\t\t\t? 'rgba(0, 0, 0, 0.2)'\n\t\t\t: 'rgba(255, 255, 255, 0.2)',\n\tfontSize: '20px',\n\tuserSelect: 'none',\n}));\n\nexport type DragResizeHandleProps = WithClasses<\n\tDragResizeHandleClasses,\n\tReact.DetailedHTMLProps<\n\t\tReact.HTMLAttributes,\n\t\tHTMLDivElement\n\t> & {\n\t\tdirection?: DragResizeDirection;\n\t\tisDragging?: boolean;\n\t}\n>;\n\nexport const DragResizeHandle = ({\n\tclasses: _classes,\n\tclassName,\n\tdirection = DRAG_RESIZE_DEFAULT_DIRECTION,\n\tisDragging,\n\t...props\n}: DragResizeHandleProps) => {\n\tconst ownerState = {\n\t\tclasses: _classes,\n\t\tdirection,\n\t\tdragging: isDragging,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t…\n\t\t\t\n\t\t\n\t);\n};\n\nexport default DragResizeHandle;\n","import React, {\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n\tuseMemo,\n} from 'react';\nimport _ from 'underscore';\nimport ResizeObserver from 'resize-observer-polyfill';\n\nimport {useUserPref} from '@netx/core-components/hooks/useUserPref';\nimport {\n\tAxis,\n\tDragResizeDirection,\n\tDRAG_RESIZE_DEFAULT_DIRECTION,\n\tClientPosition,\n\tClientDimension,\n\tOffsetDimension,\n\tScrollDimension,\n} from './constants';\n\nconst getAxisFromDirection = (direction: DragResizeDirection) =>\n\tdirection === DragResizeDirection.LEFT ||\n\tdirection === DragResizeDirection.RIGHT\n\t\t? Axis.X\n\t\t: Axis.Y;\nconst getDirectionAsNumber = (direction: DragResizeDirection) =>\n\tdirection === DragResizeDirection.LEFT ||\n\tdirection === DragResizeDirection.TOP\n\t\t? -1\n\t\t: 1;\n\nexport type UseDragResizeProps = {\n\tdirection?: DragResizeDirection;\n\tdisabled?: boolean;\n\tmaxSize?: number;\n\tminSize?: number;\n\tsize?: number;\n\t/** TODO: changing this after the fact will result in unwanted results */\n\toverflowParentEl?: React.RefObject;\n\tuserPref?: string;\n\tonResize?: (size: number) => void;\n\tonResizeStarted?: () => void;\n\tonResizeEnded?: (size: number) => void;\n};\n\nexport const useDragResize = ({\n\tdisabled,\n\tmaxSize,\n\t// there will always be a minimum size for the sake of math the end user\n\tminSize = 10,\n\tsize,\n\tdirection = DRAG_RESIZE_DEFAULT_DIRECTION,\n\toverflowParentEl,\n\tuserPref,\n\tonResize,\n\tonResizeEnded,\n\tonResizeStarted,\n}: UseDragResizeProps) => {\n\tconst [userPrefSize, setUserPrefSize] = useUserPref(userPref, {\n\t\tparseIn: useCallback(\n\t\t\t(value) => (value != null ? parseInt(value) : size || 0),\n\t\t\t[],\n\t\t),\n\t});\n\n\tconst [currentSize, setCurrentSize] = useState(userPrefSize);\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst isDraggingRef = useRef(isDragging);\n\n\tconst initialSizeRef = useRef(0);\n\tconst lastSizeRef = useRef(0);\n\tconst pointerStartRef = useRef(0);\n\tconst lastMouseDownRef = useRef(Date.now());\n\tconst limitSize = useRef(0);\n\tconst draggedOnce = useRef(false);\n\n\tconst maxSizeRef = useRef(maxSize);\n\tmaxSizeRef.current = maxSize;\n\tconst minSizeRef = useRef(minSize);\n\tminSizeRef.current = minSize;\n\tconst currentSizeRef = useRef(currentSize);\n\tcurrentSizeRef.current = currentSize;\n\n\tconst sizeDirection = useRef(getDirectionAsNumber(direction));\n\tuseEffect(() => {\n\t\tsizeDirection.current = getDirectionAsNumber(direction);\n\t}, [direction]);\n\n\tconst axis = getAxisFromDirection(direction);\n\tconst axisRef = useRef(axis);\n\taxisRef.current = axis;\n\n\tconst timeout = useRef();\n\n\tconst [recheck, setRecheck] = useState({});\n\n\tconst checkLimits = useCallback(() => {\n\t\ttimeout.current && clearTimeout(timeout.current);\n\n\t\trequestAnimationFrame(() => {\n\t\t\tconst overflowEl = overflowParentEl?.current;\n\t\t\tif (!overflowEl) return;\n\n\t\t\tconst axis = axisRef.current;\n\t\t\tconst clientSize = Math.round(overflowEl[ClientDimension[axis]]);\n\t\t\tconst scrollSize = Math.round(overflowEl[ScrollDimension[axis]]);\n\t\t\tconst minSize = minSizeRef.current;\n\n\t\t\tsetCurrentSize((currentSize) => {\n\t\t\t\tif (clientSize < scrollSize || currentSize >= clientSize) {\n\t\t\t\t\tlet newSize = currentSize - (scrollSize - clientSize);\n\t\t\t\t\tif (newSize < minSize) newSize = minSize;\n\t\t\t\t\tconst limitToSize = newSize;\n\t\t\t\t\tif (draggedOnce.current) limitSize.current = limitToSize;\n\t\t\t\t\ttimeout.current = setTimeout(() => setRecheck({}), 200);\n\t\t\t\t\treturn newSize;\n\t\t\t\t}\n\t\t\t\treturn currentSize;\n\t\t\t});\n\t\t});\n\t}, []);\n\n\t// Cleanup timeout(s)\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\ttimeout.current && clearTimeout(timeout.current);\n\t\t};\n\t}, []);\n\n\t// When the overflow parent size changes\n\t// this can be from other elements on the page or the window itself resizing\n\t// we want to keep all resizable areas in bounds\n\tuseEffect(() => {\n\t\tif (disabled) {\n\t\t\tsetIsDragging(false);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!overflowParentEl?.current) return;\n\t\tconst RO = new ResizeObserver(\n\t\t\t_.debounce(() => {\n\t\t\t\tsetRecheck({});\n\t\t\t}, 16),\n\t\t);\n\t\tRO.observe(overflowParentEl.current);\n\n\t\treturn () => {\n\t\t\tRO.disconnect();\n\t\t};\n\t}, [disabled]);\n\n\tuseEffect(() => {\n\t\tif (!isDragging) return;\n\t\t// setting global style via jss is EXPENSIVE\n\t\tconst classes = [`drag-resizing`, `drag-resizing-${axisRef.current}`];\n\t\tdocument.documentElement.classList.add(...classes);\n\t\treturn () => {\n\t\t\tdocument.documentElement.classList.remove(...classes);\n\t\t};\n\t}, [isDragging]);\n\n\tuseEffect(() => {\n\t\tif (lastSizeRef.current === currentSize) return;\n\t\tlastSizeRef.current = currentSize;\n\t\tonResize?.(currentSize);\n\t});\n\n\tuseLayoutEffect(() => {\n\t\tif (isDraggingRef.current === isDragging) return;\n\t\tisDraggingRef.current = isDragging;\n\t\tif (isDragging) {\n\t\t\tonResizeStarted?.();\n\t\t\treturn;\n\t\t}\n\t\tsetUserPrefSize(currentSize);\n\t\tonResizeEnded?.(currentSize);\n\t});\n\n\tuseLayoutEffect(() => {\n\t\tif (!isDragging) return;\n\n\t\tconst mousemove = _.throttle(\n\t\t\t(event: MouseEvent): void => {\n\t\t\t\tdraggedOnce.current = true;\n\n\t\t\t\tconst axis = axisRef.current;\n\t\t\t\tconst maxSize = limitSize.current || maxSizeRef.current;\n\t\t\t\tconst minSize = minSizeRef.current;\n\t\t\t\tconst initialSize = initialSizeRef.current;\n\t\t\t\tconst startPosition = pointerStartRef.current;\n\n\t\t\t\tlet size = Math.round(\n\t\t\t\t\tinitialSize +\n\t\t\t\t\t\t(event[ClientPosition[axis]] - startPosition) *\n\t\t\t\t\t\t\tsizeDirection.current,\n\t\t\t\t);\n\n\t\t\t\tif (maxSize && maxSize < size) {\n\t\t\t\t\tsize = maxSize;\n\t\t\t\t} else if (minSize && minSize > size) {\n\t\t\t\t\tsize = minSize;\n\t\t\t\t}\n\n\t\t\t\tsetCurrentSize((currentSize) => {\n\t\t\t\t\tif (size !== currentSize) setRecheck({});\n\t\t\t\t\treturn size;\n\t\t\t\t});\n\t\t\t},\n\t\t\t16,\n\t\t\t{trailing: true},\n\t\t);\n\n\t\tconst mouseup = () => {\n\t\t\tsetIsDragging(false);\n\t\t};\n\t\tdocument.addEventListener('mousemove', mousemove);\n\t\tdocument.addEventListener('mouseup', mouseup);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousemove', mousemove);\n\t\t\tdocument.removeEventListener('mouseup', mouseup);\n\t\t};\n\t}, [isDragging]);\n\n\t// When the width or overflow parent is changed\n\tuseLayoutEffect(() => {\n\t\tcheckLimits();\n\t}, [recheck, disabled]);\n\n\tconst handleMouseDown = useCallback(\n\t\t(event: React.MouseEvent) => {\n\t\t\tif (disabled) return;\n\n\t\t\tevent.stopPropagation();\n\n\t\t\tlimitSize.current = 0;\n\n\t\t\tif (Date.now() - lastMouseDownRef.current < 300) {\n\t\t\t\tsetCurrentSize(0);\n\t\t\t} else {\n\t\t\t\tconst axis = axisRef.current;\n\t\t\t\tinitialSizeRef.current =\n\t\t\t\t\t(event.target as HTMLElement)?.parentElement?.[\n\t\t\t\t\t\tOffsetDimension[axis]\n\t\t\t\t\t] || 0;\n\t\t\t\tpointerStartRef.current = event[ClientPosition[axis]];\n\t\t\t\tsetIsDragging(true);\n\t\t\t}\n\t\t\tlastMouseDownRef.current = Date.now();\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst styles = useMemo(() => {\n\t\tif (!currentSize || disabled) return undefined;\n\t\treturn axis === Axis.X\n\t\t\t? {width: currentSize, minWidth: currentSize, maxWidth: currentSize}\n\t\t\t: {height: currentSize, minHeight: currentSize, maxHeight: currentSize};\n\t}, [axis, currentSize, disabled]);\n\n\treturn {\n\t\tdirection,\n\t\tisDragging,\n\t\tstyles,\n\t\thandleMouseDown,\n\t\tcheckLimits,\n\t};\n};\n\nexport default useDragResize;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const FORM_DIALOG_CLASS_NAME = 'FormDialog';\nexport const FORM_DIALOG_CLASS_SLOTS = [\n\t'root',\n\t'actions',\n\t'cancelButton',\n\t'content',\n\t'form',\n\t'progress',\n\t'submit',\n] as const;\n\nexport type FormDialogClassSlot = typeof FORM_DIALOG_CLASS_SLOTS[number];\n\nexport interface FormDialogClasses {\n\troot: string;\n\tactions: string;\n\tcancelButton: string;\n\tcontent: string;\n\tform: string;\n\tprogress: string;\n\tsubmitButton: string;\n}\n\nexport type FormDialogClassKey = keyof FormDialogClasses;\n\nexport const getFormDialogUtilityClass = (slot: FormDialogClassSlot) =>\n\tgenerateUtilityClass(FORM_DIALOG_CLASS_NAME, slot);\n\nexport const formDialogClasses: FormDialogClasses = generateUtilityClasses(\n\tFORM_DIALOG_CLASS_NAME,\n\t[\n\t\t'root',\n\t\t'actions',\n\t\t'cancelButton',\n\t\t'content',\n\t\t'form',\n\t\t'progress',\n\t\t'submitButton',\n\t],\n);\n\nexport default formDialogClasses;\n","import {i18n} from '@netx/core/i18n';\nimport {UserLevel, UserGroupItemType} from './constants';\n\nexport const USER_LEVEL_LABEL: Record = {\n\t[UserLevel.ADMIN]: i18n.t('i18n.userLevel9'),\n\t[UserLevel.BROWSER]: i18n.t('i18n.userLevel1'),\n\t[UserLevel.CONSUMER]: i18n.t('i18n.userLevel2'),\n\t[UserLevel.DIRECTOR]: i18n.t('i18n.userLevel8'),\n\t[UserLevel.IMPORTER]: i18n.t('i18n.userLevel3'),\n\t[UserLevel.MANAGER]: i18n.t('i18n.userLevel7'),\n\t[UserLevel.NO_ACCESS]: i18n.t('i18n.userLevel0'),\n\t[UserLevel.PRODUCER]: i18n.t('i18n.userLevel4'),\n};\n\nexport const USER_GROUP_ITEM_TYPE_LABEL = {\n\t[UserGroupItemType.GROUP]: i18n.t('i18n.group'),\n\t[UserGroupItemType.USER]: i18n.t('i18n.user'),\n};\n\nexport const USER_SELECTOR_ACTION_LABEL = {\n\tCLEAR: i18n.t('i18n.clear'),\n};\n\nexport const USER_SELECTOR_LABEL = {\n\tSELECT_GROUPS: i18n.t('i18n.addGroups'),\n\tSELECT_USERS: i18n.t('i18n.addUsers'),\n\tSELECT_GROUPS_USERS: i18n.t('i18n.addUsersOrGroups'),\n\tALL: i18n.t('i18n.everyone'),\n};\n","import {i18n} from '@netx/core/i18n';\n\nexport const CUSTOM_THUMBNAIL_ACTION_LABELS = {\n\tSELECT: i18n.t('i18n.addCustomThumbnail'),\n};\n","import {status as assetStatuses} from '../properties/asset';\nimport type {Asset} from '../types';\n\nconst PRESENT_STATUSES = [\n\tassetStatuses.NEARLINE,\n\tassetStatuses.ONLINE,\n\tassetStatuses.TEMP,\n];\n\nexport const assetIsPresent = (asset: Asset) =>\n\tPRESENT_STATUSES.includes(asset.status);\n\nexport default assetIsPresent;\n","import {useCallback, useEffect, useRef, useState} from 'react';\n\nimport {faBolt} from '@fortawesome/pro-solid-svg-icons';\nimport type {ReactAction} from '@netx/core/bootstrap';\nimport {actionsToOrderedActions} from '@netx/core/utils';\nimport useMediaQuery from '@netx/core-components/hooks/useMediaQuery';\nimport {useTheme} from '@netx/core-components/Theme';\nimport {useCustomActionMenus} from '@netx/core-custom-action/hooks';\nimport type {UserCustomAction} from '@netx/core-custom-action/types';\nimport {CART_CURRENT_EVENT, CART_CURRENT_ACTION_ICON} from '../actions';\nimport {\n\tcanCategorizeCurrentCartAssets,\n\tcanCreatePdfFromCurrentCart,\n\tcanCreateTMSObjectFromCurrentCart,\n\tcanDeleteCurrentCartAssets,\n\tcanDownloadCurrentCart,\n\tcanDownloadCurrentCartMetadata,\n\tcanEditCurrentCartAttributes,\n\tcanFindReplaceCurrentCart,\n\tcanManageCurrentCartArchive,\n\tcanManageCurrentCartExpiration,\n\tcanManageCurrentCartRelationships,\n\tcanManageCurrentCartVisibility,\n\tcanRepurposeCurrentCart,\n\tcanReviewCurrentCart,\n\tcanResyncCurrentCart,\n\tcanShareCurrentCart,\n\tcurrentCartIsNotEmpty,\n} from '../enablers';\nimport {CART_CURRENT_ACTION_LABELS} from '../locales';\nimport {useCurrentCart} from './useCurrentCart';\n\nexport type UseCartBarActionsParams = {\n\torder?: boolean;\n\tincludeAll?: boolean;\n};\n\nexport const useCartBarActions = ({\n\torder = true,\n\tincludeAll,\n}: UseCartBarActionsParams = {}) => {\n\tconst theme = useTheme();\n\tconst smallScreen = useMediaQuery(theme.breakpoints.down('sm'));\n\tconst smallScreenRef = useRef(smallScreen);\n\tsmallScreenRef.current = smallScreen;\n\n\tconst [actions, setActions] = useState>(\n\t\t[],\n\t);\n\n\tconst {cart} = useCurrentCart();\n\tconst customActionMenus = useCustomActionMenus();\n\tconst customActionMenusRef = useRef(customActionMenus);\n\tcustomActionMenusRef.current = customActionMenus;\n\n\tconst getActions = useCallback((order = true, includeAll = true) => {\n\t\tconst actions: ReactAction[] = [\n\t\t\t// desktop and mobile\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.CATEGORIZE,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.CATEGORIZE,\n\t\t\t\tenableTest: canCategorizeCurrentCartAssets,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.CATEGORIZE),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.CREATE_PDF,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.CREATE_PDF,\n\t\t\t\tenableTest: canCreatePdfFromCurrentCart,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.CREATE_PDF),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.DOWNLOAD_METADATA,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.DOWNLOAD_METADATA,\n\t\t\t\tenableTest: canDownloadCurrentCartMetadata,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.DOWNLOAD_METADATA),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.EDIT_ATTRIBUTES,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.EDIT_ATTRIBUTES,\n\t\t\t\tenableTest: canEditCurrentCartAttributes,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.EDIT_ATTRIBUTES),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.FIND_REPLACE,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.FIND_REPLACE,\n\t\t\t\tenableTest: canFindReplaceCurrentCart,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.FIND_REPLACE),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.MANAGE_ARCHIVE,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.MANAGE_ARCHIVE,\n\t\t\t\tenableTest: canManageCurrentCartArchive,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.MANAGE_ARCHIVE),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.MANAGE_EXPIRATION,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.MANAGE_EXPIRATION,\n\t\t\t\tenableTest: canManageCurrentCartExpiration,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.MANAGE_EXPIRATION),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.RELATIONSHIPS,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.RELATIONSHIPS,\n\t\t\t\tenableTest: canManageCurrentCartRelationships,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.RELATIONSHIPS),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.REPURPOSE,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.REPURPOSE,\n\t\t\t\tenableTest: canRepurposeCurrentCart,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.REPURPOSE),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.RESYNC,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.RESYNC,\n\t\t\t\tenableTest: canResyncCurrentCart,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.RESYNC),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.REVIEW,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.REVIEW,\n\t\t\t\tenableTest: canReviewCurrentCart,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.REVIEW),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.CREATE_TMS_OBJECT_PACKAGE,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.CREATE_TMS_OBJECT_PACKAGE,\n\t\t\t\tenableTest: canCreateTMSObjectFromCurrentCart,\n\t\t\t\tcb: () =>\n\t\t\t\t\tdispatcher.trigger(CART_CURRENT_EVENT.CREATE_TMS_OBJECT_PACKAGE),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.VISIBILITY,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.VISIBILITY,\n\t\t\t\tenableTest: canManageCurrentCartVisibility,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.VISIBILITY),\n\t\t\t},\n\n\t\t\t{\n\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.DELETE,\n\t\t\t\ticon: CART_CURRENT_ACTION_ICON.DELETE,\n\t\t\t\tenableTest: canDeleteCurrentCartAssets,\n\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.DELETE),\n\t\t\t\tgroup: 10000,\n\t\t\t},\n\t\t];\n\n\t\tif (includeAll) {\n\t\t\tactions.push(\n\t\t\t\t// mobile additions\n\t\t\t\t{\n\t\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.SAVE,\n\t\t\t\t\ticon: CART_CURRENT_ACTION_ICON.SAVE,\n\t\t\t\t\tenableTest: currentCartIsNotEmpty,\n\t\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.SAVE),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.DOWNLOAD,\n\t\t\t\t\ticon: CART_CURRENT_ACTION_ICON.DOWNLOAD,\n\t\t\t\t\tenableTest: canDownloadCurrentCart,\n\t\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.DOWNLOAD),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: CART_CURRENT_ACTION_LABELS.MENU,\n\t\t\t\t\ticon: CART_CURRENT_ACTION_ICON.MENU,\n\t\t\t\t\tenableTest: canShareCurrentCart,\n\t\t\t\t\tcb: () => dispatcher.trigger(CART_CURRENT_EVENT.MENU),\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tcustomActionMenusRef.current.data?.selection?.forEach((customAction) => {\n\t\t\tactions.push({\n\t\t\t\tlabel: customAction.name,\n\t\t\t\ticon: faBolt,\n\t\t\t\tenableTest: currentCartIsNotEmpty,\n\t\t\t\tcb: () => customActionMenus.executeCustomAction(customAction),\n\t\t\t\tgroup: 2,\n\t\t\t});\n\t\t});\n\n\t\tconst filtered = actions.filter(\n\t\t\t(action) => !action.enableTest || action.enableTest(),\n\t\t);\n\n\t\treturn order ? actionsToOrderedActions(filtered) : filtered;\n\t}, []);\n\n\tuseEffect(() => {\n\t\tsetActions(\n\t\t\tgetActions(order, includeAll != null ? includeAll : smallScreen),\n\t\t);\n\t}, [\n\t\tcart.hasAssets,\n\t\tcustomActionMenus.loading,\n\t\tincludeAll,\n\t\torder,\n\t\tsmallScreen,\n\t]);\n\n\treturn {\n\t\tactions,\n\t\tgetActions,\n\t\tloading: customActionMenus.loading,\n\t};\n};\n\nexport default useCartBarActions;\n","import Netx from '@netx/core/bootstrap';\n\nexport const isPublicUser = () => {\n\treturn (\n\t\tNetx.getPublicProperty?.('viewer.userLogin') != null &&\n\t\tNetx.getPublicProperty?.('viewer.userLogin') === Netx.getUser?.('login')\n\t);\n};\n\nexport default isPublicUser;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport type {UserAttributeSet} from '../types';\n\n/**\n * `getAttributeFieldSet` request params\n * (what is used to send to server)\n */\nexport type GetAttributeFieldSetRequestOptions = {\n\tid: number;\n};\n\n/**\n * `getAttributeFieldSet` request\n * (what gets sent to the server)\n */\nexport type GetAttributeFieldSetRequest = [\n\tGetAttributeFieldSetRequestOptions['id'],\n];\n\n/**\n * `getAttributeFieldSet` response\n * (what comes back from the server)\n */\nexport type GetAttributeFieldSetResponse = SuccessResponse<\n\tGetAttributeFieldSetResult\n>;\n\n/**\n * `getAttributeFieldSet` result\n * (what is utilized from the server response)\n */\nexport type GetAttributeFieldSetResult = UserAttributeSet;\n\nexport const getAttributeFieldSetEndpoint = 'getAttributeFieldSet';\n\n/**\n * Get attribute permission\n */\nexport const getAttributeFieldSet = async ({\n\tid,\n}: GetAttributeFieldSetRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetAttributeFieldSetRequest = [id];\n\n\treturn client\n\t\t.post(\n\t\t\tgetAttributeFieldSetEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default getAttributeFieldSet;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport AttributeSetComponent, {AttributeSetComponentProps} from '../Set';\nimport type {\n\tAttributeSet as AttributeSetType,\n\tAttributeSetId,\n\tAttributeSetTemplates,\n} from '../../types';\nimport FallbackMessage from '@netx/core-components/FallbackMessage';\nexport interface AttributeSetsProps\n\textends Omit<\n\t\tAttributeSetComponentProps,\n\t\t'attributes' | 'id' | 'name' | 'title'\n\t> {\n\tattributeTemplates: AttributeSetTemplates;\n\tids: AttributeSetId[];\n\tsets: AttributeSetType[];\n\tsetsLoaded?: AttributeSetId[];\n\tinputForm: any;\n}\n\nexport const AttributeSets = ({\n\tattributeTemplates,\n\tids,\n\tsets,\n\tsetsLoaded,\n\tloading,\n\t...props\n}: AttributeSetsProps) => {\n\tif (!loading && (!sets.length || !ids.length)) {\n\t\treturn (\n\t\t\t\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ids.map((id, index) => (\n\t\t\t\t\n\t\t\t))}\n\t\t\n\t);\n};\n\nexport default AttributeSets;\n","import React, {useCallback, useEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {useSortable} from '@dnd-kit/sortable';\nimport {CSS} from '@dnd-kit/utilities';\nimport {getScrollparent} from '@netx/core/utils';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\nimport IconButton from '@netx/core-components/IconButton';\n\nimport Title from '@netx/core-components/Title';\nimport {faEquals as EqualsIcon} from '@fortawesome/pro-solid-svg-icons';\n\nimport AttributeSetComponent, {AttributeSetComponentProps} from '../Set';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tbackground: theme.palette.background.paper,\n\t\t\tborder: `1px solid ${theme.palette.custom.border}`,\n\t\t\tborderTop: 0,\n\t\t\tborderRadius: 4,\n\t\t\tposition: 'relative',\n\t\t\t'&$stuck': {\n\t\t\t\t'& $title': {\n\t\t\t\t\tborderBottom: `1px solid ${theme.palette.custom.border}`,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcontent: {\n\t\t\tpadding: theme.spacing(1, 3, 2, 3),\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t},\n\t\tstickySentinel: {\n\t\t\tposition: 'absolute',\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\tvisibility: 'hidden',\n\t\t},\n\t\tstickySentinel_top: {\n\t\t\theight: 65,\n\t\t\ttop: -65,\n\t\t},\n\t\tstickySentinel_bottom: {\n\t\t\theight: 65,\n\t\t\tbottom: 0,\n\t\t},\n\t\ttitle: {\n\t\t\t...theme.mixins.positionSticky,\n\t\t\tborderTop: `1px solid ${theme.palette.custom.border}`,\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\ttop: 0,\n\t\t\tbackground: theme.palette.background.paper,\n\t\t\tpadding: theme.spacing(1),\n\t\t\tzIndex: 9,\n\t\t},\n\t\tisDragging: {\n\t\t\tbackground: theme.palette.action.hover,\n\t\t\topacity: 0.5,\n\t\t\tcursor: 'grabbing',\n\t\t\t'& $content, & $title': {\n\t\t\t\tvisibility: 'hidden',\n\t\t\t},\n\t\t\t'& $dragHandle': {\n\t\t\t\tcursor: 'grabbing',\n\t\t\t},\n\t\t},\n\t\tdragHandle: {\n\t\t\tmarginRight: 8,\n\t\t\tcursor: 'grab',\n\t\t},\n\t\ttitleText: {},\n\t\tstuck: {},\n\t\tsearchable: {\n\t\t\t'&$content': {\n\t\t\t\tpadding: theme.spacing(1, 3, 2, 1.5),\n\t\t\t},\n\t\t},\n\t});\n\nexport interface SortableAttributeSetComponentProps\n\textends Omit {\n\tdisableSort?: boolean;\n\ttitle?: string;\n}\n\nexport const SortableAttributeSetComponent = ({\n\tclasses,\n\tdisableSort,\n\ttitle,\n\t...props\n}: WithStyles & SortableAttributeSetComponentProps) => {\n\tconst sortable = useSortable({id: props.id});\n\tconst ref = useRef(null);\n\tconst stickyTargetRef = useRef(null);\n\tconst sentinelTopRef = useRef(null);\n\tconst sentinelBottomRef = useRef(null);\n\tconst [stuck, setStuck] = useState(false);\n\n\tconst style = {\n\t\ttransform: CSS.Translate.toString(sortable.transform),\n\t\ttransition: sortable.transition || undefined,\n\t};\n\n\tconst bottomStuckRef = useRef(false);\n\tconst topStuckRef = useRef(false);\n\tconst stickyChange = useCallback((stuck, target) => {\n\t\tif (target === 'bottom') bottomStuckRef.current = stuck;\n\t\tif (target === 'top') topStuckRef.current = stuck;\n\t\tsetStuck(bottomStuckRef.current && topStuckRef.current);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst scrollContainer = getScrollparent(ref.current as HTMLDivElement);\n\t\tif (\n\t\t\t!scrollContainer ||\n\t\t\t!sentinelBottomRef.current ||\n\t\t\t!sentinelTopRef.current\n\t\t)\n\t\t\treturn;\n\t\tconst footerObserver = new IntersectionObserver(\n\t\t\t([record]) => {\n\t\t\t\tconst targetInfo = record.boundingClientRect;\n\t\t\t\tconst rootBoundsInfo = record.rootBounds;\n\t\t\t\tconst ratio = record.intersectionRatio;\n\t\t\t\tif (!rootBoundsInfo) return;\n\n\t\t\t\tif (targetInfo.bottom > rootBoundsInfo.top && ratio === 1) {\n\t\t\t\t\tstickyChange(true, 'bottom');\n\t\t\t\t} else if (\n\t\t\t\t\ttargetInfo.top < rootBoundsInfo.top &&\n\t\t\t\t\ttargetInfo.bottom < rootBoundsInfo.bottom\n\t\t\t\t) {\n\t\t\t\t\tstickyChange(false, 'bottom');\n\t\t\t\t}\n\t\t\t},\n\t\t\t{threshold: [1], root: scrollContainer},\n\t\t);\n\t\tfooterObserver.observe(sentinelBottomRef.current as Element);\n\n\t\tconst headerObserver = new IntersectionObserver(\n\t\t\t([record]) => {\n\t\t\t\tconst targetInfo = record.boundingClientRect;\n\t\t\t\tconst rootBoundsInfo = record.rootBounds;\n\t\t\t\tif (!rootBoundsInfo) return;\n\n\t\t\t\tif (targetInfo.bottom < rootBoundsInfo.top) {\n\t\t\t\t\tstickyChange(true, 'top');\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\ttargetInfo.bottom >= rootBoundsInfo.top &&\n\t\t\t\t\ttargetInfo.bottom < rootBoundsInfo.bottom\n\t\t\t\t) {\n\t\t\t\t\tstickyChange(false, 'top');\n\t\t\t\t}\n\t\t\t},\n\t\t\t{threshold: [0], root: scrollContainer},\n\t\t);\n\t\theaderObserver.observe(sentinelTopRef.current as Element);\n\n\t\treturn () => {\n\t\t\tfooterObserver.disconnect();\n\t\t\theaderObserver.disconnect();\n\t\t};\n\t}, []);\n\n\tif (title == null) return null;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={clsx(classes.content, {\n\t\t\t\t\t[classes.searchable]: props.onSearch != null,\n\t\t\t\t})}\n\t\t\t\tref={ref}\n\t\t\t>\n\t\t\t\t<AttributeSetComponent {...props} />\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={clsx(classes.stickySentinel, classes.stickySentinel_bottom)}\n\t\t\t\tref={sentinelBottomRef}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nexport const SortableAttributeSet = withStyles(styles)(\n\tSortableAttributeSetComponent,\n);\nexport default SortableAttributeSet;\n","import React, {useCallback, useState} from 'react';\nimport {createPortal} from 'react-dom';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport SortableSetComponent, {\n\tSortableAttributeSetComponentProps,\n} from '../SortableSet';\nimport {AttributeSet as AttributeSetType} from '../../types';\nimport type {AttributeSetId, AttributeSetTemplates} from '../../types';\nimport FallbackMessage from '@netx/core-components/FallbackMessage';\n\nimport {\n\tDndContext,\n\tDragOverlay,\n\tclosestCenter,\n\tKeyboardSensor,\n\tPointerSensor,\n\tTouchSensor,\n\tuseSensor,\n\tuseSensors,\n\t// LayoutMeasuringStrategy,\n} from '@dnd-kit/core';\nimport {\n\tarrayMove,\n\tSortableContext,\n\tsortableKeyboardCoordinates,\n\tverticalListSortingStrategy,\n\trectSortingStrategy,\n} from '@dnd-kit/sortable';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'flex',\n\t\t\tposition: 'relative',\n\t\t\toverflow: 'auto',\n\t\t\tmarginTop: theme.spacing(2),\n\t\t\tpadding: '0 16px',\n\t\t\tflex: '1 1 auto',\n\t\t\tflexWrap: 'nowrap',\n\t\t\tborder: `1px solid transparent`,\n\t\t\t'&:not($hasMultipleItems), &$list': {\n\t\t\t\tflexDirection: 'column',\n\t\t\t\t'& $item, & .sortable-set': {\n\t\t\t\t\tflex: '0 0 auto',\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\tmarginBottom: 16,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&$list $itemWrapper': {\n\t\t\t\tflexDirection: 'column',\n\t\t\t\tflexFlow: 'initial',\n\t\t\t},\n\t\t\t'&:not($list)$hasMultipleItems': {\n\t\t\t\t'& $item, & .sortable-set': {\n\t\t\t\t\tflex: '0 0 auto',\n\t\t\t\t\twidth: 'calc(50% - 9px)',\n\t\t\t\t\tmarginRight: 16,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\titem: {\n\t\t\tflex: '0 0 auto',\n\t\t\twidth: 'calc(50% - 9px)',\n\t\t},\n\t\titemWrapper: {\n\t\t\talignItems: 'flex-start',\n\t\t\tdisplay: 'flex',\n\t\t\tposition: 'relative',\n\t\t\tflex: '1 1 auto',\n\t\t\tflexWrap: 'nowrap',\n\t\t\tmaxWidth: '100%',\n\t\t},\n\t\thasMultipleItems: {},\n\t\tlist: {},\n\t\tcolumn: {},\n\t\tdragOverlay: {\n\t\t\tcursor: 'grabbing',\n\t\t\tborderRadius: 4,\n\t\t\tboxShadow:\n\t\t\t\ttheme.palette.mode === 'light'\n\t\t\t\t\t? `-1px 0 15px 0 rgba(34, 33, 81, 0.01), 0px 15px 15px 0 rgba(34, 33, 81, 0.25)`\n\t\t\t\t\t: `-1px 0 15px 0 rgba(0, 0, 0, 0.01), 0px 15px 15px 0 rgba(0, 0, 0, 0.25)`,\n\t\t},\n\t});\n\nexport interface SortableAttributeSetsProps\n\textends Omit<\n\t\tSortableAttributeSetComponentProps,\n\t\t'attributes' | 'id' | 'title'\n\t> {\n\tids: AttributeSetId[];\n\tattributeTemplates: AttributeSetTemplates;\n\tsets: AttributeSetType[];\n\torderUpdated(ids: AttributeSetId[]): void;\n\tlayout?: string;\n\tenforce?: string[];\n\tsetsLoaded?: AttributeSetId[];\n\tinputForm: any;\n}\n\nconst SortableAttributeSetsComponent = ({\n\tclasses,\n\tenforce,\n\tids,\n\tattributeTemplates,\n\tsets,\n\tsetsLoaded,\n\tlayout = 'list',\n\tloading,\n\torderUpdated,\n\t...props\n}: WithStyles<typeof styles> & SortableAttributeSetsProps) => {\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor),\n\t\tuseSensor(KeyboardSensor, {\n\t\t\tcoordinateGetter: sortableKeyboardCoordinates,\n\t\t}),\n\t\tuseSensor(TouchSensor),\n\t);\n\n\tconst handleDragEnd = useCallback(\n\t\t({active, over}) => {\n\t\t\tsetActiveId(null);\n\t\t\tif (over && active.id !== over.id) {\n\t\t\t\tconst oldIndex = ids.indexOf(active.id);\n\t\t\t\tconst newIndex = ids.indexOf(over.id);\n\t\t\t\torderUpdated(arrayMove(ids, oldIndex, newIndex));\n\t\t\t}\n\t\t},\n\t\t[ids],\n\t);\n\n\tconst handleDragStart = useCallback(({active}) => {\n\t\tsetActiveId(active.id);\n\t}, []);\n\n\tif (!loading && (!sets.length || !ids.length)) {\n\t\treturn (\n\t\t\t<FallbackMessage\n\t\t\t\ttitle={i18n.t('i18n.noAttributeSetsSelected')}\n\t\t\t\tvariant=\"light\"\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={clsx(classes.root, {\n\t\t\t\t[classes.hasMultipleItems]: ids.length > 1,\n\t\t\t\t[classes[layout]]: true,\n\t\t\t})}\n\t\t>\n\t\t\t<DndContext\n\t\t\t\tautoScroll\n\t\t\t\tsensors={sensors}\n\t\t\t\tcollisionDetection={closestCenter}\n\t\t\t\tonDragCancel={() => setActiveId(null)}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\t// layoutMeasuring={{strategy: LayoutMeasuringStrategy.WhileDragging}}\n\t\t\t>\n\t\t\t\t<SortableContext\n\t\t\t\t\titems={ids}\n\t\t\t\t\tstrategy={\n\t\t\t\t\t\tlayout === 'list'\n\t\t\t\t\t\t\t? verticalListSortingStrategy\n\t\t\t\t\t\t\t: rectSortingStrategy\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<div className={classes.itemWrapper}>\n\t\t\t\t\t\t{ids.map((id, index) => (\n\t\t\t\t\t\t\t<SortableSetComponent\n\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\tdisableSort={enforce && enforce.includes(id)}\n\t\t\t\t\t\t\t\ttitle={sets.find((set) => set.id === id)?.name}\n\t\t\t\t\t\t\t\tattributes={attributeTemplates[id]}\n\t\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\tloading={setsLoaded != null && !setsLoaded.includes(id)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</SortableContext>\n\n\t\t\t\t{createPortal(\n\t\t\t\t\t<DragOverlay zIndex={9999}>\n\t\t\t\t\t\t{activeId != null ? (\n\t\t\t\t\t\t\t<div className={classes.dragOverlay}>\n\t\t\t\t\t\t\t\t<SortableSetComponent\n\t\t\t\t\t\t\t\t\ttitle={sets.find((set) => set.id === activeId)?.name}\n\t\t\t\t\t\t\t\t\t{...(props as SortableAttributeSetComponentProps)}\n\t\t\t\t\t\t\t\t\tattributes={attributeTemplates[activeId]}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</DragOverlay>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)}\n\t\t\t</DndContext>\n\t\t</div>\n\t);\n};\n\nexport const SortableAttributeSets = withStyles(styles)(\n\tSortableAttributeSetsComponent,\n);\nexport default SortableAttributeSets;\n","import {i18n} from '@netx/core/i18n';\n\nexport const REPURPOSE_ACTION_LABELS = {\n\tREPURPOSE: i18n.t('i18n.repurpose'),\n};\n","import {i18n} from '@netx/core/i18n';\n\nexport const CART_ASSET_ACTION_LABELS = <const>{\n\tADD_TO_CART: i18n.t('i18n.addToCart'),\n\tREMOVE_FROM_CART: i18n.t('i18n.removeFromCart'),\n};\n","import {i18n} from '@netx/core/i18n';\n\nexport const ASSET_RESYNC_ACTION_LABELS = {\n\tRESYNC: i18n.t('i18n.resync'),\n};\n","import {assetIsPresent} from '@netx/core-asset/utils/assetIsPresent';\nimport type {Asset} from '@netx/core-asset/types';\nimport {PermissionMatrixName} from '@netx/core-permissions/constants';\nimport {allows} from '@netx/core-permissions/utils/allows';\nimport {currentUserMeetsUserLevel} from '@netx/core-user/utils/currentUserMeetsUserLevel';\nimport {ASSET_RESYNC_MINIMUM_USER_LEVEL} from './constants';\n\nexport const canResyncAsset = (asset: Asset) =>\n\tcurrentUserMeetsUserLevel(ASSET_RESYNC_MINIMUM_USER_LEVEL) &&\n\tassetIsPresent(asset) &&\n\tallows(asset.permissionMatrix, PermissionMatrixName.MODIFY);\n","import {UserLevel} from '@netx/core-user/constants';\n\nexport const ASSET_RESYNC_MINIMUM_USER_LEVEL = UserLevel.PRODUCER;\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <http://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","import Base from '@netx/core/lib/netx-view';\nimport BaseModel from '@netx/core/lib/netx-model';\nimport BaseCollection from '@netx/core/lib/netx-collection';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport type {ViewOptions} from '@netx/core/lib/netx-view';\n\nexport default class ReactView<\n\tTModel extends BaseModel = BaseModel,\n\tTCollection extends BaseCollection = BaseCollection,\n> extends Base<TModel, TCollection> {\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tif (this.removing) return this;\n\n\t\tif (this.rendered.state() !== 'pending') {\n\t\t\tthis.rendered = $.Deferred();\n\t\t}\n\n\t\tthis.trigger('preRenderHook', this);\n\t}\n\n\t// @ts-ignore\n\t// We are breaking polymorphism but ¯\\_(ツ)_/¯ we do that a lot in our backbone stuff\n\t// But hey, now you can get props validation in extended react view classes when calling:\n\t// `render(Component, {some: 'prop'})`\n\trender<C extends React.ElementType>(\n\t\tComponent: C,\n\t\tprops: JSX.IntrinsicAttributes &\n\t\t\tJSX.LibraryManagedAttributes<C, React.ComponentProps<C>>,\n\t) {\n\t\tReactDOM.render(<Component {...props} />, this.el);\n\t\treturn this;\n\t}\n\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\tthis.rendered.resolveWith(this);\n\t\tthis.trigger('rendered');\n\n\t\t// We have rendered once (at least)\n\t\tthis.renderedOnce = true;\n\t\tthis.trigger('renderedHook', this);\n\t}\n\n\tremove() {\n\t\tReactDOM.unmountComponentAtNode(this.el);\n\t\treturn super.remove();\n\t}\n\n\tstatic get __name__() {\n\t\treturn 'ReactView';\n\t}\n}\n","export type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport {UserPermission, UserGroupItemType} from '../constants';\nimport type {UserGroupItem} from '../types';\nimport {\n\tgetUserAutoList,\n\tGetUserAutoListRequestOptions,\n} from './getUserAutoList';\nimport {getGroupAutoList} from './getGroupAutoList';\n\n/**\n * `getUserGroupAutoList` request params\n * (what is used to send to server)\n */\nexport interface GetUserGroupAutoListRequestOptions\n\textends GetUserAutoListRequestOptions {}\n\n/**\n * `getUserGroupAutoList` result\n * (what is utilized from the server response)\n */\nexport type GetUserGroupAutoListResult = UserGroupItem[];\n\nexport const getUserGroupAutoListEndpoint = 'getUserGroupAutoList';\n\n/**\n * Autolist groups/users\n * @param fetchParams Fetch params\n */\nexport const getUserGroupAutoList = async ({\n\tquery,\n\tpermission = UserPermission.READ,\n}: GetUserGroupAutoListRequestOptions) => {\n\treturn Promise.all([\n\t\tgetUserAutoList({query, permission}),\n\t\tgetGroupAutoList({query}),\n\t]).then(([users, groups]) => {\n\t\treturn users\n\t\t\t.map<UserGroupItem>(({label, value}) => ({\n\t\t\t\tname: label,\n\t\t\t\tuid: value,\n\t\t\t\ttype: UserGroupItemType.USER,\n\t\t\t}))\n\t\t\t.concat(\n\t\t\t\tgroups.map<UserGroupItem>(({label, value}) => ({\n\t\t\t\t\tname: label,\n\t\t\t\t\tuid: value,\n\t\t\t\t\ttype: UserGroupItemType.GROUP,\n\t\t\t\t})),\n\t\t\t);\n\t});\n};\n\nexport default getUserGroupAutoList;\n","import React, {useCallback} from 'react';\nimport {i18n} from '@netx/core/i18n';\nimport {faUsers} from '@fortawesome/pro-solid-svg-icons';\nimport AutoListField, {\n\tCommenExtendProps,\n\tOption,\n} from '@netx/core-components/Form/AutoListField';\nimport getUserGroupAutoList from '../../api/getUserGroupAutoList';\nimport type {UserGroupItem} from '../../types';\n\nexport type UserGroupAutoListRef = React.ForwardedRef<HTMLDivElement>;\n\nexport type UserGroupAutoListProps<\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false\n> = CommenExtendProps<UserGroupItem, Multiple, DisableClearable, false> & {\n\tfilterUsersOrGroups?: (usersOrGroups: UserGroupItem[]) => UserGroupItem[];\n};\n\nconst getOptionLabel = (option: UserGroupItem) => option?.name;\nconst getOptionSelected = (option?: UserGroupItem, value?: UserGroupItem) => {\n\treturn option?.name === value?.name && option?.type === value?.type;\n};\n\nconst UserGroupAutoListInner = <\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false\n>(\n\t{\n\t\tfilterUsersOrGroups,\n\t\t...props\n\t}: UserGroupAutoListProps<Multiple, DisableClearable>,\n\tref: UserGroupAutoListRef,\n) => {\n\tconst renderOption = useCallback(\n\t\t(props, option, state) => (\n\t\t\t<Option\n\t\t\t\tvalue={getOptionLabel(option)}\n\t\t\t\tavatar\n\t\t\t\ticon={option.uid === -1 ? faUsers : undefined}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t),\n\t\t[],\n\t);\n\n\tconst handleLookup = useCallback(\n\t\tasync (query) => {\n\t\t\tconst users = await getUserGroupAutoList({\n\t\t\t\tquery,\n\t\t\t});\n\t\t\treturn filterUsersOrGroups ? filterUsersOrGroups(users) : users;\n\t\t},\n\t\t[filterUsersOrGroups],\n\t);\n\n\treturn (\n\t\t<AutoListField<UserGroupItem, Multiple, DisableClearable>\n\t\t\tref={ref}\n\t\t\tname=\"user-group-auto-list\"\n\t\t\tonLookup={handleLookup}\n\t\t\tlabel={i18n.t('i18n.userOrGroup')}\n\t\t\tmultiple={false as Multiple}\n\t\t\tplaceholder={!props.multiple ? i18n.t('i18n.pleaseSelect') : undefined}\n\t\t\t{...props}\n\t\t\tAutocompleteProps={{\n\t\t\t\tgetOptionLabel,\n\t\t\t\tisOptionEqualToValue: getOptionSelected,\n\t\t\t\trenderOption,\n\t\t\t\t...props?.AutocompleteProps,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const UserGroupAutoListPrimitive = React.forwardRef(\n\tUserGroupAutoListInner,\n) as <\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false\n>(\n\tprops: UserGroupAutoListProps<Multiple, DisableClearable>,\n) => JSX.Element;\n\nexport const UserGroupAutoList = UserGroupAutoListPrimitive;\n\nexport default UserGroupAutoList;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const USER_SELECTOR_LIST_ITEM_CLASS_NAME = 'UserSelectorListItem';\nexport const USER_SELECTOR_LIST_ITEM_CLASS_SLOTS = ['root'] as const;\n\nexport type UserSelectorListItemClassSlot = typeof USER_SELECTOR_LIST_ITEM_CLASS_SLOTS[number];\n\nexport interface UserSelectorListItemClasses {\n\troot: string;\n\tselected: string;\n}\n\nexport type UserSelectorListItemClassKey = keyof UserSelectorListItemClasses;\n\nexport const getUserSelectorListItemUtilityClass = (\n\tslot: UserSelectorListItemClassSlot,\n) => generateUtilityClass(USER_SELECTOR_LIST_ITEM_CLASS_NAME, slot);\n\nexport const userSelectorListItemClasses = generateUtilityClasses<\n\tkeyof UserSelectorListItemClasses\n>(USER_SELECTOR_LIST_ITEM_CLASS_NAME, ['root', 'selected']);\nexport default userSelectorListItemClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {faTimes, faUsers} from '@fortawesome/pro-solid-svg-icons';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {\n\tAvatar,\n\tListItem,\n\tListItemProps,\n\tListItemAvatar,\n\tListItemText,\n\tListItemSecondaryAction,\n} from '@mui/material';\nimport ColoredAvatar from '@netx/core-components/ColoredAvatar';\nimport {IconButton} from '@netx/core-components/IconButton';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {USER_GROUP_ITEM_TYPE_LABEL} from '../../locales';\nimport {\n\tuserSelectorListItemClasses,\n\tgetUserSelectorListItemUtilityClass,\n\tUserSelectorListItemClasses,\n\tUSER_SELECTOR_LIST_ITEM_CLASS_NAME,\n} from './userSelectorListItemClasses';\n\nexport type UserSelectorListItemOwnerState = WithClasses<\n\tUserSelectorListItemClasses,\n\t{\n\t\tselected?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: UserSelectorListItemOwnerState) => {\n\tconst {classes, selected} = ownerState;\n\tconst slots = {\n\t\troot: ['root', selected && 'selected'],\n\t\tactions: ['actions'],\n\t};\n\treturn composeClasses(slots, getUserSelectorListItemUtilityClass, classes);\n};\n\nconst UserSelectorListItemRoot = styled(ListItem)(({theme}) => ({\n\tborderRadius: '28px 0 0 28px',\n\toutline: 'none !important',\n\tpaddingLeft: 10,\n\tmarginLeft: theme.spacing(2),\n\twidth: `calc(100% - ${theme.spacing(2)}) !important`,\n\t[`&:hover, &:focus, &.${userSelectorListItemClasses.selected}`]: {\n\t\tbackgroundColor: theme.palette.action.hover,\n\t},\n}));\n\nconst UserSelectorListItemActions = styled('div')(({theme}) => ({\n\tflex: '0 0 auto',\n\tpaddingLeft: theme.spacing(2),\n}));\n\nexport type UserSelectorListItemProps = Partial<\n\tOmit<ListItemProps<'li'>, 'button' | 'classes' | 'onChange'>\n> &\n\tWithClasses<\n\t\tUserSelectorListItemClasses,\n\t\t{\n\t\t\thideSubtitle?: boolean;\n\t\t\tonRemove?: () => void;\n\t\t\tname: string;\n\t\t\tuid: number;\n\t\t\ttype: 'user' | 'group';\n\t\t}\n\t>;\n\nexport const UserSelectorListItemPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\thideSubtitle,\n\tname,\n\tuid,\n\ttype,\n\tonRemove,\n\tselected,\n\t...props\n}: UserSelectorListItemProps) => {\n\tconst ownerState: UserSelectorListItemOwnerState = {\n\t\tclasses: _classes,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t<UserSelectorListItemRoot\n\t\t\tdata-id={`${type}-${uid}`}\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tid={`user-selector-item-${type}-${uid}`}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ListItemAvatar aria-hidden=\"true\">\n\t\t\t\t{uid === -1 ? (\n\t\t\t\t\t<Avatar>\n\t\t\t\t\t\t<FontAwesomeIcon icon={faUsers} />\n\t\t\t\t\t</Avatar>\n\t\t\t\t) : (\n\t\t\t\t\t<ColoredAvatar label={name} />\n\t\t\t\t)}\n\t\t\t</ListItemAvatar>\n\t\t\t<ListItemText\n\t\t\t\tprimaryTypographyProps={{\n\t\t\t\t\tnoWrap: true,\n\t\t\t\t}}\n\t\t\t\tprimary={name}\n\t\t\t\tsecondary={!hideSubtitle ? USER_GROUP_ITEM_TYPE_LABEL[type] : undefined}\n\t\t\t\trole=\"presentation\"\n\t\t\t/>\n\t\t\t<UserSelectorListItemActions role=\"presentation\">\n\t\t\t\t{onRemove ? (\n\t\t\t\t\t<ListItemSecondaryAction>\n\t\t\t\t\t\t<IconButton edge=\"end\" icon={faTimes} onClick={onRemove} />\n\t\t\t\t\t</ListItemSecondaryAction>\n\t\t\t\t) : null}\n\t\t\t</UserSelectorListItemActions>\n\t\t</UserSelectorListItemRoot>\n\t);\n};\n\nexport const UserSelectorListItem = UserSelectorListItemPrimitive;\n\nexport default UserSelectorListItem;\n","import React, {useCallback, useEffect, useRef} from 'react';\n\nimport {faUserShield as PermissionsIcon} from '@fortawesome/pro-solid-svg-icons';\nimport {useVirtualizer} from '@tanstack/react-virtual';\nimport {List} from '@mui/material';\nimport {\n\tScrollBorder,\n\tscrollBorderClasses,\n} from '@netx/core-components/ScrollBorder';\nimport FallbackMessage, {\n\tfallbackMessageClasses,\n} from '@netx/core-components/FallbackMessage';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport type {UserGroupItem} from '../../types';\nimport {UserSelectorListItem} from './UserSelectorListItem';\n\nconst UserSelectorListItemsRoot = styled(ScrollBorder)(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tflex: '1 1 auto',\n\tposition: 'relative',\n\twidth: '100%',\n\t[`& .${scrollBorderClasses.scrollWrapper}`]: {\n\t\tpadding: 0,\n\t},\n}));\n\nconst UserSelectorListFallbackMessage = styled(FallbackMessage)(({theme}) => ({\n\tbackground: 'transparent',\n}));\n\nconst UserSelectorListItemsWrapper = styled(List)(({theme}) => ({\n\twidth: '100%',\n}));\n\nconst UserSelectorListItemsItemWrapper = styled(\n\t'div',\n\t{},\n)(({theme}) => ({\n\tposition: 'absolute',\n\ttop: 0,\n\tleft: 0,\n\tdisplay: 'flex',\n\twidth: '100%',\n\t// '&:not(:last-child)': {\n\t// \tborderBottom: `1px solid ${theme.palette.custom.border}`,\n\t// },\n}));\n\nexport type UserSelectorListItemsProps = {\n\tdisableNone?: boolean;\n\titems: UserGroupItem[];\n\thideSubtitle?: boolean;\n\tonRemove?: (item: UserGroupItem) => void;\n};\n\nconst UserSelectorListItemsPrimitive = ({\n\tdisableNone,\n\thideSubtitle,\n\titems,\n\tonRemove,\n\t...props\n}: UserSelectorListItemsProps) => {\n\tconst ref = useRef<HTMLDivElement>(null);\n\tconst scrollRef = useRef<HTMLDivElement>(null);\n\n\tconst rowVirtualizer = useVirtualizer({\n\t\tcount: items.length,\n\t\tgetScrollElement: () => scrollRef.current,\n\t\testimateSize: () => (!hideSubtitle ? 60 : 56),\n\t\toverscan: 2,\n\t});\n\n\tuseEffect(() => {\n\t\trowVirtualizer.measure();\n\t}, [hideSubtitle]);\n\n\tconst totalSize = rowVirtualizer.getTotalSize() + 8 * 2;\n\n\treturn (\n\t\t<UserSelectorListItemsRoot\n\t\t\t// className={clsx(classes.root, className)}\n\t\t\tref={ref}\n\t\t\tinnerRef={scrollRef}\n\t\t>\n\t\t\t{items.length > 0 ? (\n\t\t\t\t<UserSelectorListItemsWrapper\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tminHeight: totalSize,\n\t\t\t\t\t\theight: totalSize,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{rowVirtualizer.getVirtualItems().map((virtualItem, index) => {\n\t\t\t\t\t\tconst item = items[virtualItem.index];\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<UserSelectorListItemsItemWrapper\n\t\t\t\t\t\t\t\tkey={`${item.type}-${item.name}`}\n\t\t\t\t\t\t\t\tdata-index={virtualItem.index}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\ttransform: `translatey(${virtualItem.start}px)`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<UserSelectorListItem\n\t\t\t\t\t\t\t\t\tdense={!hideSubtitle}\n\t\t\t\t\t\t\t\t\tdata-index={virtualItem.index}\n\t\t\t\t\t\t\t\t\thideSubtitle={hideSubtitle}\n\t\t\t\t\t\t\t\t\t{...item}\n\t\t\t\t\t\t\t\t\tonRemove={\n\t\t\t\t\t\t\t\t\t\t(!disableNone || item.uid !== -1) && onRemove\n\t\t\t\t\t\t\t\t\t\t\t? () => onRemove(item)\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</UserSelectorListItemsItemWrapper>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</UserSelectorListItemsWrapper>\n\t\t\t) : (\n\t\t\t\t<UserSelectorListFallbackMessage\n\t\t\t\t\ticon={PermissionsIcon}\n\t\t\t\t\ttitle={disableNone ? 'All users' : 'No users selected'}\n\t\t\t\t\tvariant=\"light\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</UserSelectorListItemsRoot>\n\t);\n};\n\nexport const UserSelectorListItems = UserSelectorListItemsPrimitive;\n\nexport default UserSelectorListItems;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const USER_SELECTOR_CLASS_NAME = 'UserSelector';\nexport const USER_SELECTOR_CLASS_SLOTS = ['root'] as const;\n\nexport type UserSelectorClassSlot = typeof USER_SELECTOR_CLASS_SLOTS[number];\n\nexport interface UserSelectorClasses {\n\troot: string;\n}\n\nexport type UserSelectorClassKey = keyof UserSelectorClasses;\n\nexport const getUserSelectorUtilityClass = (slot: UserSelectorClassSlot) =>\n\tgenerateUtilityClass(USER_SELECTOR_CLASS_NAME, slot);\n\nexport const userSelectorClasses = generateUtilityClasses<\n\tkeyof UserSelectorClasses\n>(USER_SELECTOR_CLASS_NAME, ['root']);\n\nexport default userSelectorClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {SetOptional} from 'type-fest';\nimport {CommenExtendProps} from '@netx/core-components/Form/AutoListField';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {UserGroupItemType} from '../../constants';\nimport {USER_SELECTOR_LABEL} from '../../locales';\nimport type {EnhancedUserSelector, UserGroupItem} from '../../types';\nimport {GroupAutoList} from '../GroupAutoList';\nimport {UserAutoList} from '../UserAutoList';\nimport {UserGroupAutoList} from '../UserGroupAutoList';\nimport {UserSelectorListItems} from './UserSelectorListItems';\nimport {\n\tuserSelectorClasses,\n\tgetUserSelectorUtilityClass,\n\tUserSelectorClasses,\n\tUSER_SELECTOR_CLASS_NAME,\n} from './userSelectorClasses';\n\nexport type UserSelectorOwnerState = WithClasses<UserSelectorClasses, {}>;\n\nconst useUtilityClasses = (ownerState: UserSelectorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getUserSelectorUtilityClass, classes);\n};\n\nconst UserSelectorRoot = styled('div', {\n\tname: USER_SELECTOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({}));\n\nconst UserSelectorHeader = styled('div', {\n\tname: USER_SELECTOR_CLASS_NAME,\n\tslot: 'Header',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tmarginBottom: theme.spacing(2),\n}));\n\nexport type UserSelectorProps = WithClasses<\n\tUserSelectorClasses,\n\t{\n\t\tdisabled?: boolean;\n\t\tdisableGroupSelection?: boolean;\n\t\tdisableNone?: boolean;\n\t\tdisableUserSelection?: boolean;\n\t\tonChange(userSelector: PartialUserSelector): void;\n\t\tuserSelector: PartialUserSelector;\n\t}\n>;\n\ntype PartialUserSelector = SetOptional<EnhancedUserSelector, 'userSelectorId'>;\n\ntype UserGroupAutoLVB = {\n\tlabel: string;\n\tvalue: number;\n};\n\nconst lbvToUserGroupItem = (\n\tlvb: UserGroupAutoLVB,\n\ttype: UserGroupItemType,\n): UserGroupItem => ({\n\tname: lvb.label,\n\tuid: lvb.value,\n\ttype,\n});\n\nconst getGroupIdsFromUserSelector = (userSelector: PartialUserSelector) =>\n\tuserSelector.groups.map(({groupId}) => groupId);\n\nconst getUserIdsFromUserSelector = (userSelector: PartialUserSelector) =>\n\tuserSelector.users.map(({userId}) => userId);\n\nconst addToSelector = (\n\tuserGroupItem: UserGroupItem,\n\tuserSelector: PartialUserSelector,\n): PartialUserSelector => {\n\tconst allWereSelected = userSelector.all;\n\n\tconst groups =\n\t\tuserGroupItem.type === UserGroupItemType.GROUP\n\t\t\t? allWereSelected\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgroupId: userGroupItem.uid,\n\t\t\t\t\t\t\tgroupLabel: userGroupItem.name,\n\t\t\t\t\t\t},\n\t\t\t\t ]\n\t\t\t\t: userSelector.groups.concat([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgroupId: userGroupItem.uid,\n\t\t\t\t\t\t\tgroupLabel: userGroupItem.name,\n\t\t\t\t\t\t},\n\t\t\t\t ])\n\t\t\t: userSelector.groups;\n\n\tconst users =\n\t\tuserGroupItem.type === UserGroupItemType.USER\n\t\t\t? allWereSelected\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuserId: userGroupItem.uid,\n\t\t\t\t\t\t\tuserLabel: userGroupItem.name,\n\t\t\t\t\t\t},\n\t\t\t\t ]\n\t\t\t\t: userSelector.users.concat([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuserId: userGroupItem.uid,\n\t\t\t\t\t\t\tuserLabel: userGroupItem.name,\n\t\t\t\t\t\t},\n\t\t\t\t ])\n\t\t\t: userSelector.users;\n\n\treturn {\n\t\t...userSelector,\n\t\tall: !groups.length && !users.length,\n\t\tnone: false,\n\t\tusers,\n\t\tgroups,\n\t};\n};\n\nconst removeFromSelector = (\n\tuserGroupItem: UserGroupItem,\n\tuserSelector: PartialUserSelector,\n): PartialUserSelector => {\n\tif (userGroupItem.uid === -1) {\n\t\treturn {\n\t\t\t...userSelector,\n\t\t\tall: false,\n\t\t\tnone: !userSelector.groups.length && !userSelector.users.length,\n\t\t};\n\t}\n\n\tconst groups =\n\t\tuserGroupItem.type === UserGroupItemType.GROUP\n\t\t\t? userSelector.groups.filter(\n\t\t\t\t\t(group) => group.groupId !== userGroupItem.uid,\n\t\t\t )\n\t\t\t: userSelector.groups;\n\n\tconst users =\n\t\tuserGroupItem.type === UserGroupItemType.USER\n\t\t\t? userSelector.users.filter((user) => user.userId !== userGroupItem.uid)\n\t\t\t: userSelector.users;\n\n\treturn {\n\t\t...userSelector,\n\t\tall: !groups.length && !users.length,\n\t\tnone: false,\n\t\tusers,\n\t\tgroups,\n\t};\n};\n\nexport const UserSelectorPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\tdisabled,\n\tdisableGroupSelection,\n\tdisableNone,\n\tdisableUserSelection,\n\tonChange,\n\tuserSelector,\n}: UserSelectorProps) => {\n\tconst ownerState: UserSelectorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst commonAutoListProps: Partial<CommenExtendProps<any, false, true>> = {\n\t\tclearOnClose: true,\n\t\tdisabled,\n\t\thideLabel: true,\n\t\tmultiple: false,\n\t\tvariant: 'filled',\n\t\tInputLabelProps: {\n\t\t\tshrink: true,\n\t\t},\n\t\tAutocompleteProps: {\n\t\t\tdisableClearable: true,\n\t\t},\n\t} as const;\n\n\treturn (\n\t\t<UserSelectorRoot className={clsx(classes.root, className)}>\n\t\t\t<UserSelectorHeader>\n\t\t\t\t{!disableGroupSelection && !disableUserSelection ? (\n\t\t\t\t\t<UserGroupAutoList<false, true>\n\t\t\t\t\t\tplaceholder={USER_SELECTOR_LABEL.SELECT_GROUPS_USERS}\n\t\t\t\t\t\t{...commonAutoListProps}\n\t\t\t\t\t\tfilterUsersOrGroups={(usersOrGroups) => {\n\t\t\t\t\t\t\tif (userSelector.all) return usersOrGroups;\n\n\t\t\t\t\t\t\tconst groupIds = getGroupIdsFromUserSelector(userSelector);\n\t\t\t\t\t\t\tconst userIds = getUserIdsFromUserSelector(userSelector);\n\t\t\t\t\t\t\tconst results = usersOrGroups.filter(({type, uid}) => {\n\t\t\t\t\t\t\t\tif (type === UserGroupItemType.GROUP)\n\t\t\t\t\t\t\t\t\treturn !groupIds.includes(uid);\n\t\t\t\t\t\t\t\tif (type === UserGroupItemType.USER)\n\t\t\t\t\t\t\t\t\treturn !userIds.includes(uid);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresults.unshift({\n\t\t\t\t\t\t\t\tname: USER_SELECTOR_LABEL.ALL,\n\t\t\t\t\t\t\t\tuid: -1,\n\t\t\t\t\t\t\t\ttype: UserGroupItemType.USER,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonChange={(value) => {\n\t\t\t\t\t\t\tif (!value) return;\n\t\t\t\t\t\t\tif (value.uid === -1) {\n\t\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\t\t...userSelector,\n\t\t\t\t\t\t\t\t\tall: true,\n\t\t\t\t\t\t\t\t\tnone: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange(addToSelector(value, userSelector));\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : !disableGroupSelection ? (\n\t\t\t\t\t<GroupAutoList\n\t\t\t\t\t\tplaceholder={USER_SELECTOR_LABEL.SELECT_GROUPS}\n\t\t\t\t\t\t{...commonAutoListProps}\n\t\t\t\t\t\tfilterGroups={(groups) => {\n\t\t\t\t\t\t\tif (userSelector.all) return groups;\n\t\t\t\t\t\t\tconst groupIds = getGroupIdsFromUserSelector(userSelector);\n\t\t\t\t\t\t\tconst results = groups.filter(\n\t\t\t\t\t\t\t\t({value: id}) => !groupIds.includes(id),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tresults.unshift({\n\t\t\t\t\t\t\t\tlabel: USER_SELECTOR_LABEL.ALL,\n\t\t\t\t\t\t\t\tvalue: -1,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonChange={(value) => {\n\t\t\t\t\t\t\tif (!value) return;\n\t\t\t\t\t\t\tif (value.value === -1) {\n\t\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\t\t...userSelector,\n\t\t\t\t\t\t\t\t\tall: true,\n\t\t\t\t\t\t\t\t\tnone: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange(\n\t\t\t\t\t\t\t\taddToSelector(\n\t\t\t\t\t\t\t\t\tlbvToUserGroupItem(value, UserGroupItemType.GROUP),\n\t\t\t\t\t\t\t\t\tuserSelector,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : !disableUserSelection ? (\n\t\t\t\t\t<UserAutoList\n\t\t\t\t\t\tavatar\n\t\t\t\t\t\tplaceholder={USER_SELECTOR_LABEL.SELECT_USERS}\n\t\t\t\t\t\t{...commonAutoListProps}\n\t\t\t\t\t\tfilterUsers={(users) => {\n\t\t\t\t\t\t\tif (userSelector.all) return users;\n\t\t\t\t\t\t\tconst userIds = getUserIdsFromUserSelector(userSelector);\n\t\t\t\t\t\t\tconst results = users.filter(\n\t\t\t\t\t\t\t\t({value: id}) => !userIds.includes(id),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tresults.unshift({\n\t\t\t\t\t\t\t\tlabel: USER_SELECTOR_LABEL.ALL,\n\t\t\t\t\t\t\t\tvalue: -1,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonChange={(value) => {\n\t\t\t\t\t\t\tif (!value) return;\n\t\t\t\t\t\t\tif (value.value === -1) {\n\t\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\t\t...userSelector,\n\t\t\t\t\t\t\t\t\tall: true,\n\t\t\t\t\t\t\t\t\tnone: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange(\n\t\t\t\t\t\t\t\taddToSelector(\n\t\t\t\t\t\t\t\t\tlbvToUserGroupItem(value, UserGroupItemType.USER),\n\t\t\t\t\t\t\t\t\tuserSelector,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</UserSelectorHeader>\n\n\t\t\t<UserSelectorListItems\n\t\t\t\thideSubtitle={\n\t\t\t\t\t(userSelector.all && !disableNone) ||\n\t\t\t\t\tdisableUserSelection ||\n\t\t\t\t\tdisableGroupSelection\n\t\t\t\t}\n\t\t\t\tdisableNone={disableNone}\n\t\t\t\tonRemove={(userGroupItem) => {\n\t\t\t\t\tonChange(removeFromSelector(userGroupItem, userSelector));\n\t\t\t\t}}\n\t\t\t\titems={\n\t\t\t\t\tuserSelector.all\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\tlbvToUserGroupItem(\n\t\t\t\t\t\t\t\t\t{label: USER_SELECTOR_LABEL.ALL, value: -1},\n\t\t\t\t\t\t\t\t\tUserGroupItemType.USER,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t ]\n\t\t\t\t\t\t: userSelector.groups\n\t\t\t\t\t\t\t\t.map<UserGroupItem>(({groupId: value, groupLabel: label}) =>\n\t\t\t\t\t\t\t\t\tlbvToUserGroupItem({label, value}, UserGroupItemType.GROUP),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.concat(\n\t\t\t\t\t\t\t\t\tuserSelector.users.map<UserGroupItem>(\n\t\t\t\t\t\t\t\t\t\t({userId: value, userLabel: label}) =>\n\t\t\t\t\t\t\t\t\t\t\tlbvToUserGroupItem(\n\t\t\t\t\t\t\t\t\t\t\t\t{label, value},\n\t\t\t\t\t\t\t\t\t\t\t\tUserGroupItemType.USER,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t/>\n\t\t</UserSelectorRoot>\n\t);\n};\n\nexport const UserSelector = UserSelectorPrimitive;\n\nexport default UserSelector;\n","import type {Asset} from '@netx/core-asset/types';\n\nexport const assetIsInCart = (asset?: Asset) => asset?.inCurrentCart === true;\n\nexport default assetIsInCart;\n","import type {Asset} from '@netx/core-asset/types';\n\nimport {assetIsInCart} from './utils';\n\nexport const canAddAssetToCart = (asset?: Asset) => !assetIsInCart(asset);\n\nexport const canRemoveAssetFromCart = (asset?: Asset) => assetIsInCart(asset);\n","import React, {CSSProperties} from 'react';\nimport clsx from 'clsx';\n\nimport {Skeleton, SkeletonProps} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport type {AttributeProps} from '../Attribute';\n\nconst getTextFieldHeight = ({components}: Theme) => {\n\tconst textFieldSize = components?.MuiTextField?.defaultProps?.size;\n\tif (textFieldSize === 'medium') return 48;\n\tif (textFieldSize === 'small') return 40;\n\treturn 56;\n};\n\nconst styles = ({spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tflex: '0 0 auto',\n\t\t\tdisplay: 'flex',\n\t\t\tminWidth: 0,\n\t\t\t'&$readOnly': {\n\t\t\t\tmargin: spacing(0.5, 1, 0.5, 1),\n\t\t\t},\n\t\t\t'&:not($readOnly)': {\n\t\t\t\tmargin: spacing(2, 0, 1, 0),\n\t\t\t},\n\t\t},\n\t\tskeletonItem: {\n\t\t\tflex: '0 0 auto',\n\t\t},\n\t\tinputArea: {\n\t\t\tborderRadius: 4,\n\t\t},\n\t\tpreDecorator: {\n\t\t\tborderRadius: '50%',\n\t\t\tmarginRight: 8,\n\t\t},\n\t\tpostDecorator: {\n\t\t\tborderRadius: '50%',\n\t\t\tmarginLeft: 8,\n\t\t\tmarginRight: -4,\n\t\t},\n\t\treadOnly: {},\n\t\treadOnlyText: {\n\t\t\twidth: '100%',\n\t\t},\n\t\treadOnlyTextTitle: {\n\t\t\tmarginBottom: spacing(0.5),\n\t\t},\n\t\treadOnlyTextValue: {},\n\t\trounded: {\n\t\t\tborderRadius: '50%',\n\t\t},\n\t});\n\n// TODO: clean this component up and convert to styled\nexport type AttributeSkeletonProps = Partial<AttributeProps> & {\n\tonSearch?: boolean;\n\tSkeletonProps?: Partial<SkeletonProps>;\n\tstyle?: CSSProperties;\n};\n\nconst AttributeSkeletonComponent = ({\n\tclasses,\n\ttheme,\n\n\tclearable,\n\tonSearch,\n\treadOnly,\n\tSkeletonProps,\n\t// TODO: fix the way we get the props here or...\n\tattrData,\n\tenforceMandatory,\n\thideLabel,\n\tvalue,\n\tform,\n\tlimitHeightToContainer,\n\tloadingValue,\n\tmode,\n\tplaceholder,\n\tattributeWorking,\n\talignActions,\n\tappendable,\n\tmultipleValues,\n\tisMetadataLookup,\n\tisMetadataTarget,\n\terror,\n\taction,\n\tonLookup,\n\tforceClearable,\n\tdisableFolksonomy,\n\tmatchContainerHeight,\n\tchanged,\n\toriginalValue,\n\tdisabled,\n\n\t...props\n}: WithStyles<typeof styles, true> & AttributeSkeletonProps) => {\n\tconst textFieldHeight = getTextFieldHeight(theme);\n\n\tconst actionSize = Math.max(textFieldHeight - 8, 40);\n\tconst preDecorate = onSearch != null;\n\tconst postDecorate = clearable === true;\n\n\tlet inputWidthSubtraction = 0;\n\tif (preDecorate) inputWidthSubtraction += actionSize + 8;\n\tif (postDecorate) inputWidthSubtraction += actionSize + 8;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={clsx(classes.root, {\n\t\t\t\t[classes.readOnly]: readOnly,\n\t\t\t})}\n\t\t\t{...props}\n\t\t>\n\t\t\t{(preDecorate && (\n\t\t\t\t<Skeleton\n\t\t\t\t\tvariant=\"rectangular\"\n\t\t\t\t\tclassName={clsx(classes.skeletonItem, classes.preDecorator)}\n\t\t\t\t\theight={actionSize}\n\t\t\t\t\twidth={actionSize}\n\t\t\t\t\t{...SkeletonProps}\n\t\t\t\t/>\n\t\t\t)) ||\n\t\t\t\tnull}\n\t\t\t{!readOnly ? (\n\t\t\t\t<Skeleton\n\t\t\t\t\tclassName={clsx(classes.skeletonItem, classes.inputArea)}\n\t\t\t\t\theight={textFieldHeight}\n\t\t\t\t\twidth={`calc(100% - ${inputWidthSubtraction}px)`}\n\t\t\t\t\tvariant=\"rectangular\"\n\t\t\t\t\t{...SkeletonProps}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className={classes.readOnlyText}>\n\t\t\t\t\t<Skeleton\n\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\tclassName={clsx(classes.skeletonItem, classes.readOnlyTextTitle)}\n\t\t\t\t\t\twidth={`calc(50% - ${inputWidthSubtraction}px)`}\n\t\t\t\t\t\t{...SkeletonProps}\n\t\t\t\t\t/>\n\t\t\t\t\t<Skeleton\n\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\tclassName={clsx(classes.skeletonItem, classes.readOnlyTextValue)}\n\t\t\t\t\t\twidth={`calc(100% - ${inputWidthSubtraction}px)`}\n\t\t\t\t\t\t{...SkeletonProps}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{(postDecorate && (\n\t\t\t\t<Skeleton\n\t\t\t\t\tvariant=\"rectangular\"\n\t\t\t\t\tclassName={clsx(classes.skeletonItem, classes.postDecorator)}\n\t\t\t\t\theight={actionSize}\n\t\t\t\t\twidth={actionSize}\n\t\t\t\t\t{...SkeletonProps}\n\t\t\t\t/>\n\t\t\t)) ||\n\t\t\t\tnull}\n\t\t</div>\n\t);\n};\n\nexport const AttributeSkeleton = withStyles(styles, {\n\twithTheme: true,\n})(React.memo(AttributeSkeletonComponent));\n\nexport default AttributeSkeleton;\n","import React from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {compareProps} from '@netx/core-components/util';\n\nimport {AttributeAttributes} from '@netx/core-asset/models/attribute';\nimport {\n\tReadOnlyMultiSelectField,\n\tReadOnlySelectField,\n} from '@netx/core-components/Form/SelectField/components';\nimport {ReadOnlyTextField} from '@netx/core-components/Form';\n\nimport {ATTRIBUTE_TYPE, ATTRIBUTE_MULTIPLE_VALUE_TYPES} from '../../constants';\nimport formatters from '../../formatters';\n\nexport interface ReadOnlyAttributeProps {\n\tattrData: AttributeAttributes;\n\tdisabled?: boolean;\n\thideLabel?: boolean;\n\tloadingValue?: boolean;\n\tlimitHeightToContainer?: boolean;\n\tmultipleValues?: boolean;\n\tvalue?: any;\n}\n\nconst formatURLS = (value: any) => {\n\tif (typeof value !== 'string') return value;\n\treturn (\n\t\t<>\n\t\t\t{value.split(/(https?:\\/\\/.*?[^\\s|'|\"]+)/g).map((str) => {\n\t\t\t\tif (str.match(/^https?:\\/\\/.*?[^\\s|'|\"]+/)) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<a href={str} target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t\t{str}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn str;\n\t\t\t})}\n\t\t</>\n\t);\n};\n\nconst getFormattedValue = (attrData: AttributeAttributes, value: any) => {\n\tif (ATTRIBUTE_MULTIPLE_VALUE_TYPES.includes(attrData.type as any))\n\t\treturn value;\n\n\tconst formattedValue = formatters[attrData.type || 1](value, attrData);\n\tif (\n\t\tformattedValue == null ||\n\t\tformattedValue === '' ||\n\t\ttypeof formattedValue !== 'string'\n\t)\n\t\treturn formattedValue;\n\n\treturn formatURLS(formattedValue);\n};\n\nconst ReadOnlyAttributeComponent = ({\n\tattrData,\n\thideLabel,\n\tvalue,\n\t...props\n}: ReadOnlyAttributeProps) => {\n\tconst name = attrData.system\n\t\t? i18n.t(`i18n.${attrData.name}`)\n\t\t: attrData.name;\n\n\tconst sendProps = {\n\t\tlabel: hideLabel ? '' : name,\n\t\tvalue: getFormattedValue(attrData, value),\n\t\t...props,\n\t};\n\n\t// multiselect, tag, tag(vocab), semantic\n\tif (ATTRIBUTE_MULTIPLE_VALUE_TYPES.includes(attrData.type as any)) {\n\t\treturn <ReadOnlyMultiSelectField {...sendProps} />;\n\t}\n\t// select\n\tif ([ATTRIBUTE_TYPE.SELECT].includes(attrData.type as any)) {\n\t\treturn <ReadOnlySelectField {...sendProps} />;\n\t}\n\t// text, textarea, number, data\n\tif (\n\t\t[\n\t\t\tATTRIBUTE_TYPE.TEXT,\n\t\t\tATTRIBUTE_TYPE.TEXTAREA,\n\t\t\tATTRIBUTE_TYPE.NUMBER,\n\t\t\tATTRIBUTE_TYPE.DATE,\n\t\t].includes(attrData.type as any)\n\t) {\n\t\treturn <ReadOnlyTextField {...sendProps} />;\n\t}\n\n\treturn null;\n};\n\nexport const ReadOnlyAttribute = React.memo(\n\tReadOnlyAttributeComponent,\n\tcompareProps(),\n);\nexport default ReadOnlyAttribute;\n","import {i18n} from '@netx/core/i18n';\n\nexport default {\n\tread: {\n\t\tdefault: i18n.t('i18n.errorAlert'),\n\t},\n\tupdate: {\n\t\tdefault: i18n.t('i18n.errorAlert'),\n\t},\n};\n","import {i18n} from '@netx/core/i18n';\n\nexport default {\n\tsaveSuccess: i18n.t('i18n.success'),\n\tsingleFieldMultipleFieldsSelected: i18n.t(\n\t\t'i18n.multipleColumnsAreSelectedUseSidebar',\n\t),\n\tsingleFieldNoFieldsSelected: i18n.t(\n\t\t'i18n.selectWithinASingleColumnToEnableEdit',\n\t),\n};\n","import {useCallback, useEffect, useRef} from 'react';\n\nimport type {Asset} from '@netx/core-asset/types';\nimport {cart as cartSingleton} from '@netx/core-cart/collections/singleton';\nimport {useRefState} from '@netx/core-components';\n\nexport type UseCartAssets = {\n\thasAssets: boolean;\n\tassets: Asset[];\n\tassetCount: number;\n\tqueued: boolean;\n};\n\nexport const useCurrentCart = () => {\n\tconst [cart, cartRef, setCart] = useRefState<UseCartAssets>({\n\t\thasAssets: false,\n\t\tassets: [],\n\t\tassetCount: 0,\n\t\tqueued: false,\n\t});\n\n\tconst updateTimeout = useRef<NodeJS.Timeout>();\n\n\tconst update = useCallback(() => {\n\t\tsetCart({\n\t\t\thasAssets: cartSingleton.getTotal() > 0,\n\t\t\tassets: cartSingleton.models.map((model) => model.attributes),\n\t\t\tassetCount: cartSingleton.getTotal(),\n\t\t\tqueued:\n\t\t\t\t!!cartSingleton.addQueue.assets.length ||\n\t\t\t\t!!cartSingleton.removeQueue.assets.length,\n\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst listener = () => {\n\t\t\tupdateTimeout.current && clearTimeout(updateTimeout.current);\n\t\t\tupdateTimeout.current = setTimeout(() => update(), 200);\n\t\t};\n\t\tcartSingleton.on('add remove reset sync', listener);\n\t\tcartSingleton.addQueue.assets.on('add remove', listener);\n\t\tcartSingleton.removeQueue.assets.on('add remove', listener);\n\n\t\tupdate();\n\n\t\treturn () => {\n\t\t\tupdateTimeout.current && clearTimeout(updateTimeout.current);\n\t\t\tcartSingleton.off('add remove reset sync', listener);\n\t\t\tcartSingleton.addQueue.assets.off('add remove', listener);\n\t\t\tcartSingleton.removeQueue.assets.off('add remove', listener);\n\t\t};\n\t}, []);\n\n\treturn {cart, cartRef};\n};\n\nexport default useCurrentCart;\n","import React, {useCallback} from 'react';\nimport {i18n} from '@netx/core/i18n';\nimport {faUsers} from '@fortawesome/pro-solid-svg-icons';\nimport AutoListField, {\n\tCommenExtendProps,\n\tOption,\n} from '@netx/core-components/Form/AutoListField';\nimport getGroupAutoList, {GroupAutoListItem} from '../../api/getGroupAutoList';\n\nexport {GroupAutoListItem} from '../../api/getGroupAutoList';\n\nexport type GroupAutoListProps<\n\tMultiple extends boolean = true,\n\tDisableClearable extends boolean = false\n> = CommenExtendProps<GroupAutoListItem, Multiple, DisableClearable, false> & {\n\tfilterGroups?: (groups: GroupAutoListItem[]) => GroupAutoListItem[];\n};\n\nconst getOptionLabel = (option: GroupAutoListItem) => option?.label;\nconst getOptionSelected = (\n\toption?: GroupAutoListItem,\n\tvalue?: GroupAutoListItem,\n) => option?.value === value?.value;\n\nexport const GroupAutoList = <\n\tMultiple extends boolean = true,\n\tDisableClearable extends boolean = false\n>({\n\tfilterGroups,\n\t...props\n}: GroupAutoListProps<Multiple, DisableClearable>) => {\n\tconst renderOption = useCallback(\n\t\t(props, option, state) => (\n\t\t\t<Option\n\t\t\t\tvalue={getOptionLabel(option)}\n\t\t\t\tavatar\n\t\t\t\ticon={option.value === -1 ? faUsers : undefined}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t),\n\t\t[],\n\t);\n\n\tconst handleLookup = useCallback(\n\t\tasync (query) => {\n\t\t\tconst groups = await getGroupAutoList({query});\n\t\t\treturn filterGroups ? filterGroups(groups) : groups;\n\t\t},\n\t\t[filterGroups],\n\t);\n\n\treturn (\n\t\t<AutoListField<GroupAutoListItem, Multiple, DisableClearable>\n\t\t\tlabel={i18n.t('i18n.group')}\n\t\t\tname=\"group-auto-list\"\n\t\t\tonLookup={handleLookup}\n\t\t\tgetValueLabel={getOptionLabel}\n\t\t\tplaceholder={\n\t\t\t\tprops.multiple === false ? i18n.t('i18n.pleaseSelect') : undefined\n\t\t\t}\n\t\t\t{...props}\n\t\t\tAutocompleteProps={{\n\t\t\t\tgetOptionLabel,\n\t\t\t\tisOptionEqualToValue: getOptionSelected,\n\t\t\t\trenderOption,\n\t\t\t\t...props?.AutocompleteProps,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport default GroupAutoList;\n","import React, {useCallback, useMemo, useState} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {\n\tAutocompleteProps,\n\tTextFieldProps,\n\tAutocompleteValue,\n} from '@mui/material';\n\nimport {styled} from '@netx/core-components/Theme';\n\nimport {useAttributeSetSelectionProvider} from '../../context';\nimport type {AttributeSet, AttributeSetId} from '@netx/core-attribute-set';\n\nimport {useWhenChangedEffect} from '@netx/core-components/hooks';\nimport Chip, {ChipSkeleton} from '@netx/core-components/Chip';\nimport SelectField, {\n\tSelectFieldProps,\n} from '@netx/core-components/Form/SelectField';\n\nexport * from '@netx/core-components/Form/SelectField/components/Select/selectFieldClasses';\n\nconst getSafeValues = (values?: any[]) =>\n\tvalues && Array.isArray(values) ? values : [];\n\nconst AttributeSetSelectorRoot = styled(SelectField)(({theme}) => ({\n\tflex: '0 0 auto',\n\t// padding: theme.spacing(1, 2),\n\twidth: '100%',\n}));\n\nconst getOptionSelected = (option: Option, value: Option) =>\n\toption?.id === value?.id;\nconst groupBy = (option: Option) => option?.group;\n\n// We want our sets to be grouped by type (client, user, system) and in that order\nconst getSetOptionsInOrder = (sets: AttributeSet[]) => {\n\tconst userLabel = i18n.t('i18n.user');\n\tconst systemLabel = i18n.t('i18n.system');\n\treturn sets\n\t\t.map((set): Option => {\n\t\t\tconst group = ['mandatory', 'all'].includes(set.id)\n\t\t\t\t? ''\n\t\t\t\t: set.id.match(/^user-/)\n\t\t\t\t? userLabel\n\t\t\t\t: systemLabel;\n\t\t\treturn {\n\t\t\t\tgroup,\n\t\t\t\tid: set.id,\n\t\t\t\tactive: set.active,\n\t\t\t\tname: set.name,\n\t\t\t};\n\t\t})\n\t\t.filter((set) => set.active === 1)\n\t\t.sort((a, b) => {\n\t\t\t// \"no group\" wins\n\t\t\t// followed by user sets\n\t\t\t// then system\n\t\t\tif (a.group === '' && (b.group === userLabel || b.group !== ''))\n\t\t\t\treturn -1;\n\t\t\tif (a.group === userLabel && b.group === systemLabel) return -1;\n\t\t\treturn 1;\n\t\t});\n};\n\nexport interface SelectionProps<\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false,\n> extends Partial<SelectFieldProps<Option, Multiple, DisableClearable, false>> {\n\tallowCustom?: boolean;\n\tignoreSystemMandatory?: boolean;\n\tignoreUserMandatory?: boolean;\n\tvariant?: TextFieldProps['variant'];\n}\n\nexport interface Option {\n\tgroup: string;\n\tid: AttributeSetId;\n\tactive?: 0 | 1;\n\tname: string;\n}\n\nconst SetSelector = <\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false,\n>({\n\tallowCustom,\n\tignoreSystemMandatory,\n\tignoreUserMandatory,\n\tmultiple,\n\t...props\n}: SelectionProps<Multiple, DisableClearable>) => {\n\tconst {state, actions, cancelled, attributeSetCtx} =\n\t\tuseAttributeSetSelectionProvider();\n\n\tconst [inputValue, setInputValue] = useState('');\n\n\tconst options = useMemo(() => {\n\t\treturn getSetOptionsInOrder(\n\t\t\tattributeSetCtx.getSelectable(ignoreSystemMandatory, ignoreUserMandatory),\n\t\t).concat(\n\t\t\tallowCustom\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgroup: i18n.t('i18n.custom'),\n\t\t\t\t\t\t\tid: 'custom',\n\t\t\t\t\t\t\tactive: 1,\n\t\t\t\t\t\t\tname: i18n.t('i18n.custom'),\n\t\t\t\t\t\t},\n\t\t\t\t ]\n\t\t\t\t: [],\n\t\t);\n\t}, [\n\t\tattributeSetCtx.getSelectable,\n\t\tignoreSystemMandatory,\n\t\tignoreUserMandatory,\n\t]);\n\n\tconst renderTags = useCallback<\n\t\tRequired<\n\t\t\tAutocompleteProps<Option, Multiple, DisableClearable, false>\n\t\t>['renderTags']\n\t>(\n\t\t(values, getTagProps) => {\n\t\t\tvalues = getSafeValues(values);\n\t\t\treturn props.loadingValue ? (\n\t\t\t\t<ChipSkeleton count={3} />\n\t\t\t) : (\n\t\t\t\tvalues.map((value, index) => {\n\t\t\t\t\tif (!value) return null;\n\t\t\t\t\tconst label = value.name;\n\t\t\t\t\tconst tagProps = getTagProps({index}) as any;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Chip\n\t\t\t\t\t\t\t{...tagProps}\n\t\t\t\t\t\t\tdisabled={props.disabled}\n\t\t\t\t\t\t\tonDelete={\n\t\t\t\t\t\t\t\tstate.enforce.includes(value.id) ? undefined : tagProps.onDelete\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcolor=\"secondary\"\n\t\t\t\t\t\t\tkey={`${value.id}`}\n\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\ttitle={label}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[\n\t\t\tstate.enforce,\n\t\t\tprops.disabled,\n\t\t\tprops.AutocompleteProps,\n\t\t\tprops.loadingValue,\n\t\t],\n\t);\n\n\tconst getOptionLabel = useCallback((option: Option) => option.name, []);\n\n\tconst handleSelectionChange = useCallback(\n\t\t(value) => {\n\t\t\tif (!Array.isArray(value)) value = [value];\n\n\t\t\tvalue =\n\t\t\t\tvalue == null\n\t\t\t\t\t? []\n\t\t\t\t\t: value.map((val?: Option) => (val?.id ? val.id : val));\n\n\t\t\tif (value.join() === state.selected.join()) return;\n\n\t\t\tactions.setSelected(value);\n\t\t},\n\t\t[actions.setSelected, state.selected],\n\t);\n\n\tconst handleInputChange = useCallback((_, value, reason) => {\n\t\tif (reason === 'reset') return;\n\t\tsetInputValue(value);\n\t}, []);\n\n\tconst value = state.selected\n\t\t.map((id) => options.find((option) => option.id === id))\n\t\t.filter((val) => val != null);\n\n\tconst ourValue = (multiple ? value : value[0] || null) as AutocompleteValue<\n\t\tOption,\n\t\tMultiple,\n\t\tDisableClearable,\n\t\tfalse\n\t>;\n\n\tconst placeholder =\n\t\t!multiple || !value.length ? i18n.t('i18n.pleaseSelect') : undefined;\n\n\tuseWhenChangedEffect(\n\t\tcancelled,\n\t\tuseCallback(\n\t\t\t(cancelled) => {\n\t\t\t\tif (multiple) {\n\t\t\t\t\tsetInputValue('');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetInputValue(ourValue == null ? '' : (ourValue as Option).name);\n\t\t\t},\n\t\t\t[multiple, ourValue],\n\t\t),\n\t);\n\n\treturn (\n\t\t// TODO: how to use generics with `styled`\n\t\t// @ts-ignore\n\t\t<AttributeSetSelectorRoot<Option, Multiple, DisableClearable>\n\t\t\tid=\"attribute-set-selection\"\n\t\t\tlabel={\n\t\t\t\tmultiple ? i18n.t('i18n.attributeSets') : i18n.t('i18n.attributeSet')\n\t\t\t}\n\t\t\tlabelKey=\"name\"\n\t\t\tplaceholder={placeholder}\n\t\t\tmultiple={multiple}\n\t\t\tonChange={handleSelectionChange}\n\t\t\toptions={options}\n\t\t\tname=\"set-selector\"\n\t\t\t{...props}\n\t\t\tInputLabelProps={{\n\t\t\t\tshrink: true,\n\t\t\t\t...props.InputLabelProps,\n\t\t\t}}\n\t\t\tvalue={ourValue}\n\t\t\tAutocompleteProps={{\n\t\t\t\t...props.AutocompleteProps,\n\t\t\t\tinputValue:\n\t\t\t\t\t!multiple && inputValue === '' && ourValue\n\t\t\t\t\t\t? (ourValue as Option).name\n\t\t\t\t\t\t: inputValue,\n\t\t\t\tonBlur: () => {\n\t\t\t\t\tsetInputValue('');\n\t\t\t\t},\n\t\t\t\topenOnFocus: false,\n\t\t\t\tgetOptionLabel,\n\t\t\t\tisOptionEqualToValue: getOptionSelected,\n\t\t\t\tgroupBy,\n\t\t\t\tonInputChange: handleInputChange,\n\t\t\t\trenderTags,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport default React.memo(SetSelector) as <\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false,\n>(\n\tprops: SelectionProps<Multiple, DisableClearable>,\n) => JSX.Element;\n","import SavedCartsCollection from '../savedCarts';\n\nexport const allSavedCarts = new SavedCartsCollection([], {\n\tpager: {pageSize: 0x7fffffff},\n});\n\nexport const favoriteSavedCarts = new SavedCartsCollection([], {\n\tpager: {pageSize: 0x7fffffff, pagesToDisplay: 0},\n\tmodeFilters: ['favorites'],\n});\n\nallSavedCarts\n\t.on(\n\t\t'add',\n\t\t(model) => model.isFavorite() && favoriteSavedCarts.add(model.attributes),\n\t)\n\t.on('destroy', (model) => favoriteSavedCarts.remove(model.id));\n\nexport default {allSavedCarts, favoriteSavedCarts};\n","import {REPURPOSE_MINIMUM_USER_LEVEL} from './constants';\nimport {REPURPOSE_ACTION_LABELS} from './locales';\n\nimport type {Action} from '@netx/core/bootstrap';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {faRecycle} from '@fortawesome/pro-solid-svg-icons';\n\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaRecycle: icon(faRecycle, iconOpts).html,\n};\n\nexport const REPURPOSE_ACTION_ICON = <const>{\n\tREPURPOSE: faRecycle,\n};\n\nexport type RepurposeBaseVent = typeof REPURPOSE_BASE_EVENT;\n\nexport const REPURPOSE_BASE_EVENT = `asset:repurpose`;\n\nexport const REPURPOSE_EVENT = <const>{\n\tREPURPOSE_ASSET: `${REPURPOSE_BASE_EVENT}:asset`,\n\tREPURPOSE_SELECTION: `${REPURPOSE_BASE_EVENT}:seleciton`,\n\tREPURPOSE_AUDIO: `${REPURPOSE_BASE_EVENT}:audio`,\n\tREPURPOSE_IMAGE: `${REPURPOSE_BASE_EVENT}:image`,\n};\n\nexport const REPURPOSE_ACTIONS: Action<\n\ttypeof REPURPOSE_EVENT[keyof typeof REPURPOSE_EVENT]\n>[] = [\n\t{\n\t\tevent: REPURPOSE_EVENT.REPURPOSE_ASSET,\n\t\ticon: icons.faRecycle,\n\t\tlabel: REPURPOSE_ACTION_LABELS.REPURPOSE,\n\t\tuserLevel: REPURPOSE_MINIMUM_USER_LEVEL,\n\t},\n\t{\n\t\tevent: REPURPOSE_EVENT.REPURPOSE_SELECTION,\n\t\ticon: icons.faRecycle,\n\t\tlabel: REPURPOSE_ACTION_LABELS.REPURPOSE,\n\t\tuserLevel: REPURPOSE_MINIMUM_USER_LEVEL,\n\t},\n];\n\nexport default REPURPOSE_ACTIONS;\n","const NAME = 'materialCheckboxes';\n\nimport './css/materialCheckboxes.less';\n\nimport {MDCFormField} from '@material/form-field';\nimport {MDCCheckbox} from '@material/checkbox';\nimport {purgeEls} from '@netx/core/lib/utils';\n\nexport default function (target) {\n\tif (!target || target.hasFunctionality(NAME)) return target;\n\n\ttarget.addInitializer((instance, opts = {}) => {\n\t\tlet materialCheckboxes = [];\n\n\t\tconst cleanUp = () => {\n\t\t\t_.invoke(materialCheckboxes, 'destroy');\n\t\t\tmaterialCheckboxes = [];\n\t\t};\n\n\t\t// Hey, listen!\n\t\tinstance\n\t\t\t.on('preRenderHook', cleanUp)\n\t\t\t.on('removeHook', cleanUp)\n\t\t\t.on('postRenderHook', () => {\n\t\t\t\tpurgeEls(\n\t\t\t\t\t[...instance.el.querySelectorAll('.mdc-form-field')],\n\t\t\t\t\tinstance.getExcludedViews(),\n\t\t\t\t).forEach((field) => {\n\t\t\t\t\t// material needs to initialize after\n\t\t\t\t\t// the view is visible or the focus animation\n\t\t\t\t\t// wont work until it is clicked\n\t\t\t\t\tinstance.whenShown.then(() => {\n\t\t\t\t\t\tconst checkboxEl = field.querySelector('.mdc-checkbox');\n\t\t\t\t\t\tif (!checkboxEl) return;\n\n\t\t\t\t\t\tconst checkbox = new MDCCheckbox(checkboxEl);\n\t\t\t\t\t\tmaterialCheckboxes.push(checkbox);\n\n\t\t\t\t\t\tconst formField = new MDCFormField(field);\n\t\t\t\t\t\tformField.input = checkbox;\n\t\t\t\t\t\tmaterialCheckboxes.push(formField);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t}, NAME);\n\n\treturn target;\n}\n","// upload:asset:customThumbnail:success\n// upload:asset:customThumbnail:<assetId>:success\n// upload:asset:customThumbnail:error\n// upload:asset:customThumbnail:<assetId>:error\n// upload:asset:customThumbnail:progress\n// upload:asset:customThumbnail:<assetId>:progress\n// asset:customThumbnail:upload:<assetId>:FileUploaded\n// asset:customThumbnail:upload:<assetId>:FilesAdded\n// asset:customThumbnail:upload:<assetId>:UploadProgress\n// asset:customThumbnail:upload:<assetId>:FileUploaded\n// asset:customThumbnail:upload:<assetId>:error\nimport {useEffect, useState} from 'react';\nimport {dispatcher} from '@netx/core/bootstrap';\nimport type {AssetId} from '@netx/core-asset/types';\nimport {useDispatcher} from '@netx/core-components/hooks/useDispatcher';\n\nexport type UseAssetCustomThumbnailArguments = {\n\tassetId?: AssetId;\n};\n\n// TODO: still needs cleanup but it works!\n// TODO: need to keep track of any items globally\n// we can use the global success/error calls to add/remove\n// that way when a asset renders is can pick up here\nexport const useAssetCustomThumbnail = ({\n\tassetId,\n}: UseAssetCustomThumbnailArguments) => {\n\tconst [isUploading, setIsUploading] = useState(false);\n\tconst [isSaving, setIsSaving] = useState(false);\n\tconst [progress, setProgress] = useState(0);\n\n\tconst [cacheBuster, setCachBuster] = useState<{customThumb: number}>();\n\n\tuseDispatcher(`upload:asset:customThumbnail:${assetId}:error`, () => {\n\t\tsetIsSaving(false);\n\t\tsetIsUploading(false);\n\t});\n\n\tuseDispatcher(\n\t\t`upload:asset:customThumbnail:${assetId}:progress`,\n\t\t(progress: number) => {\n\t\t\tsetProgress(50 + progress / 2);\n\t\t},\n\t);\n\n\tuseDispatcher(`upload:asset:customThumbnail:${assetId}:success`, () => {\n\t\tsetProgress(100);\n\t\tsetTimeout(() => {\n\t\t\tsetIsSaving(false);\n\t\t\tsetIsUploading(false);\n\t\t\tsetCachBuster({customThumb: Date.now()});\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetProgress(0);\n\t\t\t}, 200);\n\t\t}, 200);\n\t});\n\n\tuseDispatcher(`upload:asset:customThumbnail:${assetId}:FilesAdded`, () => {\n\t\tsetIsSaving(true);\n\t\tsetIsUploading(true);\n\t\tsetProgress(0);\n\t});\n\n\tuseDispatcher(\n\t\t`upload:asset:customThumbnail:${assetId}:UploadProgress`,\n\t\t(_, file) => {\n\t\t\tsetProgress(file.percent / 2);\n\t\t},\n\t);\n\n\tuseDispatcher(`upload:asset:customThumbnail:${assetId}:FileUploaded`, () => {\n\t\tsetIsUploading(false);\n\t});\n\n\treturn {\n\t\tcacheBuster,\n\t\tisUploading,\n\t\tisSaving,\n\t\tisWorking: isSaving || isUploading,\n\t\tprogress,\n\t};\n};\n\nexport default useAssetCustomThumbnail;\n","import {UserLevel} from '@netx/core-user/constants';\n\nexport const ASSET_DOWNLOAD_MINUMUM_USER_LEVEL = UserLevel.CONSUMER;\n","import {i18n} from '@netx/core/i18n';\n\nexport const ASSET_SHARE_ACTION_LABELS = {\n\tCREATE_PDF: i18n.t('i18n.createPDF'),\n\tDOWNLOAD: i18n.t('i18n.download'),\n\tMENU: i18n.t('i18n.share'),\n};\n","import {i18n} from '@netx/core/i18n';\n\nexport const SEARCH_VISUAL_ACTION_LABELS = {\n\tASSET: i18n.t('i18n.findAssetsLikeThis'),\n};\n","import {useEffect, useState} from 'react';\n\nimport {\n\t// uploadAssetsStore,\n\tUploadAssetProcessLabel,\n\tUploadAssetItemStatus,\n\tUploadAssetItem,\n} from '@netx/core-upload-asset';\n\nexport const useAssetTasks = (assetId?: number) => {\n\tconst [taskStatus, setTaskStatus] = useState<string>();\n\tconst [tasksActive, setTasksActive] = useState(false);\n\tconst [taskProgress, setTaskProgress] = useState(0);\n\n\tuseEffect(() => {\n\t\tif (!assetId) {\n\t\t\tsetTaskStatus(undefined);\n\t\t\tsetTasksActive(false);\n\t\t}\n\n\t\tconst checkStatus = (files: UploadAssetItem[]) => {\n\t\t\tconst uploading = files.find((file) => file.asset.assetId === assetId);\n\t\t\tif (!uploading || uploading.status === UploadAssetItemStatus.COMPLETED) {\n\t\t\t\tsetTasksActive(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetTasksActive(true);\n\t\t\tsetTaskStatus(\n\t\t\t\tUploadAssetProcessLabel[uploading.tasks[0]] || uploading.tasks[0],\n\t\t\t);\n\t\t\tsetTaskProgress(uploading.progress);\n\t\t};\n\n\t\t// TODO:\n\t\t// const unsub = uploadAssetsStore.subscribe(\n\t\t// \t(state) => state.files,\n\t\t// \tcheckStatus,\n\t\t// );\n\n\t\t// checkStatus(uploadAssetsStore.getState().files);\n\n\t\treturn () => {\n\t\t\t// unsub();\n\t\t};\n\t}, [assetId]);\n\n\treturn {\n\t\ttaskStatus,\n\t\ttasksActive,\n\t\ttaskProgress,\n\t};\n};\n\nexport default useAssetTasks;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const ASSET_IMAGE_WORKING_CLASS_NAME = 'AssetImageWorking';\nexport const ASSET_IMAGE_WORKING_CLASS_SLOTS = [\n\t'root',\n\t'progress',\n\t'primary',\n] as const;\n\nexport type AssetImageWorkingClassSlot = typeof ASSET_IMAGE_WORKING_CLASS_SLOTS[number];\n\nexport interface AssetImageWorkingClasses {\n\troot: string;\n\tprogress: string;\n\tprimary: string;\n}\n\nexport type AssetImageWorkingClassKey = keyof AssetImageWorkingClasses;\n\nexport const getAssetImageWorkingUtilityClass = (\n\tslot: AssetImageWorkingClassSlot,\n) => generateUtilityClass(ASSET_IMAGE_WORKING_CLASS_NAME, slot);\n\nexport const assetImageWorkingClasses: AssetImageWorkingClasses = generateUtilityClasses(\n\tASSET_IMAGE_WORKING_CLASS_NAME,\n\t['root', 'progress', 'primary'],\n);\n\nexport default assetImageWorkingClasses;\n","import React, {useCallback, useEffect, useState} from 'react';\nimport clsx from 'clsx';\n\nimport 'core-css/ui/iconDefaults.css';\n\nimport {LinearProgress, Typography} from '@mui/material';\n\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\n\nimport {\n\tassetImageWorkingClasses,\n\tgetAssetImageWorkingUtilityClass,\n\tAssetImageWorkingClasses,\n\tASSET_IMAGE_WORKING_CLASS_NAME,\n} from './assetImageWorkingClasses';\n\nexport type AssetImageWorkingElement = HTMLDivElement;\nexport type AssetImageWorkingRef = React.Ref<AssetImageWorkingElement>;\n\ntype AssetImageWorkingUtilityClassProps = WithClasses<\n\tAssetImageWorkingClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: AssetImageWorkingUtilityClassProps) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t\tprogress: ['progress'],\n\t\tprimary: ['primary'],\n\t};\n\treturn composeClasses(slots, getAssetImageWorkingUtilityClass, classes);\n};\n\nconst AssetImageWorkingRoot = styled('div', {\n\tname: ASSET_IMAGE_WORKING_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tbackground: theme.palette.custom.background.backdrop,\n\talignItems: 'center',\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tflexDirection: 'column',\n\tjustifyContent: 'center',\n\tminHeight: 0,\n\tposition: 'relative',\n\tuserSelect: 'none',\n}));\n\nconst AssetImageWorkingProgress = styled(LinearProgress, {\n\tname: ASSET_IMAGE_WORKING_CLASS_NAME,\n\tslot: 'Progress',\n})(({theme}) => ({\n\twidth: `calc(100% - ${theme.spacing(4)})`,\n}));\n\nconst AssetImageWorkingPrimary = styled(Typography, {\n\tname: ASSET_IMAGE_WORKING_CLASS_NAME,\n\tslot: 'Primary',\n})(({theme}) => ({\n\tmarginBottom: theme.spacing(1),\n\ttextAlign: 'center',\n}));\n\nexport interface AssetImageWorkingProps\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<AssetImageWorkingElement>,\n\t\t\tAssetImageWorkingElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tAssetImageWorkingClasses,\n\t\t\t{\n\t\t\t\tclassName?: string;\n\t\t\t\tprimary?: string;\n\t\t\t\tprogress?: number;\n\t\t\t\t//ref?: AssetImageWorkingRef;\n\t\t\t}\n\t\t> {}\n\nconst AssetImageWorkingInner = (\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tprogress,\n\t\tprimary,\n\t\t...props\n\t}: AssetImageWorkingProps,\n\tref?: AssetImageWorkingRef,\n) => {\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t});\n\n\treturn (\n\t\t<AssetImageWorkingRoot\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t>\n\t\t\t{primary != null ? (\n\t\t\t\t<AssetImageWorkingPrimary className={classes.primary} variant=\"caption\">\n\t\t\t\t\t{primary}\n\t\t\t\t</AssetImageWorkingPrimary>\n\t\t\t) : null}\n\t\t\t<AssetImageWorkingProgress\n\t\t\t\tclassName={classes.progress}\n\t\t\t\tvariant={progress != null ? 'determinate' : 'indeterminate'}\n\t\t\t\tvalue={progress != null ? progress : undefined}\n\t\t\t/>\n\t\t</AssetImageWorkingRoot>\n\t);\n};\n\nexport const AssetImageWorkingPrimitive = React.forwardRef(\n\tAssetImageWorkingInner,\n) as (props: AssetImageWorkingProps, ref?: AssetImageWorkingRef) => JSX.Element;\n\nexport const AssetImageWorking = React.memo(AssetImageWorkingPrimitive) as (\n\tprops: AssetImageWorkingProps,\n\tref?: AssetImageWorkingRef,\n) => JSX.Element;\n\nexport default AssetImageWorking;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface AssetImageClasses {\n\troot: string;\n\n\tportrait: string;\n\tlandscape: string;\n\thideShadow: string;\n\tprogress: string;\n\timage: string;\n\timageWrapper: string;\n\twatermark: string;\n\tcustomIcon: string;\n}\n\nexport const getAssetImageUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('AssetImage', slot);\n\nexport const assetImageClasses = generateUtilityClasses<\n\tkeyof AssetImageClasses\n>('AssetImage', [\n\t'root',\n\t'portrait',\n\t'landscape',\n\t'hideShadow',\n\t'progress',\n\t'image',\n\t'imageWrapper',\n\t'watermark',\n\t'customIcon',\n]);\nexport default assetImageClasses;\n","import React, {useCallback, useEffect, useState} from 'react';\nimport _ from 'underscore';\nimport {unstable_batchedUpdates} from 'react-dom';\nimport clsx from 'clsx';\nimport ReactResizeDetector from 'react-resize-detector';\n\nimport 'core-css/ui/iconDefaults.css';\n\nimport {Fade, LinearProgress, Skeleton, SkeletonProps} from '@mui/material';\nimport {i18n} from '@netx/core/i18n';\nimport Netx from '@netx/core/bootstrap';\nimport {getURLQueryFromObject} from '@netx/core/utils/getURLQueryFromObject';\nimport {useAssetCustomThumbnail} from '@netx/core-asset-custom-thumbnail';\nimport useImageLoader from '@netx/core-components/hooks/useImageLoader';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithClasses,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\nimport {preventContextMenu} from '@netx/core-components/util';\nimport {useAssetTasks} from '../../hooks';\nimport type {Asset} from '../../types';\nimport {isDefaultIcon} from '../../utils';\nimport {\n\tgetClosestSize,\n\tgetSizedDims,\n\tOrientation,\n\tSize,\n\tORIENTATION,\n\tSIZE_TYPE,\n} from './utils';\nimport {AssetImageWorking} from './AssetImageWorking';\nimport {\n\tassetImageClasses,\n\tgetAssetImageUtilityClass,\n\tAssetImageClasses,\n} from './assetImageClasses';\n\ntype AssetImageUtilityClassProps = WithClasses<\n\tAssetImageClasses,\n\t{\n\t\thideShadow?: boolean;\n\t\tportrait?: boolean;\n\t\tlandscape?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: AssetImageUtilityClassProps) => {\n\tconst {classes, hideShadow, landscape, portrait} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\thideShadow && 'hideShadow',\n\t\t\tlandscape && 'landscape',\n\t\t\tportrait && 'portrait',\n\t\t],\n\t\tprogress: ['progress'],\n\t\timageWrapper: ['imageWrapper'],\n\t\timage: ['image'],\n\t\tcustomIcon: ['customIcon'],\n\t\twatermark: ['watermark'],\n\t};\n\treturn composeClasses(slots, getAssetImageUtilityClass, classes);\n};\n\nconst AssetImageRoot = styled('div', {\n\tname: 'AssetImage',\n\tslot: 'Root',\n})(({theme}) => ({\n\talignItems: 'center',\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tflexDirection: 'column',\n\tjustifyContent: 'center',\n\tminHeight: 0,\n\toverflow: 'hidden',\n\tposition: 'relative',\n\tuserSelect: 'none',\n\t[`&.${assetImageClasses.landscape}`]: {\n\t\t[`& .${assetImageClasses.image}`]: {\n\t\t\tmaxWidth: '100%',\n\t\t},\n\t},\n\t[`&.${assetImageClasses.portrait}`]: {\n\t\t[`& .${assetImageClasses.image}`]: {\n\t\t\tmaxHeight: '100%',\n\t\t},\n\t},\n\t[`&:not(.${assetImageClasses.hideShadow})`]: {\n\t\t[`& .${assetImageClasses.image}, & .${assetImageClasses.customIcon} .thumbnail`]: {\n\t\t\tboxShadow: theme.shadows[2],\n\t\t},\n\t},\n}));\n\nconst AssetImageImg = styled('img', {\n\tname: 'AssetImage',\n\tslot: 'Image',\n})(({theme}) => ({\n\tobjectFit: 'contain',\n\tWebkitUserSelect: 'none',\n\tWebkitTouchCallout: 'none',\n}));\n\nconst AssetImageProgress = styled(LinearProgress, {\n\tname: 'AssetImage',\n\tslot: 'Progress',\n})(({theme}) => ({\n\tposition: 'absolute',\n\ttop: '50%',\n\tleft: theme.spacing(2),\n\tmarginTop: -2,\n\tright: theme.spacing(2),\n}));\n\nconst AssetImageWrapper = styled('div', {\n\tname: 'AssetImage',\n\tslot: 'ImageWrapper',\n})(({theme}) => ({\n\tposition: 'relative',\n\tdisplay: 'inline-flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n}));\n\nconst AssetImageWatermark = styled('div', {\n\tname: 'AssetImage',\n\tslot: 'Watermark',\n})(({theme}) => ({\n\t...theme.mixins.watermark(),\n}));\n\nconst AssetImageCustomIcon = styled('div', {\n\tname: 'AssetImage',\n\tslot: 'CustomIcon',\n})(({theme}) => ({\n\talignContent: 'center',\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tflexDirection: 'column',\n\tjustifyContent: 'center',\n\tposition: 'relative',\n\theight: '100%',\n\twidth: '100%',\n\t'& .thumbnail': {\n\t\theight: '100%',\n\t\twidth: '100%',\n\t\tflex: '1 1 auto',\n\t\tfontSize: 12,\n\t\t// Theme wide styles are messing with this in custom icons\n\t\tmargin: 'auto !important',\n\t\t// maxHeight: 500,\n\t\t// maxWidth: 500,\n\t},\n}));\n\nconst AssetImageWorkingRoot = styled(AssetImageWorking)(({theme}) => ({\n\tdisplay: 'flex',\n\t...theme.mixins.absoluteFill,\n\tzIndex: 4,\n}));\n\nconst AssetImageSkeleton = styled(Skeleton, {\n\tname: 'AssetImage',\n\tslot: 'Skeleton',\n})(({theme}) => ({\n\theight: '100%',\n\twidth: '100%',\n}));\n\nexport type AssetImageProps = WithClasses<\n\tAssetImageClasses,\n\t{\n\t\tclassName?: string;\n\t\tasset?: Asset;\n\t\tdisableLoader?: boolean;\n\t\tdisableFade?: boolean;\n\t\tloading?: boolean;\n\t\tforceImageSize?: Size;\n\t\thideShadow?: boolean;\n\t\thideTasks?: boolean;\n\t\tdisableXHR?: boolean;\n\t\tqueryParams?: Record<string, string>;\n\t\tSkeletonProps?: Partial<WithMuiPropOverrides<SkeletonProps>>;\n\t}\n>;\n\nexport const AssetImagePrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\tasset,\n\tdisableFade,\n\tdisableXHR,\n\tforceImageSize,\n\thideShadow,\n\thideTasks,\n\tdisableLoader,\n\tloading,\n\tqueryParams,\n\tSkeletonProps,\n\t...props\n}: AssetImageProps) => {\n\t// We cannot really know if a watermark is set until we check if the\n\t// image exists (portals do have a way to check, but we really should not need to fetch a portal model)\n\t// TODO: another argument that could be made is that watermark (or at least opting for the check) should\n\t// be passed down - but as history has shown in our app, when a watermark is set, the client needs wants\n\t// it set everywhere\n\t// If we ever do want to make this an opt-in/opt-out - making it an opt-out would be the on requiring 0\n\t// changes to the code already relyign on this component\n\tconst watermarkImageLoader = useImageLoader(true);\n\t// We test for the existence of the watermark and if it exists, set this to true\n\tconst [showWatermark, setShowWatermark] = useState(false);\n\n\tconst customThumbnail = useAssetCustomThumbnail({assetId: asset?.assetId});\n\tconst {taskStatus, tasksActive, taskProgress} = useAssetTasks(asset?.assetId);\n\n\tconst [containerDims, setContainerDims] = useState({width: 0, height: 0});\n\tconst [imageSize, setImageSize] = useState(\n\t\tforceImageSize || SIZE_TYPE.PREVIEW,\n\t);\n\t//const [actualImageSize, setActualImageSize] = useState<Size>(imageSize);\n\tconst [imageDims, setImageDims] = useState({width: 0, height: 0});\n\tconst [orientation, setOrentation] = useState<Orientation>(\n\t\tORIENTATION.PORTRAIT,\n\t);\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\thideShadow,\n\t\tportrait: orientation === 'portrait',\n\t\tlandscape: orientation === 'landscape',\n\t});\n\n\t// Anything that should be appended to the end of the url when requesting image\n\tconst appendToSrc = getURLQueryFromObject({\n\t\t...queryParams,\n\t\t...customThumbnail.cacheBuster,\n\t});\n\n\t// Test if we are dealing with a default icon from the server\n\tconst defaultIcon =\n\t\tisDefaultIcon(asset?.thumbUrl) || isDefaultIcon(asset?.previewUrl);\n\n\t// Main image loader\n\tconst {load, loading: imageLoading, progress, src} = useImageLoader(\n\t\tdisableXHR,\n\t);\n\n\t// safari is being a pain, it would appear it is lying about the dims in some cases\n\t// not so much lying but measuring too soon - it then measures again and two conflicting\n\t// loads go off\n\t// not sure where the breakdown is exactly, but once we get cantaloup we can simplify a lot\n\t// of this code and in turn hopefully mitigate the real problem (making this unnecessary)\n\tconst reloadImage = useCallback(\n\t\t_.debounce(() => {\n\t\t\tif (!imageSize || defaultIcon || !asset) return;\n\t\t\tconst sources: string[] = [`${asset.thumbUrl}${appendToSrc}`];\n\t\t\tswitch (imageSize) {\n\t\t\t\tcase 'zoom':\n\t\t\t\t\tsources.unshift.apply(sources, [\n\t\t\t\t\t\t`${Netx.URL.assetEndpoint}/${asset.assetId}/zoom/${asset.assetId}.jpg${appendToSrc}`,\n\t\t\t\t\t\t`${asset?.previewUrl}${appendToSrc}`,\n\t\t\t\t\t]);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'preview':\n\t\t\t\t\tsources.unshift(`${asset.previewUrl}${appendToSrc}`);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tload(sources.filter((src) => src !== ''));\n\t\t}, 16),\n\t\t[\n\t\t\tappendToSrc,\n\t\t\tdefaultIcon,\n\t\t\timageSize,\n\t\t\tasset?.assetId,\n\t\t\tasset?.previewUrl,\n\t\t\tasset?.thumbUrl,\n\t\t],\n\t);\n\n\t// When anything related to the image loading changes, (re)load the\n\t// desired image and size\n\tuseEffect(() => {\n\t\treloadImage();\n\t}, [reloadImage]);\n\n\t// Whenever anything updates that will affect the fitting of the image\n\tuseEffect(() => {\n\t\tif (!asset) return;\n\n\t\tconst closestSize =\n\t\t\tforceImageSize || getClosestSize(containerDims, orientation);\n\n\t\tconst assetSize = {\n\t\t\twidth: asset.filewidth || asset.previewWidth || 150,\n\t\t\theight: asset.fileheight || asset.previewHeight || 150,\n\t\t};\n\n\t\tconst sized = getSizedDims(closestSize, assetSize, containerDims);\n\n\t\tunstable_batchedUpdates(() => {\n\t\t\tsetImageSize(closestSize);\n\t\t\tsetImageDims(sized);\n\t\t});\n\t}, [\n\t\tasset?.fileheight,\n\t\tasset?.filewidth,\n\t\tasset?.previewHeight,\n\t\tasset?.previewWidth,\n\t\tcontainerDims,\n\t\tforceImageSize,\n\t\torientation,\n\t]);\n\n\t// Update orientation whenever the sizes passed in change\n\tuseEffect(() => {\n\t\tif (!asset?.previewHeight || !asset?.previewWidth) return;\n\n\t\tconst orientation =\n\t\t\tasset.previewHeight > asset.previewWidth\n\t\t\t\t? ORIENTATION.PORTRAIT\n\t\t\t\t: ORIENTATION.LANDSCAPE;\n\n\t\tsetOrentation(orientation);\n\t}, [asset?.previewWidth, asset?.previewHeight]);\n\n\t// Load watermark image\n\tuseEffect(() => {\n\t\tif (defaultIcon) return;\n\t\twatermarkImageLoader.load(`${Netx.URL.watermark}${appendToSrc}`);\n\t}, [appendToSrc, defaultIcon]);\n\n\t// Watermark image src has changed, check if it is a valid source\n\tuseEffect(() => {\n\t\tsetShowWatermark(!!watermarkImageLoader.src);\n\t}, [watermarkImageLoader.src]);\n\n\t// On container resize, set the appropriate proxy for the current container size\n\tconst handleResize = useCallback((width: number, height: number) => {\n\t\tif (width === 0 || height === 0) return;\n\t\tsetContainerDims({width, height});\n\t}, []);\n\n\treturn (\n\t\t<ReactResizeDetector<HTMLDivElement>\n\t\t\thandleWidth\n\t\t\thandleHeight\n\t\t\tonResize={handleResize}\n\t\t>\n\t\t\t{({targetRef}) => (\n\t\t\t\t<AssetImageRoot\n\t\t\t\t\tdata-testid=\"asset-image\"\n\t\t\t\t\tonContextMenu={preventContextMenu}\n\t\t\t\t\tclassName={clsx(classes.root, className)}\n\t\t\t\t\t{...props}\n\t\t\t\t\tref={targetRef}\n\t\t\t\t>\n\t\t\t\t\t{loading || !asset ? (\n\t\t\t\t\t\t<AssetImageSkeleton variant=\"rectangular\" {...SkeletonProps} />\n\t\t\t\t\t) : src || defaultIcon ? (\n\t\t\t\t\t\t<Fade\n\t\t\t\t\t\t\tin={!imageLoading || src != null}\n\t\t\t\t\t\t\ttimeout={disableFade ? 0 : 300}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{!defaultIcon ? (\n\t\t\t\t\t\t\t\t<AssetImageWrapper className={classes.imageWrapper}>\n\t\t\t\t\t\t\t\t\t<AssetImageImg\n\t\t\t\t\t\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t\t\t\t\t\talt={asset.name}\n\t\t\t\t\t\t\t\t\t\tclassName={classes.image}\n\t\t\t\t\t\t\t\t\t\t{...(imageDims.width && imageDims.height ? imageDims : {})}\n\t\t\t\t\t\t\t\t\t\tonContextMenu={preventContextMenu}\n\t\t\t\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{showWatermark ? (\n\t\t\t\t\t\t\t\t\t\t<AssetImageWatermark className={classes.watermark} />\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</AssetImageWrapper>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t// piggy backing off of our \"wonderful\" custom icon styles\n\t\t\t\t\t\t\t\t<AssetImageCustomIcon\n\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t`custom-icon-${defaultIcon[1]}`,\n\t\t\t\t\t\t\t\t\t\tclasses.customIcon,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t'thumbnail',\n\t\t\t\t\t\t\t\t\t\t\tcontainerDims.width < 40\n\t\t\t\t\t\t\t\t\t\t\t\t? 'fixed-size-tiny'\n\t\t\t\t\t\t\t\t\t\t\t\t: containerDims.width < 51\n\t\t\t\t\t\t\t\t\t\t\t\t? 'fixed-size-small'\n\t\t\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</AssetImageCustomIcon>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Fade>\n\t\t\t\t\t) : null}\n\n\t\t\t\t\t{!disableLoader ? (\n\t\t\t\t\t\t<Fade in={imageLoading}>\n\t\t\t\t\t\t\t<AssetImageProgress\n\t\t\t\t\t\t\t\tclassName={classes.progress}\n\t\t\t\t\t\t\t\tvariant={progress ? 'determinate' : 'indeterminate'}\n\t\t\t\t\t\t\t\tvalue={progress ? progress : undefined}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Fade>\n\t\t\t\t\t) : null}\n\n\t\t\t\t\t{!hideTasks ? (\n\t\t\t\t\t\t<Fade\n\t\t\t\t\t\t\tin={customThumbnail.isWorking || tasksActive}\n\t\t\t\t\t\t\tunmountOnExit\n\t\t\t\t\t\t\tmountOnEnter\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<AssetImageWorkingRoot\n\t\t\t\t\t\t\t\tclassName={classes.progress}\n\t\t\t\t\t\t\t\tprogress={tasksActive ? taskProgress : customThumbnail.progress}\n\t\t\t\t\t\t\t\tprimary={\n\t\t\t\t\t\t\t\t\ttasksActive\n\t\t\t\t\t\t\t\t\t\t? taskStatus\n\t\t\t\t\t\t\t\t\t\t: i18n.t('i18n.settingCustomThumbnail')\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Fade>\n\t\t\t\t\t) : null}\n\t\t\t\t</AssetImageRoot>\n\t\t\t)}\n\t\t</ReactResizeDetector>\n\t);\n};\n\nexport const AssetImage = React.memo(AssetImagePrimitive) as (\n\tprops: AssetImageProps,\n) => JSX.Element;\n\nexport default AssetImage;\n","export const ACTIONS = {\n\tITEM_MANAGER_ADD: 'ITEM_MANAGER_ADD' as const,\n\tITEM_MANAGER_ADD_MULTIPLE: 'ITEM_MANAGER_ADD_MULTIPLE' as const,\n\tITEM_MANAGER_REMOVE: 'ITEM_MANAGER_REMOVE' as const,\n\tITEM_MANAGER_REORDER: 'ITEM_MANAGER_REORDER' as const,\n\tITEM_MANAGER_RESET: 'ITEM_MANAGER_RESET' as const,\n\tITEM_MANAGER_SET_MAX_ITEMS: 'ITEM_MANAGER_SET_MAX_ITEMS' as const,\n} as const;\n","import {nanoid} from 'nanoid';\nimport arrayMove from 'array-move';\nimport {ACTIONS} from '../constants';\nimport {Action, Items} from './actions';\n\ntype State = {\n\tcount: number;\n\thasMaxItems: boolean;\n\titems: Items;\n\tlastAction: null | 'add' | 'remove' | 'reorder';\n\tlastId: null | number | string;\n\tmaxItems: number;\n};\n\nexport const initialState: State = {\n\tcount: 0,\n\thasMaxItems: false,\n\titems: [],\n\tlastAction: null,\n\tlastId: null,\n\tmaxItems: Infinity,\n};\n\nconst limitItems = (items: Items, limit: number) => {\n\tif (items.length <= limit) return items;\n\treturn items.slice(0, limit);\n};\n\nconst onRemove = (items: Items, id: number | string) =>\n\titems.filter((item) => item !== id);\n\nexport default (state: State, action: Action): State => {\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.log(action.type);\n\t}\n\tswitch (action.type) {\n\t\tcase ACTIONS.ITEM_MANAGER_ADD: {\n\t\t\tconst id = action.data || nanoid();\n\t\t\tconst items = [...state.items, id];\n\t\t\tconst count = items.length;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tcount,\n\t\t\t\thasMaxItems: count === state.maxItems,\n\t\t\t\titems,\n\t\t\t\tlastAction: 'add',\n\t\t\t\tlastId: id,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.ITEM_MANAGER_ADD_MULTIPLE: {\n\t\t\tconst items = limitItems(\n\t\t\t\t[...state.items, ...action.data],\n\t\t\t\tstate.maxItems,\n\t\t\t);\n\t\t\tconst count = items.length;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tcount,\n\t\t\t\thasMaxItems: count === state.maxItems,\n\t\t\t\tlastAction: 'add',\n\t\t\t\titems,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.ITEM_MANAGER_REMOVE: {\n\t\t\tconst items = onRemove(state.items, action.data);\n\t\t\tconst count = items.length;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tcount,\n\t\t\t\thasMaxItems: count === state.maxItems,\n\t\t\t\titems,\n\t\t\t\tlastAction: 'remove',\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.ITEM_MANAGER_REORDER: {\n\t\t\tconst {fromIndex, toIndex} = action.data;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\titems: arrayMove(state.items, fromIndex, toIndex),\n\t\t\t\tlastAction: 'reorder',\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.ITEM_MANAGER_RESET: {\n\t\t\tif (action.data) {\n\t\t\t\tconst items = limitItems(action.data, state.maxItems);\n\t\t\t\tconst count = items.length;\n\t\t\t\treturn {\n\t\t\t\t\t...initialState,\n\t\t\t\t\tcount,\n\t\t\t\t\thasMaxItems: count === state.maxItems,\n\t\t\t\t\titems,\n\t\t\t\t\tmaxItems: state.maxItems,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...initialState,\n\t\t\t\tmaxItems: state.maxItems,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.ITEM_MANAGER_SET_MAX_ITEMS: {\n\t\t\tconst maxItems = Math.max(action.data || Infinity, 0);\n\t\t\tif (state.count > maxItems) {\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tcount: maxItems,\n\t\t\t\t\thasMaxItems: true,\n\t\t\t\t\titems: limitItems(state.items, maxItems),\n\t\t\t\t\tmaxItems,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\thasMaxItems: state.count === maxItems,\n\t\t\t\tmaxItems,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn state;\n};\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseReducer,\n} from 'react';\n\nimport {nanoid} from 'nanoid';\n\nimport {useForm, FormType, FormValues} from '@netx/core-components/Form';\n\nimport actions, {ActionType} from './store/actions';\nimport reducer, {initialState} from './store/reducers';\n\nexport type ItemManagerStoreContextType = {\n\tstate: typeof initialState;\n\tgetItems(): any[];\n\taddItem(values: FormValues): void;\n\taddItems(items: FormValues[]): void;\n\tremoveItem(id: number | string): void;\n\tresetItems(items?: FormValues[]): void;\n\tform: FormType;\n};\n\nconst ActionsContext = createContext<ActionType>({} as any);\nconst ItemsManagerServiceContext = createContext<ItemManagerStoreContextType>(\n\t{} as any,\n);\n\nexport const useItemManagerActions = () =>\n\tuseContext<ReturnType<typeof actions>>(ActionsContext);\nexport const useItemManagerStore = () =>\n\tuseContext<ItemManagerStoreContextType>(ItemsManagerServiceContext);\n\nconst getNewItemValues = (formValues: FormValues, id: number | string) => {\n\tconst values: FormValues = {};\n\tObject.entries(formValues).forEach(([key, value]) => {\n\t\tvalues[`${key}[${id}]`] = value;\n\t});\n\treturn values;\n};\n\nconst getNewItemsValues = (\n\titems: FormValues[],\n\tids: Array<number | string>,\n) => {\n\treturn items\n\t\t.map((item, idx) => getNewItemValues(item, ids[idx]))\n\t\t.reduce((result, currentObject) => {\n\t\t\tfor (const key in currentObject) {\n\t\t\t\tif (currentObject.hasOwnProperty(key)) {\n\t\t\t\t\tresult[key] = currentObject[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}, {});\n};\n\nexport const ItemManagerServiceProvider = ({children}) => {\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\tconst dispatchActions = useMemo(() => actions(dispatch), [dispatch]);\n\n\tconst form = useForm(undefined, {\n\t\talwaysValidate: true,\n\t\tremoveValueOnUnregister: false,\n\t});\n\n\tconst addItem = useCallback(\n\t\t(values) => {\n\t\t\tconst id = dispatchActions.add();\n\t\t\tform.setValues((formValues) => ({\n\t\t\t\t...formValues,\n\t\t\t\t...getNewItemValues(values, id),\n\t\t\t}));\n\t\t},\n\t\t[dispatchActions.add, form.setValues],\n\t);\n\n\tconst addItems = useCallback(\n\t\t(items: FormValues[]) => {\n\t\t\tconst ids = items.map(() => nanoid());\n\t\t\tdispatchActions.addMultiple(ids);\n\t\t\tform.setValues((formValues) => ({\n\t\t\t\t...formValues,\n\t\t\t\t...getNewItemsValues(items, ids),\n\t\t\t}));\n\t\t},\n\t\t[addItem],\n\t);\n\n\tconst removeItem = useCallback((id: number | string) => {\n\t\tdispatchActions.remove(id);\n\t\tform.setValues((formValues) => {\n\t\t\tconst newValues = {...formValues};\n\t\t\tdelete newValues[`value[${id}]`];\n\t\t\treturn newValues;\n\t\t});\n\t}, []);\n\n\tconst resetItems = useCallback(\n\t\t(items: FormValues[] = []) => {\n\t\t\tconst ids = items.map(() => nanoid());\n\t\t\tdispatchActions.reset(ids);\n\t\t\tform.setValues((formValues) => ({\n\t\t\t\t...formValues,\n\t\t\t\t...getNewItemsValues(items, ids),\n\t\t\t}));\n\t\t},\n\t\t[dispatchActions.reset],\n\t);\n\n\tconst getItems = useCallback(() => {\n\t\tconst values: FormValues = {};\n\t\tconst orderedValues: FormValues[] = [];\n\n\t\t// First collect the values all under their respective uuid\n\t\tconst formValues = form.valuesRef.current;\n\t\tfor (const key in formValues) {\n\t\t\tconst pieces = key.match(/(.*)\\[(.*)\\]/);\n\t\t\tif (!pieces) continue;\n\n\t\t\tconst [, fieldName, uuid] = pieces;\n\t\t\tif (!values[uuid]) values[uuid] = {};\n\t\t\tvalues[uuid][fieldName] = formValues[key];\n\t\t}\n\n\t\t// Then put values, in order, into an array (without the uuid)\n\t\tconst {items} = state;\n\t\tfor (const key in values) {\n\t\t\tconst idx = items.indexOf(key);\n\t\t\tif (idx < 0) continue;\n\t\t\torderedValues[idx] = values[key];\n\t\t}\n\n\t\treturn orderedValues;\n\t}, [state.items]);\n\n\treturn (\n\t\t<ItemsManagerServiceContext.Provider\n\t\t\tvalue={{state, addItem, addItems, getItems, removeItem, resetItems, form}}\n\t\t>\n\t\t\t<ActionsContext.Provider value={dispatchActions}>\n\t\t\t\t{children}\n\t\t\t</ActionsContext.Provider>\n\t\t</ItemsManagerServiceContext.Provider>\n\t);\n};\n","import {ACTIONS} from '../constants';\nimport {nanoid} from 'nanoid';\n\nexport type Id = number | string;\nexport type Items = Array<Id>;\n\nexport type ReorderParams = {\n\tfromIndex: number;\n\ttoIndex: number;\n};\n\nexport type Action =\n\t| {type: typeof ACTIONS.ITEM_MANAGER_ADD; data?: Id}\n\t| {\n\t\t\ttype: typeof ACTIONS.ITEM_MANAGER_ADD_MULTIPLE;\n\t\t\tdata: Id[];\n\t }\n\t| {type: typeof ACTIONS.ITEM_MANAGER_REMOVE; data: Id}\n\t| {type: typeof ACTIONS.ITEM_MANAGER_REORDER; data: ReorderParams}\n\t| {type: typeof ACTIONS.ITEM_MANAGER_RESET; data?: Id[]}\n\t| {type: typeof ACTIONS.ITEM_MANAGER_SET_MAX_ITEMS; data: number};\n\nexport default function actions(dispatch: React.Dispatch<Action>) {\n\treturn {\n\t\t/**\n\t\t * Add item\n\t\t * @return Item ID\n\t\t */\n\t\tadd(id?: Id) {\n\t\t\tid = id != null ? id : nanoid();\n\t\t\tdispatch({type: ACTIONS.ITEM_MANAGER_ADD, data: id});\n\t\t\treturn id;\n\t\t},\n\t\t/**\n\t\t * Add multiple items\n\t\t * @return Item IDs\n\t\t */\n\t\taddMultiple(ids?: Id[], count = 0) {\n\t\t\tids =\n\t\t\t\tids != null ? ids : ([] as number[]).fill(count).map(() => nanoid());\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.ITEM_MANAGER_ADD_MULTIPLE,\n\t\t\t\tdata: ids,\n\t\t\t});\n\t\t\treturn ids;\n\t\t},\n\t\t/** Remove item */\n\t\tremove: (id: Id) => dispatch({type: ACTIONS.ITEM_MANAGER_REMOVE, data: id}),\n\t\t/** Reorder item */\n\t\treorder: (fromIndex: number, toIndex: number) =>\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.ITEM_MANAGER_REORDER,\n\t\t\t\tdata: {fromIndex, toIndex},\n\t\t\t}),\n\t\t/** Reset items */\n\t\treset: (items?: Id[]) =>\n\t\t\tdispatch({type: ACTIONS.ITEM_MANAGER_RESET, data: items}),\n\t\t/** Set max items */\n\t\tsetMaxItems: (maxItems: number) =>\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.ITEM_MANAGER_SET_MAX_ITEMS,\n\t\t\t\tdata: maxItems,\n\t\t\t}),\n\t};\n}\n\nexport type ActionType = ReturnType<typeof actions>;\n","import React, {useEffect, useCallback, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {SortableContainer} from 'react-sortable-hoc';\n\nimport {\n\tgetInputFormObject,\n\tFormValidationErrors,\n\tFormValues,\n\tFormActions,\n} from '@netx/core-components/Form';\n\nimport ScrollShadow from '../ScrollShadow';\n\nimport {useItemManagerStore, useItemManagerActions} from './ItemManagerService';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 0 auto',\n\t\t\tflexDirection: 'column',\n\t\t\tminHeight: 0,\n\t\t\tposition: 'relative',\n\t\t\twidth: '100%',\n\t\t\t'&.hasItems': {\n\t\t\t\tflex: '0 1 auto',\n\t\t\t},\n\t\t},\n\t\twrapper: {\n\t\t\tflex: '1 1 auto',\n\t\t\tminHeight: 0,\n\t\t\toverflow: 'auto',\n\t\t\t'&.hasItems': {\n\t\t\t\tmargin: theme.spacing(2, 0, 1, 0),\n\t\t\t},\n\t\t},\n\t\tdisabled: {\n\t\t\topacity: 0.5,\n\t\t\t...theme.mixins.disabled,\n\t\t},\n\t\tsorting: {\n\t\t\t'& *': {\n\t\t\t\t// pointerEvents: 'none',\n\t\t\t},\n\t\t},\n\t});\n\nconst getItemMatchRegExp = (id: number | string) => {\n\treturn new RegExp(`\\\\[${id}\\\\]`);\n};\n\n/** Get item errors from form error entries */\nconst getItemErrors = (errors: FormValidationErrors, id: number | string) => {\n\tconst itemErrors = {};\n\tconst regex = getItemMatchRegExp(id);\n\tfor (const key in errors) {\n\t\tif (!key.match(regex)) continue;\n\t\titemErrors[key.replace(regex, '')] = errors[key];\n\t}\n\treturn itemErrors;\n};\n\n/** Get item values from form value entries */\nconst getItemValues = (values: FormValues, id: number | string) => {\n\tconst itemValues = {};\n\tconst regex = getItemMatchRegExp(id);\n\tfor (const key in values) {\n\t\tif (!key.match(regex)) continue;\n\t\titemValues[key.replace(regex, '')] = values[key];\n\t}\n\treturn itemValues;\n};\n\nconst getItemActions = (actions: FormActions, id: number | string) => {\n\tconst itemActions = {};\n\tconst regex = getItemMatchRegExp(id);\n\tfor (const key in actions) {\n\t\tif (!key.match(regex)) continue;\n\t\titemActions[key.replace(regex, '')] = actions[key];\n\t}\n\treturn itemActions;\n};\n\nexport interface ItemManagerProps {\n\tclassName?: string;\n\tdisabled?: boolean;\n\tfallback?: React.ReactNode;\n\titems?: any[];\n\tloading?: boolean;\n\tonRemoveClick?: (id: number | string) => boolean | void;\n\tscrollNewItemsIntoView?: boolean;\n\tItemComponent: React.FunctionComponent<any> | React.ComponentType<any>;\n\tItemComponentProps?: any;\n}\n\nconst ItemManagerWrapper = SortableContainer(\n\tScrollShadow(\n\t\tReact.forwardRef((props, ref) => {\n\t\t\treturn <div {...props} ref={ref} />;\n\t\t}),\n\t),\n);\n\nconst ItemManager: React.FunctionComponent<\n\tWithStyles<typeof styles> & ItemManagerProps\n> = ({\n\tclassName,\n\tclasses,\n\tdisabled,\n\tfallback,\n\titems,\n\tloading,\n\tonRemoveClick,\n\tscrollNewItemsIntoView = true,\n\tItemComponent,\n\tItemComponentProps,\n}) => {\n\tconst {form, removeItem, resetItems, state} = useItemManagerStore();\n\tconst actions = useItemManagerActions();\n\tconst [isSorting, setIsSorting] = useState(-1);\n\n\tconst inputForm = getInputFormObject(form);\n\n\tuseEffect(() => {\n\t\tresetItems(items || []);\n\t}, [items]);\n\n\tuseEffect(() => {\n\t\tconst sorting = isSorting > -1;\n\t\tdocument.body.style.cursor = sorting ? 'grabbing' : '';\n\t\tdocument.body.style['-webkit-touch-callout'] = sorting ? 'none' : '';\n\t\tdocument.body.style['-webkit-user-select'] = sorting ? 'none' : '';\n\t\tdocument.body.style['user-select'] = sorting ? 'none' : '';\n\t}, [isSorting]);\n\n\tconst handleBeforeSortStart = useCallback(\n\t\t(sorting) => setIsSorting(sorting.index),\n\t\t[],\n\t);\n\n\tconst handleRemoveClick = useCallback(\n\t\t(id: number | string) => {\n\t\t\tif (onRemoveClick && onRemoveClick(id) === false) return;\n\t\t\tremoveItem(id);\n\t\t},\n\t\t[actions.remove],\n\t);\n\n\tconst handleSortEnd = useCallback(\n\t\t({oldIndex, newIndex}) => {\n\t\t\tsetIsSorting(-1);\n\t\t\tif (oldIndex === newIndex) return;\n\t\t\tactions.reorder(oldIndex, newIndex);\n\t\t},\n\t\t[actions.reorder],\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={clsx(classes.root, className, {\n\t\t\t\t[classes.disabled]: disabled,\n\t\t\t\t[classes.sorting]: isSorting > -1,\n\t\t\t\thasItems: !!state.items.length,\n\t\t\t})}\n\t\t>\n\t\t\t{loading ? <div></div> : null}\n\t\t\t{!loading && !!state.items.length ? (\n\t\t\t\t<ItemManagerWrapper\n\t\t\t\t\tlockToContainerEdges\n\t\t\t\t\tuseDragHandle\n\t\t\t\t\thelperClass=\"dragging-item\"\n\t\t\t\t\tlockAxis=\"y\"\n\t\t\t\t\tonSortEnd={handleSortEnd}\n\t\t\t\t\tscrollNewItemsIntoView={scrollNewItemsIntoView}\n\t\t\t\t\tupdateBeforeSortStart={handleBeforeSortStart}\n\t\t\t\t\tclassName={clsx(classes.wrapper, {\n\t\t\t\t\t\thasItems: !!state.items.length,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t{state.items.map((id, idx) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<ItemComponent\n\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t{...ItemComponentProps}\n\t\t\t\t\t\t\t\tsortable\n\t\t\t\t\t\t\t\tisSorting={isSorting === idx}\n\t\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\t\tindex={idx}\n\t\t\t\t\t\t\t\terrors={getItemErrors(form.errors, id)}\n\t\t\t\t\t\t\t\tvalues={getItemValues(form.values, id)}\n\t\t\t\t\t\t\t\tactions={getItemActions(form.actions, id)}\n\t\t\t\t\t\t\t\tform={inputForm}\n\t\t\t\t\t\t\t\tonRemoveClick={handleRemoveClick}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</ItemManagerWrapper>\n\t\t\t) : (\n\t\t\t\t(!loading && fallback) || null\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nexport default withStyles(styles)(React.memo(ItemManager));\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {faEquals as EqualsIcon} from '@fortawesome/pro-solid-svg-icons';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\n\nimport {SortableHandle} from 'react-sortable-hoc';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tcursor: 'grab',\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflex: '0 0 auto',\n\t\t\tmarginRight: 8,\n\t\t\twidth: 48,\n\t\t\theight: 48,\n\t\t\tpadding: 12,\n\t\t\tjustifyContent: 'center',\n\t\t\talignItems: 'center',\n\t\t\tverticalAlign: 'middle',\n\t\t},\n\t\tisSorting: {\n\t\t\tcursor: 'grabbing',\n\t\t},\n\t\tsortInProgress: {},\n\t});\n\nexport interface ItemManagerSortableHandle {\n\tisSorting?: boolean;\n}\n\nconst DragHandle: React.FunctionComponent<\n\tWithStyles<typeof styles> & ItemManagerSortableHandle\n> = ({classes, isSorting}) => {\n\treturn (\n\t\t<span\n\t\t\taria-label=\"sortable handle\"\n\t\t\tclassName={clsx(classes.root, {\n\t\t\t\tisSorting,\n\t\t\t})}\n\t\t\tdata-testid=\"sortable-handle\"\n\t\t>\n\t\t\t<FontAwesomeIcon icon={EqualsIcon} fixedWidth />\n\t\t</span>\n\t);\n};\n\nexport default SortableHandle(withStyles(styles)(React.memo(DragHandle)));\n","import React, {useCallback} from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {faTimes as TimesIcon} from '@fortawesome/pro-solid-svg-icons';\nimport {InputForm} from '@netx/core-components/Form';\nimport ActionButton from '@netx/core-components/ActionButton';\n\nimport {compareProps} from '../util';\n\nimport DragHandle from './ItemManagerSortableHandle';\n\nconst styles = ({palette, spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tWebkitUserSelect: 'none',\n\t\t\tWebkitTouchCallout: 'none',\n\t\t\tuserSelect: 'none',\n\t\t\t'&:not($dense)': {\n\t\t\t\tmargin: spacing(0.5, 0),\n\t\t\t\tpadding: spacing(1),\n\t\t\t},\n\t\t\t'&$dense': {\n\t\t\t\tpadding: spacing(0.5),\n\t\t\t},\n\t\t\t'&.dragging-item': {\n\t\t\t\tbackground: palette.custom.background.light,\n\t\t\t\topacity: 0.95,\n\t\t\t\tzIndex: 99999,\n\t\t\t\t'& button': {\n\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&:not(.sortable)': {\n\t\t\t\tposition: 'absolute',\n\t\t\t\tbottom: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\tmargin: 0,\n\t\t\t\ttransform: 'none !important',\n\t\t\t\tzIndex: 2,\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tmarginLeft: 8,\n\t\t},\n\t\tdense: {},\n\t});\n\ninterface ChildProps extends Record<string, any> {\n\tid: number | string;\n\terrors: any;\n\tform: InputForm;\n\tvalues: any;\n\tactions: any;\n}\n\nexport interface ItemManagerItemProps extends ChildProps {\n\tchildren(props: ChildProps): React.ReactNode | React.ReactNode[];\n\tdense?: boolean;\n\thideRemove?: boolean;\n\tonRemoveClick(id: number | string): void;\n\tsortable?: boolean;\n\tisSorting?: boolean;\n}\nconst ItemManagerItem: React.FunctionComponent<\n\tWithStyles<typeof styles> & ItemManagerItemProps\n> = ({\n\tchildren,\n\tdense,\n\tclasses,\n\thideRemove,\n\tisSorting,\n\tonRemoveClick,\n\tsortable,\n\t...props\n}) => {\n\tconst handleRemoveClick = useCallback(() => {\n\t\tonRemoveClick(props.id);\n\t}, [onRemoveClick, props.id]);\n\n\treturn (\n\t\t<div\n\t\t\taria-grabbed={isSorting}\n\t\t\tdata-testid=\"item-manager-item\"\n\t\t\tclassName={clsx(classes.root, {\n\t\t\t\tsortable,\n\t\t\t\t[classes.dense]: dense,\n\t\t\t})}\n\t\t>\n\t\t\t{!sortable ? null : <DragHandle isSorting={isSorting} />}\n\t\t\t{children(props)}\n\t\t\t{hideRemove !== true ? (\n\t\t\t\t<div className={classes.actions}>\n\t\t\t\t\t<ActionButton\n\t\t\t\t\t\tvariant=\"icon\"\n\t\t\t\t\t\ticon={TimesIcon}\n\t\t\t\t\t\tlabel={i18n.t('i18n.remove')}\n\t\t\t\t\t\tonClick={handleRemoveClick}\n\t\t\t\t\t\tComponentProps={{\n\t\t\t\t\t\t\t'data-testid': 'remove-item',\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t);\n};\n\nexport default withStyles(styles)(\n\tReact.memo(ItemManagerItem, compareProps([], 'item-manager-item')),\n);\n","import React from 'react';\n\nimport {SortableElement, SortableElementProps} from 'react-sortable-hoc';\n\nimport Item, {ItemManagerItemProps} from './ItemManagerItem';\n\nexport interface ItemManagerSortableItemProps\n\textends ItemManagerItemProps,\n\t\tSortableElementProps {}\n\nexport default SortableElement<ItemManagerSortableItemProps>((props) => (\n\t<Item {...props} sortable={true} />\n));\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface SearchFilterEndAdornmentClasses {\n\t/** styles applied to the root element */\n\troot: string;\n}\n\nexport const getSearchFilterEndAdornmentClassesUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('SearchFilterEndAdornment', slot);\n\nexport const searchFilterEndAdornmentClasses = generateUtilityClasses(\n\t'SearchFilterEndAdornment',\n\t['root'],\n);\nexport default searchFilterEndAdornmentClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\n\nimport {faTimes as TimesIcon} from '@fortawesome/pro-regular-svg-icons';\n\nimport IconButton, {IconButtonProps} from '@netx/core-components/IconButton';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\n\nimport {\n\tgetSearchFilterEndAdornmentClassesUtilityClass,\n\tSearchFilterEndAdornmentClasses,\n} from './searchFilterEndAdornmentClasses';\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetSearchFilterEndAdornmentClassesUtilityClass,\n\t\tclasses,\n\t);\n};\n\nexport const SearchFilterEndAdornmentRoot = styled(IconButton, {\n\tname: 'SearchFilter',\n\tslot: 'EndAdornment',\n})(({theme}) => ({\n\tposition: 'absolute',\n\tright: 8,\n}));\n\nexport interface SearchFilterEndAdornmentProps\n\textends Omit<IconButtonProps, 'classes' | 'icon'>,\n\t\tWithClasses<\n\t\t\tSearchFilterEndAdornmentClasses,\n\t\t\t{\n\t\t\t\t'data-testid'?: string;\n\t\t\t\thide?: boolean;\n\t\t\t}\n\t\t> {}\n\nexport const SearchFilterEndAdornmentPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\thide,\n\t...props\n}: SearchFilterEndAdornmentProps) => {\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t});\n\n\tif (hide) return null;\n\n\treturn (\n\t\t<SearchFilterEndAdornmentRoot\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tcolor=\"inherit\"\n\t\t\ticon={TimesIcon}\n\t\t\tlabel={i18n.t('i18n.clear')}\n\t\t\tsize=\"small\"\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nexport const SearchFilterEndAdornment = SearchFilterEndAdornmentPrimitive;\nexport default SearchFilterEndAdornment;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface SearchFilterStartAdornmentClasses {\n\t/** styles applied to the root element */\n\troot: string;\n}\n\nexport const getSearchFilterStartAdornmentClassesUtilityClass = (\n\tslot: string,\n) => generateUtilityClass('SearchFilterStartAdornment', slot);\n\nexport const searchFilterStartAdornmentClasses = generateUtilityClasses(\n\t'SearchFilterStartAdornment',\n\t['root'],\n);\nexport default searchFilterStartAdornmentClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {\n\tFontAwesomeIcon,\n\tFontAwesomeIconProps,\n} from '@fortawesome/react-fontawesome';\nimport {faSearch as SearchIcon} from '@fortawesome/pro-regular-svg-icons';\n\nimport {composeClasses, styled} from '@netx/core-components/Theme';\n\nimport searchFilterStartAdornmentClasses, {\n\tgetSearchFilterStartAdornmentClassesUtilityClass,\n\tSearchFilterStartAdornmentClasses,\n} from './searchFilterStartAdornmentClasses';\n\nconst useUtilityClasses = (ownerState: SearchFilterStartAdornmentProps) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetSearchFilterStartAdornmentClassesUtilityClass,\n\t\tclasses as typeof searchFilterStartAdornmentClasses,\n\t);\n};\n\nexport const SearchFilterStartAdornmentRoot = styled('div', {\n\tname: 'SearchFilter',\n\tslot: 'StartAdornment',\n})(({theme}) => ({\n\tmarginRight: theme.spacing(1),\n\tmarginTop: 1,\n\tpointerEvents: 'none',\n\ttransition: 'all 0.2s ease',\n}));\n\nexport interface SearchFilterStartAdornmentProps\n\textends React.DetailedHTMLProps<\n\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\tHTMLDivElement\n\t> {\n\tclasses?: Partial<SearchFilterStartAdornmentClasses>;\n\tclassName?: string;\n\t'data-testid'?: string;\n\tIconProps?: Partial<FontAwesomeIconProps>;\n}\n\nexport const SearchFilterStartAdornmentPrimitive = ({\n\tclassName,\n\tIconProps,\n\t...props\n}: SearchFilterStartAdornmentProps) => {\n\tconst classes = useUtilityClasses(props);\n\treturn (\n\t\t<SearchFilterStartAdornmentRoot\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<FontAwesomeIcon fixedWidth icon={SearchIcon} {...IconProps} />\n\t\t</SearchFilterStartAdornmentRoot>\n\t);\n};\n\nexport const SearchFilterStartAdornment = SearchFilterStartAdornmentPrimitive;\nexport default SearchFilterStartAdornment;\n","import React, {useCallback, useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\n\nimport {inputBaseClasses} from '@mui/material/InputBase';\nimport TextField, {TextFieldProps} from '@mui/material/TextField';\nimport useSharedRef from '@netx/core-components/hooks/useSharedRef';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\nimport {\n\tcomposeClasses,\n\tstyled,\n\tWithMuiPropOverrides,\n} from '@netx/core-components/Theme';\n\nimport {\n\tgetSearchFilterUtilityClass,\n\tsearchFilterClasses,\n\tSearchFilterClasses,\n\tSearchFilterEndAdornment,\n\tSearchFilterEndAdornmentProps,\n\tSearchFilterStartAdornment,\n\tSearchFilterStartAdornmentProps,\n\tsearchFilterStartAdornmentClasses,\n} from './';\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {classes, hideStartAdornment, variant} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\thideStartAdornment && 'hideStartAdornment',\n\t\t\tvariant === 'rounded' && 'rounded',\n\t\t],\n\t};\n\treturn composeClasses(slots, getSearchFilterUtilityClass, classes);\n};\n\nexport const SearchFilterRoot = styled(TextField, {\n\tname: 'SearchFilter',\n\tslot: 'Root',\n})(({theme, ownerState}) => {\n\tconst {hideStartAdornment} = ownerState;\n\treturn {\n\t\t[`& .${inputBaseClasses.input}`]: {\n\t\t\theight: 40,\n\t\t\tpadding: theme.spacing(0, 4, 0, hideStartAdornment ? 2 : 0),\n\t\t},\n\t\t[`& .${inputBaseClasses.root}`]: {\n\t\t\t[`&.${inputBaseClasses.disabled}`]: {\n\t\t\t\t[`& .${searchFilterStartAdornmentClasses.root}`]: {\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t[`&.${searchFilterClasses.rounded}`]: {\n\t\t\t[`& .${inputBaseClasses.root}`]: {\n\t\t\t\tborderRadius: 40,\n\t\t\t\t'&::after, &::before': {\n\t\t\t\t\tdisplay: 'none',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t};\n});\n\nexport type SearchFilterProps = Omit<\n\tWithMuiPropOverrides<TextFieldProps>,\n\t'hiddenLabel' | 'label' | 'onChange' | 'value' | 'variant'\n> & {\n\tclasses?: Partial<SearchFilterClasses>;\n\tclassName?: string;\n\tfilterStr?: string;\n\thideStartAdornment?: boolean;\n\tonFilter: (filterStr: string) => void;\n\tonFilteredChange?: (filtered: boolean) => void;\n\tSearchFilterEndAdornmentProps?: Partial<SearchFilterEndAdornmentProps>;\n\tSearchFilterStartAdornmentProps?: Partial<SearchFilterStartAdornmentProps>;\n\tvariant?: Required<TextFieldProps>['variant'] | 'rounded';\n};\n\nexport const SearchFilterPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tSearchFilterProps\n>((props: SearchFilterProps, ref) => {\n\tconst {\n\t\tclassName,\n\t\tdisabled,\n\t\tfilterStr = '',\n\t\tonFilter,\n\t\tonFilteredChange,\n\t\thideStartAdornment,\n\t\tinputRef,\n\t\tvariant,\n\t\tSearchFilterEndAdornmentProps,\n\t\tSearchFilterStartAdornmentProps,\n\t\t...sendProps\n\t} = props;\n\n\tconst [value, setValue] = useState(filterStr);\n\n\tconst ownerState = {...sendProps, variant, hideStartAdornment};\n\tconst classes = useUtilityClasses(ownerState);\n\tconst innerInputRef = useSharedRef(null, [inputRef]);\n\n\tuseEffect(() => {\n\t\tsetValue(filterStr);\n\t}, [filterStr]);\n\n\tuseWhenChangedEffect(\n\t\tvalue,\n\t\tuseCallback(\n\t\t\t(value) => {\n\t\t\t\tonFilteredChange?.(value != '');\n\t\t\t},\n\t\t\t[onFilteredChange],\n\t\t),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\tconst handleChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\t// TODO: now that we are on v5 this may no longer be neccesary\n\t\t\t// this was added to acoid false change events from initial render\n\t\t\tif (!event) return;\n\t\t\tconst {value} = event.target;\n\t\t\tsetValue(value);\n\t\t\tonFilter(value);\n\t\t},\n\t\t[onFilter],\n\t);\n\n\tconst handleClear = useCallback(() => {\n\t\tsetValue('');\n\t\tonFilter('');\n\t\tinnerInputRef.current?.focus();\n\t}, [onFilter]);\n\n\treturn (\n\t\t<SearchFilterRoot\n\t\t\tref={ref}\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tdisabled={disabled}\n\t\t\townerState={ownerState}\n\t\t\tplaceholder={i18n.t('i18n.filter')}\n\t\t\tonChange={handleChange}\n\t\t\tvalue={value}\n\t\t\tinputRef={innerInputRef}\n\t\t\tvariant={variant === 'rounded' ? 'filled' : variant || 'standard'}\n\t\t\t{...sendProps}\n\t\t\tInputProps={{\n\t\t\t\tendAdornment:\n\t\t\t\t\tvalue !== '' ? (\n\t\t\t\t\t\t<SearchFilterEndAdornment\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t\t\t//hide={value === ''}\n\t\t\t\t\t\t\t{...SearchFilterEndAdornmentProps}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : undefined,\n\t\t\t\tstartAdornment: !hideStartAdornment ? (\n\t\t\t\t\t<SearchFilterStartAdornment {...SearchFilterStartAdornmentProps} />\n\t\t\t\t) : undefined,\n\t\t\t\t...sendProps.InputProps,\n\t\t\t}}\n\t\t/>\n\t);\n});\n\nexport const SearchFilter = SearchFilterPrimitive;\nexport default SearchFilter;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface SearchFilterClasses {\n\t/** styles applied to the root element */\n\troot: string;\n\trounded: string;\n}\n\nexport const getSearchFilterUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('SearchFilter', slot);\n\nexport const searchFilterClasses = generateUtilityClasses('SearchFilter', [\n\t'root',\n\t'rounded',\n]);\nexport default searchFilterClasses;\n","import {useCallback, useState} from 'react';\n\nimport {attributes as attributesSingleton} from '@netx/core-asset/collections/singleton';\nimport {metadataDatasetLookup} from '../api';\nimport type {\n\tAttributeId,\n\tAttributeTemplate,\n\tAttributeFormValues,\n\tAttributesWorking,\n} from '../types';\nimport {getTemplatesEffectedByLookup, isMultiValue} from '../utils';\nimport useMetadataLookupsAllowed, {\n\tLookupsAllowed,\n} from './useMetadataLookupsAllowed';\n\nexport interface UseLookups {\n\tattributesWorking: AttributesWorking;\n\tlookupsAllowed: LookupsAllowed;\n\tlookup(\n\t\tattributeTemplate: AttributeTemplate,\n\t\tlookupValue: string,\n\t): Promise<void>;\n}\n\nexport const useMetadataLookups = (\n\tattributeIds: AttributeId[],\n\tdisableLookups = false,\n\tform,\n): UseLookups => {\n\tconst [attributesWorking, setAttributesWorking] = useState({});\n\tconst lookupsAllowed = useMetadataLookupsAllowed(\n\t\tattributeIds,\n\t\tdisableLookups,\n\t);\n\n\t/** handle attribute metadata lookup */\n\tconst lookup = useCallback(\n\t\tasync (\n\t\t\tattribute: AttributeTemplate,\n\t\t\tlookupValue: string,\n\t\t\tlimitToIds?: number[],\n\t\t) => {\n\t\t\tif (form == null || lookupValue == null || lookupValue === '') return;\n\n\t\t\t// Determine which attributes will be updated by lookup\n\t\t\tsetAttributesWorking(\n\t\t\t\tgetTemplatesEffectedByLookup(\n\t\t\t\t\tattribute,\n\t\t\t\t\tattributesSingleton.models.map((m) => m.attributes),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst lookupResults = await metadataDatasetLookup({\n\t\t\t\tname: attribute.name,\n\t\t\t\tvalue: lookupValue,\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetAttributesWorking({});\n\t\t\t}, 200);\n\n\t\t\t// For each result, update the attribute values if possible\n\t\t\tform.setValue(\n\t\t\t\tlookupResults.reduce<AttributeFormValues>((values, result) => {\n\t\t\t\t\t// ¯\\_(ツ)_/¯\n\t\t\t\t\tconst attributeTemplate = attributesSingleton.findWhere({\n\t\t\t\t\t\tname: result.label,\n\t\t\t\t\t})?.attributes;\n\t\t\t\t\tif (\n\t\t\t\t\t\t!attributeTemplate ||\n\t\t\t\t\t\tattributeTemplate.permission === 'r' ||\n\t\t\t\t\t\t(limitToIds && !limitToIds.includes(attributeTemplate.attributeid))\n\t\t\t\t\t)\n\t\t\t\t\t\treturn values;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...values,\n\t\t\t\t\t\t[attributeTemplate.attributeid]: isMultiValue(\n\t\t\t\t\t\t\tattributeTemplate.type,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\t? [result.value]\n\t\t\t\t\t\t\t: result.value,\n\t\t\t\t\t};\n\t\t\t\t}, {}),\n\t\t\t);\n\t\t},\n\t\t[],\n\t);\n\n\treturn {\n\t\tattributesWorking,\n\t\tlookupsAllowed,\n\t\tlookup,\n\t};\n};\n\nexport default useMetadataLookups;\n","export const SearchTypeFileFormat = 6 as const;\nexport type TSearchTypeFileFormat = typeof SearchTypeFileFormat;\n\n/** elementSubType1 */\nexport enum FileFormatType {\n\tONLY = 0,\n\tEXCLUDE = 1,\n}\n","export const SearchTypeFileSize = 7 as const;\nexport type TSearchTypeFileSize = typeof SearchTypeFileSize;\n\n/** elementSubType1 */\nexport enum FileSizeType {\n\tAPPROXIMATELY = 0,\n\tGREATER_THAN = 1,\n\tLESS_THAN = 2,\n\tEQUAL_TO = 3,\n}\n\n/** elementSubType2 */\nexport enum FileSizeMetric {\n\tBYTES = 0,\n\tKBYTES = 1,\n\tMBYTES = 2,\n\tGBYTES = 3,\n}\n","export const SearchTypeUser = 29 as const;\nexport type TSearchTypeUser = typeof SearchTypeUser;\n\n/** elementSubType1 */\nexport enum UserType {\n\tIMPORTED_BY = 0,\n\tMODIFIED_BY = 1,\n}\n","import {CUSTOM_THUMBNAIL_MINIMUM_USER_LEVEL} from './constants';\nimport {CUSTOM_THUMBNAIL_ACTION_LABELS} from './locales';\n\nimport type {Action} from '@netx/core/bootstrap';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {faImage} from '@fortawesome/pro-solid-svg-icons';\n\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaImage: icon(faImage, iconOpts).html,\n};\n\nexport const CUSTOM_THUMBNAIL_ACTION_ICON = <const>{\n\tSELECT: faImage,\n};\n\nexport type CustomThumbnailBaseEvent = typeof CUSTOM_THUMBNAIL_BASE_EVENT;\n\nexport const CUSTOM_THUMBNAIL_BASE_EVENT = `asset:custom:thumbnail`;\n\nexport const CUSTOM_THUMBNAIL_EVENT = <const>{\n\tSELECT: `${CUSTOM_THUMBNAIL_BASE_EVENT}:select`,\n};\n\nexport const CUSTOM_THUMBNAIL_ACTIONS: Action<\n\ttypeof CUSTOM_THUMBNAIL_EVENT[keyof typeof CUSTOM_THUMBNAIL_EVENT]\n>[] = [\n\t{\n\t\tevent: CUSTOM_THUMBNAIL_EVENT.SELECT,\n\t\ticon: icons.faImage,\n\t\tlabel: CUSTOM_THUMBNAIL_ACTION_LABELS.SELECT,\n\t\tuserLevel: CUSTOM_THUMBNAIL_MINIMUM_USER_LEVEL,\n\t},\n];\n\nexport default CUSTOM_THUMBNAIL_ACTIONS;\n","import {isMediaFileTypeAsset} from './isMediaFileTypeAsset';\n\nexport const assetHasAudio = (\n\tfileFormatFamily: string[],\n\tviewNames: string[],\n) => isMediaFileTypeAsset(fileFormatFamily) && viewNames.includes('previewMp3');\n\nexport default assetHasAudio;\n","import {isMediaFileTypeAsset} from './isMediaFileTypeAsset';\n\nexport const assetHasVideo = (\n\tfileFormatFamily: string[],\n\tviewNames: string[],\n) =>\n\tisMediaFileTypeAsset(fileFormatFamily) && viewNames.includes('previewH264');\n\nexport default assetHasVideo;\n","import {faClipboardList} from '@fortawesome/pro-solid-svg-icons';\n\nexport const ASSET_PROJECT_ACTION_ICON = <const>{\n\tPROJECT: faClipboardList,\n\tADD_TO_PROJECT: faClipboardList,\n\tCREATE_PROJECT: faClipboardList,\n};\n\nexport type AssetProjectBaseVent = typeof ASSET_PROJECT_BASE_EVENT;\n\nexport const ASSET_PROJECT_BASE_EVENT = `asset:project`;\n\nexport const ASSET_PROJECT_EVENT = <const>{\n\tPROJECT: `${ASSET_PROJECT_BASE_EVENT}`,\n\tADD_TO_PROJECT: `${ASSET_PROJECT_BASE_EVENT}:add`,\n\tCREATE_PROJECT: `${ASSET_PROJECT_BASE_EVENT}:new`,\n};\n","/**\n * Sorting plugin for the grid\n * @class\n */\nconst Sort = function (grid) {\n\tconst dataModel = grid.behavior.dataModel;\n\n\tthis.grid = grid;\n\tthis.data = dataModel.dataSource.data;\n\n\t// Listen for column sort request\n\tgrid.addEventListener('fin-column-sort', _.bind(this.toggleSort, this));\n\tgrid.addEventListener('fin-cell-enter', _.bind(this.cellEnter, this));\n\tgrid.addEventListener('fin-cell-exit', _.bind(this.cellExit, this));\n\n\t// Cannot trust this event\n\t// grid.addEventListener('fin-canvas-mouseout', _.bind( this.canvasMouseOut, this ) );\n\tgrid.div.addEventListener(\n\t\t'mouseleave',\n\t\t(this.onmouseleave = _.bind(this.canvasMouseOut, this)),\n\t);\n\n\t// Build a in-memory sorting Index\n\tthis.index = dataModel.sortIndex = new Array(this.data.length);\n\tthis.unsort();\n\n\t// Custom methods\n\tdataModel.getRowIndex = _.bind(this.getRowIndex, this);\n\tdataModel.getValueByField = _.bind(this.getValueByField, this);\n\n\t// Backup methods before overriding\n\tthis.oldGetValue = dataModel.getValue;\n\tthis.oldSaveValue = dataModel.setValue;\n\n\t// Override methods\n\tconst self = this;\n\tdataModel.getValue = function (x, y) {\n\t\tconst row = self.data[self.index[y]];\n\t\tif (!row) return null;\n\t\treturn row[this.dataSource.schema[x].name];\n\t};\n\tdataModel.setValue = function (x, y, value) {\n\t\tthis.getRow(self.index[y])[this.schema[x].name] = value;\n\t};\n};\n\nSort.prototype = {\n\t$$CLASS_NAME: 'sort',\n\tconstructor: Sort,\n\n\t/** @type {number} */\n\tcolumnIndex: null,\n\n\t/** @type {number} */\n\tcolumnHoverIndex: null,\n\n\t/**\n\t * @method\n\t * @param {mixed} a Value a\n\t * @param {mixed} b Value b\n\t */\n\tascendingComparator: function (a, b) {\n\t\tconsole.log('a', a, 'b', b);\n\t\tif (b === null) b = '';\n\t\tif (a === null) a = '';\n\t\tif (Array.isArray(a)) {\n\t\t\ta = a.join().toLowerCase();\n\t\t} else if (typeof a === 'string') {\n\t\t\ta = a.toLowerCase();\n\t\t}\n\t\tif (Array.isArray(b)) {\n\t\t\tb = b.join().toLowerCase();\n\t\t} else if (typeof b === 'string') {\n\t\t\tb = b.toLowerCase();\n\t\t}\n\n\t\tif (b === void 0 || a > b) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (a === void 0 || a < b) {\n\t\t\treturn -1;\n\t\t}\n\t\t// a must be equal to b\n\t\treturn 0;\n\t},\n\n\t/**\n\t * @method\n\t * @param {event} event `fin-canvas-mouseout` event\n\t */\n\tcanvasMouseOut(event) {\n\t\tconst grid = this.grid;\n\t\tconst behavior = grid.behavior;\n\n\t\tlet column, colProps;\n\n\t\tconst lastHover =\n\t\t\tthis.columnHoverIndex != null\n\t\t\t\t? this.columnHoverIndex\n\t\t\t\t: this.lastColumnHoverIndex;\n\n\t\tif (this.columnIndex === lastHover) {\n\t\t\tcolumn = behavior.getColumn(this.columnIndex);\n\t\t\tcolProps = column && column.properties;\n\n\t\t\tif (!colProps || colProps.sortable === false) return;\n\n\t\t\tcolProps.columnRightIcon =\n\t\t\t\tthis.order === 'asc' ? 'up-rectangle' : 'down-rectangle';\n\t\t} else {\n\t\t\tcolumn = behavior.getColumn(lastHover);\n\t\t\tcolProps = column && column.properties;\n\n\t\t\tif (!colProps || colProps.sortable === false) return;\n\n\t\t\tcolProps.columnRightIcon = '';\n\t\t}\n\t\tthis.columnHoverIndex = null;\n\t\tthis.grid.repaint();\n\t},\n\n\t/**\n\t * @method\n\t * @param {event} event `fin-cell-enter` event\n\t */\n\tcellEnter(event) {\n\t\tconst grid = this.grid;\n\t\tconst point = event.detail.dataCell;\n\n\t\t// If a header cell\n\t\tif (event.detail.isHeaderCell) {\n\t\t\tlet colProps = grid.behavior.getColumn(point.x).properties;\n\n\t\t\tif (!colProps || colProps.sortable === false) return;\n\n\t\t\tif (point.x === this.columnIndex) {\n\t\t\t\tif (this.order === 'desc') {\n\t\t\t\t\tcolProps.columnRightIcon = 'up-rectangle';\n\t\t\t\t} else if (this.order !== 'asc') {\n\t\t\t\t\tcolProps.columnRightIcon = 'down-rectangle';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcolProps.columnRightIcon = 'down-rectangle';\n\t\t\t}\n\t\t\tthis.lastColumnHoverIndex = this.columnHoverIndex = point.x;\n\t\t}\n\t},\n\n\t/**\n\t * @method\n\t * @param {event} event `fin-cell-exit` event\n\t */\n\tcellExit(event) {\n\t\tconst grid = this.grid;\n\t\tconst behavior = grid.behavior;\n\n\t\tif (this.columnHoverIndex !== null) {\n\t\t\tlet colProps;\n\n\t\t\tif (this.columnIndex === this.columnHoverIndex) {\n\t\t\t\tcolProps = behavior.getColumn(this.columnIndex).properties;\n\n\t\t\t\tif (!colProps || colProps.sortable === false) return;\n\n\t\t\t\tcolProps.columnRightIcon =\n\t\t\t\t\tthis.order === 'asc' ? 'up-rectangle' : 'down-rectangle';\n\t\t\t} else {\n\t\t\t\tcolProps = behavior.getColumn(this.columnHoverIndex).properties;\n\n\t\t\t\tif (!colProps || colProps.sortable === false) return;\n\n\t\t\t\tcolProps.columnRightIcon = '';\n\t\t\t}\n\t\t\tthis.columnHoverIndex = null;\n\t\t}\n\t},\n\n\t/**\n\t * @method\n\t * @param {mixed} a Value a\n\t * @param {mixed} b Value b\n\t */\n\tdescendingComparator(a, b) {\n\t\tconsole.log('a', a, 'b', b);\n\t\tif (b === null) b = '';\n\t\tif (a === null) a = '';\n\t\tif (Array.isArray(a)) {\n\t\t\ta = a.join().toLowerCase();\n\t\t} else if (typeof a === 'string') {\n\t\t\ta = a.toLowerCase();\n\t\t}\n\t\tif (Array.isArray(b)) {\n\t\t\tb = b.join().toLowerCase();\n\t\t} else if (typeof b === 'string') {\n\t\t\tb = b.toLowerCase();\n\t\t}\n\t\tif (a === void 0 || a < b) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (b === void 0 || a > b) {\n\t\t\treturn -1;\n\t\t}\n\t\t// a must be equal to b\n\t\treturn 0;\n\t},\n\n\t/**\n\t * @method\n\t * @param {string} field Field name\n\t * @param {mixed} value Value\n\t * @return {number} Row index\n\t */\n\tgetRowIndex(field, value) {\n\t\tfor (let i = 0, data = this.data, c = data.length; i < c; i++) {\n\t\t\tif (data[i][field] === value) {\n\t\t\t\treturn this.index.indexOf(i);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * @method\n\t * @param {number} y Row index\n\t * @param {string} field Field name\n\t * @return {mixed} Value\n\t */\n\tgetValueByField(y, field) {\n\t\tconst row = this.data[this.index[y]];\n\t\tif (!row) return null;\n\t\treturn row[field];\n\t},\n\n\t/**\n\t * @method\n\t * @param {number} column Column index\n\t * @param {string} order Order (\"asc\"/\"desc\")\n\t */\n\tsetSort(column, order) {\n\t\tif (\n\t\t\tcolumn == null ||\n\t\t\torder == null ||\n\t\t\t(this.columnIndex === column && this.order === order)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst grid = this.grid;\n\t\tconst behavior = grid.behavior;\n\n\t\t// Remove any privious icon\n\t\tif (this.columnIndex !== null) {\n\t\t\tbehavior.getColumn(this.columnIndex).properties.columnRightIcon = '';\n\t\t}\n\n\t\tlet colProps = behavior.getColumn(column).properties;\n\t\tif (!colProps || colProps.sortable === false) return;\n\n\t\t// Set new icon\n\t\tcolProps.columnRightIcon =\n\t\t\torder === 'desc' ? 'down-rectangle' : 'up-rectangle';\n\n\t\t// Store\n\t\tthis.columnIndex = column;\n\t\tthis.order = order;\n\n\t\tthis.sort();\n\t},\n\n\t/**\n\t * @method\n\t * @param {object} opts Options\n\t */\n\tsort(opts) {\n\t\tif (this.order == null || this.columnIndex == null) {\n\t\t\treturn;\n\t\t}\n\n\t\topts = opts || {};\n\n\t\tconst data = this.data;\n\t\tconst grid = this.grid;\n\t\tconst behavior = grid.behavior;\n\t\tconst order = this.order;\n\n\t\t// Just easier this way\n\t\tgrid.clearSelections();\n\t\tgrid.selectionChanged();\n\n\t\t// Sort the index\n\t\tconst field = behavior.getColumn(this.columnIndex).properties.name;\n\t\tconst self = this;\n\t\tlet i, j;\n\n\t\tthis.index.sort(function (a, b) {\n\t\t\ti = data[a][field];\n\t\t\tj = data[b][field];\n\t\t\treturn order === 'desc'\n\t\t\t\t? self.descendingComparator(i, j)\n\t\t\t\t: self.ascendingComparator(i, j);\n\t\t});\n\n\t\tif (!opts.silent) {\n\t\t\tbehavior.changed();\n\t\t}\n\t\tgrid.repaint();\n\t},\n\n\t/**\n\t * @method\n\t * @param {event} event `fin-column-sort` event\n\t */\n\ttoggleSort(event) {\n\t\tconst grid = this.grid;\n\t\tlet x;\n\n\t\tif ((x = event != null ? event.detail.column : this.columnIndex) == null)\n\t\t\treturn;\n\n\t\t// If it is the same column already being sorted on and we have already sorted to descending - reset\n\t\tif (this.columnIndex === x && this.order === 'asc') {\n\t\t\t// TODO: Their code does not take column headers into account as cells - even though this was in their example\n\t\t\t// this will cause the icon to be on the first cell just under the column cell\n\t\t\t// The only thing differntiating them in events is `isHeaderCell` the first row and the header row both claim to be y 0\n\t\t\t// grid.behavior.setCellProperty( x, 0, 'rightIcon', '');\n\t\t\t// grid.behavior.getColumn( this.columnIndex ).properties.backgroundColor = \"white\";\n\t\t\tthis.unsort();\n\t\t\tgrid.behavior.changed();\n\t\t\tgrid.repaint();\n\t\t}\n\t\t// Either a new column sort or a new direction on the currently sorted column\n\t\telse {\n\t\t\tthis.setSort(x, !this.order || this.columnIndex !== x ? 'desc' : 'asc');\n\t\t}\n\t},\n\n\t/**\n\t * Destroy\n\t * @method\n\t * @param {Hypergrid} grid Grid\n\t */\n\tuninstall(grid) {\n\t\tconst dataModel = grid.behavior.dataModel;\n\n\t\t// Put data back\n\t\tthis.unsort();\n\n\t\t// Clean up listeners\n\t\tgrid.removeEventListener('fin-column-sort', this.toggleSort);\n\t\tgrid.removeEventListener('fin-cell-exit', this.cellExit);\n\t\tgrid.removeEventListener('fin-cell-enter', this.cellEnter);\n\t\t// Cannot trust this event\n\t\t// grid.removeEventListener('fin-canvas-mouseout', this.canvasMouseOut );\n\t\tgrid.div.removeEventListener('mouseleave', this.onmouseleave);\n\n\t\t// Restore overriden methods\n\t\tdataModel.getValue = this.oldGetValue;\n\t\tdataModel.setValue = this.oldSaveValue;\n\n\t\t// Delete custom methods\n\t\tdelete dataModel.getValueByField;\n\t\tdelete dataModel.getRowIndex;\n\t},\n\n\t/**\n\t * @method\n\t * @param {object} opts Options\n\t */\n\tunsort(opts) {\n\t\topts = opts || {};\n\n\t\tconst grid = this.grid;\n\t\tconst behavior = grid.behavior;\n\t\tconst index = this.index;\n\t\tlet i, c;\n\n\t\tif (this.order != null && this.columnIndex != null) {\n\t\t\t// Just easier this way\n\t\t\tgrid.clearSelections();\n\t\t\tgrid.selectionChanged();\n\n\t\t\t// Unset icon\n\t\t\tbehavior.getColumn(this.columnIndex).properties.columnRightIcon = '';\n\n\t\t\tthis.columnIndex = null;\n\t\t\tthis.order = null;\n\t\t}\n\n\t\t// Unsort the index\n\t\tfor (i = 0, c = index.length; i < c; i++) {\n\t\t\tindex[i] = i;\n\t\t}\n\n\t\tif (!opts.silent) {\n\t\t\tbehavior.changed();\n\t\t\tgrid.repaint();\n\t\t}\n\t},\n\n\t/**\n\t * @method\n\t */\n\tupdateData() {\n\t\tconst grid = this.grid;\n\t\tconst dataModel = grid.behavior.dataModel;\n\n\t\t// Backup\n\t\tconst columnIndex = this.columnIndex;\n\t\tconst order = this.order;\n\n\t\tthis.data = dataModel.dataSource.data;\n\t\tthis.index = dataModel.sortIndex = new Array(this.data.length);\n\n\t\t// Unsort silently as we will be repainting once we re-apply the sort\n\t\tthis.unsort({silent: true});\n\n\t\t// Reapply sort\n\t\tthis.setSort(columnIndex, order);\n\t},\n};\n\nexport default Sort;\n","export * from './cart';\nexport * from './savedCart';\n","import {MINIMUM_USER_LEVEL} from './constants';\nimport {ASSET_EXPIRATION_ACTION_LABELS} from './locales';\n\nimport type {Action} from '@netx/core/bootstrap';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {\n\tfaCalendarPlus,\n\tfaCalendarMinus,\n} from '@fortawesome/pro-solid-svg-icons';\n\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaCalendarMinus: icon(faCalendarMinus, iconOpts).html,\n\tfaCalendarPlus: icon(faCalendarPlus, iconOpts).html,\n};\n\nexport const ASSET_EXPIRATION_ACTION_ICON = <const>{\n\tEXPIRE: faCalendarPlus,\n\tUNEXPIRE: faCalendarMinus,\n};\n\nexport const ASSET_EXPIRATION_ROUTES = <const>{};\n\nexport type BaseVent = typeof BASE_EVENT;\n\nexport const BASE_EVENT = `asset:expiration`;\n\nexport const ASSET_EXPIRATION_EVENT = <const>{\n\tEXPIRE: `${BASE_EVENT}:expire`,\n\tUNEXPIRE: `${BASE_EVENT}:unexpire`,\n};\n\nexport const ACTIONS: Action<\n\ttypeof ASSET_EXPIRATION_EVENT[keyof typeof ASSET_EXPIRATION_EVENT]\n>[] = [\n\t{\n\t\tevent: ASSET_EXPIRATION_EVENT.EXPIRE,\n\t\ticon: icons.faCalendarPlus,\n\t\tlabel: ASSET_EXPIRATION_ACTION_LABELS.EXPIRE,\n\t\tuserLevel: MINIMUM_USER_LEVEL,\n\t},\n\t{\n\t\tevent: ASSET_EXPIRATION_EVENT.UNEXPIRE,\n\t\ticon: icons.faCalendarMinus,\n\t\tlabel: ASSET_EXPIRATION_ACTION_LABELS.UNEXPIRE,\n\t\tuserLevel: MINIMUM_USER_LEVEL,\n\t},\n];\n\nexport default ACTIONS;\n","import {faTrashAlt} from '@fortawesome/pro-solid-svg-icons';\n\nexport const ASSET_DELETE_ACTION_ICON = <const>{\n\tDELETE: faTrashAlt,\n};\n\nexport type AssetDeleteBaseEvent = typeof ASSET_DELETE_BASE_EVENT;\n\nexport const ASSET_DELETE_BASE_EVENT = `asset:delete`;\n\nexport const ASSET_DELETE_EVENT = <const>{\n\tDELETE: `${ASSET_DELETE_BASE_EVENT}`,\n\tERROR: `${ASSET_DELETE_BASE_EVENT}:error`,\n\tSUCCESS: `${ASSET_DELETE_BASE_EVENT}:success`,\n};\n","import {i18n} from '@netx/core/i18n';\n\nexport const ASSET_DELETE_CONFIRMATIONS = {\n\tDELETE: i18n.t('i18n.deleteAssetMessage'),\n};\n\nexport const ASSET_DELETE_ACTION_LABELS = {\n\tDELETE: i18n.t('i18n.deleteAsset'),\n};\n","import {ASSET_RESYNC_ACTION_LABELS} from './locales';\nimport {canResyncAsset} from './enablers';\nimport {getViewCollection, getViewModel} from '@netx/core/lib/utils';\n\nimport type {Action} from '@netx/core/bootstrap';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {faRedoAlt} from '@fortawesome/pro-solid-svg-icons';\n\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaRedoAlt: icon(faRedoAlt, iconOpts).html,\n};\n\nexport const ASSET_RESYNC_ACTION_ICON = <const>{\n\tRESYNC: faRedoAlt,\n};\n\nexport type CartAssetBaseVent = typeof ASSET_RESYNC_BASE_EVENT;\n\nexport const ASSET_RESYNC_BASE_EVENT = `asset:resync`;\n\nexport const ASSET_RESYNC_EVENT = <const>{\n\tRESYNC: `${ASSET_RESYNC_BASE_EVENT}`,\n};\n\nexport const ASSET_RESYNC_ACTIONS: Action<\n\ttypeof ASSET_RESYNC_EVENT[keyof typeof ASSET_RESYNC_EVENT]\n>[] = [\n\t{\n\t\tevent: ASSET_RESYNC_EVENT.RESYNC,\n\t\tenableTest: canResyncAsset,\n\t\ticon: icons.faRedoAlt,\n\t\tlabel: ASSET_RESYNC_ACTION_LABELS.RESYNC,\n\t\ttestOnSync: true,\n\t},\n];\n\nexport default ASSET_RESYNC_ACTIONS;\n","import {faSearch} from '@fortawesome/pro-solid-svg-icons';\n\nexport const SEARCH_VISUAL_ACTION_ICON = <const>{\n\tASSET: faSearch,\n\tCOLOR: faSearch,\n};\n\nexport type SearchVisualBaseEvent = typeof SEARCH_VISUAL_BASE_EVENT;\n\nexport const SEARCH_VISUAL_BASE_EVENT = `search:visual`;\n\nexport const SEARCH_VISUAL_EVENT = <const>{\n\tASSET: `${SEARCH_VISUAL_BASE_EVENT}:asset`,\n\tCOLOR: `${SEARCH_VISUAL_BASE_EVENT}:color`,\n};\n","import type {CategoryId} from '@netx/core-category/types';\nimport {CategoryType} from './constants';\nimport {categoryIdRuleDefaults} from './defaults';\nimport {CategoryIdRule} from './types';\n\ntype CategoryIdRuleParams<T extends CategoryType = CategoryType> = {\n\tid: CategoryId;\n\ttype?: T;\n};\n\nexport const createCategoryIdRule = ({\n\tid,\n\ttype,\n}: CategoryIdRuleParams): CategoryIdRule => ({\n\t...categoryIdRuleDefaults,\n\telementSubType1: type != null ? type : categoryIdRuleDefaults.elementSubType1,\n\telementValue1: id,\n});\n\nexport default createCategoryIdRule;\n","import {getPreference} from '@netx/core-user/utils/getPreference';\nimport {SearchTypeKeyword, KeywordType} from './constants';\nimport {keywordRuleDefaults} from './defaults';\nimport {KeywordRule} from './types';\n\ntype KeywordRuleParams<T extends KeywordType = KeywordType> = {\n\tincludeContents?: boolean;\n\tkeyword: string;\n\ttype?: T;\n};\n\nexport const createKeywordRule = <\n\tT extends KeywordType = typeof keywordRuleDefaults.elementSubType1,\n>({\n\tincludeContents,\n\tkeyword,\n\ttype,\n}: KeywordRuleParams<T>): KeywordRule => ({\n\t...keywordRuleDefaults,\n\telementType: SearchTypeKeyword,\n\telementSubType1: type != null ? type : keywordRuleDefaults.elementSubType1,\n\telementValue1: keyword,\n\telementValue2:\n\t\tincludeContents ||\n\t\t(includeContents !== false &&\n\t\t\tgetPreference('search.keywordIncludeContents', true))\n\t\t\t? 'true'\n\t\t\t: '',\n});\n\nexport default createKeywordRule;\n","import {action, computed, observable, makeObservable, runInAction} from 'mobx';\nimport _ from 'underscore';\nimport {assetAttributes} from '@netx/core-asset/collections/singleton/attributes';\nimport {AttributeTemplate} from '../types';\n\n// TODO: everything that is in the attributes hook should be moved here and that will use this\nexport class AttributesStore {\n\tattributes = observable.array<AttributeTemplate>(\n\t\tassetAttributes.models.map((m) => ({...m.attributes})),\n\t);\n\n\tprivate _updateFromGlobal: () => void;\n\n\tconstructor() {\n\t\tmakeObservable(\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tattributes: observable,\n\t\t\t\tsystemAttributes: computed,\n\t\t\t\tupdateFromGlobal: action,\n\t\t\t\tuserAttributes: computed,\n\t\t\t},\n\t\t\t{\n\t\t\t\tdeep: true,\n\t\t\t},\n\t\t);\n\n\t\tthis._updateFromGlobal = _.debounce(() => {\n\t\t\trunInAction(() => {\n\t\t\t\tthis.updateFromGlobal();\n\t\t\t});\n\t\t}, 50);\n\n\t\tassetAttributes.on('add remove change reset sync', this._updateFromGlobal);\n\t}\n\n\tget systemAttributes() {\n\t\treturn this.attributes.filter((attr) => attr.system);\n\t}\n\n\tget userAttributes() {\n\t\treturn this.attributes.filter((attr) => !attr.system);\n\t}\n\n\tgetAttributeById(id: number) {\n\t\treturn this.attributes.find((attr) => attr.attributeid === id);\n\t}\n\n\tgetAttributeByName(name: string) {\n\t\treturn this.attributes.find((attr) => attr.name === name);\n\t}\n\n\tgetAttributesByIds(\n\t\tids: number[],\n\t\topts?: {\n\t\t\tomitReadOnly?: boolean;\n\t\t\tomitSystem?: boolean;\n\t\t\tobjectType?: 'asset' | 'clip';\n\t\t},\n\t) {\n\t\tconst {omitSystem, objectType, omitReadOnly} = opts || {};\n\n\t\treturn ids\n\t\t\t.map((id) => this.getAttributeById(id))\n\t\t\t.filter((attr) => {\n\t\t\t\treturn (\n\t\t\t\t\tattr != null &&\n\t\t\t\t\t(!attr.system || !omitSystem) &&\n\t\t\t\t\t(attr.permission != 'r' || !omitReadOnly) &&\n\t\t\t\t\t(!objectType || attr.objectTypes.includes(objectType))\n\t\t\t\t);\n\t\t\t}) as AttributeTemplate[];\n\t}\n\n\tupdateFromGlobal() {\n\t\ttry {\n\t\t\tthis.attributes.replace(\n\t\t\t\tassetAttributes.models.map((m) => ({...m.attributes})),\n\t\t\t);\n\t\t} catch (ex) {}\n\t}\n\n\tdispose() {\n\t\tassetAttributes.off('add remove change reset', this._updateFromGlobal);\n\t}\n}\n\nexport const attributesStore = new AttributesStore();\n\nexport default attributesStore;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport moment from '@netx/core/lib/netx-moment';\n\nimport {styled} from '@netx/core-components/Theme';\n\nimport {\n\tgetInputFormObject,\n\tFormType,\n\tInputForm,\n\tDateField,\n} from '@netx/core-components/Form';\n\nconst AssetExpirationFormRoot = styled('div', {\n\tname: 'AssetExpirationForm',\n\tslot: 'Root',\n})(({theme}) => ({}));\n\nconst validator = async (value: string): Promise<true | Error> => {\n\treturn true;\n};\n\nexport interface AssetExpirationFormProps {\n\tform: FormType;\n\tinputForm?: InputForm;\n}\n\nexport const AssetExpirationForm = ({\n\tform,\n\tinputForm,\n\t...props\n}: AssetExpirationFormProps) => {\n\tif (!inputForm) inputForm = getInputFormObject(form);\n\n\treturn (\n\t\t<AssetExpirationFormRoot>\n\t\t\t<DateField\n\t\t\t\tlabel={i18n.t('i18n.expirationDate')}\n\t\t\t\tname=\"expirationDate\"\n\t\t\t\tid=\"expirationDate\"\n\t\t\t\tminDate={moment().local().add(1, 'days').format('YYYY-MM-DD')}\n\t\t\t\terror={form.errors.expirationDate}\n\t\t\t\trequired={true}\n\t\t\t\tvalue={form.values.expirationDate}\n\t\t\t\tform={inputForm}\n\t\t\t\tformFieldOptions={{\n\t\t\t\t\tvalidator,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</AssetExpirationFormRoot>\n\t);\n};\n\nexport default AssetExpirationForm;\n","import React, {useEffect} from 'react';\nimport FormDialog, {\n\tFormDialogProps,\n\tExtendFormDialogProps,\n} from '@netx/core-components/FormDialog';\nimport {AssetExpirationForm} from './AssetExpirationForm';\n\nimport {useForm, getInputFormObject} from '@netx/core-components/Form';\nimport type {Optional} from '@netx/core/typings';\nimport {faCalendar} from '@fortawesome/pro-solid-svg-icons';\nimport {\n\tASSET_EXPIRATION_SUBMIT_LABELS,\n\tASSET_EXPIRATION_TITLES,\n} from '../../locales';\n\ntype FormValues = {\n\texpirationDate: string | null;\n};\n\nexport type AssetExpirationProps = Omit<\n\tExtendFormDialogProps<true, FormValues>,\n\t'form'\n>;\n// export interface AssetExpirationProps\n// \textends Optional<Omit<FormDialogProps<true, FormValues>, 'form'>, 'title'> {}\n\nexport const AssetExpiration = ({\n\tDialogProps,\n\t...props\n}: AssetExpirationProps) => {\n\tconst form = useForm<FormValues>({\n\t\texpirationDate: null,\n\t});\n\tconst inputForm = getInputFormObject(form);\n\n\treturn (\n\t\t<FormDialog<true>\n\t\t\tconfirmLabel={ASSET_EXPIRATION_SUBMIT_LABELS.EXPIRE}\n\t\t\ttitle={ASSET_EXPIRATION_TITLES.EXPIRE}\n\t\t\tmaxWidth=\"xs\"\n\t\t\ticon={faCalendar}\n\t\t\t{...props}\n\t\t\t{...DialogProps}\n\t\t\tform={form}\n\t\t>\n\t\t\t<AssetExpirationForm form={form} inputForm={inputForm} />\n\t\t</FormDialog>\n\t);\n};\n\nexport default AssetExpiration;\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseImperativeHandle,\n\tuseMemo,\n} from 'react';\n\nimport NiceModal from '@ebay/nice-modal-react';\nimport {withNiceModal} from '@netx/core-components/Dialog/withNiceModal';\nimport {\n\tAssetExpiration,\n\tAssetExpirationProps,\n} from '../../components/AssetExpiration';\nimport {useAssetExpiration} from '../../hooks';\n\nconst AssetExpirationNiceModal = withNiceModal(AssetExpiration);\n\nexport type AssetExpirationContextType = ReturnType<\n\ttypeof useAssetExpiration\n> & {\n\texpire(id: number): void;\n};\n\nconst noop = (...args: any): any => {};\n\nexport const AssetExpirationContext = createContext<AssetExpirationContextType>(\n\t{\n\t\texpire: noop,\n\t\texpireWithDate: noop,\n\t\texpireWithMilliseconds: noop,\n\t\tunexpire: noop,\n\t\tsubscribe: noop,\n\t\tworking: false,\n\t},\n);\n\nexport const useAssetExpirationProvider = () =>\n\tuseContext(AssetExpirationContext);\n\nexport type AssetExpirationProviderRef =\n\t| React.RefObject<AssetExpirationContextType>\n\t| ((node: AssetExpirationContextType) => void);\n\nexport type AssetExpirationProviderChildrenProps = AssetExpirationContextType;\n\nexport type AssetExpirationProviderProps = {\n\tref?: AssetExpirationProviderRef;\n\tchildren:\n\t\t| React.ReactNode\n\t\t| ((props: AssetExpirationProviderChildrenProps) => React.ReactNode);\n};\n\nexport const AssetExpirationProviderPrimitive = React.forwardRef<\n\tAssetExpirationContextType,\n\tAssetExpirationProviderProps\n>(({children}, ref) => {\n\tconst assetExpiration = useAssetExpiration();\n\n\tconst expire = useCallback((id: number) => {\n\t\tconst props: AssetExpirationProps = {\n\t\t\tonSubmit: async (values) => {\n\t\t\t\tif (!values.expirationDate) throw new Error('No date provided');\n\t\t\t\tawait assetExpiration.expireWithDate(id, values.expirationDate);\n\t\t\t\tNiceModal.hide(AssetExpirationNiceModal);\n\t\t\t},\n\t\t};\n\t\tNiceModal.show(AssetExpirationNiceModal, props);\n\t}, []);\n\n\tconst contextValues = useMemo(\n\t\t() => ({\n\t\t\t...assetExpiration,\n\t\t\texpire,\n\t\t}),\n\t\t[assetExpiration, expire],\n\t);\n\n\tuseImperativeHandle(ref, () => contextValues, [contextValues]);\n\n\treturn (\n\t\t<AssetExpirationContext.Provider value={contextValues}>\n\t\t\t{typeof children === 'function' ? children(contextValues) : children}\n\t\t</AssetExpirationContext.Provider>\n\t);\n});\n\nexport const AssetExpirationProvider = React.memo(\n\tAssetExpirationProviderPrimitive,\n);\n\nexport default AssetExpirationProvider;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const ASSET_EXPIRATION_BADGE_CLASS_NAME = 'AssetExpirationBadge';\nexport const ASSET_EXPIRATION_BADGE_CLASS_SLOTS = ['root'] as const;\n\nexport type AssetExpirationBadgeClassSlot = typeof ASSET_EXPIRATION_BADGE_CLASS_SLOTS[number];\n\nexport interface AssetExpirationBadgeClasses {\n\troot: string;\n}\n\nexport type AssetExpirationBadgeClassKey = keyof AssetExpirationBadgeClasses;\n\nexport const getAssetExpirationBadgeUtilityClass = (\n\tslot: AssetExpirationBadgeClassSlot,\n) => generateUtilityClass(ASSET_EXPIRATION_BADGE_CLASS_NAME, slot);\n\nexport const assetExpirationBadgeClasses: AssetExpirationBadgeClasses = generateUtilityClasses(\n\tASSET_EXPIRATION_BADGE_CLASS_NAME,\n\t['root'],\n);\n\nexport default assetExpirationBadgeClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {faTimes} from '@fortawesome/pro-solid-svg-icons';\nimport {Typography} from '@mui/material';\nimport {assetExpirationToDateString} from '@netx/core-asset-expiration/utils';\nimport {IconButton} from '@netx/core-components/IconButton';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {useAssetExpirationProvider} from '../../contexts';\nimport {\n\tassetExpirationBadgeClasses,\n\tgetAssetExpirationBadgeUtilityClass,\n\tAssetExpirationBadgeClasses,\n\tASSET_EXPIRATION_BADGE_CLASS_NAME,\n} from './assetExpirationBadgeClasses';\n\nexport type AssetExpirationBadgeElement = HTMLDivElement;\nexport type AssetExpirationBadgeRef =\n\tReact.ForwardedRef<AssetExpirationBadgeElement>;\n\ntype AssetExpirationUtiltiyClassProps = WithClasses<\n\tAssetExpirationBadgeClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: AssetExpirationUtiltiyClassProps) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getAssetExpirationBadgeUtilityClass, classes);\n};\n\nconst AssetExpirationBadgeRoot = styled('div', {\n\tname: ASSET_EXPIRATION_BADGE_CLASS_NAME,\n\tslot: 'Root',\n})(({theme, ...props}) => ({\n\talignItems: 'center',\n\tdisplay: 'flex',\n\tbackground: theme.palette.error.main,\n\tcolor: theme.palette.error.contrastText,\n\tpadding: theme.spacing(0.5, 1),\n}));\n\nconst AssetExpirationBadgeText = styled(Typography, {\n\tname: ASSET_EXPIRATION_BADGE_CLASS_NAME,\n\tslot: 'Root',\n})(({theme, ...props}) => ({\n\tflex: '1 1 auto',\n\ttextAlign: 'center',\n}));\n\nconst AssetExpirationBadgeAction = styled(IconButton, {\n\tname: ASSET_EXPIRATION_BADGE_CLASS_NAME,\n\tslot: 'Action',\n})(({theme, ...props}) => ({\n\tflex: '0 0 auto',\n}));\n\nexport interface AssetExpirationBadgeProps\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<AssetExpirationBadgeElement>,\n\t\t\tAssetExpirationBadgeElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tAssetExpirationBadgeClasses,\n\t\t\t{\n\t\t\t\tassetId: number;\n\t\t\t\texpirationDate: number;\n\t\t\t}\n\t\t> {}\n\nconst AssetExpirationBadgeInner = (\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\t\texpirationDate,\n\t\tassetId,\n\t\t...props\n\t}: AssetExpirationBadgeProps,\n\tref?: AssetExpirationBadgeRef,\n) => {\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t});\n\n\tconst assetExpirationProvider = useAssetExpirationProvider();\n\n\tconst handleActionClick = (\n\t\tevent: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n\t) => {\n\t\tevent.stopPropagation();\n\t\tassetExpirationProvider.unexpire(assetId);\n\t};\n\n\treturn (\n\t\t<AssetExpirationBadgeRoot\n\t\t\tref={ref}\n\t\t\t{...props}\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t>\n\t\t\t<AssetExpirationBadgeText variant=\"caption\" noWrap>\n\t\t\t\t{`${i18n.t('i18n.expires')}: ${assetExpirationToDateString(\n\t\t\t\t\texpirationDate,\n\t\t\t\t)}`}\n\t\t\t</AssetExpirationBadgeText>\n\t\t\t<AssetExpirationBadgeAction\n\t\t\t\tcolor=\"inherit\"\n\t\t\t\ticon={faTimes}\n\t\t\t\tonClick={handleActionClick}\n\t\t\t\tsize=\"small\"\n\t\t\t\tedge=\"end\"\n\t\t\t/>\n\t\t</AssetExpirationBadgeRoot>\n\t);\n};\n\nexport const AssetExpirationBadgePrimitive = React.forwardRef(\n\tAssetExpirationBadgeInner,\n) as (\n\tprops: AssetExpirationBadgeProps,\n\tref?: AssetExpirationBadgeRef,\n) => JSX.Element;\n\nexport const AssetExpirationBadge = React.memo(\n\tAssetExpirationBadgePrimitive,\n) as (\n\tprops: AssetExpirationBadgeProps,\n\tref?: AssetExpirationBadgeRef,\n) => JSX.Element;\n\nexport default AssetExpirationBadge;\n","import {i18n} from '@netx/core/i18n';\n\nexport const date = (value?: any) => {\n\tif (value === '' || value == null) return true;\n\treturn value.search(/\\d\\d\\d\\d-\\d\\d-\\d\\d/) > -1\n\t\t? true\n\t\t: new Error(i18n.t('i18n.invalidDate'));\n};\n\nexport default date;\n","export const multi_select = (value: any) => true;\n\nexport default multi_select;\n","export const select = (value: any) => true;\n\nexport default select;\n","import multiSelect from './multi-select';\n\nexport const tag = (value: any) => multiSelect(value);\n\nexport default tag;\n","import tag from './tag';\n\nexport const semtantic = (value: any) => tag(value);\n\nexport default semtantic;\n","import tag from './tag';\n\nexport const tag_vocab = (value: any) => tag(value);\n\nexport default tag_vocab;\n","export const text = (value: any) => true;\n\nexport default text;\n","import text from './text';\n\nexport const textarea = (value: any) => text(value);\n\nexport default textarea;\n","export * from './date';\nexport * from './multi-select';\nexport * from './number';\nexport * from './select';\nexport * from './semantic';\nexport * from './tag';\nexport * from './tag-vocab';\nexport * from './text';\nexport * from './textarea';\n\nimport date from './date';\nimport multi_select from './multi-select';\nimport number from './number';\nimport select from './select';\nimport semantic from './semantic';\nimport tag from './tag';\nimport tag_vocab from './tag-vocab';\nimport text from './text';\nimport textarea from './textarea';\n\nimport {ATTRIBUTE_TYPE} from '../constants';\n\nexport const validators = {\n\t[ATTRIBUTE_TYPE.DATE]: date,\n\t[ATTRIBUTE_TYPE.MULTISELECT]: multi_select,\n\t[ATTRIBUTE_TYPE.NUMBER]: number,\n\t[ATTRIBUTE_TYPE.SELECT]: select,\n\t[ATTRIBUTE_TYPE.SEMANTIC]: semantic,\n\t[ATTRIBUTE_TYPE.TAG]: tag,\n\t[ATTRIBUTE_TYPE.TAG_VOCAB]: tag_vocab,\n\t[ATTRIBUTE_TYPE.TEXT]: text,\n\t[ATTRIBUTE_TYPE.TEXTAREA]: textarea,\n\t// [ATTRIBUTE_TYPE.HIERARCHICAL]: text,\n};\n\nexport default validators;\n","import type {MetadataType} from '../constants';\nimport {MetadataTypeLabel} from '../locales';\n\nexport const getMetadataTypeLabel = (type: MetadataType) =>\n\tMetadataTypeLabel[type];\n\nexport default getMetadataTypeLabel;\n","import {enumToValues} from '@netx/core/utils/enumToValues';\nimport {ATTRIBUTE_TYPE} from '@netx/core-attribute/constants';\nimport {attributesStore} from '@netx/core-attribute/store';\nimport {MetadataType} from '../constants';\n\nexport const getMetadataTypeOptions = (attributeName: string) => {\n\tconst attr = attributesStore.getAttributeByName(attributeName);\n\tconst options = enumToValues(MetadataType);\n\tif (!attr) return options;\n\n\tconst canRangeSearch = (\n\t\t[ATTRIBUTE_TYPE.DATE, ATTRIBUTE_TYPE.NUMBER] as number[]\n\t).includes(attr.type);\n\n\treturn canRangeSearch\n\t\t? options\n\t\t: options.filter((opt) => opt !== MetadataType.MATCH_ANY_RANGE);\n};\n\nexport default getMetadataTypeOptions;\n","export const metadataNameHackIn = (name: string) => {\n\t// assetId -> objectId ¯\\_(ツ)_/¯\n\tif (name === 'objectId') return 'assetId';\n\treturn name;\n};\n\nexport default metadataNameHackIn;\n","export const metadataNameHackOut = (name: string) => {\n\t// assetId -> objectId ¯\\_(ツ)_/¯\n\tif (name === 'assetId') return 'objectId';\n\treturn name;\n};\n\nexport default metadataNameHackOut;\n","import Netx from '@netx/core/bootstrap';\nimport type {Asset} from '@netx/core-asset/types';\nimport {isMobile} from '@netx/core/utils/isMobile';\n\nexport const assetProjectEnabled = () =>\n\tNetx.getPreference('review.enabled', true);\n\nexport const canManageAssetProject = (asset?: Asset) =>\n\t!isMobile() &&\n\tassetProjectEnabled() &&\n\tasset?.fileFormatFamily.includes('image') === true;\n","import {i18n} from '@netx/core/i18n';\n\nexport const ASSET_PROJECT_ACTION_LABELS = {\n\tPROJECT: i18n.t('i18n.review'),\n};\n","export enum CategorizeAssetsAction {\n\tADD = 'Add',\n\tMOVE = 'Move',\n\tREMOVE = 'Remove',\n}\n\nexport enum CategoryOrder {\n\t/** provided order */\n\tMANUAL = 0,\n\t/** normal */\n\tALPHABETICAL_ASC = 1,\n\t/** reversed */\n\tALPHABETICAL_DESC = 2,\n}\n\nexport enum CategoryPref {\n\tKEEP_ALPHABETICAL = 'category.keepListAlphabetical',\n}\n","export const TOKEN_ACCESS_TYPES = <const>{\n\tASSET: 'asset',\n\tASSET_SET: 'assetSet',\n\tCATEGORY: 'category',\n\tSAVED_CART: 'savedCart',\n\tSAVED_SEARCH: 'savedSearch',\n};\n\nexport const TOKEN_SECURITY_TYPES = <const>{\n\tNONE: 'none',\n\tPASSWORD: 'password',\n};\n\nexport const TOKEN_TYPES = <const>{\n\tDOWNLOAD: 'download',\n\tVIEW_ONLY: 'viewOnly',\n\t// we do not offer this (yet?)\n\t// EMBED: 'embed',\n};\n\nexport const TOKEN_DOWNLOAD_OPTION_TYPES = <const>{\n\tASSET_VIEW: 'assetView',\n\tCONTACT_SHEET: 'contactSheet',\n\tHISTORICAL: 'historical',\n\tMANUAL_REPURPOSE: 'manualRepurpose',\n\tMETADATA: 'metadata',\n\t// we do not offer this (yet?)\n\t// MATADATA_MAPPING: 'metadataMapping',\n\tORIGINAL: 'original',\n\tPRESET_PROCESS: 'presetProcess',\n\tPROXY: 'proxy',\n\t// we do not offer this (yet?)\n\t// TEMPLATE_CUSTOMIZATION: 'templateCustomization',\n};\n\nexport const TOKEN_ASSET_DOWNLOAD_OPTION_TYPES = [\n\tTOKEN_DOWNLOAD_OPTION_TYPES.ASSET_VIEW,\n\tTOKEN_DOWNLOAD_OPTION_TYPES.MANUAL_REPURPOSE,\n\tTOKEN_DOWNLOAD_OPTION_TYPES.ORIGINAL,\n\tTOKEN_DOWNLOAD_OPTION_TYPES.PRESET_PROCESS,\n\tTOKEN_DOWNLOAD_OPTION_TYPES.PROXY,\n\t// TOKEN_DOWNLOAD_OPTION_TYPES.TEMPLATE_CUSTOMIZATION,\n];\n","/**\n * Saved cart model holds data regarding a saved cart instance\n * Saved carts are part of the shared resource system\n * `fetch` will get you the shared resource bean for the saved cart\n * `fetchBean` will get you the actual saved cart bean\n * @class\n */\n\nimport Base from '@netx/core-share/models/sharedResource';\n\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\nimport CartAssetsCollection from '../collections/cartAssets';\nimport AssetSearchRulesCollection from '@netx/core-search/collections/searchRules_assets';\n\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\nimport customConfig from '../config';\n\nexport default class SavedCart extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this model\n\t * @property {method} methods.create - Save new cart\n\t * @property {method} methods.read - Fetch saved cart\n\t * @property {method} methods.remove - Destroy saved cart\n\t * @property {method} methods.update - Update saved cart\n\t *\n\t * @property {method} methods.addAssetsToCart - Add assets to saved cart\n\t * @property {method} methods.addFacetedSearchToCart- Add search to saved cart\n\t * @property {method} methods.archiveCartAssets - Archive assets in saved cart\n\t * @property {method} methods.download - Download cart assets\n\t * @property {method} methods.duplicateCart - Duplicate saved cart\n\t * @property {method} methods.expireCartAssets - Set expiration for assets in saved cart\n\t * @property {method} methods.fetchBean - Fetch saved search bean (fetch gets the shared resource)\n\t * @property {method} methods.inspect - Inspect saved cart contents\n\t * @property {method} methods.removeAssetsFromCart - Remove assets from saved cart\n\t * @property {method} methods.setCart - Set cart data\n\t * @property {method} methods.unarchiveCartAssets - Unarchive assets in saved cart\n\t */\n\tget methods() {\n\t\treturn _.extend(super.methods, {\n\t\t\t/**\n\t\t\t * Create saved cart\n\t\t\t * @method\n\t\t\t * @private\n\t\t\t */\n\t\t\tcreate(opts) {\n\t\t\t\t// TODO: Need the DAM to return full beans on creation\n\t\t\t\t// in this case (all shared resource cases) it would be the shared resource and not the underlying cart bean itself\n\t\t\t\treturn this.setCart().then(id => {\n\t\t\t\t\tthis.set({id: id}, opts);\n\t\t\t\t\treturn this.fetch(opts);\n\t\t\t\t});\n\t\t\t},\n\t\t\t/**\n\t\t\t * Destroy saved cart\n\t\t\t * @method\n\t\t\t */\n\t\t\tremove: ['deleteCart', 'id'],\n\t\t\t/**\n\t\t\t * Update saved cart\n\t\t\t * @method\n\t\t\t */\n\t\t\tupdate: ['setCart', 'id', 'title'],\n\n\t\t\t/**\n\t\t\t * Add assets to saved cart\n\t\t\t * @method\n\t\t\t * @param {array} assets Asset ids\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\taddAssetsToCart(assets, opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'addAssetsToCart',\n\t\t\t\t\tthis.id,\n\t\t\t\t\t_.tidyAssetList.apply(this, [assets]),\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Add faceted search to cart\n\t\t\t * @method\n\t\t\t */\n\t\t\taddFacetedSearchToCart(selection, opts) {\n\t\t\t\tif (!selection) {\n\t\t\t\t\tthrow new Error('No search selection!');\n\t\t\t\t}\n\n\t\t\t\tconst search = selection.createSearchObject();\n\t\t\t\treturn [\n\t\t\t\t\t'addFacetedSearchToCart',\n\t\t\t\t\tthis.id,\n\t\t\t\t\tsearch.sortField,\n\t\t\t\t\tsearch.sortOrder,\n\t\t\t\t\tsearch.matchCriteria,\n\t\t\t\t\tsearch.elementTypes,\n\t\t\t\t\tsearch.elementSubType1s,\n\t\t\t\t\tsearch.elementSubType2s,\n\t\t\t\t\tsearch.elementValue1s,\n\t\t\t\t\tsearch.elementValue2s,\n\t\t\t\t\tsearch.elementValue3s,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\tselection.searchFacets.selectedValues(),\n\t\t\t\t\tselection.searchFacets.filterMode,\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Archive cart assets\n\t\t\t * @method\n\t\t\t */\n\t\t\tarchiveCartAssets: ['archiveCartAssets', 'id', 'archiveArgs.locationId'],\n\t\t\t/**\n\t\t\t * Download cart assets\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tdownload(opts) {\n\t\t\t\treturn ['downloadAssetsFromSavedCart', this.id, true];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Duplicate saved cart\n\t\t\t * @method\n\t\t\t * @param {string} cartName Saved cart name\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tduplicateCart(cartName, opts) {\n\t\t\t\treturn ['duplicateCart', cartName, this.id];\n\t\t\t},\n\t\t\t/**\n\t\t\t * This works for both expiring and unexpiring\n\t\t\t * Unexpireing just means setting 0 on expirationDate\n\t\t\t * @method\n\t\t\t */\n\t\t\texpireCartAssets: ['expireCartAssets', 'id', 'expirationArgs.date'],\n\t\t\t/**\n\t\t\t * Fetch saved cart\n\t\t\t * @method\n\t\t\t */\n\t\t\tfetchBean: ['getCart', 'id'],\n\t\t\t/**\n\t\t\t * Report on the contents of this cart.\n\t\t\t * @method\n\t\t\t */\n\t\t\tinspect: ['inspectCartContents', 'id'],\n\t\t\t/**\n\t\t\t * Remove assets from saved cart\n\t\t\t * @method\n\t\t\t * @param {array} assets Asset ids\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tremoveAssetsFromCart(assets, opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'removeAssetsFromCart',\n\t\t\t\t\tthis.id,\n\t\t\t\t\t_.tidyAssetList.apply(this, arguments),\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Set cart data\n\t\t\t * @method\n\t\t\t */\n\t\t\tsetCart: ['setCart', 0, 'title'],\n\t\t\t/**\n\t\t\t * Unarchive cart assets\n\t\t\t * @method\n\t\t\t */\n\t\t\tunarchiveCartAssets: [\n\t\t\t\t'unarchiveCartAssets',\n\t\t\t\t'id',\n\t\t\t\t'unarchiveArgs.type',\n\t\t\t\t'unarchiveArgs.email',\n\t\t\t],\n\t\t});\n\t}\n\n\t/**\n\t * @property {object} parsers - Parsers for this model\n\t * @property {method} parsers.addAssetsToCart - Add assets to saved cart\n\t * @property {method} parsers.addFacetedSearchToCart - Add search to saved cart\n\t * @property {method} parsers.fetchBean - Parse response of fetch saved cart bean\n\t * @property {method} parsers.removeAssetsFromCart - Remove assets from saved cart\n\t * @property {method} parsers.setAssetsInCart - Replace contents of saved cart\n\t */\n\tget parsers() {\n\t\treturn _.extend(super.parsers, {\n\t\t\t/**\n\t\t\t * Add assets to saved cart\n\t\t\t * @method\n\t\t\t * @param {number} newCount Saved cart's asset count\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\taddAssetsToCart(newCount, opts) {\n\t\t\t\tthis.set({contentCount: newCount}, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Add search to saved cart\n\t\t\t * @method\n\t\t\t * @param {number} newCount Saved cart's asset count\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\taddFacetedSearchToCart(newCount, opts) {\n\t\t\t\tthis.set({contentCount: newCount}, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Remove assets from saved cart\n\t\t\t * @method\n\t\t\t * @param {number} newCount Saved cart's asset count\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tremoveAssetsFromCart(newCount, opts) {\n\t\t\t\tthis.set({contentCount: newCount}, opts);\n\t\t\t},\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tget sharedResourceRoute() {\n\t\treturn `cart-assets/${this.id}`;\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attr Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\t/**\n\t\t * Resource type name\n\t\t * @type {string}\n\t\t */\n\t\topts.resourceName = 'savedCart';\n\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * @memberof module:cart/models/savedCart\n\t\t * @alias archiveArgs\n\t\t * @property {object} archiveArgs - Arguments to the archive cart assets method\n\t\t * @property {number} archiveArgs.locationId - Archive location id\n\t\t */\n\t\tthis.archiveArgs = _.extend(\n\t\t\t{\n\t\t\t\tlocationId: 0,\n\t\t\t},\n\t\t\topts.archiveArgs,\n\t\t);\n\n\t\t/**\n\t\t * For adding/removing assets\n\t\t * Array of asset Ids\n\t\t * @memberof module:cart/models/savedCart\n\t\t * @alias assetArg\n\t\t * @type {array}\n\t\t */\n\t\tthis.assetsArg = opts.assetsArg || [];\n\n\t\t/**\n\t\t * @memberof module:cart/models/savedCart\n\t\t * @alias expirationArgs\n\t\t * @property {object} expirationArgs - Arguments to the expire cart assets method\n\t\t * @property {array} expirationArgs.date - Expiration date to set\n\t\t */\n\t\tthis.expirationArgs = _.extend(\n\t\t\t{\n\t\t\t\tdate: 0,\n\t\t\t},\n\t\t\topts.expirationArgs,\n\t\t);\n\n\t\t/**\n\t\t * @memberof module:cart/models/savedCart\n\t\t * @alias unarchiveArgs\n\t\t * @property {object} unarchiveArgs - Arguments to the unarchive cart assets method\n\t\t * @property {number} unarchiveArgs.unarchiveType - Type of unarchive ( 1 = temporary, 2 = permanently )\n\t\t * @property {string} unarchiveArgs.email - Email address to notify on unarchive complete\n\t\t */\n\t\tthis.unarchiveArgs = _.extend(\n\t\t\t{\n\t\t\t\ttype: 1,\n\t\t\t\temail: '',\n\t\t\t},\n\t\t\topts.unarchiveArgs,\n\t\t);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(dispatcher, 'cart:rename:success', model => {\n\t\t\tmodel.id === this.id &&\n\t\t\t\tmodel !== this &&\n\t\t\t\tthis.set('title', model.get('title'));\n\t\t});\n\t}\n\n\t/**\n\t * Add current cart assets\n\t * @method\n\t */\n\taddCurrentCart() {\n\t\treturn this.addFacetedSearchToCart(\n\t\t\tnew AssetSearchRulesCollection([\n\t\t\t\t{\n\t\t\t\t\telementType: 10, // search type \"cart\"\n\t\t\t\t\telementValue1: 0, // id of current cart\n\t\t\t\t},\n\t\t\t]),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} locationId Archive location id\n\t */\n\tarchive() {\n\t\treturn CartAssetsCollection.prototype.archive.apply(this, arguments);\n\t}\n\n\t/**\n\t * @method\n\t * @param {date|string} date Date\n\t */\n\texpireAssets() {\n\t\treturn CartAssetsCollection.prototype.expireAssets.apply(this, arguments);\n\t}\n\n\t/**\n\t * @method\n\t * @return {array} Asset ids\n\t */\n\tgetAssetIds() {\n\t\treturn this.getCartAssets().getAssetIds();\n\t}\n\n\t/**\n\t * @method\n\t * @return {Netx.Collections.CartAssets} Assets\n\t */\n\tgetCartAssets() {\n\t\t// TODO: are we making the code that calls this fetch this collection?\n\t\t// because we would be retunring an empty collection here\n\t\tif (_.isUndefined(this.cartAssets)) {\n\t\t\tthis.cartAssets = new CartAssetsCollection([], {id: this.id});\n\t\t}\n\t\treturn this.cartAssets;\n\t}\n\n\t/**\n\t * @method\n\t * @param {boolean} fullUrl Return full url\n\t * @return {string}\n\t */\n\tgetRoute(fullUrl) {\n\t\treturn (\n\t\t\t((fullUrl && Netx.URL.location.split('#')[0]) || '') +\n\t\t\t'#' +\n\t\t\tcustomConfig.ROUTE_SAVED_CART +\n\t\t\t'/' +\n\t\t\tthis.id\n\t\t);\n\t}\n\n\t/**\n\t * Change saved cart name\n\t * @method\n\t * @param {string} name New saved cart name\n\t * @todo Opts?\n\t */\n\trename(name) {\n\t\tthis.set({title: name});\n\t\treturn this.save();\n\t}\n\n\t/**\n\t * Get an assetSet model defining the set of this cart's assets\n\t * @method\n\t * @return {module:asset/models/assetSet} Asset set\n\t */\n\ttoAssetSet() {\n\t\treturn new AssetSetModel({\n\t\t\ttype: assetSetTypes.savedCart,\n\t\t\tids: [this.id],\n\t\t\tmodels: [this],\n\t\t\tlabel: this.getLabel(),\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} type Unarchive type\n\t * @param {string} email Email to notify on completion\n\t */\n\tunarchive(type, email) {\n\t\treturn CartAssetsCollection.prototype.unarchive.apply(this, arguments);\n\t}\n\n\t/**\n\t * @method\n\t */\n\tunexpireAssets() {\n\t\treturn CartAssetsCollection.prototype.unexpireAssets.apply(this, arguments);\n\t}\n\n\t/**\n\t * Create a saved cart from a name and some assets\n\t * @method\n\t * @param {string} name Saved cart name\n\t * @param {Netx.Collections.Assets|array} assets Either a collection of assets or an array of asset ids\n\t */\n\tstatic Create(name, assets) {\n\t\tconst sc = new this.constructor({title: name});\n\n\t\tsc.assetsArg = _.tidyAssetList(assets);\n\t\treturn sc.create().then(() => {\n\t\t\treturn sc.fetch().then(() => {\n\t\t\t\treturn sc;\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Load a saved cart from an ID\n\t * @method\n\t * @param {number} id Saved cart id\n\t */\n\tstatic Load(id) {\n\t\tconst sc = new this.constructor({id: id});\n\n\t\treturn sc.fetch().then(() => {\n\t\t\treturn sc;\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SavedCart';\n\t}\n}\n","import {CART_ASSET_ACTION_LABELS} from './locales';\nimport {canAddAssetToCart, canRemoveAssetFromCart} from './enablers';\n\nimport type {Action} from '@netx/core/bootstrap';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {faInboxIn, faInboxOut} from '@fortawesome/pro-solid-svg-icons';\n\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaInboxIn: icon(faInboxIn, iconOpts).html,\n\tfaInboxOut: icon(faInboxOut, iconOpts).html,\n};\n\nexport const CART_ASSET_ACTION_ICON = <const>{\n\tADD_TO_CART: faInboxIn,\n\tREMOVE_FROM_CART: faInboxOut,\n};\n\nexport type CartAssetBaseVent = typeof CART_ASSET_BASE_EVENT;\n\nexport const CART_ASSET_BASE_EVENT = `cart:asset`;\n\nexport const CART_ASSET_EVENT = <const>{\n\tADD_TO_CART: `${CART_ASSET_BASE_EVENT}:add`,\n\tREMOVE_FROM_CART: `${CART_ASSET_BASE_EVENT}:remove`,\n};\n\nexport const CART_ASSET_ACTIONS: Action<\n\ttypeof CART_ASSET_EVENT[keyof typeof CART_ASSET_EVENT]\n>[] = [\n\t{\n\t\tevent: CART_ASSET_EVENT.ADD_TO_CART,\n\t\tenableTest: canAddAssetToCart,\n\t\ticon: icons.faInboxIn,\n\t\tlabel: CART_ASSET_ACTION_LABELS.ADD_TO_CART,\n\t},\n\t{\n\t\tevent: CART_ASSET_EVENT.REMOVE_FROM_CART,\n\t\tenableTest: canRemoveAssetFromCart,\n\t\ticon: icons.faInboxOut,\n\t\tlabel: CART_ASSET_ACTION_LABELS.REMOVE_FROM_CART,\n\t},\n];\n\nexport default CART_ASSET_ACTIONS;\n","import {\n\tfaArrowCircleDown,\n\tfaFilePdf,\n\tfaShare,\n} from '@fortawesome/pro-solid-svg-icons';\n\nexport const ASSET_SHARE_ICON = <const>{\n\tCREATE_PDF: faFilePdf,\n\tDOWNLOAD: faArrowCircleDown,\n\tMENU: faShare,\n};\n\nexport type AssetShareBaseEvent = typeof ASSET_SHARE_BASE_EVENT;\n\nexport const ASSET_SHARE_BASE_EVENT = `share:asset`;\n\nexport const ASSET_SHARE_EVENT = <const>{\n\tCREATE_PDF: `${ASSET_SHARE_BASE_EVENT}:createPDF`,\n\tDOWNLOAD: `${ASSET_SHARE_BASE_EVENT}:download`,\n\tMENU: `${ASSET_SHARE_BASE_EVENT}:menu:react`,\n};\n","export * from './containers';\nexport * from './components';\nexport * from './contexts';\nexport * from './hooks';\nexport * from './types';\n","import {cartRuleDefaults} from './defaults';\nimport type {CartRule} from './types';\n\nexport const createCartRule = (id: number): CartRule => ({\n\t...cartRuleDefaults,\n\telementValue1: id,\n});\n\nexport default createCartRule;\n","import {isMobile} from '@netx/core/utils';\nimport {Asset} from '@netx/core-asset/types';\nimport {assetIsPresent} from '@netx/core-asset/utils';\nimport {PermissionMatrixName} from '@netx/core-permissions/constants';\nimport {allows} from '@netx/core-permissions/utils';\nimport {currentUserMeetsUserLevel} from '@netx/core-user/utils/currentUserMeetsUserLevel';\nimport {\n\tREPURPOSE_MINIMUM_USER_LEVEL,\n\tREPURPOSE_SUPPORTED_FILE_FORMAT_FAMILIES,\n\tREPURPOSE_SUPPORTED_VIEW_NAMES,\n} from './constants';\n\nexport const canRepurpose = () =>\n\t!isMobile() && currentUserMeetsUserLevel(REPURPOSE_MINIMUM_USER_LEVEL);\n\nexport const canRepurposeAsset = (asset: Asset) => {\n\t// DAM-13617\n\tif (!canRepurpose()) return false;\n\n\tconst {viewNames, fileFormatFamily, repurposeAvailability} = asset;\n\n\t// Savign for history sake - maybe this might come up again\n\t// const manualUserLevel = Netx.getPreference('sys.minUserLevelForManualRepurpose') || 0,\n\t// const canManuallyRepurpose = Netx.getUserLevel() >= manualUserLevel;\n\n\tif (\n\t\t!allows(asset.permissionMatrix, PermissionMatrixName.DOWNLOAD) ||\n\t\t!assetIsPresent(asset) ||\n\t\t!repurposeAvailability\n\t)\n\t\treturn false;\n\n\t// Once the property repurposeAvailability is considering\n\t// the availability of the engines required to repurpose\n\t// an asset ( https://jira.netx.net/browse/DAM-4564 ) we\n\t// can rely more heavily on `repurposeAvailability` until\n\t// that time... ~SAK\n\treturn (\n\t\tREPURPOSE_SUPPORTED_FILE_FORMAT_FAMILIES.some((supportedFileFormatFamily) =>\n\t\t\tfileFormatFamily.includes(supportedFileFormatFamily),\n\t\t) ||\n\t\tREPURPOSE_SUPPORTED_VIEW_NAMES.some((supportedViewName) =>\n\t\t\tviewNames.includes(supportedViewName),\n\t\t)\n\t);\n};\n","import React, {useCallback} from 'react';\n\nimport {TextField, TextFieldProps} from '../TextField';\ntype TextFieldRequiredProps = Required<TextFieldProps>;\n\nconst getNumberWithoutDuplicateDecimals = (str: string) => {\n\tlet counter = 0;\n\tstr = str.replace(/[^\\d.-]/g, '');\n\treturn str.replace(/[^0-9.-]|\\./g, function ($0) {\n\t\tif ($0 == '.' && !counter++)\n\t\t\t// dot found and counter is not incremented\n\t\t\treturn '.'; // that means we met first dot and we want to keep it\n\t\treturn ''; // if we find anything else, let's erase it\n\t});\n};\n\nexport interface NumberFieldProps extends Omit<TextFieldProps, 'value'> {\n\tmaxLength?: number;\n\tvalue?: string | number;\n}\n\nexport const NumberField = ({\n\tonChange,\n\tmaxLength,\n\tvalue,\n\t...props\n}: NumberFieldProps) => {\n\tconst handleChange = useCallback<TextFieldRequiredProps['onChange']>(\n\t\t(value) => onChange?.(getNumberWithoutDuplicateDecimals(value)),\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<TextField\n\t\t\t{...props}\n\t\t\tinputProps={{\n\t\t\t\t...props?.inputProps,\n\t\t\t\tmaxLength,\n\t\t\t}}\n\t\t\tonChange={handleChange}\n\t\t\tvalue={value != null ? value.toString() : value}\n\t\t/>\n\t);\n};\n\nexport default NumberField;\n","import React from 'react';\nimport Theme from './Theme';\n\n/**\n * wrap component in NetX theme\n * @example\n\tconst ThemedComponenet = withTheme(Componenet);\n */\nexport const withTheme = function <C extends React.ElementType>(Component: C) {\n\treturn (\n\t\tprops: JSX.IntrinsicAttributes &\n\t\t\tJSX.LibraryManagedAttributes<C, React.ComponentProps<C>>,\n\t) => {\n\t\treturn (\n\t\t\t<Theme>\n\t\t\t\t<Component {...props} />\n\t\t\t</Theme>\n\t\t);\n\t};\n};\n\nexport default withTheme;\n","import React, {useEffect} from 'react';\nimport clsx from 'clsx';\n\nimport Netx from '@netx/core/bootstrap';\nimport {i18n} from '@netx/core/i18n';\n\nimport {Skeleton} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport {useTheme, Theme} from '@netx/core-components/Theme';\n\nimport useImageLoader from '@netx/core-components/hooks/useImageLoader';\n\nconst styles = ({breakpoints}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tflex: '0 0 auto',\n\t\t\tmaxHeight: 42,\n\t\t\t'& img': {\n\t\t\t\tmaxHeight: 42,\n\t\t\t\tmaxWidth: '100%',\n\t\t\t\twidth: 'auto',\n\t\t\t\theight: 'auto',\n\t\t\t},\n\t\t\t'& $skeleton': {\n\t\t\t\tborderRadius: 4,\n\t\t\t\twidth: 116,\n\t\t\t\theight: 42,\n\t\t\t},\n\t\t\t[breakpoints.down('sm')]: {\n\t\t\t\tmaxHeight: 32,\n\t\t\t\t'& img': {\n\t\t\t\t\tmaxHeight: 32,\n\t\t\t\t},\n\t\t\t\t'& $skeleton': {\n\t\t\t\t\theight: 32,\n\t\t\t\t\twidth: 88,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\timg: {},\n\t\tskeleton: {},\n\t});\n\nexport interface LogoProps {\n\tclassName?: string;\n}\n\nconst Logo = ({classes, className}: WithStyles<typeof styles> & LogoProps) => {\n\tconst theme = useTheme();\n\tconst imageLoader = useImageLoader();\n\n\tuseEffect(() => {\n\t\tconst logoUrl =\n\t\t\tNetx.URL.themeLogo ||\n\t\t\t(theme.palette.mode === 'dark' ? Netx.URL.logoDark : Netx.URL.logoLight);\n\t\timageLoader.load(`${logoUrl}?cb=${Date.now()}`);\n\t}, [theme.palette.mode]);\n\n\treturn (\n\t\t<div className={clsx(classes.root, className)}>\n\t\t\t{imageLoader.src ? (\n\t\t\t\t<img\n\t\t\t\t\tclassName={classes.img}\n\t\t\t\t\tsrc={imageLoader.src}\n\t\t\t\t\talt={i18n.t('i18n.logo')}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<Skeleton className={classes.skeleton} variant=\"rectangular\" />\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nexport default withStyles(styles)(Logo);\n","import {createStyled} from '@mui/system';\nimport {Theme} from './Theme';\n\nexport const styled = createStyled<Theme>();\nexport default styled;\n","export {unstable_composeClasses as composeClasses} from '@mui/base';\nimport {unstable_composeClasses as composeClasses} from '@mui/base';\nexport default composeClasses;\n","export const SearchTypeAdvancedRaw = 8 as const;\nexport type TSearchTypeAdvancedRaw = typeof SearchTypeAdvancedRaw;\n","export const SearchTypeAttributeHistory = 200 as const;\nexport type TSearchTypeAttributeHistory = typeof SearchTypeAttributeHistory;\n","export const SearchTypeExpiration = 17 as const;\nexport type TSearchTypeExpiration = typeof SearchTypeExpiration;\n","export const SearchTypeFileFormatFamily = 26 as const;\nexport type TSearchTypeFileFormatFamily = typeof SearchTypeFileFormatFamily;\n","export const SearchTypeSavedSearch = 24 as const;\nexport type TSearchTypeSavedSearch = typeof SearchTypeSavedSearch;\n","import type {InfiniteData} from 'react-query';\n\ntype BaseResultData<TData> = {\n\tresults: TData[];\n\tstartIndex: number;\n\tsize: number;\n};\n\nexport const getIndexedResults = <TData>(\n\tdata?: InfiniteData<BaseResultData<TData>>,\n\textraParams?: Partial<TData>,\n\tstackData?: TData[],\n) => {\n\tif (!data)\n\t\treturn {\n\t\t\tdata: [],\n\t\t\ttotal: 0,\n\t\t};\n\n\tconst parsed: Array<TData & {index: number}> = stackData\n\t\t? stackData.map((d, index) => ({...d, index}))\n\t\t: [];\n\n\tdata.pages.forEach(({results, startIndex}) => {\n\t\tresults.forEach((result, index) => {\n\t\t\tparsed[startIndex + index] = {\n\t\t\t\t...(stackData || [])[startIndex + index],\n\t\t\t\t...result,\n\t\t\t\tindex: startIndex + index,\n\t\t\t\t...extraParams,\n\t\t\t};\n\t\t});\n\t});\n\n\t// TODO: what do we do when/if total changes?\n\t// refetch from beginning? because we can't always know where those new ones came from\n\tconst total = data.pages[data.pages.length - 1]?.size || 0;\n\n\treturn {\n\t\tdata: parsed,\n\t\ttotal,\n\t};\n};\n\nexport default getIndexedResults;\n","type BaseResultData<TData> = {\n\tresults: TData[];\n\tstartIndex: number;\n\tsize: number;\n};\n\n// Return anything but false to indicate that there is more to fetch\n// The return here is not anything we are actually using - but we are relying\n// on this to report there is more to be fetched\n// What we pass back from here would be sent automatically when we call\n// `getDownloadRequestApprovalsQuery.fetchNextPage()` without any arguments\nexport const getNextPageParam = <TData>(\n\tlastPage: BaseResultData<TData>,\n\tpages: BaseResultData<TData>[],\n) => {\n\tif (!lastPage) return false;\n\tconst {startIndex, size, results} = lastPage;\n\n\tconst totalItemsFetched =\n\t\tpages?.reduce((accum, current) => accum + current.results.length, 0) || 0;\n\n\t// Are there more items to fetch\n\treturn totalItemsFetched < size\n\t\t? {\n\t\t\t\tstartIndex: startIndex + results.length,\n\t\t\t\tstopIndex: startIndex + results.length + results.length,\n\t\t }\n\t\t: false;\n};\n\nexport default getNextPageParam;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport type {AssetId, AssetAttributes} from '@netx/core-asset/models/asset';\n\n/**\n * `getAssetBean` request params\n * (what is used to send to server)\n */\nexport type GetAssetBeanRequestOptions = {\n\tid: AssetId;\n};\n\n/**\n * `getAssetBean` request\n * (what gets sent to the server)\n */\nexport type GetAssetBeanRequest = [GetAssetBeanRequestOptions['id']];\n\n/**\n * `getAssetBean` response\n * (what comes back from the server)\n */\nexport type GetAssetBeanResponse = SuccessResponse<GetAssetBeanResult>;\n\n/**\n * `getAssetBean` result\n * (what is utilized from the server response)\n */\nexport interface GetAssetBeanResult extends AssetAttributes {}\n\nexport const getAssetBeanEndpoint = 'getAssetBean';\n\n/**\n * Set asset expiration\n * @param fetchParams Fetch params\n */\nexport const getAssetBean = async ({id}: GetAssetBeanRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetAssetBeanRequest = [id];\n\n\treturn client\n\t\t.post<GetAssetBeanResponse>(getAssetBeanEndpoint, requestParams)\n\t\t.then((response) => response.data.result);\n};\n\nexport default getAssetBean;\n","import {\n\tcurrentUserMeetsUserLevel,\n\tUserLevel,\n} from '@netx/core-user/utils/currentUserMeetsUserLevel';\n\nexport const canUseGridEditor = () =>\n\tcurrentUserMeetsUserLevel(UserLevel.PRODUCER);\n","export * from './getAttributeFieldSet';\n","export * from './Set';\nexport * from './Sets';\nexport * from './SortableSet';\nexport * from './SortableSets';\n","export * from './AttributeSetContext';\n","export enum SearchVisualPref {\n\tENABLED = 'search.visual.enabled',\n}\n","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n return _setPrototypeOf(o, p);\n}\nmodule.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import BASE_RULE from '../baseRule';\nimport {SearchTypeCart} from './constants';\nimport {CartRule} from './types';\n\nexport const cartRuleDefaults: CartRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeCart,\n\telementSubType1: 0,\n\telementSubType2: 0,\n\t/**\n\t * @default current cart\n\t */\n\telementValue1: 0,\n};\n\nexport default cartRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {CategoryType, SearchTypeCategoryId} from './constants';\nimport {CategoryIdRule} from './types';\n\nexport const categoryIdRuleDefaults: CategoryIdRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeCategoryId,\n\telementSubType1: CategoryType.ONLY,\n\t/** top level */\n\telementValue1: 1,\n};\n\nexport default categoryIdRuleDefaults;\n","import {i18n} from '@netx/core/i18n';\n\nexport const SearchValueUnavailableLabel = i18n.t(\n\t'i18n.searchRuleDataUnavailable',\n);\n","import BASE_RULE from '../baseRule';\nimport {KeywordType, SearchTypeKeyword} from './constants';\nimport {KeywordRule} from './types';\n\nexport const keywordRuleDefaults: KeywordRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeKeyword,\n\telementSubType1: KeywordType.MATCH_ALL_FRAGMENTS,\n};\n\nexport default keywordRuleDefaults;\n","import {\n\tMetadataType,\n\tMetadataNoValueTypes,\n\tMetadataSingleValueTypes,\n} from './constants';\nimport {metadataRuleDefaults} from './defaults';\nimport {MetadataRule} from './types';\nimport {metadataNameHackOut} from './utils';\n\ntype DoesNotRequireValue = typeof MetadataNoValueTypes[number];\ntype RequiresSingleValue = typeof MetadataSingleValueTypes[number];\n\ntype MetadataRuleBaseParams<\n\tT extends MetadataType = MetadataType.MATCH_ALL_WILD_CARDS,\n> = {\n\ttype?: T;\n\tname: string;\n} & ([T] extends [MetadataType.MATCH_ANY_RANGE]\n\t? {\n\t\t\t/** range start value */\n\t\t\trangeStart: string;\n\t\t\t/** range end value */\n\t\t\trangeEnd: string;\n\t }\n\t: [T] extends [RequiresSingleValue]\n\t? {\n\t\t\t/** attribute value */\n\t\t\tvalue: string;\n\t }\n\t: {});\n\ntype Range = MetadataRuleBaseParams<MetadataType.MATCH_ANY_RANGE>;\ntype SingleValue = MetadataRuleBaseParams<RequiresSingleValue>;\ntype NoValue = MetadataRuleBaseParams<DoesNotRequireValue>;\n\ntype GetMetadataRuleParams = Range | SingleValue | NoValue;\n\n// single value needed\nexport function createMetadataRule(\n\tparams: SingleValue,\n): MetadataRule<RequiresSingleValue>;\n\n// range needed\nexport function createMetadataRule(\n\tparams: Range,\n): MetadataRule<MetadataType.MATCH_ANY_RANGE>;\n\n// no value needed\nexport function createMetadataRule(\n\tparams: NoValue,\n): MetadataRule<DoesNotRequireValue>;\n\nexport function createMetadataRule(params: GetMetadataRuleParams) {\n\tconst {name, type} = params;\n\n\treturn {\n\t\t...metadataRuleDefaults,\n\t\telementSubType1: type,\n\t\t/** value/range start */\n\t\telementValue1:\n\t\t\ttype === MetadataType.MATCH_ANY_RANGE\n\t\t\t\t? params.rangeStart\n\t\t\t\t: MetadataSingleValueTypes.includes(\n\t\t\t\t\t\ttype as typeof MetadataSingleValueTypes[number],\n\t\t\t\t )\n\t\t\t\t? (params as SingleValue).value\n\t\t\t\t: '',\n\t\t/** attribute name */\n\t\telementValue2: metadataNameHackOut(name),\n\t\t/** range end */\n\t\telementValue3: type === MetadataType.MATCH_ANY_RANGE ? params.rangeEnd : '',\n\t};\n}\n\nexport default createMetadataRule;\n","import BASE_RULE from '../baseRule';\nimport {SearchTypeMetadata, MetadataType} from './constants';\nimport type {MetadataRule} from './types';\n\nexport const metadataRuleDefaults: MetadataRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeMetadata,\n\telementSubType1: MetadataType.MATCH_ALL_WILD_CARDS,\n};\n\nexport default metadataRuleDefaults;\n","import type {SearchCriteria} from '../types';\nimport {searchCriteriaToSmallSALO} from './searchCriteriaToSmallSALO';\n\n/**\n * Enocde search criteria to base64 and uri encode\n * @param criteria\n * @returns uri encoded base64 search criteria\n */\nexport const encodeBase64Rules = (criteria: SearchCriteria) => {\n\treturn encodeURIComponent(\n\t\tBuffer.from(\n\t\t\tJSON.stringify(searchCriteriaToSmallSALO(criteria)),\n\t\t\t'utf8',\n\t\t).toString('base64'),\n\t);\n};\n\nexport default encodeBase64Rules;\n","import {\n\tfaPencilAlt,\n\tfaPlus,\n\tfaSyncAlt,\n\tfaTrashAlt,\n} from '@fortawesome/pro-solid-svg-icons';\n\nexport const CUSTOM_ACTION_ACTION_ICON = <const>{\n\tCREATE: faPlus,\n\tEDIT: faPencilAlt,\n\tDELETE: faTrashAlt,\n\tREGENERATE_SECRET: faSyncAlt,\n};\n\nexport type CustomActionBaseEvent = typeof CUSTOM_ACTION_BASE_EVENT;\n\nexport const CUSTOM_ACTION_BASE_EVENT = `custom:action`;\n\nexport const CUSTOM_ACTION_EVENT = <const>{\n\tUPDATED: `${CUSTOM_ACTION_BASE_EVENT}:updated`,\n};\n","import {UserLevel} from '@netx/core-user/constants';\n\nexport const CUSTOM_ACTION_MINIMUM_USER_LEVEL = UserLevel.ADMIN;\nexport const CUSTOM_ACTION_LIST_PAGE_SIZE = 25;\n\nexport enum CustomActionField {\n\tCONTEXT_NAME = 'contextName',\n\tENABLED = 'enabled',\n\tID = 'id',\n\tNAME = 'name',\n\tPAYLOAD_URL = 'payloadUrl',\n\tTARGET_URL = 'targetUrl',\n\tUSER_SELECTOR = 'userSelector',\n}\n\nexport const CUSTOM_ACTIONS_SORTABLE_FIELDS = [CustomActionField.NAME];\n\nexport enum CustomActionPayloadType {\n\tCURRENT_SELECTION = 'currentSelection',\n}\n\nexport enum CustomActionContextName {\n\tCURRENT_SELECTION = 'selection',\n}\n\nexport const CUSTOM_ACTION_DEFAULTS = {\n\t[CustomActionField.ENABLED]: true,\n\t[CustomActionField.NAME]: '',\n\t[CustomActionField.PAYLOAD_URL]: '',\n\t[CustomActionField.TARGET_URL]: '',\n\t[CustomActionField.USER_SELECTOR]: {\n\t\tuserSelectorId: -1,\n\t\tall: true,\n\t\tnone: false,\n\t\tgroups: [],\n\t\tusers: [],\n\t},\n};\n","import {i18n} from '@netx/core/i18n';\nimport {CustomActionField} from './constants';\nimport type {CustomAction} from './types';\n\nexport const CUSTOM_ACTION_COLUMN_LABEL: Partial<Record<\n\tkeyof CustomAction,\n\tstring\n>> = {\n\t[CustomActionField.CONTEXT_NAME]: i18n.t('i18n.contextName'),\n\t[CustomActionField.ENABLED]: i18n.t('i18n.status'),\n\t[CustomActionField.ID]: i18n.t('i18n.id'),\n\t[CustomActionField.NAME]: i18n.t('i18n.label'),\n\t[CustomActionField.PAYLOAD_URL]: i18n.t('i18n.endpointUrl'),\n\t[CustomActionField.TARGET_URL]: i18n.t('i18n.targetUrl'),\n\t[CustomActionField.USER_SELECTOR]: i18n.t('i18n.userSelector'),\n};\n\nexport const CUSTOM_ACTION_ACTION_LABEL = {\n\tADD: i18n.t('i18n.addCustomAction'),\n\tCREATE: i18n.t('i18n.create'),\n\tDONE: i18n.t('i18n.done'),\n\tDELETE: i18n.t('i18n.delete'),\n\tEDIT: i18n.t('i18n.edit'),\n\tREGENERATE_SECRET: i18n.t('i18n.regenerateSecret'),\n\tSAVE: i18n.t('i18n.save'),\n};\n\nexport const CUSTOM_ACTION_TITLE = {\n\tCREATE_CUSTOM_ACTION: i18n.t('i18n.create'),\n\tCONFIRM_REGENERATE: i18n.t('i18n.regenerateSecretConfirmTitle'),\n\tCONFIRM_DELETE: i18n.t('i18n.customActionDeleteConfirmTitle'),\n\tCUSTOM_ACTION: i18n.t('i18n.customAction'),\n\tCUSTOM_ACTIONS: i18n.t('i18n.customActions'),\n\tEDIT_CUSTOM_ACTION: i18n.t('i18n.edit'),\n};\n\nexport const CUSTOM_ACTION_LABEL = {\n\tANY: i18n.t('i18n.any'),\n\tACCESS: i18n.t('i18n.access'),\n\tCLOSE: i18n.t('i18n.close'),\n\tDISABLED: i18n.t('i18n.disabled'),\n\tENABLED: i18n.t('i18n.enabled'),\n\tNAME_HELP: i18n.t('i18n.customActionLabelHelp'),\n\tPAYLOAD_URL_HELP: i18n.t('i18n.customActionEndpointUrlHelp'),\n\tSECRET: i18n.t('i18n.secret'),\n\tSTATUS: i18n.t('i18n.status'),\n\tTARGET_URL_HELP: i18n.t('i18n.customActionTargetUrlHelp'),\n\tTEST_ENDPOINT_URL: i18n.t('i18n.test'),\n\tTOTAL: (count: number) => i18n.t('i18n.nItems', {count}),\n};\n\nexport const CUSTOM_ACTION_MESSAGE = {\n\tCHECKING_ENDPOINT: i18n.t('i18n.checkingEndpointMessage'),\n\tCONFIRM_DELETE: i18n.t('i18n.actionPermanent'),\n\tCONFIRM_REGENERATE: i18n.t('i18n.regenerateSecretConfirmMessage'),\n\tENDPOINT_ACCESSIBLE: i18n.t('i18n.endpointAccessibleMessage'),\n\tENDPOINT_INACCESSIBLE: i18n.t('i18n.endpointInaccessibleMessage'),\n\tFAILED: i18n.t('i18n.customActionFailed'),\n\tNO_MATCHING_RECORDS: i18n.t('i18n.noRecords'),\n\tNO_RECORDS: i18n.t('i18n.noCustomActions'),\n\tPERFORMING_ACTION: i18n.t('i18n.customActionPerformingActionMessage'),\n\tSECRETE_MESSAGE: i18n.t('i18n.generatedSecretMessage'),\n\tSUCCEEDED: i18n.t('i18n.customActionSucceeded'),\n};\n","import {i18n} from '@netx/core/i18n';\n\nexport const CLIPBOARD_TEXT_FIELD_ACTION_LABEL = {\n\tCOPY: i18n.t('i18n.copyToClipboard'),\n};\n\nexport const CLIPBOARD_TEXT_FIELD_MESSAGE = {\n\tERROR: i18n.t('i18n.clipboardCopyError'),\n\tSUCCESS: i18n.t('i18n.clipboardCopySuccess'),\n};\n","import React from 'react';\nimport {CopyToClipboard} from 'react-copy-to-clipboard';\nimport {faClipboard} from '@fortawesome/pro-solid-svg-icons';\nimport {IconButton} from '@netx/core-components/IconButton';\nimport {TextField, TextFieldProps} from '@netx/core-components/Form/TextField';\nimport {useSnackbar} from '@netx/core-components/Snackbar';\nimport {\n\tCLIPBOARD_TEXT_FIELD_ACTION_LABEL,\n\tCLIPBOARD_TEXT_FIELD_MESSAGE,\n} from './locales';\n\nexport type ClipboardTextFieldProps = TextFieldProps & {\n\tcopyErrorMessage?: string;\n\tcopySuccessMessage?: string;\n};\n\nexport const ClipboardTextFieldPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tClipboardTextFieldProps\n>(({copyErrorMessage, copySuccessMessage, value, ...props}, ref) => {\n\tconst snackbar = useSnackbar();\n\n\treturn (\n\t\t<TextField\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\treadOnly\n\t\t\tvalue={value}\n\t\t\tInputProps={{\n\t\t\t\t...props.InputProps,\n\t\t\t\tendAdornment: (\n\t\t\t\t\t<CopyToClipboard\n\t\t\t\t\t\ttext={value}\n\t\t\t\t\t\tonCopy={(_, result) => {\n\t\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\t\tsnackbar({\n\t\t\t\t\t\t\t\t\tseverity: 'error',\n\t\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\t\tcopyErrorMessage || CLIPBOARD_TEXT_FIELD_MESSAGE.ERROR,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsnackbar({\n\t\t\t\t\t\t\t\tseverity: 'success',\n\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\tcopySuccessMessage || CLIPBOARD_TEXT_FIELD_MESSAGE.SUCCESS,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\tedge=\"end\"\n\t\t\t\t\t\t\ticon={faClipboard}\n\t\t\t\t\t\t\tlabel={CLIPBOARD_TEXT_FIELD_ACTION_LABEL.COPY}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CopyToClipboard>\n\t\t\t\t),\n\t\t\t}}\n\t\t/>\n\t);\n});\n\nexport const ClipboardTextField = ClipboardTextFieldPrimitive;\n\nexport default ClipboardTextField;\n","import {i18n} from '@netx/core/i18n';\n\nexport const URL_TEXT_FIELD_ACTION_LABEL = {\n\tTEST: i18n.t('i18n.test'),\n};\n\nexport const URL_TEXT_FIELD_LABEL = {\n\tNAME: i18n.t('i18n.url'),\n};\n\nexport const URL_TEXT_FIELD_MESSAGES = {\n\tTESTING: i18n.t('i18n.checkingURLMessage'),\n\tACCESSIBLE: i18n.t('i18n.urlAccessibleMessage'),\n\tINACCESSIBLE: i18n.t('i18n.urlInaccessibleMessage'),\n};\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const URL_TEXT_FIELD_CLASS_NAME = 'URLTextField';\nexport const URL_TEXT_FIELD_CLASS_SLOTS = [\n\t'root',\n\t'endAdornment',\n\t'status',\n] as const;\n\nexport type URLTextFieldClassSlot = typeof URL_TEXT_FIELD_CLASS_SLOTS[number];\n\nexport interface URLTextFieldClasses {\n\troot: string;\n\tendAdornment: string;\n\tstatus: string;\n\tinvalid: string;\n\tvalid: string;\n}\n\nexport type URLTextFieldClassKey = keyof URLTextFieldClasses;\n\nexport const getURLTextFieldUtilityClass = (slot: URLTextFieldClassSlot) =>\n\tgenerateUtilityClass(URL_TEXT_FIELD_CLASS_NAME, slot);\n\nexport const urlTextFieldClasses = generateUtilityClasses<\n\tkeyof URLTextFieldClasses\n>(URL_TEXT_FIELD_CLASS_NAME, [\n\t'root',\n\t'endAdornment',\n\t'invalid',\n\t'status',\n\t'valid',\n]);\nexport default urlTextFieldClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {InputAdornment} from '@mui/material';\nimport Alert from '@netx/core-components/Alert';\nimport Button from '@netx/core-components/Button';\nimport {TextField, TextFieldProps} from '@netx/core-components/Form/TextField';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {\n\tURL_TEXT_FIELD_ACTION_LABEL,\n\tURL_TEXT_FIELD_LABEL,\n\tURL_TEXT_FIELD_MESSAGES,\n} from './locales';\nimport {\n\tgetURLTextFieldUtilityClass,\n\tURLTextFieldClasses,\n\tURL_TEXT_FIELD_CLASS_NAME,\n} from './urlTextFieldClasses';\n\nexport type URLTextFieldOwnerState = WithClasses<\n\tURLTextFieldClasses,\n\t{\n\t\tvalid?: boolean;\n\t\tinvalid?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: URLTextFieldOwnerState) => {\n\tconst {classes, invalid, valid} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t\tendAdornment: ['endAdornment'],\n\t\tstatus: ['status', invalid && 'invalid', valid && 'valid'],\n\t};\n\treturn composeClasses(slots, getURLTextFieldUtilityClass, classes);\n};\n\nexport const URLTextFieldRoot = styled('div', {\n\tname: URL_TEXT_FIELD_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\twidth: '100%',\n}));\n\nexport const URLTextFieldInputAddon = styled('div', {\n\tname: URL_TEXT_FIELD_CLASS_NAME,\n\tslot: 'EndAdornment',\n})(({theme}) => ({\n\tmarginLeft: theme.spacing(1),\n\tmarginRight: theme.spacing(-1),\n\tpaddingLeft: theme.spacing(0.5),\n\tborderLeft: `1px solid ${theme.palette.custom.border}`,\n}));\n\nconst URLTextFieldStatus = styled(Alert, {\n\tname: URL_TEXT_FIELD_CLASS_NAME,\n\tslot: 'Status',\n})(({theme}) => ({\n\tmargin: theme.spacing(1, 0),\n}));\n\n// TODO: this is garbage\nconst urlRegex = new RegExp(\n\t'^(https?:\\\\/\\\\/)?' + // validate protocol\n\t'((([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*)\\\\.)+[a-z]{2,}|' + // validate domain name\n\t'((\\\\d{1,3}\\\\.){3}\\\\d{1,3}))' + // validate OR ip (v4) address\n\t'(\\\\:\\\\d+)?(\\\\/[-a-z\\\\d%_.~+]*)*' + // validate port and path\n\t'(\\\\?[;&a-z\\\\d%_.~+=-]*)?' + // validate query string\n\t\t'(\\\\#[-a-z\\\\d_]*)?$',\n\t'i',\n);\n\nconst validateURL = (url: string) => {\n\tif (!url || url === '') return true;\n\treturn urlRegex.test(url) ? true : new Error('invalid url');\n};\n\nconst getEndpointStatusSeverity = (checking: boolean, valid?: boolean) => {\n\tif (checking) return 'info';\n\tif (valid === false) return 'error';\n\tif (valid === true) return 'success';\n};\n\nexport interface URLTextFieldProps\n\textends Partial<Omit<TextFieldProps, 'classes'>>,\n\t\tWithClasses<URLTextFieldClasses, {}> {\n\ttestButtonLabel?: string;\n\ttestingURL?: boolean;\n\ttestingUrlMessage?: string;\n\turlAccessible?: boolean;\n\turlAccessibleMessage?: string;\n\turlInaccessibleMessage?: string;\n\tonTestURL?: () => void;\n}\n\nexport const URLTextFieldPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tURLTextFieldProps\n>(\n\t(\n\t\t{\n\t\t\tclasses: _classes,\n\t\t\tclassName,\n\t\t\tchanged,\n\t\t\tformFieldOptions,\n\t\t\treadOnly,\n\t\t\ttestButtonLabel,\n\t\t\ttestingURL,\n\t\t\ttestingUrlMessage,\n\t\t\turlAccessible,\n\t\t\turlAccessibleMessage,\n\t\t\turlInaccessibleMessage,\n\t\t\tvalue,\n\t\t\tonTestURL,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tvalue = value\n\t\t\t? !readOnly\n\t\t\t\t? value.replace(/^http(s)?:\\/\\//, '')\n\t\t\t\t: value\n\t\t\t: '';\n\n\t\tconst isValid = validateURL(value);\n\n\t\tconst ownerState: URLTextFieldOwnerState = {\n\t\t\tclasses: _classes,\n\t\t\tclassName,\n\t\t\tinvalid: urlAccessible === false,\n\t\t\tvalid: urlAccessible === true,\n\t\t};\n\n\t\tconst classes = useUtilityClasses(ownerState);\n\n\t\tconst getEndpointStatusLabel = () => {\n\t\t\tif (testingURL)\n\t\t\t\treturn testingUrlMessage || URL_TEXT_FIELD_MESSAGES.TESTING;\n\t\t\tif (urlAccessible === false)\n\t\t\t\treturn urlInaccessibleMessage || URL_TEXT_FIELD_MESSAGES.INACCESSIBLE;\n\t\t\tif (urlAccessible === true)\n\t\t\t\treturn urlAccessibleMessage || URL_TEXT_FIELD_MESSAGES.ACCESSIBLE;\n\t\t};\n\n\t\treturn (\n\t\t\t<URLTextFieldRoot className={clsx(classes.root, className)}>\n\t\t\t\t<TextField\n\t\t\t\t\tlabel={URL_TEXT_FIELD_LABEL.NAME}\n\t\t\t\t\tname=\"url\"\n\t\t\t\t\t{...props}\n\t\t\t\t\tref={ref}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tformFieldOptions={{\n\t\t\t\t\t\t...formFieldOptions,\n\t\t\t\t\t\thasChanged: (value, originalValue) => {\n\t\t\t\t\t\t\treturn value !== originalValue.replace(/^http(s)?:\\/\\//, '');\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvalidator: async (value) => {\n\t\t\t\t\t\t\tconst result = validateURL(value);\n\t\t\t\t\t\t\tif (result !== true) return result;\n\t\t\t\t\t\t\treturn formFieldOptions?.validator\n\t\t\t\t\t\t\t\t? formFieldOptions?.validator(value)\n\t\t\t\t\t\t\t\t: true;\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tInputProps={{\n\t\t\t\t\t\tendAdornment: onTestURL ? (\n\t\t\t\t\t\t\t<URLTextFieldInputAddon className={classes.endAdornment}>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tdata-testid=\"url-text-field-test\"\n\t\t\t\t\t\t\t\t\tdisabled={testingURL || !isValid}\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t\t\t\tonClick={() => onTestURL()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{testButtonLabel || URL_TEXT_FIELD_ACTION_LABEL.TEST}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</URLTextFieldInputAddon>\n\t\t\t\t\t\t) : undefined,\n\n\t\t\t\t\t\tstartAdornment: !readOnly ? (\n\t\t\t\t\t\t\t<InputAdornment position=\"start\" disablePointerEvents>\n\t\t\t\t\t\t\t\thttps://\n\t\t\t\t\t\t\t</InputAdornment>\n\t\t\t\t\t\t) : undefined,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t{(!changed && testingURL) || urlAccessible != null ? (\n\t\t\t\t\t<URLTextFieldStatus\n\t\t\t\t\t\tclassName={classes.status}\n\t\t\t\t\t\tseverity={getEndpointStatusSeverity(\n\t\t\t\t\t\t\ttestingURL === true,\n\t\t\t\t\t\t\turlAccessible,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tvariant=\"outlined\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{getEndpointStatusLabel()}\n\t\t\t\t\t</URLTextFieldStatus>\n\t\t\t\t) : null}\n\t\t\t</URLTextFieldRoot>\n\t\t);\n\t},\n);\n\nexport const URLTextField = URLTextFieldPrimitive;\n\nexport default URLTextField;\n","import React from 'react';\n\nimport {\n\tURLTextField,\n\tURLTextFieldProps,\n} from '@netx/core-components/URLTextField';\n\nexport interface CustomActionEndpointProps extends Partial<URLTextFieldProps> {\n\tcustomActionId?: number;\n}\n\nexport const CustomActionEndpointPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\tcustomActionId,\n\t...props\n}: CustomActionEndpointProps) => {\n\treturn <URLTextField {...props} />;\n};\n\nexport const CustomActionEndpoint = CustomActionEndpointPrimitive;\n\nexport default CustomActionEndpoint;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport type {CustomActionID} from '../types';\n\n/**\n * `deleteCustomAction` request params\n * (what is used to send to server)\n */\nexport type DeleteCustomActionRequestOptions = {\n\tid: CustomActionID;\n};\n\n/**\n * `deleteCustomAction` request\n * (what gets sent to the server)\n */\nexport type DeleteCustomActionRequest = [\n\tDeleteCustomActionRequestOptions['id'],\n];\n\n/**\n * `deleteCustomAction` response\n * (what comes back from the server)\n */\nexport type DeleteCustomActionResponse = SuccessResponse<\n\tDeleteCustomActionResult\n>;\n\n/**\n * `deleteCustomAction` result\n * (what is utilized from the server response)\n */\nexport type DeleteCustomActionResult = CustomActionID; // TODO: java code says it responds with just `DTO`\n\nexport const deleteCustomActionEndpoint = 'deleteCustomAction';\n\n/**\n * Delete custom action\n */\nexport const deleteCustomAction = async (\n\t{id}: DeleteCustomActionRequestOptions,\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: DeleteCustomActionRequest = [id];\n\n\treturn client\n\t\t.post<DeleteCustomActionResponse>(\n\t\t\tdeleteCustomActionEndpoint,\n\t\t\trequestParams,\n\t\t\t{signal},\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default deleteCustomAction;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport type {CustomActionMenus} from '../types';\n\n/**\n * `getCustomActionMenu` request params\n * (what is used to send to server)\n */\nexport type GetCustomActionMenuRequestOptions = {};\n\n/**\n * `getCustomActionMenu` request\n * (what gets sent to the server)\n */\nexport type GetCustomActionMenuRequest = [];\n\n/**\n * `getCustomActionMenu` response\n * (what comes back from the server)\n */\nexport type GetCustomActionMenuResponse = SuccessResponse<\n\tGetCustomActionMenuResult\n>;\n\n/**\n * `getCustomActionMenu` result\n * (what is utilized from the server response)\n */\nexport type GetCustomActionMenuResult = CustomActionMenus;\n\nexport const getCustomActionMenuEndpoint = 'getCustomActionMenu';\n\n/**\n * Get custom action menus for user\n */\nexport const getCustomActionMenu = async (\n\tparams: GetCustomActionMenuRequestOptions = {},\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetCustomActionMenuRequest = [];\n\n\treturn client\n\t\t.post<GetCustomActionMenuResponse>(\n\t\t\tgetCustomActionMenuEndpoint,\n\t\t\trequestParams,\n\t\t\t{signal},\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default getCustomActionMenu;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport type {SetNonNullable} from 'type-fest';\nimport {SortOrder} from '@netx/core/types';\nimport {SORT_ORDER} from '@netx/core/constants';\nexport {SORT_ORDER} from '@netx/core/constants';\nimport {\n\tCUSTOM_ACTION_LIST_PAGE_SIZE,\n\tCUSTOM_ACTIONS_SORTABLE_FIELDS,\n\tCustomActionField,\n} from '../constants';\nexport {CUSTOM_ACTIONS_SORTABLE_FIELDS} from '../constants';\nimport type {CustomAction} from '../types';\n\nexport const GET_CUSTOM_ACTIONS_FILTERABLE_FIELDS = [\n\tCustomActionField.ENABLED,\n\tCustomActionField.NAME,\n\tCustomActionField.PAYLOAD_URL,\n\tCustomActionField.TARGET_URL,\n];\nexport type GetCustomActionsFilter = {\n\t// TODO: this was a mistake to request - should match the key on the DTO: `enabled`\n\tisEnabled: boolean | null;\n\t[CustomActionField.NAME]: string | null;\n\t[CustomActionField.PAYLOAD_URL]: string | null;\n\t[CustomActionField.TARGET_URL]: string | null;\n};\nexport const getCustomActionsDefaultFilters = (\n\tfilters: Partial<GetCustomActionsFilter> = {},\n): GetCustomActionsFilter => ({\n\tisEnabled: filters.isEnabled != null ? filters.isEnabled : null,\n\tname: filters.name != null ? filters.name : null,\n\tpayloadUrl: filters.payloadUrl != null ? filters.payloadUrl : null,\n\ttargetUrl: filters.targetUrl != null ? filters.targetUrl : null,\n});\n\nexport const GET_CUSTOM_ACTIONS_DEFAULT_SORT_FIELD = CustomActionField.NAME;\nexport const GET_CUSTOM_ACTIONS_DEFAULT_SORT_ORDER = SORT_ORDER.ASCENDING;\nexport type GetCustomActionsSortableField = typeof CUSTOM_ACTIONS_SORTABLE_FIELDS[number];\nexport type GetCustomActionsSort = {\n\tfield: GetCustomActionsSortableField | null;\n\torder: SortOrder | null;\n};\nexport const getCustomActionsDefaultSort = (\n\tsort: Partial<GetCustomActionsSort> = {},\n): SetNonNullable<GetCustomActionsSort> => ({\n\tfield: getWebooksSortField(sort.field),\n\torder: getWebooksSortOrder(sort.order),\n});\n\nexport const getWebooksSortField = (\n\tsortField?: string | null,\n): GetCustomActionsSortableField =>\n\tCUSTOM_ACTIONS_SORTABLE_FIELDS.includes(sortField as any)\n\t\t? (sortField as GetCustomActionsSortableField)\n\t\t: GET_CUSTOM_ACTIONS_DEFAULT_SORT_FIELD;\n\nexport const getWebooksSortOrder = (sortOrder?: string | null): SortOrder =>\n\tObject.values(SORT_ORDER).includes(sortOrder as any)\n\t\t? (sortOrder as SortOrder)\n\t\t: GET_CUSTOM_ACTIONS_DEFAULT_SORT_ORDER;\n\n/**\n * `getCustomActions` request params\n * (what is used to send to server)\n */\nexport type GetCustomActionsRequestOptions = {\n\tfilters?: Partial<GetCustomActionsFilter>;\n\tsort?: Partial<GetCustomActionsSort>;\n\tstartIndex?: number;\n\tstopIndex?: number;\n};\n\n/**\n * `getCustomActions` request\n * (what gets sent to the server)\n */\nexport type GetCustomActionsRequest = [\n\tGetCustomActionsFilter,\n\tSetNonNullable<GetCustomActionsSort>,\n\t{\n\t\tstartIndex: number;\n\t\tsize: number;\n\t},\n];\n\n/**\n * `getCustomActions` response\n * (what comes back from the server)\n */\nexport type GetCustomActionsResponse = SuccessResponse<GetCustomActionsResult>;\n\n/**\n * `getCustomActions` result\n * (what is utilized from the server response)\n */\nexport type GetCustomActionsResult = {\n\tresults: CustomAction[];\n\tsize: number;\n\tstartIndex: number;\n};\n\nexport const getCustomActionsEndpoint = 'getCustomActions';\n\n/**\n * Get custom actions\n */\nexport const getCustomActions = async (\n\t{\n\t\tfilters,\n\t\tsort,\n\t\tstartIndex = 0,\n\t\tstopIndex = CUSTOM_ACTION_LIST_PAGE_SIZE,\n\t}: GetCustomActionsRequestOptions = {},\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetCustomActionsRequest = [\n\t\tgetCustomActionsDefaultFilters(filters),\n\t\tgetCustomActionsDefaultSort(sort),\n\t\t{\n\t\t\tstartIndex,\n\t\t\tsize: stopIndex - startIndex,\n\t\t},\n\t];\n\n\treturn client\n\t\t.post<GetCustomActionsResponse>(getCustomActionsEndpoint, requestParams, {\n\t\t\tsignal,\n\t\t})\n\t\t.then((response) => {\n\t\t\tconst {results, size, startIndex} = response.data.result;\n\t\t\treturn {\n\t\t\t\tresults: results.map((result) => ({\n\t\t\t\t\t...result,\n\t\t\t\t\tid: result.customActionId,\n\t\t\t\t})),\n\t\t\t\tsize,\n\t\t\t\tstartIndex,\n\t\t\t} as GetCustomActionsResult;\n\t\t});\n};\n\nexport default getCustomActions;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport type {CustomActionID} from '../types';\n\n/**\n * `isCustomActionEndpointUrlAccessible` request params\n * (what is used to send to server)\n */\nexport type IsCustomActionEndpointUrlAccessibleRequestOptions = {\n\tid: CustomActionID;\n};\n\n/**\n * `isCustomActionEndpointUrlAccessible` request\n * (what gets sent to the server)\n */\nexport type IsCustomActionEndpointUrlAccessibleRequest = [\n\tIsCustomActionEndpointUrlAccessibleRequestOptions['id'],\n];\n\n/**\n * `isCustomActionEndpointUrlAccessible` response\n * (what comes back from the server)\n */\nexport type IsCustomActionEndpointUrlAccessibleResponse = SuccessResponse<\n\tIsCustomActionEndpointUrlAccessibleResult\n>;\n\n/**\n * `isCustomActionEndpointUrlAccessible` result\n * (what is utilized from the server response)\n */\nexport type IsCustomActionEndpointUrlAccessibleResult = boolean;\n\nexport const isCustomActionEndpointUrlAccessibleEndpoint =\n\t'isCustomActionEndpointUrlAccessible';\n\n/**\n * Test custom action endpoint\n */\nexport const isCustomActionEndpointUrlAccessible = async (\n\t{id}: IsCustomActionEndpointUrlAccessibleRequestOptions,\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: IsCustomActionEndpointUrlAccessibleRequest = [id];\n\n\treturn client\n\t\t.post<IsCustomActionEndpointUrlAccessibleResponse>(\n\t\t\tisCustomActionEndpointUrlAccessibleEndpoint,\n\t\t\trequestParams,\n\t\t\t{signal},\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default isCustomActionEndpointUrlAccessible;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport type {CustomActionID} from '../types';\n\n/**\n * `resetCustomActionSecret` request params\n * (what is used to send to server)\n */\nexport type ResetCustomActionSecretRequestOptions = {\n\tid: CustomActionID;\n};\n\n/**\n * `resetCustomActionSecret` request\n * (what gets sent to the server)\n */\nexport type ResetCustomActionSecretRequest = [\n\tResetCustomActionSecretRequestOptions['id'],\n];\n\n/**\n * `resetCustomActionSecret` response\n * (what comes back from the server)\n */\nexport type ResetCustomActionSecretResponse = SuccessResponse<\n\tResetCustomActionSecretResult\n>;\n\n/**\n * `resetCustomActionSecret` result\n * (what is utilized from the server response)\n */\nexport type ResetCustomActionSecretResult = string;\n\nexport const resetCustomActionSecretEndpoint = 'resetCustomActionSecret';\n\n/**\n * Reset custom action secret\n */\nexport const resetCustomActionSecret = async (\n\t{id}: ResetCustomActionSecretRequestOptions,\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: ResetCustomActionSecretRequest = [id];\n\n\treturn client\n\t\t.post<ResetCustomActionSecretResponse>(\n\t\t\tresetCustomActionSecretEndpoint,\n\t\t\trequestParams,\n\t\t\t{signal},\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default resetCustomActionSecret;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport type {SetOptional} from 'type-fest';\nimport {enforceHttpsUrlString} from '@netx/core/utils';\nimport {getCorrectedUserSelector} from '@netx/core-user/utils';\nimport type {CustomAction} from '../types';\n\n/**\n * `setCustomAction` request params\n * (what is used to send to server)\n */\nexport type SetCustomActionRequestOptions = SetOptional<\n\tCustomAction,\n\t'id' | 'customActionId'\n>;\n\n/**\n * `setCustomAction` request\n * (what gets sent to the server)\n */\nexport type SetCustomActionRequest = [SetCustomActionRequestOptions];\n\n/**\n * `setCustomAction` response\n * (what comes back from the server)\n */\nexport type SetCustomActionResponse = SuccessResponse<SetCustomActionResult>;\n\n/**\n * `setCustomAction` result\n * (what is utilized from the server response)\n */\nexport type SetCustomActionResult = CustomAction;\n\nexport const setCustomActionEndpoint = 'setCustomAction';\n\n/**\n * Create/update custom action\n */\nexport const setCustomAction = async (\n\tcustomAction: SetCustomActionRequestOptions,\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst {targetUrl, payloadUrl, userSelector, ...rest} = customAction;\n\tconst {userSelectorId, ...restUserSelector} = userSelector;\n\tif (userSelectorId && userSelectorId > -1)\n\t\t(restUserSelector as any).userSelectorId = userSelectorId;\n\n\tconst requestParams: SetCustomActionRequest = [\n\t\t{\n\t\t\t...rest,\n\t\t\tpayloadUrl: enforceHttpsUrlString(payloadUrl),\n\t\t\ttargetUrl: enforceHttpsUrlString(targetUrl),\n\t\t\tuserSelector: getCorrectedUserSelector(restUserSelector),\n\t\t},\n\t];\n\n\treturn client\n\t\t.post<SetCustomActionResponse>(setCustomActionEndpoint, requestParams, {\n\t\t\tsignal,\n\t\t})\n\t\t.then((response) => {\n\t\t\treturn {\n\t\t\t\t...response.data.result,\n\t\t\t\tid: response.data.result.customActionId,\n\t\t\t};\n\t\t});\n};\n\nexport default setCustomAction;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport {BatchJobId as UUID} from '@netx/core-app/models/batchJob';\nimport {CustomActionPayloadType} from '../constants';\nimport type {CustomActionID} from '../types';\n\n/**\n * `triggerCustomAction` request params\n * (what is used to send to server)\n */\nexport type TriggerCustomActionRequestOptions = {\n\tid: CustomActionID;\n\tdata: {\n\t\tpayload: CustomActionPayloadType;\n\t};\n};\n\n/**\n * `triggerCustomAction` request\n * (what gets sent to the server)\n */\nexport type TriggerCustomActionRequest = [\n\tTriggerCustomActionRequestOptions['id'],\n\tTriggerCustomActionRequestOptions['data'],\n];\n\n/**\n * `triggerCustomAction` response\n * (what comes back from the server)\n */\nexport type TriggerCustomActionResponse = SuccessResponse<\n\tTriggerCustomActionResult\n>;\n\n/**\n * `triggerCustomAction` result\n * (what is utilized from the server response)\n */\nexport type TriggerCustomActionResult = UUID;\n\nexport const triggerCustomActionEndpoint = 'triggerCustomAction';\n\n/**\n * Trigger custom action\n */\nexport const triggerCustomAction = async (\n\t{id, data}: TriggerCustomActionRequestOptions,\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: TriggerCustomActionRequest = [id, data];\n\n\treturn client\n\t\t.post<TriggerCustomActionResponse>(\n\t\t\ttriggerCustomActionEndpoint,\n\t\t\trequestParams,\n\t\t\t{signal},\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default triggerCustomAction;\n","import {useMutation, UseMutationOptions} from '@tanstack/react-query';\n\nimport {\n\tdeleteCustomAction,\n\tDeleteCustomActionResult,\n\tDeleteCustomActionRequestOptions,\n\tQueryError,\n} from '../deleteCustomAction';\nexport * from '../deleteCustomAction';\n\nexport const useReactQueryDeleteCustomAction = (\n\toptions?: Omit<\n\t\tUseMutationOptions<\n\t\t\tDeleteCustomActionResult,\n\t\t\tQueryError,\n\t\t\tDeleteCustomActionRequestOptions,\n\t\t\tDeleteCustomActionResult\n\t\t>,\n\t\t'mutationFn'\n\t>,\n) => {\n\treturn useMutation<\n\t\tDeleteCustomActionResult,\n\t\tQueryError,\n\t\tDeleteCustomActionRequestOptions,\n\t\tDeleteCustomActionResult\n\t>({\n\t\tmutationFn: deleteCustomAction,\n\t\t...options,\n\t});\n};\n\nexport default useReactQueryDeleteCustomAction;\n","import {\n\tuseQuery,\n\tQueryFunctionContext,\n\tUseQueryOptions,\n} from '@tanstack/react-query';\n\nimport {\n\tQueryError,\n\tGetCustomActionMenuResult,\n\tGetCustomActionMenuRequestOptions,\n\tgetCustomActionMenu,\n\tgetCustomActionMenuEndpoint,\n} from '../getCustomActionMenu';\nexport * from '../getCustomActionMenu';\n\ntype GetCustomActionMenusQueryKey = GetCustomActionMenuRequestOptions;\n\ntype ReactQueryOptions = Omit<\n\tUseQueryOptions<GetCustomActionMenuResult, QueryError>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * react-query wrapper for `getCustomActionMenu`\n * @param queryKeyParams\n * @param options\n */\nexport const useReactQueryGetCustomActionMenu = (\n\tqueryKeyParams?: GetCustomActionMenusQueryKey,\n\toptions?: ReactQueryOptions,\n) => {\n\tconst getCustomActionMenusQuery = useQuery<\n\t\tGetCustomActionMenuResult,\n\t\tQueryError\n\t>({\n\t\tqueryKey: [getCustomActionMenuEndpoint, queryKeyParams],\n\t\tqueryFn: ({\n\t\t\tqueryKey,\n\t\t}: QueryFunctionContext<[string, GetCustomActionMenusQueryKey]>) =>\n\t\t\tgetCustomActionMenu({...queryKey[1]}),\n\t\t...options,\n\t});\n\treturn getCustomActionMenusQuery;\n};\n\nexport default useReactQueryGetCustomActionMenu;\n","import {\n\tuseInfiniteQuery,\n\tQueryFunctionContext,\n\tUseInfiniteQueryOptions,\n\tInfiniteData,\n} from '@tanstack/react-query';\nimport {getNextPageParam} from '@netx/core-components/VirtualizedList/react-query';\nimport {\n\tQueryError,\n\tGetCustomActionsResult,\n\tGetCustomActionsRequestOptions,\n\tgetCustomActions,\n\tgetCustomActionsEndpoint,\n} from '../getCustomActions';\nexport * from '../getCustomActions';\n\nexport type GetCustomActionsResultInfiniteData = InfiniteData<\n\tGetCustomActionsResult\n>;\n\nexport type GetCustomActionsQueryParams = Omit<\n\tGetCustomActionsRequestOptions,\n\tkeyof GetCustomActionsPageParam\n>;\n\nexport type GetCustomActionsPageParam = {\n\tstartIndex: number;\n\tstopIndex: number;\n};\n\ntype ReactQueryOptions = Omit<\n\tUseInfiniteQueryOptions<GetCustomActionsResult, QueryError>,\n\t'queryKey' | 'queryFn'\n>;\n\nexport const GetCustomActionsReactQueryKey = getCustomActionsEndpoint;\n\n/**\n * react-query wrapper for `getCustomActions`\n * @param queryKeyParams\n * @param options\n */\nexport const useReactQueryGetCustomActions = (\n\tqueryKeyParams?: GetCustomActionsQueryParams,\n\toptions?: ReactQueryOptions,\n) => {\n\tconst getCustomActionsQuery = useInfiniteQuery<\n\t\tGetCustomActionsResult,\n\t\tQueryError\n\t>({\n\t\tqueryKey: [getCustomActionsEndpoint, queryKeyParams],\n\t\tqueryFn: ({\n\t\t\tqueryKey,\n\t\t\tpageParam,\n\t\t}: QueryFunctionContext<\n\t\t\t[string, GetCustomActionsQueryParams],\n\t\t\tGetCustomActionsPageParam\n\t\t>) => getCustomActions({...pageParam, ...queryKey[1]}),\n\t\t// getNextPageParam,\n\t\t...options,\n\t});\n\treturn getCustomActionsQuery;\n};\n\nexport default useReactQueryGetCustomActions;\n","import {\n\tuseQuery,\n\tQueryFunctionContext,\n\tUseQueryOptions,\n} from '@tanstack/react-query';\nimport {\n\tQueryError,\n\tIsCustomActionEndpointUrlAccessibleResult,\n\tIsCustomActionEndpointUrlAccessibleRequestOptions,\n\tisCustomActionEndpointUrlAccessible,\n\tisCustomActionEndpointUrlAccessibleEndpoint,\n} from '../isCustomActionEndpointUrlAccessible';\nexport * from '../isCustomActionEndpointUrlAccessible';\n\nexport type IsCustomActionEndpointUrlAccessiblesQueryParams = IsCustomActionEndpointUrlAccessibleRequestOptions;\n\ntype ReactQueryOptions = Omit<\n\tUseQueryOptions<IsCustomActionEndpointUrlAccessibleResult, QueryError>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * react-query wrapper for `isCustomActionEndpointUrlAccessible`\n * @param queryKeyParams\n * @param options\n */\nexport const useReactQueryIsCustomActionEndpointUrlAccessible = (\n\tqueryKeyParams: IsCustomActionEndpointUrlAccessiblesQueryParams,\n\toptions?: ReactQueryOptions,\n) => {\n\tconst isCustomActionEndpointUrlAccessiblesQuery = useQuery<\n\t\tIsCustomActionEndpointUrlAccessibleResult,\n\t\tQueryError\n\t>({\n\t\tqueryKey: [isCustomActionEndpointUrlAccessibleEndpoint, queryKeyParams],\n\t\tqueryFn: ({\n\t\t\tqueryKey,\n\t\t}: QueryFunctionContext<\n\t\t\t[string, IsCustomActionEndpointUrlAccessiblesQueryParams]\n\t\t>) => isCustomActionEndpointUrlAccessible({...queryKey[1]}),\n\t\t...options,\n\t});\n\treturn isCustomActionEndpointUrlAccessiblesQuery;\n};\n\nexport default useReactQueryIsCustomActionEndpointUrlAccessible;\n","import {useMutation, UseMutationOptions} from '@tanstack/react-query';\n\nimport {\n\tsetCustomAction,\n\tSetCustomActionResult,\n\tSetCustomActionRequestOptions,\n\tQueryError,\n} from '../setCustomAction';\nexport * from '../getCustomActionMenu';\n\nexport const useReactQuerySetCustomAction = (\n\toptions?: Omit<\n\t\tUseMutationOptions<\n\t\t\tSetCustomActionResult,\n\t\t\tQueryError,\n\t\t\tSetCustomActionRequestOptions,\n\t\t\tSetCustomActionResult\n\t\t>,\n\t\t'mutationFn'\n\t>,\n) => {\n\treturn useMutation<\n\t\tSetCustomActionResult,\n\t\tQueryError,\n\t\tSetCustomActionRequestOptions,\n\t\tSetCustomActionResult\n\t>({\n\t\tmutationFn: setCustomAction,\n\t\t...options,\n\t});\n};\n\nexport default useReactQuerySetCustomAction;\n","import {useEffect} from 'react';\nimport {useQueryClient} from '@tanstack/react-query';\nimport {\n\tisCustomActionEndpointUrlAccessibleEndpoint,\n\tuseReactQueryIsCustomActionEndpointUrlAccessible,\n} from '../api';\nimport type {CustomActionID} from '../types';\n\nexport type UseIsCustomActionEndpointUrlAccessibleParams = {\n\tid?: CustomActionID;\n};\n\nexport const useIsCustomActionEndpointUrlAccessible = ({\n\tid,\n}: UseIsCustomActionEndpointUrlAccessibleParams) => {\n\tconst query = useReactQueryIsCustomActionEndpointUrlAccessible(\n\t\t{id: id || -1},\n\t\t{\n\t\t\tenabled: false,\n\t\t\trefetchOnMount: false,\n\t\t\trefetchOnReconnect: false,\n\t\t\trefetchOnWindowFocus: false,\n\t\t\tretry: false,\n\t\t},\n\t);\n\n\tconst queryClient = useQueryClient();\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tquery.remove();\n\t\t\tqueryClient.invalidateQueries([\n\t\t\t\tisCustomActionEndpointUrlAccessibleEndpoint,\n\t\t\t\t{id},\n\t\t\t]);\n\t\t};\n\t}, [id]);\n\n\treturn {\n\t\terror: query.isError,\n\t\tchecking:\n\t\t\tquery.fetchStatus !== 'idle' && (query.isLoading || query.isFetching),\n\t\tvalid: !query.isError ? query.data : false,\n\t\tcheck: query.refetch,\n\t};\n};\n\nexport default useIsCustomActionEndpointUrlAccessible;\n","import React from 'react';\nimport type {SetOptional} from 'type-fest';\nimport {styled} from '@netx/core-components/Theme';\nimport {CustomActionField} from '../../constants';\nimport {useIsCustomActionEndpointUrlAccessible} from '../../hooks/useIsCustomActionEndpointUrlAccessible';\nimport {\n\tCUSTOM_ACTION_COLUMN_LABEL,\n\tCUSTOM_ACTION_LABEL,\n\tCUSTOM_ACTION_MESSAGE,\n} from '../../locales';\nimport type {CustomAction} from '../../types';\nimport {\n\tCustomActionEndpoint,\n\tCustomActionEndpointProps,\n} from '../CustomActionEndpoint';\n\nconst CustomActionEndpointPayloadUrlRoot = styled(\n\tCustomActionEndpoint,\n)(({theme}) => ({}));\n\nexport interface CustomActionEndpointPayloadUrlProps\n\textends CustomActionEndpointProps {}\n\nexport const CustomActionEndpointPayloadUrlPrimitive = ({\n\tchanged,\n\tcustomActionId,\n\t...props\n}: CustomActionEndpointPayloadUrlProps) => {\n\tconst {check, checking, valid} = useIsCustomActionEndpointUrlAccessible({\n\t\tid: customActionId,\n\t});\n\n\treturn (\n\t\t<CustomActionEndpointPayloadUrlRoot\n\t\t\tlabel={CUSTOM_ACTION_COLUMN_LABEL[CustomActionField.PAYLOAD_URL]}\n\t\t\tname={CustomActionField.PAYLOAD_URL}\n\t\t\trequired\n\t\t\t{...props}\n\t\t\t// for checking endpoint accessibility\n\t\t\ttestButtonLabel={CUSTOM_ACTION_LABEL.TEST_ENDPOINT_URL}\n\t\t\ttestingURL={checking}\n\t\t\ttestingUrlMessage={CUSTOM_ACTION_MESSAGE.CHECKING_ENDPOINT}\n\t\t\turlAccessible={valid}\n\t\t\turlAccessibleMessage={CUSTOM_ACTION_MESSAGE.ENDPOINT_ACCESSIBLE}\n\t\t\turlInaccessibleMessage={CUSTOM_ACTION_MESSAGE.ENDPOINT_INACCESSIBLE}\n\t\t\tonTestURL={!changed && customActionId != null ? check : undefined}\n\t\t/>\n\t);\n};\n\nexport const CustomActionEndpointPayloadUrl = CustomActionEndpointPayloadUrlPrimitive;\n\nexport default CustomActionEndpointPayloadUrl;\n","import React from 'react';\nimport type {SetOptional} from 'type-fest';\nimport {styled} from '@netx/core-components/Theme';\nimport {CustomActionField} from '../../constants';\nimport {CUSTOM_ACTION_COLUMN_LABEL} from '../../locales';\nimport type {CustomAction, CustomActionID} from '../../types';\nimport {\n\tCustomActionEndpoint,\n\tCustomActionEndpointProps,\n} from '../CustomActionEndpoint';\n\nconst CustomActionEndpointTargetUrlRoot = styled(\n\tCustomActionEndpoint,\n)(({theme}) => ({}));\n\nexport interface CustomActionEndpointTargetUrlProps\n\textends CustomActionEndpointProps {}\n\nexport const CustomActionEndpointTargetUrlPrimitive = ({\n\tcustomActionId,\n\tchanged,\n\tformFieldOptions,\n\t...props\n}: CustomActionEndpointTargetUrlProps) => {\n\treturn (\n\t\t<CustomActionEndpointTargetUrlRoot\n\t\t\tlabel={CUSTOM_ACTION_COLUMN_LABEL[CustomActionField.TARGET_URL]}\n\t\t\tname={CustomActionField.TARGET_URL}\n\t\t\t{...props}\n\t\t\tformFieldOptions={{\n\t\t\t\tvalidator: async (value) =>\n\t\t\t\t\t// `eventId` is reserved\n\t\t\t\t\tvalue.match(/(\\?|&)eventId=/)\n\t\t\t\t\t\t? new Error('invalid url')\n\t\t\t\t\t\t: formFieldOptions?.validator\n\t\t\t\t\t\t? formFieldOptions.validator(value)\n\t\t\t\t\t\t: true,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const CustomActionEndpointTargetUrl = CustomActionEndpointTargetUrlPrimitive;\n\nexport default CustomActionEndpointTargetUrl;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const CUSTOM_ACTION_CREATED_CLASS_NAME = 'CustomActionCreated';\nexport const CUSTOM_ACTION_CREATED_CLASS_SLOTS = ['root'] as const;\n\nexport type CustomActionCreatedClassSlot = typeof CUSTOM_ACTION_CREATED_CLASS_SLOTS[number];\n\nexport interface CustomActionCreatedClasses {\n\troot: string;\n}\n\nexport type CustomActionCreatedClassKey = keyof CustomActionCreatedClasses;\n\nexport const getCustomActionCreatedUtilityClass = (\n\tslot: CustomActionCreatedClassSlot,\n) => generateUtilityClass(CUSTOM_ACTION_CREATED_CLASS_NAME, slot);\n\nexport const customActionCreatedClasses = generateUtilityClasses<\n\tkeyof CustomActionCreatedClasses\n>(CUSTOM_ACTION_CREATED_CLASS_NAME, ['root']);\nexport default customActionCreatedClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {Alert} from '@netx/core-components/Alert';\nimport {ClipboardTextField} from '@netx/core-components/ClipboardTextField';\nimport {\n\tScrollBorder,\n\tscrollBorderClasses,\n} from '@netx/core-components/ScrollBorder';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {CustomActionField} from '../../constants';\nimport {CUSTOM_ACTION_LABEL, CUSTOM_ACTION_MESSAGE} from '../../locales';\nimport type {CustomAction} from '../../types';\nimport {\n\tCustomActionEndpointPayloadUrl,\n\tCustomActionEndpointTargetUrl,\n} from '../CustomActionEndpoint';\nimport {\n\tcustomActionCreatedClasses,\n\tgetCustomActionCreatedUtilityClass,\n\tCustomActionCreatedClasses,\n\tCUSTOM_ACTION_CREATED_CLASS_NAME,\n} from './customActionCreatedClasses';\n\nexport type CustomActionCreatedOwnerState = WithClasses<\n\tCustomActionCreatedClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: CustomActionCreatedOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getCustomActionCreatedUtilityClass, classes);\n};\n\nconst CustomActionCreatedRoot = styled('div', {\n\tname: CUSTOM_ACTION_CREATED_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\toverflow: 'hidden',\n}));\n\nconst CustomActionCreatedActions = styled('div')(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tpadding: theme.spacing(1, 2),\n\tmarginTop: theme.spacing(2),\n\tborderRadius: 8,\n\tborder: `1px solid ${theme.palette.custom.border}`,\n}));\n\nconst CustomActionCreatedAlert = styled(Alert)(({theme}) => ({\n\tmargin: theme.spacing(0, 2, 2, 2),\n}));\n\nconst CustomActionCreatedInputWrapper = styled('div')(({theme}) => ({\n\tmarginTop: theme.spacing(1),\n\tmarginBottom: theme.spacing(1),\n}));\n\nconst CustomActionCreatedContentWrapper = styled(ScrollBorder)(({theme}) => ({\n\t...theme.mixins.flexFillColumn,\n\t[`& .${scrollBorderClasses.scrollWrapper}`]: {\n\t\tpadding: theme.spacing(1, 2, 0, 2),\n\t},\n}));\n\nexport type CustomActionCreatedProps = WithClasses<\n\tCustomActionCreatedClasses,\n\t{\n\t\tcustomAction: Required<CustomAction>;\n\t}\n>;\n\nexport const CustomActionCreatedPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\tcustomAction,\n}: CustomActionCreatedProps) => {\n\tconst ownerState: CustomActionCreatedOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t<CustomActionCreatedRoot className={clsx(classes.root, className)}>\n\t\t\t<CustomActionCreatedAlert severity=\"warning\">\n\t\t\t\t{CUSTOM_ACTION_MESSAGE.SECRETE_MESSAGE}\n\t\t\t</CustomActionCreatedAlert>\n\n\t\t\t<CustomActionCreatedContentWrapper>\n\t\t\t\t<ClipboardTextField\n\t\t\t\t\tlabel={CUSTOM_ACTION_LABEL.SECRET}\n\t\t\t\t\tname=\"secret\"\n\t\t\t\t\tvalue={customAction.secret}\n\t\t\t\t/>\n\n\t\t\t\t<CustomActionCreatedActions>\n\t\t\t\t\t<CustomActionCreatedInputWrapper>\n\t\t\t\t\t\t<CustomActionEndpointPayloadUrl\n\t\t\t\t\t\t\tvalue={customAction[CustomActionField.PAYLOAD_URL]}\n\t\t\t\t\t\t\tcustomActionId={customAction.id}\n\t\t\t\t\t\t\treadOnly\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CustomActionCreatedInputWrapper>\n\n\t\t\t\t\t<CustomActionCreatedInputWrapper>\n\t\t\t\t\t\t<CustomActionEndpointTargetUrl\n\t\t\t\t\t\t\tvalue={customAction[CustomActionField.TARGET_URL]}\n\t\t\t\t\t\t\tcustomActionId={customAction.id}\n\t\t\t\t\t\t\treadOnly\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CustomActionCreatedInputWrapper>\n\t\t\t\t</CustomActionCreatedActions>\n\t\t\t</CustomActionCreatedContentWrapper>\n\t\t</CustomActionCreatedRoot>\n\t);\n};\n\nexport const CustomActionCreated = CustomActionCreatedPrimitive;\n\nexport default CustomActionCreated;\n","import React from 'react';\nimport {DialogActions} from '@mui/material';\nimport {faBolt} from '@fortawesome/pro-solid-svg-icons';\nimport {Dialog, WithDialogProps} from '@netx/core-components/Dialog';\nimport {styled} from '@netx/core-components/Theme';\nimport {CUSTOM_ACTION_ACTION_LABEL, CUSTOM_ACTION_TITLE} from '../../locales';\nimport {\n\tCustomActionCreated,\n\tCustomActionCreatedProps,\n} from './CustomActionCreated';\nimport SubmitButton from '@netx/core-components/SubmitButton';\n\nconst CustomActionCreatedDialogRoot = styled(Dialog)(({theme}) => ({}));\n\nconst CustomActionCreatedDialogActions = styled(DialogActions)(({theme}) => ({\n\tpadding: theme.spacing(2),\n}));\n\nconst CustomActionCreatedRoot = styled(CustomActionCreated)(({theme}) => ({\n\t// padding: theme.spacing(0, 2, 2, 2),\n}));\n\nconst CustomActionCreatedSubmitButton = styled(SubmitButton)(({theme}) => ({\n\t[theme.breakpoints.down('sm')]: {\n\t\twidth: '100%',\n\t},\n}));\n\nexport type CustomActionCreatedDialogProps = WithDialogProps<\n\tCustomActionCreatedProps\n>;\n\nexport const CustomActionCreatedDialogPrimitive = ({\n\topen,\n\tcustomAction,\n\tonClose,\n\tDialogProps,\n\t...props\n}: CustomActionCreatedDialogProps) => {\n\treturn (\n\t\t<CustomActionCreatedDialogRoot\n\t\t\tfullWidth\n\t\t\ticon={faBolt}\n\t\t\tmaxWidth=\"sm\"\n\t\t\topen={open}\n\t\t\ttitle={CUSTOM_ACTION_TITLE.CUSTOM_ACTION}\n\t\t\tsecondaryTitle={customAction.name}\n\t\t\t{...DialogProps}\n\t\t\tonClose={onClose}\n\t\t>\n\t\t\t<CustomActionCreatedRoot {...props} customAction={customAction} />\n\n\t\t\t<CustomActionCreatedDialogActions>\n\t\t\t\t<CustomActionCreatedSubmitButton\n\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\tlabel={CUSTOM_ACTION_ACTION_LABEL.DONE}\n\t\t\t\t\tonClick={() => onClose?.({}, 'escapeKeyDown')}\n\t\t\t\t/>\n\t\t\t</CustomActionCreatedDialogActions>\n\t\t</CustomActionCreatedDialogRoot>\n\t);\n};\n\nexport const CustomActionCreatedDialog = CustomActionCreatedDialogPrimitive;\n\nexport default CustomActionCreatedDialog;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const CUSTOM_ACTION_EDIT_ACCESS_CLASS_NAME = 'CustomActionEditAccess';\nexport const CUSTOM_ACTION_EDIT_ACCESS_CLASS_SLOTS = [\n\t'root',\n\t'label',\n\t'selector',\n] as const;\n\nexport type CustomActionEditAccessClassSlot = typeof CUSTOM_ACTION_EDIT_ACCESS_CLASS_SLOTS[number];\n\nexport interface CustomActionEditAccessClasses {\n\troot: string;\n\tlabel: string;\n\tselector: string;\n}\n\nexport type CustomActionEditAccessClassKey = keyof CustomActionEditAccessClasses;\n\nexport const getCustomActionEditAccessUtilityClass = (\n\tslot: CustomActionEditAccessClassSlot,\n) => generateUtilityClass(CUSTOM_ACTION_EDIT_ACCESS_CLASS_NAME, slot);\n\nexport const customActionEditAccessClasses = generateUtilityClasses<\n\tkeyof CustomActionEditAccessClasses\n>(CUSTOM_ACTION_EDIT_ACCESS_CLASS_NAME, ['root', 'label', 'selector']);\nexport default customActionEditAccessClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {Typography} from '@mui/material';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {\n\tUserSelector,\n\tUserSelectorProps,\n} from '@netx/core-user/components/UserSelector';\nimport {CUSTOM_ACTION_LABEL} from '../../locales';\nimport {\n\tcustomActionEditAccessClasses,\n\tgetCustomActionEditAccessUtilityClass,\n\tCustomActionEditAccessClasses,\n\tCUSTOM_ACTION_EDIT_ACCESS_CLASS_NAME,\n} from './customActionEditAccessClasses';\n\nexport type CustomActionEditAccessOwnerState = WithClasses<\n\tCustomActionEditAccessClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: CustomActionEditAccessOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getCustomActionEditAccessUtilityClass, classes);\n};\n\nconst CustomActionEditAccessRoot = styled('div', {\n\tname: CUSTOM_ACTION_EDIT_ACCESS_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({}));\n\nconst CustomActionEditAccessUserSelector = styled(UserSelector, {\n\tname: CUSTOM_ACTION_EDIT_ACCESS_CLASS_NAME,\n\tslot: 'Selector',\n})(({theme}) => ({\n\tborder: `1px solid ${theme.palette.custom.border}`,\n\tborderRadius: 8,\n\tmargin: theme.spacing(1, 0),\n}));\n\nconst CustomActionEditAccessLabel = styled(Typography, {\n\tname: CUSTOM_ACTION_EDIT_ACCESS_CLASS_NAME,\n\tslot: 'Label',\n})(({theme}) => ({\n\tmargin: theme.spacing(1, 0, 0, 1),\n}));\n\nexport type CustomActionEditAccessProps = Omit<UserSelectorProps, 'classes'> &\n\tWithClasses<CustomActionEditAccessClasses, {}>;\n\nexport const CustomActionEditAccessPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\tonChange,\n\t...props\n}: CustomActionEditAccessProps) => {\n\tconst ownerState: CustomActionEditAccessOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t<CustomActionEditAccessRoot className={clsx(classes.root, className)}>\n\t\t\t<CustomActionEditAccessLabel noWrap variant=\"body1\">\n\t\t\t\t{CUSTOM_ACTION_LABEL.ACCESS}\n\t\t\t</CustomActionEditAccessLabel>\n\n\t\t\t<CustomActionEditAccessUserSelector\n\t\t\t\t// must select something or we default to \"all\"\n\t\t\t\tdisableNone\n\t\t\t\t// groups only\n\t\t\t\tdisableUserSelection\n\t\t\t\t{...props}\n\t\t\t\tonChange={(userSelector) => {\n\t\t\t\t\tconst _userSelector = {...userSelector};\n\t\t\t\t\tif (_userSelector.none === true) {\n\t\t\t\t\t\t_userSelector.none = false;\n\t\t\t\t\t\t_userSelector.all = true;\n\t\t\t\t\t}\n\t\t\t\t\tonChange(_userSelector);\n\t\t\t\t}}\n\t\t\t/>\n\t\t</CustomActionEditAccessRoot>\n\t);\n};\n\nexport const CustomActionEditAccess = CustomActionEditAccessPrimitive;\n\nexport default CustomActionEditAccess;\n","import React, {useEffect} from 'react';\nimport type {SetOptional} from 'type-fest';\nimport {Checkbox, FormControlLabel} from '@mui/material';\nimport {\n\tgetInputFormObject,\n\tFormType,\n\tTextField,\n} from '@netx/core-components/Form';\nimport {\n\tScrollBorder,\n\tscrollBorderClasses,\n} from '@netx/core-components/ScrollBorder';\nimport {styled} from '@netx/core-components/Theme';\nimport {CustomActionField} from '../../constants';\nimport {CUSTOM_ACTION_COLUMN_LABEL, CUSTOM_ACTION_LABEL} from '../../locales';\nimport type {CustomAction, CustomActionFormData} from '../../types';\nimport {\n\tCustomActionEndpointPayloadUrl,\n\tCustomActionEndpointTargetUrl,\n} from '../CustomActionEndpoint';\nimport {CustomActionEditAccess} from '../CustomActionEditAccess';\n\nconst CustomActionFormRoot = styled('div')(({theme}) => ({\n\t...theme.mixins.flexFillColumn,\n\toverflow: 'hidden',\n}));\n\nconst CustomActionFormHeader = styled('div')(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tjustifyContent: 'flex-end',\n\twidth: '100%',\n}));\n\nconst CustomActionFormContent = styled(ScrollBorder)(({theme}) => ({\n\t...theme.mixins.flexFillColumn,\n\t[`& .${scrollBorderClasses.scrollWrapper}`]: {\n\t\tpadding: theme.spacing(0, 2),\n\t},\n}));\n\nconst CustomActionInputWrapper = styled('div')(({theme}) => ({\n\tmarginTop: theme.spacing(1),\n\tmarginBottom: theme.spacing(1),\n}));\n\nexport type CustomActionForm = FormType<CustomActionFormData>;\n\nexport interface CustomActionEditProps\n\textends React.DetailedHTMLProps<\n\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\tHTMLDivElement\n\t> {\n\tform: CustomActionForm;\n\tcustomAction?: SetOptional<Omit<CustomAction, 'secret'>, 'id'>;\n}\n\nexport const CustomActionEditPrimitive = ({\n\tform,\n\tcustomAction,\n\t...props\n}: CustomActionEditProps) => {\n\tconst inputForm = getInputFormObject(form);\n\n\tuseEffect(() => {\n\t\tconst unregisters = [\n\t\t\tform.register(CustomActionField.ENABLED),\n\t\t\tform.register(CustomActionField.USER_SELECTOR),\n\t\t];\n\t\treturn () => {\n\t\t\tunregisters.forEach((unregister) => unregister());\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t<CustomActionFormRoot {...props}>\n\t\t\t<CustomActionFormHeader>\n\t\t\t\t<FormControlLabel\n\t\t\t\t\tchecked={form.values[CustomActionField.ENABLED]}\n\t\t\t\t\tcontrol={<Checkbox />}\n\t\t\t\t\t// because why not just change the name of a thing in one context?\n\t\t\t\t\tlabel={CUSTOM_ACTION_LABEL.ENABLED}\n\t\t\t\t\tonChange={(event, checked) =>\n\t\t\t\t\t\tform.setValue(CustomActionField.ENABLED, checked)\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</CustomActionFormHeader>\n\n\t\t\t<CustomActionFormContent>\n\t\t\t\t<CustomActionInputWrapper>\n\t\t\t\t\t<TextField\n\t\t\t\t\t\tinputProps={{\n\t\t\t\t\t\t\tmaxLength: 25,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\terror={form.errors[CustomActionField.NAME]}\n\t\t\t\t\t\tform={inputForm}\n\t\t\t\t\t\thelperText={CUSTOM_ACTION_LABEL.NAME_HELP}\n\t\t\t\t\t\tlabel={CUSTOM_ACTION_COLUMN_LABEL[CustomActionField.NAME]}\n\t\t\t\t\t\tname={CustomActionField.NAME}\n\t\t\t\t\t\trequired\n\t\t\t\t\t\tvalue={form.values[CustomActionField.NAME]}\n\t\t\t\t\t/>\n\t\t\t\t</CustomActionInputWrapper>\n\n\t\t\t\t<CustomActionInputWrapper>\n\t\t\t\t\t<CustomActionEndpointPayloadUrl\n\t\t\t\t\t\tcustomActionId={customAction?.id}\n\t\t\t\t\t\tchanged={form.changes[CustomActionField.PAYLOAD_URL]}\n\t\t\t\t\t\terror={form.errors[CustomActionField.PAYLOAD_URL]}\n\t\t\t\t\t\tform={inputForm}\n\t\t\t\t\t\thelperText={CUSTOM_ACTION_LABEL.PAYLOAD_URL_HELP}\n\t\t\t\t\t\trequired\n\t\t\t\t\t\tvalue={form.values[CustomActionField.PAYLOAD_URL]}\n\t\t\t\t\t/>\n\t\t\t\t</CustomActionInputWrapper>\n\n\t\t\t\t<CustomActionInputWrapper>\n\t\t\t\t\t<CustomActionEndpointTargetUrl\n\t\t\t\t\t\tcustomActionId={customAction?.id}\n\t\t\t\t\t\tchanged={form.changes[CustomActionField.TARGET_URL]}\n\t\t\t\t\t\terror={form.errors[CustomActionField.TARGET_URL]}\n\t\t\t\t\t\tform={inputForm}\n\t\t\t\t\t\thelperText={CUSTOM_ACTION_LABEL.TARGET_URL_HELP}\n\t\t\t\t\t\tvalue={form.values[CustomActionField.TARGET_URL]}\n\t\t\t\t\t/>\n\t\t\t\t</CustomActionInputWrapper>\n\n\t\t\t\t<CustomActionEditAccess\n\t\t\t\t\tuserSelector={form.values.userSelector}\n\t\t\t\t\tonChange={(userSelector) =>\n\t\t\t\t\t\tform.setValue(CustomActionField.USER_SELECTOR, userSelector)\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</CustomActionFormContent>\n\t\t</CustomActionFormRoot>\n\t);\n};\n\nexport const CustomActionEdit = CustomActionEditPrimitive;\n\nexport default CustomActionEdit;\n","import React, {useEffect} from 'react';\nimport {faBolt} from '@fortawesome/pro-solid-svg-icons';\nimport {\n\tFormDialog,\n\tFormDialogProps,\n\tformDialogClasses,\n\tExtendFormDialogProps,\n} from '@netx/core-components/FormDialog';\nimport {useForm} from '@netx/core-components/Form';\nimport {styled} from '@netx/core-components/Theme';\nimport {CUSTOM_ACTION_DEFAULTS} from '../../constants';\nimport {CUSTOM_ACTION_ACTION_LABEL, CUSTOM_ACTION_TITLE} from '../../locales';\nimport type {CustomActionFormData} from '../../types';\nimport {CustomActionEdit, CustomActionEditProps} from './CustomActionEdit';\n\nconst CustomActionEditDialogRoot = styled(FormDialog)(({theme}) => ({\n\t[`& .${formDialogClasses.content}`]: {\n\t\tpadding: 0,\n\t},\n})) as (props: FormDialogProps<true, CustomActionFormData>) => JSX.Element;\n\nexport type CustomActionEditDialogProps = Omit<\n\tCustomActionEditProps,\n\t'form' | 'onSubmit'\n> &\n\tOmit<ExtendFormDialogProps<true, CustomActionFormData>, 'form'>;\n\nexport const CustomActionEditDialogPrimitive = ({\n\topen,\n\tcustomAction,\n\tonClose,\n\tonSubmit,\n\tDialogProps,\n\t...props\n}: CustomActionEditDialogProps) => {\n\tconst form = useForm<CustomActionFormData>(CUSTOM_ACTION_DEFAULTS, {\n\t\tremoveValueOnUnregister: false,\n\t});\n\n\tuseEffect(() => {\n\t\tform.reset({\n\t\t\t...CUSTOM_ACTION_DEFAULTS,\n\t\t\t...customAction,\n\t\t});\n\t}, [customAction]);\n\n\treturn (\n\t\t<CustomActionEditDialogRoot\n\t\t\tform={form}\n\t\t\ticon={faBolt}\n\t\t\tisValid={form.isValid}\n\t\t\topen={open}\n\t\t\trequiresChanges\n\t\t\ttitle={CUSTOM_ACTION_TITLE.CUSTOM_ACTION}\n\t\t\tsecondaryTitle={\n\t\t\t\tcustomAction?.id\n\t\t\t\t\t? CUSTOM_ACTION_TITLE.EDIT_CUSTOM_ACTION\n\t\t\t\t\t: CUSTOM_ACTION_TITLE.CREATE_CUSTOM_ACTION\n\t\t\t}\n\t\t\tonClose={onClose}\n\t\t\tonSubmit={onSubmit}\n\t\t\tconfirmLabel={\n\t\t\t\tcustomAction?.id\n\t\t\t\t\t? CUSTOM_ACTION_ACTION_LABEL.SAVE\n\t\t\t\t\t: CUSTOM_ACTION_ACTION_LABEL.CREATE\n\t\t\t}\n\t\t\t{...DialogProps}\n\t\t>\n\t\t\t<CustomActionEdit {...props} form={form} customAction={customAction} />\n\t\t</CustomActionEditDialogRoot>\n\t);\n};\n\nexport const CustomActionEditDialog = CustomActionEditDialogPrimitive;\n\nexport default CustomActionEditDialog;\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {QueryClientProvider} from '@tanstack/react-query';\nimport NiceModal from '@ebay/nice-modal-react';\nimport {useConfirmation} from '@netx/core-components/Confirmation';\nimport {withNiceModal} from '@netx/core-components/Dialog/withNiceModal';\nimport {queryClient} from '@netx/core/lib/next-query-client';\nimport {CustomActionCreatedDialog} from '../components/CustomActionCreated';\nimport {\n\tCustomActionEditDialog,\n\tCustomActionEditDialogProps,\n} from '../components/CustomActionEdit';\nimport {useCustomActions, UseCustomActionsParams} from '../hooks';\nimport {CUSTOM_ACTION_MESSAGE, CUSTOM_ACTION_TITLE} from '../locales';\nimport type {CustomActionID, CustomActionFormData} from '../types';\n\nconst CustomActionEditDialogNiceModal = withNiceModal(CustomActionEditDialog);\nconst CustomActionCreatedDialogNiceModal = withNiceModal(\n\tCustomActionCreatedDialog,\n);\n\nexport type CustomActionsContextType = Omit<\n\tReturnType<typeof useCustomActions>,\n\t'create' | 'destroy' | 'resetSecret'\n> & {\n\tcreate: () => void;\n\tdestroy: (id: CustomActionID) => void;\n\tedit: (id: CustomActionID) => void;\n\tresetSecret: (id: CustomActionID) => void;\n};\n\nexport const CustomActionsContext = createContext<\n\tCustomActionsContextType | undefined\n>(undefined);\n\nexport const useCustomActionsProvider = () => {\n\tconst context = useContext(CustomActionsContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t'`useCustomActionsProvider` must be used within a `CustomActionsProvider`',\n\t\t);\n\t}\n\treturn context;\n};\n\nexport type CustomActionsProviderRef =\n\t| React.RefObject<CustomActionsContextType>\n\t| ((node: CustomActionsContextType) => void);\n\nexport type CustomActionsProviderChildrenProps = CustomActionsContextType;\n\nexport type CustomActionsProviderProps = UseCustomActionsParams & {\n\tref?: CustomActionsProviderRef;\n\tchildren:\n\t\t| React.ReactNode\n\t\t| ((props: CustomActionsProviderChildrenProps) => React.ReactNode);\n};\n\nconst CustomActionsProviderInner = (\n\t{children, ...props}: CustomActionsProviderProps,\n\tref: CustomActionsProviderRef,\n) => {\n\tconst customActions = useCustomActions(props);\n\tconst confirmation = useConfirmation();\n\n\tconst customActionsDataRef = useRef(customActions.data);\n\tcustomActionsDataRef.current = customActions.data;\n\n\tconst create = useCallback(() => edit(), []);\n\n\tconst destroy = useCallback((id: CustomActionID) => {\n\t\tconfirmation({\n\t\t\tdescription: CUSTOM_ACTION_MESSAGE.CONFIRM_DELETE,\n\t\t\ttitle: CUSTOM_ACTION_TITLE.CONFIRM_DELETE,\n\t\t}).then(() => {\n\t\t\tcustomActions.destroy(id);\n\t\t});\n\t}, []);\n\n\tconst resetSecret = useCallback((id: CustomActionID) => {\n\t\tconst customAction = customActions.getById(id);\n\t\tif (!customAction) return;\n\n\t\tconfirmation({\n\t\t\tdescription: CUSTOM_ACTION_MESSAGE.CONFIRM_REGENERATE,\n\t\t\ttitle: CUSTOM_ACTION_TITLE.CONFIRM_REGENERATE,\n\t\t}).then(() => {\n\t\t\tcustomActions.resetSecret(id).then((secret) => {\n\t\t\t\tNiceModal.show(CustomActionCreatedDialogNiceModal, {\n\t\t\t\t\tcustomAction: {...customAction, secret},\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}, []);\n\n\tconst edit = useCallback((id?: CustomActionID) => {\n\t\tconst customAction = id ? customActions.getById(id) : undefined;\n\n\t\tconst sendProps: CustomActionEditDialogProps = {\n\t\t\tcustomAction,\n\t\t\tonSubmit: async (values: CustomActionFormData) => {\n\t\t\t\tif (id) {\n\t\t\t\t\tawait customActions.update({...values, id});\n\t\t\t\t\tNiceModal.hide(CustomActionEditDialogNiceModal);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst fullCustomAction = await customActions.create(values);\n\t\t\t\tNiceModal.hide(CustomActionEditDialogNiceModal);\n\t\t\t\tNiceModal.show(CustomActionCreatedDialogNiceModal, {\n\t\t\t\t\tcustomAction: fullCustomAction,\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t\tNiceModal.show(CustomActionEditDialogNiceModal, sendProps);\n\t}, []);\n\n\tconst contextValues = useMemo(\n\t\t() => ({\n\t\t\t...customActions,\n\t\t\tcreate,\n\t\t\tdestroy,\n\t\t\tedit,\n\t\t\tresetSecret,\n\t\t}),\n\t\t[create, destroy, edit, resetSecret, customActions],\n\t);\n\n\tuseImperativeHandle(ref, () => contextValues, [contextValues]);\n\n\treturn (\n\t\t<CustomActionsContext.Provider value={contextValues}>\n\t\t\t<NiceModal.Provider>\n\t\t\t\t{typeof children === 'function' ? children(contextValues) : children}\n\t\t\t</NiceModal.Provider>\n\t\t</CustomActionsContext.Provider>\n\t);\n};\n\nexport const CustomActionsProviderPrimitive = observer(\n\tReact.forwardRef<CustomActionsContextType, CustomActionsProviderProps>(\n\t\tCustomActionsProviderInner,\n\t),\n);\n\n/**\n * CustomActions context provider\n * @example\n * <CustomActionsProvider ref={customActionsRef}>\n * \t...\n * </CustomActionsProvider>\n * @example\n * <CustomActionsProvider ref={customActionsRef}>\n * \t{(customActions) => (\n * \t\t...\n * \t)}\n * </CustomActionsProvider>\n */\nexport const CustomActionsProvider = React.forwardRef(\n\t(props: CustomActionsProviderProps, ref: CustomActionsProviderRef) => {\n\t\treturn (\n\t\t\t<QueryClientProvider client={queryClient}>\n\t\t\t\t<CustomActionsProviderPrimitive ref={ref} {...props} />\n\t\t\t</QueryClientProvider>\n\t\t);\n\t},\n);\n\nexport default CustomActionsProvider;\n","import {useCallback, useEffect, useState} from 'react';\nimport type {ReactAction} from '@netx/core/bootstrap';\nimport {actionsToOrderedActions} from '@netx/core/utils';\nimport {CUSTOM_ACTION_ACTION_ICON} from '../actions';\nimport {useCustomActionsProvider} from '../contexts';\nimport {\n\tcanDeleteCustomAction,\n\tcanEditCustomAction,\n\tcanRegenerateCustomActionSecret,\n} from '../enablers';\nimport {CUSTOM_ACTION_ACTION_LABEL} from '../locales';\nimport type {CustomAction} from '../types';\n\nexport type UseCustomActionActionsParams = {\n\tcustomAction?: CustomAction;\n};\n\n/**\n * Actions for custom actions\n */\nexport const useCustomActionActions = ({\n\tcustomAction,\n}: UseCustomActionActionsParams = {}) => {\n\tconst {destroy, edit, resetSecret} = useCustomActionsProvider();\n\n\tconst [actions, setActions] = useState<Array<ReactAction | ReactAction[]>>(\n\t\t[],\n\t);\n\n\tconst getActions = useCallback((customAction?: CustomAction) => {\n\t\tif (!customAction) return [];\n\n\t\tconst actions: Array<ReactAction> = [\n\t\t\t{\n\t\t\t\tlabel: CUSTOM_ACTION_ACTION_LABEL.EDIT,\n\t\t\t\ticon: CUSTOM_ACTION_ACTION_ICON.EDIT,\n\t\t\t\tenableTest: () => canEditCustomAction(customAction),\n\t\t\t\tcb: () => edit(customAction.id),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CUSTOM_ACTION_ACTION_LABEL.REGENERATE_SECRET,\n\t\t\t\ticon: CUSTOM_ACTION_ACTION_ICON.REGENERATE_SECRET,\n\t\t\t\tenableTest: () => canRegenerateCustomActionSecret(customAction),\n\t\t\t\tcb: () => resetSecret(customAction.id),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: CUSTOM_ACTION_ACTION_LABEL.DELETE,\n\t\t\t\ticon: CUSTOM_ACTION_ACTION_ICON.DELETE,\n\t\t\t\tenableTest: () => canDeleteCustomAction(customAction),\n\t\t\t\tgroup: 1,\n\t\t\t\tcb: () => destroy(customAction.id),\n\t\t\t},\n\t\t];\n\t\treturn actionsToOrderedActions(\n\t\t\tactions.filter((action) => action.enableTest?.(customAction) !== false),\n\t\t);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tsetActions(getActions(customAction));\n\t}, [customAction]);\n\n\treturn {\n\t\tactions,\n\t\tgetActions,\n\t};\n};\n\nexport default useCustomActionActions;\n","import React from 'react';\n\nimport {DialogActions, Typography} from '@mui/material';\nimport {Alert} from '@netx/core-components/Alert';\nimport Button from '@netx/core-components/Button';\nimport Dialog, {DialogProps} from '@netx/core-components/Dialog';\nimport {styled} from '@netx/core-components/Theme';\nimport {CUSTOM_ACTION_MESSAGE, CUSTOM_ACTION_LABEL} from '../../locales';\nimport type {UserCustomAction} from '../../types';\n\nconst CustomActionBlockingDialogActions = styled(DialogActions)(({theme}) => ({\n\tpadding: theme.spacing(2),\n}));\n\nexport type CustomActionBlockingDialogProps = Pick<\n\tDialogProps,\n\t'onClose' | 'open'\n> & {\n\tblocking?: boolean;\n\terrorMessage?: string;\n\tsuccessMessage?: string;\n\tuserCustomAction: UserCustomAction;\n\tDialogProps?: Partial<DialogProps>;\n};\n\nexport const CustomActionBlockingDialogPrimitive = ({\n\tblocking,\n\terrorMessage,\n\tsuccessMessage,\n\tuserCustomAction,\n\tonClose,\n\tDialogProps,\n\t...props\n}: CustomActionBlockingDialogProps) => {\n\treturn (\n\t\t<Dialog\n\t\t\ttitle={userCustomAction.name}\n\t\t\tisWorking={blocking}\n\t\t\tpreventBackdropClose\n\t\t\tfullWidth\n\t\t\tmaxWidth=\"sm\"\n\t\t\tonClose={blocking ? undefined : onClose}\n\t\t\t{...DialogProps}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div style={{padding: `0 24px ${blocking ? 24 : 0}px 24px`}}>\n\t\t\t\t{errorMessage || successMessage ? (\n\t\t\t\t\t<Alert severity={errorMessage ? 'error' : 'success'}>\n\t\t\t\t\t\t{errorMessage || successMessage}\n\t\t\t\t\t</Alert>\n\t\t\t\t) : (\n\t\t\t\t\t<Typography variant=\"body1\">\n\t\t\t\t\t\t{CUSTOM_ACTION_MESSAGE.PERFORMING_ACTION}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{!blocking ? (\n\t\t\t\t<CustomActionBlockingDialogActions>\n\t\t\t\t\t<Button variant=\"text\" onClick={() => onClose?.({}, 'escapeKeyDown')}>\n\t\t\t\t\t\t{CUSTOM_ACTION_LABEL.CLOSE}\n\t\t\t\t\t</Button>\n\t\t\t\t</CustomActionBlockingDialogActions>\n\t\t\t) : null}\n\t\t</Dialog>\n\t);\n};\n\nexport const CustomActionBlockingDialog = CustomActionBlockingDialogPrimitive;\n\nexport default CustomActionBlockingDialog;\n","import NiceModal from '@ebay/nice-modal-react';\nimport {appendQueryObjectToURL, spawnNewWindow} from '@netx/core/utils';\nimport {withNiceModal} from '@netx/core-components/Dialog/withNiceModal';\nimport {useDispatcher} from '@netx/core-components/hooks/useDispatcher';\nimport {triggerCustomAction, useReactQueryGetCustomActionMenu} from '../api';\nimport {CUSTOM_ACTION_EVENT} from '../actions';\nimport {CustomActionPayloadType} from '../constants';\nimport {CUSTOM_ACTION_MESSAGE} from '../locales';\nimport type {UserCustomAction} from '../types';\nimport {CustomActionBlockingDialog} from '../components/CustomActionBlockingDialog';\n\nconst CustomActionBlockingDialogNiceModal = withNiceModal(\n\tCustomActionBlockingDialog,\n);\n\n/**\n * Custom action menus for user\n */\nexport const useCustomActionMenus = () => {\n\t// const snackbar = useSnackbar();\n\n\tconst query = useReactQueryGetCustomActionMenu(undefined, {\n\t\trefetchOnWindowFocus: false,\n\t});\n\n\t// refetch when the actions update\n\tuseDispatcher(CUSTOM_ACTION_EVENT.UPDATED, () => {\n\t\tquery.refetch();\n\t});\n\n\t/**\n\t * Execute custom action\n\t * @param customAction\n\t */\n\tconst executeCustomAction = (customAction: UserCustomAction) => {\n\t\tNiceModal.show(CustomActionBlockingDialogNiceModal, {\n\t\t\tuserCustomAction: customAction,\n\t\t\tblocking: true,\n\t\t}).then(() => {\n\t\t\ttriggerCustomAction({\n\t\t\t\tid: customAction.customActionId,\n\t\t\t\tdata: {\n\t\t\t\t\tpayload: CustomActionPayloadType.CURRENT_SELECTION,\n\t\t\t\t},\n\t\t\t})\n\t\t\t\t.then((eventId) => {\n\t\t\t\t\tNiceModal.show(CustomActionBlockingDialogNiceModal, {\n\t\t\t\t\t\tsuccessMessage: CUSTOM_ACTION_MESSAGE.SUCCEEDED,\n\t\t\t\t\t\tuserCustomAction: customAction,\n\t\t\t\t\t\tblocking: false,\n\t\t\t\t\t});\n\t\t\t\t\tif (!customAction.targetUrl) return;\n\t\t\t\t\tspawnNewWindow(\n\t\t\t\t\t\tappendQueryObjectToURL(customAction.targetUrl, {\n\t\t\t\t\t\t\teventId,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.catch((ex) => {\n\t\t\t\t\tNiceModal.show(CustomActionBlockingDialogNiceModal, {\n\t\t\t\t\t\terrorMessage: CUSTOM_ACTION_MESSAGE.FAILED,\n\t\t\t\t\t\tuserCustomAction: customAction,\n\t\t\t\t\t\tblocking: false,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t});\n\t};\n\n\treturn {\n\t\tdata: query.data,\n\t\tloading: query.isLoading || query.isFetching,\n\t\texecuteCustomAction,\n\t};\n};\n\nexport default useCustomActionMenus;\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {useDebounce} from 'use-debounce';\nimport {dispatcher} from '@netx/core/bootstrap';\nimport {caseInsensitiveStringIncludes} from '@netx/core/utils';\nimport {useReactQueryUtils} from '@netx/core-components/VirtualizedList/hooks';\nimport {getIndexedResults} from '@netx/core-components/VirtualizedList/react-query';\nimport {resetCustomActionSecret} from '../api/resetCustomActionSecret';\nimport {\n\tgetCustomActionsDefaultFilters,\n\tgetCustomActionsDefaultSort,\n\tuseReactQueryGetCustomActions,\n\tuseReactQuerySetCustomAction,\n\tuseReactQueryDeleteCustomAction,\n\tGetCustomActionsFilter,\n\tGetCustomActionsReactQueryKey,\n\tGetCustomActionsQueryParams,\n\tGetCustomActionsSort,\n} from '../api';\nimport {CUSTOM_ACTION_EVENT} from '../actions';\nimport {CustomActionContextName, CustomActionField} from '../constants';\nimport type {CustomAction, CustomActionID} from '../types';\n\nexport type UseCustomActionsParams = {};\n\n// check if updated data effects the sort\nconst editEffectsOrder = ({\n\toriginalData,\n\tupdatedData,\n\tsort,\n}: {\n\toriginalData?: CustomAction;\n\tsort: GetCustomActionsSort;\n\tupdatedData: CustomAction;\n}) => {\n\tif (!originalData) return true;\n\tif (\n\t\tsort.field === CustomActionField.NAME &&\n\t\toriginalData.name.toLowerCase() !== updatedData.name.toLowerCase()\n\t)\n\t\treturn true;\n\treturn false;\n};\n\n// check if updated data removes us from the current filters\nconst editRemovesFromFilter = ({\n\toriginalData,\n\tupdatedData,\n\tfilters,\n}: {\n\tfilters: GetCustomActionsFilter;\n\toriginalData?: CustomAction;\n\tupdatedData: CustomAction;\n}) => {\n\tif (!originalData) return false;\n\n\tif (filters.isEnabled != null && originalData.enabled !== updatedData.enabled)\n\t\treturn true;\n\n\tconst textFields = ['name', 'payloadUrl', 'targetUrl'];\n\tfor (let i = 0, c = textFields.length; i < c; i++) {\n\t\tconst field = textFields[i];\n\t\tif (\n\t\t\tfilters[field] != null &&\n\t\t\t!caseInsensitiveStringIncludes(originalData[field], updatedData[field])\n\t\t)\n\t\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nexport const useCustomActions = (props: UseCustomActionsParams = {}) => {\n\tconst [dataReady, setDataReady] = useState(false);\n\tconst dataRef = useRef<CustomAction[]>([]);\n\n\tconst [filters, setFilters] = useState(getCustomActionsDefaultFilters());\n\tconst filtered = Object.values(filters).some((filter) => filter != null);\n\n\tconst [sort, setSort] = useState(getCustomActionsDefaultSort());\n\n\tconst [queryParams, setQueryParams] = useState<GetCustomActionsQueryParams>({\n\t\tfilters,\n\t\tsort,\n\t});\n\t// delay repeated requests\n\tconst [debouncedQueryParams] = useDebounce(queryParams, 200);\n\n\tuseEffect(() => {\n\t\tdataRef.current = [];\n\t\tsetDataReady(false);\n\t\tsetQueryParams({\n\t\t\tfilters,\n\t\t\tsort,\n\t\t});\n\t}, [filters, sort]);\n\n\tconst query = useReactQueryGetCustomActions(debouncedQueryParams, {\n\t\tenabled: true,\n\t\tkeepPreviousData: true,\n\t\trefetchOnReconnect: false,\n\t\trefetchOnWindowFocus: false,\n\t\tretry: false,\n\t\tonSuccess: () => setDataReady(true),\n\t});\n\n\tconst queryUtils = useReactQueryUtils(query, dataRef);\n\n\tconst editMutation = useReactQuerySetCustomAction({\n\t\tonSuccess: queryUtils.handleEditMutationSuccess<CustomAction>({\n\t\t\tqueryKey: GetCustomActionsReactQueryKey,\n\t\t\tcb: () => dispatcher.trigger(CUSTOM_ACTION_EVENT.UPDATED),\n\t\t\teditEffectsOrder: (params) => editEffectsOrder({...params, sort}),\n\t\t\teditRemovesFromFilter: (params) =>\n\t\t\t\teditRemovesFromFilter({...params, filters}),\n\t\t}),\n\t});\n\n\tconst deleteMutation = useReactQueryDeleteCustomAction({\n\t\tonSuccess: queryUtils.handleDeleteMutationSuccess({\n\t\t\tqueryKey: GetCustomActionsReactQueryKey,\n\t\t\tcb: () => dispatcher.trigger(CUSTOM_ACTION_EVENT.UPDATED),\n\t\t}),\n\t});\n\n\tconst create = useCallback(\n\t\tasync (\n\t\t\tdata: Omit<CustomAction, 'contextName' | 'customActionId' | 'id'>,\n\t\t) => {\n\t\t\treturn new Promise<Required<CustomAction>>((resolve, reject) => {\n\t\t\t\teditMutation.mutate(\n\t\t\t\t\t{...data, contextName: CustomActionContextName.CURRENT_SELECTION},\n\t\t\t\t\t{\n\t\t\t\t\t\tonError: reject,\n\t\t\t\t\t\tonSuccess: (customAction) => {\n\t\t\t\t\t\t\t// TODO: these aren't really \"secrets\" - in custom actions contexts\n\t\t\t\t\t\t\t// the user is allowed to both provide and retrieve this `secret`\n\t\t\t\t\t\t\t// in an edit screen. it is supposed to be arbitrary and utilized\n\t\t\t\t\t\t\t// solely by the 3rd party endpoint\n\t\t\t\t\t\t\t// in any event, since it is setup this way, lets set the secret\n\t\t\t\t\t\t\t// at creation automatically\n\t\t\t\t\t\t\tresetCustomActionSecret({id: customAction.id})\n\t\t\t\t\t\t\t\t.then((secret) => resolve({...customAction, secret}))\n\t\t\t\t\t\t\t\t.catch(reject);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\tconst destroy = useCallback(async (id: CustomActionID) => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdeleteMutation.mutate(\n\t\t\t\t{id},\n\t\t\t\t{\n\t\t\t\t\tonError: reject,\n\t\t\t\t\tonSuccess: resolve,\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}, []);\n\n\tconst getById = useCallback((id: CustomActionID) => {\n\t\treturn dataRef.current.find((customAction) => customAction?.id === id);\n\t}, []);\n\n\tconst resetSecret = useCallback(\n\t\t(id: CustomActionID) => resetCustomActionSecret({id}),\n\t\t[],\n\t);\n\n\tconst update = useCallback(\n\t\tasync (data: Omit<CustomAction, 'contextName' | 'customActionId'>) => {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\teditMutation.mutate(\n\t\t\t\t\t{\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\tcustomActionId: data.id,\n\t\t\t\t\t\tcontextName: CustomActionContextName.CURRENT_SELECTION,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonError: reject,\n\t\t\t\t\t\tonSuccess: resolve,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\tconst {data, total} = useMemo(() => {\n\t\tconst results = getIndexedResults(query.data);\n\t\tdataRef.current = results.data;\n\t\treturn results;\n\t}, [query.data, query.dataUpdatedAt]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tquery.remove();\n\t\t};\n\t}, []);\n\n\treturn {\n\t\tdata: dataReady ? data : [],\n\t\tdataReady, // query.isFetched && !query.isFetching,\n\t\terror: query.error,\n\t\tfilters,\n\t\tfiltered,\n\t\tsort,\n\t\ttotal,\n\t\tcreate,\n\t\tdestroy,\n\t\tgetById,\n\t\tresetSecret,\n\t\tsetFilters,\n\t\tsetSort,\n\t\tupdate,\n\t\t...queryUtils,\n\t\tloading: !dataReady,\n\t};\n};\n\nexport default useCustomActions;\n","import baseParser from '../parsers/base';\n\nexport const base = (value: any, truncateAt?: number) => {\n\tvalue = baseParser(value);\n\n\tif (Array.isArray(value)) value = value.join(', ');\n\n\t// React will not execute tags and will render the </> literally\n\t// if (typeof value === 'string') {\n\t// \tvalue = value.replace(/</g, '<').replace(/>/g, '>');\n\t// }\n\n\tif (value != null && truncateAt && value.length > truncateAt) {\n\t\tvalue = value.substr(0, truncateAt) + '...';\n\t}\n\n\treturn value;\n};\n\nexport default base;\n","import base from './base';\nimport {i18n} from '@netx/core/i18n';\nimport {assetExpirationToDateString} from '@netx/core-asset-expiration/utils/assetExpirationToDateString';\n\nimport {AttributeTemplate} from '../types';\n\nexport const date = (\n\tvalue: any,\n\t{name, system}: Pick<AttributeTemplate, 'name' | 'system'>,\n) => {\n\t// In all cases (currently), except one, we want `yyyy-mm-dd`\n\t// The dam will sometimes send us mm/dd/yyyy and we want to normalize this\n\t// except for `expirationDate` - which is a time and a time that we want to\n\t// show in a relative format\n\tif (system && name === 'expirationDate') {\n\t\tif (value) {\n\t\t\tvalue = `${i18n.t('i18n.expires')}: ${assetExpirationToDateString(\n\t\t\t\tvalue,\n\t\t\t)}`;\n\t\t}\n\t\treturn value === 0 ? '' : value;\n\t}\n\treturn base(value);\n};\n\nexport default date;\n","import base from './base';\n\nexport const multiSelect = (value: any) => base(value);\n\nexport default multiSelect;\n","import {AttributeTemplate} from '../types';\nimport {ATTRIBUTE_NUMBER_MAX_DECIMAL} from '../constants';\nimport {parseNumber} from '../validators/number';\nimport {bytes} from '@netx/core/lib/underscore-netx';\n\nimport base from './base';\nimport parser from '../parsers/number';\n\ntype Options = {\n\tnoLocale?: boolean;\n};\n\nexport const number = (\n\tvalue: any,\n\t{name, spec2, system}: Pick<AttributeTemplate, 'name' | 'spec2' | 'system'>,\n\topts: Options = {},\n) => {\n\tvalue = parser(value);\n\n\t// Do not parse into locale string\n\tconst noLocale = opts.noLocale === true;\n\tconst numberType = spec2;\n\tconst maxDecimal = ATTRIBUTE_NUMBER_MAX_DECIMAL[numberType] || 0;\n\n\tconst parse = (value: any) => {\n\t\tvalue = parseNumber(value);\n\n\t\t// `Unlimited` number type\n\t\tif (maxDecimal === Infinity) {\n\t\t\treturn noLocale\n\t\t\t\t? value.toString()\n\t\t\t\t: value.toLocaleString(undefined, {\n\t\t\t\t\t\tuseGrouping: false,\n\t\t\t\t\t\tmaximumFractionDigits: 20, // Maximum allowed by`toLocaleString`\n\t\t\t\t });\n\t\t} else {\n\t\t\treturn noLocale\n\t\t\t\t? value.toFixed(maxDecimal)\n\t\t\t\t: value.toLocaleString(undefined, {\n\t\t\t\t\t\tuseGrouping: false,\n\t\t\t\t\t\tminimumFractionDigits: maxDecimal,\n\t\t\t\t\t\tmaximumFractionDigits: maxDecimal,\n\t\t\t\t });\n\t\t}\n\t};\n\n\tif (system) {\n\t\t// Normalize\n\t\tswitch (name) {\n\t\t\tcase 'fileSize':\n\t\t\tcase 'fileSize2':\n\t\t\t\tvalue = bytes(value, true);\n\t\t\t\tbreak;\n\t\t}\n\t} else if (value != null) {\n\t\tvalue = Array.isArray(value) ? value.map(parse) : parse(value);\n\t}\n\n\treturn base(value);\n};\n\nexport default number;\n","import base from './base';\n\nexport const select = (value: any) => base(value);\n\nexport default select;\n","import multiSelect from './multi-select';\n\nexport const tag = (value: any) => multiSelect(value);\n\nexport default tag;\n","import tag from './tag';\n\nexport const semantic = (value: any) => tag(value);\n\nexport default semantic;\n","import tag from './tag';\n\nexport const tagVocab = (value: any) => tag(value);\n\nexport default tagVocab;\n","import base from './base';\n\nexport const text = (value: any) => base(value);\n\nexport default text;\n","import text from './text';\n\nexport const textarea = (value: any) => text(value);\n\nexport default textarea;\n","export * from './date';\nexport * from './multi-select';\nexport * from './number';\nexport * from './select';\nexport * from './semantic';\nexport * from './tag';\nexport * from './tag-vocab';\nexport * from './text';\nexport * from './textarea';\n\nimport date from './date';\nimport multiSelect from './multi-select';\nimport number from './number';\nimport select from './select';\nimport semantic from './semantic';\nimport tag from './tag';\nimport tag_vocab from './tag-vocab';\nimport text from './text';\nimport textarea from './textarea';\n\nimport {ATTRIBUTE_TYPE} from '../constants';\n\nexport default {\n\t[ATTRIBUTE_TYPE.DATE]: date,\n\t[ATTRIBUTE_TYPE.MULTISELECT]: multiSelect,\n\t[ATTRIBUTE_TYPE.NUMBER]: number,\n\t[ATTRIBUTE_TYPE.SELECT]: select,\n\t[ATTRIBUTE_TYPE.SEMANTIC]: semantic,\n\t[ATTRIBUTE_TYPE.TAG]: tag,\n\t[ATTRIBUTE_TYPE.TAG_VOCAB]: tag_vocab,\n\t[ATTRIBUTE_TYPE.TEXT]: text,\n\t[ATTRIBUTE_TYPE.TEXTAREA]: textarea,\n};\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {FormLabel} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {ChipSkeleton} from '@netx/core-components/Chip';\nimport ValueChip from '../ValueChip';\nimport {isEmptyValue} from '@netx/core-components/Form';\n\nimport type {CommonFieldPropsWithTextField} from '../../../';\n\ntype Value =\n\t| string\n\t| {\n\t\t\t[any_other_key: string]: any;\n\t\t\tlabel: string;\n\t };\n\nconst getLabels = (values?: Value[]): string[] => {\n\tif (!values) return [];\n\tif (!Array.isArray(values)) values = [values];\n\t// @ts-ignore\n\treturn values.map((value) => (value.label != null ? value.label : value));\n};\n\nconst readOnlyChipStyles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tmargin: 3,\n\t\t},\n\t});\n\nconst ReadOnlyChips = withStyles(readOnlyChipStyles)(\n\tReact.memo(\n\t\t({\n\t\t\tclasses,\n\t\t\tonSearch,\n\t\t\tvalues,\n\t\t}: WithStyles<typeof readOnlyChipStyles> & {\n\t\t\tonSearch?: (value: string) => void;\n\t\t\tvalues?: Value[];\n\t\t}) => {\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t{getLabels(values).map((label, index) => (\n\t\t\t\t\t\t<ValueChip\n\t\t\t\t\t\t\tkey={label}\n\t\t\t\t\t\t\tclassName={classes.root}\n\t\t\t\t\t\t\tonSearch={onSearch}\n\t\t\t\t\t\t\tvalue={label}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</>\n\t\t\t);\n\t\t},\n\t),\n);\n\nconst styles = ({mixins, palette, spacing}: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t\tmargin: spacing(0.75, 0),\n\t\t\tpadding: spacing(0, 1.75),\n\t\t\twidth: '100%',\n\t\t\t'&.disabled': {\n\t\t\t\t...mixins.disabled,\n\t\t\t},\n\t\t\t'&.pseudoValue': {\n\t\t\t\t'& $value': {\n\t\t\t\t\tcolor: palette.text.secondary,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&$limitHeightToContainer': {\n\t\t\t\tmaxHeight: '100%',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflexDirection: 'column',\n\t\t\t\t'& $label': {\n\t\t\t\t\tflex: '0 0 auto',\n\t\t\t\t},\n\t\t\t\t'& $value': {\n\t\t\t\t\t...mixins.scrollable,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlabel: {\n\t\t\t...mixins.readOnlyLabel,\n\t\t},\n\t\tlimitHeightToContainer: {},\n\t\tvalue: {\n\t\t\tdisplay: 'flex',\n\t\t\tflexWrap: 'wrap',\n\t\t\tmarginTop: spacing(0.5),\n\t\t},\n\t});\n\nexport interface ReadOnlyMultiSelectFieldProps\n\textends Omit<CommonFieldPropsWithTextField<string[]>, 'name' | 'onChange'> {\n\tlimitHeightToContainer?: boolean;\n}\n\nconst ReadOnlyMultiSelectField = ({\n\tclasses,\n\tdisabled,\n\tlabel,\n\tlimitHeightToContainer,\n\tloading,\n\tloadingValue,\n\tmultipleValues,\n\tonSearch,\n\tvalue,\n}: WithStyles<typeof styles> & ReadOnlyMultiSelectFieldProps) => {\n\tvalue = value == null ? [] : value;\n\tconst pseudoValue = isEmptyValue(value) || multipleValues;\n\n\tconst content = useMemo(() => {\n\t\tif (loading || loadingValue) return <ChipSkeleton count={3} />;\n\t\tif (multipleValues) return i18n.t('i18n.multipleValues');\n\t\tif (!value?.length) return '(none)';\n\t\treturn <ReadOnlyChips values={value} onSearch={onSearch} />;\n\t}, [loading, loadingValue, multipleValues, onSearch, value]);\n\n\tconst displayLabel = useMemo(() => {\n\t\tif (label == null || label === '') return null;\n\t\treturn (\n\t\t\t<FormLabel className={classes.label} title={label}>\n\t\t\t\t{label}\n\t\t\t</FormLabel>\n\t\t);\n\t}, [classes, label]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={clsx(classes.root, {\n\t\t\t\t[classes.limitHeightToContainer]: limitHeightToContainer,\n\t\t\t\tpseudoValue: pseudoValue,\n\t\t\t\tdisabled: disabled,\n\t\t\t})}\n\t\t>\n\t\t\t{displayLabel}\n\t\t\t<div className={classes.value}>{content}</div>\n\t\t</div>\n\t);\n};\n\nexport default withStyles(styles, {\n\tname: 'ReadOnlyMultiSelect',\n})(React.memo(ReadOnlyMultiSelectField));\n","import React from 'react';\n\nimport ReadOnlyTextField, {\n\tReadOnlyTextFieldProps,\n} from '../../../TextField/ReadOnlyTextField';\nimport {SelectFieldProps} from '../Select';\n\nexport type ReadOnlySelectFieldProps<T = any> = ReadOnlyTextFieldProps &\n\tPick<\n\t\tSelectFieldProps<T, false, true, false>,\n\t\t'labelKey' | 'AutocompleteProps'\n\t> & {};\n\nexport const ReadOnlySelectField = ({\n\tAutocompleteProps,\n\tlabelKey,\n\tvalue,\n\t...props\n}: ReadOnlySelectFieldProps) => {\n\treturn (\n\t\t<ReadOnlyTextField\n\t\t\t{...props}\n\t\t\tvalue={\n\t\t\t\tAutocompleteProps?.getOptionLabel\n\t\t\t\t\t? AutocompleteProps?.getOptionLabel(value)\n\t\t\t\t\t: typeof value === 'object' && labelKey != null\n\t\t\t\t\t? value[labelKey]\n\t\t\t\t\t: value\n\t\t\t}\n\t\t/>\n\t);\n};\n\nexport default ReadOnlySelectField;\n","import React from 'react';\n\n// TODO: address the fact that a container is expecting to be wrapped by a context that is expecting to be wrapped by this module's context\n// This information can be handled elsewhere (or this is a container in selection module)\n\nimport AttributeSets, {AttributeSetsProps} from '../../components/Sets';\nimport {useAttributeSetSelectionProvider} from '@netx/core-attribute-set-selection/context';\n\nexport type AttributeSetsContainerProps = Partial<\n\tOmit<AttributeSetsProps, 'sets' | 'attributeTemplates' | 'orderUpdated'>\n> & {\n\tinputForm: any;\n};\n\nexport const AttributeSetsContainer = (props: AttributeSetsContainerProps) => {\n\tconst attributeSetSelectionProvider = useAttributeSetSelectionProvider();\n\n\treturn (\n\t\t<AttributeSets\n\t\t\tsets={attributeSetSelectionProvider.attributeSetCtx.getByIds(\n\t\t\t\tattributeSetSelectionProvider.state.selected,\n\t\t\t)}\n\t\t\tsetsLoaded={attributeSetSelectionProvider.state.loaded}\n\t\t\tattributeTemplates={\n\t\t\t\tattributeSetSelectionProvider.state.attributeTemplates\n\t\t\t}\n\t\t\tids={attributeSetSelectionProvider.state.selected}\n\t\t\tlookupsAllowed={attributeSetSelectionProvider.state.lookupsAllowed}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nexport default AttributeSetsContainer;\n","import React, {createContext, useContext} from 'react';\n\nimport type {ArgumentsType} from '@netx/core/typings';\nimport {useVirtualizedListArrowTabTrap} from '../../hooks';\n\nexport type FocusTrapItemContextType = ReturnType<\n\ttypeof useVirtualizedListArrowTabTrap\n>;\n\nconst StoreContext = createContext<FocusTrapItemContextType | undefined>(\n\tundefined,\n);\n\nexport const useVirtualizedListArrowTabTrapProvider = () => {\n\tconst context = useContext(StoreContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t'`useVirtualizedListArrowTabTrapProvider` must be used within a `VirtualizedListArrowTabTrapProvider`',\n\t\t);\n\t}\n\treturn context;\n};\n\nexport type VirtualizedListArrowTabTrapProviderProps = React.PropsWithChildren<\n\tArgumentsType<typeof useVirtualizedListArrowTabTrap>[0]\n>;\n\nexport const VirtualizedListArrowTabTrapProvider = ({\n\tchildren,\n\t...props\n}: VirtualizedListArrowTabTrapProviderProps) => {\n\tconst virtualizedListArrowTabTrap = useVirtualizedListArrowTabTrap(props);\n\n\treturn (\n\t\t<StoreContext.Provider value={virtualizedListArrowTabTrap}>\n\t\t\t{children}\n\t\t</StoreContext.Provider>\n\t);\n};\n\nexport default VirtualizedListArrowTabTrapProvider;\n","// TODO: this file is only still here until we have time to port over the attribute selector\n// still in this asset module\n// If you are coming here for actual attribute utils, please see @netx/core-attribute/utils\nimport {attributes as attributesSingleton} from '@netx/core-asset/collections/singleton/attributes';\nimport type {AttributeTemplate} from '@netx/core-attribute/types';\nimport {SYSTEM_ATTRIBUTE_LABELS} from '@netx/core-attribute/locales';\n\nimport {i18n} from '@netx/core/i18n';\n\n// still used by video clips\n// avialble in the attribute context now\n/** Given an attribute id, will return the model attributes for that attribute */\nexport const getAttributeById = (id: number): AttributeTemplate => {\n\tconst attr = attributesSingleton.get(id);\n\treturn attr.attributes;\n};\n\n// still used in the non ported over attribute selector (the multiselector)\n// avialble in the attribute context now\nexport const getAttributeLabelFromId = (id: number) => {\n\tconst attr = attributesSingleton.get(id);\n\tif (!attr) return `!${id} unknown!`;\n\tif (!attr.get('system')) return attr.get('name');\n\treturn SYSTEM_ATTRIBUTE_LABELS[id] || i18n.t(`i18n.${attr.get('name')}`);\n};\n","export * from './context';\nexport {default as AttributeSetSelectionProvider} from './context';\n","import React from 'react';\n\nimport {Typography} from '@mui/material';\nimport type {BaseItemData, CellProps} from '../../types';\n\n/**\n * Display a `generic` formatted cell\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nexport const GenericCellPrimitive = <ItemData extends BaseItemData>({\n\tvalue,\n}: CellProps<ItemData>) => (\n\t<Typography variant=\"body2\" noWrap title={value}>\n\t\t{value}\n\t</Typography>\n);\n\nexport const GenericCell = React.memo(GenericCellPrimitive) as <\n\tItemData extends BaseItemData\n>(\n\tprops: CellProps<ItemData>,\n) => JSX.Element;\nexport default GenericCell;\n","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nmodule.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import {PermissionMatrixName} from '@netx/core-permissions/constants';\nimport {allows} from '@netx/core-permissions/utils';\nimport {currentUserMeetsUserLevel, UserLevel} from '@netx/core-user/utils';\nimport {Category} from '../../types';\n\nexport const canAddCategory = (category?: Category) => {\n\treturn (\n\t\tcurrentUserMeetsUserLevel(UserLevel.MANAGER) &&\n\t\t(!category || (category.recursivePermission && canEditCategory(category)))\n\t);\n};\n\nexport const canAddAssetsToCategory = (category?: Category) =>\n\t!!category &&\n\tcategory.categoryid !== 1 &&\n\tallows(category.permissionMatrix, PermissionMatrixName.ADD);\n\nexport const canCreatePdfFromCategory = (category?: Category) =>\n\t!!category &&\n\tcurrentUserMeetsUserLevel(UserLevel.CONSUMER) &&\n\tallows(category.permissionMatrix, PermissionMatrixName.DOWNLOAD);\n\nexport const canDeleteCategory = (category?: Category) =>\n\t!!category &&\n\tcurrentUserMeetsUserLevel(UserLevel.MANAGER) &&\n\tallows(category.permissionMatrix, PermissionMatrixName.DELETE);\n\nexport const canDownloadCategory = (category?: Category) =>\n\t!!category &&\n\tallows(category.permissionMatrix, PermissionMatrixName.DOWNLOAD);\n\nexport const canEditCategory = (category?: Category) =>\n\t!!category &&\n\tcurrentUserMeetsUserLevel(UserLevel.MANAGER) &&\n\tallows(category.permissionMatrix, PermissionMatrixName.MODIFY);\n\nexport const canImportToCategory = (category?: Category) =>\n\t!!category &&\n\tcategory.categoryid !== 1 &&\n\tcurrentUserMeetsUserLevel(UserLevel.IMPORTER) &&\n\tallows(category.permissionMatrix, PermissionMatrixName.ADD);\n","export let podTypes = {\n\t1: i18n.t('i18n.assetListFromCategories'),\n\t2: i18n.t('i18n.assetListFromSavedSearches'),\n\t3: i18n.t('i18n.assetListFromSavedCarts'),\n\t4: i18n.t('i18n.assetListFromCustomSearch'),\n\t5: i18n.t('i18n.recentCategories'),\n\t6: i18n.t('i18n.topKeywordTerms'),\n};\n\nexport let resultTypes = {\n\t1: 'assets',\n\t2: 'categories',\n\t3: 'labelValues',\n};\n\nexport let searchTypes = {\n\tlatestDocuments: i18n.t('i18n.latestDocuments'),\n\tlatestImages: i18n.t('i18n.latestImages'),\n\tlatestUploads: i18n.t('i18n.latestUploads'),\n\tlatestVideos: i18n.t('i18n.latestVideos'),\n\tmostViewed: i18n.t('i18n.mostViewed'),\n};\n\nexport default {\n\tpodTypes: podTypes,\n\tresultTypes: resultTypes,\n\tsearchTypes: searchTypes,\n};\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport UserSortView from '@netx/core-user/views/userSortView';\n\nimport {searchTypes} from '@netx/core-dashboard/properties/dashboard';\n\nclass AppGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = {\n\t\t\t'input [data-nx-control=\"slider\"]': 'sliding',\n\t\t\t'change [data-nx-control=\"slider\"]': 'sliding', // IE\n\t\t\t'click [data-nx-control=\"sliderMin\"]': 'sliderMin',\n\t\t\t'click [data-nx-control=\"sliderMax\"]': 'sliderMax',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.homepageTitle');\n\t\topts.i18nCountStr = opts.i18nCountStr || 'app:i18n.nAssets';\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.requireSync = opts.requireSync !== false;\n\t\tsuper(opts);\n\n\t\tthis.collectionList = opts.collectionList;\n\n\t\t// Hey, listen!\n\t\t// If the headerView depends on a list of asset collections\n\t\t// that list should be passed as the option 'collectionList'\n\t\tif (this.collectionList != null && this.collectionList.isCollection) {\n\t\t\tthis.listenToCollection = this.collectionList;\n\t\t}\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\t// TODO: wha?!\n\t\tthis.getHeaderTitle();\n\t\tsuper.preRender();\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$sort = this.$('.nx-sort');\n\t\tthis.$title = this.$('.nx-title');\n\t\tthis.$breadcrumb = this.$('.nx-breadcrumbs .crumb').last();\n\t\tthis.$slider = this.$el.find('[data-nx-control=\"slider\"]');\n\n\t\t// Check if we have a valid user before attaching a sort view\n\t\tif (Netx.getUserLevel() > 0 && this.$sort.length) {\n\t\t\tthis.userSortView && this.removeSubView(this.userSortView, true);\n\t\t\t// User sort view\n\t\t\tthis.userSortView = this.addSubView(\n\t\t\t\tnew UserSortView({\n\t\t\t\t\tel: this.$sort,\n\t\t\t\t\tmodel: this.model,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.$sort.append(this.userSortView.render().$el);\n\t\t\tthis.userSortView.show();\n\t\t}\n\t}\n\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\n\t\tconst collection = this.listenToCollection || this.collection;\n\t\t// Hey, listen!\n\t\treturn (\n\t\t\tthis\n\t\t\t\t// Update the header when a new fetch goes out\n\t\t\t\t.listenTo(collection, 'request:read', this.updateTitle)\n\t\t\t\t// Update the count in the header when models are added/removed\n\t\t\t\t.listenTo(\n\t\t\t\t\tcollection,\n\t\t\t\t\t'sync reset add remove',\n\t\t\t\t\t_.debounce(() => {\n\t\t\t\t\t\tthis.updateCount(collection.getTotal());\n\t\t\t\t\t\tconst usingDashboardSearchType =\n\t\t\t\t\t\t\tcollection.selection.filter(searchRule => {\n\t\t\t\t\t\t\t\tif (searchTypes[searchRule.get('elementValue1')] != null) {\n\t\t\t\t\t\t\t\t\treturn searchRule;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}) > 0;\n\t\t\t\t\t\t// If facets are being utilized or we have a dashboard advanced search type - we cannot save this\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tusingDashboardSearchType ||\n\t\t\t\t\t\t\t(collection.selection.searchFacets &&\n\t\t\t\t\t\t\t\tcollection.selection.searchFacets.selectedFacets().length)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.$el.addClass('cant-save');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.$el.removeClass('cant-save');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.render();\n\t\t\t\t\t}, 100),\n\t\t\t\t)\n\t\t\t\t// Update the count in the header when we get a count.\n\t\t\t\t.listenTo(collection, 'counted countUnknown', this.updateCount)\n\t\t);\n\t}\n\n\t/** @method */\n\tgetHeaderTitle() {\n\t\treturn this.headerTitle;\n\t}\n\n\t/** @override */\n\tunbindCollectionEvents() {\n\t\tsuper.unbindCollectionEvents();\n\n\t\t// If the headerView depends on a list of asset collections\n\t\t// that list should be passed as the option 'collectionList'\n\t\tif (\n\t\t\tthis.collectionList != null &&\n\t\t\tthis.collectionList.constructor.__isCollection__\n\t\t) {\n\t\t\tthis.stopListening(this.collectionList);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/** @method */\n\tupdateTitle() {\n\t\tconst title = this.getHeaderTitle();\n\t\tthis.$title && this.$title.html(title);\n\t\tthis.$breadcrumb && this.$breadcrumb.html(title);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Input/change event\n\t * @fires module:asset#asset:thumb:resize\n\t */\n\tsliding(e) {\n\t\tif (\n\t\t\tparseInt(e.currentTarget.value) !==\n\t\t\tparseInt(Netx.getPreference('assetList.thumbSize'))\n\t\t) {\n\t\t\tdispatcher.trigger('asset:thumb:resize', e.currentTarget.value);\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t * @fires module:asset#asset:thumb:resize\n\t */\n\tsliderMin() {\n\t\tthis.$slider.val(this.$slider.attr('min'));\n\t\tdispatcher.trigger('asset:thumb:resize', this.$slider.attr('min'));\n\t}\n\n\t/**\n\t * @method\n\t * @fires module:asset#asset:thumb:resize\n\t */\n\tsliderMax() {\n\t\tthis.$slider.val(this.$slider.attr('max'));\n\t\tdispatcher.trigger('asset:thumb:resize', this.$slider.attr('max'));\n\t}\n\n\t/**\n\t * @static\n\t * @type {string}\n\t */\n\tstatic get __name__() {\n\t\treturn 'AppGalleryHeaderView';\n\t}\n}\n\nexport default AppGalleryHeaderView;\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryHeaderView';\n\nimport {\n\tfaArrowCircleDown,\n\tfaHome,\n\tfaPencilAlt,\n\tfaSlidersH,\n\tfaTrashAlt,\n} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaArrowCircleDown,\n\tfaHome,\n\tfaPencilAlt,\n\tfaSlidersH,\n\tfaTrashAlt,\n});\n\nexport default class AppGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'input [data-nx-control=\"slider\"]': 'sliding',\n\t\t\t\t'change [data-nx-control=\"slider\"]': 'sliding', // IE\n\t\t\t\t'click [data-nx-control=\"sliderMin\"]': 'sliderMin',\n\t\t\t\t'click [data-nx-control=\"sliderMax\"]': 'sliderMax',\n\t\t\t\t'click .nx-select-all': 'selectAll',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\n\t\tthis.i18nCountStr = null;\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'cart:counted',\n\t\t\t_.debounce(this.updateActionsMenu, 300),\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\t// Cache\n\t\tthis.$actions = this.$('[data-nx-control=\"actions\"]');\n\n\t\tsuper.postRender();\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `change`/`input` event\n\t * @fires module:asset#asset:thumb:resize\n\t */\n\tsliding(e) {\n\t\tif (\n\t\t\te.currentTarget.value ==\n\t\t\tNetx.user.prefs.getPreference('assetList.thumbSize')\n\t\t)\n\t\t\treturn;\n\t\tdispatcher.trigger('asset:thumb:resize', e.currentTarget.value);\n\t}\n\n\t/**\n\t * @method\n\t * @fires module:asset#asset:thumb:resize\n\t */\n\tsliderMin() {\n\t\tconst $slider = this.$el.find('[data-nx-control=\"slider\"]');\n\t\t$slider.val($slider.attr('min'));\n\t\tdispatcher.trigger('asset:thumb:resize', $slider.attr('min'));\n\t}\n\n\t/**\n\t * @method\n\t * @fires module:asset#asset:thumb:resize\n\t */\n\tsliderMax() {\n\t\tconst $slider = this.$el.find('[data-nx-control=\"slider\"]');\n\t\t$slider.val($slider.attr('max'));\n\t\tdispatcher.trigger('asset:thumb:resize', $slider.attr('max'));\n\t}\n\n\t/** @method */\n\tupdateActionsMenu() {\n\t\tconst enabled = Netx.cart.current.length > 0;\n\t\tthis.$actions && this.$actions.enableIf(enabled);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `click` event\n\t * @fires module:cart#cart:addAll\n\t */\n\tselectAll(e) {\n\t\tdispatcher.trigger('cart:addAll', this.collection);\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/categoryTreeNodeView.html';\n\nimport ChildView from './categoryTreeNodeView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nimport customConfig from '../config';\n\nexport default class CategoryTreeNodeView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\t// Circular refs\n\t\t// ChildView = require('./categoryTreeNodeView').default;\n\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tcollection: opts.model.get('childCategories'),\n\t\t\t\tviewClass: ChildView,\n\t\t\t\tlazyLoad: true,\n\t\t\t\toptions(model) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttree: this.tree,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t'data-contextmenu-target': 'categoryContextMenu',\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.className = `category ${opts.className || ''}`;\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t// TODO: 8.7 convert these over to data-nx-control\n\t\t\t\t// 'click [data-select]:first' : 'selectCategory',\n\t\t\t\t'click [data-toggle]': 'triggerState',\n\t\t\t\t'click [data-top]': 'returnToTopLevel',\n\t\t\t\t'click [data-back]': 'upLevel',\n\t\t\t\t// Drag\n\t\t\t\tdragend: 'dragEnd',\n\t\t\t\tdragstart: 'dragStart',\n\t\t\t\tloitering: 'loitering',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.id = opts.id || _.uniqueId(`category-${opts.model.id}`);\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['model'];\n\t\topts.loadingClassRemoveDelay = opts.loadingClassRemoveDelay || 500;\n\t\topts.tagName = opts.tagName || 'li';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * The open/closed state of the node in the tree\n\t\t * @type {boolean}\n\t\t * @default\n\t\t */\n\t\tthis.open = opts.open === true;\n\t\tthis.tree = opts.tree;\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(Netx.category.current, 'sync', this.checkActive)\n\t\t\t// If a move was cancelled - get everything back to how it was visually\n\t\t\t.listenTo(dispatcher, 'category:move:cancelled', (catId, newParentId) => {\n\t\t\t\t// Correct ourselves\n\t\t\t\tif (\n\t\t\t\t\tthis.model.id === catId ||\n\t\t\t\t\t_.indexOf(this.model.get('children'), catId) > -1 ||\n\t\t\t\t\tthis.model.id === newParentId\n\t\t\t\t) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\n\t\tconst debouncedRender = _.debounce(this.render, 300);\n\n\t\treturn this.listenTo(this.model, 'activate', this.makeActive)\n\t\t\t.listenTo(\n\t\t\t\tthis.model,\n\t\t\t\t'change:ancestors change:assetId change:children change:description change:hasContents change:name change:parentid change:visible',\n\t\t\t\tdebouncedRender,\n\t\t\t)\n\t\t\t.listenTo(this.model, 'destroy', this.remove)\n\t\t\t.listenTo(this.model, 'change:open', _.debounce(this.setOpenClasses, 50))\n\t\t\t.listenTo(this.model, 'activate', this.checkActive);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\t\tconst children = model.get('children');\n\t\tconst depth = model.depth();\n\n\t\tthis.$el\n\t\t\t.attr('data-depth', depth)\n\t\t\t.toggleClass('parent', children.length > 0);\n\n\t\t// Additional template vars\n\t\t_.extend(this.templateVars, {\n\t\t\t// Since we're changing our model from a Category Tree object to a real Category object,\n\t\t\t// here is a bit of backwards-compatibility:\n\t\t\tcategoryId: model.id,\n\t\t\tdepth: depth + 1,\n\t\t\tlabel: model.get('name'),\n\t\t\tsubCategories: children,\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Caching this.$('.sub-category:first') is tricky - so we aren't doing it right now\n\t\tif (\n\t\t\t!customConfig.TREE_MAX_DEPTH ||\n\t\t\tthis.model.depth() < customConfig.TREE_MAX_DEPTH\n\t\t) {\n\t\t\tthis.$el.toggleClass('parent', this.model.get('children').length > 0);\n\t\t\tthis.setOpenClasses();\n\t\t}\n\n\t\tthis.$el.enableIf(this.tree.disabledCategories.indexOf(this.model.id) < 0);\n\n\t\tthis.checkActive();\n\t}\n\n\t/** @method */\n\tcheckActive() {\n\t\tthis.$el.toggleClass(\n\t\t\tcustomConfig.ACTIVE_CLASS,\n\t\t\tNetx.category.current.id === this.model.id,\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Dragend event\n\t */\n\tdragEnd(e) {\n\t\t//console.log('dragEnd');\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Dragstart event\n\t */\n\tdragStart(e) {\n\t\te.stopImmediatePropagation();\n\t\te.originalEvent &&\n\t\t\te.originalEvent.ui &&\n\t\t\te.originalEvent.ui.$element.data('Category', JSON.stringify(this.model));\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Loitering event\n\t * @fires module:category#category:tree:open\n\t * @fires module:category#category:tree:insert:dummy\n\t */\n\tloitering(e) {\n\t\t// Do not let it bubble\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\n\t\tif (\n\t\t\tthis.model.id !== 'empty' &&\n\t\t\t!this.model.get('childCategories').length &&\n\t\t\t!this.model.get('children').length\n\t\t) {\n\t\t\tdispatcher.trigger('category:tree:insert:dummy', this.model);\n\t\t} else if (this.model.id !== 'empty') {\n\t\t\tdispatcher.trigger('category:tree:open', this.model);\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t */\n\tmakeActive() {\n\t\tthis.$el.addClass('active');\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Click event\n\t * @fires module:category#category:tree:reset\n\t */\n\treturnToTopLevel(e) {\n\t\tdispatcher.trigger('category:tree:reset', this.model.tree);\n\t}\n\n\t/**\n\t * @method\n\t * @todo enforce boolean rather than checking for _.isUndefined, check for _.isBoolean\n\t * otherwise we will get odd results as toggleClass takes explicit booleans (not truthy/falsy)\n\t */\n\tsetOpenClasses() {\n\t\t// DAM-4880: we shouldn't put the 'open' class on non-parents.\n\t\tconst opened =\n\t\t\tthis.model.get('open') &&\n\t\t\t(this.model.get('children').length > 0 ||\n\t\t\t\tthis.model.get('childCategories').length > 0);\n\t\tif (opened) {\n\t\t\t// TODO: data-nx-control\n\t\t\tthis.$('.sub-category:first').attr('data-depth', this.model.depth() + 1);\n\t\t}\n\t\tthis.$el.toggleClass('open', opened);\n\t\tthis.$el.toggleClass('closed', !opened);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Click event\n\t * @fires module:category#category:tree:close\n\t * @fires module:category#category:tree:open\n\t */\n\ttriggerState(e) {\n\t\t// Let the context click through\n\t\tif (e.isTrigger === 3) return;\n\t\t// DEVNOTE:\n\t\t// Strangely enough, this does not appear to have an effect, at least in V8:\n\t\te.stopPropagation();\n\t\t// In the V8 template where our state trigger element is inside a larger A tag, prevenDefault() prevents the click from reaching the A,\n\t\t// which is what we want & maybe what .stopPropagation() was trying to do.\n\t\te.preventDefault();\n\t\tdispatcher.trigger(\n\t\t\tthis.model.isOpen() ? 'category:tree:close' : 'category:tree:open',\n\t\t\tthis.model,\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Click event\n\t */\n\tupLevel(e) {\n\t\tlet $target = $(e.target).closest('.parent');\n\t\tNetx.router.navigate($target.find(' > a').attr('href'), {trigger: true});\n\t\t$target\n\t\t\t.find('[data-toggle]')\n\t\t\t.first()\n\t\t\t.click();\n\t\t$target = null;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CategoryTreeNodeView';\n\t}\n}\n\n// Functionality\nChildViews(CategoryTreeNodeView);\n","/**\n * @class\n */\nimport Base from '@netx/core-category/views/categoryTreeNodeView';\nimport CoreView from '@netx/core/lib/netx-view';\n\nimport ChildView from './categoryTreeNodeView';\n\nimport {faAngleRight} from '@fortawesome/pro-light-svg-icons';\nimport {\n\tfaArrowsAlt,\n\tfaCaretDown,\n\tfaCaretRight,\n\tfaCheck,\n\tfaFolder,\n} from '@fortawesome/pro-solid-svg-icons';\n\nconst icons = Base.initializeIcons({\n\tfaAngleRight,\n\tfaArrowsAlt,\n\tfaCaretDown,\n\tfaCaretRight,\n\tfaCheck,\n\tfaFolder,\n});\n\nimport categoryConfig from '@netx/core-category/config';\n\nexport default class CategoryTreeNodeView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t\ttarget: '.nx-childviews:first',\n\t\t\t\tbreakItUp: false,\n\t\t\t\tlazyLoad: false,\n\t\t\t\toptions: {\n\t\t\t\t\tattributes: {},\n\t\t\t\t},\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'click [data-nx-control=\"downlevel\"]:first': 'downlevel',\n\t\t\t\t'keydown > a.category': 'onKeyDown',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\ttriggerState(e) {\n\t\te.stopPropagation();\n\t\te.stopImmediatePropagation();\n\t\te.preventDefault();\n\t\t$('body').addClass('keep-nav-open');\n\t\tNetx.router.navigate(`category/${this.model.id}`, {trigger: true});\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additonal template vare\n\t\t_.extend(this.templateVars, {\n\t\t\ttreeMaxDepth: categoryConfig.TREE_MAX_DEPTH,\n\t\t\tcategoryId: this.model.get('categoryid'),\n\t\t\tdepth: this.model.depth() + 1,\n\t\t\tlabel: this.model.get('name'),\n\t\t\tsubCategories: this.model.get('children'),\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\t// super.postRender();\n\n\t\tCoreView.prototype.postRender.apply(this, arguments);\n\n\t\tif (\n\t\t\t!categoryConfig.TREE_MAX_DEPTH ||\n\t\t\tthis.model.depth() < categoryConfig.TREE_MAX_DEPTH\n\t\t) {\n\t\t\tthis.$el.toggleClass('parent', this.model.get('children').length > 0);\n\t\t\tthis.setOpenClasses();\n\t\t}\n\n\t\tthis.$el.enableIf(\n\t\t\tthis.collection.disabledCategories.indexOf(this.model.id) < 0,\n\t\t);\n\n\t\tthis.checkActive();\n\t}\n\n\t/** @override */\n\tcheckActive() {\n\t\tconst hasKids = Netx.category.current.get('children').length > 0;\n\t\tconst parentId = Netx.category.current.get('parentid');\n\n\t\t// keep the parent tree node open if the new one has no kids, at an end of tree\n\t\tthis.$el.toggleClass(\n\t\t\tcategoryConfig.ACTIVE_CLASS,\n\t\t\tNetx.category.current.id === this.model.id ||\n\t\t\t\t(!hasKids && parentId === this.model.id),\n\t\t);\n\n\t\t// set tabindex to -1 for all but the first set to 0\n\t\tconst parentEl = this.$el.parent('ul');\n\t\tconst isFirstNode =\n\t\t\tparentEl.find('li:first-child').attr('id') === this.$el.attr('id');\n\t\tconst menuItem = this.$('> .category');\n\t\tmenuItem.attr('tabindex', isFirstNode && menuItem.is(':visible') ? 0 : -1);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `keydown` event\n\t * It's not pretty, but it manages\n\t * arrow key focus on folder tree items\n\t *\n\t * todo: refactor with react\n\t */\n\tonKeyDown(e) {\n\t\tlet $folder;\n\t\tif (e.keyCode === 40) {\n\t\t\t// arrow down to next folder\n\t\t\t$folder = this.$el.next();\n\t\t} else if (e.keyCode === 38) {\n\t\t\t// arrow up to previous\n\t\t\t$folder = this.$el.prev();\n\t\t}\n\n\t\tif ($folder) {\n\t\t\t// prevent default page scrolling behavior\n\t\t\te.preventDefault();\n\n\t\t\t// select and focus on the category link\n\t\t\tconst $menuitem = $folder.find('.category:visible').first();\n\t\t\tif ($menuitem && $menuitem.length) {\n\t\t\t\t// remove all tab stops\n\t\t\t\tthis.$('.category').attr('tabindex', -1);\n\n\t\t\t\t$menuitem.attr('tabindex', 0);\n\t\t\t\t$menuitem.focus();\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\n\nimport assetCustomConfig from '@netx/core-asset/config';\n\nclass AppGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.loadingClassRemoveDelay = opts.loadingClassRemoveDelay || 500;\n\t\topts.requireSync = opts.requireSync !== false;\n\t\tsuper(opts);\n\n\t\tthis.views = opts.views || [];\n\n\t\t// Hey, listen!\n\t\t// User layout change\n\t\tthis.listenTo(dispatcher, 'user:sort:type', type => {\n\t\t\tthis.$el\n\t\t\t\t.removeClass(assetCustomConfig.LIST_TYPE.join(' '))\n\t\t\t\t.addClass(type);\n\t\t});\n\t\t// Update subView models\n\t\tif (this.viewSpec) {\n\t\t\tthis.listenTo(this.viewSpec, 'change:viewOptions:model', model => {\n\t\t\t\tconst _model = model.get('viewOptions').model;\n\t\t\t\t// TODO: unsetting ever?\n\t\t\t\tif (_model != null && this.headerView) {\n\t\t\t\t\tthis.headerView.setModel(_model);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t// TODO: have to fix this\n\t\t_.each(this.views, (view, k) => {\n\t\t\tif (view == null) return;\n\t\t\tconst viewClass =\n\t\t\t\t(_.isString(view.viewClass) && Netx.Views[view.viewClass]) ||\n\t\t\t\tview.viewClass;\n\t\t\tthis[`${k}View`] = this.addSubView(\n\t\t\t\tnew viewClass(_.omit(view, 'viewClass')),\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @override */\n\tsetModel(model, opts = {}) {\n\t\t// No render please\n\t\topts.silent = true;\n\t\tsuper.setModel(model, opts);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t_.each(this.views, (view, k) => {\n\t\t\tconst el = this.el.querySelector(`.nx-${k}`);\n\n\t\t\tif (!el) return;\n\n\t\t\tconst viewInstance = this[`${k}View`];\n\t\t\tif (!viewInstance) {\n\t\t\t\tel.style.display = 'none';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tel.parentNode.replaceChild(viewInstance.render().el, el);\n\t\t\tviewInstance.show();\n\t\t});\n\t}\n\n\t/**\n\t * @static\n\t * @type {string}\n\t */\n\tstatic get __name__() {\n\t\treturn 'AppGalleryView';\n\t}\n}\n\nexport default AppGalleryView;\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryView';\n\nimport {faSlidersH} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaSlidersH,\n});\n\nexport default class AppGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = {\n\t\t\t'click [data-nx-control=\"filters\"]': 'toggleFacets',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n\n\t/** @method */\n\ttoggleFacets() {\n\t\tif (this.$el.hasClass('facets-on') || $('body').hasClass('facets-off')) {\n\t\t\tthis.toggleFacetsOff();\n\t\t} else {\n\t\t\tthis.toggleFacetsOn();\n\t\t}\n\t}\n\n\t/** @method */\n\ttoggleFacetsOff() {\n\t\t// THEM-1542 - faceting-off sets the off widths but does not\n\t\t// change the display. This allows the animation\n\t\t// to complete before the facets disapear.\n\t\tthis.$el.addClass('faceting-off');\n\t\t_.delay(\n\t\t\t_.bind(function () {\n\t\t\t\tthis.removeClass('facets-on').removeClass('faceting-off');\n\t\t\t}, this.$el),\n\t\t\t500,\n\t\t);\n\t}\n\n\t/** @method */\n\ttoggleFacetsOn() {\n\t\tthis.$el.addClass('facets-on');\n\t}\n}\n","import {i18n} from '@netx/core/i18n';\n\nimport {ATTRIBUTE_CONTEXT} from './constants';\nimport type {AttributeContext} from './types';\n\nexport const ATTRIBUTE_CONTEXT_LABELS: Record<AttributeContext, string> = <\n\tconst\n>{\n\t[ATTRIBUTE_CONTEXT.DETAIL]: i18n.t('i18n.assetDetail'),\n\t[ATTRIBUTE_CONTEXT.SORT]: i18n.t('i18n.sort'),\n};\n\nexport const ATTRIBUTE_MESSAGES = <const>{\n\tNO_ATTRIBUTES: i18n.t('i18n.noAttributes'),\n};\n\nexport const DEFAULT_SEARCH_PLACEHOLDER = i18n.t('i18n.search');\n","import React from 'react';\nimport {\n\tDialogContent,\n\tDialogActions as MuiDialogActions,\n\tButton,\n\tTypography,\n} from '@mui/material';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport Dialog, {DialogProps} from '../Dialog';\n\nexport interface ConfirmationOptions\n\textends Omit<DialogProps, 'children' | 'classes' | 'onClose' | 'onSubmit'> {\n\tcancelLabel?: string;\n\tconfirmLabel?: string;\n\tdisableCancel?: boolean;\n\tdescription: React.ReactNode;\n\tDialogActions?: React.ComponentType<{\n\t\tonSubmit(...args: any[]): void;\n\t\tonClose?: () => void;\n\t}>;\n}\n\nexport interface ConfirmationDialogProps extends ConfirmationOptions {\n\tonSubmit(...args: any[]): void;\n\tonClose(): void;\n}\n\nexport const ConfirmationDialog: React.FunctionComponent<ConfirmationDialogProps> = ({\n\tDialogActions,\n\tcancelLabel,\n\tconfirmLabel,\n\tdescription,\n\tdisableCancel,\n\tonSubmit,\n\tonClose,\n\n\t...props\n}) => {\n\tcancelLabel = cancelLabel != null ? cancelLabel : i18n.t('i18n.cancel');\n\tconfirmLabel =\n\t\tconfirmLabel != null\n\t\t\t? confirmLabel\n\t\t\t: disableCancel\n\t\t\t? i18n.t('i18n.ok')\n\t\t\t: i18n.t('i18n.confirm');\n\n\treturn (\n\t\t<Dialog aria-describedby=\"dialog-description\" onClose={onClose} {...props}>\n\t\t\t<DialogContent>\n\t\t\t\t<Typography\n\t\t\t\t\tcolor=\"textSecondary\"\n\t\t\t\t\tcomponent=\"div\"\n\t\t\t\t\tid=\"dialog-description\"\n\t\t\t\t\tparagraph\n\t\t\t\t\tvariant=\"body1\"\n\t\t\t\t>\n\t\t\t\t\t{description}\n\t\t\t\t</Typography>\n\t\t\t</DialogContent>\n\t\t\t{DialogActions ? (\n\t\t\t\t<DialogActions onSubmit={onSubmit} onClose={onClose} />\n\t\t\t) : (\n\t\t\t\t<MuiDialogActions>\n\t\t\t\t\t{!disableCancel ? (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\tdata-testid=\"confirmation-cancel\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{cancelLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={onSubmit}\n\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\tdata-testid=\"confirmation-confirm\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{confirmLabel}\n\t\t\t\t\t</Button>\n\t\t\t\t</MuiDialogActions>\n\t\t\t)}\n\t\t</Dialog>\n\t);\n};\n","import React from 'react';\n\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\n\nexport const queryClient = new QueryClient();\n\nexport default queryClient;\n\nexport const withQueryClient = function <C extends React.ElementType>(\n\tComponent: C,\n) {\n\treturn (\n\t\tprops: JSX.IntrinsicAttributes &\n\t\t\tJSX.LibraryManagedAttributes<C, React.ComponentProps<C>>,\n\t) => {\n\t\treturn (\n\t\t\t<QueryClientProvider client={queryClient}>\n\t\t\t\t<Component {...props} />\n\t\t\t</QueryClientProvider>\n\t\t);\n\t};\n};\n","/**\n * Sorting plugin for the grid\n * @class\n */\nimport Base from './client';\n\nconst Sort = function( grid ) {\n\tthis.grid = grid;\n\t\n\t// Listen for column sort request\n\tgrid.addEventListener('fin-column-sort', _.bind( this.toggleSort, this ) );\n\tgrid.addEventListener('fin-cell-enter', _.bind( this.cellEnter, this ) );\n\tgrid.addEventListener('fin-cell-exit', _.bind( this.cellExit, this ) );\n\t\n\t// Cannot trust this event\n\t// grid.addEventListener('fin-canvas-mouseout', _.bind( this.canvasMouseOut, this ) );\n\tgrid.div.addEventListener('mouseleave', this.onmouseleave = _.bind( this.canvasMouseOut, this ) );\n};\n\nSort.prototype = _.extend( Object.create( Base.prototype ), {\n\t// Replace constructor with ours\n\tconstructor: Sort,\n\t\n\t/**\n\t * @override\n\t * @param {object} opts Options\n\t */\n\tsort( opts ) {\n\t\tif ( this.order == null || this.columnIndex == null ) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\topts = opts || {};\n\t\t\n\t\tconst grid = this.grid;\n\t\t\n\t\t// Sort the index\n\t\tconst field = grid.behavior.getColumn( this.columnIndex ).properties.name;\n\t\tgrid.canvas.dispatchEvent( new CustomEvent('nx-sort', {\n\t\t\tdetail: {\n\t\t\t\tcolumn : field,\n\t\t\t\torder : this.order\n\t\t\t} \n\t\t} ) );\n\t},\n\t\n\t/**\n\t * Destroy\n\t * @override\n\t * @param {Hypergrid} grid Grid\n\t */\n\tuninstall( grid ) {\n\t\t// Clean up listeners\n\t\tgrid.removeEventListener('fin-column-sort', this.toggleSort );\n\t\tgrid.removeEventListener('fin-cell-exit', this.cellExit );\n\t\tgrid.removeEventListener('fin-cell-enter', this.cellEnter );\n\t\t\n\t\t// Cannot trust this event\n\t\t// grid.removeEventListener('fin-canvas-mouseout', this.canvasMouseOut );\n\t\tgrid.div.removeEventListener('mouseleave', this.onmouseleave );\n\t},\n\t\n\t/**\n\t * @override\n\t * @param {object} opts Options\n\t */\n\tunsort( opts ) {\n\t\topts = opts || {};\n\t\t\n\t\tconst grid = this.grid;\n\t\tconst behavior = grid.behavior;\n\t\t\n\t\tif ( this.order != null && this.columnIndex != null ) {\n\t\t\t// Just easier this way\n\t\t\tgrid.clearSelections();\n\t\t\tgrid.selectionChanged();\n\t\t\t\n\t\t\t// Unset icon\n\t\t\tbehavior.getColumn( this.columnIndex ).properties.columnRightIcon = '';\n\t\t\t\n\t\t\tthis.columnIndex = null;\n\t\t\tthis.order = null;\n\t\t\t\n\t\t\tgrid.canvas.dispatchEvent( new CustomEvent('nx-unsort') );\n\t\t}\n\t},\n\t\n\t/**\n\t * @override\n\t */\n\tupdateData() {\n\t\t// Do nothing\n\t}\n} );\n\nexport default Sort;","/**\n * Reflects the records for saved carts in the DAM.\n * @class\n */\nimport Base from '@netx/core-share/collections/sharedResources';\nimport Model from '../models/savedCart';\n\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\nimport cartSingleton from './singleton/cart';\n\nexport default class SavedCarts extends Base {\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetSharedResources() {\n\t\t\t\treturn this.isFiltered()\n\t\t\t\t\t? 'Filtering saved carts'\n\t\t\t\t\t: 'Loading saved carts';\n\t\t\t},\n\t\t\tgetAllCarts: 'Loading saved carts',\n\t\t\tgetUserCarts: 'Loading saved carts',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetSharedResources() {\n\t\t\t\treturn this.isFiltered()\n\t\t\t\t\t? 'Filtered saved carts'\n\t\t\t\t\t: 'Loaded saved carts';\n\t\t\t},\n\t\t\tgetAllCarts: 'Loaded saved carts',\n\t\t\tgetUserCarts: 'Loaded saved carts',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this collection\n\t * @property {method} methods.fetchBeans - Fetch saved cart beans\n\t * @property {method} methods.fetchBeansForUser - Fetch saved cart beans for user\n\t */\n\tget methods() {\n\t\treturn _.extend(super.methods, {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeans(opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'getAllCarts',\n\t\t\t\t\tthis.modeFilters,\n\t\t\t\t\tthis.filterStr,\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {number} userId User id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeansForUser(userId, opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'getUserCarts',\n\t\t\t\t\tuserId,\n\t\t\t\t\tthis.modeFilters,\n\t\t\t\t\tthis.filterStr,\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @property {object} parsers - Parsers for this collection\n\t * @property {method} parsers.fetchBeans - Parse response of saved cart beans\n\t * @property {method} parsers.fetchBeansForUser - Parse response of saved cart beans\n\t */\n\tget parsers() {\n\t\treturn _.extend(super.parsers, {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} data Saved carts\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeans(data, opts = {}) {\n\t\t\t\tthis.set(data, _.extend({merge: true}, opts));\n\t\t\t\t!opts.silent && this.trigger('sync', this, data, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} data Saved carts\n\t\t\t * @param {number} userId User id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeansForUser(data, userId, opts = {}) {\n\t\t\t\tthis.set(data, opts);\n\t\t\t\t!opts.silent && this.trigger('sync', this, data, opts);\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @listens module:cart#cart:saved:delete:success\n\t * @listens module:cart#cart:save:current:success\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\topts.resourceName = 'savedCart';\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * The current cart (selection)\n\t\t * @memberOf Netx.Collections.Users\n\t\t * @alias currentCart\n\t\t * @type {Netx.Collections.CartAssets}\n\t\t */\n\t\tthis.currentCart = opts.currentCart || cartSingleton;\n\n\t\t// Set name filter if provided\n\t\tthis.filterStr = opts.filterStr || this.filterStr;\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(dispatcher, 'cart:saved:delete:success', (savedCart) => {\n\t\t\tconst model = this.get(savedCart.id);\n\t\t\tmodel && this.remove(model);\n\t\t}).listenTo(dispatcher, 'cart:save:current:success', (savedCart) => {\n\t\t\tthis.matchesFilters(savedCart) && this.unshift(savedCart.attributes);\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} ids Saved cart ids\n\t * @param {array} assetIds Asset ids\n\t * @return {Promise -> Netx.Collections.SavedCarts}\n\t */\n\taddAssets(ids, assetIds = []) {\n\t\t// Get all carts involved\n\t\treturn this.getCarts(ids || []).then((savedCarts) => {\n\t\t\t// Add current cart assets and store the promises\n\t\t\tconst addAssets = savedCarts.map((savedCart) =>\n\t\t\t\tsavedCart.addAssetsToCart(assetIds),\n\t\t\t);\n\t\t\t// Wait for everything to finish\n\t\t\treturn $.when.apply($, addAssets).then(() => {\n\t\t\t\treturn savedCarts;\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} ids Saved cart ids to update\n\t * @return {Promise -> Netx.Collections.SavedCarts}\n\t */\n\taddCurrentCart(ids) {\n\t\tif (!ids || !ids.length) return new $.Deferred().resolve([]);\n\t\t// Get all carts involved\n\t\treturn this.getCarts(ids || []).then((savedCarts) => {\n\t\t\t// Add current cart assets and store the promises\n\t\t\tconst addAssets = savedCarts.map((savedCart) =>\n\t\t\t\tsavedCart.addCurrentCart(),\n\t\t\t);\n\t\t\t// Wait for everything to finish\n\t\t\treturn Promise.all(addAssets).then(() => {\n\t\t\t\treturn savedCarts;\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} ids Saved cart ids\n\t * @param {Netx.Collections.SearchRules} search Search rules\n\t * @return {Promise -> Netx.Collections.SavedCarts}\n\t */\n\taddSearch(ids, search) {\n\t\t// Get all carts involved\n\t\treturn this.getCarts(ids || []).then((savedCarts) => {\n\t\t\t// Add current cart assets and store the promises\n\t\t\tconst addAssets = savedCarts.map((savedCart) =>\n\t\t\t\tsavedCart.addFacetedSearchToCart(search),\n\t\t\t);\n\t\t\t// Wait for everything to finish\n\t\t\treturn $.when.apply($, addAssets).then(() => {\n\t\t\t\treturn savedCarts;\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} carts An array of cart objects `{title: <title>}`\n\t * @param {object} opts Options\n\t */\n\tcreateNewCarts(carts, opts = {}) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!carts) resolve([]);\n\n\t\t\tconst newCarts = [];\n\t\t\t// Save each cart after the other has completed to avoid data locks on the server\n\t\t\tconst next = () => {\n\t\t\t\tif (!carts.length) return resolve(newCarts);\n\n\t\t\t\tconst cart = new Model(carts.shift());\n\t\t\t\tcart.save(opts).then(() => {\n\t\t\t\t\tnewCarts.push(cart);\n\t\t\t\t\tnext();\n\t\t\t\t}, reject);\n\t\t\t};\n\n\t\t\tnext();\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} id Cart id\n\t * @return {module:cart/models/savedCart}\n\t */\n\tgetCart(id) {\n\t\tlet savedCart = this.get(id);\n\t\tif (savedCart) {\n\t\t\treturn new $.Deferred().resolve(savedCart);\n\t\t}\n\n\t\treturn new Model({\n\t\t\t[Model.prototype.idAttribute || 'id']: id,\n\t\t})\n\t\t\t.fetch()\n\t\t\t.then(() => {\n\t\t\t\treturn savedCart;\n\t\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} ids Cart ids\n\t * @return {Netx.Collections.SavedCarts}\n\t */\n\tgetCarts(ids) {\n\t\t// Get cart data for any cartIds passed\n\t\tconst carts = _.compact(\n\t\t\t_.map(ids, (id) => (id && this.getCart(id)) || null),\n\t\t);\n\t\t// Wait for all cart models to be available\n\t\treturn $.when.apply($, carts).then((...carts) => {\n\t\t\treturn new this.constructor([...carts]);\n\t\t});\n\t}\n\n\t/**\n\t * Get all carts that current user can edit\n\t * @method\n\t * @return {Netx.Collections.SavedCarts}\n\t * @todo this will not work once we have paging enforced - this will need to fetch and return a promise\n\t * but the actions need to be reworked to allow for promises in enable tests\n\t */\n\tgetEditableCarts() {\n\t\treturn new this.constructor(this.filter((cart) => cart.canEdit()));\n\t}\n\n\t/**\n\t * Check if we have any carts the current user can edit\n\t * @method\n\t */\n\thasEditableCarts() {\n\t\treturn this.getEditableCarts().length > 0;\n\t}\n\n\t/**\n\t * @method\n\t * @return {module:asset/models/assetSet} AssetSet\n\t */\n\ttoAssetSet() {\n\t\treturn new AssetSetModel({\n\t\t\ttype: assetSetTypes.cart,\n\t\t\tids: this.ids(),\n\t\t\tlabel: i18n.t('i18n.savedCart'),\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SavedCarts';\n\t}\n}\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"), require(\"react-dom\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\", \"react-dom\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ScrollSync\"] = factory(require(\"react\"), require(\"react-dom\"));\n\telse\n\t\troot[\"ScrollSync\"] = factory(root[\"react\"], root[\"react-dom\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_2__, __WEBPACK_EXTERNAL_MODULE_13__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _ScrollSync = __webpack_require__(1);\n\t\n\tObject.defineProperty(exports, 'ScrollSync', {\n\t enumerable: true,\n\t get: function get() {\n\t return _interopRequireDefault(_ScrollSync).default;\n\t }\n\t});\n\t\n\tvar _ScrollSyncPane = __webpack_require__(12);\n\t\n\tObject.defineProperty(exports, 'ScrollSyncPane', {\n\t enumerable: true,\n\t get: function get() {\n\t return _interopRequireDefault(_ScrollSyncPane).default;\n\t }\n\t});\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _propTypes = __webpack_require__(3);\n\t\n\tvar _propTypes2 = _interopRequireDefault(_propTypes);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\t/**\n\t * ScrollSync provider component\n\t *\n\t */\n\t\n\tvar ScrollSync = function (_Component) {\n\t _inherits(ScrollSync, _Component);\n\t\n\t function ScrollSync() {\n\t var _ref;\n\t\n\t var _temp, _this, _ret;\n\t\n\t _classCallCheck(this, ScrollSync);\n\t\n\t for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t args[_key] = arguments[_key];\n\t }\n\t\n\t return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = ScrollSync.__proto__ || Object.getPrototypeOf(ScrollSync)).call.apply(_ref, [this].concat(args))), _this), _this.panes = {}, _this.registerPane = function (node, groups) {\n\t groups.forEach(function (group) {\n\t if (!_this.panes[group]) {\n\t _this.panes[group] = [];\n\t }\n\t\n\t if (!_this.findPane(node, group)) {\n\t if (_this.panes[group].length > 0) {\n\t _this.syncScrollPosition(_this.panes[group][0], node);\n\t }\n\t _this.panes[group].push(node);\n\t }\n\t });\n\t _this.addEvents(node, groups);\n\t }, _this.unregisterPane = function (node, groups) {\n\t groups.forEach(function (group) {\n\t if (_this.findPane(node, group)) {\n\t _this.removeEvents(node);\n\t _this.panes[group].splice(_this.panes[group].indexOf(node), 1);\n\t }\n\t });\n\t }, _this.addEvents = function (node, groups) {\n\t /* For some reason element.addEventListener doesnt work with document.body */\n\t node.onscroll = _this.handlePaneScroll.bind(_this, node, groups); // eslint-disable-line\n\t }, _this.removeEvents = function (node) {\n\t /* For some reason element.removeEventListener doesnt work with document.body */\n\t node.onscroll = null; // eslint-disable-line\n\t }, _this.findPane = function (node, group) {\n\t if (!_this.panes[group]) {\n\t return false;\n\t }\n\t\n\t return _this.panes[group].find(function (pane) {\n\t return pane === node;\n\t });\n\t }, _this.handlePaneScroll = function (node, groups) {\n\t if (!_this.props.enabled) {\n\t return;\n\t }\n\t\n\t window.requestAnimationFrame(function () {\n\t _this.syncScrollPositions(node, groups);\n\t });\n\t }, _this.syncScrollPositions = function (scrolledPane, groups) {\n\t groups.forEach(function (group) {\n\t _this.panes[group].forEach(function (pane) {\n\t /* For all panes beside the currently scrolling one */\n\t if (scrolledPane !== pane) {\n\t /* Remove event listeners from the node that we'll manipulate */\n\t _this.removeEvents(pane, group);\n\t _this.syncScrollPosition(scrolledPane, pane);\n\t /* Re-attach event listeners after we're done scrolling */\n\t window.requestAnimationFrame(function () {\n\t _this.addEvents(pane, groups);\n\t });\n\t }\n\t });\n\t });\n\t if (_this.props.onSync) _this.props.onSync(scrolledPane);\n\t }, _temp), _possibleConstructorReturn(_this, _ret);\n\t }\n\t\n\t _createClass(ScrollSync, [{\n\t key: 'getChildContext',\n\t value: function getChildContext() {\n\t return {\n\t registerPane: this.registerPane,\n\t unregisterPane: this.unregisterPane\n\t };\n\t }\n\t }, {\n\t key: 'syncScrollPosition',\n\t value: function syncScrollPosition(scrolledPane, pane) {\n\t var scrollTop = scrolledPane.scrollTop,\n\t scrollHeight = scrolledPane.scrollHeight,\n\t clientHeight = scrolledPane.clientHeight,\n\t scrollLeft = scrolledPane.scrollLeft,\n\t scrollWidth = scrolledPane.scrollWidth,\n\t clientWidth = scrolledPane.clientWidth;\n\t\n\t\n\t var scrollTopOffset = scrollHeight - clientHeight;\n\t var scrollLeftOffset = scrollWidth - clientWidth;\n\t\n\t var _props = this.props,\n\t proportional = _props.proportional,\n\t vertical = _props.vertical,\n\t horizontal = _props.horizontal;\n\t\n\t /* Calculate the actual pane height */\n\t\n\t var paneHeight = pane.scrollHeight - clientHeight;\n\t var paneWidth = pane.scrollWidth - clientWidth;\n\t /* Adjust the scrollTop position of it accordingly */\n\t if (vertical && scrollTopOffset > 0) {\n\t pane.scrollTop = proportional ? paneHeight * scrollTop / scrollTopOffset : scrollTop; // eslint-disable-line\n\t }\n\t if (horizontal && scrollLeftOffset > 0) {\n\t pane.scrollLeft = proportional ? paneWidth * scrollLeft / scrollLeftOffset : scrollLeft; // eslint-disable-line\n\t }\n\t }\n\t }, {\n\t key: 'render',\n\t value: function render() {\n\t return _react2.default.Children.only(this.props.children);\n\t }\n\t }]);\n\t\n\t return ScrollSync;\n\t}(_react.Component);\n\t\n\tScrollSync.propTypes = {\n\t /**\n\t * Callback to be invoked any time synchronization happens\n\t *\n\t * @param {Element} el The element that has received the scroll event\n\t */\n\t onSync: _propTypes2.default.func,\n\t children: _propTypes2.default.element.isRequired,\n\t proportional: _propTypes2.default.bool,\n\t vertical: _propTypes2.default.bool,\n\t horizontal: _propTypes2.default.bool,\n\t enabled: _propTypes2.default.bool\n\t};\n\tScrollSync.defaultProps = {\n\t proportional: true,\n\t vertical: true,\n\t horizontal: true,\n\t enabled: true\n\t};\n\tScrollSync.childContextTypes = {\n\t registerPane: _propTypes2.default.func,\n\t unregisterPane: _propTypes2.default.func\n\t};\n\texports.default = ScrollSync;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_2__;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {/**\n\t * Copyright 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t */\n\t\n\tif (process.env.NODE_ENV !== 'production') {\n\t var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&\n\t Symbol.for &&\n\t Symbol.for('react.element')) ||\n\t 0xeac7;\n\t\n\t var isValidElement = function(object) {\n\t return typeof object === 'object' &&\n\t object !== null &&\n\t object.$$typeof === REACT_ELEMENT_TYPE;\n\t };\n\t\n\t // By explicitly using `prop-types` you are opting into new development behavior.\n\t // http://fb.me/prop-types-in-prod\n\t var throwOnDirectAccess = true;\n\t module.exports = __webpack_require__(5)(isValidElement, throwOnDirectAccess);\n\t} else {\n\t // By explicitly using `prop-types` you are opting into new production behavior.\n\t // http://fb.me/prop-types-in-prod\n\t module.exports = __webpack_require__(11)();\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\tvar process = module.exports = {};\n\t\n\t// cached from whatever global is present so that test runners that stub it\n\t// don't break things. But we need to wrap it in a try catch in case it is\n\t// wrapped in strict mode code which doesn't define any globals. It's inside a\n\t// function because try/catches deoptimize in certain engines.\n\t\n\tvar cachedSetTimeout;\n\tvar cachedClearTimeout;\n\t\n\tfunction defaultSetTimout() {\n\t throw new Error('setTimeout has not been defined');\n\t}\n\tfunction defaultClearTimeout () {\n\t throw new Error('clearTimeout has not been defined');\n\t}\n\t(function () {\n\t try {\n\t if (typeof setTimeout === 'function') {\n\t cachedSetTimeout = setTimeout;\n\t } else {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t } catch (e) {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t try {\n\t if (typeof clearTimeout === 'function') {\n\t cachedClearTimeout = clearTimeout;\n\t } else {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t } catch (e) {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t} ())\n\tfunction runTimeout(fun) {\n\t if (cachedSetTimeout === setTimeout) {\n\t //normal enviroments in sane situations\n\t return setTimeout(fun, 0);\n\t }\n\t // if setTimeout wasn't available but was latter defined\n\t if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n\t cachedSetTimeout = setTimeout;\n\t return setTimeout(fun, 0);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedSetTimeout(fun, 0);\n\t } catch(e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedSetTimeout.call(null, fun, 0);\n\t } catch(e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n\t return cachedSetTimeout.call(this, fun, 0);\n\t }\n\t }\n\t\n\t\n\t}\n\tfunction runClearTimeout(marker) {\n\t if (cachedClearTimeout === clearTimeout) {\n\t //normal enviroments in sane situations\n\t return clearTimeout(marker);\n\t }\n\t // if clearTimeout wasn't available but was latter defined\n\t if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n\t cachedClearTimeout = clearTimeout;\n\t return clearTimeout(marker);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedClearTimeout(marker);\n\t } catch (e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedClearTimeout.call(null, marker);\n\t } catch (e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n\t // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n\t return cachedClearTimeout.call(this, marker);\n\t }\n\t }\n\t\n\t\n\t\n\t}\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t if (!draining || !currentQueue) {\n\t return;\n\t }\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = runTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t runClearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t runTimeout(drainQueue);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\tprocess.prependListener = noop;\n\tprocess.prependOnceListener = noop;\n\t\n\tprocess.listeners = function (name) { return [] }\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {/**\n\t * Copyright 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t */\n\t\n\t'use strict';\n\t\n\tvar emptyFunction = __webpack_require__(6);\n\tvar invariant = __webpack_require__(7);\n\tvar warning = __webpack_require__(8);\n\t\n\tvar ReactPropTypesSecret = __webpack_require__(9);\n\tvar checkPropTypes = __webpack_require__(10);\n\t\n\tmodule.exports = function(isValidElement, throwOnDirectAccess) {\n\t /* global Symbol */\n\t var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n\t var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\t\n\t /**\n\t * Returns the iterator method function contained on the iterable object.\n\t *\n\t * Be sure to invoke the function with the iterable as context:\n\t *\n\t * var iteratorFn = getIteratorFn(myIterable);\n\t * if (iteratorFn) {\n\t * var iterator = iteratorFn.call(myIterable);\n\t * ...\n\t * }\n\t *\n\t * @param {?object} maybeIterable\n\t * @return {?function}\n\t */\n\t function getIteratorFn(maybeIterable) {\n\t var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n\t if (typeof iteratorFn === 'function') {\n\t return iteratorFn;\n\t }\n\t }\n\t\n\t /**\n\t * Collection of methods that allow declaration and validation of props that are\n\t * supplied to React components. Example usage:\n\t *\n\t * var Props = require('ReactPropTypes');\n\t * var MyArticle = React.createClass({\n\t * propTypes: {\n\t * // An optional string prop named \"description\".\n\t * description: Props.string,\n\t *\n\t * // A required enum prop named \"category\".\n\t * category: Props.oneOf(['News','Photos']).isRequired,\n\t *\n\t * // A prop named \"dialog\" that requires an instance of Dialog.\n\t * dialog: Props.instanceOf(Dialog).isRequired\n\t * },\n\t * render: function() { ... }\n\t * });\n\t *\n\t * A more formal specification of how these methods are used:\n\t *\n\t * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n\t * decl := ReactPropTypes.{type}(.isRequired)?\n\t *\n\t * Each and every declaration produces a function with the same signature. This\n\t * allows the creation of custom validation functions. For example:\n\t *\n\t * var MyLink = React.createClass({\n\t * propTypes: {\n\t * // An optional string or URI prop named \"href\".\n\t * href: function(props, propName, componentName) {\n\t * var propValue = props[propName];\n\t * if (propValue != null && typeof propValue !== 'string' &&\n\t * !(propValue instanceof URI)) {\n\t * return new Error(\n\t * 'Expected a string or an URI for ' + propName + ' in ' +\n\t * componentName\n\t * );\n\t * }\n\t * }\n\t * },\n\t * render: function() {...}\n\t * });\n\t *\n\t * @internal\n\t */\n\t\n\t var ANONYMOUS = '<<anonymous>>';\n\t\n\t // Important!\n\t // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n\t var ReactPropTypes = {\n\t array: createPrimitiveTypeChecker('array'),\n\t bool: createPrimitiveTypeChecker('boolean'),\n\t func: createPrimitiveTypeChecker('function'),\n\t number: createPrimitiveTypeChecker('number'),\n\t object: createPrimitiveTypeChecker('object'),\n\t string: createPrimitiveTypeChecker('string'),\n\t symbol: createPrimitiveTypeChecker('symbol'),\n\t\n\t any: createAnyTypeChecker(),\n\t arrayOf: createArrayOfTypeChecker,\n\t element: createElementTypeChecker(),\n\t instanceOf: createInstanceTypeChecker,\n\t node: createNodeChecker(),\n\t objectOf: createObjectOfTypeChecker,\n\t oneOf: createEnumTypeChecker,\n\t oneOfType: createUnionTypeChecker,\n\t shape: createShapeTypeChecker\n\t };\n\t\n\t /**\n\t * inlined Object.is polyfill to avoid requiring consumers ship their own\n\t * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n\t */\n\t /*eslint-disable no-self-compare*/\n\t function is(x, y) {\n\t // SameValue algorithm\n\t if (x === y) {\n\t // Steps 1-5, 7-10\n\t // Steps 6.b-6.e: +0 != -0\n\t return x !== 0 || 1 / x === 1 / y;\n\t } else {\n\t // Step 6.a: NaN == NaN\n\t return x !== x && y !== y;\n\t }\n\t }\n\t /*eslint-enable no-self-compare*/\n\t\n\t /**\n\t * We use an Error-like object for backward compatibility as people may call\n\t * PropTypes directly and inspect their output. However, we don't use real\n\t * Errors anymore. We don't inspect their stack anyway, and creating them\n\t * is prohibitively expensive if they are created too often, such as what\n\t * happens in oneOfType() for any type before the one that matched.\n\t */\n\t function PropTypeError(message) {\n\t this.message = message;\n\t this.stack = '';\n\t }\n\t // Make `instanceof Error` still work for returned errors.\n\t PropTypeError.prototype = Error.prototype;\n\t\n\t function createChainableTypeChecker(validate) {\n\t if (process.env.NODE_ENV !== 'production') {\n\t var manualPropTypeCallCache = {};\n\t var manualPropTypeWarningCount = 0;\n\t }\n\t function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n\t componentName = componentName || ANONYMOUS;\n\t propFullName = propFullName || propName;\n\t\n\t if (secret !== ReactPropTypesSecret) {\n\t if (throwOnDirectAccess) {\n\t // New behavior only for users of `prop-types` package\n\t invariant(\n\t false,\n\t 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n\t 'Use `PropTypes.checkPropTypes()` to call them. ' +\n\t 'Read more at http://fb.me/use-check-prop-types'\n\t );\n\t } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n\t // Old behavior for people using React.PropTypes\n\t var cacheKey = componentName + ':' + propName;\n\t if (\n\t !manualPropTypeCallCache[cacheKey] &&\n\t // Avoid spamming the console because they are often not actionable except for lib authors\n\t manualPropTypeWarningCount < 3\n\t ) {\n\t warning(\n\t false,\n\t 'You are manually calling a React.PropTypes validation ' +\n\t 'function for the `%s` prop on `%s`. This is deprecated ' +\n\t 'and will throw in the standalone `prop-types` package. ' +\n\t 'You may be seeing this warning due to a third-party PropTypes ' +\n\t 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.',\n\t propFullName,\n\t componentName\n\t );\n\t manualPropTypeCallCache[cacheKey] = true;\n\t manualPropTypeWarningCount++;\n\t }\n\t }\n\t }\n\t if (props[propName] == null) {\n\t if (isRequired) {\n\t if (props[propName] === null) {\n\t return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n\t }\n\t return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n\t }\n\t return null;\n\t } else {\n\t return validate(props, propName, componentName, location, propFullName);\n\t }\n\t }\n\t\n\t var chainedCheckType = checkType.bind(null, false);\n\t chainedCheckType.isRequired = checkType.bind(null, true);\n\t\n\t return chainedCheckType;\n\t }\n\t\n\t function createPrimitiveTypeChecker(expectedType) {\n\t function validate(props, propName, componentName, location, propFullName, secret) {\n\t var propValue = props[propName];\n\t var propType = getPropType(propValue);\n\t if (propType !== expectedType) {\n\t // `propValue` being instance of, say, date/regexp, pass the 'object'\n\t // check, but we can offer a more precise error message here rather than\n\t // 'of type `object`'.\n\t var preciseType = getPreciseType(propValue);\n\t\n\t return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));\n\t }\n\t return null;\n\t }\n\t return createChainableTypeChecker(validate);\n\t }\n\t\n\t function createAnyTypeChecker() {\n\t return createChainableTypeChecker(emptyFunction.thatReturnsNull);\n\t }\n\t\n\t function createArrayOfTypeChecker(typeChecker) {\n\t function validate(props, propName, componentName, location, propFullName) {\n\t if (typeof typeChecker !== 'function') {\n\t return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n\t }\n\t var propValue = props[propName];\n\t if (!Array.isArray(propValue)) {\n\t var propType = getPropType(propValue);\n\t return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n\t }\n\t for (var i = 0; i < propValue.length; i++) {\n\t var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n\t if (error instanceof Error) {\n\t return error;\n\t }\n\t }\n\t return null;\n\t }\n\t return createChainableTypeChecker(validate);\n\t }\n\t\n\t function createElementTypeChecker() {\n\t function validate(props, propName, componentName, location, propFullName) {\n\t var propValue = props[propName];\n\t if (!isValidElement(propValue)) {\n\t var propType = getPropType(propValue);\n\t return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n\t }\n\t return null;\n\t }\n\t return createChainableTypeChecker(validate);\n\t }\n\t\n\t function createInstanceTypeChecker(expectedClass) {\n\t function validate(props, propName, componentName, location, propFullName) {\n\t if (!(props[propName] instanceof expectedClass)) {\n\t var expectedClassName = expectedClass.name || ANONYMOUS;\n\t var actualClassName = getClassName(props[propName]);\n\t return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n\t }\n\t return null;\n\t }\n\t return createChainableTypeChecker(validate);\n\t }\n\t\n\t function createEnumTypeChecker(expectedValues) {\n\t if (!Array.isArray(expectedValues)) {\n\t process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid argument supplied to oneOf, expected an instance of array.') : void 0;\n\t return emptyFunction.thatReturnsNull;\n\t }\n\t\n\t function validate(props, propName, componentName, location, propFullName) {\n\t var propValue = props[propName];\n\t for (var i = 0; i < expectedValues.length; i++) {\n\t if (is(propValue, expectedValues[i])) {\n\t return null;\n\t }\n\t }\n\t\n\t var valuesString = JSON.stringify(expectedValues);\n\t return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n\t }\n\t return createChainableTypeChecker(validate);\n\t }\n\t\n\t function createObjectOfTypeChecker(typeChecker) {\n\t function validate(props, propName, componentName, location, propFullName) {\n\t if (typeof typeChecker !== 'function') {\n\t return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n\t }\n\t var propValue = props[propName];\n\t var propType = getPropType(propValue);\n\t if (propType !== 'object') {\n\t return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n\t }\n\t for (var key in propValue) {\n\t if (propValue.hasOwnProperty(key)) {\n\t var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n\t if (error instanceof Error) {\n\t return error;\n\t }\n\t }\n\t }\n\t return null;\n\t }\n\t return createChainableTypeChecker(validate);\n\t }\n\t\n\t function createUnionTypeChecker(arrayOfTypeCheckers) {\n\t if (!Array.isArray(arrayOfTypeCheckers)) {\n\t process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n\t return emptyFunction.thatReturnsNull;\n\t }\n\t\n\t for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n\t var checker = arrayOfTypeCheckers[i];\n\t if (typeof checker !== 'function') {\n\t warning(\n\t false,\n\t 'Invalid argument supplid to oneOfType. Expected an array of check functions, but ' +\n\t 'received %s at index %s.',\n\t getPostfixForTypeWarning(checker),\n\t i\n\t );\n\t return emptyFunction.thatReturnsNull;\n\t }\n\t }\n\t\n\t function validate(props, propName, componentName, location, propFullName) {\n\t for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n\t var checker = arrayOfTypeCheckers[i];\n\t if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {\n\t return null;\n\t }\n\t }\n\t\n\t return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));\n\t }\n\t return createChainableTypeChecker(validate);\n\t }\n\t\n\t function createNodeChecker() {\n\t function validate(props, propName, componentName, location, propFullName) {\n\t if (!isNode(props[propName])) {\n\t return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n\t }\n\t return null;\n\t }\n\t return createChainableTypeChecker(validate);\n\t }\n\t\n\t function createShapeTypeChecker(shapeTypes) {\n\t function validate(props, propName, componentName, location, propFullName) {\n\t var propValue = props[propName];\n\t var propType = getPropType(propValue);\n\t if (propType !== 'object') {\n\t return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n\t }\n\t for (var key in shapeTypes) {\n\t var checker = shapeTypes[key];\n\t if (!checker) {\n\t continue;\n\t }\n\t var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n\t if (error) {\n\t return error;\n\t }\n\t }\n\t return null;\n\t }\n\t return createChainableTypeChecker(validate);\n\t }\n\t\n\t function isNode(propValue) {\n\t switch (typeof propValue) {\n\t case 'number':\n\t case 'string':\n\t case 'undefined':\n\t return true;\n\t case 'boolean':\n\t return !propValue;\n\t case 'object':\n\t if (Array.isArray(propValue)) {\n\t return propValue.every(isNode);\n\t }\n\t if (propValue === null || isValidElement(propValue)) {\n\t return true;\n\t }\n\t\n\t var iteratorFn = getIteratorFn(propValue);\n\t if (iteratorFn) {\n\t var iterator = iteratorFn.call(propValue);\n\t var step;\n\t if (iteratorFn !== propValue.entries) {\n\t while (!(step = iterator.next()).done) {\n\t if (!isNode(step.value)) {\n\t return false;\n\t }\n\t }\n\t } else {\n\t // Iterator will provide entry [k,v] tuples rather than values.\n\t while (!(step = iterator.next()).done) {\n\t var entry = step.value;\n\t if (entry) {\n\t if (!isNode(entry[1])) {\n\t return false;\n\t }\n\t }\n\t }\n\t }\n\t } else {\n\t return false;\n\t }\n\t\n\t return true;\n\t default:\n\t return false;\n\t }\n\t }\n\t\n\t function isSymbol(propType, propValue) {\n\t // Native Symbol.\n\t if (propType === 'symbol') {\n\t return true;\n\t }\n\t\n\t // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n\t if (propValue['@@toStringTag'] === 'Symbol') {\n\t return true;\n\t }\n\t\n\t // Fallback for non-spec compliant Symbols which are polyfilled.\n\t if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n\t return true;\n\t }\n\t\n\t return false;\n\t }\n\t\n\t // Equivalent of `typeof` but with special handling for array and regexp.\n\t function getPropType(propValue) {\n\t var propType = typeof propValue;\n\t if (Array.isArray(propValue)) {\n\t return 'array';\n\t }\n\t if (propValue instanceof RegExp) {\n\t // Old webkits (at least until Android 4.0) return 'function' rather than\n\t // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n\t // passes PropTypes.object.\n\t return 'object';\n\t }\n\t if (isSymbol(propType, propValue)) {\n\t return 'symbol';\n\t }\n\t return propType;\n\t }\n\t\n\t // This handles more types than `getPropType`. Only used for error messages.\n\t // See `createPrimitiveTypeChecker`.\n\t function getPreciseType(propValue) {\n\t if (typeof propValue === 'undefined' || propValue === null) {\n\t return '' + propValue;\n\t }\n\t var propType = getPropType(propValue);\n\t if (propType === 'object') {\n\t if (propValue instanceof Date) {\n\t return 'date';\n\t } else if (propValue instanceof RegExp) {\n\t return 'regexp';\n\t }\n\t }\n\t return propType;\n\t }\n\t\n\t // Returns a string that is postfixed to a warning about an invalid type.\n\t // For example, \"undefined\" or \"of type array\"\n\t function getPostfixForTypeWarning(value) {\n\t var type = getPreciseType(value);\n\t switch (type) {\n\t case 'array':\n\t case 'object':\n\t return 'an ' + type;\n\t case 'boolean':\n\t case 'date':\n\t case 'regexp':\n\t return 'a ' + type;\n\t default:\n\t return type;\n\t }\n\t }\n\t\n\t // Returns class name of the object, if any.\n\t function getClassName(propValue) {\n\t if (!propValue.constructor || !propValue.constructor.name) {\n\t return ANONYMOUS;\n\t }\n\t return propValue.constructor.name;\n\t }\n\t\n\t ReactPropTypes.checkPropTypes = checkPropTypes;\n\t ReactPropTypes.PropTypes = ReactPropTypes;\n\t\n\t return ReactPropTypes;\n\t};\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\t/**\n\t * Copyright (c) 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t *\n\t * \n\t */\n\t\n\tfunction makeEmptyFunction(arg) {\n\t return function () {\n\t return arg;\n\t };\n\t}\n\t\n\t/**\n\t * This function accepts and discards inputs; it has no side effects. This is\n\t * primarily useful idiomatically for overridable function endpoints which\n\t * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n\t */\n\tvar emptyFunction = function emptyFunction() {};\n\t\n\temptyFunction.thatReturns = makeEmptyFunction;\n\temptyFunction.thatReturnsFalse = makeEmptyFunction(false);\n\temptyFunction.thatReturnsTrue = makeEmptyFunction(true);\n\temptyFunction.thatReturnsNull = makeEmptyFunction(null);\n\temptyFunction.thatReturnsThis = function () {\n\t return this;\n\t};\n\temptyFunction.thatReturnsArgument = function (arg) {\n\t return arg;\n\t};\n\t\n\tmodule.exports = emptyFunction;\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {/**\n\t * Copyright (c) 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t *\n\t */\n\t\n\t'use strict';\n\t\n\t/**\n\t * Use invariant() to assert state which your program assumes to be true.\n\t *\n\t * Provide sprintf-style format (only %s is supported) and arguments\n\t * to provide information about what broke and what you were\n\t * expecting.\n\t *\n\t * The invariant message will be stripped in production, but the invariant\n\t * will remain to ensure logic does not differ in production.\n\t */\n\t\n\tvar validateFormat = function validateFormat(format) {};\n\t\n\tif (process.env.NODE_ENV !== 'production') {\n\t validateFormat = function validateFormat(format) {\n\t if (format === undefined) {\n\t throw new Error('invariant requires an error message argument');\n\t }\n\t };\n\t}\n\t\n\tfunction invariant(condition, format, a, b, c, d, e, f) {\n\t validateFormat(format);\n\t\n\t if (!condition) {\n\t var error;\n\t if (format === undefined) {\n\t error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n\t } else {\n\t var args = [a, b, c, d, e, f];\n\t var argIndex = 0;\n\t error = new Error(format.replace(/%s/g, function () {\n\t return args[argIndex++];\n\t }));\n\t error.name = 'Invariant Violation';\n\t }\n\t\n\t error.framesToPop = 1; // we don't care about invariant's own frame\n\t throw error;\n\t }\n\t}\n\t\n\tmodule.exports = invariant;\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {/**\n\t * Copyright 2014-2015, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t *\n\t */\n\t\n\t'use strict';\n\t\n\tvar emptyFunction = __webpack_require__(6);\n\t\n\t/**\n\t * Similar to invariant but only logs a warning if the condition is not met.\n\t * This can be used to log issues in development environments in critical\n\t * paths. Removing the logging code for production environments will keep the\n\t * same logic and follow the same code paths.\n\t */\n\t\n\tvar warning = emptyFunction;\n\t\n\tif (process.env.NODE_ENV !== 'production') {\n\t (function () {\n\t var printWarning = function printWarning(format) {\n\t for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t args[_key - 1] = arguments[_key];\n\t }\n\t\n\t var argIndex = 0;\n\t var message = 'Warning: ' + format.replace(/%s/g, function () {\n\t return args[argIndex++];\n\t });\n\t if (typeof console !== 'undefined') {\n\t console.error(message);\n\t }\n\t try {\n\t // --- Welcome to debugging React ---\n\t // This error was thrown as a convenience so that you can use this stack\n\t // to find the callsite that caused this warning to fire.\n\t throw new Error(message);\n\t } catch (x) {}\n\t };\n\t\n\t warning = function warning(condition, format) {\n\t if (format === undefined) {\n\t throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n\t }\n\t\n\t if (format.indexOf('Failed Composite propType: ') === 0) {\n\t return; // Ignore CompositeComponent proptype check.\n\t }\n\t\n\t if (!condition) {\n\t for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n\t args[_key2 - 2] = arguments[_key2];\n\t }\n\t\n\t printWarning.apply(undefined, [format].concat(args));\n\t }\n\t };\n\t })();\n\t}\n\t\n\tmodule.exports = warning;\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t/**\n\t * Copyright 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t */\n\t\n\t'use strict';\n\t\n\tvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\t\n\tmodule.exports = ReactPropTypesSecret;\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {/**\n\t * Copyright 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t */\n\t\n\t'use strict';\n\t\n\tif (process.env.NODE_ENV !== 'production') {\n\t var invariant = __webpack_require__(7);\n\t var warning = __webpack_require__(8);\n\t var ReactPropTypesSecret = __webpack_require__(9);\n\t var loggedTypeFailures = {};\n\t}\n\t\n\t/**\n\t * Assert that the values match with the type specs.\n\t * Error messages are memorized and will only be shown once.\n\t *\n\t * @param {object} typeSpecs Map of name to a ReactPropType\n\t * @param {object} values Runtime values that need to be type-checked\n\t * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n\t * @param {string} componentName Name of the component for error messages.\n\t * @param {?Function} getStack Returns the component stack.\n\t * @private\n\t */\n\tfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n\t if (process.env.NODE_ENV !== 'production') {\n\t for (var typeSpecName in typeSpecs) {\n\t if (typeSpecs.hasOwnProperty(typeSpecName)) {\n\t var error;\n\t // Prop type validation may throw. In case they do, we don't want to\n\t // fail the render phase where it didn't fail before. So we log it.\n\t // After these have been cleaned up, we'll let them throw.\n\t try {\n\t // This is intentionally an invariant that gets caught. It's the same\n\t // behavior as without this statement except with a better message.\n\t invariant(typeof typeSpecs[typeSpecName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', componentName || 'React class', location, typeSpecName);\n\t error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n\t } catch (ex) {\n\t error = ex;\n\t }\n\t warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error);\n\t if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n\t // Only monitor this failure once because there tends to be a lot of the\n\t // same error.\n\t loggedTypeFailures[error.message] = true;\n\t\n\t var stack = getStack ? getStack() : '';\n\t\n\t warning(false, 'Failed %s type: %s%s', location, error.message, stack != null ? stack : '');\n\t }\n\t }\n\t }\n\t }\n\t}\n\t\n\tmodule.exports = checkPropTypes;\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Copyright 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t */\n\t\n\t'use strict';\n\t\n\tvar emptyFunction = __webpack_require__(6);\n\tvar invariant = __webpack_require__(7);\n\tvar ReactPropTypesSecret = __webpack_require__(9);\n\t\n\tmodule.exports = function() {\n\t function shim(props, propName, componentName, location, propFullName, secret) {\n\t if (secret === ReactPropTypesSecret) {\n\t // It is still safe when called from React.\n\t return;\n\t }\n\t invariant(\n\t false,\n\t 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n\t 'Use PropTypes.checkPropTypes() to call them. ' +\n\t 'Read more at http://fb.me/use-check-prop-types'\n\t );\n\t };\n\t shim.isRequired = shim;\n\t function getShim() {\n\t return shim;\n\t };\n\t // Important!\n\t // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n\t var ReactPropTypes = {\n\t array: shim,\n\t bool: shim,\n\t func: shim,\n\t number: shim,\n\t object: shim,\n\t string: shim,\n\t symbol: shim,\n\t\n\t any: shim,\n\t arrayOf: getShim,\n\t element: shim,\n\t instanceOf: getShim,\n\t node: shim,\n\t objectOf: getShim,\n\t oneOf: getShim,\n\t oneOfType: getShim,\n\t shape: getShim\n\t };\n\t\n\t ReactPropTypes.checkPropTypes = emptyFunction;\n\t ReactPropTypes.PropTypes = ReactPropTypes;\n\t\n\t return ReactPropTypes;\n\t};\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _reactDom = __webpack_require__(13);\n\t\n\tvar _reactDom2 = _interopRequireDefault(_reactDom);\n\t\n\tvar _propTypes = __webpack_require__(3);\n\t\n\tvar _propTypes2 = _interopRequireDefault(_propTypes);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/no-find-dom-node: 0 */\n\t\n\t/**\n\t * ScrollSyncPane Component\n\t *\n\t * Wrap your content in it to keep its scroll position in sync with other panes\n\t *\n\t * @example ./example.md\n\t */\n\t\n\tvar ScrollSyncPane = function (_Component) {\n\t _inherits(ScrollSyncPane, _Component);\n\t\n\t function ScrollSyncPane() {\n\t var _ref;\n\t\n\t var _temp, _this, _ret;\n\t\n\t _classCallCheck(this, ScrollSyncPane);\n\t\n\t for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t args[_key] = arguments[_key];\n\t }\n\t\n\t return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = ScrollSyncPane.__proto__ || Object.getPrototypeOf(ScrollSyncPane)).call.apply(_ref, [this].concat(args))), _this), _this.toArray = function (groups) {\n\t return [].concat(groups);\n\t }, _temp), _possibleConstructorReturn(_this, _ret);\n\t }\n\t\n\t _createClass(ScrollSyncPane, [{\n\t key: 'componentDidMount',\n\t value: function componentDidMount() {\n\t if (this.props.enabled) {\n\t this.node = this.props.attachTo || _reactDom2.default.findDOMNode(this);\n\t this.context.registerPane(this.node, this.toArray(this.props.group));\n\t }\n\t }\n\t }, {\n\t key: 'componentDidUpdate',\n\t value: function componentDidUpdate(prevProps) {\n\t if (this.props.enabled && this.props.group !== prevProps.group) {\n\t this.context.unregisterPane(this.node, this.toArray(prevProps.group));\n\t this.context.registerPane(this.node, this.toArray(this.props.group));\n\t }\n\t }\n\t }, {\n\t key: 'componentWillUnmount',\n\t value: function componentWillUnmount() {\n\t if (this.props.enabled) {\n\t this.context.unregisterPane(this.node, this.toArray(this.props.group));\n\t }\n\t }\n\t }, {\n\t key: 'render',\n\t value: function render() {\n\t return this.props.children;\n\t }\n\t }]);\n\t\n\t return ScrollSyncPane;\n\t}(_react.Component);\n\t\n\tScrollSyncPane.propTypes = {\n\t children: _propTypes2.default.node.isRequired,\n\t attachTo: _propTypes2.default.object,\n\t group: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.arrayOf(_propTypes2.default.string)]),\n\t enabled: _propTypes2.default.bool\n\t};\n\tScrollSyncPane.defaultProps = {\n\t group: 'default',\n\t enabled: true\n\t};\n\tScrollSyncPane.contextTypes = {\n\t registerPane: _propTypes2.default.func,\n\t unregisterPane: _propTypes2.default.func\n\t};\n\texports.default = ScrollSyncPane;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_13__;\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=index.js.map","import type {SmallSALO} from '../types';\nimport {getSearchCriteriaFromSmallSALO} from './getSearchCriteriaFromSmallSALO';\n\nexport const decodeBase64Rules = (base64str: string) => {\n\ttry {\n\t\t// trust is key here ¯\\_(ツ)_/¯\n\t\tconst small: SmallSALO = JSON.parse(\n\t\t\tBuffer.from(decodeURIComponent(base64str), 'base64').toString(),\n\t\t);\n\t\treturn getSearchCriteriaFromSmallSALO(small);\n\t} catch (e) {}\n};\n\nexport default decodeBase64Rules;\n","import AssetSearchRulesCollection from '@netx/core-search/collections/searchRules_assets';\nimport type {SearchCriteria} from '../types';\n\n/**\n * Convert search rules to backbone search rules collection\\\n * For legacy compatability with old backbone code\n * @param conditions\n * @returns Asset search rules collection\n */\nexport const convertRulesToCollection = (\n\tconditions: Partial<SearchCriteria>,\n) => {\n\tconst ruleCount = conditions.elementTypes?.length;\n\tif (!ruleCount) return new AssetSearchRulesCollection([]);\n\tconst collection = new AssetSearchRulesCollection(\n\t\t(conditions.elementTypes || []).reduce((rules, elementType, index) => {\n\t\t\treturn [\n\t\t\t\t...rules,\n\t\t\t\t{\n\t\t\t\t\telementType,\n\t\t\t\t\telementSubType1: conditions.elementSubType1s![index],\n\t\t\t\t\telementSubType2: conditions.elementSubType2s![index],\n\t\t\t\t\telementValue1: conditions.elementValue1s![index],\n\t\t\t\t\telementValue2: conditions.elementValue2s![index],\n\t\t\t\t\telementValue3: conditions.elementValue3s![index],\n\t\t\t\t},\n\t\t\t];\n\t\t}, []),\n\t);\n\tcollection.sortField = conditions.sortField || 'file';\n\tcollection.sortOrder = conditions.sortOrder || 0;\n\tcollection.matchCriteria = conditions.matchCriteria || 0;\n\treturn collection;\n};\n\nexport default convertRulesToCollection;\n","var ___EXPOSE_LOADER_IMPORT___ = require(\"-!./backgrid.js\");\nvar ___EXPOSE_LOADER_GET_GLOBAL_THIS___ = require(\"../../../node_modules/expose-loader/dist/runtime/getGlobalThis.js\");\nvar ___EXPOSE_LOADER_GLOBAL_THIS___ = ___EXPOSE_LOADER_GET_GLOBAL_THIS___;\nif (typeof ___EXPOSE_LOADER_GLOBAL_THIS___[\"Backgrid\"] === 'undefined') ___EXPOSE_LOADER_GLOBAL_THIS___[\"Backgrid\"] = ___EXPOSE_LOADER_IMPORT___;\nmodule.exports = ___EXPOSE_LOADER_IMPORT___;\n","/**\n * Asset attribute set collection for generic events and methods shared betwen all our attribute set types\n * This collection is never to be used by itself - it should only ever be extended by other collections\n * @class\n * @todo DAM-11838 and then delete this class\n */\nimport Base from '@netx/core/lib/netx-collection';\n\nexport default class AssetAttributeSets_ extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @override\n\t * @param {array} models An array of models or model attributes\n\t * @param {object} opts Collection options\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.comparator = opts.comparator || 'name';\n\n\t\tsuper(models, opts);\n\n\t\t// Throttled/debounced methods\n\t\tthis.attributeSetsChanged = _.debounce(this.attributeSetsChanged, 25);\n\n\t\t/**\n\t\t * Contains all avialable attribute templates\n\t\t * @memberOf Netx.Collections.AssetAttributeSetsFiltered\n\t\t * @alias assetAttributes\n\t\t * @type {module:asset/collections/attributes}\n\t\t */\n\t\tthis.assetAttributes = opts.assetAttributes || Netx.asset.attributes;\n\n\t\t/**\n\t\t * Store all attribute ids returned in sets\n\t\t * This way we can quickly check if an attribute template is not in any of the attribute sets\n\t\t * @memberOf Netx.Collections.AssetAttributeSets\n\t\t * @alias allAttributeIds\n\t\t * @type {array}\n\t\t */\n\t\tthis.allAttributeIds = [];\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tthis,\n\t\t\t'change:attributeIds',\n\t\t\tthis.attributeSetsChanged,\n\t\t).listenTo(this, 'sync', this.attributeSetsChanged);\n\t}\n\n\t/**\n\t * Keep track of all attribute ids that belong to sets\n\t * @method\n\t */\n\tattributeSetsChanged() {\n\t\t// Get all the attribute ids in our sets\n\t\tthis.allAttributeIds = [\n\t\t\t...new Set(this.map(attrSet => attrSet.get('attributeIds')).flat()),\n\t\t];\n\t}\n\n\t/**\n\t * Middle man for `deleteMultiple`\n\t * @method\n\t * @param {array} ids Attribute set ids\n\t */\n\tdeleteAttributeSets(ids) {\n\t\treturn this.deleteMultiple(ids);\n\t}\n\n\t/**\n\t * Return a subset of our collection that omits any sets that are empty,\n\t * This is for the various places where we allow users to select an attribute set from\n\t * the complete list.\n\t * @method\n\t * @param {boolean} forEditing The sets are for editing (omit system attributes)\n\t * @returns {array} Array of `attributeSet` models\n\t */\n\tselectableSets(forEditing) {\n\t\tconst allAttributeIds = this.assetAttributes.ids(forEditing);\n\t\t// We do not want to show empty attribute sets\n\t\t// not empty\n\t\treturn this.filter(\n\t\t\tmodel =>\n\t\t\t\t_.intersection(allAttributeIds, model.get('attributeIds')).length > 0,\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetAttributeSets_';\n\t}\n}\n","/**\n * System attribute sets (managed by admin)\n * @class\n * @todo DAM-11838 and then delete this class\n */\nimport Base from './assetAttributeSet';\n\nexport default class AssetAttributeSet_System extends Base {\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'collectionid';\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {number} defaults.collectionid - The default system attribute set `id`\n\t * @property {number} defaults.active - The default system attribute `active` state (boolean as number)\n\t * @property {array} defaults.attributeNames - The default attribute template names\n\t * @property {array} defaults.triggerIds - The default `trigger ids` for system attribute set (deprecated)\n\t * @property {number} defaults.triggerType - The default `trigger type` for system attribute set (deprecated)\n\t */\n\tget defaults() {\n\t\treturn _.extend(super.defaults, {\n\t\t\t// collectionid: 0,\n\t\t\tactive: 1,\n\t\t\tattributeNames: [],\n\t\t\ttriggerIds: [],\n\t\t\ttriggerType: 0,\n\t\t});\n\t}\n\n\t/**\n\t * @property {object} methods - Model RPC methods\n\t * @property {array} methods.create - Create new system attribute set\n\t * @property {array} methods.read - Fetch system attribute set\n\t * @property {array} methods.remove - Destroy system attribute set\n\t * @property {array} methods.update - Update system attribute set\n\t */\n\tget methods() {\n\t\treturn _.extend(super.methods, {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate(opts) {\n\t\t\t\treturn ['setCollection', this.self()];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn ['getCollectionObjects', [this.id]];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tremove(opts) {\n\t\t\t\treturn ['deleteCollection', this.id];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdate(opts) {\n\t\t\t\treturn ['setCollection', this.self()];\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @property {object} parsers - Model parsers\n\t * @property {function} parsers.read - Parse the return of our fetch, it is an array with a single record\n\t * @property {function} parsers.create - Parse the return of our create (we need to get full beans returned on creations and updates)\n\t */\n\tget parsers() {\n\t\treturn _.extend(super.parsers, {\n\t\t\t/**\n\t\t\t * Because there is no call to get a single result (well a result that isn't within an array)\n\t\t\t * @function\n\t\t\t * @param {array} data An array containing a single system attribute set\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(data, opts) {\n\t\t\t\treturn Array.isArray(data) ? data[0] : null;\n\t\t\t},\n\t\t\t/**\n\t\t\t * Because we do not get back full beans\n\t\t\t * @function\n\t\t\t * @param {object} data An object containing validation and the new records's `id`\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate(data, opts) {\n\t\t\t\t// We get an id back now - one day it would be nice for all of our update/create calls to return the full bean\n\t\t\t\tthis.set({collectionid: data.id});\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attr Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'change:attributeIds', this.attributeIdsUpdated);\n\t}\n\n\t/** @method */\n\tattributeIdsUpdated() {\n\t\tconst assetAttributes = this.assetAttributes;\n\t\t// Update names array (should be going away one day...)\n\t\tthis.set({\n\t\t\tattributeNames: this.get('attributeIds')\n\t\t\t\t.map(id => {\n\t\t\t\t\tconst attr = assetAttributes.get(parseInt(id));\n\t\t\t\t\treturn attr && attr.get('name');\n\t\t\t\t})\n\t\t\t\t.filter(id => id != null),\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} data Data\n\t * @param {object} opts Options\n\t */\n\tparseAndSave(data, opts) {\n\t\t// We cannot currently save attributes at creation\n\t\t// must create first and then save attributes\n\t\tif (this.isNew()) {\n\t\t\treturn this.save(\n\t\t\t\t{\n\t\t\t\t\tactive: data.active ? 1 : 0,\n\t\t\t\t\tname: data.name,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t).then(() => {\n\t\t\t\t// Update attributes if passed\n\t\t\t\tif (data.attributeIds != null) {\n\t\t\t\t\treturn this.save(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tattributeIds: data.attributeIds,\n\t\t\t\t\t\t},\n\t\t\t\t\t\topts,\n\t\t\t\t\t).then(() => {\n\t\t\t\t\t\t// Refetch since we do not get full beans back on create\n\t\t\t\t\t\tthis.fetch(opts);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Refetch since we do not get full beans back on create\n\t\t\t\treturn this.fetch(opts);\n\t\t\t});\n\t\t}\n\n\t\treturn this.save(\n\t\t\t{\n\t\t\t\tattributeIds: data.attributeIds || [],\n\t\t\t\tactive: data.active ? 1 : 0,\n\t\t\t\tname: data.name,\n\t\t\t},\n\t\t\topts,\n\t\t);\n\t}\n\n\t/**\n\t * Provided with an parallel arrays of attribute names and ids, set them on this model and populate\n\t * @method\n\t * @param {array} attributeNames An array of attibute names\n\t * @param {array} attributeIds An array of attribute ids\n\t */\n\tsetAttributes(attributeNames, attributeIds) {\n\t\tthis.set({\n\t\t\tattributeIds: attributeIds,\n\t\t\tattributeNames: attributeNames,\n\t\t});\n\t\tthis.populateAttributes();\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetAttributeSet_System';\n\t}\n}\n","/**\n * System attribute sets (managed by admins)\n * @class\n * @extends Netx.Collections.AssetAttributeSets_\n * @todo DAM-11838 and then delete this class\n */\nimport Base from './assetAttributeSets_';\nimport Model from '../models/assetAttributeSet_system';\n\nexport default class AssetAttributeSets_System extends Base {\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {array} methods.getIds - Fetch collection ids\n\t * @property {array} methods.getObjects - Fetch collection objects\n\t * @property {function} methods.read - Fetch the collection ids and the collection object in one read\n\t */\n\tget methods() {\n\t\treturn _.extend(super.methods, {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\t// Get object IDs:\n\t\t\t\treturn this.getIds(opts).then(ids => this.getObjects(ids, opts));\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @todo get a call that returns all collection objects without needing to fetch ids first\n\t\t\t */\n\t\t\tgetIds: ['getAllCollectionIds'],\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {array} collectionIds Collection ids\n\t\t\t * @param {object} opts Options\n\t\t\t * @todo get a call that returns all collection objects without needing to fetch ids first\n\t\t\t */\n\t\t\tgetObjects(collectionIds, opts) {\n\t\t\t\treturn ['getCollectionObjects', collectionIds];\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {function} parsers.getObjects - Parse the results of our collection objects (see TODO in `methods`)\n\t */\n\tget parsers() {\n\t\treturn _.extend(super.parsers, {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} data Attribute set objects\n\t\t\t * @param {array} collectionIds Collection ids\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tgetObjects(data, collectionIds, opts) {\n\t\t\t\t// This is to ensure we do not get placeholder objects or the \"All Attributes\"\n\t\t\t\t// (which is not maintained and needs to be renamed to 'default' as the name 'All Attributes' is incorrect since it does not add attributes to it as they are added to the system)\n\t\t\t\treturn data\n\t\t\t\t\t? data.filter(\n\t\t\t\t\t\t\td =>\n\t\t\t\t\t\t\t\td.collectionid &&\n\t\t\t\t\t\t\t\td.collectionid !== 0 &&\n\t\t\t\t\t\t\t\td.name !== 'All Attributes',\n\t\t\t\t\t )\n\t\t\t\t\t: [];\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @listens module:system#system:attributes:attributeSet:edit:success\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'system:attributes:attributeSet:edit:success',\n\t\t\t(attributeSet, isNew) => {\n\t\t\t\tisNew && this.unshift(attributeSet);\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Return a subset of our collection that omits any sets that are empty or inactive.\n\t * This is for the various places where we allow users to select an attribute set from\n\t * the complete list.\n\t * @override\n\t * @param {boolean} forEditing The sets are for editing (omit system attributes)\n\t * @returns {array} `attributeSet` models\n\t */\n\tselectableSets(forEditing) {\n\t\tconst allAttributeIds = this.assetAttributes.ids(forEditing);\n\t\t// We do not want to show inactive or empty attribute sets\n\t\t// not empty && not inactive\n\t\treturn this.filter(\n\t\t\tmodel =>\n\t\t\t\tmodel.get('active') === 1 &&\n\t\t\t\t_.intersection(allAttributeIds, model.get('attributeIds')).length > 0,\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetAttributeSets_System';\n\t}\n}\n","/**\n * User attribute sets\n * @class\n * @todo DAM-11838 This collection is recreating everything in Netx.Collections.AssetAttributeSets due to the fact in 8.12\n * we have to maintain the system sets (collections) - the system sets do not relate to a shared resource at all and\n * so cannot extend the shared resource collection. When we are able to deprecate the system sets this collection will\n * be renamed to AssetAttributeSets and be the only collection for attribute sets (period).\n */\nimport Base from '@netx/core-share/collections/sharedResources';\nimport Model from '../models/assetAttributeSet_user';\n\nexport default class AssetAttributeSets_User extends Base {\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn _.extend(super.xhrLoadingMessages, {\n\t\t\tgetSharedResources() {\n\t\t\t\treturn this.isFiltered()\n\t\t\t\t\t? 'Filtering attribute sets'\n\t\t\t\t\t: 'Loading attribute sets';\n\t\t\t},\n\t\t});\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn _.extend(super.xhrLoadedMessages, {\n\t\t\tgetSharedResources() {\n\t\t\t\treturn this.isFiltered()\n\t\t\t\t\t? 'Filtered attribute sets'\n\t\t\t\t\t: 'Loaded attribute sets';\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @listens module:user#user:attributeSet:edit:success\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.comparator = opts.comparator || 'name';\n\t\topts.model = opts.model || Model;\n\t\topts.resourceName = 'attributeSet';\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Contains all avialable attribute templates\n\t\t * @memberOf Netx.Collections.AssetAttributeSetsFiltered\n\t\t * @alias assetAttributes\n\t\t * @type {module:asset/collections/attributes}\n\t\t */\n\t\tthis.assetAttributes = opts.assetAttributes || Netx.asset.attributes;\n\n\t\t/**\n\t\t * Store all attribute ids returned in sets\n\t\t * This way we can quickly check if an attribute template is not in any of the attribute sets\n\t\t * @memberOf Netx.Collections.AssetAttributeSets\n\t\t * @alias allAttributeIds\n\t\t * @type {array}\n\t\t */\n\t\tthis.allAttributeIds = [];\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tthis,\n\t\t\t'change:attributeIds',\n\t\t\t_.debounce(this.attributeSetsChanged, 50),\n\t\t)\n\t\t\t.listenTo(this, 'sync', this.attributeSetsChanged)\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'user:attributeSet:edit:success',\n\t\t\t\t(model, isNew) => {\n\t\t\t\t\t// TODO: Check mode filters first once we introduce filters/paging in the UI\n\t\t\t\t\tisNew && this.add(model.attributes);\n\t\t\t\t},\n\t\t\t);\n\t}\n\n\t/**\n\t * Keep track of all attribute ids that belong to sets\n\t * @method\n\t */\n\tattributeSetsChanged() {\n\t\t// Get all the attribute ids in our sets\n\t\tthis.allAttributeIds = [\n\t\t\t...new Set(\n\t\t\t\tthis.map(attrSet => attrSet.get('attributeIds'))\n\t\t\t\t\t.flat()\n\t\t\t\t\t.filter(id => id != null),\n\t\t\t),\n\t\t];\n\t}\n\n\t/**\n\t * Middle man for `deleteMultiple`\n\t * @method\n\t * @param {array} ids Attribute set ids\n\t */\n\tdeleteAttributeSets(ids) {\n\t\treturn this.deleteMultiple(ids);\n\t}\n\n\t/**\n\t * Return a subset of our collection that omits any sets that are empty,\n\t * This is for the various places where we allow users to select an attribute set from\n\t * the complete list.\n\t * @method\n\t * @param {boolean} forEditing The sets are for editing (omit system attributes)\n\t * @returns {array} `attributeSet` models\n\t */\n\tselectableSets(forEditing) {\n\t\tconst allAttributeIds = this.assetAttributes.ids(forEditing);\n\t\t// We do not want to show empty attribute sets\n\t\t// not empty\n\t\treturn this.filter(\n\t\t\tmodel =>\n\t\t\t\tmodel.get('contentCount') > 0 ||\n\t\t\t\t_.intersection(allAttributeIds, model.get('attributeIds')).length > 0,\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetAttributeSets_User';\n\t}\n}\n","/**\n * Filter attribute sets (managed by portals)\n * @class\n * @extends Netx.Collections.AssetAttributeSets_\n */\nimport Base from './assetAttributeSets_';\nimport Model from '../models/assetAttributeSet';\n\nexport default class AssetAttributeSets_Filter extends Base {\n\t/**\n\t * @override\n\t * @listens module:system#system:attributes:attributeSet:edit:success\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\t}\n\n\t/**\n\t * Return a subset of our collection that omits any sets that are empty or inactive.\n\t * This is for the various places where we allow users to select an attribute set from\n\t * the complete list.\n\t * @override\n\t * @param {boolean} forEditing The sets are for editing (omit system attributes)\n\t * @returns {array} `attributeSet` models\n\t */\n\tselectableSets(forEditing) {\n\t\tconst allAttributeIds = this.assetAttributes.ids(forEditing);\n\t\t// We do not want to show inactive or empty attribute sets\n\t\t// not empty && not inactive\n\t\treturn this.filter(\n\t\t\t(model) =>\n\t\t\t\t_.intersection(allAttributeIds, model.get('attributeIds')).length > 0,\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetAttributeSets_Filter';\n\t}\n}\n","import {SEARCH_SORT_SYSTEM_ATTRIBUTES} from '@netx/core-search-rules/constants';\nimport hasUpdatedAttributesSystem from './hasUpdatedAttributesSystem';\nimport {ATTRIBUTE_CONTEXT, DEFAULT_ATTRIBUTE_IDS} from '../constants';\nimport type {AttributeContext, BrandPortal} from '../types';\n\nimport {assetAttributes} from '@netx/core-asset/collections/singleton/attributes';\n\n// TODO: right now this is supporting the brand portal model and the new brand portal settings context\n// the items using this right now are in js and will not care but eventually need to get the two as the same\n// Maybe keeping goo was a mistake on my part... but spreading it on the top of the model also doesn't strike\n// me as the \"correct\" move but ¯\\_(ツ)_/¯\n// So throughout this we will first check the top level and then check the goo\n\n/**\n * Get attribute ids for context\n * @param portal Brand portal\n * @param context Attribute context\n * @param attributeIds Use these attribute ids over the main collection's (will still filter down in the end to make sure no erroneous ids are in there)\n * @return Attribute ids\n */\nexport const getAttributesIdsForContext = (\n\tportal: BrandPortal,\n\tcontext: AttributeContext,\n\tattributeIds?: number[],\n) => {\n\tlet attrIds: number[] = [];\n\n\t// Trust that they have selected exactly what they wanted\n\tif (hasUpdatedAttributesSystem(portal)) {\n\t\tattrIds = portal[context] || portal.goo[context] || [];\n\t}\n\t// Still have not updated the portal since upgrade\n\telse {\n\t\tswitch (context) {\n\t\t\tcase ATTRIBUTE_CONTEXT.DETAIL: {\n\t\t\t\tconst ctx =\n\t\t\t\t\tportal[ATTRIBUTE_CONTEXT.DETAIL] ||\n\t\t\t\t\tportal.goo[ATTRIBUTE_CONTEXT.DETAIL];\n\t\t\t\t// Apply defaults if none are set\n\t\t\t\tattrIds = ctx.length ? ctx : DEFAULT_ATTRIBUTE_IDS;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ATTRIBUTE_CONTEXT.SORT:\n\t\t\t\t// Just return all of them (within reason)\n\t\t\t\tattrIds = attributeIds || portal.attributeIds;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn attrIds.filter(\n\t\t(id) =>\n\t\t\tassetAttributes.get(id) != null &&\n\t\t\t(context !== ATTRIBUTE_CONTEXT.SORT ||\n\t\t\t\tid > 0 ||\n\t\t\t\tSEARCH_SORT_SYSTEM_ATTRIBUTES.includes(id)),\n\t);\n};\n\nexport default getAttributesIdsForContext;\n","import type {\n\tBrandPortal,\n\tBrandPortalSettingsData,\n\tGooSettingKey,\n\tSettingKey,\n} from '../types';\nimport {GOO_SETTING_KEYS, SETTING_KEYS} from '../constants';\n\n/**\n * Destructure editable data back into a brand portal\n * @param brandPortal Brand portal\n * @param settingsData Settings data\n */\nexport const settingsDataToBrandPortal = (\n\tbrandPortal: BrandPortal,\n\tsettingsData: Partial<BrandPortalSettingsData>,\n): BrandPortal => ({\n\t...brandPortal,\n\t...SETTING_KEYS.reduce(\n\t\t(accum, key) => ({\n\t\t\t...accum,\n\t\t\t[key]: settingsData[key],\n\t\t}),\n\t\t{} as Pick<BrandPortalSettingsData, SettingKey>,\n\t),\n\tgoo: {\n\t\t...brandPortal.goo,\n\t\t...GOO_SETTING_KEYS.reduce(\n\t\t\t(accum, key) => ({\n\t\t\t\t...accum,\n\t\t\t\t[key]: settingsData[key],\n\t\t\t}),\n\t\t\t{} as Pick<BrandPortalSettingsData, GooSettingKey>,\n\t\t),\n\t},\n});\n\nexport default settingsDataToBrandPortal;\n","/**\n * This is our generic attribute sets collection\n * This allows us to present both the user and system defined attributes sets in one place\n * Do not use this collection for data manipulation - just fetch it and forget it\n * @class\n * @todo DAM-11838 When we are able to deprecate the system sets this collection will cease to exist\n * and UserAssetAttributeSets will be renamed to AssetAttributeSets and be the only collection\n * for attribute sets (period).\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetAttributeSet';\n\nimport Netx from '@netx/core/bootstrap';\nimport {i18n} from '@netx/core/i18n';\n\nimport SystemAssetAttributeSetsCollection from '../collections/assetAttributeSets_system';\nimport UserAssetAttributeSetsCollection from '../collections/assetAttributeSets_user';\nimport FilterAttributeSetCollection from '../collections/assetAttributeSets_filter';\n\nimport {ATTRIBUTE_CONTEXT as PORTAL_ATTRIBUTE_CONTEXT} from '@netx/core-cms/services/settings/constants';\nimport {ATTRIBUTE_CONTEXT_LABELS as PORTAL_ATTRIBUTE_CONTEXT_LABELS} from '@netx/core-cms/services/settings/locales';\nimport {getAttributesIdsForContext} from '@netx/core-cms/services/settings/utils';\nimport {isPortal} from '@netx/core/lib/utils';\n\nimport {SEARCH_SORT_SYSTEM_ATTRIBUTES} from '@netx/core-search-rules/constants';\n\nconst getPortal = () => isPortal() && Netx.cms?.portal?.id && Netx.cms?.portal;\nexport default class AssetAttributeSets extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {function} */\n\tcomparator(a, b) {\n\t\t// Mandatory comes first\n\t\tif (a.id === 'mandatory') return -1;\n\t\tif (b.id === 'mandatory') return 1;\n\n\t\t// Default name comparison\n\t\treturn a.get('name').localeCompare(b.get('name'));\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {function} methods.read - Fetch user and system attribute sets\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * We need to fetch both the system and user sets, as well as add in our \"all\" client side set\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\t// Not for token users\n\t\t\t\t// but not an error either\n\t\t\t\tif (Netx.session.getToken()) {\n\t\t\t\t\treturn new $.Deferred().resolve([]);\n\t\t\t\t}\n\n\t\t\t\treturn this.when(\n\t\t\t\t\tthis.fetchSets('system', opts),\n\t\t\t\t\tthis.fetchSets('user', opts),\n\t\t\t\t).then((systemSets, userSets) => {\n\t\t\t\t\tconst assetAttributes = this.assetAttributes;\n\n\t\t\t\t\t// DAM-20153\n\t\t\t\t\t// portal attributes - this will one day be a feature of theme proper\n\t\t\t\t\t// as well\n\t\t\t\t\tconst portal = getPortal();\n\t\t\t\t\tif (portal) {\n\t\t\t\t\t\tthis.filters\n\t\t\t\t\t\t\t.set(\n\t\t\t\t\t\t\t\tObject.values(PORTAL_ATTRIBUTE_CONTEXT).reduce(\n\t\t\t\t\t\t\t\t\t(accum, context) => {\n\t\t\t\t\t\t\t\t\t\tconst portalContextAttrIds = getAttributesIdsForContext(\n\t\t\t\t\t\t\t\t\t\t\tportal.attributes,\n\t\t\t\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\t\t\t\tassetAttributes.ids(),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\t\t\t...accum,\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tattributeNames: portalContextAttrIds.map((attrId) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tassetAttributes.get(attrId)?.get('name'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\tattributeIds: portalContextAttrIds,\n\t\t\t\t\t\t\t\t\t\t\t\tid: context,\n\t\t\t\t\t\t\t\t\t\t\t\tname: PORTAL_ATTRIBUTE_CONTEXT_LABELS[context],\n\t\t\t\t\t\t\t\t\t\t\t\tactive: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.forEach((model) => model.populateAttributes());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst attributeNames = assetAttributes.pluck('name');\n\t\t\t\t\t\tconst attributeIds = assetAttributes.ids();\n\t\t\t\t\t\tthis.filters\n\t\t\t\t\t\t\t.set(\n\t\t\t\t\t\t\t\tObject.values(PORTAL_ATTRIBUTE_CONTEXT).reduce(\n\t\t\t\t\t\t\t\t\t(accum, context) => {\n\t\t\t\t\t\t\t\t\t\tlet _attributeNames = attributeNames;\n\t\t\t\t\t\t\t\t\t\tlet _attributeIds = attributeIds;\n\t\t\t\t\t\t\t\t\t\tif (context === 'sortAttributes') {\n\t\t\t\t\t\t\t\t\t\t\tconst filtered = assetAttributes.filter(\n\t\t\t\t\t\t\t\t\t\t\t\t(attr) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t!attr.get('system') ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tSEARCH_SORT_SYSTEM_ATTRIBUTES.includes(attr.id),\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t_attributeNames = filtered.map((attr) =>\n\t\t\t\t\t\t\t\t\t\t\t\tattr.get('name'),\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t_attributeIds = filtered.map((attr) => attr.id);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\t\t\t...accum,\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tattributeNames: _attributeNames,\n\t\t\t\t\t\t\t\t\t\t\t\tattributeIds: _attributeIds,\n\t\t\t\t\t\t\t\t\t\t\t\tid: context,\n\t\t\t\t\t\t\t\t\t\t\t\tname: PORTAL_ATTRIBUTE_CONTEXT_LABELS[context],\n\t\t\t\t\t\t\t\t\t\t\t\tactive: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.forEach((model) => model.populateAttributes());\n\t\t\t\t\t}\n\n\t\t\t\t\t// Concat our data and add the \"All\" attribute set\n\t\t\t\t\tconst data = systemSets.concat(\n\t\t\t\t\t\tuserSets.concat([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tattributeNames: assetAttributes.pluck('name'),\n\t\t\t\t\t\t\t\tattributeIds: assetAttributes.ids(),\n\t\t\t\t\t\t\t\tid: 'all',\n\t\t\t\t\t\t\t\tname: i18n.t('i18n.allAttributes'),\n\t\t\t\t\t\t\t\tactive: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Update some things first\n\t\t\t\t\t// Get all the attribute ids in our sets\n\t\t\t\t\tthis.allAttributeIds = [\n\t\t\t\t\t\t...new Set(\n\t\t\t\t\t\t\tdata\n\t\t\t\t\t\t\t\t.map((m) => {\n\t\t\t\t\t\t\t\t\t// Do not inlcude these client side sets\n\t\t\t\t\t\t\t\t\tif (m.id === 'all' || m.id === 'mandatory') return;\n\t\t\t\t\t\t\t\t\treturn m.attributeIds;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.flat()\n\t\t\t\t\t\t\t\t.filter((id) => id != null),\n\t\t\t\t\t\t),\n\t\t\t\t\t];\n\n\t\t\t\t\t// If we have any mandatory attributes - put them first\n\t\t\t\t\tconst mandatoryAttrs = this.getMandatoryAttributes(false, true);\n\t\t\t\t\tif (mandatoryAttrs.length) {\n\t\t\t\t\t\tthis.hasMandatoryAttributes = true;\n\t\t\t\t\t\tdata.unshift({\n\t\t\t\t\t\t\tid: 'mandatory',\n\t\t\t\t\t\t\tname: i18n.t('i18n.mandatory'),\n\t\t\t\t\t\t\tattributeNames: mandatoryAttrs.pluck('name'),\n\t\t\t\t\t\t\tattributeIds: mandatoryAttrs.ids(),\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.hasMandatoryAttributes = false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn data;\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {array} models An array of models or model attributes\n\t * @param {object} opts Collection options\n\t * @listens module:user#user:attributeSet:edit:success\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t// Debounced methods\n\t\tthis.attributesChanged = _.debounce(this.attributesChanged, 50);\n\n\t\t/**\n\t\t * Contains all avialable attribute templates\n\t\t * @memberOf Netx.Collections.AssetAttributeSetsFiltered\n\t\t * @alias assetAttributes\n\t\t * @type {module:asset/collections/attributes}\n\t\t */\n\t\tthis.assetAttributes =\n\t\t\topts.assetAttributes || Netx.getAttributesByObjectType('asset');\n\n\t\t/**\n\t\t * Store all attribute ids in sets\n\t\t * This way we can quickly check if an attribute template is not in any of the attribute sets\n\t\t * @memberOf Netx.Collections.AssetAttributeSets\n\t\t * @alias allAttributeIds\n\t\t * @type {array}\n\t\t */\n\t\tthis.allAttributeIds = [];\n\n\t\t/**\n\t\t * Do we have any mandatory attributes in sets\n\t\t * @memberOf Netx.Collections.AssetAttributeSets\n\t\t * @alias hasMandatoryAttributes\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.hasMandatoryAttributes = false;\n\n\t\t/**\n\t\t * A collection containg our system sets\n\t\t * @memberOf Netx.Collections.AssetAttributeSets\n\t\t * @alias system\n\t\t * @type {Netx.Collections.AssetAttributeSets_system}\n\t\t */\n\t\tthis.system = new SystemAssetAttributeSetsCollection([], {\n\t\t\tassetAttributes: this.assetAttributes,\n\t\t});\n\t\tthis.addSubCollection(this.system);\n\n\t\t/**\n\t\t * A collection containg our user sets\n\t\t * @memberOf Netx.Collections.AssetAttributeSets\n\t\t * @alias user\n\t\t * @type {Netx.Collections.AssetAttributeSets_user}\n\t\t */\n\t\tthis.user = new UserAssetAttributeSetsCollection([], {\n\t\t\tassetAttributes: this.assetAttributes,\n\t\t});\n\t\tthis.addSubCollection(this.user);\n\n\t\tthis.filters = new FilterAttributeSetCollection([], {\n\t\t\tassetAttributes: this.assetAttributes,\n\t\t});\n\t\tthis.addSubCollection(this.filters);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'add remove', _.debounce(this.attributeSetsChanged, 50))\n\t\t\t.listenTo(this, 'change:attributeIds', (model, attributeIds, opts) => {\n\t\t\t\t// Ignore if this change was the result of a fetch\n\t\t\t\tif (opts.duplicateQueryPolicy) return;\n\t\t\t\tthis.attributeSetsChanged(model);\n\t\t\t})\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'user:attributeSet:edit:success',\n\t\t\t\t(model, isNew) => {\n\t\t\t\t\t// TODO: Check mode filters first once we introduce filters/paging in the UI\n\t\t\t\t\tif (!isNew) return;\n\t\t\t\t\t// TODO: This is a hack until the user and system sets are unified - see todo in class description\n\t\t\t\t\t// Bandaids for the fractured system vs user (shared resource) sets\n\t\t\t\t\tconst defaults = {\n\t\t\t\t\t\t...Model.GetDefaults(),\n\t\t\t\t\t\ttitle: '',\n\t\t\t\t\t\tcontentCount: 0,\n\t\t\t\t\t};\n\t\t\t\t\tconst picked = _.pick.apply(\n\t\t\t\t\t\t_,\n\t\t\t\t\t\t[model.attributes].concat(Object.keys(defaults)),\n\t\t\t\t\t);\n\t\t\t\t\tconst attributes = {\n\t\t\t\t\t\t...picked,\n\t\t\t\t\t\tid: `user-${model.id}`,\n\t\t\t\t\t\t// Banaids for the fractured system vs user (shared resource) sets\n\t\t\t\t\t\tname: model.get('name') || model.get('title'),\n\t\t\t\t\t\ttitle: model.get('title') || model.get('name'),\n\t\t\t\t\t\tactive: 1,\n\t\t\t\t\t};\n\t\t\t\t\tthis.add(attributes);\n\t\t\t\t},\n\t\t\t);\n\n\t\t// This collection depends on attributes being available\n\t\tthis.listenTo(\n\t\t\tthis.assetAttributes,\n\t\t\t'sync',\n\t\t\tthis.attributesChanged,\n\t\t).listenTo(this, 'sync', () => {\n\t\t\tthis.stopListening(this.assetAttributes, 'add change remove')\n\t\t\t\t.listenTo(this.assetAttributes, 'add remove', this.attributesChanged)\n\t\t\t\t.listenTo(\n\t\t\t\t\tthis.assetAttributes,\n\t\t\t\t\t[\n\t\t\t\t\t\t'change:facet',\n\t\t\t\t\t\t'change:objectTypes',\n\t\t\t\t\t\t'change:mandatory',\n\t\t\t\t\t\t'change:restrictedUserLevel',\n\t\t\t\t\t\t'change:spec1',\n\t\t\t\t\t\t'change:spec2',\n\t\t\t\t\t\t'change:value',\n\t\t\t\t\t].join(' '),\n\t\t\t\t\tthis.attributesChanged,\n\t\t\t\t);\n\t\t});\n\n\t\t// Populate if our attributes\n\t\tthis.assetAttributes.syncedOnce && this.attributesChanged();\n\t}\n\n\t/**\n\t * @override\n\t * @param {array} models An array of models or model attributes\n\t * @param {object} opts Set options\n\t */\n\tset(models, opts = {}) {\n\t\t// Make sure our models get this:\n\t\tObject.assign(opts, {\n\t\t\tassetAttributes: this.assetAttributes,\n\t\t});\n\t\treturn super.set(models, opts);\n\t}\n\n\t/**\n\t * Keep track of all attribute ids that belong to sets\n\t * @method\n\t * @param {module:asset/models/assetAttributeSet} model Attribute set (if responsible for change)\n\t */\n\tattributeSetsChanged(model) {\n\t\t// Get all the attribute ids in our sets\n\t\tthis.allAttributeIds = [\n\t\t\t// Get a unique array of attribute ids\n\t\t\t...new Set(\n\t\t\t\tthis.map((attrSet) => {\n\t\t\t\t\t// Do not inlcude these client side sets\n\t\t\t\t\tif (attrSet.id === 'all' || attrSet.id === 'mandatory') return;\n\t\t\t\t\treturn attrSet.get('attributeIds');\n\t\t\t\t})\n\t\t\t\t\t.flat()\n\t\t\t\t\t.filter((attrSet) => attrSet != null),\n\t\t\t),\n\t\t];\n\n\t\t// Update mandatory attrs\n\t\tthis.updateMandatory();\n\n\t\t// Fire custom event - think of this as the actual sync for attribute sets (this can be the result of a fetch or changes to our underlying sets)\n\t\tthis.trigger('nx:change:attributeSets', this.assetAttributes, this, model);\n\t}\n\n\t/**\n\t * @method\n\t * @param {Netx.Models.Attribute} attr Attribute model\n\t */\n\tattributesChanged(attr) {\n\t\treturn this.fetch({duplicateQueryPolicy: 'abort', reset: true});\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} type Attribute set type\n\t * @param {object} opts Request options\n\t */\n\tfetchSets(type, opts) {\n\t\tconst attributeSets = this[type];\n\n\t\tif (!attributeSets || Netx.getUserLevel() <= 0) {\n\t\t\treturn new $.Deferred().resolve([]);\n\t\t}\n\n\t\t// Bandaids for the fractured system vs user (shared resource) sets\n\t\tconst defaults = {\n\t\t\t...this.model.GetDefaults(),\n\t\t\ttitle: '',\n\t\t\tcontentCount: 0,\n\t\t};\n\t\tconst defaultKeys = Object.keys(defaults);\n\n\t\t// This will take the data and only set set what is on the generic model's attributes as well as a custom id\n\t\tconst getGenericAttributes = (model) => {\n\t\t\tif (!model.id) return null;\n\t\t\tconst picked = _.pick.apply(_, [model.attributes].concat(defaultKeys));\n\t\t\treturn {\n\t\t\t\t...picked,\n\t\t\t\tid: `${type}-${model.id}`,\n\t\t\t\t// Banaids for the fractured system vs user (shared resource) sets\n\t\t\t\tname: model.get('name') || model.get('title'),\n\t\t\t\ttitle: model.get('title') || model.get('name'),\n\t\t\t};\n\t\t};\n\n\t\t// Stop listening\n\t\tthis.stopListening(attributeSets);\n\n\t\treturn attributeSets\n\t\t\t.fetch({duplicateQueryPolicy: 'abort', ...opts})\n\t\t\t.then((collection) => {\n\t\t\t\t// Listen again\n\t\t\t\tthis\n\t\t\t\t\t// When they add one, we add one\n\t\t\t\t\t.listenTo(attributeSets, 'add', (model, collection, opts) => {\n\t\t\t\t\t\t// console.log(\"add\", type, model, collection );\n\t\t\t\t\t\tmodel.id && this.add(getGenericAttributes(model));\n\t\t\t\t\t})\n\t\t\t\t\t// When they change, we change\n\t\t\t\t\t.listenTo(attributeSets, 'change', (model, opts) => {\n\t\t\t\t\t\tconst m = this.get(`${type}-${model.id}`);\n\t\t\t\t\t\tm && m.set(getGenericAttributes(model));\n\t\t\t\t\t})\n\t\t\t\t\t// When they remove one, we remove one\n\t\t\t\t\t.listenTo(attributeSets, 'remove', (model, collection, opts) => {\n\t\t\t\t\t\t// console.log(\"remove\", type, model, collection );\n\t\t\t\t\t\tthis.remove(`${type}-${model.id}`);\n\t\t\t\t\t})\n\t\t\t\t\t// When they reset, we \"reset\"\n\t\t\t\t\t.listenTo(attributeSets, 'reset', (collection, opts) => {\n\t\t\t\t\t\t// console.log(\"reset\", type, collection );\n\t\t\t\t\t\tthis.remove(this.filter((m) => m.id.includes(`${type}-`)));\n\t\t\t\t\t\tthis.set(\n\t\t\t\t\t\t\tcollection\n\t\t\t\t\t\t\t\t.map(getGenericAttributes)\n\t\t\t\t\t\t\t\t.filter((attrSet) => attrSet != null),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tremove: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t\t// When they sync, we sync\n\t\t\t\t\t.listenTo(attributeSets, 'sync', (collection, response, opts) => {\n\t\t\t\t\t\t// It was actually an attribute set model that synced\n\t\t\t\t\t\tif (collection.isModel) {\n\t\t\t\t\t\t\treturn this.add(getGenericAttributes(collection), {merge: true});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (collection !== attributeSets) return;\n\t\t\t\t\t\t// console.log(\"sync\", type, collection );\n\t\t\t\t\t\tthis.remove(this.filter((m) => m.id.includes(`${type}-`)));\n\t\t\t\t\t\tthis.set(\n\t\t\t\t\t\t\tcollection\n\t\t\t\t\t\t\t\t.map(getGenericAttributes)\n\t\t\t\t\t\t\t\t.filter((attrSet) => attrSet != null),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tremove: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn this.trigger('sync', this, response, opts);\n\t\t\t\t\t});\n\n\t\t\t\treturn attributeSets.map(getGenericAttributes);\n\t\t\t});\n\t}\n\n\t/**\n\t * Get an array of mandatory attribute names\n\t * @method\n\t * @param {boolean} withoutDefaultValues Only return attributes without default values\n\t * @return {array}\n\t */\n\tgetMandatoryAttributeNames(withoutDefaultValues) {\n\t\tconst attrs = this.getMandatoryAttributes(withoutDefaultValues);\n\t\treturn (attrs && attrs.pluck('name')) || [];\n\t}\n\n\t/**\n\t * Get a collection of the mandatory attributes\n\t * @method\n\t * @param {boolean} withoutDefaultValues Only return attributes without default values\n\t * @return {Netx.Collections.Attributes}\n\t */\n\tgetMandatoryAttributes(withoutDefaultValues, withoutSystem) {\n\t\t// Go through and get our mandatory attributes\n\t\treturn this.assetAttributes.getMandatory(\n\t\t\twithoutDefaultValues,\n\t\t\twithoutSystem,\n\t\t);\n\t}\n\n\t/**\n\t * Get all selectable attribute sets\n\t * @method\n\t * @param {boolean} forEditing The sets are for editing (omit system attributes)\n\t * @returns {object} Selectable sets by type\n\t */\n\tselectableSets(forEditing) {\n\t\t// Convert system defined sets to generic sets\n\t\tconst systemSets = this.system\n\t\t\t.selectableSets(forEditing)\n\t\t\t.map((attrSet) => this.get(`system-${attrSet.id}`))\n\t\t\t.filter((attrSet) => attrSet != null);\n\n\t\t// Convert user defined sets to generic sets\n\t\tconst userSets = this.user\n\t\t\t.selectableSets(forEditing)\n\t\t\t.map((attrSet) => this.get(`user-${attrSet.id}`))\n\t\t\t.filter((attrSet) => attrSet != null);\n\n\t\t// Concat them all\n\t\tconst selectableSets = systemSets.concat(userSets);\n\t\tselectableSets.unshift(this.get('all'));\n\n\t\treturn {\n\t\t\tall: selectableSets,\n\t\t\tclient: [this.get('all')],\n\t\t\tsystem: systemSets,\n\t\t\tuser: userSets,\n\t\t};\n\t}\n\n\t/**\n\t * Update our mandatory set\n\t * @method\n\t */\n\tupdateMandatory() {\n\t\tconst attrs = this.getMandatoryAttributes();\n\n\t\tif (!attrs.length) {\n\t\t\tthis.hasMandatoryAttributes = false;\n\t\t\tthis.remove('mandatory');\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have any mandatory attributes - put them first\n\t\tthis.hasMandatoryAttributes = true;\n\t\tthis.set(\n\t\t\t{\n\t\t\t\tid: 'mandatory',\n\t\t\t\tname: i18n.t('i18n.mandatory'),\n\t\t\t\tattributeIds: attrs.ids(),\n\t\t\t},\n\t\t\t{remove: false, merge: true},\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetAttributeSets';\n\t}\n}\n","export const ACTIONS = <const>{\n\tRESET: 'RESET',\n\tTOGGLE_SELECT_ALL_ROWS: 'TOGGLE_SELECT_ALL_ROWS',\n\tTOGGLE_SELECT_ROW: 'SELECT_ROW',\n};\n","import {ACTIONS} from './constants';\nimport type {State} from './reducer';\n\nexport type Action =\n\t| {type: typeof ACTIONS.RESET; state?: Partial<State>}\n\t| {\n\t\t\ttype: typeof ACTIONS.TOGGLE_SELECT_ROW;\n\t\t\trowId: string | number;\n\t\t\tselected?: boolean;\n\t }\n\t| {type: typeof ACTIONS.TOGGLE_SELECT_ALL_ROWS; selected?: boolean};\n\nexport const Actions = (dispatch: React.Dispatch<Action>) => ({\n\ttoggleRowSelected: (rowId: string | number, selected?: boolean) =>\n\t\tdispatch({type: ACTIONS.TOGGLE_SELECT_ROW, rowId, selected}),\n\n\ttoggleAllRowsSelected: (selected?: boolean) =>\n\t\tdispatch({type: ACTIONS.TOGGLE_SELECT_ALL_ROWS, selected}),\n});\n\nexport default Actions;\n","import {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nexport type State = {\n\trowsSelected: Array<string | number>;\n\trowsDeselected: Array<string | number>;\n\tallRowsSelected: boolean;\n\ttotalRows: number;\n\tcount: number;\n};\n\nexport const initialState: State = {\n\trowsSelected: [],\n\trowsDeselected: [],\n\tallRowsSelected: false,\n\ttotalRows: 0,\n\tcount: 0,\n};\n\nexport default (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.RESET:\n\t\t\treturn {\n\t\t\t\t...initialState,\n\t\t\t\t...action.state,\n\t\t\t\ttotalRows:\n\t\t\t\t\taction.state?.totalRows != null\n\t\t\t\t\t\t? action.state.totalRows\n\t\t\t\t\t\t: state.totalRows,\n\t\t\t};\n\t\tcase ACTIONS.TOGGLE_SELECT_ROW: {\n\t\t\t// TODO: CLEAN THIS UP!!!\n\n\t\t\t// if there are `rowsDeselected` then we assume that we once selected all\n\t\t\t// if there are `rowsSelected` then we assume that we are just gathering a loose selection\n\t\t\tlet allRowsSelected = state.allRowsSelected;\n\t\t\tlet rowsDeselected = state.rowsDeselected;\n\t\t\tlet rowsSelected = state.rowsSelected;\n\n\t\t\tlet selected = action.selected;\n\n\t\t\tlet count = state.count;\n\n\t\t\tif (action.selected == null) {\n\t\t\t\tif (\n\t\t\t\t\tstate.allRowsSelected ||\n\t\t\t\t\trowsSelected.includes(action.rowId) ||\n\t\t\t\t\t(rowsDeselected.length && !rowsDeselected.includes(action.rowId))\n\t\t\t\t) {\n\t\t\t\t\tselected = false;\n\t\t\t\t} else if (\n\t\t\t\t\trowsDeselected.includes(action.rowId) ||\n\t\t\t\t\t!rowsSelected.includes(action.rowId)\n\t\t\t\t) {\n\t\t\t\t\tselected = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (selected === true) {\n\t\t\t\tif (!state.allRowsSelected) {\n\t\t\t\t\tif (rowsDeselected.length) {\n\t\t\t\t\t\trowsDeselected = rowsDeselected.filter(\n\t\t\t\t\t\t\t(rowId) => rowId !== action.rowId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcount = state.totalRows - rowsDeselected.length;\n\t\t\t\t\t\tif (!rowsDeselected.length) {\n\t\t\t\t\t\t\tallRowsSelected = true;\n\t\t\t\t\t\t\tcount = state.totalRows;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trowsSelected = [...new Set(rowsSelected.concat([action.rowId]))];\n\t\t\t\t\t\tcount = rowsSelected.length;\n\t\t\t\t\t\tif (rowsSelected.length === state.totalRows) {\n\t\t\t\t\t\t\tallRowsSelected = true;\n\t\t\t\t\t\t\trowsSelected = [];\n\t\t\t\t\t\t\tcount = state.totalRows;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (selected === false) {\n\t\t\t\tif (state.allRowsSelected || rowsDeselected.length) {\n\t\t\t\t\tallRowsSelected = false;\n\t\t\t\t\trowsDeselected = [...new Set(rowsDeselected.concat([action.rowId]))];\n\t\t\t\t\tcount = state.totalRows - rowsDeselected.length;\n\t\t\t\t\tif (rowsDeselected.length === state.totalRows) {\n\t\t\t\t\t\trowsDeselected = [];\n\t\t\t\t\t\trowsSelected = [];\n\t\t\t\t\t\tcount = 0;\n\t\t\t\t\t}\n\t\t\t\t} else if (rowsSelected.length) {\n\t\t\t\t\trowsSelected = rowsSelected.filter((rowId) => rowId !== action.rowId);\n\t\t\t\t\tcount = rowsSelected.length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tcount,\n\t\t\t\tallRowsSelected,\n\t\t\t\trowsDeselected,\n\t\t\t\trowsSelected,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.TOGGLE_SELECT_ALL_ROWS:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tcount: action.selected ? state.totalRows : 0,\n\t\t\t\tallRowsSelected:\n\t\t\t\t\taction.selected != null ? action.selected : !state.allRowsSelected,\n\t\t\t\trowsSelected: [],\n\t\t\t\trowsDeselected: [],\n\t\t\t};\n\t}\n};\n","import {useEffect, useMemo, useReducer} from 'react';\n\nimport type {BaseItemData} from '../../types';\nimport {ACTIONS} from './constants';\nimport actions from './actions';\nimport reducer, {initialState} from './reducer';\n\nexport type UseTableRowSelectionParams = {\n\ttotalRows: number;\n\tallRowsSelected?: boolean;\n};\n\nexport const useTableRowSelection = ({\n\ttotalRows,\n\tallRowsSelected = false,\n}: UseTableRowSelectionParams) => {\n\tconst [state, dispatch] = useReducer(reducer, {\n\t\t...initialState,\n\t\ttotalRows,\n\t\tallRowsSelected,\n\t\tcount: allRowsSelected ? totalRows : 0,\n\t});\n\n\tconst dispatchActions = useMemo(() => actions(dispatch), []);\n\n\t// Reset when pertinent data updates\n\tuseEffect(() => {\n\t\tdispatch({\n\t\t\ttype: ACTIONS.RESET,\n\t\t\tstate: {\n\t\t\t\ttotalRows,\n\t\t\t\tallRowsSelected,\n\t\t\t\tcount: allRowsSelected ? totalRows : 0,\n\t\t\t},\n\t\t});\n\t}, [allRowsSelected, totalRows]);\n\n\tconst isSelected = (id: string | number) => {\n\t\tif (state.allRowsSelected) return true;\n\t\tif (state.rowsDeselected.length) return !state.rowsDeselected.includes(id);\n\t\tif (state.rowsSelected.length) return !state.rowsSelected.includes(id);\n\t\treturn false;\n\t};\n\n\treturn {\n\t\tstate,\n\t\t...dispatchActions,\n\t\tisSelected,\n\t};\n};\n\nexport default useTableRowSelection;\n","export const ACTIONS = <const>{\n\tRESET: 'RESET',\n\tSET_COLUMN_WIDTH: 'SET_COLUMN_WIDTH',\n\tSET_COLUMN_WIDTHS: 'SET_COLUMN_WIDTHS',\n\tSET_HAS_OVERFLOWN: 'SET_HAS_OVERFLOWN',\n\tSET_VIEWPORT_WIDTH: 'SET_VIEWPORT_WIDTH',\n};\n","import {ACTIONS} from './constants';\nimport type {State} from './reducer';\n\nexport type Action =\n\t| {type: typeof ACTIONS.RESET; data?: Partial<State>}\n\t| {type: typeof ACTIONS.SET_COLUMN_WIDTH; index: number; width: number}\n\t| {type: typeof ACTIONS.SET_COLUMN_WIDTHS; widths: number[]}\n\t| {type: typeof ACTIONS.SET_HAS_OVERFLOWN; overflown: boolean}\n\t| {type: typeof ACTIONS.SET_VIEWPORT_WIDTH; width: number};\n\nexport const Actions = (dispatch: React.Dispatch<Action>) => ({\n\tsetColumnWidth: (index: number, width: number) =>\n\t\tdispatch({type: ACTIONS.SET_COLUMN_WIDTH, index, width}),\n\tsetViewportWidth: (width: number) =>\n\t\tdispatch({type: ACTIONS.SET_VIEWPORT_WIDTH, width}),\n\tsetHasOverflown: (overflown: boolean) =>\n\t\tdispatch({type: ACTIONS.SET_HAS_OVERFLOWN, overflown}),\n});\n\nexport default Actions;\n","import {addToArrayUnique} from '@netx/core/lib/utils';\nimport type {ColumnSortType, ColumnType} from '../../types';\nimport {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nconst addUpArray = (arr: number[]) =>\n\tarr.reduce((accum, num) => accum + num, 0);\n\nconst keepWidthInBounds = (width: number, max: number, min: number) =>\n\tMath.max(Math.min(width, max), min);\n\nconst refitColumns = (\n\tviewportWidth: number,\n\tstate: State,\n\tincreaseOnly = false,\n) => {\n\tconst {\n\t\tcolumnCount,\n\t\tdirtyColumns,\n\t\tfrozenLeadingColumnCount,\n\t\tfrozenTrailingColumnCount,\n\t\toriginalColumnWidths,\n\t} = state;\n\n\tconst columnWidths = [...state.columnWidths];\n\n\tconst trueColumnWidths = columnWidths.map((width, index) =>\n\t\tdirtyColumns.includes(index) ? columnWidths[index] : width,\n\t);\n\tconst totalColumnWidths = addUpArray(trueColumnWidths);\n\n\tconst diff = viewportWidth - totalColumnWidths;\n\tlet spaceUsed = 0;\n\n\treturn columnWidths.map((columnWidth, index) => {\n\t\tif (dirtyColumns.includes(index)) return columnWidth;\n\t\tif (\n\t\t\t(diff < 0 && increaseOnly) ||\n\t\t\tindex < frozenLeadingColumnCount ||\n\t\t\t(frozenTrailingColumnCount &&\n\t\t\t\tindex >= columnCount - frozenTrailingColumnCount)\n\t\t)\n\t\t\treturn columnWidth;\n\n\t\tconst useSpace = (columnWidth / totalColumnWidths) * diff;\n\t\tspaceUsed += useSpace;\n\t\tconst width = Math.max(\n\t\t\tcolumnWidth + (columnWidth / totalColumnWidths) * diff,\n\t\t\toriginalColumnWidths[index],\n\t\t);\n\n\t\treturn index === columnWidths.length - 1 ||\n\t\t\t(frozenTrailingColumnCount &&\n\t\t\t\tindex === columnWidths.length - (frozenTrailingColumnCount + 1))\n\t\t\t? Math.max(width + (diff - spaceUsed), originalColumnWidths[index])\n\t\t\t: width;\n\t});\n};\n\nexport type State = {\n\tcolumnCount: number;\n\tcolumnWidths: number[];\n\tcolumnsOverflown: boolean;\n\tfrozenLeadingColumnCount: number;\n\tfrozenTrailingColumnCount: number;\n\tmaxColumnWidth: number;\n\tminColumnWidth: number;\n\toriginalColumnWidths: number[];\n\toverflown: boolean;\n\tpageSize: number;\n\tresizing: boolean;\n\trowHeight: number;\n\ttotalColumnsWidth: number;\n\tviewportWidth: number;\n\tdirtyColumns: number[];\n\ttotalNonFixedColumnsWidth: number;\n\ttotalLeadingFrozenColumnsWidth: number;\n\ttotalTrailingFrozenColumnsWidth: number;\n\n\tcolumnSortTypes: ColumnSortType[];\n\tcolumnTypes: ColumnType[];\n\tcolumnPositions: number[];\n\tcolumnsVisible: boolean[];\n\tcolumnsFrozen: boolean[];\n\tcolumnsFrozenLeading: boolean[];\n\tcolumnsFrozenTrailing: boolean[];\n\tcolumnsFirstFrozenTrailing?: number;\n\tcolumnsLastFrozenLeading?: number;\n\tfrozenLeadingColumnPositions: number[];\n\tfrozenTrailingColumnPositions: number[];\n};\n\nexport const initialState: State = {\n\tcolumnWidths: [],\n\tcolumnCount: 0,\n\tcolumnsOverflown: false,\n\tfrozenLeadingColumnCount: 1,\n\tfrozenTrailingColumnCount: 1,\n\tmaxColumnWidth: 0,\n\tminColumnWidth: 58,\n\toriginalColumnWidths: [],\n\toverflown: false,\n\tpageSize: 25,\n\tresizing: false,\n\trowHeight: 56,\n\t/** total width of _all_ columns */\n\ttotalColumnsWidth: 0,\n\tviewportWidth: 0,\n\tdirtyColumns: [],\n\ttotalLeadingFrozenColumnsWidth: 0,\n\ttotalTrailingFrozenColumnsWidth: 0,\n\t/** total width of non-fixed(frozen) columns */\n\ttotalNonFixedColumnsWidth: 0,\n\n\tcolumnSortTypes: [],\n\tcolumnTypes: [],\n\tcolumnPositions: [],\n\tcolumnsVisible: [],\n\tcolumnsFrozen: [],\n\tcolumnsFrozenLeading: [],\n\tcolumnsFrozenTrailing: [],\n\tfrozenLeadingColumnPositions: [],\n\tfrozenTrailingColumnPositions: [],\n};\n\nconst getColumnTotals = (columnWidths: number[], state: State) => {\n\tconst frozenLeadingColumnPositions: number[] = [];\n\tconst frozenTrailingColumnPositions: number[] = [];\n\n\tconst totalColumnsWidth = addUpArray(columnWidths);\n\tconst totalLeadingFrozenColumnsWidth = state.frozenLeadingColumnCount\n\t\t? addUpArray(columnWidths.slice(0, state.frozenLeadingColumnCount))\n\t\t: 0;\n\tconst totalTrailingFrozenColumnsWidth = state.frozenTrailingColumnCount\n\t\t? addUpArray(columnWidths.slice(-state.frozenTrailingColumnCount))\n\t\t: 0;\n\tconst totalNonFixedColumnsWidth =\n\t\ttotalColumnsWidth -\n\t\t(totalLeadingFrozenColumnsWidth + totalTrailingFrozenColumnsWidth);\n\n\tlet accum = 0;\n\tconst columnPositions = state.columnWidths.map((width, index) => {\n\t\tconst left = accum;\n\t\tif (state.columnsFrozenLeading[index])\n\t\t\tfrozenLeadingColumnPositions[index] = left;\n\t\taccum += width;\n\t\treturn left;\n\t});\n\n\tif (state.frozenTrailingColumnCount) {\n\t\tfor (\n\t\t\tlet i = state.columnCount - 1,\n\t\t\t\tc = state.columnCount - state.frozenTrailingColumnCount;\n\t\t\ti >= c;\n\t\t\ti--\n\t\t) {\n\t\t\tfrozenTrailingColumnPositions[i] = addUpArray(\n\t\t\t\tstate.columnWidths.slice(i + 1),\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\tcolumnPositions,\n\t\ttotalColumnsWidth,\n\t\ttotalLeadingFrozenColumnsWidth,\n\t\ttotalTrailingFrozenColumnsWidth,\n\t\ttotalNonFixedColumnsWidth,\n\t\tfrozenTrailingColumnPositions,\n\t\tfrozenLeadingColumnPositions,\n\t};\n};\n\nexport default (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.RESET: {\n\t\t\tconst newReturn = {\n\t\t\t\t...initialState,\n\t\t\t\t// Retain these values during a reset\n\t\t\t\tviewportWidth: state.viewportWidth,\n\t\t\t\tmaxColumnWidth: state.maxColumnWidth,\n\t\t\t\toriginalColumnWidths: action.data?.columnWidths || [],\n\t\t\t\t...action.data,\n\t\t\t};\n\n\t\t\tconst columnWidths = newReturn.viewportWidth\n\t\t\t\t? refitColumns(newReturn.viewportWidth, newReturn)\n\t\t\t\t: [...newReturn.columnWidths];\n\n\t\t\tconst columnsFrozenLeading: boolean[] = [];\n\t\t\tconst columnsFrozenTrailing: boolean[] = [];\n\t\t\tconst columnsFrozen = newReturn.columnWidths.map((_, index) => {\n\t\t\t\tif (index < newReturn.frozenLeadingColumnCount) {\n\t\t\t\t\tcolumnsFrozenLeading[index] = true;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tindex >=\n\t\t\t\t\tnewReturn.columnCount - newReturn.frozenTrailingColumnCount\n\t\t\t\t) {\n\t\t\t\t\tcolumnsFrozenTrailing[index] = true;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tnewReturn.columnsFrozen = columnsFrozen;\n\t\t\tnewReturn.columnsFrozenLeading = columnsFrozenLeading;\n\t\t\tnewReturn.columnsFrozenTrailing = columnsFrozenTrailing;\n\t\t\tnewReturn.columnsLastFrozenLeading = newReturn.frozenLeadingColumnCount\n\t\t\t\t? newReturn.frozenLeadingColumnCount - 1\n\t\t\t\t: undefined;\n\t\t\tnewReturn.columnsFirstFrozenTrailing = newReturn.frozenTrailingColumnCount\n\t\t\t\t? newReturn.columnCount - newReturn.frozenTrailingColumnCount\n\t\t\t\t: undefined;\n\n\t\t\tconst columnTotals = getColumnTotals(columnWidths, newReturn);\n\t\t\t// console.log(columnTotals);\n\n\t\t\treturn {\n\t\t\t\t...newReturn,\n\t\t\t\t...columnTotals,\n\t\t\t\tcolumnsFrozen,\n\t\t\t\tcolumnsOverflown:\n\t\t\t\t\tcolumnTotals.totalColumnsWidth > newReturn.viewportWidth,\n\t\t\t\tcolumnWidths,\n\t\t\t};\n\t\t}\n\n\t\tcase ACTIONS.SET_COLUMN_WIDTH: {\n\t\t\tlet _columnsWidths = [...state.columnWidths];\n\t\t\tconst _dirtyColumns = [...state.dirtyColumns];\n\n\t\t\t_columnsWidths[action.index] = keepWidthInBounds(\n\t\t\t\taction.width,\n\t\t\t\tstate.maxColumnWidth,\n\t\t\t\tstate.minColumnWidth,\n\t\t\t);\n\t\t\taddToArrayUnique(_dirtyColumns, action.index);\n\n\t\t\t_columnsWidths = refitColumns(\n\t\t\t\tstate.viewportWidth,\n\t\t\t\t{\n\t\t\t\t\t...state,\n\t\t\t\t\tcolumnWidths: _columnsWidths,\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tconst columnTotals = getColumnTotals(_columnsWidths, state);\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t...columnTotals,\n\t\t\t\tcolumnWidths: _columnsWidths,\n\t\t\t\tcolumnsOverflown: columnTotals.totalColumnsWidth > state.viewportWidth,\n\t\t\t\tdirtyColumns: _dirtyColumns,\n\t\t\t};\n\t\t}\n\t\tcase ACTIONS.SET_COLUMN_WIDTHS: {\n\t\t\tconst columnWidths = action.widths.map((width) =>\n\t\t\t\tkeepWidthInBounds(width, state.maxColumnWidth, state.minColumnWidth),\n\t\t\t);\n\n\t\t\tconst columnTotals = getColumnTotals(columnWidths, state);\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t...columnTotals,\n\t\t\t\tcolumnWidths,\n\t\t\t\tcolumnsOverflown: columnTotals.totalColumnsWidth > state.viewportWidth,\n\t\t\t\toriginalColumnWidths: columnWidths,\n\t\t\t\tdirtyColumns: [],\n\t\t\t};\n\t\t}\n\n\t\tcase ACTIONS.SET_HAS_OVERFLOWN:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\toverflown: action.overflown,\n\t\t\t};\n\n\t\tcase ACTIONS.SET_VIEWPORT_WIDTH: {\n\t\t\tconst {\n\t\t\t\tcolumnCount,\n\t\t\t\tdirtyColumns,\n\t\t\t\tfrozenLeadingColumnCount,\n\t\t\t\tfrozenTrailingColumnCount,\n\t\t\t} = state;\n\n\t\t\tconst columnWidths = refitColumns(action.width, state);\n\n\t\t\tcolumnWidths.forEach((width, index, all) => {\n\t\t\t\tif (dirtyColumns.includes(index)) return;\n\t\t\t\tif (\n\t\t\t\t\tindex < frozenLeadingColumnCount ||\n\t\t\t\t\t(frozenTrailingColumnCount &&\n\t\t\t\t\t\tindex >= columnCount - frozenTrailingColumnCount)\n\t\t\t\t) {\n\t\t\t\t\treturn (all[index] = state.originalColumnWidths[index]);\n\t\t\t\t}\n\t\t\t\treturn (all[index] = keepWidthInBounds(\n\t\t\t\t\twidth,\n\t\t\t\t\tInfinity, //maxColumnWidth,\n\t\t\t\t\tstate.minColumnWidth,\n\t\t\t\t));\n\t\t\t});\n\n\t\t\tconst columnTotals = getColumnTotals(columnWidths, {\n\t\t\t\t...state,\n\t\t\t\tviewportWidth: action.width,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t...columnTotals,\n\t\t\t\tcolumnWidths,\n\t\t\t\tcolumnsOverflown: columnTotals.totalColumnsWidth > action.width,\n\t\t\t\tmaxColumnWidth: Infinity,\n\t\t\t\tviewportWidth: action.width,\n\t\t\t};\n\t\t}\n\t}\n};\n","import {useEffect, useMemo, useReducer, useRef} from 'react';\n\nimport type {BaseItemData, Column} from '../../types';\nimport actions from './actions';\nimport {ACTIONS} from './constants';\nimport reducer, {initialState, State} from './reducer';\n\nexport type UseTableLayoutParams<ItemData extends BaseItemData> = {\n\tcolumns: Column<ItemData>[];\n\tfrozenLeadingColumnCount?: number;\n\tfrozenTrailingColumnCount?: number;\n\tpageSize?: number;\n\ttotalRows: number;\n};\n\nexport const useTableLayout = <ItemData extends BaseItemData>({\n\tcolumns,\n\tfrozenLeadingColumnCount = 0,\n\tfrozenTrailingColumnCount = 0,\n\tpageSize = 25,\n\ttotalRows,\n}: UseTableLayoutParams<ItemData>) => {\n\tconst [state, dispatch] = useReducer(reducer, {\n\t\t...initialState,\n\t\tcolumnCount: columns.length,\n\t\tcolumnWidths: columns.map((column) => column.width),\n\t\tfrozenLeadingColumnCount,\n\t\tfrozenTrailingColumnCount,\n\t\tpageSize,\n\t\tcolumnSortTypes: columns.map((column) => column.sortType || 'alphanumeric'),\n\t\tcolumnTypes: columns.map((column) => column.columnType || 'generic'),\n\t\t// totalRows,\n\t});\n\n\tconst dispatchActions = useMemo(() => actions(dispatch), []);\n\n\tconst scrollLeftRef = useRef(0);\n\n\t// Reset when pertinent data updates\n\tuseEffect(() => {\n\t\tdispatch({\n\t\t\ttype: ACTIONS.RESET,\n\t\t\tdata: {\n\t\t\t\tcolumnCount: columns.length,\n\t\t\t\tcolumnWidths: columns.map((column) => column.width),\n\t\t\t\tfrozenLeadingColumnCount,\n\t\t\t\tfrozenTrailingColumnCount,\n\t\t\t\tpageSize,\n\t\t\t\tcolumnSortTypes: columns.map(\n\t\t\t\t\t(column) => column.sortType || 'alphanumeric',\n\t\t\t\t),\n\t\t\t\tcolumnTypes: columns.map((column) => column.columnType || 'generic'),\n\t\t\t\t// totalRows,\n\t\t\t},\n\t\t});\n\t}, [\n\t\tcolumns,\n\t\tfrozenLeadingColumnCount,\n\t\tfrozenTrailingColumnCount,\n\t\tpageSize,\n\t\t// totalRows,\n\t]);\n\n\treturn {\n\t\tstate,\n\t\t...dispatchActions,\n\t\tscrollLeftRef,\n\t};\n};\n\nexport default useTableLayout;\n\n// Typescript cannot infer `ReturnType` of a generic, so you must roll your own\nclass InferWrapper<ItemData extends BaseItemData> {\n\tmediate = (...args: UseTableLayoutArguments<ItemData>) =>\n\t\tuseTableLayout<ItemData>(...args);\n}\n\nexport type UseTableLayoutFn<ItemData extends BaseItemData> = InferWrapper<\n\tItemData\n>['mediate'];\n\nexport type UseTableLayoutReturnType<\n\tItemData extends BaseItemData\n> = ReturnType<InferWrapper<ItemData>['mediate']>;\n\nexport type UseTableLayoutArguments<ItemData extends BaseItemData> = [\n\tUseTableLayoutParams<ItemData>,\n];\n","import {csvToArray} from '@netx/core/utils';\nimport base from './base';\nimport {isEmptyValue} from '@netx/core-components/Form/util';\n\nexport const multiSelect = (value: any) => {\n\t// DAM-15267 - if there are no commas, one value, the regex in csvToArray()\n\t// will return null if the single value contains a single apostrophe\n\tif (typeof value === 'string' && value.indexOf(',') > -1) {\n\t\tvalue = csvToArray(value);\n\t}\n\tif (!isEmptyValue(value) && !Array.isArray(value)) value = [value];\n\treturn base(value) || [];\n};\n\nexport default multiSelect;\n","import base from './base';\n\nexport const select = (value: any) => base(value);\n\nexport default select;\n","import multiSelect from './multi-select';\n\nexport const tag = (value: any) => multiSelect(value);\n\nexport default tag;\n","import tag from './tag';\n\nexport const semantic = (value: any) => tag(value);\n\nexport default semantic;\n","import tag from './tag';\n\nexport const tagVocab = (value: any) => tag(value);\n\nexport default tagVocab;\n","import base from './base';\n\nexport const text = (value: any) => base(value);\n\nexport default text;\n","import text from './text';\n\nexport const textarea = (value: any) => text(value);\n\nexport default textarea;\n","export * from './date';\nexport * from './multi-select';\nexport * from './number';\nexport * from './select';\nexport * from './semantic';\nexport * from './tag';\nexport * from './tag-vocab';\nexport * from './text';\nexport * from './textarea';\n\nimport date from './date';\nimport multiSelect from './multi-select';\nimport number from './number';\nimport select from './select';\nimport semantic from './semantic';\nimport tag from './tag';\nimport tag_vocab from './tag-vocab';\nimport text from './text';\nimport textarea from './textarea';\n\nimport {ATTRIBUTE_TYPE} from '../constants';\n\nexport default {\n\t[ATTRIBUTE_TYPE.DATE]: date,\n\t[ATTRIBUTE_TYPE.MULTISELECT]: multiSelect,\n\t[ATTRIBUTE_TYPE.NUMBER]: number,\n\t[ATTRIBUTE_TYPE.SELECT]: select,\n\t[ATTRIBUTE_TYPE.SEMANTIC]: semantic,\n\t[ATTRIBUTE_TYPE.TAG]: tag,\n\t[ATTRIBUTE_TYPE.TAG_VOCAB]: tag_vocab,\n\t[ATTRIBUTE_TYPE.TEXT]: text,\n\t[ATTRIBUTE_TYPE.TEXTAREA]: textarea,\n};\n","import { getEventCoordinates } from '@dnd-kit/utilities';\n\nfunction createSnapModifier(gridSize) {\n return ({\n transform\n }) => ({ ...transform,\n x: Math.ceil(transform.x / gridSize) * gridSize,\n y: Math.ceil(transform.y / gridSize) * gridSize\n });\n}\n\nconst restrictToHorizontalAxis = ({\n transform\n}) => {\n return { ...transform,\n y: 0\n };\n};\n\nfunction restrictToBoundingRect(transform, rect, boundingRect) {\n const value = { ...transform\n };\n\n if (rect.top + transform.y <= boundingRect.top) {\n value.y = boundingRect.top - rect.top;\n } else if (rect.bottom + transform.y >= boundingRect.top + boundingRect.height) {\n value.y = boundingRect.top + boundingRect.height - rect.bottom;\n }\n\n if (rect.left + transform.x <= boundingRect.left) {\n value.x = boundingRect.left - rect.left;\n } else if (rect.right + transform.x >= boundingRect.left + boundingRect.width) {\n value.x = boundingRect.left + boundingRect.width - rect.right;\n }\n\n return value;\n}\n\nconst restrictToParentElement = ({\n containerNodeRect,\n draggingNodeRect,\n transform\n}) => {\n if (!draggingNodeRect || !containerNodeRect) {\n return transform;\n }\n\n return restrictToBoundingRect(transform, draggingNodeRect, containerNodeRect);\n};\n\nconst restrictToFirstScrollableAncestor = ({\n draggingNodeRect,\n transform,\n scrollableAncestorRects\n}) => {\n const firstScrollableAncestorRect = scrollableAncestorRects[0];\n\n if (!draggingNodeRect || !firstScrollableAncestorRect) {\n return transform;\n }\n\n return restrictToBoundingRect(transform, draggingNodeRect, firstScrollableAncestorRect);\n};\n\nconst restrictToVerticalAxis = ({\n transform\n}) => {\n return { ...transform,\n x: 0\n };\n};\n\nconst restrictToWindowEdges = ({\n transform,\n draggingNodeRect,\n windowRect\n}) => {\n if (!draggingNodeRect || !windowRect) {\n return transform;\n }\n\n return restrictToBoundingRect(transform, draggingNodeRect, windowRect);\n};\n\nconst snapCenterToCursor = ({\n activatorEvent,\n draggingNodeRect,\n transform\n}) => {\n if (draggingNodeRect && activatorEvent) {\n const activatorCoordinates = getEventCoordinates(activatorEvent);\n\n if (!activatorCoordinates) {\n return transform;\n }\n\n const offsetX = activatorCoordinates.x - draggingNodeRect.left;\n const offsetY = activatorCoordinates.y - draggingNodeRect.top;\n return { ...transform,\n x: transform.x + offsetX - draggingNodeRect.width / 2,\n y: transform.y + offsetY - draggingNodeRect.height / 2\n };\n }\n\n return transform;\n};\n\nexport { createSnapModifier, restrictToFirstScrollableAncestor, restrictToHorizontalAxis, restrictToParentElement, restrictToVerticalAxis, restrictToWindowEdges, snapCenterToCursor };\n//# sourceMappingURL=modifiers.esm.js.map\n","import React, {useCallback, useEffect, useRef} from 'react';\nimport {ScrollSyncPane} from 'react-scroll-sync';\nimport type {Row} from 'react-table';\nimport type {Optional} from 'utility-types';\n\nimport useSharedRef from '@netx/core-components/hooks/useSharedRef';\nimport {useEnhancedRef} from '@netx/core-components/hooks/useEnhancedRef';\nimport {useUpdateEffect} from '@netx/core-components/hooks/useUpdateEffect';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\nimport {getScrollbarWidth} from '@netx/core/utils';\nimport {\n\tArrowFocusTrapItemsPrimitive,\n\tArrowFocusTrapContext,\n\tAction,\n\tInternalContextDescriptor,\n} from '@netx/core-components/ArrowFocusTrap';\nimport {styled} from '@netx/core-components/Theme';\nimport VirtualizedList, {\n\tVirtualizedListProps,\n} from '@netx/core-components/VirtualizedList';\nimport {useTableLayoutProvider} from '../../contexts';\nimport type {BaseItemData} from '../../types';\nimport {RowData, VirtualizedTableRowWrapper} from '../VirtualizedTableRow';\n\nexport interface VirtualizedTableBodyProps<ItemData extends BaseItemData>\n\textends Optional<\n\t\tVirtualizedListProps<Row<ItemData>, RowData<ItemData>>,\n\t\t'ListItemComponent' | 'ListItemComponentProps'\n\t> {\n\taddedAtIndex?: number;\n\tdisableFocus?: boolean;\n\titemData: RowData<ItemData>;\n\tloading?: boolean;\n\tdataReady?: boolean;\n\tarrowFocusTrapRef?: React.RefObject<InternalContextDescriptor>;\n\tonRowKeyDown?: (\n\t\tevent: React.KeyboardEvent<HTMLDivElement>,\n\t\trowIndex: number,\n\t\trowData: Row<ItemData>,\n\t) => void | boolean;\n\toriginalData: ItemData[];\n}\n\nimport {\n\tScrollBorderReactWindow,\n\tscrollBorderClasses,\n} from '@netx/core-components/ScrollBorder';\n\nconst VirtualizedTableBodyOuterElement = styled(ScrollBorderReactWindow, {\n\tname: 'VirtualizedTableBody',\n\tslot: 'VirtualizedOuterElement',\n})(({theme}) => ({\n\toutline: 'none',\n}));\n\n/**\n * Virtualized table body\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n * @example\n <irtualizedTableBody<ItemData>\n {...props}\n />\n */\nexport const VirtualizedTableBodyPrimitive = <ItemData extends BaseItemData>({\n\taddedAtIndex,\n\tarrowFocusTrapRef,\n\tchunkSize,\n\tdata,\n\tdataReady,\n\tdisableFocus,\n\titemData,\n\tloading,\n\tonRowKeyDown,\n\tonScrollIndexUpdate,\n\toriginalData,\n\tonResize,\n\tpageSize = 25,\n\titemTotal,\n\ttotal,\n\tvirtualListRef,\n\t...props\n}: VirtualizedTableBodyProps<ItemData>) => {\n\tconst {setHasOverflown, state} = useTableLayoutProvider();\n\n\tconst _virtualListRef = useSharedRef(null, [virtualListRef]);\n\tconst _arrowFocusTrapRef = useSharedRef(null, [arrowFocusTrapRef]);\n\tconst sizeRef = useRef({height: 0, width: 0});\n\n\tconst [dataRef] = useEnhancedRef(data);\n\n\tconst scrollBarWidth = useRef(getScrollbarWidth());\n\n\tconst OuterElement = React.useMemo(\n\t\t() =>\n\t\t\tReact.forwardRef<HTMLDivElement>((props, ref) => {\n\t\t\t\treturn (\n\t\t\t\t\t<ScrollSyncPane>\n\t\t\t\t\t\t{/* TODO: allow for passing up `onOverflowChange`*/}\n\t\t\t\t\t\t<VirtualizedTableBodyOuterElement\n\t\t\t\t\t\t\tonOverflowChange={(overflown: boolean) => {\n\t\t\t\t\t\t\t\tsetHasOverflown(overflown);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ScrollSyncPane>\n\t\t\t\t);\n\t\t\t}),\n\t\t[],\n\t);\n\n\tconst handleResize = useCallback(\n\t\t(width: number, height: number) => {\n\t\t\tsizeRef.current = {width, height};\n\t\t\tconst subtractFromWidth = state.overflown ? scrollBarWidth.current : 0;\n\t\t\tonResize?.(width - subtractFromWidth, height);\n\t\t},\n\t\t[onResize, state.overflown],\n\t);\n\n\tuseWhenChangedEffect(state.overflown, (overflown) => {\n\t\tconst subtractFromWidth = overflown ? scrollBarWidth.current : 0;\n\t\tonResize?.(\n\t\t\tsizeRef.current.width - subtractFromWidth,\n\t\t\tsizeRef.current.height,\n\t\t);\n\t});\n\n\tconst InnerElement = React.useMemo(\n\t\t() =>\n\t\t\tReact.forwardRef<HTMLDivElement>((props, ref) => {\n\t\t\t\treturn (\n\t\t\t\t\t<ArrowFocusTrapItemsPrimitive\n\t\t\t\t\t\tdisableScrollToOnFocusCapture\n\t\t\t\t\t\tvirtualListRef={_virtualListRef}\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}),\n\t\t[],\n\t);\n\n\tconst getRowFromData = useCallback(\n\t\t(rowData: ItemData) =>\n\t\t\tdataRef.current.find((row) => row.original === rowData),\n\t\t[],\n\t);\n\n\tuseUpdateEffect(() => {\n\t\tdisableFocus\n\t\t\t? _arrowFocusTrapRef.current?.dispatch({type: Action.Disable})\n\t\t\t: _arrowFocusTrapRef.current?.dispatch({type: Action.Enable});\n\t}, [disableFocus]);\n\n\tconst handleScrollIndexUpdate = useCallback(\n\t\t(index: number, page: number, visibleEndIndex: number) => {\n\t\t\t_arrowFocusTrapRef.current?.handleScrollIndexUpdate(\n\t\t\t\tindex,\n\t\t\t\tpage,\n\t\t\t\tvisibleEndIndex,\n\t\t\t);\n\t\t\tonScrollIndexUpdate?.(index, page, visibleEndIndex);\n\t\t},\n\t\t[onScrollIndexUpdate],\n\t);\n\n\tconst handleKeyDown = useCallback(\n\t\t(event: React.KeyboardEvent<HTMLDivElement>, index: number) => {\n\t\t\tif (!onRowKeyDown) return;\n\n\t\t\tconst row = getRowFromData(originalData[index]);\n\t\t\tif (!row) return;\n\t\t\tif (onRowKeyDown(event, index, row) === false) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t},\n\t\t[onRowKeyDown],\n\t);\n\n\treturn (\n\t\t<ArrowFocusTrapContext\n\t\t\tinitialActiveIndex={props.scrollIndex}\n\t\t\tref={_arrowFocusTrapRef}\n\t\t\tonItemKeyDown={handleKeyDown}\n\t\t\tpageSize={chunkSize || pageSize}\n\t\t\ttotal={itemTotal || total}\n\t\t\tactiveDescendantLabel={itemData.rowId || 'row'}\n\t\t\tvirtualListRef={_virtualListRef}\n\t\t>\n\t\t\t<VirtualizedList<Row<ItemData>, RowData<ItemData>>\n\t\t\t\tdata-testid=\"virtualized-table-body\"\n\t\t\t\tListItemComponent={VirtualizedTableRowWrapper}\n\t\t\t\tonScrollIndexUpdate={handleScrollIndexUpdate}\n\t\t\t\tonOverflownChange={setHasOverflown}\n\t\t\t\t{...props}\n\t\t\t\tchunkSize={chunkSize}\n\t\t\t\tdata={data}\n\t\t\t\tdataReady={dataReady}\n\t\t\t\tinnerElementType={InnerElement}\n\t\t\t\titemTotal={itemTotal}\n\t\t\t\tonResize={handleResize}\n\t\t\t\touterElementType={OuterElement}\n\t\t\t\tpageSize={pageSize}\n\t\t\t\ttotal={total}\n\t\t\t\tvirtualListRef={_virtualListRef}\n\t\t\t\tListItemComponentProps={{\n\t\t\t\t\tdisableFocus,\n\t\t\t\t\trowId: 'row',\n\t\t\t\t\t...props.ListItemComponentProps,\n\t\t\t\t\t...itemData,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</ArrowFocusTrapContext>\n\t);\n};\n\nexport const VirtualizedTableBody = React.memo(\n\tVirtualizedTableBodyPrimitive,\n) as <ItemData extends BaseItemData>(\n\tprops: VirtualizedTableBodyProps<ItemData>,\n) => JSX.Element;\n\nexport default VirtualizedTableBody;\n","import React from 'react';\nimport {useSortable} from '@dnd-kit/sortable';\nimport {CSS} from '@dnd-kit/utilities';\n\nimport VirtualizedTableRowWrapper, {VirtualizedTableRowWrapperProps} from './';\nimport type {BaseItemData} from '../../types';\n\nexport type DraggableRowProps<ItemData extends BaseItemData> =\n\tVirtualizedTableRowWrapperProps<ItemData>;\n\nexport const DraggableTableRowPrimitive = <ItemData extends BaseItemData>({\n\tdata,\n\tstyle,\n\t...props\n}: DraggableRowProps<ItemData>) => {\n\tconst row = data.rows.find((row) => row.index === props.index);\n\n\tconst {active, isSorting, isDragging, setNodeRef, transform, transition} =\n\t\tuseSortable({\n\t\t\tdisabled: row == null,\n\t\t\t// TODO: we need to be enforcing an id on the data\n\t\t\tid: (row?.original as any)?.id?.toString() ?? row?.id ?? '',\n\t\t});\n\n\tconst dragStyle = {\n\t\ttransform: CSS.Translate.toString(transform),\n\t\ttransition: active ? transition : undefined,\n\t} as React.CSSProperties;\n\n\treturn (\n\t\t<VirtualizedTableRowWrapper\n\t\t\tdata={{\n\t\t\t\t...data,\n\t\t\t\tisDragging,\n\t\t\t\tisSorting,\n\t\t\t\tsortActive: active != null,\n\t\t\t}}\n\t\t\tref={setNodeRef}\n\t\t\tstyle={{\n\t\t\t\t...style,\n\t\t\t\t...dragStyle,\n\t\t\t}}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nexport const DraggableTableRow = React.memo(DraggableTableRowPrimitive) as <\n\tItemData extends BaseItemData,\n>(\n\tprops: DraggableRowProps<ItemData>,\n) => JSX.Element;\n\nexport default DraggableTableRow;\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {createPortal} from 'react-dom';\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\tDragCancelEvent,\n\tDragEndEvent,\n\tDragStartEvent,\n\tDragOverlay,\n\tKeyboardSensor,\n\tPointerSensor,\n\tTouchSensor,\n\tuseSensor,\n\tuseSensors,\n} from '@dnd-kit/core';\nimport {restrictToVerticalAxis} from '@dnd-kit/modifiers';\nimport {\n\tSortableContext,\n\tsortableKeyboardCoordinates,\n\tverticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport {Action as ArrowFocusTrapAction} from '@netx/core-components/ArrowFocusTrap';\nimport {useSharedRef} from '@netx/core-components/hooks/useSharedRef';\nimport {useTableLayoutProvider} from '../../contexts';\nimport type {BaseItemData} from '../../types';\nimport BaseTableRow from '../VirtualizedTableRow/TableRow';\nimport {\n\tVirtualizedTableBodyPrimitive,\n\tVirtualizedTableBodyProps,\n} from './VirtualizedTableBody';\nimport DraggableTableRow from '../VirtualizedTableRow/DraggableTableRow';\n\nexport interface VirtualizedSortableTableBodyProps<\n\tItemData extends BaseItemData,\n> extends VirtualizedTableBodyProps<ItemData> {\n\tonDragCancel?: (event: DragCancelEvent) => void;\n\tonDraggingChange?: (dragging: boolean) => void;\n\tonDragEnd?: (event: DragEndEvent) => void;\n\tonDragStart?: (event: DragStartEvent) => void;\n}\n\n/**\n * Virtualized sortable table body\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n * @example\n <VirtualizedSortableTableBody<ItemData>\n {...props}\n />\n */\nexport const VirtualizedSortableTableBodyPrimitive = <\n\tItemData extends BaseItemData,\n>({\n\tarrowFocusTrapRef,\n\titemData,\n\tonDraggingChange,\n\tonDragCancel,\n\tonDragEnd,\n\tonDragStart,\n\t...props\n}: VirtualizedSortableTableBodyProps<ItemData>) => {\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst {state, scrollLeftRef} = useTableLayoutProvider();\n\n\tconst _arrowFocusTrapRef = useSharedRef(null, [arrowFocusTrapRef]);\n\n\tconst dataRef = useRef(props.data);\n\tuseEffect(() => {\n\t\tdataRef.current = props.data;\n\t});\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor),\n\t\tuseSensor(KeyboardSensor, {\n\t\t\tcoordinateGetter: sortableKeyboardCoordinates,\n\t\t}),\n\t\tuseSensor(TouchSensor),\n\t);\n\n\tconst handleDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tsetActiveId(null);\n\t\t\tonDragEnd?.(event);\n\t\t\tonDraggingChange?.(false);\n\t\t\tconst index = dataRef.current.findIndex(\n\t\t\t\t(d) => ((d.original as any).id ?? d.id).toString() === event.over?.id,\n\t\t\t);\n\t\t\t_arrowFocusTrapRef.current?.dispatch({\n\t\t\t\ttype: ArrowFocusTrapAction.SetActiveItem,\n\t\t\t\tindex,\n\t\t\t});\n\t\t\t_arrowFocusTrapRef.current?.dispatch({\n\t\t\t\ttype: ArrowFocusTrapAction.SetReturnToIndexOnFocus,\n\t\t\t\tindex,\n\t\t\t});\n\t\t\t_arrowFocusTrapRef.current?.dispatch({type: ArrowFocusTrapAction.Enable});\n\t\t},\n\t\t[onDragEnd, onDraggingChange],\n\t);\n\n\tconst handleDragStart = useCallback(\n\t\t(event: DragStartEvent) => {\n\t\t\tsetActiveId(event.active.id as string);\n\t\t\tonDragStart?.(event);\n\t\t\tonDraggingChange?.(true);\n\t\t\t_arrowFocusTrapRef.current?.dispatch({\n\t\t\t\ttype: ArrowFocusTrapAction.Disable,\n\t\t\t});\n\t\t},\n\t\t[onDragStart, onDraggingChange],\n\t);\n\n\tconst handleDragCancel = useCallback(\n\t\t(event: DragCancelEvent) => {\n\t\t\tsetActiveId(null);\n\t\t\tonDragCancel?.(event);\n\t\t\tonDraggingChange?.(false);\n\t\t\t_arrowFocusTrapRef.current?.dispatch({type: ArrowFocusTrapAction.Enable});\n\t\t},\n\t\t[onDragCancel, onDraggingChange],\n\t);\n\n\t// Cache the scroll left for drag overlay\n\tconst toTheLeft = useMemo(() => {\n\t\tif (activeId == null) return 0;\n\t\treturn scrollLeftRef.current;\n\t}, [activeId]);\n\n\t// TODO: we need to normalize the data to always have an `id` prop\n\tconst items = useMemo(\n\t\t() =>\n\t\t\tprops.data.map((d) => ({\n\t\t\t\t...d,\n\t\t\t\tid: ((d.original as any).id ?? d.id).toString(),\n\t\t\t})),\n\t\t[props.data],\n\t);\n\n\tconst activeItem = useMemo(() => {\n\t\tif (activeId == null) return;\n\t\tconst index = props.data.findIndex(\n\t\t\t(d) => ((d.original as any).id ?? d.id).toString() === activeId,\n\t\t);\n\t\tif (index < 0) return;\n\t\treturn {\n\t\t\tindex,\n\t\t\tdata: props.data[index],\n\t\t};\n\t}, [activeId, props.data]);\n\n\treturn (\n\t\t<DndContext\n\t\t\tautoScroll={{\n\t\t\t\tcanScroll: (element) => element.classList.contains('fixed-size-list'),\n\t\t\t}}\n\t\t\tsensors={sensors}\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragCancel={handleDragCancel}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t\tonDragStart={handleDragStart}\n\t\t\tmodifiers={[restrictToVerticalAxis]}\n\t\t>\n\t\t\t<SortableContext items={items} strategy={verticalListSortingStrategy}>\n\t\t\t\t<VirtualizedTableBodyPrimitive<ItemData>\n\t\t\t\t\tarrowFocusTrapRef={_arrowFocusTrapRef}\n\t\t\t\t\titemData={itemData}\n\t\t\t\t\tListItemComponent={DraggableTableRow}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\t{createPortal(\n\t\t\t\t\t<DragOverlay\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: state.viewportWidth,\n\t\t\t\t\t\t\tmarginLeft: toTheLeft,\n\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tzIndex={9999}\n\t\t\t\t\t\tdropAnimation={null}\n\t\t\t\t\t\tmodifiers={[restrictToVerticalAxis]}\n\t\t\t\t\t\ttransition=\"none\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{activeItem != null ? (\n\t\t\t\t\t\t\t<BaseTableRow<ItemData>\n\t\t\t\t\t\t\t\tindex={activeItem.index}\n\t\t\t\t\t\t\t\tdataIndex={activeItem.index}\n\t\t\t\t\t\t\t\trowData={activeItem.data}\n\t\t\t\t\t\t\t\tprepareRow={itemData.prepareRow}\n\t\t\t\t\t\t\t\tisClone\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</DragOverlay>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)}\n\t\t\t</SortableContext>\n\t\t</DndContext>\n\t);\n};\n\nexport const VirtualizedSortableTableBody = React.memo(\n\tVirtualizedSortableTableBodyPrimitive,\n) as <ItemData extends BaseItemData>(\n\tprops: VirtualizedSortableTableBodyProps<ItemData>,\n) => JSX.Element;\n\nexport default VirtualizedSortableTableBody;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedLoadingTableRowCellClasses {\n\t/** Styles applied to the root element. */\n\troot: string;\n\n\tcolumnsOverflown: string;\n\tfirstFrozenTrailingColumn: string;\n\tfrozenLeadingColumn: string;\n\tfrozenTrailingColumn: string;\n\tlastFrozenLeadingColumn: string;\n\talphanumeric: string;\n\tnumeric: string;\n\tgeneric: string;\n\tcheckbox: string;\n\tcheckboxWithLabel: string;\n\taction: string;\n\tthumbnail: string;\n}\n\nexport const getVirtualizedLoadingTableRowCellClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedLoadingTableRowCell', slot);\n\nexport const virtualizedLoadingTableRowCellClasses = generateUtilityClasses<\n\tkeyof VirtualizedLoadingTableRowCellClasses\n>('VirtualizedLoadingTableRowCell', [\n\t'root',\n\t'action',\n\t'alphanumeric',\n\t'checkbox',\n\t'checkboxWithLabel',\n\t'columnsOverflown',\n\t'firstFrozenTrailingColumn',\n\t'frozenLeadingColumn',\n\t'frozenTrailingColumn',\n\t'lastFrozenLeadingColumn',\n\t'generic',\n\t'numeric',\n\t'thumbnail',\n]);\nexport default virtualizedLoadingTableRowCellClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\n\nimport {Skeleton, SkeletonProps} from '@mui/material';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport type {ColumnSortType, ColumnType} from '../../types';\nimport {\n\tvirtualizedLoadingTableRowCellClasses,\n\tgetVirtualizedLoadingTableRowCellClass,\n\tVirtualizedLoadingTableRowCellClasses,\n} from './virtualizedLoadingTableRowCellClasses';\n\ntype VirtualizedLoadingTableRowCellUtilityClassProps = WithClasses<\n\tVirtualizedLoadingTableRowCellClasses,\n\t{\n\t\tcolumnsOverflown?: boolean;\n\t\tfirstFrozenTrailingColumn?: boolean;\n\t\tfrozenLeadingColumn?: boolean;\n\t\tfrozenTrailingColumn?: boolean;\n\t\tlastFrozenLeadingColumn?: boolean;\n\t\tsortType: ColumnSortType;\n\t\ttype: ColumnType;\n\t}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedLoadingTableRowCellUtilityClassProps,\n) => {\n\tconst {\n\t\tclasses,\n\t\tcolumnsOverflown,\n\t\tfirstFrozenTrailingColumn,\n\t\tfrozenLeadingColumn,\n\t\tfrozenTrailingColumn,\n\t\tlastFrozenLeadingColumn,\n\t\tsortType,\n\t\ttype,\n\t} = ownerState;\n\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\tfirstFrozenTrailingColumn && 'firstFrozenTrailingColumn',\n\t\t\tfrozenLeadingColumn && 'frozenLeadingColumn',\n\t\t\tfrozenTrailingColumn && 'frozenTrailingColumn',\n\t\t\tlastFrozenLeadingColumn && 'lastFrozenLeadingColumn',\n\t\t\tsortType,\n\t\t\tcolumnsOverflown && 'columnsOverflown',\n\t\t\ttype,\n\t\t],\n\t};\n\n\treturn composeClasses(slots, getVirtualizedLoadingTableRowCellClass, classes);\n};\n\nconst VirtualizedLoadingTableRowCellRoot = styled('div', {\n\tname: 'NxDocumentThumbnail',\n\tslot: 'Root',\n\toverridesResolver: (props, styles) => styles.root,\n})(({theme}) => ({\n\talignItems: 'center',\n\tbackgroundColor: theme.palette.background.paper,\n\tdisplay: 'flex',\n\theight: '100%',\n\tpadding: theme.spacing(0, 2),\n\t[`&.${virtualizedLoadingTableRowCellClasses.frozenLeadingColumn}, &.${virtualizedLoadingTableRowCellClasses.frozenTrailingColumn}`]: {\n\t\t...theme.mixins.positionSticky,\n\t\tpadding: theme.spacing(0, 1),\n\t\tzIndex: 3,\n\t},\n\t[`&.${virtualizedLoadingTableRowCellClasses.frozenLeadingColumn}`]: {\n\t\tleft: 0,\n\t\t[`&.${virtualizedLoadingTableRowCellClasses.lastFrozenLeadingColumn}.${virtualizedLoadingTableRowCellClasses.columnsOverflown}`]: {\n\t\t\tborderRight: `1px dotted ${theme.palette.custom.border}`,\n\t\t},\n\t},\n\t[`&.${virtualizedLoadingTableRowCellClasses.frozenTrailingColumn}`]: {\n\t\tright: 0,\n\t\t[`&.${virtualizedLoadingTableRowCellClasses.firstFrozenTrailingColumn}.${virtualizedLoadingTableRowCellClasses.columnsOverflown}`]: {\n\t\t\tborderLeft: `1px dotted ${theme.palette.custom.border}`,\n\t\t},\n\t},\n\t[`&.${virtualizedLoadingTableRowCellClasses.alphanumeric}`]: {},\n\t[`&.${virtualizedLoadingTableRowCellClasses.numeric}`]: {\n\t\tjustifyContent: 'flex-end',\n\t},\n\t[`&.${virtualizedLoadingTableRowCellClasses.columnsOverflown}`]: {},\n\t[`&.${virtualizedLoadingTableRowCellClasses.action}, &.${virtualizedLoadingTableRowCellClasses.thumbnail}`]: {\n\t\tjustifyContent: 'center',\n\t},\n\t[`&.${virtualizedLoadingTableRowCellClasses.checkbox}`]: {\n\t\tpaddingLeft: theme.spacing(2),\n\t},\n\t[`&.${virtualizedLoadingTableRowCellClasses.checkboxWithLabel}`]: {\n\t\tpaddingLeft: theme.spacing(2),\n\t},\n\t[`&.${virtualizedLoadingTableRowCellClasses.generic}`]: {},\n}));\n\nexport interface VirtualizedLoadingTableRowCellProps\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\t\tHTMLDivElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tVirtualizedLoadingTableRowCellClasses,\n\t\t\t{\n\t\t\t\tcolumnCount: number;\n\t\t\t\tcolumnWidths: number[];\n\t\t\t\tcolumnsOverflown?: boolean;\n\t\t\t\tindex: number;\n\t\t\t\tsortType?: ColumnSortType;\n\t\t\t\twidth: number;\n\t\t\t\ttype: ColumnType;\n\t\t\t\tvisible?: boolean;\n\t\t\t\tleft?: number;\n\t\t\t\tright?: number;\n\t\t\t\tfirstFrozenTrailing?: boolean;\n\t\t\t\tlastFrozenLeading?: boolean;\n\t\t\t\tfrozenLeading?: boolean;\n\t\t\t\tfrozen?: boolean;\n\t\t\t\tfrozenTrailing?: boolean;\n\t\t\t\tSkeletonProps?: Partial<SkeletonProps>;\n\t\t\t}\n\t\t> {}\n\nexport const VirtualizedLoadingTableRowCellPrimitive = (\n\tprops: VirtualizedLoadingTableRowCellProps,\n) => {\n\tconst {\n\t\tclassName,\n\t\tcolumnCount,\n\t\tcolumnsOverflown,\n\t\tcolumnWidths,\n\t\tfirstFrozenTrailing,\n\t\tfrozen,\n\t\tfrozenLeading,\n\t\tfrozenTrailing,\n\t\tlastFrozenLeading,\n\t\tindex,\n\t\tleft,\n\t\tright,\n\t\tsortType = 'alphanumeric',\n\t\ttype = 'generic',\n\t\twidth,\n\t\tSkeletonProps,\n\t\tstyle,\n\t\tvisible,\n\t\t...sendProps\n\t} = props;\n\n\tconst classes = useUtilityClasses({\n\t\tcolumnsOverflown,\n\t\tfirstFrozenTrailingColumn: firstFrozenTrailing,\n\t\tfrozenLeadingColumn: frozenLeading,\n\t\tfrozenTrailingColumn: frozenTrailing,\n\t\tlastFrozenLeadingColumn: lastFrozenLeading,\n\t\tsortType,\n\t\ttype,\n\t});\n\n\treturn (\n\t\t<VirtualizedLoadingTableRowCellRoot\n\t\t\t{...sendProps}\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tstyle={{left, right, width, minWidth: width, ...style}}\n\t\t>\n\t\t\t{visible === false ? null : (\n\t\t\t\t<Skeleton width={'75%'} animation={false} {...SkeletonProps} />\n\t\t\t)}\n\t\t</VirtualizedLoadingTableRowCellRoot>\n\t);\n};\n\nexport const VirtualizedLoadingTableRowCell = VirtualizedLoadingTableRowCellPrimitive;\nexport default VirtualizedLoadingTableRowCell;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedLoadingTableRowClasses {\n\t/** Styles applied to the root element. */\n\troot: string;\n\tactive: string;\n}\n\nexport const getVirtualizedLoadingTableRowClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedLoadingTableRow', slot);\n\nexport const virtualizedLoadingTableRowClasses = generateUtilityClasses(\n\t'VirtualizedLoadingTableRow',\n\t['root', 'active'],\n);\nexport default virtualizedLoadingTableRowClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\n\nimport {useTableLayoutProvider} from '../../contexts';\nimport {\n\tVirtualizedLoadingTableRowCell,\n\tVirtualizedLoadingTableRowCellProps,\n} from './VirtualizedLoadingTableRowCell';\nimport {\n\tvirtualizedLoadingTableRowClasses,\n\tgetVirtualizedLoadingTableRowClass,\n\tVirtualizedLoadingTableRowClasses,\n} from './virtualizedLoadingTableRowClasses';\nimport {virtualizedLoadingTableRowCellClasses} from './virtualizedLoadingTableRowCellClasses';\n\ntype Ref = React.ForwardedRef<HTMLDivElement>;\ntype VirtualizedLoadingTableRowUtilityClassProps = WithClasses<\n\tVirtualizedLoadingTableRowClasses,\n\t{\n\t\tactive?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedLoadingTableRowUtilityClassProps,\n) => {\n\tconst {classes, active} = ownerState;\n\tconst slots = {\n\t\troot: ['root', active && 'active'],\n\t} as const;\n\treturn composeClasses(slots, getVirtualizedLoadingTableRowClass, classes);\n};\n\nconst VirtualizedLoadingTableRowRoot = styled('div', {\n\tname: 'VirtualizedLoadingTableRow',\n\tslot: 'Root',\n\toverridesResolver: (props, styles) => styles.root,\n})(({theme}) => ({\n\tborderBottom: `1px solid ${theme.palette.custom.border}`,\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tminWidth: '100%',\n\tWebkitTransform: 'translate3d(0, 0, 0)',\n\tWebkitPerspective: 1000,\n\tWebkitBackfaceVisibility: 'hidden',\n\t[`&.${virtualizedLoadingTableRowClasses.active}`]: {\n\t\tbackgroundColor: theme.palette.mode === 'light' ? '#f1f1f1' : '#323232',\n\t\t[`& .${virtualizedLoadingTableRowCellClasses.root}`]: {\n\t\t\tbackgroundColor: theme.palette.mode === 'light' ? '#f1f1f1' : '#323232',\n\t\t},\n\t},\n}));\n\nexport interface VirtualizedLoadingTableRowProps\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\t\tHTMLDivElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tVirtualizedLoadingTableRowClasses,\n\t\t\t{\n\t\t\t\tactive?: boolean;\n\t\t\t\tindex: number;\n\t\t\t\tvisibleColumnIndexes: boolean[];\n\t\t\t\tVirtualizedLoadingTableRowCellProps?: Partial<\n\t\t\t\t\tVirtualizedLoadingTableRowCellProps\n\t\t\t\t>;\n\t\t\t}\n\t\t> {}\n\nconst VirtualizedLoadingTableRowInner = (\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tactive,\n\t\tindex,\n\t\tstyle,\n\t\tvisibleColumnIndexes,\n\t\tVirtualizedLoadingTableRowCellProps,\n\t\t...props\n\t}: VirtualizedLoadingTableRowProps,\n\tref: Ref,\n) => {\n\tconst {state} = useTableLayoutProvider();\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\tactive,\n\t});\n\n\treturn (\n\t\t<VirtualizedLoadingTableRowRoot\n\t\t\taria-rowindex={index}\n\t\t\taria-busy=\"true\"\n\t\t\taria-live=\"polite\"\n\t\t\trole=\"row\"\n\t\t\ttabIndex={-1}\n\t\t\t{...props}\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tref={ref}\n\t\t\tstyle={{\n\t\t\t\t...style,\n\t\t\t\twidth: state.totalColumnsWidth,\n\t\t\t}}\n\t\t>\n\t\t\t{state.columnWidths.map((width, index) => (\n\t\t\t\t<VirtualizedLoadingTableRowCell\n\t\t\t\t\tcolumnCount={state.columnCount}\n\t\t\t\t\tcolumnsOverflown={state.columnsOverflown}\n\t\t\t\t\tcolumnWidths={state.columnWidths}\n\t\t\t\t\tfirstFrozenTrailing={state.columnsFirstFrozenTrailing === index}\n\t\t\t\t\tlastFrozenLeading={state.columnsLastFrozenLeading === index}\n\t\t\t\t\tfrozen={state.columnsFrozen[index]}\n\t\t\t\t\tfrozenLeading={state.columnsFrozenLeading[index]}\n\t\t\t\t\tfrozenTrailing={state.columnsFrozenTrailing[index]}\n\t\t\t\t\tleft={state.frozenLeadingColumnPositions[index]}\n\t\t\t\t\tright={state.frozenTrailingColumnPositions[index]}\n\t\t\t\t\tindex={index}\n\t\t\t\t\tkey={index}\n\t\t\t\t\tsortType={state.columnSortTypes[index]}\n\t\t\t\t\ttype={state.columnTypes[index]}\n\t\t\t\t\twidth={width}\n\t\t\t\t\tvisible={visibleColumnIndexes[index]}\n\t\t\t\t\t{...VirtualizedLoadingTableRowCellProps}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</VirtualizedLoadingTableRowRoot>\n\t);\n};\n\nexport const VirtualizedLoadingTableRowPrimitive = React.forwardRef(\n\tVirtualizedLoadingTableRowInner,\n) as (props: VirtualizedLoadingTableRowProps, ref?: Ref) => JSX.Element;\n\nexport const VirtualizedLoadingTableRow = React.memo(\n\tVirtualizedLoadingTableRowPrimitive,\n) as (props: VirtualizedLoadingTableRowProps, ref?: Ref) => JSX.Element;\n\nexport default VirtualizedLoadingTableRow;\n","import React from 'react';\nimport type {Row} from 'react-table';\nimport type {ListChildComponentProps} from 'react-window';\n\nimport {useTableRowSelectionProvider} from '../../contexts';\nimport type {BaseItemData} from '../../types';\nimport TableRow, {TableRowProps} from './TableRow';\nimport VirtualizedLoadingTableRow from './VirtualizedLoadingTableRow';\n\ntype Ref = React.ForwardedRef<HTMLDivElement>;\n\n/**\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nexport type RowData<ItemData extends BaseItemData> = Omit<\n\tTableRowProps<ItemData>,\n\t'active' | 'dataIndex' | 'index' | 'rowData'\n> & {\n\tprepareRow(row: Row<ItemData>): void;\n\trows: Row<ItemData>[];\n\tstartIndexFromPage?: number;\n\tviewportWidth?: number;\n\tvisibleColumnIndexes: boolean[];\n\tgetRowProps?: (\n\t\trowIndex: number,\n\t\trow: Row<ItemData>,\n\t) => Partial<TableRowProps<ItemData>>;\n};\n\n/**\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nexport interface VirtualizedTableRowWrapperProps<ItemData extends BaseItemData>\n\textends Omit<ListChildComponentProps, 'data'> {\n\tdata: RowData<ItemData>;\n\tref?: Ref;\n}\n\n/**\n * Virtualized table row\\\n * This is what gets rendered via the virtualized list and should not be called directly\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nconst VirtualizedTableRowWrapperInner = <ItemData extends BaseItemData>(\n\t{index, data, ...props}: VirtualizedTableRowWrapperProps<ItemData>,\n\tref?: Ref,\n) => {\n\tconst {\n\t\tgetRowProps,\n\t\trows,\n\t\tstartIndexFromPage = 0,\n\t\tviewportWidth,\n\t\t// @ts-ignore\n\t\tactiveRow,\n\t\t// @ts-ignore\n\t\tgetListItemComponentProps,\n\t\t...rest\n\t} = data;\n\n\tconst row = rows.find((row) => row.index === index + startIndexFromPage);\n\n\tconst tableRowSelectionProvider = useTableRowSelectionProvider();\n\n\tif (!row) {\n\t\treturn (\n\t\t\t<VirtualizedLoadingTableRow\n\t\t\t\tindex={index}\n\t\t\t\tstyle={props.style}\n\t\t\t\tref={ref}\n\t\t\t\tvisibleColumnIndexes={rest.visibleColumnIndexes}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst selected = tableRowSelectionProvider.isSelected?.(row.id);\n\n\treturn (\n\t\t<TableRow<ItemData>\n\t\t\tkey={row.id}\n\t\t\tindex={index}\n\t\t\tdataIndex={startIndexFromPage + index}\n\t\t\tref={ref}\n\t\t\trowData={row}\n\t\t\tselected={selected}\n\t\t\t{...rest}\n\t\t\t{...props}\n\t\t\t{...(getRowProps?.(index, row) || {})}\n\t\t/>\n\t);\n};\n\nexport const VirtualizedTableRowWrapperPrimitive = React.forwardRef(\n\tVirtualizedTableRowWrapperInner,\n) as typeof VirtualizedTableRowWrapperInner;\n\nexport const VirtualizedTableRowWrapper = React.memo(\n\tVirtualizedTableRowWrapperPrimitive,\n) as typeof VirtualizedTableRowWrapperPrimitive;\n\nexport default VirtualizedTableRowWrapper;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedTableHeaderClasses {\n\t/** styles applied to the root element */\n\troot: string;\n\twrapper: string;\n}\n\nexport const getVirtualizedTableHeaderUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedTableHeader', slot);\n\nexport const virtualizedTableHeaderClasses = generateUtilityClasses<\n\tkeyof VirtualizedTableHeaderClasses\n>('VirtualizedTableHeader', ['root', 'wrapper']);\nexport default virtualizedTableHeaderClasses;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedTableVerticalScrollSpacerClasses {\n\t/** styles applied to the root element */\n\troot: string;\n}\n\nexport const getVirtualizedTableVerticalScrollSpacerUtilityClass = (\n\tslot: string,\n) => generateUtilityClass('VirtualizedTableVerticalScrollSpacer', slot);\n\nexport const virtualizedTableVerticalScrollSpacerClasses = generateUtilityClasses<\n\tkeyof VirtualizedTableVerticalScrollSpacerClasses\n>('VirtualizedTableVerticalScrollSpacer', ['root']);\nexport default virtualizedTableVerticalScrollSpacerClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {\n\tgetVirtualizedTableVerticalScrollSpacerUtilityClass,\n\tVirtualizedTableVerticalScrollSpacerClasses,\n} from './virtualizedTableVerticalScrollSpacerClasses';\n\ntype VirtualizedTableVerticalScrollSpacerUtilityClassProps = WithClasses<\n\tVirtualizedTableVerticalScrollSpacerClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedTableVerticalScrollSpacerUtilityClassProps,\n) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetVirtualizedTableVerticalScrollSpacerUtilityClass,\n\t\tclasses,\n\t);\n};\n\nconst VirtualizedTableVerticalScrollSpacerRoot = styled('div', {\n\tname: 'VirtualizedTableVerticalScrollSpacer',\n\tslot: 'Root',\n})(({theme}) => ({\n\tbackground: theme.palette.background.default,\n\tright: 0,\n\tposition: 'absolute',\n\theight: 48,\n\tzIndex: 2,\n}));\n\nexport interface VirtualizedTableVerticalScrollSpacerProps\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\t\tHTMLDivElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tVirtualizedTableVerticalScrollSpacerClasses,\n\t\t\t{\n\t\t\t\twidth: number;\n\t\t\t}\n\t\t> {}\n\nexport const VirtualizedTableVerticalScrollSpacerPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\tstyle,\n\twidth,\n\t...props\n}: VirtualizedTableVerticalScrollSpacerProps) => {\n\tconst classes = useUtilityClasses({classes: _classes});\n\treturn (\n\t\t<VirtualizedTableVerticalScrollSpacerRoot\n\t\t\taria-hidden=\"true\"\n\t\t\taria-disabled=\"true\"\n\t\t\t{...props}\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tstyle={{\n\t\t\t\twidth,\n\t\t\t\t...style,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const VirtualizedTableVerticalScrollSpacer = React.memo(\n\tVirtualizedTableVerticalScrollSpacerPrimitive,\n) as (props: VirtualizedTableVerticalScrollSpacerProps) => JSX.Element;\n\nexport default VirtualizedTableVerticalScrollSpacer;\n","import React, {useEffect, useState, useCallback, useMemo, useRef} from 'react';\nimport clsx from 'clsx';\nimport {ScrollSyncPane} from 'react-scroll-sync';\nimport scrollIntoView from 'scroll-into-view-if-needed';\n\nimport {unstable_ownerDocument} from '@mui/utils';\nimport {getScrollbarWidth} from '@netx/core/utils';\nimport {useSharedRef} from '@netx/core-components/hooks/useSharedRef';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {useTableLayoutProvider} from '../../contexts';\nimport type {BaseItemData, ColumnInstance} from '../../types';\nimport {\n\tVirtualizedTableHeaderCell,\n\tVirtualizedTableHeaderCellProps,\n} from '../VirtualizedTableHeaderCell';\nimport {\n\tgetVirtualizedTableHeaderUtilityClass,\n\tVirtualizedTableHeaderClasses,\n} from './virtualizedTableHeaderClasses';\nimport {VirtualizedTableVerticalScrollSpacer} from './VirtualizedTableVerticalScrollSpacer';\n\ntype Ref = React.ForwardedRef<HTMLDivElement>;\ntype VirtualizedTableHeaderUtilityClassProps = WithClasses<\n\tVirtualizedTableHeaderClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedTableHeaderUtilityClassProps,\n) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t\twrapper: ['wrapper'],\n\t};\n\treturn composeClasses(slots, getVirtualizedTableHeaderUtilityClass, classes);\n};\n\nconst VirtualizedTableHeaderRoot = styled('div', {\n\tname: 'VirtualizedTableHeader',\n\tslot: 'Root',\n})(({theme}) => ({\n\tflex: '0 0 auto',\n\tdisplay: 'flex',\n\tflexWrap: 'nowrap',\n\tborderBottom: `1px solid ${theme.palette.custom.border}`,\n\toverflowY: 'hidden',\n\toverflowX: 'auto',\n\t...theme.mixins.hideScrollbar,\n}));\n\nconst VirtualizedTableHeaderWrapper = styled('div', {\n\tname: 'VirtualizedTableHeader',\n\tslot: 'Wrapper',\n})(({theme}) => ({\n\tdisplay: 'flex',\n}));\n\nexport interface VirtualizedTableHeaderProps<ItemData extends BaseItemData>\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\t\tHTMLDivElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tVirtualizedTableHeaderClasses,\n\t\t\t{\n\t\t\t\tdisableFocus?: boolean;\n\t\t\t\tdisabled?: boolean;\n\t\t\t\theaders: ColumnInstance<ItemData>[];\n\t\t\t\tscrollLeft?: number;\n\t\t\t\tsortField?: string;\n\t\t\t\tsortOrder?: 'asc' | 'desc';\n\t\t\t\tonColumnClick?: (column: ColumnInstance<ItemData>) => void;\n\t\t\t\tTableHeaderCellProps?: Partial<\n\t\t\t\t\tOmit<VirtualizedTableHeaderCellProps<ItemData>, 'column' | 'index'>\n\t\t\t\t>;\n\t\t\t}\n\t\t> {}\n\n/** taken from mui */\nconst moveFocus = (\n\tlist: HTMLDivElement,\n\tcurrentFocus: Element | null,\n\ttraversalFunction,\n) => {\n\tlet wrappedOnce = false;\n\tlet nextFocus = traversalFunction(list, currentFocus);\n\n\twhile (nextFocus) {\n\t\t// Prevent infinite loop\n\t\tif (nextFocus === list.firstChild) {\n\t\t\tif (wrappedOnce) return;\n\t\t\twrappedOnce = true;\n\t\t}\n\n\t\tconst nextFocusDisabled =\n\t\t\tnextFocus.disabled || nextFocus.getAttribute('aria-disabled') === 'true';\n\n\t\tif (!nextFocus.hasAttribute('tabindex') || nextFocusDisabled) {\n\t\t\t// Move to the next element\n\t\t\tnextFocus = traversalFunction(list, nextFocus);\n\t\t} else {\n\t\t\tnextFocus.focus();\n\t\t\tscrollIntoView(nextFocus, {\n\t\t\t\tinline:\n\t\t\t\t\tnextFocus.getAttribute('data-type') === 'numerical' ? 'end' : 'start',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t}\n};\n\nconst nextItem = (list: HTMLDivElement, item: Element) => {\n\tif (list === item) return list.firstChild;\n\tif (item?.nextElementSibling) return item.nextElementSibling;\n\treturn list.firstChild;\n};\n\nconst previousItem = (list: HTMLDivElement, item: Element) => {\n\tif (list === item) return list.lastChild;\n\tif (item?.previousElementSibling) return item.previousElementSibling;\n\treturn list.lastChild;\n};\n\nconst VirtualizedTableHeaderInner = <ItemData extends BaseItemData>(\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tdisableFocus,\n\t\tdisabled,\n\t\theaders,\n\t\tonColumnClick,\n\t\tscrollLeft,\n\t\tsortField,\n\t\tsortOrder,\n\t\tTableHeaderCellProps,\n\t\t...props\n\t}: VirtualizedTableHeaderProps<ItemData>,\n\tref: Ref,\n) => {\n\tconst columnsRef = useSharedRef(null, [ref]);\n\tconst columnsWrapperRef = useRef<HTMLDivElement>(null);\n\tconst [selected, setSelected] = useState(-1);\n\tconst scrollBarWidth = useMemo(() => getScrollbarWidth(), []);\n\tconst {state} = useTableLayoutProvider();\n\n\tconst classes = useUtilityClasses({classes: _classes});\n\n\tconst handleKeyDown = useCallback(\n\t\t(column: ColumnInstance<ItemData>) => (\n\t\t\tevent: React.KeyboardEvent<HTMLDivElement>,\n\t\t) => {\n\t\t\tTableHeaderCellProps?.onKeyDown?.(event);\n\n\t\t\tconst list = columnsWrapperRef.current;\n\t\t\tif (!list) return;\n\n\t\t\tconst currentFocus = unstable_ownerDocument(list).activeElement;\n\t\t\tif (!currentFocus) return;\n\n\t\t\tconst role = currentFocus.getAttribute('role');\n\t\t\tif (role !== 'cell' && role !== 'columnheader') return;\n\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'ArrowLeft':\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tmoveFocus(list, currentFocus, previousItem);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ArrowRight':\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tmoveFocus(list, currentFocus, nextItem);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Home':\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tmoveFocus(list, null, nextItem);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'End':\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tmoveFocus(list, null, previousItem);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ' ':\n\t\t\t\tcase 'Enter':\n\t\t\t\t\tonColumnClick?.(column);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t[onColumnClick, TableHeaderCellProps?.onKeyDown],\n\t);\n\n\tconst firstActiveIndex = headers.findIndex(\n\t\t(header) => header.interactive || header.sortable,\n\t);\n\n\tuseEffect(() => {\n\t\tif (!columnsRef.current) return;\n\t\t// trigger for the scroll sync\n\t\t// @ts-ignore\n\t\tcolumnsRef.current.scroll?.();\n\t}, [state.columnWidths]);\n\n\tconst handleColumnClick = useCallback(\n\t\t(column: ColumnInstance<ItemData>) => (\n\t\t\tevent: React.MouseEvent<HTMLDivElement, MouseEvent>,\n\t\t) => {\n\t\t\tTableHeaderCellProps?.onClick?.(event);\n\t\t\tonColumnClick?.(column);\n\t\t},\n\t\t[onColumnClick, TableHeaderCellProps?.onClick],\n\t);\n\n\tconst handleColumnFocusCapture = useCallback(\n\t\t(column: ColumnInstance<ItemData>, index: number) => (\n\t\t\tevent: React.FocusEvent<HTMLDivElement>,\n\t\t) => {\n\t\t\tTableHeaderCellProps?.onFocusCapture?.(event);\n\t\t\tif (disableFocus || (!column.interactive && !column.sortable)) {\n\t\t\t\tevent.target.blur();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetSelected(index);\n\t\t},\n\t\t[disableFocus, TableHeaderCellProps?.onFocusCapture],\n\t);\n\n\treturn (\n\t\t<ScrollSyncPane>\n\t\t\t<VirtualizedTableHeaderRoot\n\t\t\t\tclassName={clsx(classes.root, className, 'virtualized-table-header')}\n\t\t\t\tonTouchMove={(event) => event.preventDefault()}\n\t\t\t\trole=\"row\"\n\t\t\t\ttabIndex={disableFocus ? -1 : undefined}\n\t\t\t\t{...props}\n\t\t\t\tref={columnsRef}\n\t\t\t>\n\t\t\t\t<VirtualizedTableHeaderWrapper\n\t\t\t\t\tref={columnsWrapperRef}\n\t\t\t\t\tclassName={classes.wrapper}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: state.totalColumnsWidth,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{headers.map((column, idx) => (\n\t\t\t\t\t\t<VirtualizedTableHeaderCell<ItemData>\n\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\tcolumn={column}\n\t\t\t\t\t\t\tindex={idx}\n\t\t\t\t\t\t\tsortField={sortField}\n\t\t\t\t\t\t\tsortOrder={sortOrder}\n\t\t\t\t\t\t\ttabIndex={\n\t\t\t\t\t\t\t\t!disableFocus &&\n\t\t\t\t\t\t\t\t(selected === idx || (selected < 0 && idx === firstActiveIndex))\n\t\t\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t\t\t: -1\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{...TableHeaderCellProps}\n\t\t\t\t\t\t\tonKeyDownCapture={handleKeyDown(column)}\n\t\t\t\t\t\t\tonClick={handleColumnClick(column)}\n\t\t\t\t\t\t\tonFocusCapture={handleColumnFocusCapture(column, idx)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t...TableHeaderCellProps?.style,\n\t\t\t\t\t\t\t\ttransform:\n\t\t\t\t\t\t\t\t\tidx === headers.length - 1 && state.overflown\n\t\t\t\t\t\t\t\t\t\t? `translateX(-${scrollBarWidth}px)`\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t\t{state.overflown ? (\n\t\t\t\t\t\t<VirtualizedTableVerticalScrollSpacer width={scrollBarWidth} />\n\t\t\t\t\t) : null}\n\t\t\t\t</VirtualizedTableHeaderWrapper>\n\t\t\t</VirtualizedTableHeaderRoot>\n\t\t</ScrollSyncPane>\n\t);\n};\n\n/**\n * Virtualized table header\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n * @example\n <TableHeader<ItemData> headers={headers} scrollLeft={scrollLeft} />\n */\nexport const VirtualizedTableHeaderPrimitive = React.forwardRef(\n\tVirtualizedTableHeaderInner,\n) as <ItemData extends BaseItemData>(\n\tprops: VirtualizedTableHeaderProps<ItemData>,\n\tref?: Ref,\n) => JSX.Element;\n/**\n * Memo-ized Virtualized table header\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n * @example\n <TableHeader<ItemData> headers={headers} scrollLeft={scrollLeft} />\n */\nexport const VirtualizedTableHeader = React.memo(\n\tVirtualizedTableHeaderPrimitive,\n) as <ItemData extends BaseItemData>(\n\tprops: VirtualizedTableHeaderProps<ItemData>,\n\tref?: Ref,\n) => JSX.Element;\n\nexport default VirtualizedTableHeader;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedTableClasses {\n\troot: string;\n}\n\nexport const getVirtualizedTableClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedTable', slot);\n\nexport const virtualizedTableClasses = generateUtilityClasses(\n\t'VirtualizedTable',\n\t['root'],\n);\nexport default virtualizedTableClasses;\n","import React, {useCallback, useMemo, useRef, useState} from 'react';\nimport clsx from 'clsx';\nimport {useTable} from 'react-table';\nimport {ScrollSync} from 'react-scroll-sync';\nimport {DragCancelEvent, DragEndEvent, DragStartEvent} from '@dnd-kit/core';\n\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\n\nimport type {RowData} from '../VirtualizedTableRow';\nimport {\n\tVirtualizedSortableTableBody,\n\tVirtualizedSortableTableBodyProps,\n} from '../VirtualizedTableBody';\nimport {\n\tVirtualizedTableHeader,\n\tVirtualizedTableHeaderProps,\n} from '../VirtualizedTableHeader';\nimport {CommonVirtualizedTableProps} from './types';\n\nimport {useTableLayoutProvider} from '../../contexts';\nimport type {BaseItemData, ColumnInstance} from '../../types';\n\nimport {\n\tgetVirtualizedTableClass,\n\tVirtualizedTableClasses,\n} from './virtualizedTableClasses';\n\ntype VirtualizedTableUtilityClassProps = WithClasses<\n\tVirtualizedTableClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: VirtualizedTableUtilityClassProps) => {\n\tconst {classes} = ownerState;\n\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\n\treturn composeClasses(slots, getVirtualizedTableClass, classes);\n};\n\nconst VirtualizedTableRoot = styled('div', {\n\tname: 'VirtualizedTable',\n\tslot: 'Root',\n})(({theme}) => ({\n\t...theme.mixins.flexFillColumn,\n\toverflow: 'hidden',\n}));\n\ntype OmitProps =\n\t| 'itemData'\n\t| 'itemSize'\n\t| 'originalData'\n\t| 'pageSize'\n\t| 'outerRef';\n\ntype BaseProps<ItemData extends BaseItemData> = CommonVirtualizedTableProps<\n\tItemData\n> & {\n\tonDragCancel?: (event: DragCancelEvent) => void;\n\tonDraggingChange?: (dragging: boolean) => void;\n\tonDragEnd?: (event: DragEndEvent) => void;\n\tonDragStart?: (event: DragStartEvent) => void;\n};\n\nexport type VirtualizedSortableTableProps<\n\tItemData extends BaseItemData\n> = WithClasses<\n\tVirtualizedTableClasses,\n\tReact.DetailedHTMLProps<\n\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\tHTMLDivElement\n\t> &\n\t\tOmit<BaseProps<ItemData>, OmitProps> & {\n\t\t\tdisabled?: boolean;\n\t\t\tTableBodyProps?: Partial<\n\t\t\t\tOmit<\n\t\t\t\t\tVirtualizedSortableTableBodyProps<ItemData>,\n\t\t\t\t\tkeyof BaseProps<ItemData>\n\t\t\t\t>\n\t\t\t>;\n\t\t\tTableHeaderProps?: Partial<\n\t\t\t\tOmit<\n\t\t\t\t\tVirtualizedTableHeaderProps<ItemData>,\n\t\t\t\t\tkeyof BaseProps<ItemData> | 'headers'\n\t\t\t\t>\n\t\t\t>;\n\t\t}\n>;\n\nexport const VirtualizedSortableTablePrimitive = <\n\tItemData extends BaseItemData\n>({\n\tclasses: _classes,\n\tclassName,\n\tactiveRow,\n\tcolumns,\n\tdisabled,\n\tdata,\n\tdataReady,\n\tdisableFocus,\n\tdisableTabIndex,\n\titemTotal,\n\tisItemLoaded,\n\tloadMoreItems,\n\tonColumnClick,\n\tonItemsRendered,\n\tonResize,\n\tonRowClick,\n\tonRowContextMenu,\n\tonScrollIndexUpdate,\n\tonSort,\n\tonDragCancel,\n\tonDraggingChange,\n\tonDragEnd,\n\tonDragStart,\n\toverscanCount,\n\tpage,\n\trowId,\n\tscrollIndex,\n\tsortField,\n\tsortOrder,\n\ttabIndex,\n\ttotal,\n\tvirtualListRef,\n\tTableBodyProps,\n\tTableHeaderProps,\n\t...props\n}: VirtualizedSortableTableProps<ItemData>) => {\n\tconst rootRef = useRef<HTMLDivElement>(null);\n\n\tconst {setViewportWidth, state} = useTableLayoutProvider();\n\n\tconst [visibleIndexes, setVisibleIndexes] = useState<boolean[]>([]);\n\n\tconst {headers, rows, prepareRow} = useTable({\n\t\tdata,\n\t\tcolumns,\n\t});\n\n\tconst classes = useUtilityClasses({classes: _classes});\n\n\tconst handleColumnClick = useCallback(\n\t\t(column: ColumnInstance<ItemData>) => {\n\t\t\tif (!dataReady) return;\n\n\t\t\tif (column.sortable) {\n\t\t\t\tonSort?.(\n\t\t\t\t\tcolumn,\n\t\t\t\t\tsortOrder !== 'desc' || sortField !== column.id ? 'desc' : 'asc',\n\t\t\t\t);\n\t\t\t}\n\t\t\tonColumnClick?.(column);\n\t\t},\n\t\t[onColumnClick, onSort, dataReady],\n\t);\n\n\tconst handleResize = useCallback(\n\t\t(width: number, height: number) => {\n\t\t\tsetViewportWidth(width);\n\t\t\tonResize?.(width, height);\n\t\t},\n\t\t[onResize],\n\t);\n\n\tconst handleSync = useCallback(\n\t\t(el: HTMLDivElement) => {\n\t\t\t// console.log(\"sync left\", el.scrollLeft, state.frozenColumnIndexes, state.columnPositions);\n\t\t\tconst visibleIndexes = state.columnPositions.map((left, index) => {\n\t\t\t\tif (state.columnsFrozen[index]) return true;\n\t\t\t\tconst relativeLeft =\n\t\t\t\t\tleft - state.totalLeadingFrozenColumnsWidth - el.scrollLeft;\n\t\t\t\tconst nextLeft = state.columnPositions[index + 1];\n\t\t\t\tconst relativeRight =\n\t\t\t\t\trelativeLeft + (nextLeft != null ? nextLeft - left : 0);\n\t\t\t\treturn (\n\t\t\t\t\trelativeLeft <=\n\t\t\t\t\t\tstate.viewportWidth - state.totalTrailingFrozenColumnsWidth &&\n\t\t\t\t\t(!nextLeft || relativeRight >= 0)\n\t\t\t\t);\n\t\t\t});\n\t\t\tsetVisibleIndexes(visibleIndexes);\n\t\t\t// console.log('visible', visibileIndexes);\n\t\t},\n\t\t[\n\t\t\tstate.viewportWidth,\n\t\t\tstate.columnCount,\n\t\t\tstate.columnsFrozen,\n\t\t\tstate.columnPositions,\n\t\t\tstate.totalLeadingFrozenColumnsWidth,\n\t\t\tstate.totalTrailingFrozenColumnsWidth,\n\t\t],\n\t);\n\n\t// Will be passed to each row component\n\tconst itemData: RowData<ItemData> = useMemo(\n\t\t() => ({\n\t\t\trows,\n\t\t\tactiveRow,\n\t\t\tdisableTabIndex,\n\t\t\tonClick: onRowClick,\n\t\t\tonContextMenu: onRowContextMenu,\n\t\t\tprepareRow,\n\t\t\trowId,\n\t\t\tvisibleColumnIndexes: visibleIndexes,\n\t\t}),\n\t\t[\n\t\t\tactiveRow,\n\t\t\tdisableTabIndex,\n\t\t\tonRowClick,\n\t\t\tonRowContextMenu,\n\t\t\trows,\n\t\t\trowId,\n\t\t\tprepareRow,\n\t\t\tvisibleIndexes,\n\t\t],\n\t);\n\n\treturn (\n\t\t<ScrollSync vertical={false} proportional={false} onSync={handleSync}>\n\t\t\t<VirtualizedTableRoot\n\t\t\t\tdata-testid=\"virtualized-table\"\n\t\t\t\trole=\"table\"\n\t\t\t\ttabIndex={disableFocus ? -1 : tabIndex}\n\t\t\t\t{...props}\n\t\t\t\tclassName={clsx(classes.root, className)}\n\t\t\t\tref={rootRef}\n\t\t\t>\n\t\t\t\t<VirtualizedTableHeader<ItemData>\n\t\t\t\t\tdisabled={disabled || !dataReady}\n\t\t\t\t\t{...TableHeaderProps}\n\t\t\t\t\tdisableFocus={disableFocus}\n\t\t\t\t\theaders={headers}\n\t\t\t\t\tonColumnClick={handleColumnClick}\n\t\t\t\t\tsortField={sortField}\n\t\t\t\t\tsortOrder={sortOrder}\n\t\t\t\t/>\n\t\t\t\t<VirtualizedSortableTableBody<ItemData>\n\t\t\t\t\t{...props}\n\t\t\t\t\t{...TableBodyProps}\n\t\t\t\t\tdata={itemData.rows}\n\t\t\t\t\tdataReady={dataReady}\n\t\t\t\t\tdisableFocus={disableFocus}\n\t\t\t\t\tisItemLoaded={isItemLoaded}\n\t\t\t\t\tloadMoreItems={loadMoreItems}\n\t\t\t\t\ttotal={total}\n\t\t\t\t\titemData={itemData}\n\t\t\t\t\titemSize={state.rowHeight}\n\t\t\t\t\titemTotal={itemTotal}\n\t\t\t\t\tonDragCancel={onDragCancel}\n\t\t\t\t\tonDraggingChange={onDraggingChange}\n\t\t\t\t\tonDragEnd={onDragEnd}\n\t\t\t\t\tonDragStart={onDragStart}\n\t\t\t\t\tonResize={handleResize}\n\t\t\t\t\tonItemsRendered={onItemsRendered}\n\t\t\t\t\tonScrollIndexUpdate={onScrollIndexUpdate}\n\t\t\t\t\toriginalData={data}\n\t\t\t\t\toverscanCount={overscanCount}\n\t\t\t\t\tpage={page}\n\t\t\t\t\tpageSize={state.pageSize}\n\t\t\t\t\tscrollIndex={scrollIndex}\n\t\t\t\t\tvirtualListRef={virtualListRef}\n\t\t\t\t/>\n\t\t\t</VirtualizedTableRoot>\n\t\t</ScrollSync>\n\t);\n};\n\n/**\n * Virtualized Table\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n * @example\n <VirtualizedSortableTable<ItemData>\n {...props}\n />\n */\nexport const VirtualizedSortableTable = React.memo(\n\tVirtualizedSortableTablePrimitive,\n) as <ItemData extends BaseItemData>(\n\tprops: VirtualizedSortableTableProps<ItemData>,\n) => JSX.Element;\n\nexport default VirtualizedSortableTable;\n","import React, {useCallback, useMemo, useRef, useState} from 'react';\nimport clsx from 'clsx';\nimport {useTable, Row} from 'react-table';\nimport {ScrollSync} from 'react-scroll-sync';\n\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\n\nimport type {RowData} from '../VirtualizedTableRow';\nimport {\n\tVirtualizedTableBody,\n\tVirtualizedTableBodyProps,\n} from '../VirtualizedTableBody';\nimport {\n\tVirtualizedTableHeader,\n\tVirtualizedTableHeaderProps,\n} from '../VirtualizedTableHeader';\nimport {useTableLayoutProvider} from '../../contexts';\nimport type {BaseItemData, ColumnInstance} from '../../types';\nimport {CommonVirtualizedTableProps} from './types';\nimport {\n\tgetVirtualizedTableClass,\n\tVirtualizedTableClasses,\n} from './virtualizedTableClasses';\n\ntype VirtualizedTableUtilityClassProps = WithClasses<\n\tVirtualizedTableClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: VirtualizedTableUtilityClassProps) => {\n\tconst {classes} = ownerState;\n\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\n\treturn composeClasses(slots, getVirtualizedTableClass, classes);\n};\n\nconst VirtualizedTableRoot = styled('div', {\n\tname: 'VirtualizedTable',\n\tslot: 'Root',\n})(({theme}) => ({\n\t...theme.mixins.flexFillColumn,\n\toverflow: 'hidden',\n}));\n\ntype OmitProps =\n\t| 'itemData'\n\t| 'itemSize'\n\t| 'originalData'\n\t| 'pageSize'\n\t| 'outerRef';\n\ntype BaseProps<ItemData extends BaseItemData> = CommonVirtualizedTableProps<\n\tItemData\n>;\n\nexport type VirtualizedTableProps<ItemData extends BaseItemData> = WithClasses<\n\tVirtualizedTableClasses,\n\tReact.DetailedHTMLProps<\n\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\tHTMLDivElement\n\t> &\n\t\tOmit<BaseProps<ItemData>, OmitProps> & {\n\t\t\tdisabled?: boolean;\n\t\t\tdefaultSortOrder?: 'asc' | 'desc';\n\t\t\tonRowKeyDown?: (\n\t\t\t\tevent: React.KeyboardEvent<HTMLDivElement>,\n\t\t\t\trowIndex: number,\n\t\t\t\trowData: Row<ItemData>,\n\t\t\t) => void | boolean;\n\t\t\tTableBodyProps?: Partial<\n\t\t\t\tOmit<VirtualizedTableBodyProps<ItemData>, keyof BaseProps<ItemData>>\n\t\t\t>;\n\t\t\tTableHeaderProps?: Partial<\n\t\t\t\tOmit<\n\t\t\t\t\tVirtualizedTableHeaderProps<ItemData>,\n\t\t\t\t\tkeyof BaseProps<ItemData> | 'headers'\n\t\t\t\t>\n\t\t\t>;\n\t\t}\n>;\n\nexport const VirtualizedTablePrimitive = <ItemData extends BaseItemData>({\n\tclasses: _classes,\n\tclassName,\n\tactiveRow,\n\tchunkSize,\n\tcolumns,\n\tdefaultSortOrder = 'asc',\n\tdisabled,\n\tdata,\n\tdataReady,\n\tdisableFocus,\n\tdisableTabIndex,\n\titemTotal,\n\tisItemLoaded,\n\tloadMoreItems,\n\tonColumnClick,\n\tonItemsRendered,\n\tonPageChange,\n\tonResize,\n\tonRowClick,\n\tonRowContextMenu,\n\tonRowKeyDown,\n\tonScrollIndexUpdate,\n\tonSort,\n\toverscanCount,\n\tpage,\n\trowId,\n\tscrollIndex,\n\tsortField,\n\tsortOrder,\n\ttabIndex,\n\ttotal,\n\tuseClassicPaging,\n\tvirtualListRef,\n\tTableBodyProps,\n\tTableHeaderProps,\n\t...props\n}: VirtualizedTableProps<ItemData>) => {\n\tconst rootRef = useRef<HTMLDivElement>(null);\n\n\tconst {setViewportWidth, state} = useTableLayoutProvider();\n\n\tconst {headers, rows, prepareRow} = useTable({\n\t\tdata,\n\t\tcolumns,\n\t});\n\n\tconst [visibleIndexes, setVisibleIndexes] = useState<boolean[]>([]);\n\n\tconst classes = useUtilityClasses({classes: _classes});\n\n\tconst handleColumnClick = useCallback(\n\t\t(column: ColumnInstance<ItemData>) => {\n\t\t\tif (!dataReady) return;\n\n\t\t\tif (column.sortable) {\n\t\t\t\tonSort?.(\n\t\t\t\t\tcolumn,\n\t\t\t\t\tsortField !== column.id\n\t\t\t\t\t\t? defaultSortOrder\n\t\t\t\t\t\t: sortOrder === 'desc'\n\t\t\t\t\t\t? 'asc'\n\t\t\t\t\t\t: 'desc',\n\t\t\t\t);\n\t\t\t}\n\t\t\tonColumnClick?.(column);\n\t\t},\n\t\t[onColumnClick, onSort, dataReady, defaultSortOrder],\n\t);\n\n\tconst handleResize = useCallback(\n\t\t(width: number, height: number) => {\n\t\t\tsetViewportWidth(width);\n\t\t\tonResize?.(width, height);\n\t\t},\n\t\t[onResize],\n\t);\n\n\tconst handleSync = useCallback(\n\t\t(el: HTMLDivElement) => {\n\t\t\tconst visibleIndexes = state.columnPositions.map((left, index) => {\n\t\t\t\tif (state.columnsFrozen[index]) return true;\n\t\t\t\tconst relativeLeft =\n\t\t\t\t\tleft - state.totalLeadingFrozenColumnsWidth - el.scrollLeft;\n\t\t\t\tconst nextLeft = state.columnPositions[index + 1];\n\t\t\t\tconst relativeRight =\n\t\t\t\t\trelativeLeft + (nextLeft != null ? nextLeft - left : 0);\n\t\t\t\treturn (\n\t\t\t\t\trelativeLeft <=\n\t\t\t\t\t\tstate.viewportWidth - state.totalTrailingFrozenColumnsWidth &&\n\t\t\t\t\t(!nextLeft || relativeRight >= 0)\n\t\t\t\t);\n\t\t\t});\n\t\t\tsetVisibleIndexes(visibleIndexes);\n\t\t},\n\t\t[\n\t\t\tstate.viewportWidth,\n\t\t\tstate.columnCount,\n\t\t\tstate.columnsFrozen,\n\t\t\tstate.columnPositions,\n\t\t\tstate.totalLeadingFrozenColumnsWidth,\n\t\t\tstate.totalTrailingFrozenColumnsWidth,\n\t\t],\n\t);\n\n\t// Will be passed to each row component\n\tconst itemData: RowData<ItemData> = useMemo(\n\t\t() => ({\n\t\t\trows,\n\t\t\tactiveRow,\n\t\t\tdisableTabIndex,\n\t\t\tonClick: onRowClick,\n\t\t\tonContextMenu: onRowContextMenu,\n\t\t\tprepareRow,\n\t\t\trowId,\n\t\t\tvisibleColumnIndexes: visibleIndexes,\n\t\t}),\n\t\t[\n\t\t\tactiveRow,\n\t\t\tdisableTabIndex,\n\t\t\tonRowClick,\n\t\t\tonRowContextMenu,\n\t\t\trows,\n\t\t\trowId,\n\t\t\tprepareRow,\n\t\t\tvisibleIndexes,\n\t\t],\n\t);\n\n\treturn (\n\t\t<ScrollSync vertical={false} proportional={false} onSync={handleSync}>\n\t\t\t<VirtualizedTableRoot\n\t\t\t\tdata-testid=\"virtualized-table\"\n\t\t\t\trole=\"table\"\n\t\t\t\ttabIndex={disableFocus ? -1 : tabIndex}\n\t\t\t\t{...props}\n\t\t\t\tclassName={clsx(classes.root, className)}\n\t\t\t\tref={rootRef}\n\t\t\t>\n\t\t\t\t<VirtualizedTableHeader<ItemData>\n\t\t\t\t\tdisabled={disabled || !dataReady}\n\t\t\t\t\t{...TableHeaderProps}\n\t\t\t\t\tdisableFocus={disableFocus}\n\t\t\t\t\theaders={headers}\n\t\t\t\t\tonColumnClick={handleColumnClick}\n\t\t\t\t\tsortField={sortField}\n\t\t\t\t\tsortOrder={sortOrder}\n\t\t\t\t/>\n\t\t\t\t<VirtualizedTableBody<ItemData>\n\t\t\t\t\t{...props}\n\t\t\t\t\t{...TableBodyProps}\n\t\t\t\t\tchunkSize={chunkSize}\n\t\t\t\t\tdata={itemData.rows}\n\t\t\t\t\tdataReady={dataReady}\n\t\t\t\t\tdisableFocus={disableFocus}\n\t\t\t\t\tisItemLoaded={isItemLoaded}\n\t\t\t\t\titemData={itemData}\n\t\t\t\t\titemSize={state.rowHeight}\n\t\t\t\t\titemTotal={itemTotal}\n\t\t\t\t\tloadMoreItems={loadMoreItems}\n\t\t\t\t\tonItemsRendered={onItemsRendered}\n\t\t\t\t\tonPageChange={onPageChange}\n\t\t\t\t\tonResize={handleResize}\n\t\t\t\t\tonRowKeyDown={onRowKeyDown}\n\t\t\t\t\tonScrollIndexUpdate={onScrollIndexUpdate}\n\t\t\t\t\toriginalData={data}\n\t\t\t\t\toverscanCount={overscanCount}\n\t\t\t\t\tpage={page}\n\t\t\t\t\tpageSize={state.pageSize}\n\t\t\t\t\tscrollIndex={scrollIndex}\n\t\t\t\t\ttotal={total}\n\t\t\t\t\tuseClassicPaging={useClassicPaging}\n\t\t\t\t\tvirtualListRef={virtualListRef}\n\t\t\t\t/>\n\t\t\t</VirtualizedTableRoot>\n\t\t</ScrollSync>\n\t);\n};\n\n/**\n * Virtualized Table\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n * @example\n <VirtualizedTable<ItemData>\n {...props}\n />\n */\nexport const VirtualizedTable = React.memo(VirtualizedTablePrimitive) as <\n\tItemData extends BaseItemData\n>(\n\tprops: VirtualizedTableProps<ItemData>,\n) => JSX.Element;\n\nexport default VirtualizedTable;\n","/**\n * @module core/functionality/table\n */\n\nconst NAME = 'table';\n\n/**\n * Netx.Views.TableView uses Backgrid (backgridjs.com) to display the contents of a collection in tabular format, one model per row.\n * The rows are sortable, selectable and editable.\n * TableView includes event handlers for add, delete & edit buttons in the footer and for row-selection checkboxes.\n */\nimport Base from '../lib/netx-view';\nimport Backgrid from 'core-libs/backgrid-netx';\n\nBackgrid.Extension.ClientSideFilter.prototype.search = function () {\n\tvar matcher = _.bind(this.makeMatcher(this.query()), this);\n\tvar col = this.collection;\n\tif (col.pageableCollection)\n\t\tcol.pageableCollection.getFirstPage({silent: true});\n\tcol.reset(this.shadowCollection.filter(matcher), {\n\t\tfiltering: true,\n\t\treindex: false,\n\t});\n};\n\nconst Props = {\n\t/**\n\t * this.preRender() saves the state of any selection we might have. Do not override without calling the parent method.\n\t * @override\n\t */\n\tprepareTable() {\n\t\tthis.selected();\n\t},\n\n\t/** @method */\n\tinitializeBackgrid() {\n\t\tconst self = this;\n\t\tconst Row = Backgrid.Row.prototype;\n\t\t// Well - in order to support our actions/menus we need to treat a backgrid row as we would a child view\n\t\t// Each view has a model that pertains to the action/menu in question\n\t\t// In the long run I do not think this is terrible- not ideal but not terrible.\n\t\tthis.grid = new Backgrid.Grid({\n\t\t\tcolumns: this.columns,\n\t\t\tcollection: this.collection,\n\t\t\t// Attach the unique id of this model to every row's element as a data-id attribute\n\t\t\trow: Backgrid.Row.extend({\n\t\t\t\tinitialize(opts) {\n\t\t\t\t\tthis.listenTo(this, 'context:menu:rendered', function (mv) {\n\t\t\t\t\t\tvar e = $.Event('contextmenuRendered', {contextMenu: mv});\n\t\t\t\t\t\tthis.$el.trigger(e);\n\t\t\t\t\t});\n\t\t\t\t\treturn Row.initialize.apply(this, arguments);\n\t\t\t\t},\n\t\t\t\trender() {\n\t\t\t\t\tvar me = Row.render.apply(this, arguments);\n\t\t\t\t\tif (this.model.id) {\n\t\t\t\t\t\tthis.$el.attr('data-id', this.model.id);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support context menus\n\t\t\t\t\tif (self.contextMenu) {\n\t\t\t\t\t\tthis.$el\n\t\t\t\t\t\t\t.attr('data-contextmenu-target', self.contextMenu)\n\t\t\t\t\t\t\t.attr('data-nx-template', 'menuView-context')\n\t\t\t\t\t\t\t.attr('data-contextmenu-container', 'body');\n\t\t\t\t\t}\n\n\t\t\t\t\tself.rowAdded(this.model, this);\n\n\t\t\t\t\t// Chain\n\t\t\t\t\treturn me;\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\n\t\t// Just fire events - no actual sort on collection\n\t\tif (this.serverSideSort) {\n\t\t\tthis.grid.body.stopListening(this.collection, 'backgrid:sort');\n\t\t\tthis.grid.body.sort = function (column, direction) {\n\t\t\t\tif (!_.contains(['ascending', 'descending', null], direction)) {\n\t\t\t\t\tthrow new RangeError(\n\t\t\t\t\t\t'direction must be one of \"ascending\", \"descending\" or `null`',\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (_.isString(column)) {\n\t\t\t\t\tcolumn = this.columns.findWhere({name: column});\n\t\t\t\t}\n\n\t\t\t\tvar collection = this.collection;\n\n\t\t\t\tvar order;\n\t\t\t\tif (direction === 'ascending') order = -1;\n\t\t\t\telse if (direction === 'descending') order = 1;\n\t\t\t\telse order = null;\n\n\t\t\t\tcollection.trigger('backgrid:sorted', column, direction, collection);\n\t\t\t\tcolumn.set('direction', direction);\n\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tthis.grid.body.listenTo(\n\t\t\t\tthis.collection,\n\t\t\t\t'backgrid:sort',\n\t\t\t\tthis.grid.body.sort,\n\t\t\t);\n\t\t}\n\n\t\t// Rows do not have any listeners that trigger a render in Backgrid\n\t\t// We need to be able to adjust some things if one of our attributes have changed\n\t\t// TODO: We should kill this - create a controls cell for our action parsing and let views\n\t\t// decide what attribute changes mean things need to update - otherwise, cell's are already\n\t\t// rendering themselves when they change - I beleive this was primarily added due to action parsing\n\t\tif (this.renderOnChange) {\n\t\t\tthis.listenTo(this.collection, 'change', function (model, options) {\n\t\t\t\tif (!model) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Re-render just that model's row\n\t\t\t\tvar idx = this.collection.indexOf(model);\n\t\t\t\tif (idx > -1) {\n\t\t\t\t\tvar renderableChange = true;\n\t\t\t\t\t_.each(\n\t\t\t\t\t\tmodel.changed,\n\t\t\t\t\t\tfunction (val, attrName) {\n\t\t\t\t\t\t\tvar col = this.grid.columns.findWhere({name: attrName});\n\t\t\t\t\t\t\t// Do not render on cells in edit mode\n\t\t\t\t\t\t\tif (renderableChange && (!col || col.get('editable'))) {\n\t\t\t\t\t\t\t\trenderableChange = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis,\n\t\t\t\t\t);\n\t\t\t\t\trenderableChange && this.grid.body.rows[idx].render();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Installs the grid in every element with the attribute 'data-grid'\n\t * @method\n\t */\n\trenderTable() {\n\t\t// DEVNOTE: Backgrid.js is geared towards web spreadsheets, so all cells default to editable. That's not what we generally want.\n\t\t// To flip that, we process the columns array and add 'editable:false' wherever it's not explicitly set to true.\n\t\t_.each(this.columns, (c) => {\n\t\t\tif (!_.isBoolean(c.editable)) {\n\t\t\t\tc.editable = false;\n\t\t\t}\n\t\t});\n\n\t\t// If we wait until shown to inject backgrid we can get more feedback in the DOM\n\t\tthis.whenShown.then(() => {\n\t\t\tif (!this.grid) {\n\t\t\t\tthis.initializeBackgrid();\n\t\t\t}\n\n\t\t\t// install the grid in the element with attr \"data-grid\"\n\t\t\t// Backgrid.render() is synchronous -- nothing to download!\n\t\t\tthis.grid\n\t\t\t\t.render()\n\t\t\t\t.$el.addClass(this.tableClassName)\n\t\t\t\t.appendTo(this.$('[data-grid]'));\n\n\t\t\tthis.trigger('backgrid:ready', this, this.grid);\n\t\t});\n\n\t\t// Cache\n\t\tthis.$deleteBtn = this.$('.btn-delete');\n\n\t\t////////////////////////////////////\n\t\t// GRID FILTERS\n\t\t////////////////////////////////////\n\t\t// If we have defined a filter, install it in the element with the class `.nx--grid-filter`\n\t\tif (this.gridFilter) {\n\t\t\t// Filter\n\t\t\tconst $target = this.$('.nx--grid-filter');\n\t\t\t$target.is(':input')\n\t\t\t\t? $target.replaceWith(this.gridFilter.render().el)\n\t\t\t\t: $target.append(this.gridFilter.render().el);\n\t\t\tthis.$gridFilter = this.gridFilter.$('input[type=\"search\"]');\n\t\t\tthis.$gridFilter\n\t\t\t\t.addClass('form-control')\n\t\t\t\t.attr('placeholder', i18n.t('i18n.filter'))\n\t\t\t\t.attr('data-nx-ignore', 'change');\n\t\t\t// Make sure we render with a clean search filter\n\t\t\tthis.gridFilter.clear();\n\t\t}\n\n\t\t// If we have defined a whole mess of filters, install each one in the element with the attr \"data-grid-filter-[name]\";\n\t\tif (this.gridFilters) {\n\t\t\tconst $targets = this.$('input.nx--grid-filter');\n\t\t\t_.each(this.gridFilters, (filter, key, all) => {\n\t\t\t\tvar $target = $targets.filter('[data-nx-filter=\"' + key + '\"]');\n\t\t\t\tif ($target.length) {\n\t\t\t\t\t$target.is(':input')\n\t\t\t\t\t\t? $target.replaceWith(filter.render().el)\n\t\t\t\t\t\t: $target.append(filter.render().el);\n\t\t\t\t\tfilter\n\t\t\t\t\t\t.$('input[type=\"search\"]')\n\t\t\t\t\t\t.addClass('form-control')\n\t\t\t\t\t\t.attr('placeholder', i18n.t('i18n.filter'))\n\t\t\t\t\t\t.attr('data-nx-ignore', 'change');\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('No target could be found for the filter: ' + key);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t////////////////////////////////////\n\t\t// !GRID FILTERS\n\t\t////////////////////////////////////\n\n\t\t// restore the selection (if any)\n\t\t_.each(this.selection, (id) => {\n\t\t\tthis.$(`tr[data-id=\"${id}\"] :checkbox`).prop('checked', true);\n\t\t});\n\n\t\t// trigger this at render so that buttons & such get updated.\n\t\tthis.selectChanged(this.selection);\n\t},\n\n\t/**\n\t * this.edit(), this.add() and this.deleteSelected() do nothing by default.\n\t * You can either override them in your subclass to fire appropriate events, or specify Actions in your template that fire the same events.\n\t * (Implemeting this.edit() in your subclass is handy, because this.edit() gets the current selection as an argument.)\n\t */\n\t/**\n\t * Edit thing in table\n\t * @method\n\t * @param {string} id Unique ID of the selected row's model\n\t * @param {event} e Click event.\n\t */\n\tedit(id, e) {\n\t\tconst $target = this.$(e.target);\n\t\tconst anchor = $target.is('a') ? $target : $target.closest('a');\n\n\t\tif (\n\t\t\t// If it is on an anchor tag with an href then let it pass thorugh\n\t\t\t(anchor.length && anchor.attr('href')) ||\n\t\t\t// Do not interfere with editable cells\n\t\t\t$target.hasClass('editable')\n\t\t)\n\t\t\treturn true;\n\n\t\tif (!this.eventStr) return;\n\n\t\t// Try and pipe through action event system\n\t\tlet action = Netx.Actions.Find(`${this.eventStr}:edit`);\n\t\tif (!action) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t`${this.eventStr}:edit`,\n\t\t\t\tthis.collection.get(parseInt(id)) || id,\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\t// TODO: More of a reason to break out the action tests - this is spot 3 where this info is needed\n\t\tconst row = this.getRowViewById(id);\n\t\tlet valid = true;\n\n\t\t// Matrix test\n\t\tif (\n\t\t\taction.matrix &&\n\t\t\t_.isFunction(row.model.allows) &&\n\t\t\t!row.model.allows(action.matrix)\n\t\t) {\n\t\t\t// Switch to view action if available\n\t\t\taction = Netx.Actions.Find(`${this.eventStr}:view`);\n\t\t\tvalid = !_.isUndefined(action);\n\t\t}\n\n\t\t// There is an enabler test\n\t\tif (valid && _.isFunction(action.enableTest)) {\n\t\t\tvalid = action.enableTest(this.getRowViewById(id));\n\t\t}\n\n\t\t// If still valid and there is a user level test\n\t\tif (valid && _.isNumber(action.userLevel)) {\n\t\t\tvalid = action.userLevel <= Netx.getUserLevel();\n\t\t}\n\t\tvalid && this.performAction(action, [this.getRowViewById(id), e]);\n\t\treturn false;\n\t},\n\n\t/**\n\t * @method\n\t * @param {boolean} remove Remove grid filters (destroy)\n\t */\n\tclearFilters(remove) {\n\t\t// If we have defined a filter, remove it\n\t\tif (this.gridFilter) {\n\t\t\t_.isFunction(this.gridFilter.clear) && this.gridFilter.clear();\n\t\t\t// Defer or risk an error while clear is occuring\n\t\t\tremove && _.defer(_.bind(this.gridFilter.remove, this.gridFilter));\n\t\t}\n\n\t\t// if we have defined a whole mess of filters, remove each one\n\t\tif (this.gridFilters) {\n\t\t\t_.each(this.gridFilters, (filter, key, all) => {\n\t\t\t\t_.isFunction(filter.clear) && filter.clear();\n\t\t\t\t// Defer or risk an error while clear is occuring\n\t\t\t\tremove && _.defer(_.bind(filter.remove, filter));\n\t\t\t});\n\t\t}\n\t},\n\n\t/** @override */\n\tcleanUpTable() {\n\t\t// Clean up backgrid\n\t\tthis.grid && this.grid.remove();\n\t\tthis.clearFilters(true);\n\t},\n\n\t/**\n\t * @method\n\t * @param {number} id Model id\n\t * @return {Backbone.View} View\n\t */\n\tgetRowViewById(id) {\n\t\tconst model = this.collection.get(id);\n\t\tif (!model) {\n\t\t\tthrow new Error(`cant find model \"${id}\" in this.collection`);\n\t\t}\n\n\t\tconst view = this.grid && this.grid.getRowById(model.id);\n\t\tif (view == null) {\n\t\t\tthrow new Error('Could not find view for model id ' + id);\n\t\t}\n\n\t\treturn view;\n\t},\n\n\t/**\n\t * @method\n\t * @param {element} el Element\n\t * @return {string} id\n\t */\n\tgetRowIdByElement(el) {\n\t\tif (!(el instanceof jQuery)) {\n\t\t\tel = this.$(el);\n\t\t}\n\t\tlet $idElement = el;\n\t\tif (!$idElement.is('[data-nx-id]') && !$idElement.is('[data-id]')) {\n\t\t\t$idElement = el.closest('[data-nx-id]');\n\t\t\tif (!$idElement.length) {\n\t\t\t\t$idElement = el.closest('[data-id]');\n\t\t\t}\n\t\t}\n\t\treturn $idElement.data('nx-id') || $idElement.data('id');\n\t},\n\n\t/**\n\t * @method\n\t * @param {Netx.Model} model Row model\n\t * @param {Backgrid.Row} row Row view\n\t */\n\trowAdded(model, row) {},\n\n\t/**\n\t * @method\n\t * @param {mixed} id Row's model id\n\t * @param {event} e `click` event\n\t */\n\trowClicked(id, e) {\n\t\tthis.edit(id, e);\n\t},\n\n\t/**\n\t * Triggered when row selections are changed.\n\t * By default it enables/disables `this.$deleteButton`. Override it to handle any other things you'd like to have change with the selection.\n\t * @param {array} selection Selection\n\t */\n\tselectChanged(selection) {\n\t\tthis.$deleteBtn && this.$deleteBtn.toggle(selection.length > 0);\n\t\treturn true;\n\t},\n\n\t/**\n\t * Returns an array of ids for the models that are selected.\n\t * It also caches that list in this.selected[].\n\t * @return {array} Selected rows\n\t */\n\tselected() {\n\t\tthis.selection = [];\n\t\t_.each(\n\t\t\tthis.$('.select-row-cell input:checked').closest('tr'),\n\t\t\tfunction (tr) {\n\t\t\t\tthis.selection.push(this.$(tr).attr('data-id'));\n\t\t\t},\n\t\t\tthis,\n\t\t);\n\t\treturn this.selection;\n\t},\n};\n\n// Give backgrid the ability to participate in our actions and menus\n// See Netx.Views.TableView (postRender) about this\n// These are the only methods necessary ( and which do not interfere with an Backgrid prototype methods ) to make this work\n_.extend(\n\tBackgrid.ControlCell.prototype,\n\t_.pick(\n\t\tBase.prototype,\n\t\t'configureActions',\n\t\t'disableAction',\n\t\t'enableAction',\n\t\t'getExcludedViews',\n\t\t'initializeActions',\n\t\t'performAction',\n\t\t'renderActions',\n\t),\n);\n\n// Give our custom backgrid cell access to our autocomplete methods\n_.extend(\n\tBackgrid.CellEditor.prototype,\n\t_.pick(Base.prototype, 'autocomplete', 'detectAutocomplete'),\n);\n// Give our backgrid column cells and rows access to our context menus\n_.extend(Backgrid.Row.prototype, {\n\tconfigureSyncActions: Base.prototype.configureSyncActions,\n\tevents: _.extend(Backgrid.HeaderCell.prototype.events, {\n\t\tcontextmenu: 'findContextMenu',\n\t}),\n\tfindContextMenu: Base.prototype.findContextMenu,\n\tinsertContextMenu: Base.prototype.insertContextMenu,\n});\n_.extend(Backgrid.HeaderCell.prototype, {\n\tconfigureSyncActions: Base.prototype.configureSyncActions,\n\tevents: _.extend(Backgrid.HeaderCell.prototype.events, {\n\t\tcontextmenu: 'findContextMenu',\n\t}),\n\tfindContextMenu: Base.prototype.findContextMenu,\n\tinsertContextMenu: Base.prototype.insertContextMenu,\n});\n_.extend(Backgrid.Cell.prototype, {\n\tconfigureSyncActions: Base.prototype.configureSyncActions,\n});\n\n// This solves the fact that delagateEvents does not get called\n// This is mainly a hack for the select menus - the listener for backgrid:select:filter:ready is just below in our system thing loop\nconst backgridSelectFilter = _.extend(\n\t{},\n\tBackgrid.Extension.SelectFilter.prototype,\n);\n_.extend(Backgrid.Extension.SelectFilter.prototype, {\n\trender() {\n\t\tbackgridSelectFilter.render.apply(this, arguments);\n\t\tsetTimeout(() => {\n\t\t\tdispatcher.trigger('backgrid:select:filter:ready', this.$el);\n\t\t}, 10);\n\t\tthis.delegateEvents();\n\t\treturn this;\n\t},\n});\n\nexport default function (target) {\n\tif (!target || target.hasFunctionality(NAME)) return target;\n\n\ttarget.extendFunctionality(Props);\n\n\ttarget.addInitializer((instance, opts = {}) => {\n\t\tinstance.$el.addClass('table-view');\n\t\tinstance.events = _.extend(\n\t\t\t{\n\t\t\t\t'click .nx-action'(e) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t},\n\t\t\t\t'click tbody tr'(e) {\n\t\t\t\t\t// Let the context menu through\n\t\t\t\t\tif (e.isTrigger === 3) return;\n\n\t\t\t\t\tvar $target = instance.$(e.target);\n\t\t\t\t\tif (\n\t\t\t\t\t\t$target.closest('.selectpicker-cell').length ||\n\t\t\t\t\t\t$target.closest('.handle-cell').length ||\n\t\t\t\t\t\t$target.hasClass('handle-cell') ||\n\t\t\t\t\t\t$target.closest('.checkbox').length ||\n\t\t\t\t\t\te.target.type == 'checkbox'\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tinstance.rowClicked(\n\t\t\t\t\t\tinstance.$(e.currentTarget).closest('tr').attr('data-id'),\n\t\t\t\t\t\te,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t'click .btn-add': 'add',\n\t\t\t\t'click .btn-delete': 'deleteSelected',\n\t\t\t\t'click .select-row-cell'() {\n\t\t\t\t\tinstance.selectChanged(instance.selected());\n\t\t\t\t},\n\t\t\t},\n\t\t\tinstance.events,\n\t\t);\n\n\t\t/** @override */\n\t\tinstance.bindCollectionEvents = _.wrap(\n\t\t\tinstance.bindCollectionEvents,\n\t\t\t(bindCollectionEvents) => {\n\t\t\t\tbindCollectionEvents.call(instance);\n\t\t\t\treturn instance.listenTo(\n\t\t\t\t\tinstance.collection,\n\t\t\t\t\t'backgrid:sort',\n\t\t\t\t\t(column, direction) => {\n\t\t\t\t\t\tinstance.collection.setSort(column.get('name'), direction);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\n\t\t// Wrap the excluded views method\n\t\tinstance.getExcludedViews = _.wrap(\n\t\t\tinstance.getExcludedViews,\n\t\t\t(getExcludedViews) => {\n\t\t\t\treturn [instance.el.querySelector('[data-grid]')].concat(\n\t\t\t\t\tgetExcludedViews.call(instance),\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\n\t\t/**\n\t\t * Differntiate between having `no-assets` and having `no-matches`\n\t\t * @override\n\t\t */\n\t\tinstance.checkHasResults = _.wrap(\n\t\t\tinstance.checkHasResults,\n\t\t\t(checkHasResults) => {\n\t\t\t\tconst el = instance.el;\n\n\t\t\t\t// Remove unless we hit the special case below.\n\t\t\t\tel.removeAttribute('data-nx-no-matches');\n\n\t\t\t\t// Check if we have filters, and if the filters have a value - if there is no filter or no value\n\t\t\t\t// fallback to the classic check\n\t\t\t\tif (\n\t\t\t\t\t(!instance.gridFilters ||\n\t\t\t\t\t\t!Object.values(instance.gridFilters).some(\n\t\t\t\t\t\t\t(gridFilter) => gridFilter.value !== '',\n\t\t\t\t\t\t)) &&\n\t\t\t\t\t(!instance.gridFilter || instance.gridFilter.value === '')\n\t\t\t\t)\n\t\t\t\t\treturn checkHasResults.call(instance);\n\n\t\t\t\t// The length of our collection without filtering\n\t\t\t\tvar trueCollectionLength = 0;\n\t\t\t\tif (instance.gridFilters) {\n\t\t\t\t\t// Loop over each filter until we hit any results at all\n\t\t\t\t\tconst gridFilters = instance.gridFilters;\n\t\t\t\t\tfor (let key in gridFilters) {\n\t\t\t\t\t\tif (gridFilters.hasOwnProperty(key)) {\n\t\t\t\t\t\t\ttrueCollectionLength = gridFilters[key].shadowCollection.length;\n\t\t\t\t\t\t\tif (trueCollectionLength > 0) break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttrueCollectionLength = instance.gridFilter.shadowCollection.length;\n\t\t\t\t}\n\n\t\t\t\t// If our original length is 0 then we do not have assets (unless this.hasAssets is defined and has other plans)\n\t\t\t\tif (!trueCollectionLength) {\n\t\t\t\t\tconst hasResults = _.isFunction(instance.hasAssets)\n\t\t\t\t\t\t? instance.hasAssets()\n\t\t\t\t\t\t: false;\n\t\t\t\t\tif (hasResults) {\n\t\t\t\t\t\tel.removeAttribute('data-nx-no-assets');\n\t\t\t\t\t\tel.removeAttribute('data-nx-no-results');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.setAttribute('data-nx-no-assets', true);\n\t\t\t\t\t\tel.setAttribute('data-nx-no-results', true);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// You have assets, but none of them match what you're searching for.\n\t\t\t\tif (instance.collection.length) {\n\t\t\t\t\tel.removeAttribute('data-nx-no-matches');\n\t\t\t\t\t// Still need to remove these in any event they may have been set\n\t\t\t\t\tel.removeAttribute('data-nx-no-assets');\n\t\t\t\t\tel.removeAttribute('data-nx-no-results');\n\t\t\t\t} else {\n\t\t\t\t\tel.setAttribute('data-nx-no-matches', true);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\t/**\n\t\t * Support context menu for table rows\n\t\t * @type {string}\n\t\t */\n\t\tinstance.contextMenu = opts.contextMenu;\n\n\t\t/**\n\t\t * Alternately, this.eventStr is the prefix for both the submit & cancel events generated by the form.\n\t\t * For instance, if eventStr == 'module:foo',\n\t\t * form sumission will trigger 'module:foo:confirmed' on the dispatcher, and cancel will trigger 'module:foo:cancelled'.\n\t\t * @type {string}\n\t\t * @default\n\t\t */\n\t\tinstance.eventStr = opts.eventStr;\n\n\t\t// Experimental feature.\n\t\t// BackGrid renders on add/remove/sort, but not on individual model changes, because of the way it handles editable cells.\n\t\t// https://github.com/wyuenho/backgrid/issues/37\n\t\t//\n\t\t// However, we rarely use the editable cells. We'd probably prefer the cells to render on every change.\n\t\t//\n\t\t// If this is true, we re-render the grid on collection change events. (see postRender grid creation section.)\n\t\t//\n\t\t// This could maybe default to true someday? I just don't know what that would do to the grid editor right now.\n\t\t//\n\t\tinstance.renderOnChange = opts.renderOnChange === true;\n\n\t\t/** @type {string} */\n\t\tinstance.tableClassName = opts.tableClassName || 'table table-hover';\n\n\t\t/**\n\t\t * Contains the current set of selected rows, referenced by the unique ID of the models in the collection.\n\t\t * @memberOf Netx.Views.TableView\n\t\t * @alias selection\n\t\t * @type {array}\n\t\t */\n\t\tinstance.selection = opts.selection || [];\n\n\t\tinstance.serverSideSort = opts.serverSideSort === true;\n\n\t\t/**\n\t\t * Children of this class should override this.columns to define their grid columns. See backgrid docs for details.\n\t\t * The default value is one column, containing select boxes for each row.\n\t\t * @memberOf Netx.Views.TableView\n\t\t * @alias columns\n\t\t * @type {object}\n\t\t */\n\t\tinstance.columns = instance.defineColumns();\n\t\t// remove any columns with a userLevel set to keep out lowdown users\n\t\tinstance.columns = _.without(\n\t\t\tinstance.columns,\n\t\t\t_.find(\n\t\t\t\tinstance.columns,\n\t\t\t\t(c) => c.userLevel && c.userLevel > Netx.getUser().get('type'),\n\t\t\t),\n\t\t);\n\n\t\tif (instance.serverSideSort && instance.collection.setSort) {\n\t\t\tinstance.listenTo(instance.collection, 'backgrid:sort', function (\n\t\t\t\tcolumn,\n\t\t\t\tdirection,\n\t\t\t) {\n\t\t\t\tthis.collection.setSort(column.get('name'), direction);\n\t\t\t});\n\t\t}\n\n\t\t// Hey, listen!\n\t\tinstance\n\t\t\t.on('preRenderHook', instance.prepareTable)\n\t\t\t.on('postRenderHook', instance.renderTable)\n\t\t\t.on('removeHook', instance.cleanUpTable)\n\n\t\t\t.on('hidden', () => {\n\t\t\t\t// DAM-6415\n\t\t\t\tinstance.clearFilters();\n\t\t\t});\n\t}, NAME);\n\n\treturn target;\n}\n","export {default} from '@netx/core/functionality/table';\n\nimport {getEnabledActions} from '@netx/core-permissions/properties/actions';\nimport {isMobile} from '@netx/core/lib/underscore-netx';\n\n// import 'theme-css/ui/tables.less';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {\n\tfaCaretDown,\n\tfaEllipsisV,\n\tfaEquals,\n} from '@fortawesome/pro-solid-svg-icons';\n\nconst icons = {\n\tfaCaretDown: icon(faCaretDown).html,\n\tfaEllipsisV: icon(faEllipsisV).html,\n\tfaEquals: icon(faEquals).html,\n};\n\nBackgrid.UIComponents.selectpicker = function () {\n\tconst plugins = (this.plugins = this.plugins || {});\n\tif (plugins.selectpicker) {\n\t\tplugins.selectpicker.destroy();\n\t\tdelete plugins.selectpicker;\n\t}\n\n\t// Check that we want it\n\tconst selectpicker = this.column.get('selectpicker');\n\tif (!selectpicker) return;\n\n\tconst $selectEl = this.$('select');\n\tif (!$selectEl.length) return;\n\n\t$selectEl.selectpicker({\n\t\tstyleBase: 'mdc-button',\n\t\tdoneButtonText: 'done',\n\t\tstyle: '',\n\t\tcontainer: 'body',\n\t\tliveSearch: !isMobile(),\n\t\tnoneSelectedText: i18n.t('i18n.nothingSelected'),\n\t\t// This will be followed by \"search term\"\n\t\tnoneResultsText: i18n.t('i18n.noResultsMatchThing'),\n\t\ttemplate: {\n\t\t\tcaret: icons.faCaretDown,\n\t\t},\n\t\t...selectpicker,\n\t});\n\t// Store for cleanup\n\tplugins.selectpicker = $selectEl.data('selectpicker');\n\tthis.$el.addClass('selectpicker-cell');\n};\n\n// Create copy of original Backgrid.HeaderCell\nconst HeaderCell = {...Backgrid.HeaderCell.prototype};\n// Extend Backgrid.HeaderCell\nObject.assign(Backgrid.HeaderCell.prototype, {\n\t/** @override */\n\trender() {\n\t\tconst r = HeaderCell.render.apply(this, arguments);\n\n\t\tconst column = this.column;\n\t\tconst sortable = Backgrid.callByNeed(\n\t\t\tcolumn.sortable(),\n\t\t\tcolumn,\n\t\t\tthis.collection,\n\t\t);\n\t\tif (sortable && r.el) {\n\t\t\tconst oldCaret = r.el.querySelector('.sort-caret');\n\t\t\tif (oldCaret) {\n\t\t\t\toldCaret.classList.remove('sort-caret');\n\t\t\t\toldCaret.classList.add('sort-order');\n\t\t\t\toldCaret.innerHTML = icons.faCaretDown;\n\t\t\t}\n\t\t}\n\t\treturn r;\n\t},\n});\n\n/**\n * Backgrid.HandleCell\n * Sets the right attributes for reorder handle\n * @class\n * @extends Backgrid.Cell\n */\nBackgrid.HandleCell.prototype.render = function () {\n\tthis.$el.empty().html(icons.faEquals);\n\n\treturn this;\n};\n\n// Backgrid.ControlCell\n// Push them in material menus\nimport MaterialMenus from '@netx/core/functionality/materialMenus';\n\n// Override methods\nconst ControlCell = Backgrid.ControlCell;\nconst OriginalControlCellRender = ControlCell.prototype.render;\nControlCell.prototype.initialize = function (opts) {\n\t// Super\n\tBackgrid.Cell.prototype.initialize.apply(this, arguments);\n\n\tconst column = this.column;\n\tconst model = this.model;\n\n\t// We are neither editable nor sortable\n\tcolumn.set({\n\t\teditable: false,\n\t\tsortable: false,\n\t});\n\n\t// Listen to all changes\n\tthis.stopListening(model, `change:${column.get('name')}`);\n\tthis.listenTo(model.collection, 'change sync', _.debounce(this.render, 10));\n\n\t// Set up any additonal functionality\n\tconst __initializers__ = this.constructor.__initializers__ || [];\n\t__initializers__.forEach((func) => func(this, opts));\n};\nControlCell.prototype.render = function () {\n\tconst column = this.column;\n\t// DAM-15560 band-aid until we rework menus and actions\n\tif (column.get('noMenu')) {\n\t\treturn OriginalControlCellRender.call(this);\n\t}\n\n\tthis.trigger('preRenderHook', this);\n\n\tconst model = this.model;\n\tconst columnName = column.get('name');\n\n\tthis.$el.empty().addClass(column.get('className') || `${columnName}-attr`);\n\n\tconst omitRender = column.get('omitRender');\n\t// If we should not render\n\tif (_.isFunction(omitRender) && omitRender(model.get(columnName), model)) {\n\t\treturn this;\n\t}\n\n\tconst nxActions = Netx.Actions;\n\t// Get the actual actions\n\tconst actions = this.formatter\n\t\t.fromRaw((column.get('actions') || []).slice(), model)\n\t\t.map((action) => {\n\t\t\treturn nxActions.Find(action);\n\t\t})\n\t\t.filter((action) => action != null);\n\n\tconst enabledActions = getEnabledActions(actions, this);\n\n\tif (!enabledActions.length) {\n\t\tthis.$el.html('');\n\t\treturn this;\n\t}\n\n\tthis.$el.html(\n\t\t[\n\t\t\t'<div class=\"actions mdc-menu-surface--anchor\">',\n\t\t\t'<span tabindex=\"0\" role=\"button\" class=\"mdc-icon-button menu-button nx-actions\">',\n\t\t\t`<span class=\"mdc-icon-button__icon\">${icons.faEllipsisV}</span>`,\n\t\t\t'</span>',\n\t\t\t'<div class=\"mdc-menu-surface mdc-menu mdc-menu--hoist shared-resource__menu\">',\n\t\t\t'<ul class=\"mdc-list\" role=\"menu\">',\n\t\t\tenabledActions\n\t\t\t\t.map((action) => {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t`<a class=\"mdc-list-item nx-action\" data-action=\"${action.event}\">`,\n\t\t\t\t\t\t`<span class=\"mdc-list-item__graphic\">${action.icon}</span>`,\n\t\t\t\t\t\t`<span class=\"mdc-list-item__text\">${action.label}</span>`,\n\t\t\t\t\t\t'</a>',\n\t\t\t\t\t].join('');\n\t\t\t\t})\n\t\t\t\t.join(''),\n\t\t\t`<li class=\"nx-cancel cancel mdc-list-item\">${i18n.t(\n\t\t\t\t'i18n.cancel',\n\t\t\t)}</li>`,\n\t\t\t'</ul>',\n\t\t\t'</div>',\n\t\t\t'</div>',\n\t\t].join(''),\n\t);\n\n\t// TODO: once we piece out our action code, enabling, disabling, checking validity etc revisit\n\t// Call our actions\n\tthis.initializeActions();\n\tthis.renderActions();\n\n\tthis.trigger('renderedHook', this);\n\n\treturn this.trigger('postRenderHook', this);\n};\nControlCell.prototype.remove = function () {\n\tthis.trigger('removeHook', this);\n\treturn Backgrid.Cell.prototype.remove.apply(this, arguments);\n};\n\n// Mimic some functionality of netx-view\nControlCell.hasFunctionality = function (functionalityName) {\n\tconst functionality = this.__functionality__ || [];\n\treturn functionality.includes(functionalityName);\n};\nControlCell.addInitializer = function (cb, functionalityName) {\n\tthis.__initializers__ = (this.__initializers__ || []).concat([cb]);\n};\nMaterialMenus(ControlCell);\n","export {default} from '../FallbackMessage';\nexport * from '../FallbackMessage';\n","/**\n * User attribute set\n * @class\n * @todo DAM-11838 This collection is recreating everything in module:asset/models/assetAttributeSet due to the fact in 8.12\n * we have to maintain the system sets (collections) - the system sets do not relate to a shared resource at all and\n * so cannot extend the shared resource model. When we are able to deprecate the system sets this model will\n * be renamed to AssetAttributeSet and be the only model for attribute sets (period).\n */\nimport Base from '@netx/core-share/models/sharedResource';\n\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\nimport AttributesCollection from '../collections/attributes';\n\nimport {types as assetSetTypes} from '../properties/assetSets';\n\nexport default class AssetAttributeSet_User extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {array} defaults.attributeIds - The default attribute template ids\n\t * @property {string} defaults.name - The default attribute set name\n\t * @property {Netx.Collections.AssetAttributes} defaults.attributes - The default collection of attribute templates (client side)\n\t * @property {number} defaults.userId - The default user id for user attribute set\n\t * @property {string} defaults.description - The default description (client side)\n\t */\n\tget defaults() {\n\t\treturn _.extend(super.defaults, {\n\t\t\tattributeIds: [],\n\t\t\tname: '',\n\t\t\tuserId: 0,\n\t\t\t// Client attributes\n\t\t\tdescription: '',\n\t\t});\n\t}\n\n\t/** @type {array} */\n\tget clientAttrs() {\n\t\treturn super.clientAttrs.concat(['attributes', 'description']);\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this model\n\t * @property {array} methods.create - Create new attribute field set\n\t * @property {array} methods.remove - Destroy attribute field set\n\t * @property {array} methods.update - Update attribute field set\n\t *\n\t * @property {array} methods.fetchBean - Fetch attribute field set bean\n\t * @property {array} methods.saveAttributeFieldSet - Set attribute field set data\n\t */\n\tget methods() {\n\t\treturn _.extend(super.methods, {\n\t\t\t/**\n\t\t\t * Create new attribute field set\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate(opts) {\n\t\t\t\treturn this.saveAttributeFieldSet(opts).then(data => {\n\t\t\t\t\tthis.set(data, opts);\n\t\t\t\t\treturn this.fetch(opts);\n\t\t\t\t});\n\t\t\t},\n\t\t\t/**\n\t\t\t * Destroy attribute field set\n\t\t\t * @method\n\t\t\t */\n\t\t\tremove: ['deleteAttributeFieldSet', 'id'],\n\t\t\t/**\n\t\t\t * Update attribute field set\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdate(opts) {\n\t\t\t\treturn this.saveAttributeFieldSet(opts).then(data => {\n\t\t\t\t\treturn this.fetch(opts);\n\t\t\t\t});\n\t\t\t},\n\t\t\t/**\n\t\t\t * Fetch attribute field set bean\n\t\t\t * @method\n\t\t\t */\n\t\t\tfetchBean: ['getAttributeFieldSet', 'id'],\n\t\t\t/**\n\t\t\t * Set attribute field set data\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tsaveAttributeFieldSet(opts) {\n\t\t\t\treturn ['saveAttributeFieldSet', this.self()];\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attr Model attributes\n\t * @param {object} opts Model options\n\t * @listens module:user#user:attributeSet:edit:success\n\t */\n\tconstructor(attr, opts = {}) {\n\t\t/**\n\t\t * Resource type name\n\t\t * @type {string}\n\t\t */\n\t\topts.resourceName = 'attributeSet';\n\n\t\tsuper(attr, opts);\n\n\t\t/**\n\t\t * Contains all avialable asset attribute templates\n\t\t * @memberOf module:asset/models/assetAttributeSet\n\t\t * @alias assetAttributes\n\t\t * @type {module:asset/collections/attributes}\n\t\t * @todo we need to find a good way of passing additonal arguments to our models\n\t\t */\n\t\tthis.assetAttributes = opts.assetAttributes || Netx.asset.attributes;\n\n\t\t/**\n\t\t * Contains all attribute templates for this set\n\t\t * @memberOf module:asset/models/assetAttributeSet\n\t\t * @alias setAttributes\n\t\t */\n\t\tthis.attributeTemplates = new AttributesCollection([], {comparator: null});\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tthis,\n\t\t\t'change:attributeIds',\n\t\t\tthis.populateAttributes,\n\t\t).listenTo(\n\t\t\tdispatcher,\n\t\t\t'user:attributeSet:edit:success',\n\t\t\t(attributeSet, isNew) => {\n\t\t\t\tif (attributeSet.id === this.id && attributeSet !== this) {\n\t\t\t\t\tthis.set(_.clone(_.omit(attributeSet.attributes, 'id')));\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Return an array of assetAttribute models (attribute templates, in DAM parlance) defined by this model\n\t * @method\n\t * @return {array}\n\t */\n\tgetAttributes() {\n\t\tconst assetAttributes = this.assetAttributes;\n\t\treturn [\n\t\t\t...new Set(\n\t\t\t\t(this.get('attributeIds') || [])\n\t\t\t\t\t.map(id => assetAttributes.get(id))\n\t\t\t\t\t.filter(attr => attr != null),\n\t\t\t),\n\t\t];\n\t}\n\n\t/**\n\t * @method\n\t * @return {number} Attribute count\n\t */\n\tgetAttributeCount() {\n\t\treturn this.get('contentCount') || (this.get('attributeIds') || []).length;\n\t}\n\n\t/**\n\t * Get a collection of only the mandatory attributes in this set\n\t * @method\n\t * @param {boolean} withDefaultValue Return even those mandatory attributes that have default values\n\t * @return {Netx.Collections.AssetAttributes}\n\t */\n\tgetMandatoryAttributes(withDefaultValue) {\n\t\treturn new AttributesCollection(\n\t\t\tthis.attributeTemplates.filter(\n\t\t\t\tm =>\n\t\t\t\t\tm.get('mandatory') == 1 &&\n\t\t\t\t\t(m.get('value') == false || withDefaultValue),\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Populate the attribute templates in this set\n\t * @method\n\t */\n\tpopulateAttributes() {\n\t\tconst assetAttributes = this.assetAttributes;\n\n\t\tthis.attributeTemplates.set(\n\t\t\tthis.get('attributeIds')\n\t\t\t\t.map(id => assetAttributes.get(id))\n\t\t\t\t.filter(attr => attr != null),\n\t\t);\n\t\t// Fire custom event\n\t\tthis.trigger('nx:change:attributes', this, this.attributeTemplates);\n\t}\n\n\t/**\n\t * Provided with an array of attribute ids, set them on this model and populate the attributes\n\t * @method\n\t * @param {array} attributeIds An array of attribute ids\n\t */\n\tsetAttributes(attributeIds) {\n\t\tthis.set({\n\t\t\tattributeIds: _.unique(attributeIds),\n\t\t});\n\t\tthis.populateAttributes();\n\t}\n\n\t/**\n\t * Get an assetSet model\n\t * @method\n\t * @return {module:asset/models/assetSet} Asset set\n\t */\n\ttoAssetSet() {\n\t\treturn new AssetSetModel({\n\t\t\ttype: assetSetTypes.attributeSet,\n\t\t\tids: [this.id],\n\t\t\tmodels: [this],\n\t\t\tlabel: this.getLabel(),\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetAttributeSet_User';\n\t}\n}\n","export * from './enablers';\nexport * from './types';\n\nexport * from './containers/GridEditor';\nexport {default} from './containers/GridEditor';\n","/**\n * @worker\n * @return {Uint16Array}\n */\nexport default function() {\n\tvar round = Math.round;\n\t\n\tself.onmessage = function( e ) {\n\t\tvar msgData = e.data,\n\t\t\tcolumns = msgData.columns,\n\t\t\tcolumnCount = columns.length,\n\t\t\trows = msgData.rows,\n\t\t\trowCount = rows.length,\n\t\t\ttotalColumns = msgData.totalColumns,\n\t\t\ttotalRows = msgData.totalRows,\n\t\t\tcells = msgData.cells,\n\t\t\tcellCount = 0,\n\t\t\tindex = 0,\n\t\t\tc, col, cols, i, key, row, x, y;\n\t\t\n\t\t// Do not include cells within selected columns/rows\n\t\tfor ( key in cells ) {\n\t\t\tif ( cells.hasOwnProperty( key ) ) {\n\t\t\t\trow = parseInt( key );\n\t\t\t\tif ( rows.indexOf( row ) < 0 ) {\n\t\t\t\t\tcols = cells[ key ];\n\t\t\t\t\tfor ( i = 0, c = cols.length; i < c; i++ ) {\n\t\t\t\t\t\tif ( columns.indexOf( cols[ i ] ) < 0 ) {\n\t\t\t\t\t\t\tcellCount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Total cells that will be collected\n\t\tvar totalPoints = (\n\t\t\tcellCount +\n\t\t\tcolumnCount * totalRows +\n\t\t\trowCount * totalColumns -\n\t\t\tcolumnCount * rowCount\n\t\t) * 4;\n\t\t\n\t\tif ( msgData.all ) {\n\t\t\ttotalPoints = totalRows * totalColumns * 4;\n\t\t}\n\t\t\n\t\t// A buffer (twice the cell count) and a typed array are faster than\n\t\t// an array in the same manner (where every 2 values are a pair)\n\t\t// Not to mention faster than a multidimaensional array or array of objects\n\t\t// Since this is a Uint16 we support 65536 rows and columns - but you would\n\t\t// crash the browser long before you hit this.\n\t\t//\n\t\t// TODO: Convert to 32 if this should not suffice and we live in a future\n\t\t// where memory is not a concern.\n\t\tvar buf = new ArrayBuffer( totalPoints ),\n\t\t\tpoints = new Uint16Array( buf );\n\t\t\n\t\t// Just fire off a message after every other row\n\t\t// This cuts down on execution time while allowing the UI to update progress visually\n\t\t// Sending any messages at all will increase the execution time of this worker but\n\t\t// actual feedback is better than simulated, so it is a trade off.\n\t\t// You cannot send any messages to this worker to explicitely check progress because\n\t\t// though this runs in its own thread, it still blocks that thread while working\n\t\t// so no messages will get out before it is complete\n\t\t// Not knowing data size or system capability I think a trade off in a little extra time\n\t\t// and being able to display real progress is preferrable\n\t\t\n\t\t// All cells selected\n\t\tif ( msgData.all ) {\n\t\t\tfor ( y = 0; y < totalRows; y++ ) {\n\t\t\t\trow = y;\n\t\t\t\tfor ( x = 0; x < totalColumns; x++ ) {\n\t\t\t\t\tpoints[ index ] = x;\n\t\t\t\t\tpoints[ index + 1 ] = row;\n\t\t\t\t\tindex += 2;\n\t\t\t\t}\n\t\t\t\ty%2 && self.postMessage( { progress: round( index / totalPoints * 100 ) } );\n\t\t\t}\n\t\t}\n\t\t// Partial selection\n\t\telse {\n\t\t\t// First columns\n\t\t\tif ( columnCount ) {\n\t\t\t\tfor( x = 0; x < columnCount; x++ ) {\n\t\t\t\t\tcol = columns[ x ];\n\t\t\t\t\tfor( y = 0; y < totalRows; y++ ) {\n\t\t\t\t\t\trow = y;\n\t\t\t\t\t\tpoints[ index ] = col;\n\t\t\t\t\t\tpoints[ index + 1 ] = row;\n\t\t\t\t\t\tindex += 2;\n\t\t\t\t\t}\n\t\t\t\t\tx%2 && self.postMessage( { progress: round( index / totalPoints * 100 ) } );\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t// Then rows\n\t\t\tif ( rowCount ) {\n\t\t\t\tfor( y = 0; y < rowCount; y++ ) {\n\t\t\t\t\trow = rows[ y ];\n\t\t\t\t\tfor ( x = 0; x < totalColumns; x++ ) {\n\t\t\t\t\t\tcol = x;\n\t\t\t\t\t\tif ( columns.indexOf( x ) < 0 ) {\n\t\t\t\t\t\t\tpoints[ index ] = col;\n\t\t\t\t\t\t\tpoints[ index + 1 ] = row;\n\t\t\t\t\t\t\tindex += 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ty%2 && self.postMessage( { progress: round( index / totalPoints * 100 ) } );\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t// And lastly, loose cell\n\t\t\tif ( cellCount ) {\n\t\t\t\tfor ( key in cells ) {\n\t\t\t\t\tif ( cells.hasOwnProperty( key ) ) {\n\t\t\t\t\t\trow = parseInt( key );\n\t\t\t\t\t\tif ( rows.indexOf( row ) < 0 ) {\n\t\t\t\t\t\t\tcols = cells[ key ];\n\t\t\t\t\t\t\tfor ( i = 0, c = cols.length; i < c; i++ ) {\n\t\t\t\t\t\t\t\tcol = cols[ i ];\n\t\t\t\t\t\t\t\tif ( columns.indexOf( col ) < 0 ) {\n\t\t\t\t\t\t\t\t\tpoints[ index ] = col;\n\t\t\t\t\t\t\t\t\tpoints[ index + 1 ] = row;\n\t\t\t\t\t\t\t\t\tindex += 2;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tself.postMessage( { progress: round( index / totalPoints * 100 ) } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tself.postMessage( { progress: 100, points: points }, [ points.buffer ] );\n\t\tself.close();\n\t};\n};\n","import {i18n} from '@netx/core/i18n';\n\nexport let resyncScopes = {\n\tall: i18n.t('i18n.all'),\n\tsearchOnly: i18n.t('i18n.searchOnly'),\n};\n\nexport default {\n\tresyncScopes: resyncScopes,\n};\n","export default {\n\t// defaultColumnWidth: 150,\n\t// Our default row height\n\tdefaultRowHeight: 60,\n};\n","import Netx from '@netx/core/bootstrap';\nimport {getStylePropertyDemo} from '@netx/core-components/Theme';\n\nexport const getDefaults = (type = 'light') => {\n\tconst getStyleProperty =\n\t\tNetx.getStyleProperty ||\n\t\tfunction (key) {\n\t\t\treturn getStylePropertyDemo(key, type);\n\t\t};\n\n\treturn {\n\t\t// Our colors\n\t\tcellDefaultColor: getStyleProperty('background'),\n\t\tcellReadOnlyColor: getStyleProperty('custom-background-light'),\n\t\tcellChangedColor: 'rgba(243, 208, 124, 0.28)',\n\t\tcellMandatoryColor: 'rgba(247, 197, 197, 0.28)',\n\n\t\t/////////////////////////////////\n\t\t// CELLS\n\t\t/////////////////////////////////\n\t\t// Default cell background color\n\t\tbackgroundColor: getStyleProperty('background'),\n\t\tcolor: getStyleProperty('text-primary-on-background'),\n\t\t// Default cell font\n\t\tfont: '12px Tahoma, Geneva, sans-serif',\n\t\t// Cell font color when selected\n\t\tforegroundSelectionColor: getStyleProperty('background'),\n\t\t// Cell font when selected\n\t\tforegroundSelectionFont: 'normal 12px Tahoma, Geneva, sans-serif',\n\t\t// Loose selection background\n\t\tselectionRegionOverlayColor: 'rgba(96, 136, 255, 0.2)',\n\t\t// Loose selection border\n\t\tselectionRegionOutlineColor: '#6088ff',\n\t\t// When hovering\n\t\thoverCellHighlight: {\n\t\t\tenabled: true,\n\t\t\tbackgroundColor: getStyleProperty('custom-background-light'),\n\t\t},\n\t\tfilterable: false,\n\t\tgridBorderRight: true,\n\t\trenderFalsy: true,\n\t\t// Select multiple cells individually\n\t\tmultipleSelections: true,\n\t\t/////////////////////////////////\n\t\t// !CELLS\n\t\t/////////////////////////////////\n\n\t\t/////////////////////////////////\n\t\t// COLUMNS\n\t\t/////////////////////////////////\n\t\t// Expand columns to fit content\n\t\tcolumnAutosizing: false,\n\t\t// Frozen columns\n\t\tfixedColumnCount: 0,\n\t\t// When hovering\n\t\thoverColumnHighlight: {\n\t\t\tenabled: true,\n\t\t\tbackgroundColor: getStyleProperty('custom-background-light'),\n\t\t},\n\t\tcolumnHeaderBackgroundColor: getStyleProperty('custom-background-light'),\n\t\tcolumnHeaderColor: getStyleProperty('text-secondary-on-background'),\n\t\t// Column background color when a selection is within column\n\t\tcolumnHeaderBackgroundSelectionColor: getStyleProperty('secondary'),\n\t\t// Column font color when selected\n\t\tcolumnHeaderForegroundSelectionColor: getStyleProperty('on-secondary'),\n\t\t// Column font when a selection is within column\n\t\tcolumnHeaderForegroundSelectionFont:\n\t\t\t'normal 12px Tahoma, Geneva, sans-serif',\n\t\t// Column background when column selected\n\t\tcolumnHeaderBackgroundColumnSelectionColor: '#6088ff',\n\t\t// Column font color when selected\n\t\tcolumnHeaderForegroundColumnSelectionColor: '#ffffff',\n\n\t\tminimumColumnWidth: 40,\n\t\t/////////////////////////////////\n\t\t// !COLUMNS\n\t\t/////////////////////////////////\n\n\t\t/////////////////////////////////\n\t\t// ROWS\n\t\t/////////////////////////////////\n\t\t// Allow rows to be resized\n\t\trowResize: true,\n\t\t// Allow select entire rows\n\t\trowSelection: true,\n\t\tcheckboxOnlyRowSelections: false,\n\t\trows: {\n\t\t\tsubgrid: {\n\t\t\t\t0: {\n\t\t\t\t\theight: 40,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// No filters for now\n\t\tshowFilterRow: false,\n\t\t// Allow multiple rows to be selected\n\t\tsingleRowSelectionMode: false,\n\t\trowHeaderColor: getStyleProperty('text-secondary-on-background'),\n\t\trowHeaderBackgroundColor: getStyleProperty('custom-background-light'),\n\t\t// Row background color when a selection is within row\n\t\trowHeaderBackgroundSelectionColor: getStyleProperty('secondary'),\n\t\t// Row font color when selected\n\t\trowHeaderForegroundSelectionColor: getStyleProperty('on-secondary'),\n\t\t// Row font when a selection is within row\n\t\trowHeaderForegroundSelectionFont: 'normal 12px Tahoma, Geneva, sans-serif',\n\t\t// When hovering\n\t\thoverRowHighlight: {\n\t\t\tenabled: true,\n\t\t\tbackgroundColor: getStyleProperty('custom-background-light'),\n\t\t},\n\t\t// Row background when row selected\n\t\trowHeaderBackgroundRowSelectionColor: '#6088ff',\n\t\t// Row font color when selected\n\t\trowHeaderForegroundRowSelectionColor: '#ffffff',\n\t\t/////////////////////////////////\n\t\t// !ROWS\n\t\t/////////////////////////////////\n\n\t\tlineColor: getStyleProperty('custom-border'),\n\t};\n};\n\nexport default {getDefaults};\n","export const ORIENTATION = <const>{\n\tLANDSCAPE: 'landscape',\n\tPORTRAIT: 'portrait',\n};\n\nexport const SIZE_TYPE = <const>{\n\tPREVIEW: 'preview',\n\tTHUMB: 'thumb',\n\tZOOM: 'zoom',\n};\n\nexport type Size = typeof SIZE_TYPE[keyof typeof SIZE_TYPE];\nexport type Dims = {width: number; height: number};\nexport type Orientation = typeof ORIENTATION[keyof typeof ORIENTATION];\n\nexport const PROXY_MAX_LENGTH: Record<Size, number> = <const>{\n\tpreview: 500,\n\tthumb: 150,\n\tzoom: 1000,\n};\n\nexport const isPortrait = ({height, width}: Dims) => height > width;\nexport const isLandscape = ({height, width}: Dims) => width > height;\nexport const isSquare = ({height, width}: Dims) => width === height;\n\n/**\n * Fit image to container dimensions\n * @return Fitted image dimensions\n */\nexport const getFittedDims = (imageDims: Dims, containerDims: Dims) => {\n\tif (isPortrait(imageDims)) {\n\t\tconst ratio = imageDims.width / imageDims.height;\n\t\tlet newHeight = Math.min(imageDims.height, containerDims.height);\n\t\tlet newWidth = newHeight * ratio;\n\t\tif (newWidth > containerDims.width) {\n\t\t\tnewWidth = containerDims.width;\n\t\t\tnewHeight = newWidth / ratio;\n\t\t}\n\t\treturn {width: newWidth, height: newHeight};\n\t}\n\tconst ratio = imageDims.height / imageDims.width;\n\tlet newWidth = Math.min(imageDims.width, containerDims.width);\n\tlet newHeight = newWidth * ratio;\n\tif (newHeight > containerDims.height) {\n\t\tnewHeight = containerDims.height;\n\t\tnewWidth = newHeight / ratio;\n\t}\n\treturn {width: newWidth, height: newHeight};\n};\n\n/**\n * Get dimensions of image based on size and (optionally) container dims (fit to container)\n * @returns New image dimensions\n */\nexport const getDims = (size: Size, imageDims: Dims, containerDims?: Dims) => {\n\tif (isPortrait(imageDims)) {\n\t\tconst maxSize = Math.min(PROXY_MAX_LENGTH[size], imageDims.height);\n\t\tconst newDims = {\n\t\t\theight: maxSize,\n\t\t\twidth: Math.round(maxSize * (imageDims.width / imageDims.height)),\n\t\t};\n\t\treturn containerDims ? getFittedDims(newDims, containerDims) : newDims;\n\t}\n\tconst maxSize = Math.min(PROXY_MAX_LENGTH[size], imageDims.width);\n\tconst newDims = {\n\t\theight: Math.round(maxSize * (imageDims.height / imageDims.width)),\n\t\twidth: maxSize,\n\t};\n\treturn containerDims ? getFittedDims(newDims, containerDims) : newDims;\n};\n\n/**\n * Given a container dimensions, deduce the appropriate size\n * @reurns Image size\n */\nexport const getClosestSize = (\n\t{width, height}: Dims,\n\torientation: Orientation,\n): Size => {\n\tif (orientation === ORIENTATION.PORTRAIT) {\n\t\tif (height <= PROXY_MAX_LENGTH.thumb) return SIZE_TYPE.THUMB;\n\t\tif (height > PROXY_MAX_LENGTH.preview) return SIZE_TYPE.ZOOM;\n\t\treturn SIZE_TYPE.PREVIEW;\n\t}\n\tif (width <= PROXY_MAX_LENGTH.thumb) return SIZE_TYPE.THUMB;\n\tif (width > PROXY_MAX_LENGTH.preview) return SIZE_TYPE.ZOOM;\n\treturn SIZE_TYPE.PREVIEW;\n};\n\n/**\n * Get preview image dimensions\n * @return Preview image dimensions\n */\nexport const getPreviewDims = ({width, height}: Dims, containerDims?: Dims) =>\n\tgetDims('preview', {width, height}, containerDims);\n\n/**\n * Get thumbnail image dimensions\n * @return Thumbnail image dimensions\n */\nexport const getThumbDims = ({width, height}: Dims, containerDims?: Dims) =>\n\tgetDims('thumb', {width, height}, containerDims);\n\n/**\n * Get zoom image dimensions\n * @return Zoom image dimensions\n */\nexport const getZoomDims = ({width, height}: Dims, containerDims?: Dims) =>\n\tgetDims('zoom', {width, height}, containerDims);\n\n/**\n * Get image dimensions based on size, and container dimensions (fit to container)\n * @return Sized image dimensions\n */\nexport const getSizedDims = (\n\tsize: Size,\n\timageDims: Dims,\n\tcontainerDims: Dims,\n) => {\n\tswitch (size) {\n\t\tcase 'thumb':\n\t\t\treturn getThumbDims(imageDims, containerDims);\n\t\tcase 'preview':\n\t\t\treturn getPreviewDims(imageDims, containerDims);\n\t\tcase 'zoom':\n\t\t\treturn getZoomDims(imageDims, containerDims);\n\t}\n};\n","import {\n\tfaArchive,\n\tfaArrowCircleDown,\n\tfaCalendar,\n\tfaClipboardList,\n\tfaCopy,\n\tfaCube,\n\tfaFilePdf,\n\tfaICursor,\n\tfaMinusCircle,\n\tfaShare,\n\tfaTrashAlt,\n} from '@fortawesome/pro-solid-svg-icons';\n\nexport const CART_SAVED_ACTION_ICON = <const>{\n\tCREATE_PDF: faFilePdf,\n\tCREATE_TMS_OBJECT_PACKAGE: faCube,\n\tDELETE: faTrashAlt,\n\tDOWNLOAD: faArrowCircleDown,\n\tDUPLICATE: faCopy,\n\tMANAGE_ARCHIVE: faArchive,\n\tMANAGE_EXPIRATION: faCalendar,\n\tMENU: faShare,\n\tRENAME: faICursor,\n\tREMOVE_ASSET: faMinusCircle,\n\tREMOVE_SELECTED_ASSETS: faMinusCircle,\n\tREVIEW: faClipboardList,\n};\n\nexport type CartSavedBaseEvent = typeof CART_SAVED_BASE_EVENT;\n\nexport const CART_SAVED_BASE_EVENT = `cart:saved`;\n\nexport const CART_SAVED_EVENT = <const>{\n\tCREATE_PDF: `${CART_SAVED_BASE_EVENT}:createPDF`,\n\tCREATE_TMS_OBJECT_PACKAGE: `${CART_SAVED_BASE_EVENT}:create:tmsObjectPackage`,\n\tDELETE: `${CART_SAVED_BASE_EVENT}:delete:react`,\n\tDOWNLOAD: `${CART_SAVED_BASE_EVENT}:download`,\n\tDUPLICATE: `${CART_SAVED_BASE_EVENT}:duplicate`,\n\tMANAGE_ARCHIVE: `${CART_SAVED_BASE_EVENT}:manage:archive`,\n\tMANAGE_EXPIRATION: `${CART_SAVED_BASE_EVENT}:manage:expiration`,\n\tMENU: `${CART_SAVED_BASE_EVENT}:menu`,\n\tRENAME: `${CART_SAVED_BASE_EVENT}:rename`,\n\tREMOVE_ASSET: `${CART_SAVED_BASE_EVENT}:removeAssets`,\n\tREMOVE_SELECTED_ASSETS: `${CART_SAVED_BASE_EVENT}:removeSelectedAssets`,\n\tREVIEW: `${CART_SAVED_BASE_EVENT}:review`,\n};\n","import {useEffect, useState} from 'react';\n\nexport type OnlineStatusSubscriber = (isOnline: boolean) => void;\n\nconst subscribers = new Set<OnlineStatusSubscriber>();\n\nexport const on = (listener: OnlineStatusSubscriber) => {\n\tsubscribers.add(listener);\n};\n\nexport const off = (listener: OnlineStatusSubscriber) => {\n\tsubscribers.delete(listener);\n};\n\nconst publish = (isOnline: boolean) => {\n\tsubscribers.forEach((listener) => listener(isOnline));\n};\n\nwindow.addEventListener('online', () => publish(true));\nwindow.addEventListener('offline', () => publish(false));\n\nexport const useOnlineStatus = () => {\n\tconst [isOnline, setIsOnline] = useState(navigator.onLine);\n\n\tuseEffect(() => {\n\t\ton(setIsOnline);\n\t\treturn () => {\n\t\t\toff(setIsOnline);\n\t\t};\n\t}, []);\n\n\treturn isOnline;\n};\n\nexport default useOnlineStatus;\n","import {faDownload} from '@fortawesome/pro-solid-svg-icons';\n\nexport const PDF_VIEWER_ACTION_ICON = <const>{\n\tEXPORT_PAGES: faDownload,\n};\n\nexport type PDFViewerBaseEvent = typeof PDF_VIEWER_BASE_EVENT;\n\nexport const PDF_VIEWER_BASE_EVENT = `pdfViewer`;\n\nexport const PDF_VIEWER_EVENT = <const>{\n\tEXPORT_PAGES: `${PDF_VIEWER_BASE_EVENT}:download`,\n\tVIEW: `${PDF_VIEWER_BASE_EVENT}:view`,\n};\n","/**\n * Top level nodes of category tree\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/categoryTreeNodesView.html';\n\nimport ChildView from './categoryTreeNodeView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nexport default class CategoryTreeNodesView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = {\n\t\t\tviewClass: ChildView,\n\t\t\tlazyLoad: true,\n\t\t\toptions(model) {\n\t\t\t\treturn {\n\t\t\t\t\ttree: this.tree,\n\t\t\t\t\tfiltered: this.filtered,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t'data-contextmenu-target': 'categoryContextMenu',\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.events = {\n\t\t\t'click [data-top]': 'returnToTopLevel',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.id = opts.id || 'category-tree-nodes-view';\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.loadingClassRemoveDelay = opts.loadingClassRemoveDelay || 500;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/** @type {boolean} */\n\t\tthis.filtered = opts.filtered === true;\n\t\tthis.tree = opts.tree;\n\n\t\t// Determine if categories can be dragged for reorder.\n\t\tthis.categoriesCanReorder = !Netx.getPreference(\n\t\t\t'category.keepListAlphabetical',\n\t\t\ttrue,\n\t\t);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additional template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tcategoriesCanReorder: this.categoriesCanReorder,\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e click event\n\t * @fires module:category#category:tree:reset\n\t */\n\treturnToTopLevel(e) {\n\t\tdispatcher.trigger('category:tree:reset', this.collection);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CategoryTreeNodesView';\n\t}\n}\n\n// Functionality\nChildViews(CategoryTreeNodesView);\n","/**\n * @class\n */\nimport Base from '@netx/core-category/views/categoryTreeNodesView';\n\nimport ChildView from './categoryTreeNodeView';\n\nimport {faAngleLeft} from '@fortawesome/pro-light-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaAngleLeft,\n});\n\nimport customConfig from '@netx/core-category/config';\n\nexport default class CategoryTreeNodesView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t\ttarget: '.nx-childviews:first',\n\t\t\t\tbreakItUp: false,\n\t\t\t\tlazyLoad: false,\n\t\t\t\toptions: {\n\t\t\t\t\tattributes: {},\n\t\t\t\t},\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'click [data-nx-control=\"uplevel\"]': 'upLevel',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.icons = {...icons, ...opts.icons};\n\t\topts.className = opts.className || 'item nx-tree';\n\t\topts.id = 'category-tree';\n\t\tsuper(opts);\n\n\t\t// Debounced/throttled methods\n\t\tthis.categoryChanged = _.throttle(this.categoryChanged, 200);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(Netx.category.current, 'sync', (catModel, catId) => {\n\t\t\tthis.categoryChanged();\n\t\t});\n\n\t\t// mobile nav is instanciated in template\n\t\t// if mobile tree is called upon before a category is routed, load tree\n\t\tif (Modernizr.touch || window.innerWidth < 500) {\n\t\t\tif (Netx.category.current.id == undefined) {\n\t\t\t\tNetx.category.current.set('categoryid', customConfig.categoryid);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @method */\n\tcategoryChanged() {\n\t\tvar id, m, pm, activeEle, activeCats;\n\t\tid = Netx.category.current.id;\n\t\tif (id == customConfig.categoryid) {\n\t\t\tm = Netx.category.current;\n\t\t} else {\n\t\t\tm = this.collection.get(id);\n\t\t}\n\t\tif (!_.isUndefined(m)) {\n\t\t\tthis.$title && this.$title.html(m.get('name'));\n\t\t}\n\t\tthis.checkActive();\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tthis.$title = this.$('[data-nx-control=\"title\"]');\n\t\tsuper.postRender();\n\t\tthis.$el.attr('data-nx-control', 'tree');\n\t\tthis.checkActive();\n\t}\n\n\t/** @method */\n\tcheckActive() {\n\t\tconst NS = Netx.category;\n\t\tconst curCat = NS.current;\n\t\tconst hasKids = curCat.get('children').length > 0;\n\t\tconst parentId = curCat.get('parentid');\n\t\tlet parentCat;\n\n\t\tconst isTopLevel = curCat.id === customConfig.categoryid;\n\t\tconst isOneDeepChildless =\n\t\t\t!hasKids && curCat.get('parentid') === customConfig.categoryid;\n\n\t\t// flat tree, keep top level open\n\t\t// if top level or one deep with no children\n\t\tthis.$('.tree-nodes').toggleClass(\n\t\t\tcustomConfig.ACTIVE_CLASS,\n\t\t\tisTopLevel || isOneDeepChildless,\n\t\t);\n\n\t\t// mobile tree needs to be flex center so monkey thumbs can reach\n\t\t// but an overflowing category tree needs not to be\n\t\t// if noKids, calculate navHeight from the parents children (siblings)\n\t\tif (this.$el.attr('id') === 'mobile-category-tree') {\n\t\t\tif (!hasKids) {\n\t\t\t\tparentCat = NS.tree.get(curCat.get('parentid'));\n\t\t\t}\n\t\t\tconst childrenToSizeUp =\n\t\t\t\tparentCat && !hasKids\n\t\t\t\t\t? parentCat.get('children')\n\t\t\t\t\t: curCat.get('children');\n\n\t\t\tconst navHeight = 45 * childrenToSizeUp.length;\n\t\t\t$('body').toggleClass(\n\t\t\t\t'tree-fits',\n\t\t\t\tnavHeight > 0 && navHeight < window.innerHeight - 74,\n\t\t\t);\n\t\t}\n\t}\n\n\t/** @method */\n\tupLevel() {\n\t\t//this.$('.categories').find('.active').removeClass('active');\n\t\t$('body').addClass('keep-nav-open');\n\t\tdispatcher.trigger('category:gotoParent');\n\t}\n}\n","export * from './DragResize';\nexport {default} from './DragResize';\nexport * from './DragResizeHandle';\nexport * from './dragResizeClasses';\nexport * from './dragResizeHandleClasses';\nexport * from './constants';\nexport * from './types';\nexport * from './useDragResize';\n","import _ from 'underscore';\nimport {ColumnSchema, GridEditor} from './types';\nimport {getColumnsFromGrid} from './utils';\n\nconst COLUMN_WIDTHS = [75, 100, 250] as const;\n\n/** Enforce minimum width */\nconst getWidth = (gridEditor: GridEditor) => (x: number) => {\n\tconst column = gridEditor.behavior.getActiveColumn(x);\n\tconst gridProperties = gridEditor.properties;\n\tconst minWidth = gridProperties.minimumColumnWidth;\n\n\treturn !column\n\t\t? gridProperties.defaultColumnWidth\n\t\t: Math.max(minWidth, column.getWidth());\n};\n\n/** Enforce minimum width */\nconst setWidth = (gridEditor: GridEditor): GridEditor['setColumnWidth'] => (\n\tcolumnIndex,\n\tcolumnWidth,\n) => {\n\tgridEditor.behavior.setColumnWidth(\n\t\tcolumnIndex,\n\t\tMath.max(columnWidth, gridEditor.properties.minimumColumnWidth),\n\t);\n};\n\n/** Set column initial widths */\nconst setWidths = (gridEditor: GridEditor) => (columnWidths: number[] = []) => {\n\tconst gridProperties = gridEditor.properties;\n\tconst minWidth = gridProperties.minimumColumnWidth;\n\n\t// Index column\n\tgridEditor.setColumnWidth(-2, minWidth);\n\n\tgetColumnsFromGrid(gridEditor).forEach((column, idx) => {\n\t\tconst {properties} = column;\n\n\t\t// Defined column widths\n\t\tif (columnWidths[idx]) {\n\t\t\tgridEditor.setColumnWidth(idx, columnWidths[idx]);\n\t\t\treturn;\n\t\t} else if (COLUMN_WIDTHS[idx]) {\n\t\t\tgridEditor.setColumnWidth(idx, COLUMN_WIDTHS[idx]);\n\t\t\treturn;\n\t\t}\n\n\t\t// Try and set based on column type\n\t\tswitch (properties.type) {\n\t\t\tcase 'date':\n\t\t\t\tgridEditor.setColumnWidth(idx, 160);\n\t\t\t\tbreak;\n\t\t\tcase 'multiselect':\n\t\t\tcase 'select':\n\t\t\t\tgridEditor.setColumnWidth(idx, 200);\n\t\t\t\tbreak;\n\t\t\tcase 'semantic':\n\t\t\tcase 'tag':\n\t\t\t\tgridEditor.setColumnWidth(idx, 250);\n\t\t\t\tbreak;\n\t\t\tcase 'textarea':\n\t\t\t\tgridEditor.setColumnWidth(idx, 350);\n\t\t\t\tbreak;\n\t\t}\n\t});\n};\n\n/** Update column properties from schema */\nconst updateSchema = (gridEditor: GridEditor) => (schema: ColumnSchema) => {\n\tconst {minimumColumnWidth} = gridEditor.properties;\n\tschema.forEach((colProps, idx) => {\n\t\tgridEditor.setColumnProperties(\n\t\t\tidx,\n\t\t\t{..._.omit(colProps, 'name', 'header')},\n\t\t\t{minimumColumnWidth},\n\t\t);\n\t});\n\tsetWidths(gridEditor)();\n};\n\n/** Setup hypergrid columns */\nexport default function columns(plugin: GridEditor) {\n\tconst _getWidth = getWidth(plugin);\n\tconst _setWidth = setWidth(plugin);\n\tconst _setWidths = setWidths(plugin);\n\tconst _updateSchema = updateSchema(plugin);\n\n\tplugin.behavior.getColumnWidth = _getWidth;\n\tplugin.setColumnWidth = _setWidth;\n\n\treturn {\n\t\tgetWidth: _getWidth,\n\t\tsetWidth: _setWidth,\n\t\tsetWidths: _setWidths,\n\t\tupdateSchema: _updateSchema,\n\t};\n}\n","export * from './actions';\nexport * from './constants';\nexport * from './locales';\nexport * from './types';\n","var setPrototypeOf = require(\"./setPrototypeOf.js\");\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\nmodule.exports = _inherits, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import {i18n} from '@netx/core/i18n';\nimport {CategoryType} from './constants';\n\nexport const CategoryIdRuleLabel = i18n.t('i18n.category');\n\nexport const CategoryIdTypeLabel: Record<CategoryType, string> = {\n\t[CategoryType.EXCLUDE]: i18n.t('i18n.exclude'),\n\t[CategoryType.EXCLUDE_RECURSIVE]: i18n.t('i18n.excludeRecursive'),\n\t[CategoryType.ONLY]: i18n.t('i18n.only'),\n\t[CategoryType.ONLY_RECURSIVE]: i18n.t('i18n.onlyRecursive'),\n};\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createCategoryIdRule} from '../categoryIdRule';\nimport type {CategoryIdRule, TSearchTypeCategoryId} from '../types';\n\nexport type RawCategoryIdSearchCriteria =\n\tSearchCriteriaRaw<TSearchTypeCategoryId>;\n\nexport const rawCategoryIdCriteriaToRuleObject = (\n\tcriteria: RawCategoryIdSearchCriteria,\n): CategoryIdRule => {\n\treturn createCategoryIdRule({\n\t\tid: parseInt(criteria.value1) || 1,\n\t\ttype: criteria.subtype1,\n\t});\n};\n\nexport default rawCategoryIdCriteriaToRuleObject;\n","import {\n\taction,\n\tautorun,\n\tobservable,\n\tmakeObservable,\n\tcomputed,\n\trunInAction,\n} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {RuleModel} from '../baseModel';\nimport {CategoryType, SearchTypeCategoryId} from './constants';\nimport {categoryIdRuleDefaults} from './defaults';\nimport type {CategoryIdRule, TSearchTypeCategoryId} from './types';\nimport {validateCatrgoryIdRule} from './validate';\nimport {getCategoryData} from '@netx/core-category/api/getCategoryData';\n\nexport class CategoryIdRuleModel\n\textends RuleModel<TSearchTypeCategoryId>\n\timplements CategoryIdRule\n{\n\treadonly elementType = SearchTypeCategoryId;\n\telementSubType1: CategoryType;\n\telementSubType2: 0;\n\telementValue1: number;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(CategoryType);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateCatrgoryIdRule(this);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<CategoryIdRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\tmakeObservable(this, {\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementValue1: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementValue1: action,\n\t\t});\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...categoryIdRuleDefaults, ...params});\n\t\t});\n\n\t\tthis.reactionDisposers.push(\n\t\t\tautorun(() => {\n\t\t\t\tthis.setElementValue1Unavailable(false);\n\t\t\t\tthis.setElementValue1Loading(true);\n\t\t\t\t// TODO: make this a service that is passed in\n\t\t\t\tgetCategoryData({id: this.elementValue1})\n\t\t\t\t\t.then((category) => this.setElementValue1Label(category.name))\n\t\t\t\t\t.catch(() => this.setElementValue1Unavailable(true))\n\t\t\t\t\t.finally(() => this.setElementValue1Loading(false));\n\t\t\t}),\n\t\t);\n\t}\n\n\tsetElementSubType1(elementSubType1: CategoryType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set category id\n\t * @param elementValue1 category id\n\t */\n\tsetElementValue1(elementValue1: number) {\n\t\tthis.elementValue1 = elementValue1;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default CategoryIdRuleModel;\n","import type {RuleValidationErrors} from '../types';\nimport type {CategoryIdRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nexport const validateCatrgoryIdRule = <\n\tT extends CategoryIdRule = CategoryIdRule,\n>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tif (typeof rule.elementValue1 !== 'number' || rule.elementValue1 < 1) {\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\t}\n\treturn false;\n};\n\nexport default validateCatrgoryIdRule;\n","import {i18n} from '@netx/core/i18n';\nimport {KeywordType} from './constants';\n\nexport const KeywordTypeLabel: Record<KeywordType, string> = {\n\t[KeywordType.MATCH_ALL_FRAGMENTS]: i18n.t('i18n.matchAllFragments'),\n\t[KeywordType.MATCH_ANY_FRAGMENT]: i18n.t('i18n.matchAnyFragment'),\n\t[KeywordType.MATCH_EXACTLY]: i18n.t('i18n.matchExactly'),\n\t[KeywordType.MATCH_EXACTLY_INCLUDING_DIACRITICAL_MARKS]: i18n.t(\n\t\t'i18n.matchExactlyIncludingDiacriticalMarks',\n\t),\n\t[KeywordType.MATCH_EXCLUDE]: i18n.t('i18n.matchExclude'),\n\t[KeywordType.MATCH_ALL_WHOLE_WORDS_AND]: i18n.t('i18n.matchAllWholeWordsAND'),\n\t[KeywordType.MATCH_ANY_WHOLE_WORDS_OR]: i18n.t('i18n.matchAnyWholeWordsOR'),\n};\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createKeywordRule} from '../keywordRule';\nimport type {KeywordRule, TSearchTypeKeyword} from '../types';\n\nexport type RawKeywordSearchCriteria = SearchCriteriaRaw<TSearchTypeKeyword>;\n\nexport const rawKeywordCriteriaToRuleObject = (\n\tcriteria: RawKeywordSearchCriteria,\n): KeywordRule => {\n\treturn createKeywordRule({\n\t\tincludeContents: criteria.value2 === 'true',\n\t\tkeyword: criteria.value1,\n\t\ttype: criteria.subtype1,\n\t});\n};\n\nexport default rawKeywordCriteriaToRuleObject;\n","import {action, computed, observable, makeObservable, runInAction} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {RuleModel} from '../baseModel';\nimport {KeywordType, SearchTypeKeyword, TSearchTypeKeyword} from './constants';\nimport {keywordRuleDefaults} from './defaults';\nimport type {KeywordRule} from './types';\nimport {validateKeywordRule} from './validate';\n\nexport class KeywordRuleModel\n\textends RuleModel<TSearchTypeKeyword>\n\timplements KeywordRule\n{\n\treadonly elementType = SearchTypeKeyword;\n\telementSubType1: KeywordType;\n\telementSubType2: 0;\n\telementValue1: string;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(KeywordType);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateKeywordRule(this);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<KeywordRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...keywordRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementValue1: observable,\n\t\t\telementValue2: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementValue1: action,\n\t\t\tsetElementValue2: action,\n\t\t});\n\t}\n\n\tsetElementSubType1(elementSubType1: KeywordType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set keywords\n\t * @param elementValue1 keywords\n\t */\n\tsetElementValue1(elementValue1: string) {\n\t\tthis.elementValue1 = elementValue1;\n\t\tthis.dirty = true;\n\t}\n\n\t/**\n\t * Set if we should include contents\n\t * @param elementValue2 inlcude contents\n\t */\n\tsetElementValue2(elementValue2: '' | 'true') {\n\t\tthis.elementValue2 = elementValue2 as this['elementValue2'];\n\t}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default KeywordRuleModel;\n","import type {RuleValidationErrors} from '../types';\nimport type {KeywordRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nexport const validateKeywordRule = <T extends KeywordRule = KeywordRule>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tif (rule.elementValue1 === '') {\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\t}\n\treturn false;\n};\n\nexport default validateKeywordRule;\n","import {i18n} from '@netx/core/i18n';\nimport {MetadataType} from './constants';\n\nexport const MetadataTypeLabel: Record<MetadataType, string> = {\n\t[MetadataType.EXCLUDE]: i18n.t('i18n.matchExclude'),\n\t[MetadataType.MATCH_ALL_WHOLE_WORDS]: i18n.t('i18n.matchAllWholeWordsAND'),\n\t[MetadataType.MATCH_ALL_WILD_CARDS]: i18n.t('i18n.matchAllFragments'),\n\t[MetadataType.MATCH_ANY_RANGE]: i18n.t('i18n.matchAnyRange'),\n\t[MetadataType.MATCH_ANY_WHOLE_WORDS]: i18n.t('i18n.matchAnyWholeWordsOR'),\n\t[MetadataType.MATCH_ANY_WILD_CARDS]: i18n.t('i18n.matchAnyFragment'),\n\t[MetadataType.MATCH_EXACTLY]: i18n.t('i18n.matchExactly'),\n\t[MetadataType.MATCH_VALUE_IS_EMPTY]: i18n.t('i18n.matchValueIsEmpty'),\n\t[MetadataType.MATCH_VALUE_IS_NOT_EMPTY]: i18n.t('i18n.matchValueIsNotEmpty'),\n};\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createMetadataRule} from '../metadataRule';\nimport type {MetadataRule, TSearchTypeMetadata} from '../types';\n\nexport type RawMetadataSearchCriteria = SearchCriteriaRaw<TSearchTypeMetadata>;\n\nexport const rawMetadataCriteriaToRuleObject = (\n\tcriteria: RawMetadataSearchCriteria,\n): MetadataRule<any> => {\n\treturn createMetadataRule({\n\t\ttype: criteria.subtype1,\n\t\tname: criteria.value2,\n\t\tvalue: criteria.value1,\n\t\trangeStart: criteria.value1,\n\t\trangeEnd: criteria.value3,\n\t} as any);\n};\n\nexport default rawMetadataCriteriaToRuleObject;\n","import {\n\taction,\n\tautorun,\n\tcomputed,\n\tobservable,\n\tmakeObservable,\n\treaction,\n\trunInAction,\n} from 'mobx';\nimport {attributesStore} from '@netx/core-attribute/store/attributesStore';\nimport {RuleModel} from '../baseModel';\nimport {\n\tMetadataType,\n\tMetadataNoValueTypes,\n\tSearchTypeMetadata,\n\tTSearchTypeMetadata,\n} from './constants';\nimport {metadataRuleDefaults} from './defaults';\nimport type {MetadataRule} from './types';\nimport {\n\tgetMetadataTypeOptions,\n\tmetadataNameHackIn,\n\tmetadataNameHackOut,\n} from './utils';\nimport {validateMetadataRule} from './validate';\n\nexport class MetadataRuleModel\n\textends RuleModel<TSearchTypeMetadata>\n\timplements Omit<MetadataRule, 'elementValue1' | 'elementValue3'>\n{\n\treadonly elementType = SearchTypeMetadata;\n\telementSubType1: MetadataType;\n\telementSubType2: 0;\n\telementValue1: string | string[];\n\telementValue2: string;\n\telementValue3: string | '';\n\n\tget elementSubType1Options() {\n\t\treturn getMetadataTypeOptions(this.elementValue2);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateMetadataRule(this as MetadataRule);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\treturn !validation;\n\t}\n\n\tconstructor(params?: Partial<Omit<MetadataRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\tmakeObservable(this, {\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementValue1: observable,\n\t\t\telementValue2: observable,\n\t\t\telementValue3: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementValue1: action,\n\t\t\tsetElementValue2: action,\n\t\t\tsetElementValue3: action,\n\t\t});\n\n\t\trunInAction(() => {\n\t\t\tif (params?.elementValue2) {\n\t\t\t\tparams.elementValue2 = metadataNameHackIn(params.elementValue2);\n\t\t\t}\n\t\t\tObject.assign(this, {...metadataRuleDefaults, ...params});\n\t\t});\n\n\t\tthis.reactionDisposers.push(\n\t\t\treaction(\n\t\t\t\t() => this.elementSubType1Options,\n\t\t\t\t(elementSubType1Options) => {\n\t\t\t\t\t// select the first available option if selected is no longer available\n\t\t\t\t\tif (!elementSubType1Options.includes(this.elementSubType1)) {\n\t\t\t\t\t\tthis.setElementSubType1(elementSubType1Options[0]);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\treaction(\n\t\t\t\t() => this.elementSubType1,\n\t\t\t\t(elementSubType1) => {\n\t\t\t\t\tif (![MetadataType.MATCH_ANY_RANGE].includes(elementSubType1)) {\n\t\t\t\t\t\t// no range end value required\n\t\t\t\t\t\tthis.elementValue3 = '';\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tMetadataType.MATCH_VALUE_IS_EMPTY,\n\t\t\t\t\t\t\tMetadataType.MATCH_VALUE_IS_NOT_EMPTY,\n\t\t\t\t\t\t].includes(elementSubType1 as any)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// no value is required\n\t\t\t\t\t\tthis.elementValue1 = '';\n\t\t\t\t\t\tthis.dirty = false;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\treaction(\n\t\t\t\t() => this.elementValue2,\n\t\t\t\t(elementValue2) => {\n\t\t\t\t\tthis.dirty = false;\n\t\t\t\t\t// reset values when selected attribute changes\n\t\t\t\t\tthis.elementValue1 = '';\n\t\t\t\t\tthis.elementValue3 = '';\n\t\t\t\t},\n\t\t\t),\n\t\t\tautorun(() => {\n\t\t\t\tif (this.elementValue2 === '') {\n\t\t\t\t\tthis.setElementValue2Unavailable(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst attr = attributesStore.getAttributeByName(this.elementValue2);\n\t\t\t\tthis.setElementValue2Unavailable(attr == null);\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Match criteria\n\t * @param elementSubType1 MetadataType\n\t */\n\tsetElementSubType1(elementSubType1: MetadataType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Value or range start value\n\t * @param elementValue1 value | range start\n\t */\n\tsetElementValue1(elementValue1: string | string[]) {\n\t\tthis.elementValue1 = elementValue1;\n\t\tthis.dirty = true;\n\t}\n\n\t/**\n\t * Update selected attribute\n\t * @param elementValue2 attribute name\n\t */\n\tsetElementValue2(elementValue2: string) {\n\t\t// TODO: should we enforce? See the validation as well\n\t\t// const attribute = attributesStore.getAttributeByName(elementValue2);\n\t\t// if (!attribute) return;\n\n\t\tthis.elementValue2 = elementValue2;\n\t}\n\n\t/**\n\t * Range end value\\\n\t * This is a little tricky to enforce on - if the attribute type selected is a number type\n\t * then we can support range values\n\t * @param elementValue3 Range end (if applicable)\n\t */\n\tsetElementValue3(elementValue3: string | '') {\n\t\tthis.elementValue3 = elementValue3;\n\t\tthis.dirty = true;\n\t}\n\n\t/** @override */\n\ttoRuleObject(): MetadataRule<any> | MetadataRule<any>[] {\n\t\tconst ruleObjectBase = {\n\t\t\telementType: this.elementType,\n\t\t\telementSubType1: this.elementSubType1,\n\t\t\telementSubType2: this.elementSubType2,\n\t\t\telementValue2: metadataNameHackOut(this.elementValue2),\n\t\t\telementValue3: this.elementValue3,\n\t\t};\n\n\t\tif (MetadataNoValueTypes.includes(ruleObjectBase.elementSubType1 as any)) {\n\t\t\treturn {\n\t\t\t\t...ruleObjectBase,\n\t\t\t\telementValue1: '',\n\t\t\t\telementValue3: '',\n\t\t\t};\n\t\t}\n\n\t\t// multiple values\n\t\tif (Array.isArray(this.elementValue1)) {\n\t\t\treturn this.elementValue1.map((elementValue1) => ({\n\t\t\t\t...ruleObjectBase,\n\t\t\t\telementValue1,\n\t\t\t}));\n\t\t}\n\n\t\t// just a regular single value rule\n\t\treturn {\n\t\t\t...ruleObjectBase,\n\t\t\telementValue1: this.elementValue1,\n\t\t};\n\t}\n}\n\nexport default MetadataRuleModel;\n","import type {RuleValidationErrors} from '../types';\nimport {attributesStore} from '@netx/core-attribute/store';\nimport {validators} from '@netx/core-attribute/validators';\nimport {MetadataType, MetadataNoValueTypes} from './constants';\nimport type {MetadataRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nconst stringIsDate = (str: string) =>\n\tstr.match(/\\d{4}-\\d{1,2}-\\d{1,2}/) != null;\n\nexport const validateMetadataRule = <\n\tT extends MetadataRule<any> = MetadataRule<any>,\n>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tconst hasElementValue1 = Array.isArray(rule.elementValue1)\n\t\t? !!rule.elementValue1.length\n\t\t: rule.elementValue1 !== '';\n\tconst hasElementValue2 = rule.elementValue2 !== '';\n\tconst hasElementValue3 = rule.elementValue3 !== '';\n\n\tconst attribute = attributesStore.getAttributeByName(rule.elementValue2);\n\tconst validator = attribute && validators[attribute.type];\n\n\tconst errors: RuleValidationErrors = {};\n\n\tconst validate = (\n\t\titem: 'elementValue1' | 'elementValue2' | 'elementValue3',\n\t) => {\n\t\ttry {\n\t\t\t// we must assume that this is fine since we cannot validate any further\n\t\t\t// without the attribute\n\t\t\t// we will want to revist this - but since some things allow for searching\n\t\t\t// regardless of perms (like category id)...\n\t\t\tvalidator &&\n\t\t\t\tvalidator(rule[item], {\n\t\t\t\t\tspec1: attribute.spec1,\n\t\t\t\t\tspec2: attribute.spec2,\n\t\t\t\t});\n\t\t} catch (ex) {\n\t\t\terrors[item] = createValidationObject();\n\t\t}\n\t};\n\n\t// must have an attribute name to do anything\n\tif (!hasElementValue2)\n\t\treturn {\n\t\t\telementValue2: createValidationObject(),\n\t\t};\n\n\t// should not have values\n\tif (MetadataNoValueTypes.includes(rule.elementSubType1 as any)) {\n\t\tif (hasElementValue1) errors.elementValue1 = createValidationObject();\n\t\tif (hasElementValue3) errors.elementValue3 = createValidationObject();\n\t}\n\t// should have value(s)\n\telse {\n\t\t// must have two values\n\t\tif (rule.elementSubType1 === MetadataType.MATCH_ANY_RANGE) {\n\t\t\t!hasElementValue1\n\t\t\t\t? (errors.elementValue1 = createValidationObject())\n\t\t\t\t: validate('elementValue1');\n\n\t\t\tconst compareStartValue = stringIsDate(rule.elementValue1)\n\t\t\t\t? new Date(rule.elementValue1).getTime()\n\t\t\t\t: Number(rule.elementValue1);\n\t\t\tconst compareEndValue = stringIsDate(rule.elementValue3)\n\t\t\t\t? new Date(rule.elementValue3).getTime()\n\t\t\t\t: Number(rule.elementValue3);\n\n\t\t\t!hasElementValue3 || compareStartValue >= compareEndValue\n\t\t\t\t? (errors.elementValue3 = createValidationObject())\n\t\t\t\t: validate('elementValue3');\n\t\t}\n\t\t// must have a single value\n\t\telse if (!hasElementValue1) errors.elementValue1 = createValidationObject();\n\t\t// validate it\n\t\telse validate('elementValue1');\n\t}\n\n\treturn Object.keys(errors).length ? errors : false;\n};\n\nexport default validateMetadataRule;\n","import {SALO_STRING_MAP} from '../constants';\nimport type {SearchCriteria, SmallSALO} from '../types';\n\n/**\n * Helper for converting search criteria to a condensed object\n * @param criteria\n * @returns SmallSALO\n */\nexport const searchCriteriaToSmallSALO = (criteria: SearchCriteria) => {\n\treturn Object.entries(SALO_STRING_MAP).reduce<SmallSALO>(\n\t\t(accum, [small, key]) => {\n\t\t\treturn {\n\t\t\t\t...accum,\n\t\t\t\t[small]: criteria[key],\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\ta: 'file',\n\t\t\tb: 0,\n\t\t\tc: 0,\n\t\t\td: [],\n\t\t\te: [],\n\t\t\tf: [],\n\t\t\tg: [],\n\t\t\th: [],\n\t\t\ti: [],\n\t\t},\n\t);\n};\n\nexport default searchCriteriaToSmallSALO;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createCartRule} from '../cartRule';\nimport type {CartRule, TSearchTypeCart} from '../types';\n\nexport type RawCartSearchCriteria = SearchCriteriaRaw<TSearchTypeCart>;\n\nexport const rawCartCriteriaToRuleObject = (\n\tcriteria: RawCartSearchCriteria,\n): CartRule => {\n\treturn createCartRule(parseInt(criteria.value1) || 0);\n};\n\nexport default rawCartCriteriaToRuleObject;\n","import Netx from '@netx/core/bootstrap';\nimport {isMobile} from '@netx/core/utils/isMobile';\nimport {assetProjectEnabled} from '@netx/core-asset-project';\nimport type {SavedCart} from '@netx/core-cart/types';\nimport {assetExpirationEnabled} from '@netx/core-asset-expiration';\nimport {\n\tcurrentUserMeetsUserLevel,\n\tUserLevel,\n} from '@netx/core-user/utils/currentUserMeetsUserLevel';\nimport {getPreference} from '@netx/core-user/utils/getPreference';\n\nexport const savedCartIsEmpty = (savedCart?: SavedCart) =>\n\t!savedCart?.contentCount;\n\nexport const savedCartIsNotEmpty = (savedCart?: SavedCart) =>\n\t!savedCartIsEmpty(savedCart);\n\nexport const canCreatePdfFromSavedCart = (savedCart?: SavedCart) =>\n\tsavedCartIsNotEmpty(savedCart) &&\n\tcurrentUserMeetsUserLevel(UserLevel.CONSUMER);\n\nexport const canCreateTMSObjectPackageFromSavedCart = (savedCart?: SavedCart) =>\n\tsavedCartIsNotEmpty(savedCart) &&\n\tgetPreference('tms.webserviceEndpoint') != null &&\n\tgetPreference('tms.actionMessage') != null;\n\nexport const canDownloadSavedCart = (savedCart?: SavedCart) =>\n\tsavedCartIsNotEmpty(savedCart) &&\n\tcurrentUserMeetsUserLevel(UserLevel.CONSUMER);\n\nexport const canManageSavedCartArchive = (savedCart?: SavedCart) =>\n\tgetPreference('glacier.archiveEnabled', true) &&\n\tsavedCartIsNotEmpty(savedCart) &&\n\tcurrentUserMeetsUserLevel(UserLevel.DIRECTOR);\n\nexport const canManageSavedCartExpiration = (savedCart?: SavedCart) =>\n\tassetExpirationEnabled() &&\n\tsavedCartIsNotEmpty(savedCart) &&\n\tcurrentUserMeetsUserLevel(UserLevel.MANAGER);\n\nexport const canReviewSavedCart = (savedCart?: SavedCart) =>\n\t!!savedCart?.contentCount && !isMobile() && assetProjectEnabled();\n\n// TODO: this is incomplete at the moment... more, it is a holdover for react until we get the share menu\n// reworked one day\nexport const canShareSavedCart = (savedCart?: SavedCart) => {\n\tif (!savedCart?.contentCount) return false;\n\t// TODO: `share:assetSet:users` enabler test is wrong and assumes we have all assets available in a saved cart\n\t// it should be safe (atm) to assume that if this action is not available, then none of the other actions would be\n\treturn (\n\t\t// share:feed:new -> [Netx.getPublicProperty('mediaServices.enabled', true)]\n\t\t(currentUserMeetsUserLevel(UserLevel.DIRECTOR) &&\n\t\t\tNetx.getPublicProperty('mediaServices.enabled', true)) ||\n\t\t// share:assetSet:token -> matrix: 'download',\n\t\t// share:assetSet:media:service -> [mediaServicesEnabled, downloadOptionSelected], matrix: 'download',\n\t\t// share:token:embed -> [canEmbed], matrix: 'download',\n\t\tcurrentUserMeetsUserLevel(UserLevel.CONSUMER)\n\t);\n};\n\nexport const canDeleteSavedCart = (savedCart?: SavedCart) =>\n\tsavedCart?.canManage === true;\n\nexport const canDuplicateSavedCart = (savedCart?: SavedCart) => !!savedCart;\n\nexport const canRenameSavedCart = (savedCart?: SavedCart) =>\n\tsavedCart?.canManage === true;\n\nexport const canRemoveAssetFromSavedCart = (savedCart?: SavedCart) =>\n\tsavedCart?.canEdit === true;\n","import {i18n} from '@netx/core/i18n';\n\nexport const CART_SAVED_ACTION_LABELS = {\n\tCREATE_PDF: i18n.t('i18n.createPDF'),\n\tCREATE_TMS_OBJECT_PACKAGE: i18n.t('i18n.createObjectPackageInTMS'),\n\tDELETE: i18n.t('i18n.deleteThisCart'),\n\tDOWNLOAD: i18n.t('i18n.download'),\n\tDUPLICATE: i18n.t('i18n.duplicateCart'),\n\tMANAGE_ARCHIVE: i18n.t('i18n.manageArchive'),\n\tMANAGE_EXPIRATION: i18n.t('i18n.manageAssetExpiration'),\n\tMENU: i18n.t('i18n.share'),\n\tRENAME: i18n.t('i18n.renameCart'),\n\tREMOVE_ASSET: i18n.t('i18n.removeFromSavedCart'),\n\tREMOVE_SELECTED_ASSETS: i18n.t('i18n.removeFromSavedCart'),\n\tREVIEW: i18n.t('i18n.review'),\n};\n","import {action, computed, observable, makeObservable, runInAction} from 'mobx';\nimport {RuleModel} from '../baseModel';\nimport {SearchTypeCart, TSearchTypeCart} from './constants';\nimport {cartRuleDefaults} from './defaults';\nimport type {CartRule} from './types';\n\nexport class CartRuleModel\n\textends RuleModel<TSearchTypeCart>\n\timplements CartRule\n{\n\treadonly elementType = SearchTypeCart;\n\telementSubType1: 0;\n\telementSubType2: 0;\n\telementValue1: number;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget isValid() {\n\t\treturn true;\n\t}\n\n\tconstructor(params?: Partial<Omit<CartRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...cartRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\tisValid: computed,\n\t\t\telementValue1: observable,\n\t\t\tsetElementValue1: action,\n\t\t});\n\t}\n\n\t/** stubbed */\n\tsetElementSubType1() {}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set cart id\n\t * @param elementValue1 cart id\n\t */\n\tsetElementValue1(elementValue1: number) {\n\t\tthis.elementValue1 = elementValue1;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default CartRuleModel;\n","import BASE_RULE from '../baseRule';\nimport {SearchTypeExpiration} from './constants';\nimport {ExpirationRule} from './types';\n\nexport const expirationRuleDefaults: ExpirationRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeExpiration,\n\telementSubType1: 0,\n};\n\nexport default expirationRuleDefaults;\n","import * as React from 'react';\n\n/**\n * @ignore - internal component.\n */\nconst RadioGroupContext = /*#__PURE__*/React.createContext(undefined);\n\nif (process.env.NODE_ENV !== 'production') {\n RadioGroupContext.displayName = 'RadioGroupContext';\n}\n\nexport default RadioGroupContext;","/**\n * Various properties of the PublicLinkBean\n */\nexport let linkTypes = {\n\tasset: {\n\t\tlabel: 'Asset',\n\t\tname: 'asset',\n\t\tvalue: 1,\n\t},\n\tcategory: {\n\t\tlabel: 'Category',\n\t\tname: 'category',\n\t\tvalue: 2,\n\t},\n\tsearch: {\n\t\tlabel: 'Search',\n\t\tname: 'search',\n\t\tvalue: 3,\n\t},\n\tcart: {\n\t\tlabel: 'Cart',\n\t\tname: 'cart',\n\t\tvalue: 4,\n\t},\n};\n\nexport let expirationTypes = {\n\tcount: {\n\t\tlabel: 'Access Count',\n\t\tname: 'count',\n\t\tvalue: 0,\n\t},\n\tdate: {\n\t\tlabel: 'Expiration Date',\n\t\tname: 'date',\n\t\tvalue: 1,\n\t},\n\tpermanent: {\n\t\tlabel: 'Permanent',\n\t\tname: 'permanent',\n\t\tvalue: 2,\n\t},\n};\n\nexport let securityTypes = {\n\tnone: {\n\t\tlabel: 'None',\n\t\tname: 'none',\n\t\tvalue: 0,\n\t},\n\tpassword: {\n\t\tlabel: 'Password',\n\t\tname: 'password',\n\t\tvalue: 1,\n\t},\n\treferrer: {\n\t\tlabel: 'Referrer',\n\t\tname: 'referrer',\n\t\tvalue: 2,\n\t},\n};\n\n// This is just a hack until i18n gets here:\n// TODO: i18n is here (though this module is deprecated)\nexport let english = {\n\tasset: 'Asset',\n\tcategory: 'Folder',\n\tsearch: 'Saved Search',\n\tcart: 'Saved Cart',\n\tcount: 'Access Count',\n\tdate: 'Expiration Date',\n\tpermanent: 'Permanent',\n\tnone: 'None',\n\tpassword: 'Password',\n\treferrer: 'Referrer',\n};\n\nexport default {english, expirationTypes, linkTypes, securityTypes};\n","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar strings = {\n ARIA_CONTROLS: 'aria-controls',\n ICON_SELECTOR: '.mdc-text-field__icon',\n INPUT_SELECTOR: '.mdc-text-field__input',\n LABEL_SELECTOR: '.mdc-floating-label',\n LINE_RIPPLE_SELECTOR: '.mdc-line-ripple',\n OUTLINE_SELECTOR: '.mdc-notched-outline',\n};\nvar cssClasses = {\n DENSE: 'mdc-text-field--dense',\n DISABLED: 'mdc-text-field--disabled',\n FOCUSED: 'mdc-text-field--focused',\n FULLWIDTH: 'mdc-text-field--fullwidth',\n HELPER_LINE: 'mdc-text-field-helper-line',\n INVALID: 'mdc-text-field--invalid',\n NO_LABEL: 'mdc-text-field--no-label',\n OUTLINED: 'mdc-text-field--outlined',\n ROOT: 'mdc-text-field',\n TEXTAREA: 'mdc-text-field--textarea',\n WITH_LEADING_ICON: 'mdc-text-field--with-leading-icon',\n WITH_TRAILING_ICON: 'mdc-text-field--with-trailing-icon',\n};\nvar numbers = {\n DENSE_LABEL_SCALE: 0.923,\n LABEL_SCALE: 0.75,\n};\n/**\n * Whitelist based off of https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/HTML5/Constraint_validation\n * under the \"Validation-related attributes\" section.\n */\nvar VALIDATION_ATTR_WHITELIST = [\n 'pattern', 'min', 'max', 'required', 'step', 'minlength', 'maxlength',\n];\n/**\n * Label should always float for these types as they show some UI even if value is empty.\n */\nvar ALWAYS_FLOAT_TYPES = [\n 'color', 'date', 'datetime-local', 'month', 'range', 'time', 'week',\n];\nexport { cssClasses, strings, numbers, VALIDATION_ATTR_WHITELIST, ALWAYS_FLOAT_TYPES };\n//# sourceMappingURL=constants.js.map","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/searchFacetOptionView.html';\n\nexport default class SearchFacetOptionView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'click [data-nx-control=\"option\"]': 'toggle',\n\t\t\t\t'keydown [data-nx-control=\"option\"]': 'keydownToggle',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'change', _.debounce(this.render, 25));\n\t}\n\n\t/**\n\t * Runs immediately after render; useful for decorating/updating HTML that was not handled by the template.\n\t * @override\n\t */\n\tpostRender() {\n\t\tsuper.postRender();\n\t\t// Toggle active class\n\t\tthis.$el.toggleClass('active', this.model.get('selected'));\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `keydown` event\n\t * on enter/space\n\t * toggle the option\n\t *\n\t * todo: refactor with react\n\t */\n\tkeydownToggle(e) {\n\t\tconst keycode = e.keyCode || e.which;\n\t\t// space or enter\n\t\tif (keycode === 13 || keycode === 32) {\n\t\t\tthis.toggle(e);\n\t\t}\n\t}\n\t/**\n\t * Toggle facet option\n\t * @method\n\t * @param {event} e Event\n\t * @fires module:search#search:facet:option:toggle\n\t */\n\ttoggle(e) {\n\t\tdispatcher.trigger('search:facet:option:toggle', this.model);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchFacetOptionView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-search/views/searchFacetOptionView';\nimport Template from '@netx/core-search/templates/searchFacetOptionListView.html';\n\nimport {faTimes} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaTimes,\n});\n\nexport default class SearchFacetOptionView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.tagName = opts.tagName || 'li';\n\t\topts.template = opts.template || Template;\n\t\topts.icons = {...icons, ...opts.icons};\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t// 'click [data-toggle]': 'toggleClickHandler',\n\t\t\t\t'keydown .focus-item': 'onKeyDown',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\tsuper(opts);\n\n\t\t// Get the right attributes on\n\t\tthis.$el\n\t\t\t.attr('value', this.model.get('value'))\n\t\t\t.attr('data-value', this.model.get('value'));\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Handle our option being selected\n\t\tif (this.model.get('selected')) {\n\t\t\tthis.$el.attr({\n\t\t\t\tselected: 'selected',\n\t\t\t});\n\t\t\tthis.$('[data-nx-control=\"option\"]').attr({\n\t\t\t\ttabindex: 0,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.$el.removeAttr('selected');\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `keydown` event\n\t * It's not pretty, but it manages\n\t * arrow key focus on facets\n\t *\n\t * todo: refactor with react\n\t */\n\tonKeyDown(e) {\n\t\tconst code = e.which;\n\t\tconst $currentTarget = $(e.currentTarget);\n\t\tconst $parentLi = $currentTarget.parent('li');\n\t\tconst $facet = $currentTarget.parents('.facet');\n\n\t\tlet $menuitem;\n\t\t// find menuitem\n\t\tif (code === 40) {\n\t\t\tif ($parentLi) {\n\t\t\t\t// arrow down to next menuitem\n\t\t\t\t$menuitem = $parentLi.next(':visible').find('.focus-item:visible');\n\t\t\t}\n\t\t\tif ((!$menuitem || !$menuitem.length) && $facet && $facet.length) {\n\t\t\t\t// arrow down to next facet\n\t\t\t\t$menuitem = $facet.nextAll().find('.focus-item:visible').first();\n\t\t\t}\n\t\t\tif (!$menuitem || $menuitem.length === 0) {\n\t\t\t\t// go to first facet\n\t\t\t\t$menuitem = $facet.prevAll().find('.focus-item:visible').first();\n\t\t\t}\n\t\t} else if (code === 38) {\n\t\t\t// arrow to previous menuitem\n\t\t\tif ($parentLi) {\n\t\t\t\t$menuitem = $parentLi.prev(':visible').find('.focus-item:visible');\n\t\t\t}\n\t\t\tif ((!$menuitem || !$menuitem.length) && $facet && $facet.length) {\n\t\t\t\t// arrow up to parent facet\n\t\t\t\t$menuitem = $facet.find('.focus-item:visible').first();\n\t\t\t}\n\t\t}\n\n\t\tif ($menuitem && $menuitem.length) {\n\t\t\t// set all facet tabindex to -1\n\t\t\tconst allFacets = this.$el.parents('.facet-list.nx-childviews');\n\t\t\tallFacets.find('.focus-item:visible').attr('tabindex', -1);\n\n\t\t\t// focus on the prize\n\t\t\t$menuitem.attr('tabindex', 0);\n\t\t\t$menuitem.focus();\n\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t}\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/searchFacetOptionsView.html';\n\nimport ChildView from './searchFacetOptionView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nexport default class SearchFacetOptionsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = `search-facet-options ${opts.className || ''}`;\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\t\t// DAM-13099: When the options get sorted, re-render them.\n\t\t// Otherwise they may show out of order\n\t\treturn this.listenTo(this.collection, 'sort', this.render);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// TODO: this should already be getting these vars from the model?\n\t\tconst model = this.model;\n\t\t// Add to template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tid: model.get('id'),\n\t\t\ttitle: model.get('title'),\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchFacetOptionsView';\n\t}\n}\n\n// Functionality\nChildViews(SearchFacetOptionsView);\n","/**\n * @class\n */\nimport Base from '@netx/core-search/views/searchFacetOptionsView';\n\nexport default class SearchFacetOptionsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\ttarget: '.facet-options:first',\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'change select': 'changed',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\tsuper(opts);\n\n\t\t// Modify this selectpicker plugin (applies to the subview SearchFacetOptions)\n\t\tthis.Plugins.Extend({\n\t\t\tselectpicker: {\n\t\t\t\t// Only on instance in this view at a time\n\t\t\t\tmultiple: false,\n\t\t\t\toptions: {\n\t\t\t\t\tcontainer: false,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\n\t\treturn this.listenTo(\n\t\t\tthis.collection,\n\t\t\t'add remove change sync',\n\t\t\t_.debounce(() => {\n\t\t\t\tthis.Plugins.Update('selectpicker');\n\t\t\t}, 26),\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$select = this.$('select');\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Change event\n\t * @fires module:search#search:facet:option:toggle\n\t */\n\tchanged(e) {\n\t\t// if( this.$tooltips ) this.$tooltips.tooltip(\"destroy\");\n\t\tif (!this.$select) return;\n\n\t\tconst selected = this.$select.val() || [];\n\t\tthis.collection.each((m) => {\n\t\t\tconst sel = m.get('selected');\n\t\t\tconst val = m.get('value');\n\n\t\t\t// If option is selected and not in selection OR if option is not selected and is in selection - toggle it\n\t\t\tif (\n\t\t\t\t(sel && _.indexOf(selected, val) < 0) ||\n\t\t\t\t(!sel && _.indexOf(selected, val) > -1)\n\t\t\t) {\n\t\t\t\tdispatcher.trigger('search:facet:option:toggle', m);\n\t\t\t}\n\t\t});\n\t\t// DAM-5884\n\t\t// Hide on selection\n\t\tconst selectpicker = this.$select.data('selectpicker');\n\t\tif (selectpicker) {\n\t\t\tselectpicker.$button.trigger('click');\n\t\t}\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/searchFacetView.html';\n\nimport SearchFacetOptionsView from './searchFacetOptionsView';\n\nexport default class SearchFacetView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = `facet ${opts.className || ''}`;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// Debounced/throttled methods\n\t\tthis.checkSelection = _.throttle(this.checkSelection, 100, true);\n\n\t\t// Create searchFacetsOptionsView\n\t\tconst model = this.model;\n\t\tthis.searchFacetOptionsView = this.addSubView(\n\t\t\tnew SearchFacetOptionsView({\n\t\t\t\tcollection: model.get('options'),\n\t\t\t\tmodel: model,\n\t\t\t\tid: `search-facet-options-${model.id}`,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\n\t\treturn this.listenTo(\n\t\t\tthis.model.get('options'),\n\t\t\t'sync change add remove',\n\t\t\tthis.checkSelection,\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Render and append searchFacetOptionsView\n\t\tthis.$('[data-nx-search-facet-options]').append(\n\t\t\tthis.searchFacetOptionsView.render().$el,\n\t\t);\n\n\t\t// Update\n\t\tthis.checkSelection();\n\t}\n\n\t/**\n\t * @method\n\t */\n\tcheckSelection() {\n\t\tif (this.model.get('options').length) {\n\t\t\tthis.el.removeAttribute('data-nx-no-assets');\n\t\t\tthis.el.removeAttribute('data-nx-no-results');\n\t\t} else {\n\t\t\tthis.el.setAttribute('data-nx-no-assets', true);\n\t\t\tthis.el.setAttribute('data-nx-no-results', true);\n\t\t}\n\n\t\tif (this.model.get('options').getSelected().length) {\n\t\t\tthis.el.setAttribute('data-nx-has-selection', true);\n\t\t} else {\n\t\t\tthis.el.removeAttribute('data-nx-has-selection');\n\t\t}\n\t}\n\n\t/** @override */\n\tunbindModelEvents() {\n\t\tsuper.unbindModelEvents();\n\n\t\treturn this.stopListening(this.model.get('options'));\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchFacetView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/searchFacetOptionsListView.html';\nimport ChildView from './searchFacetOptionView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nimport {faTimes, faCaretLeft} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaTimes,\n\tfaCaretLeft,\n});\n\nexport default class SearchFactOptionsListView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t\ttarget: '.nx-childviews:first',\n\t\t\t\toptions: {\n\t\t\t\t\ttagName: 'li',\n\t\t\t\t},\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'click [data-toggle]': 'toggleClickHandler',\n\t\t\t\t'keydown .focus-item': 'onKeyDown',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.template = opts.template || Template;\n\t\topts.className = `nx-collapsable ${opts.className || ''}`;\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\n\t\tthis.localStorageKey = 'facet-collapse' + this.model.id;\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'search:facet:collapse:' + this.model.id,\n\t\t\tthis.toggleState,\n\t\t);\n\t}\n\tpreRender() {\n\t\tsuper.preRender();\n\t\t// Add to template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tid: this.model.get('id'),\n\t\t\ttitle: this.model.get('title'),\n\t\t});\n\t}\n\tpostRender() {\n\t\tsuper.postRender();\n\t\tthis.toggleState(Netx.store.get(this.localStorageKey) === true);\n\n\t\t// set tabindex to -1 for all but the first set to 0\n\t\tconst menuItem = this.$('> .focus-item');\n\t\tmenuItem.attr('tabindex', this.model.getIndex() === 0 ? 0 : -1);\n\t}\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\n\t\t// THEM-1755 - DAM-13099: When the options get sorted, re-render them.\n\t\t// Otherwise they may show out of order\n\t\treturn this.listenTo(this.collection, 'sort remove', this.render);\n\t}\n\n\ttoggleClickHandler(e) {\n\t\tlet collapseBool = false;\n\t\tif (Netx.store.get(this.localStorageKey) === true) {\n\t\t\tcollapseBool = false;\n\t\t\tNetx.store.remove(this.localStorageKey);\n\t\t} else {\n\t\t\tcollapseBool = true;\n\t\t\tNetx.store.set(this.localStorageKey, true);\n\t\t}\n\t\tdispatcher.trigger('search:facet:collapse:' + this.model.id, collapseBool);\n\t}\n\n\t/**\n\t * @method\n\t * @param {boolean} collapseBool - are we toggling the state collapsed or uncollapsed?\n\t */\n\ttoggleState(collapseBool) {\n\t\tconst $elem = this.$('.nx-childviews');\n\t\tlet height = 'auto';\n\n\t\tif (collapseBool) {\n\t\t\tthis.$el.addClass('facet-collapse');\n\t\t\theight = '0px';\n\t\t} else {\n\t\t\tthis.$el.removeClass('facet-collapse');\n\t\t\theight = 'auto';\n\t\t}\n\n\t\tthis.$('button[data-toggle]').attr('aria-expanded', !collapseBool);\n\n\t\t_.defer(() => {\n\t\t\t$elem.css('height', height);\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `keydown` event\n\t * It's not pretty, but it manages\n\t * arrow key focus on facet options\n\t *\n\t * todo: refactor with react\n\t */\n\tonKeyDown(e) {\n\t\tlet $menuitem;\n\t\tconst $currentTarget = $(e.currentTarget);\n\t\tconst $facet = $currentTarget.parents('.facet');\n\n\t\tif (e.keyCode === 40) {\n\t\t\tif ($currentTarget.attr('aria-expanded') === 'true') {\n\t\t\t\t// on facet toggle button\n\t\t\t\t// arrow down to first option\n\t\t\t\t$menuitem = this.$('.nx-childviews .focus-item:visible').first();\n\t\t\t}\n\n\t\t\tif (!$menuitem || !$menuitem.length) {\n\t\t\t\t// arrow down to next facet, first item\n\t\t\t\t$menuitem = $facet.nextAll().find('.focus-item:visible').first();\n\t\t\t}\n\t\t} else if (e.keyCode === 38) {\n\t\t\t// arrow up to previous menuitem\n\t\t\t$menuitem = $facet.prevAll().find('.focus-item:visible').last();\n\n\t\t\tif ($menuitem.parent().parent('.nx-childviews').height() === 0) {\n\t\t\t\t$menuitem = $facet.prevAll().find('[data-toggle]:visible').last();\n\t\t\t}\n\t\t\tif (!$menuitem || $menuitem.length === 0) {\n\t\t\t\t// go to last facet\n\t\t\t\t$menuitem = $facet.nextAll().find('.focus-item:visible').last();\n\t\t\t}\n\t\t}\n\n\t\tif ($menuitem && $menuitem.length) {\n\t\t\tconst allFacets = this.$el.parents('.facet-list.nx-childviews');\n\t\t\tallFacets.find('.focus-item').attr('tabindex', -1);\n\n\t\t\t$menuitem.attr('tabindex', 0);\n\t\t\t$menuitem.focus();\n\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t}\n\t}\n}\n\n// Functionality\nChildViews(SearchFactOptionsListView);\n","/**\n * @class\n */\nimport Base from '@netx/core-search/views/searchFacetView';\nimport SearchFacetOptionsListView from './searchFacetOptionsListView';\nexport default class SearchFacetView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\tsuper(opts);\n\n\t\t// TODO: get core in line\n\t\tthis.removeSubView(this.searchFacetOptionsView, true);\n\n\t\tconst model = this.model;\n\t\tthis.searchFacetOptionsView = this.addSubView(\n\t\t\tnew SearchFacetOptionsListView({\n\t\t\t\tcollection: model.get('options'),\n\t\t\t\tmodel: model,\n\t\t\t\tid: `${this.cid}-search-facet-options-${model.get('id')}`,\n\t\t\t}),\n\t\t);\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/searchFacetSelectedView.html';\n\nexport default class SearchFacetSelectedView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'change', _.debounce(this.render, 50));\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchFacetSelectedView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-search/views/searchFacetSelectedView';\n\nimport {faTimes} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaTimes,\n});\n\n// We want tooltips to make it clear what this selected value is for\nexport default class SearchFacetSelectedView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Cleanup\n\t\tif (this.$tooltip) this.$tooltip.tooltip('destroy');\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$tooltip = this.$('[data-toggle=\"tooltip\"]');\n\n\t\t// Tooltip!\n\t\tthis.$tooltip.tooltip({\n\t\t\tcontainer: 'body',\n\t\t});\n\t}\n\n\t/** @override */\n\tremove() {\n\t\t// Cleanup\n\t\tif (this.$tooltip) this.$tooltip.tooltip('destroy');\n\t\treturn super.remove();\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/searchFacetsSelectedView.html';\n\nimport ChildView from './searchFacetSelectedView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nexport default class SearchFacetsSelectedView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchFacetsSelectedView';\n\t}\n}\n\n// Functionality\nChildViews(SearchFacetsSelectedView);\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/searchFacetsView.html';\n\nimport ChildView from './searchFacetView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nimport SearchFacetsSelectedView from './searchFacetsSelectedView';\n\nexport default class SearchFacetsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = {\n\t\t\tviewClass: ChildView,\n\t\t\tid(model) {\n\t\t\t\treturn `${this.cid}-facet-${model.id}`;\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.id = opts.id || _.uniqueId('search-facets-view-');\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.loadingClassRemoveDelay = opts.loadingClassRemoveDelay || 200;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// Selected facet options\n\t\tthis.searchFacetsSelected = this.addSubView(\n\t\t\tnew SearchFacetsSelectedView({\n\t\t\t\tcollection: this.collection.selected,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\tconst searchFacetsSelected = this.searchFacetsSelected;\n\t\tif (searchFacetsSelected) {\n\t\t\t// Render and append searchFacetsSelected\n\t\t\tthis.$('[data-nx-control=\"selected\"]').append(searchFacetsSelected.el);\n\t\t\tsearchFacetsSelected.render();\n\t\t}\n\t}\n\n\t/**\n\t * The server returns facets regardless of if they have any options\n\t * @method\n\t * @return {boolean}\n\t */\n\thasAssets() {\n\t\tconst options = this.collection.filter((m) => m.get('options').length > 0);\n\t\treturn options.length !== 0;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchFacetsView';\n\t}\n}\n\n// Functionality\nChildViews(SearchFacetsView);\n","/**\n * @class\n */\nimport Base from '@netx/core-search/views/searchFacetsView';\nimport CoreView from '@netx/core/lib/netx-view';\n\nimport '../css/style.less';\n\nexport default class SearchFacetsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'click [data-nx-control=\"close\"]': 'hide',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\tsuper(opts);\n\n\t\t// TODO: get core in line\n\t\t// no selected\n\t\tthis.removeSubView(this.searchFacetsSelected, true);\n\t\tdelete this.searchFacetsSelected;\n\n\t\t// Hey, listen!\n\t\t// triggered when loading a cached category, facets need to refresh\n\t\tthis.listenTo(dispatcher, 'search:facets:refresh', () => {\n\t\t\tthis.render();\n\t\t});\n\t}\n}\n","import React, {useCallback, useMemo, useState} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {Avatar, Menu} from '@mui/material';\nimport {Chip, ChipProps, MenuItem} from '@netx/core-components';\nimport {ReactAction as Action} from '@netx/core/bootstrap';\n\nimport {\n\tfaTimes as TimesIcon,\n\tfaMousePointer as MousePointerIcon,\n} from '@fortawesome/pro-solid-svg-icons';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport {Severity, Theme} from '@netx/core-components/Theme';\n\nimport {useChangeStore, useGridStore, useSelectionStore} from '../../store';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\ticonWrapper: {\n\t\t\tbackground: theme.palette.warning.main,\n\t\t\tborderRadius: '50%',\n\t\t\twidth: 20,\n\t\t\theight: 20,\n\t\t\tdisplay: 'inline-flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\t'& svg': {\n\t\t\t\tcolor: theme.palette.background.default,\n\t\t\t\twidth: '0.75em !important',\n\t\t\t},\n\t\t},\n\t});\n\nexport interface ChangesChipProps\n\textends Omit<ChipProps, 'deleteIcon' | 'onClick' | 'onDelete'> {}\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faUndo as CaretDownIcon} from '@fortawesome/pro-solid-svg-icons';\n\nimport type {PopoverProps} from '@mui/material/Popover';\n\nconst ChangesChip: React.FC<WithStyles<typeof styles> & ChangesChipProps> = ({\n\tclasses,\n\tdisabled,\n\tlabel,\n\t...props\n}) => {\n\tconst [anchorEl, setAnchorEl] = useState<HTMLDivElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\n\tconst chipRef = React.useRef<HTMLDivElement>(null);\n\n\tconst changeStore = useChangeStore();\n\tconst selectionStore = useSelectionStore();\n\tconst gridStore = useGridStore();\n\n\tconst actions = useMemo(\n\t\t() =>\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ticon: MousePointerIcon,\n\t\t\t\t\tlabel: i18n.t('i18n.resetSelected'),\n\t\t\t\t\tcb: gridStore.resetSelectedChanges,\n\t\t\t\t\tenableTest: () => !!selectionStore.state.count,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ticon: TimesIcon,\n\t\t\t\t\tlabel: i18n.t('i18n.resetAll'),\n\t\t\t\t\tcb: gridStore.resetAllChanges,\n\t\t\t\t},\n\t\t\t].filter((action) => !action.enableTest || action.enableTest()),\n\t\t[\n\t\t\tgridStore.resetAllChanges,\n\t\t\tgridStore.resetSelectedChanges,\n\t\t\tselectionStore.state.count,\n\t\t],\n\t);\n\n\tconst handleClose = useCallback<Required<PopoverProps>['onClose']>(\n\t\t(event: React.MouseEvent<HTMLElement, MouseEvent>, reason) => {\n\t\t\tsetOpen(false);\n\t\t},\n\t\t[],\n\t);\n\n\t/** Menu exited */\n\tconst handleExited = useCallback(() => setAnchorEl(null), []);\n\n\t/** Show options or execute the only option */\n\tconst handleShowClick = useCallback(\n\t\t(event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\t// Execute only option\n\t\t\tif (actions.length === 1) {\n\t\t\t\tactions[0].cb();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Show options menu\n\t\t\tsetAnchorEl(chipRef.current);\n\t\t\tsetOpen(true);\n\t\t},\n\t\t[actions],\n\t);\n\n\tconst handleActionClick = useCallback(\n\t\t(action: Action) => (\n\t\t\tevent: React.MouseEvent<HTMLAnchorElement | HTMLLIElement, MouseEvent>,\n\t\t) => {\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\tsetOpen(false);\n\t\t\taction.cb();\n\t\t},\n\t\t[],\n\t);\n\n\treturn useMemo(\n\t\t() => (\n\t\t\t<>\n\t\t\t\t<Chip\n\t\t\t\t\tavatar={\n\t\t\t\t\t\t<Avatar>\n\t\t\t\t\t\t\t{changeStore.state.count > 99 ? '99+' : changeStore.state.count}\n\t\t\t\t\t\t</Avatar>\n\t\t\t\t\t}\n\t\t\t\t\tmeshAvatar\n\t\t\t\t\tvariant=\"outlined\"\n\t\t\t\t\t{...props}\n\t\t\t\t\tdeleteIcon={\n\t\t\t\t\t\t<div className={classes.iconWrapper}>\n\t\t\t\t\t\t\t<FontAwesomeIcon icon={CaretDownIcon} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\tdisabled={disabled || !changeStore.state.count}\n\t\t\t\t\tlabel={label || i18n.t('i18n.changed')}\n\t\t\t\t\tonDelete={changeStore.state.count ? handleShowClick : undefined}\n\t\t\t\t\tonClick={handleShowClick}\n\t\t\t\t\tref={chipRef}\n\t\t\t\t\tcolor=\"warning\"\n\t\t\t\t/>\n\t\t\t\t{anchorEl ? (\n\t\t\t\t\t<Menu\n\t\t\t\t\t\tanchorEl={anchorEl}\n\t\t\t\t\t\tonClose={handleClose}\n\t\t\t\t\t\topen={open}\n\t\t\t\t\t\tTransitionProps={{\n\t\t\t\t\t\t\tonExit: handleExited,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{actions.map((action) => (\n\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\tkey={`row-action-${action.label}`}\n\t\t\t\t\t\t\t\ticon={action.icon}\n\t\t\t\t\t\t\t\tonClick={handleActionClick(action)}\n\t\t\t\t\t\t\t\ttext={action.label}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Menu>\n\t\t\t\t) : null}\n\t\t\t</>\n\t\t),\n\t\t[\n\t\t\tactions,\n\t\t\tanchorEl,\n\t\t\topen,\n\n\t\t\tdisabled,\n\t\t\tlabel,\n\n\t\t\thandleClose,\n\t\t\thandleExited,\n\t\t\thandleActionClick,\n\t\t\thandleShowClick,\n\n\t\t\tchangeStore.state.count,\n\t\t],\n\t);\n};\n\nexport default withStyles(styles)(ChangesChip);\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport {Severity, Theme} from '@netx/core-components/Theme';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {\n\tfaClone as CloneIcon,\n\tfaPencil as PencilIcon,\n\tfaTimes as TimesIcon,\n} from '@fortawesome/pro-solid-svg-icons';\n\nimport {ChangesChip} from '..';\nimport {\n\tuseChangeStore,\n\tuseGridStore,\n\tuseProgressStore,\n\tuseSelectionStore,\n} from '../../store';\n\nimport Selection, {\n\tSelectionProps,\n} from '@netx/core-attribute-set-selection/components/SetSelector';\n\n// import {\n// \tSelection as SetSelection,\n// \tSelectionProps as SetSelectionProps,\n// } from '@netx/core-asset/components/Attributes/Sets';\n\nimport {Button, CountChip, IconButton} from '@netx/core-components';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tpadding: theme.spacing(1.5, 2, 1, 2),\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t},\n\t\ttitle: {\n\t\t\tflex: '0 1 auto',\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t},\n\t\tclose: {\n\t\t\tflex: '0 0 auto',\n\t\t},\n\t\tcounts: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tmarginRight: theme.spacing(1),\n\t\t\t'& > * + *': {\n\t\t\t\tmarginLeft: theme.spacing(1),\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '0 0 auto',\n\t\t\tmarginRight: theme.spacing(1),\n\t\t\t'& > * + *': {\n\t\t\t\tmarginLeft: theme.spacing(1),\n\t\t\t},\n\t\t},\n\t\tcontrols: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 0 auto',\n\t\t\talignItems: 'center',\n\t\t},\n\t\tworking: {\n\t\t\tpointerEvents: 'none',\n\t\t},\n\t\tsetSelection: {\n\t\t\tflex: '1 1 auto',\n\t\t\tmaxWidth: 300,\n\t\t\tminWidth: 220,\n\t\t\tpadding: theme.spacing(0, 2, 0, 0),\n\t\t},\n\t});\n\nexport interface MainHeaderProps {\n\tonClone?: () => void;\n\tonClose?: () => void;\n\tonEdit?: () => void;\n\t// onSetChange: SelectionProps['onChange'];\n}\n\nconst MainHeader: React.FC<\n\tWithStyles<typeof styles> & MainHeaderProps\n> = React.memo(\n\t({\n\t\tclasses,\n\n\t\tonClone,\n\t\tonClose,\n\t\tonEdit,\n\t\t// onSetChange,\n\t}) => {\n\t\tconst selection = useSelectionStore();\n\t\tconst grid = useGridStore();\n\t\tconst changes = useChangeStore();\n\t\tconst progress = useProgressStore();\n\n\t\tconst hasChanges = !!changes.state.count;\n\t\tconst hasSelection = !!selection.state.count;\n\n\t\tconst working =\n\t\t\tprogress.state.working || grid.state.loading || grid.state.saving;\n\n\t\treturn useMemo(\n\t\t\t() => (\n\t\t\t\t<div\n\t\t\t\t\tclassName={clsx(classes.root, {\n\t\t\t\t\t\t[classes.working]: working,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<div className={classes.controls}>\n\t\t\t\t\t\t<Selection\n\t\t\t\t\t\t\tclassName={classes.setSelection}\n\t\t\t\t\t\t\t// confirm={hasChanges}\n\t\t\t\t\t\t\t// defaultSelection={['all']}\n\t\t\t\t\t\t\t// onChange={onSetChange}\n\t\t\t\t\t\t\t// userPrefKey=\"attribute.attributeSets.selected.tagPanelGrid\"\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<div className={classes.counts}>\n\t\t\t\t\t\t\t<CountChip\n\t\t\t\t\t\t\t\tcount={selection.state.count}\n\t\t\t\t\t\t\t\tlabel={i18n.t('i18n.selected')}\n\t\t\t\t\t\t\t\tmeshAvatar\n\t\t\t\t\t\t\t\tonClear={selection.reset}\n\t\t\t\t\t\t\t\tcolor=\"info\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<ChangesChip />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className={classes.actions}>\n\t\t\t\t\t\t{onEdit ? (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\t\tdisabled={!hasSelection}\n\t\t\t\t\t\t\t\tonClick={onEdit}\n\t\t\t\t\t\t\t\tstartIcon={<FontAwesomeIcon icon={PencilIcon} fixedWidth />}\n\t\t\t\t\t\t\t\tvariant=\"outlined\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{i18n.t('i18n.edit')}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t{onClone ? (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\t\tdisabled={selection.state.inSingleRow === false}\n\t\t\t\t\t\t\t\tonClick={onClone}\n\t\t\t\t\t\t\t\tstartIcon={<FontAwesomeIcon icon={CloneIcon} fixedWidth />}\n\t\t\t\t\t\t\t\tvariant=\"outlined\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{i18n.t('i18n.clone')}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\tdisabled={!hasChanges || working}\n\t\t\t\t\t\t\tonClick={grid.save}\n\t\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{i18n.t('i18n.save')}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{onClose ? (\n\t\t\t\t\t\t<div className=\"close\">\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\ticon={TimesIcon}\n\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\tlabel={i18n.t('i18n.close')}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t),\n\t\t\t[\n\t\t\t\tclasses,\n\n\t\t\t\tonClose,\n\t\t\t\tonEdit,\n\n\t\t\t\thasChanges,\n\t\t\t\thasSelection,\n\t\t\t\tworking,\n\n\t\t\t\tchanges.state.count,\n\t\t\t\tgrid.resetAllChanges,\n\t\t\t\tgrid.save,\n\t\t\t\tselection.state.count,\n\t\t\t\tselection.state.inSingleRow,\n\t\t\t\tselection.reset,\n\t\t\t],\n\t\t);\n\t},\n);\n\nexport default withStyles(styles)(MainHeader);\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport {AttributeFormValues, AttributeAction} from '@netx/core-attribute';\nimport {\n\tAttributeSetsContainer,\n\tAttributeSetsContainerProps,\n} from '@netx/core-attribute-set';\nimport SetSelector from '@netx/core-attribute-set-selection/components/SetSelector';\nimport {Form, FormType} from '@netx/core-components/Form';\nimport SubmitButton from '@netx/core-components/SubmitButton';\nimport {ScrollBorder} from '@netx/core-components/ScrollBorder';\nimport {styled, Theme} from '@netx/core-components/Theme';\n\nconst ScrollBorderRoot = styled(ScrollBorder)(({theme}) => ({\n\tflex: '1 1 auto',\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n}));\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\t...theme.mixins.flexFillColumn,\n\t\t\tposition: 'relative',\n\t\t\twidth: '100%',\n\t\t\t'&.disabled': {\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\t'& $attributesWrapper': {\n\t\t\t\t\t...theme.mixins.disabled,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'& .url-link': {\n\t\t\t\tcolor: theme.palette.primary.main,\n\t\t\t\ttextDecoration: 'underline',\n\t\t\t},\n\t\t},\n\t\tattributesWrapper: {\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t},\n\t\tselector: {\n\t\t\tflex: '0 0 auto',\n\t\t},\n\t\tform: {\n\t\t\t...theme.mixins.flexFillColumn,\n\t\t\tposition: 'relative',\n\t\t\twidth: '100%',\n\t\t},\n\t\tfooter: {\n\t\t\t...theme.mixins.formFooter,\n\t\t\tposition: 'relative',\n\t\t},\n\t});\n\nexport interface EditorProps extends Partial<AttributeSetsContainerProps> {\n\tform: FormType<AttributeFormValues, AttributeAction>;\n\tinputForm: any;\n\thideSetSelector?: boolean;\n\tdisabled?: boolean;\n\tisLoading?: boolean;\n\tprogress?: number | null;\n\treadOnly?: boolean;\n\tsubmitLabel?: string;\n\tworking?: boolean;\n}\n\nconst EditorComponent = ({\n\tclasses,\n\tdisabled,\n\tform,\n\thideSetSelector,\n\tisLoading,\n\tprogress,\n\treadOnly,\n\tsubmitLabel,\n\tworking,\n\t...props\n}: WithStyles<typeof styles> & EditorProps) => {\n\tconst disable = disabled || isLoading;\n\treturn (\n\t\t<div className={clsx(classes.root, {disabled})}>\n\t\t\t{!hideSetSelector ? (\n\t\t\t\t<div className={classes.selector}>\n\t\t\t\t\t<SetSelector />\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t<Form className={classes.form} form={form}>\n\t\t\t\t<ScrollBorderRoot>\n\t\t\t\t\t<div className={classes.attributesWrapper}>\n\t\t\t\t\t\t<AttributeSetsContainer\n\t\t\t\t\t\t\tenforceMandatory={false}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\tform={form}\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</ScrollBorderRoot>\n\t\t\t\t{(!readOnly && (\n\t\t\t\t\t<footer className={classes.footer}>\n\t\t\t\t\t\t<SubmitButton\n\t\t\t\t\t\t\tdisabled={!form.hasChanged || !form.isValid || disable}\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\tlabel={submitLabel}\n\t\t\t\t\t\t\tshowWorking={isLoading || working}\n\t\t\t\t\t\t\tprogress={progress}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</footer>\n\t\t\t\t)) ||\n\t\t\t\t\tnull}\n\t\t\t</Form>\n\t\t</div>\n\t);\n};\n\nexport const Editor = withStyles(styles, {\n\tname: 'Editor',\n})(EditorComponent);\nexport default Editor;\n","import React from 'react';\n\nimport AttributeEditor, {EditorProps} from '../Editor';\n\nexport type BulkEditorProps = EditorProps;\n\nexport const BulkEditor = (props: BulkEditorProps) => (\n\t<AttributeEditor appendable clearable {...props} />\n);\n\nexport default BulkEditor;\n","import React from 'react';\nimport {useState} from 'react';\n\nimport {faPlusCircle as AppendIcon} from '@fortawesome/pro-regular-svg-icons';\n\nimport {ToggleButton, useUpdateEffect} from '@netx/core-components';\n\nimport {i18n} from '@netx/core/i18n';\n\nexport interface AppendProps {\n\ton?: boolean;\n\tconfirm?: boolean;\n\tdisabled?: boolean;\n\tonChange(on: boolean): void;\n}\n\nconst Append: React.FunctionComponent<AppendProps> = ({\n\tconfirm,\n\tdisabled,\n\ton,\n\tonChange,\n}) => {\n\tconst [selected, setSelected] = useState(on === true);\n\n\t// Was changed from the outside\n\tuseUpdateEffect(() => {\n\t\tsetSelected(on === true);\n\t}, [on]);\n\n\t/** Toggle handler */\n\tconst handleToggle = (event, on: boolean) => {\n\t\tsetSelected(on);\n\t\tonChange(on);\n\t};\n\n\treturn (\n\t\t<ToggleButton\n\t\t\taria-label=\"toggle append mode\"\n\t\t\tconfirm={\n\t\t\t\tconfirm\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttitle: i18n.t('i18n.toggleAppendModeConfirmTitle'),\n\t\t\t\t\t\t\tmessage: i18n.t('i18n.toggleAppendModeConfirmMessage'),\n\t\t\t\t\t }\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\tdisabled={disabled}\n\t\t\ticon={AppendIcon}\n\t\t\ton={selected}\n\t\t\tonToggle={handleToggle}\n\t\t\tlabel={\n\t\t\t\tdisabled\n\t\t\t\t\t? ''\n\t\t\t\t\t: selected\n\t\t\t\t\t? i18n.t('i18n.disableAppendMode')\n\t\t\t\t\t: i18n.t('i18n.enableAppendMode')\n\t\t\t}\n\t\t/>\n\t);\n};\n\nexport default React.memo(Append);\n","// This file still needs love\n\nimport React, {useCallback, useEffect, useMemo, useState} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport BulkEditorComponent, {\n\tBulkEditorProps as BulkEditorComponentProps,\n} from '@netx/core-attribute-asset/components/BulkEditor';\nimport {DrawerVariant} from '@netx/core-components/Drawer';\nimport AppendAction from '@netx/core-attribute-quick-edit/components/Actions/Append';\nimport {attributes as attributesSingleton} from '@netx/core-asset/collections/singleton';\n\nimport {withStyles, createStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nconst StyledBulkEditorComponent = withStyles((theme: Theme) =>\n\tcreateStyles({\n\t\tattributesWrapper: {\n\t\t\tpadding: theme.spacing(0, 2),\n\t\t},\n\t}),\n)(BulkEditorComponent);\n\nimport {\n\tisEmptyValue,\n\tFormMultipleValues,\n\tFormType,\n} from '@netx/core-components/Form';\nimport {withDrawer} from '@netx/core-components/Drawer';\nimport {\n\tuseUpdateEffect,\n\tuseWhenChangedEffect,\n} from '@netx/core-components/hooks';\n\nimport {useGridStore, useProgressStore} from '../../store';\nimport {useForm, getInputFormObject} from '@netx/core-components/Form';\nimport {\n\tuseAttributeProvider,\n\tuseMetadataLookups,\n\tAttributeValue,\n} from '@netx/core-attribute';\nimport {parseValue} from '@netx/core-attribute/utils';\nimport type {AttributeFormValues, Action} from '@netx/core-attribute-asset';\n\ntype SideEditorFormType = FormType<AttributeFormValues, Action>;\n\n/** Get submit data from attribute values */\n// TODO: utilize the attribute selection context for attribute templates\nfunction getSubmitData(\n\tvalues: SideEditorFormType['values'],\n\tchanges: SideEditorFormType['changes'],\n\tactions: SideEditorFormType['actions'],\n\tmode?: Action,\n) {\n\tconst submitData: SideEditorFormType['values'] = {};\n\tObject.keys(values).forEach((key) => {\n\t\tif (changes[key] !== true) return;\n\n\t\tconst id = parseInt(key);\n\t\tconst attr = attributesSingleton.get(id);\n\t\tif (!attr) return;\n\n\t\tconst fieldAction = actions[key] || 'overwrite';\n\t\tconst updateType =\n\t\t\tmode === 'append' && fieldAction !== 'clear' ? 'append' : fieldAction;\n\t\tconst value = values[key];\n\n\t\t// Cannot empty a mandatory attribute\n\t\tconst empty = isEmptyValue(value) || updateType === 'clear';\n\t\tif (empty && attr.get('mandatory') === 1) return;\n\n\t\tsubmitData[attr.get('name')] = value;\n\t});\n\n\treturn submitData;\n}\n\n// We handle the submit from the form and pass it along to you, the condumer!\nexport interface BulkEditorProps\n\textends Omit<\n\t\tBulkEditorComponentProps,\n\t\t| 'actions'\n\t\t| 'errors'\n\t\t| 'form'\n\t\t| 'inputForm'\n\t\t| 'values'\n\t\t| 'multipleValues'\n\t\t| 'originalValues'\n\t> {\n\tactive?: boolean;\n\tonChange?: (hasChanges: boolean) => void;\n\tonSubmit: (\n\t\tvalues: SideEditorFormType['values'],\n\t\tactions: SideEditorFormType['actions'],\n\t) => Promise<void>;\n}\n\nconst BulkEditor: React.FC<BulkEditorProps> = ({\n\tactive,\n\tdisabled,\n\tonChange,\n\tonSubmit,\n\t...props\n}) => {\n\tconst {state} = useGridStore();\n\tconst progress = useProgressStore();\n\tconst [working, setWorking] = useState(false);\n\tconst attributeProvider = useAttributeProvider();\n\n\tconst data = useMemo(() => {\n\t\tconst values: AttributeFormValues = {};\n\t\tconst multipleValues: FormMultipleValues = {};\n\t\tconst readOnlyValues: Record<number, boolean> = {};\n\n\t\tconst {storedData} = state;\n\t\tconst keys = storedData ? Object.keys(storedData) : [];\n\t\tif (keys.length) {\n\t\t\tfor (const key in storedData) {\n\t\t\t\tconst data = storedData[key];\n\t\t\t\tconst attr = attributeProvider.state.data.find(\n\t\t\t\t\t(attr) => attr.name === key,\n\t\t\t\t);\n\t\t\t\tif (attr) {\n\t\t\t\t\tvalues[attr.attributeid] = data.multipleValues\n\t\t\t\t\t\t? (null as any)\n\t\t\t\t\t\t: (parseValue(attr.type, data.value) as AttributeValue);\n\t\t\t\t\tmultipleValues[attr.attributeid] = data.multipleValues === true;\n\t\t\t\t\treadOnlyValues[attr.attributeid] = data.readOnly === true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tvalues,\n\t\t\tmultipleValues,\n\t\t\treadOnlyValues,\n\t\t};\n\t}, [state.storedData, attributeProvider.state.data]);\n\n\tconst form = useForm<AttributeFormValues, Action>(undefined, {\n\t\tonSubmit: useCallback(\n\t\t\tasync (\n\t\t\t\tvalues: SideEditorFormType['values'],\n\t\t\t\tchanges: SideEditorFormType['changes'],\n\t\t\t\tactions: SideEditorFormType['actions'],\n\t\t\t) => {\n\t\t\t\tif (disabled) return;\n\n\t\t\t\tconst updatedValues = getSubmitData(\n\t\t\t\t\tvalues,\n\t\t\t\t\tchanges,\n\t\t\t\t\tactions,\n\t\t\t\t\tprops.mode,\n\t\t\t\t);\n\t\t\t\tif (!Object.keys(values).length) return;\n\n\t\t\t\tconst updatedActions: SideEditorFormType['actions'] = {};\n\t\t\t\tfor (const key in updatedValues)\n\t\t\t\t\tupdatedActions[key] = props.mode || actions[key];\n\n\t\t\t\treturn await onSubmit(updatedValues, updatedActions);\n\t\t\t},\n\t\t\t[disabled, onSubmit, props.mode],\n\t\t),\n\t}) as SideEditorFormType;\n\tconst inputForm = getInputFormObject(form);\n\n\tconst ids = useMemo(() => {\n\t\treturn Object.keys(data.values).map((id) => parseInt(id));\n\t}, [data.values]);\n\n\tconst {lookup, lookupsAllowed, attributesWorking} = useMetadataLookups(\n\t\tids,\n\t\tfalse,\n\t\tform,\n\t);\n\n\tuseWhenChangedEffect(\n\t\tform.hasChanged,\n\t\tuseCallback(\n\t\t\t(hasChanged) => {\n\t\t\t\tonChange?.(hasChanged);\n\t\t\t},\n\t\t\t[onChange],\n\t\t),\n\t);\n\n\t// When `mode` changes, reset form to original values\n\tuseUpdateEffect(() => {\n\t\tform.reset(\n\t\t\tform.originalValuesRef.current,\n\t\t\tundefined,\n\t\t\tform.multipleValuesRef.current,\n\t\t);\n\t}, [props.mode]);\n\n\tuseWhenChangedEffect(\n\t\tdata,\n\t\tuseCallback(\n\t\t\t(data) => {\n\t\t\t\tform.reset(data.values, undefined, data.multipleValues);\n\t\t\t},\n\t\t\t[form.reset],\n\t\t),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\tuseEffect(() => {\n\t\tconst working = !active || progress.state.working; // || !Object.keys(data.values).length;\n\t\tif (working) {\n\t\t\tsetWorking(true);\n\t\t\treturn;\n\t\t}\n\t\tsetTimeout(() => {\n\t\t\tsetWorking(false);\n\t\t}, 200);\n\t}, [active, progress.state.working]);\n\n\treturn (\n\t\t<StyledBulkEditorComponent\n\t\t\tattributesWorking={attributesWorking}\n\t\t\tdisabled={disabled}\n\t\t\terrors={form.errors}\n\t\t\tform={form}\n\t\t\thideSetSelector\n\t\t\tinputForm={inputForm}\n\t\t\tisLoading={working}\n\t\t\tlimitToValues\n\t\t\tloading={working}\n\t\t\tactions={form.actions}\n\t\t\tmultipleValues={form.multipleValues}\n\t\t\tonLookup={lookup}\n\t\t\tlookupsAllowed={props.mode !== 'append' ? lookupsAllowed : undefined}\n\t\t\toriginalValues={form.originalValues}\n\t\t\treadOnlyAttributes={data.readOnlyValues}\n\t\t\tvalues={form.values}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nconst BulkEditorDrawer = withDrawer(BulkEditor);\n\nexport default function ({\n\tactive,\n\t...props\n}: React.ComponentProps<typeof BulkEditorDrawer> & {active?: boolean}) {\n\tconst [editorAppend, setEditorAppend] = useState(false);\n\tconst [hasChanges, setHasChanges] = useState(false);\n\tconst [dataActive, setDataActive] = useState(false);\n\n\tconst {getSelectedValues, resetStore, state} = useGridStore();\n\n\tconst handleChange = useCallback(\n\t\t(hasChanges: boolean) => setHasChanges(hasChanges),\n\t\t[],\n\t);\n\n\tconst handleEntered = useCallback(() => {\n\t\tif (!state.storedData) getSelectedValues();\n\t\tsetDataActive(true);\n\t}, [state]);\n\n\tconst handleExited = useCallback(() => {\n\t\tresetStore();\n\t\tsetDataActive(false);\n\t}, []);\n\n\treturn useMemo(\n\t\t() => (\n\t\t\t<BulkEditorDrawer\n\t\t\t\tactive={dataActive}\n\t\t\t\tmode={editorAppend ? 'append' : 'overwrite'}\n\t\t\t\tsubmitLabel={\n\t\t\t\t\teditorAppend ? i18n.t('i18n.append') : i18n.t('i18n.apply')\n\t\t\t\t}\n\t\t\t\thideReadOnlyAttributes\n\t\t\t\tonChange={handleChange}\n\t\t\t\t{...props}\n\t\t\t\tDrawerProps={{\n\t\t\t\t\tcancelAsClose: true,\n\t\t\t\t\theaderActions: (\n\t\t\t\t\t\t<AppendAction\n\t\t\t\t\t\t\tconfirm={hasChanges}\n\t\t\t\t\t\t\tonChange={setEditorAppend}\n\t\t\t\t\t\t\ton={editorAppend}\n\t\t\t\t\t\t/>\n\t\t\t\t\t),\n\t\t\t\t\tkeepMounted: false,\n\t\t\t\t\tonEntered: handleEntered,\n\t\t\t\t\tonExited: handleExited,\n\t\t\t\t\topen: active,\n\t\t\t\t\ttitle: i18n.t('i18n.bulkEditor'),\n\t\t\t\t\tvariant: DrawerVariant.TEMPORARY,\n\t\t\t\t\t...props.DrawerProps,\n\t\t\t\t}}\n\t\t\t/>\n\t\t),\n\t\t[\n\t\t\tactive,\n\t\t\tprops,\n\n\t\t\teditorAppend,\n\t\t\thasChanges,\n\n\t\t\tgetSelectedValues,\n\t\t\thandleChange,\n\t\t\tresetStore,\n\t\t],\n\t);\n}\n","// TODO: this \"component\" still needs love\nimport React, {useCallback, useEffect, useMemo, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {Typography} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {messages} from '../../properties';\nimport {useGridStore, useProgressStore, useSelectionStore} from '../../store';\n\nimport {\n\tgetInputFormObject,\n\tisEmptyValue,\n\twithForm,\n\tForm,\n\tFormType,\n\tWithFormPropsIn,\n\tWithFormPropsOut,\n} from '@netx/core-components/Form';\nimport SubmitButton from '@netx/core-components/SubmitButton';\n\nimport Attribute from '@netx/core-attribute/components/Attribute';\nimport {\n\tuseAttributeProvider,\n\tATTRIBUTE_APPENDABLE_TYPES,\n} from '@netx/core-attribute';\n\nimport AppendAction from '@netx/core-attribute-quick-edit/components/Actions/Append';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tbackground:\n\t\t\t\ttheme.palette.mode === 'light'\n\t\t\t\t\t? 'rgba(0,0,0,0.02)'\n\t\t\t\t\t: 'rgba(255,255,255,0.02)',\n\n\t\t\tflexDirection: 'column',\n\t\t\theight: 108,\n\t\t\tpadding: theme.spacing(1, 2),\n\t\t\tposition: 'relative',\n\n\t\t\t'&, & $message': {\n\t\t\t\talignItems: 'center',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tjustifyContent: 'center',\n\t\t\t},\n\t\t\t'&, & $action, & $submit': {\n\t\t\t\tflex: '0 0 auto',\n\t\t\t},\n\t\t\t'& textarea': {\n\t\t\t\tmaxHeight: 42,\n\t\t\t\t...theme.mixins.forceScrollable,\n\t\t\t},\n\t\t\t'& $form, & $inputWrapper': {\n\t\t\t\talignItems: 'center',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflex: '1 1 auto',\n\t\t\t\tminHeight: 0,\n\t\t\t\tminWidth: 0,\n\t\t\t},\n\t\t\t'& $form, & $message': {\n\t\t\t\twidth: '100%',\n\t\t\t},\n\t\t\t'& $actions, & $inputWrapper': {\n\t\t\t\tpaddingRight: theme.spacing(1),\n\t\t\t},\n\t\t},\n\t\tactions: {},\n\t\tform: {},\n\t\tinputWrapper: {\n\t\t\theight: '100%',\n\t\t\tmaxHeight: '100%',\n\t\t},\n\t\tloading: {\n\t\t\tpointerEvents: 'none',\n\t\t},\n\t\tmessage: {\n\t\t\tcolor: theme.palette.text.secondary,\n\t\t\tflex: '0 1 auto',\n\t\t},\n\t\tsubmit: {\n\t\t\t'& > button': {\n\t\t\t\tminWidth: 115,\n\t\t\t},\n\t\t},\n\t});\n\n// TODO: make this component accept the Values and pass them to the form\ntype FormValues = Record<string, any>;\n\nexport interface InputLineProps extends WithFormPropsIn<{}, FormValues> {\n\tonSubmit(\n\t\tvalues: FormValues,\n\t\tchanges: FormType['changes'],\n\t\tactions: FormType['actions'],\n\t): Promise<any>;\n}\n\nconst InputLine: React.FC<\n\tWithStyles<typeof styles> & WithFormPropsOut<InputLineProps, FormValues>\n> = ({classes, form, onSubmit}) => {\n\tconst [appending, setAppending] = useState(false);\n\tconst [canAppend, setCanAppend] = useState(false);\n\tconst attributeProvider = useAttributeProvider();\n\n\tconst selection = useSelectionStore();\n\tconst grid = useGridStore();\n\tconst progress = useProgressStore();\n\n\tconst selectedField = selection.state.inSingleColumn;\n\tconst canSubmit =\n\t\tform.hasChanged &&\n\t\tform.isValid &&\n\t\t!progress.state.working &&\n\t\t(!appending ||\n\t\t\t(selectedField !== false && !isEmptyValue(form.values[selectedField])));\n\tconst multipleFieldsSelected =\n\t\tselectedField === false && !!selection.state.count;\n\tconst working = progress.state.working || form.isSubmitting;\n\n\tconst inputForm = getInputFormObject(form);\n\n\t// When the selection changes, and the selection is in a single column,\n\t// get the attribute data for that field\n\tconst attrData = useMemo(() => {\n\t\tif (selectedField === false) return null;\n\t\tconst attr = attributeProvider.getByName(selectedField);\n\t\treturn attr && !attr.system ? attr : null;\n\t}, [selectedField, attributeProvider.getByName]);\n\n\t// When selected data updates, and the selection is in a single column,\n\t// update the form to reflect updated data\n\tuseEffect(() => {\n\t\tconst {storedData} = grid.state;\n\t\tif (selectedField === false || !storedData) return;\n\n\t\tconst keys = Object.keys(storedData);\n\t\tconst fieldLength = keys.length;\n\t\tif (!fieldLength || fieldLength > 1) {\n\t\t\tform.reset();\n\t\t\treturn;\n\t\t}\n\n\t\tconst fieldName = keys[0];\n\t\tconst data = storedData[fieldName];\n\t\tform.reset({[fieldName]: data.value}, form.actionsRef.current[fieldName], {\n\t\t\t[fieldName]: data.multipleValues === true,\n\t\t});\n\t}, [grid.state.storedData, selectedField]);\n\n\t// When attribute data updates, check to see if the type is appendable\n\tuseEffect(() => {\n\t\tsetCanAppend(\n\t\t\tattrData\n\t\t\t\t? ATTRIBUTE_APPENDABLE_TYPES.includes(attrData.type as any) &&\n\t\t\t\t\t\tattrData.permission !== 'r' &&\n\t\t\t\t\t\tgrid.state.storedData?.[attrData.name]?.readOnly !== true\n\t\t\t\t: false,\n\t\t);\n\t}, [attrData, grid.state.storedData]);\n\n\t// If the attribute is of a type that can no longer append, and the selection\n\t// is in a single column, turn append off and update form action\n\tuseEffect(() => {\n\t\tif (selectedField === false || canAppend) return;\n\n\t\tsetAppending(false);\n\t}, [canAppend, selectedField]);\n\n\tconst handleSubmit = useCallback(\n\t\tasync (values, changes, actions) => {\n\t\t\tif (appending) {\n\t\t\t\tObject.keys(actions).forEach((field) => (actions[field] = 'append'));\n\t\t\t}\n\t\t\tonSubmit?.(values, changes, actions);\n\t\t},\n\t\t[appending, onSubmit],\n\t);\n\n\t// We do not need to render for all the context changes we are utilizing\n\treturn useMemo(\n\t\t() => (\n\t\t\t<div\n\t\t\t\tclassName={clsx(classes.root, {\n\t\t\t\t\t[classes.loading]: working,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{selectedField !== false && attrData != null ? (\n\t\t\t\t\t<Form form={form} className={classes.form} onSubmit={handleSubmit}>\n\t\t\t\t\t\t<div className={classes.inputWrapper}>\n\t\t\t\t\t\t\t<Attribute\n\t\t\t\t\t\t\t\t// TODO: get this in line with other attribute forms\n\t\t\t\t\t\t\t\taction={form.actions[selectedField] as any}\n\t\t\t\t\t\t\t\talignActions=\"center\"\n\t\t\t\t\t\t\t\tattrData={attrData}\n\t\t\t\t\t\t\t\tname={selectedField}\n\t\t\t\t\t\t\t\tclearable\n\t\t\t\t\t\t\t\tenforceMandatory={false}\n\t\t\t\t\t\t\t\tform={inputForm}\n\t\t\t\t\t\t\t\tlimitHeightToContainer\n\t\t\t\t\t\t\t\tmultipleValues={form.multipleValues[selectedField]}\n\t\t\t\t\t\t\t\toriginalValue={form.originalValues[selectedField]}\n\t\t\t\t\t\t\t\treadOnly={grid.state.storedData?.[selectedField]?.readOnly}\n\t\t\t\t\t\t\t\tvalue={form.values[selectedField]}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className={classes.actions}>\n\t\t\t\t\t\t\t<AppendAction\n\t\t\t\t\t\t\t\tdisabled={!canAppend}\n\t\t\t\t\t\t\t\ton={appending}\n\t\t\t\t\t\t\t\tonChange={setAppending}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className={classes.submit}>\n\t\t\t\t\t\t\t<SubmitButton\n\t\t\t\t\t\t\t\tdisabled={!canSubmit}\n\t\t\t\t\t\t\t\tlabel={appending ? i18n.t('i18n.append') : i18n.t('i18n.apply')}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Form>\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div className={classes.message}>\n\t\t\t\t\t\t\t<Typography variant=\"body1\">\n\t\t\t\t\t\t\t\t{multipleFieldsSelected\n\t\t\t\t\t\t\t\t\t? messages.singleFieldMultipleFieldsSelected\n\t\t\t\t\t\t\t\t\t: messages.singleFieldNoFieldsSelected}\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t),\n\t\t[\n\t\t\tclasses,\n\t\t\tform.actions,\n\t\t\tform.multipleValues,\n\t\t\tform.originalValues,\n\t\t\tform.values,\n\n\t\t\tinputForm,\n\n\t\t\tappending,\n\t\t\tattrData,\n\t\t\tcanAppend,\n\t\t\tcanSubmit,\n\t\t\tmultipleFieldsSelected,\n\t\t\tselectedField,\n\t\t\tworking,\n\t\t],\n\t);\n};\n\nexport default withStyles(styles)(\n\twithForm<InputLineProps, FormValues>(InputLine, {\n\t\tresetOnSubmit: false,\n\t}),\n);\n","import React, {useCallback, useMemo, useRef, useState} from 'react';\nimport clsx from 'clsx';\n\nimport {i18n} from '@netx/core/i18n';\nimport {dispatcher} from '@netx/core/bootstrap';\n\nimport {\n\tDialogContent,\n\tDialogContentText,\n\tLinearProgress,\n\tPaper,\n} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {Header, SideEditor, SingleFieldEditor} from '../';\n\nimport {\n\tuseChangeStore,\n\tuseGridStore,\n\tuseProgressStore,\n\tuseSelectionStore,\n} from '../../store';\n\nimport {\n\tDialog,\n\tFormActions,\n\tFormValues,\n\tuseWhenChangedEffect,\n} from '@netx/core-components';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tminHeight: 0,\n\t\t\toverflow: 'hidden',\n\t\t\theight: 'initial',\n\t\t\tposition: 'relative',\n\t\t\t'&$overflownX': {\n\t\t\t\t'& .hypergrid-container': {\n\t\t\t\t\t'& .scrollbar-x-border-hack': {\n\t\t\t\t\t\tborderTop: `1px solid ${theme.palette.custom.border}`,\n\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\theight: '17px',\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\ttop: 'initial',\n\t\t\t\t\t},\n\t\t\t\t\t'& > div:not([class*=\"scrollbar-\"]):not([class*=\"finbar-\"])': {\n\t\t\t\t\t\tmarginBottom: '17px',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&$overflownY': {\n\t\t\t\t'& .hypergrid-container': {\n\t\t\t\t\t'& .scrollbar-y-border-hack': {\n\t\t\t\t\t\tborderLeft: `1px solid ${theme.palette.custom.border}`,\n\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\twidth: '17px',\n\t\t\t\t\t\tleft: 'initial',\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t},\n\t\t\t\t\t'& .scrollbar-x-border-hack': {\n\t\t\t\t\t\tright: '17px',\n\t\t\t\t\t},\n\t\t\t\t\t'& > div:not([class*=\"scrollbar-\"]):not([class*=\"finbar-\"])': {\n\t\t\t\t\t\tmarginRight: '17px',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t'& .hypergrid-container': {\n\t\t\t\tborderTop: `1px solid ${theme.palette.custom.border}`,\n\t\t\t\theight: 'initial',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflex: '1 1 auto',\n\t\t\t\tminHeight: 0,\n\t\t\t\tpaddingBottom: 17,\n\t\t\t\t'& .container': {\n\t\t\t\t\tbackground: theme.palette.background.paper,\n\t\t\t\t},\n\t\t\t\t'& > div:not([class*=\"scrollbar-\"]):not([class*=\"finbar-\"])': {\n\t\t\t\t\t...theme.mixins.absoluteFill,\n\t\t\t\t},\n\n\t\t\t\t'& .scrollbar-x-border-hack, & .scrollbar-y-border-hack': {\n\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\tbackground:\n\t\t\t\t\t\ttheme.palette.mode === 'light'\n\t\t\t\t\t\t\t? 'rgba(0, 0, 0, 0.05)'\n\t\t\t\t\t\t\t: 'rgba(255, 255, 255, 0.08)',\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\tright: 0,\n\t\t\t\t},\n\t\t\t\t'& .finbar-horizontal, & .finbar-vertical': {\n\t\t\t\t\t'& .thumb': {\n\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\tbackgroundColor: theme.palette.mode === 'light' ? '#666' : '#bbb',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'& .finbar-horizontal': {\n\t\t\t\t\theight: '11px',\n\t\t\t\t\tright: '16px !important',\n\t\t\t\t},\n\t\t\t\t'& .finbar-vertical': {\n\t\t\t\t\twidth: '11px',\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&$editorOpen': {\n\t\t\t\t'& $main': {\n\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t\t'&:before': {\n\t\t\t\t\t\tbackground: theme.palette.background.default,\n\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\tcontent: '\"',\n\t\t\t\t\t\topacity: 0.5,\n\t\t\t\t\t\t...theme.mixins.absoluteFill,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tmain: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tflexDirection: 'column',\n\t\t\tminHeight: 0,\n\t\t},\n\t\tsideEditor: {\n\t\t\tflex: '0 0 auto',\n\t\t\tmarginTop: 4,\n\t\t\tposition: 'relative',\n\t\t},\n\t\teditorOpen: {\n\t\t\t'&::after': {\n\t\t\t\tbackground: 'rgba(0, 0, 0, 0.5)',\n\t\t\t\tcontent: '\"\"',\n\t\t\t\tdisplay: 'block',\n\t\t\t\t...theme.mixins.absoluteFill,\n\t\t\t},\n\t\t\t'& $sideEditor': {\n\t\t\t\tzIndex: 2,\n\t\t\t},\n\t\t},\n\t\tclosedActions: {\n\t\t\tflex: '1 1 auto',\n\t\t\tdisplay: 'flex',\n\t\t\tjustifyContent: 'center',\n\t\t\talignItems: 'center',\n\t\t\tposition: 'absolute',\n\t\t\ttop: 0,\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t\tleft: 0,\n\t\t\tpointerEvents: 'none',\n\t\t},\n\t\toverflownX: {},\n\t\toverflownY: {},\n\t\tprogress: {\n\t\t\tposition: 'absolute',\n\t\t\ttop: 0,\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t},\n\t\twrapper: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\tflexDirection: 'column',\n\t\t},\n\t\tloadingOverlay: {\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\tbackground: 'rgba(255, 255, 255, 0.5)',\n\t\t\t...theme.mixins.absoluteFill,\n\t\t},\n\t\tloadingContainer: {\n\t\t\tpadding: theme.spacing(2),\n\t\t},\n\t\tdisable: {\n\t\t\tpointerEvents: 'none',\n\t\t},\n\t\tworking: {},\n\t});\n\nimport {useConfirmation} from '@netx/core-components/Confirmation';\n\nexport interface GridEditorProps {\n\tonClose?: (event, reason: string) => void;\n\tonChange?: (hasChanges: boolean) => void;\n\tref?: React.Ref<HTMLDivElement>;\n}\n\nconst GridEditor = React.forwardRef<\n\tHTMLDivElement,\n\tWithStyles<typeof styles> & GridEditorProps\n>(({classes, onChange, onClose}, ref) => {\n\tconst rootRef = useRef<HTMLDivElement>(null);\n\tconst [editorOpen, setEditorOpen] = useState(false);\n\n\tconst confirm = useConfirmation();\n\n\tconst grid = useGridStore();\n\tconst selection = useSelectionStore();\n\tconst changes = useChangeStore();\n\tconst progress = useProgressStore();\n\n\tconst hasChanges = !!changes.state.count;\n\tconst singleRow = selection.state.inSingleRow;\n\n\tconst disable = grid.state.loading || grid.state.saving;\n\tconst working = progress.state.working || disable;\n\tconst indeterminateProgress =\n\t\t(working && progress.state.progress === 0) ||\n\t\t(grid.state.saving && progress.state.progress === 100);\n\n\tuseWhenChangedEffect(\n\t\thasChanges,\n\t\tuseCallback(\n\t\t\t(hasChanges) => {\n\t\t\t\tonChange?.(hasChanges);\n\t\t\t},\n\t\t\t[onChange],\n\t\t),\n\t);\n\n\tconst handleClone = useCallback(() => {\n\t\tsingleRow !== false &&\n\t\t\tdispatcher.trigger(\n\t\t\t\t'asset:tagPanel:grid:clone',\n\t\t\t\tgrid.getCloneData(singleRow),\n\t\t\t);\n\t}, [grid.getCloneData, singleRow]);\n\n\tconst handleClose = useCallback(() => {\n\t\tif (!hasChanges) return onClose?.(null, '');\n\n\t\tconfirm({\n\t\t\tdescription: i18n.t('i18n.anyUnsavedChangesWillBeLostConfirm'),\n\t\t}).then(() => onClose?.(null, ''));\n\t}, [hasChanges, onClose]);\n\n\tconst handleEditClick = useCallback(() => setEditorOpen(true), []);\n\n\tconst handleInputLineSubmit = useCallback(\n\t\tasync (data, changes, actions) => grid.updateData(data, actions),\n\t\t[grid.updateData],\n\t);\n\n\tconst handleSideEditorSubmit = useCallback(\n\t\tasync (values: FormValues, actions: FormActions) => {\n\t\t\tawait grid.updateData(values, actions);\n\t\t\tsetEditorOpen(false);\n\t\t},\n\t\t[grid.updateData],\n\t);\n\n\tconst _Header = useMemo(() => {\n\t\treturn (\n\t\t\t<Header\n\t\t\t\tonClose={handleClose}\n\t\t\t\tonClone={handleClone}\n\t\t\t\tonEdit={handleEditClick}\n\t\t\t/>\n\t\t);\n\t}, [handleClose, handleClone, handleEditClick]);\n\n\tconst _SideEditor = useMemo(() => {\n\t\treturn (\n\t\t\t<div className={classes.sideEditor}>\n\t\t\t\t<SideEditor\n\t\t\t\t\tactive={editorOpen}\n\t\t\t\t\tonSubmit={handleSideEditorSubmit}\n\t\t\t\t\tDrawerProps={{\n\t\t\t\t\t\tonCollapseToggle: setEditorOpen,\n\t\t\t\t\t\toverflowParent: rootRef,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}, [classes, editorOpen, handleSideEditorSubmit, setEditorOpen]);\n\n\tconst _SingleFieldEditor = useMemo(() => {\n\t\treturn <SingleFieldEditor onSubmit={handleInputLineSubmit} />;\n\t}, [handleInputLineSubmit]);\n\n\treturn useMemo(() => {\n\t\treturn (\n\t\t\t<Paper\n\t\t\t\tref={rootRef}\n\t\t\t\tclassName={clsx(classes.root, {\n\t\t\t\t\t[classes.working]: working,\n\t\t\t\t\t[classes.disable]: disable,\n\t\t\t\t\t[classes.editorOpen]: editorOpen,\n\t\t\t\t\t[classes.overflownX]: grid.state.overflownX,\n\t\t\t\t\t[classes.overflownY]: grid.state.overflownY,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<div className={classes.wrapper}>\n\t\t\t\t\t{_Header}\n\n\t\t\t\t\t<LinearProgress\n\t\t\t\t\t\tvariant={indeterminateProgress ? 'indeterminate' : 'determinate'}\n\t\t\t\t\t\tkey={working ? 0 : 1}\n\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\tgrid.state.loading\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: working\n\t\t\t\t\t\t\t\t? progress.state.progress\n\t\t\t\t\t\t\t\t: 100\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclassName={classes.progress}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<div className={classes.main}>\n\t\t\t\t\t\t{_SingleFieldEditor}\n\n\t\t\t\t\t\t{/** Do not add any other props to these elements */}\n\t\t\t\t\t\t<div ref={ref}>\n\t\t\t\t\t\t\t<div className=\"scrollbar-x-border-hack\" />\n\t\t\t\t\t\t\t<div className=\"scrollbar-y-border-hack\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{_SideEditor}\n\n\t\t\t\t{/** Show dialog at initial data load */}\n\t\t\t\t{grid.state.loading ? (\n\t\t\t\t\t<Dialog\n\t\t\t\t\t\ttitle={i18n.t('i18n.loading')}\n\t\t\t\t\t\tdisableEscapeKeyDown\n\t\t\t\t\t\tonClose={(event, reason) => {\n\t\t\t\t\t\t\tif (reason !== 'backdropClick') {\n\t\t\t\t\t\t\t\tonClose?.(event, reason);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\topen\n\t\t\t\t\t>\n\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t<DialogContentText>\n\t\t\t\t\t\t\t\t{i18n.t(\n\t\t\t\t\t\t\t\t\t'i18n.gridEditorDependingOnCartnSizeThisCouldTakeAMoment',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</DialogContentText>\n\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t</Dialog>\n\t\t\t\t) : null}\n\t\t\t</Paper>\n\t\t);\n\t}, [\n\t\tclasses,\n\t\t_Header,\n\t\t_SideEditor,\n\t\t_SingleFieldEditor,\n\t\tdisable,\n\t\tindeterminateProgress,\n\t\tworking,\n\t\tgrid.state.loading,\n\t\tgrid.state.overflownX,\n\t\tgrid.state.overflownY,\n\t\tprogress.state.progress,\n\t]);\n});\n\nexport default withStyles(styles)(GridEditor);\n","import {createStyles, makeStyles} from '@mui/styles';\n\nconst useStyles = ({\n\tenabled = false,\n\tcursor = 'grabbing',\n}: UseDragGlobalStylesParams) =>\n\tmakeStyles(() => {\n\t\tif (!enabled) return {};\n\t\treturn createStyles({\n\t\t\t'@global': {\n\t\t\t\thtml: {\n\t\t\t\t\tcursor: `${cursor} !important`,\n\t\t\t\t},\n\t\t\t\tbody: {\n\t\t\t\t\t'& *': {\n\t\t\t\t\t\tuserSelect: 'none !important',\n\t\t\t\t\t\tpointerEvents: 'none !important',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\nexport type UseDragGlobalStylesParams = {\n\tenabled?: boolean;\n\tcursor?: React.CSSProperties['cursor'];\n};\n\nexport const useDragGlobalStyles = (params: UseDragGlobalStylesParams) => {\n\t// TODO: research the underworkings of makeStyles and see why a inline useMemo\n\t// does not work here\n\tuseStyles(params)();\n};\n\nexport default useDragGlobalStyles;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedTableHeaderCellClasses {\n\troot: string;\n\n\talignRight: string;\n\tcolumnsOverflown: string;\n\tdisabled: string;\n\tfrozenLeadingColumn: string;\n\tfrozenTrailingColumn: string;\n\tlastFrozenLeadingColumn: string;\n\tfirstFrozenTrailingColumn: string;\n\tnoLabel: string;\n\tnonInteractive: string;\n\tresizing: string;\n\tsortable: string;\n\tsorted: string;\n\n\tlabel: string;\n}\n\nexport const getVirtualizedTableHeaderCellClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedTableHeaderCell', slot);\n\nexport const virtualizedTableHeaderCellClasses = generateUtilityClasses(\n\t'VirtualizedTableHeaderCell',\n\t[\n\t\t'root',\n\t\t'alignRight',\n\t\t'columnsOverflown',\n\t\t'disabled',\n\t\t'frozenLeadingColumn',\n\t\t'frozenTrailingColumn',\n\t\t'lastFrozenLeadingColumn',\n\t\t'firstFrozenTrailingColumn',\n\t\t'noLabel',\n\t\t'nonInteractive',\n\t\t'resizing',\n\t\t'sortable',\n\t\t'sorted',\n\n\t\t'label',\n\t],\n);\nexport default virtualizedTableHeaderCellClasses;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedTableHeaderCellSortIndicatorClasses {\n\troot: string;\n\tactive: string;\n\tasc: string;\n\tdesc: string;\n}\n\nexport const getVirtualizedTableHeaderCellSortIndicatorClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedTableHeaderCellSortIndicator', slot);\n\nexport const virtualizedTableHeaderCellSortIndicatorClasses = generateUtilityClasses(\n\t'VirtualizedTableHeaderCellSortIndicator',\n\t['root', 'active', 'asc', 'desc'],\n);\nexport default virtualizedTableHeaderCellSortIndicatorClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport _ from 'underscore';\n\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCaretDown} from '@fortawesome/pro-solid-svg-icons';\n\nimport {\n\tgetVirtualizedTableHeaderCellSortIndicatorClass,\n\tvirtualizedTableHeaderCellSortIndicatorClasses,\n\tVirtualizedTableHeaderCellSortIndicatorClasses,\n} from './virtualizedTableHeaderCellSortIndicatorClasses';\n\ntype VirtualizedTableHeaderCellSortIndicatorUtilityClassProps = WithClasses<\n\tVirtualizedTableHeaderCellSortIndicatorClasses,\n\t{\n\t\tactive?: boolean;\n\t\torder: 'asc' | 'desc';\n\t}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedTableHeaderCellSortIndicatorUtilityClassProps,\n) => {\n\tconst {classes, active, order} = ownerState;\n\n\tconst slots = {\n\t\troot: ['root', active && 'active', order],\n\t};\n\n\treturn composeClasses(\n\t\tslots,\n\t\tgetVirtualizedTableHeaderCellSortIndicatorClass,\n\t\tclasses,\n\t);\n};\n\nconst VirtualizedTableHeaderCellSortIndicatorRoot = styled('span', {\n\tname: 'VirtualizedTableHeaderCellSortIndicator',\n\tslot: 'Root',\n})(({theme}) => ({\n\tbottom: 0,\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tposition: 'absolute',\n\tright: 12,\n\ttop: 0,\n\ttransition: `transform 200ms ease`,\n\topacity: 0,\n\t[`&.${virtualizedTableHeaderCellSortIndicatorClasses.active}`]: {\n\t\topacity: 1,\n\t},\n\t[`&.${virtualizedTableHeaderCellSortIndicatorClasses.asc}`]: {\n\t\ttransform: 'rotate(180deg)',\n\t\tpaddingBottom: 4,\n\t},\n}));\n\nexport interface VirtualizedTableHeaderCellSortIndicatorProps\n\textends WithClasses<\n\t\tVirtualizedTableHeaderCellSortIndicatorClasses,\n\t\tReact.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<HTMLSpanElement>,\n\t\t\tHTMLSpanElement\n\t\t>\n\t> {\n\tactive?: boolean;\n\torder?: 'asc' | 'desc';\n}\n\nexport const VirtualizedTableHeaderCellSortIndicatorPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\torder = 'asc',\n\tactive,\n\t...props\n}: VirtualizedTableHeaderCellSortIndicatorProps) => {\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\torder,\n\t\tactive,\n\t});\n\n\treturn (\n\t\t<VirtualizedTableHeaderCellSortIndicatorRoot\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<FontAwesomeIcon icon={faCaretDown} />\n\t\t</VirtualizedTableHeaderCellSortIndicatorRoot>\n\t);\n};\n\nexport const VirtualizedTableHeaderCellSortIndicator = React.memo(\n\tVirtualizedTableHeaderCellSortIndicatorPrimitive,\n) as (props: VirtualizedTableHeaderCellSortIndicatorProps) => JSX.Element;\n\nexport default VirtualizedTableHeaderCellSortIndicator;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedTableHeaderCellDraggerClasses {\n\troot: string;\n\tellipsis: string;\n\tactive: string;\n}\n\nexport const getVirtualizedTableHeaderCellDraggerClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedTableHeaderCellDragger', slot);\n\nexport const virtualizedTableHeaderCellDraggerClasses = generateUtilityClasses(\n\t'VirtualizedTableHeaderCellDragger',\n\t['root', 'active', 'ellipsis'],\n);\nexport default virtualizedTableHeaderCellDraggerClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport _ from 'underscore';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faEllipsisV as EllipsisIcon} from '@fortawesome/pro-solid-svg-icons';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {\n\tgetVirtualizedTableHeaderCellDraggerClass,\n\tvirtualizedTableHeaderCellDraggerClasses,\n\tVirtualizedTableHeaderCellDraggerClasses,\n} from './virtualizedTableHeaderCellDraggerClasses';\n\ntype VirtualizedTableHeaderCellDraggerUtilityClassProps = WithClasses<\n\tVirtualizedTableHeaderCellDraggerClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedTableHeaderCellDraggerUtilityClassProps,\n) => {\n\tconst {classes} = ownerState;\n\n\tconst slots = {\n\t\troot: ['root'],\n\t\tellipsis: ['ellipsis'],\n\t};\n\n\treturn composeClasses(\n\t\tslots,\n\t\tgetVirtualizedTableHeaderCellDraggerClass,\n\t\tclasses,\n\t);\n};\n\nconst VirtualizedTableHeaderCellDraggerRoot = styled('div', {\n\tname: 'VirtualizedTableHeaderCellDragger',\n\tslot: 'Root',\n})(({theme}) => ({\n\t...theme.mixins.absoluteFill,\n\talignItems: 'center',\n\tbackground: theme.palette.custom.background.accent,\n\tborderRight: '1px solid transparent',\n\tcursor: 'col-resize',\n\tdisplay: 'flex',\n\tjustifyContent: 'center',\n\tleft: 'initial',\n\topacity: 0,\n\toverflow: 'hidden',\n\ttransition: 'opacity 0.3s ease',\n\tuserSelect: 'none',\n\twidth: 8,\n\tzIndex: 2,\n\t'&:hover': {\n\t\tborderColor: theme.palette.secondary.main,\n\t},\n}));\n\nconst VirtualizedTableHeaderCellDraggerEllipsis = styled('div', {\n\tname: 'VirtualizedTableHeaderCellDragger',\n\tslot: 'Ellipsis',\n})(({theme}) => ({\n\tcolor: theme.palette.text.secondary,\n\tfontSize: 12,\n}));\n\nexport interface VirtualizedTableHeaderCellDraggerProps\n\textends WithClasses<\n\t\tVirtualizedTableHeaderCellDraggerClasses,\n\t\tReact.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\t\tHTMLDivElement\n\t\t>\n\t> {}\n\nexport const VirtualizedTableHeaderCellDraggerPrimitive = ({\n\tclasses: _classes,\n\tclassName,\n\t...props\n}: VirtualizedTableHeaderCellDraggerProps) => {\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t});\n\n\treturn (\n\t\t<VirtualizedTableHeaderCellDraggerRoot\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<VirtualizedTableHeaderCellDraggerEllipsis className={classes.ellipsis}>\n\t\t\t\t<FontAwesomeIcon icon={EllipsisIcon} fixedWidth />\n\t\t\t</VirtualizedTableHeaderCellDraggerEllipsis>\n\t\t</VirtualizedTableHeaderCellDraggerRoot>\n\t);\n};\n\nexport const VirtualizedTableHeaderCellDragger = React.memo(\n\tVirtualizedTableHeaderCellDraggerPrimitive,\n) as (props: VirtualizedTableHeaderCellDraggerProps) => JSX.Element;\n\nexport default VirtualizedTableHeaderCellDragger;\n","import React, {\n\tuseCallback,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport clsx from 'clsx';\nimport _ from 'underscore';\n\nimport {Typography} from '@mui/material';\n\nimport {useTableLayoutProvider} from '../../contexts';\nimport type {BaseItemData, ColumnInstance} from '../../types';\nimport {useDragGlobalStyles} from '../../../hooks/useDragGlobalStyles';\nimport useSharedRef from '../../../hooks/useSharedRef';\nimport {composeClasses, styled, WithClasses} from '../../../Theme';\nimport {\n\tgetVirtualizedTableHeaderCellClass,\n\tvirtualizedTableHeaderCellClasses,\n\tVirtualizedTableHeaderCellClasses,\n} from './virtualizedTableHeaderCellClasses';\nimport {virtualizedTableHeaderCellSortIndicatorClasses} from './virtualizedTableHeaderCellSortIndicatorClasses';\nimport {VirtualizedTableHeaderCellSortIndicator} from './VirtualizedTableHeaderCellSortIndicator';\nimport {VirtualizedTableHeaderCellDragger} from './VirtualizedTableHeaderCellDragger';\nimport {virtualizedTableHeaderCellDraggerClasses} from './virtualizedTableHeaderCellDraggerClasses';\n\ntype VirtualizedTableHeaderCellUtilityClassProps = WithClasses<\n\tVirtualizedTableHeaderCellClasses,\n\t{\n\t\talignRight?: boolean;\n\t\tcolumnsOverflown?: boolean;\n\t\tdisabled?: boolean;\n\t\tfrozenLeadingColumn?: boolean;\n\t\tfrozenTrailingColumn?: boolean;\n\t\tlastFrozenLeadingColumn?: boolean;\n\t\tfirstFrozenTrailingColumn?: boolean;\n\t\tnonInteractive?: boolean;\n\t\tresizing?: boolean;\n\t\tsortable?: boolean;\n\t\tsorted?: boolean;\n\t\tnoLabel?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedTableHeaderCellUtilityClassProps,\n) => {\n\tconst {\n\t\tclasses,\n\t\talignRight,\n\t\tcolumnsOverflown,\n\t\tdisabled,\n\t\tfrozenLeadingColumn,\n\t\tfrozenTrailingColumn,\n\t\tfirstFrozenTrailingColumn,\n\t\tlastFrozenLeadingColumn,\n\t\tnoLabel,\n\t\tnonInteractive,\n\t\tresizing,\n\t\tsortable,\n\t\tsorted,\n\t} = ownerState;\n\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\talignRight && 'alignRight',\n\t\t\tcolumnsOverflown && 'columnsOverflown',\n\t\t\tdisabled && 'disabled',\n\t\t\tfrozenLeadingColumn && 'frozenLeadingColumn',\n\t\t\tfrozenTrailingColumn && 'frozenTrailingColumn',\n\t\t\tlastFrozenLeadingColumn && 'lastFrozenLeadingColumn',\n\t\t\tfirstFrozenTrailingColumn && 'firstFrozenTrailingColumn',\n\t\t\tnoLabel && 'noLabel',\n\t\t\tnonInteractive && 'nonInteractive',\n\t\t\tresizing && 'resizing',\n\t\t\tsortable && 'sortable',\n\t\t\tsorted && 'sorted',\n\t\t],\n\t\tlabel: ['label'],\n\t};\n\n\treturn composeClasses(slots, getVirtualizedTableHeaderCellClass, classes);\n};\n\nconst VirtualizedTableHeaderCellRoot = styled('div', {\n\tname: 'VirtualizedTableHeaderCell',\n\tslot: 'Root',\n})(({theme}) => ({\n\talignItems: 'center',\n\tbackgroundColor: theme.palette.background.paper,\n\tborderBottom: '1px solid transparent',\n\tcolor: theme.palette.text.secondary,\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\theight: 48,\n\tpadding: theme.spacing(0, 1),\n\tposition: 'relative',\n\tzIndex: 2,\n\toutline: 'none',\n\tuserSelect: 'none',\n\t'&:focus': {\n\t\tborderBottomColor: theme.palette.secondary.main,\n\t\t[`&.${virtualizedTableHeaderCellClasses.sortable}:not(.${virtualizedTableHeaderCellClasses.disabled})`]: {\n\t\t\t[`&:not(.${virtualizedTableHeaderCellClasses.sorted})`]: {\n\t\t\t\t[`& .${virtualizedTableHeaderCellSortIndicatorClasses.root}`]: {\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t[`&:not(.${virtualizedTableHeaderCellClasses.frozenLeadingColumn})`]: {\n\t\tpadding: theme.spacing(0, 2),\n\t},\n\t[`&.${virtualizedTableHeaderCellClasses.frozenLeadingColumn}, &.${virtualizedTableHeaderCellClasses.frozenTrailingColumn}`]: {\n\t\t...theme.mixins.positionSticky,\n\t\tzIndex: 3,\n\t},\n\t[`&.${virtualizedTableHeaderCellClasses.alignRight}`]: {\n\t\tjustifyContent: 'flex-end',\n\t},\n\t[`&:hover, &.${virtualizedTableHeaderCellClasses.resizing}`]: {\n\t\t[`.${virtualizedTableHeaderCellDraggerClasses.root}`]: {\n\t\t\topacity: 1,\n\t\t},\n\t},\n\t[`&.${virtualizedTableHeaderCellClasses.resizing}`]: {\n\t\t[`.${virtualizedTableHeaderCellDraggerClasses.root}`]: {\n\t\t\tborderColor: theme.palette.secondary.main,\n\t\t},\n\t},\n\t[`&.${virtualizedTableHeaderCellClasses.sortable}, &.${virtualizedTableHeaderCellClasses.sorted}`]: {\n\t\tpadding: theme.spacing(0, 1, 0, 1),\n\t\t[`&:not(.${virtualizedTableHeaderCellClasses.frozenLeadingColumn})`]: {\n\t\t\tpadding: theme.spacing(0, 4, 0, 2),\n\t\t},\n\t\t[`&:not(.${virtualizedTableHeaderCellClasses.disabled}).${virtualizedTableHeaderCellClasses.sortable}:hover`]: {\n\t\t\tcursor: 'pointer',\n\t\t\t[`&:not(.${virtualizedTableHeaderCellClasses.sorted})`]: {\n\t\t\t\t[`& .${virtualizedTableHeaderCellSortIndicatorClasses.root}`]: {\n\t\t\t\t\topacity: 0.5,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t[`&.${virtualizedTableHeaderCellClasses.disabled}`]: {\n\t\tpointerEvents: 'none',\n\t},\n\t[`&.${virtualizedTableHeaderCellClasses.frozenLeadingColumn}`]: {\n\t\tleft: 0,\n\t\t[`&.${virtualizedTableHeaderCellClasses.lastFrozenLeadingColumn}.${virtualizedTableHeaderCellClasses.columnsOverflown}`]: {\n\t\t\tborderRight: `1px dotted ${theme.palette.custom.border}`,\n\t\t},\n\t},\n\t[`&.${virtualizedTableHeaderCellClasses.frozenTrailingColumn}`]: {\n\t\tright: 0,\n\t\t[`&.${virtualizedTableHeaderCellClasses.firstFrozenTrailingColumn}.${virtualizedTableHeaderCellClasses.columnsOverflown}`]: {\n\t\t\tborderLeft: `1px dotted ${theme.palette.custom.border}`,\n\t\t},\n\t},\n}));\n\nconst VirtualizedTableHeaderCellLabel = styled(Typography, {\n\tname: 'VirtualizedTableHeaderCell',\n\tslot: 'Label',\n})(({theme}) => ({\n\tfontWeight: theme.typography.fontWeightMedium,\n\tlineHeight: theme.typography.pxToRem(24),\n}));\n\nexport interface VirtualizedTableHeaderCellProps<ItemData extends BaseItemData>\n\textends WithClasses<\n\t\tVirtualizedTableHeaderCellClasses,\n\t\tReact.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\t\tHTMLDivElement\n\t\t>\n\t> {\n\tdisabled?: boolean;\n\tdisableFocus?: boolean;\n\tindex: number;\n\tcolumn: ColumnInstance<ItemData>;\n\tref?: React.RefObject<HTMLDivElement>;\n\tsortField?: string;\n\tsortOrder?: 'asc' | 'desc';\n}\n\nexport const VirtualizedTableHeaderCellPrimitive = <\n\tItemData extends BaseItemData\n>({\n\tclasses: _classes,\n\tclassName,\n\tcolumn,\n\tdisableFocus,\n\tdisabled,\n\tindex,\n\tref,\n\tsortField,\n\tsortOrder,\n\t...props\n}: VirtualizedTableHeaderCellProps<ItemData>) => {\n\tconst {state, setColumnWidth} = useTableLayoutProvider();\n\t// Reference to cell element\n\tconst cellRef = useSharedRef<HTMLDivElement | null>(null, [ref]);\n\t// Store the cell's width at drag start\n\tconst cellWidthRef = useRef(0);\n\t// Store the x coordinate of the drag start\n\tconst xStartRef = useRef(0);\n\n\tconst [isDragging, setIsDragging] = useState(false);\n\n\tconst headerLabel = column.render('Header');\n\tconst frozenLeadingColumn = index < state.frozenLeadingColumnCount;\n\tconst lastFrozenLeadingColumn =\n\t\tfrozenLeadingColumn && index === state.frozenLeadingColumnCount - 1;\n\tconst frozenTrailingColumn =\n\t\tstate.columnCount - index <= state.frozenTrailingColumnCount;\n\tconst firstFrozenTrailingColumn =\n\t\tfrozenTrailingColumn &&\n\t\tstate.columnCount - index === state.frozenTrailingColumnCount;\n\n\tconst left = useMemo(\n\t\t() =>\n\t\t\tfrozenLeadingColumn && index > 0\n\t\t\t\t? state.columnWidths\n\t\t\t\t\t\t.slice(0, index)\n\t\t\t\t\t\t.reduce((accum, width) => accum + width, 0)\n\t\t\t\t: undefined,\n\t\t[state.columnWidths, frozenLeadingColumn, index],\n\t);\n\n\tconst right = useMemo(\n\t\t() =>\n\t\t\tfrozenTrailingColumn && index > 0\n\t\t\t\t? state.columnWidths\n\t\t\t\t\t\t.slice(index + 1)\n\t\t\t\t\t\t.reverse()\n\t\t\t\t\t\t.reduce((accum, width) => accum + width, 0)\n\t\t\t\t: undefined,\n\t\t[state.columnWidths, frozenTrailingColumn, index],\n\t);\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\talignRight: column.sortType === 'numeric',\n\t\tcolumnsOverflown: state.columnsOverflown,\n\t\tdisabled,\n\t\tfrozenLeadingColumn,\n\t\tfrozenTrailingColumn,\n\t\tlastFrozenLeadingColumn,\n\t\tfirstFrozenTrailingColumn,\n\t\tnoLabel: headerLabel == null || headerLabel === '',\n\t\tnonInteractive: !column.interactive && !column.sortable,\n\t\tresizing: isDragging,\n\t\tsortable: column.sortable,\n\t\tsorted: sortField === column.id,\n\t});\n\n\tuseDragGlobalStyles({enabled: isDragging, cursor: 'col-resize'});\n\n\t// TODO: make this a hook - the current drag hook we have (that i made early on) is garbage\n\t// When we start/stop dragging\n\tuseLayoutEffect(() => {\n\t\tif (!isDragging || disabled) return;\n\n\t\tconst mousemove = _.throttle(\n\t\t\t(event: MouseEvent): void => {\n\t\t\t\tsetColumnWidth(\n\t\t\t\t\tindex,\n\t\t\t\t\tcellWidthRef.current + (event.clientX - xStartRef.current),\n\t\t\t\t);\n\t\t\t},\n\t\t\t16,\n\t\t\t{trailing: true},\n\t\t);\n\n\t\tconst mouseup = () => setIsDragging(false);\n\t\tdocument.addEventListener('mousemove', mousemove);\n\t\tdocument.addEventListener('mouseup', mouseup);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousemove', mousemove);\n\t\t\tdocument.removeEventListener('mouseup', mouseup);\n\t\t};\n\t}, [isDragging, disabled]);\n\n\tconst handleMouseDown = useCallback(\n\t\t(event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n\t\t\tevent.stopPropagation();\n\t\t\tif (disabled) return;\n\t\t\tcellWidthRef.current = cellRef.current?.offsetWidth || 0;\n\t\t\txStartRef.current = event.clientX;\n\t\t\tsetIsDragging(true);\n\t\t},\n\t\t[disabled],\n\t);\n\n\treturn (\n\t\t<VirtualizedTableHeaderCellRoot\n\t\t\t{...column.getHeaderProps()}\n\t\t\t{...props}\n\t\t\taria-disabled={\n\t\t\t\t!column.interactive && !column.sortable ? 'true' : undefined\n\t\t\t}\n\t\t\tdata-type={column.sortType || 'string'}\n\t\t\tclassName={clsx(\n\t\t\t\tclasses.root,\n\t\t\t\t{\n\t\t\t\t\t'drag-resizing': isDragging,\n\t\t\t\t},\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\trole=\"columnheader\"\n\t\t\tref={cellRef}\n\t\t\tstyle={{\n\t\t\t\t...props.style,\n\t\t\t\tleft,\n\t\t\t\tright,\n\t\t\t\twidth: state.columnWidths[index],\n\t\t\t\tminWidth: state.columnWidths[index],\n\t\t\t}}\n\t\t>\n\t\t\t{!column.ColumnComponent ? (\n\t\t\t\t<VirtualizedTableHeaderCellLabel\n\t\t\t\t\tvariant=\"body2\"\n\t\t\t\t\tclassName={classes.label}\n\t\t\t\t\tnoWrap\n\t\t\t\t>\n\t\t\t\t\t{headerLabel}\n\t\t\t\t</VirtualizedTableHeaderCellLabel>\n\t\t\t) : (\n\t\t\t\t<column.ColumnComponent {...column} disableFocus={disableFocus} />\n\t\t\t)}\n\n\t\t\t{column.sortable || sortField === column.id ? (\n\t\t\t\t<VirtualizedTableHeaderCellSortIndicator\n\t\t\t\t\tactive={sortField === column.id}\n\t\t\t\t\torder={sortOrder}\n\t\t\t\t/>\n\t\t\t) : null}\n\n\t\t\t{/** no resizing fixed columns (at least for now) */}\n\t\t\t{!frozenLeadingColumn &&\n\t\t\t!frozenTrailingColumn &&\n\t\t\t!column.disableDragResize ? (\n\t\t\t\t<VirtualizedTableHeaderCellDragger onMouseDown={handleMouseDown} />\n\t\t\t) : null}\n\t\t</VirtualizedTableHeaderCellRoot>\n\t);\n};\n\nexport const VirtualizedTableHeaderCell = React.memo(\n\tVirtualizedTableHeaderCellPrimitive,\n) as <ItemData extends BaseItemData>(\n\tprops: VirtualizedTableHeaderCellProps<ItemData>,\n) => JSX.Element;\n\nexport default VirtualizedTableHeaderCell;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const CATEGORY_ID_RULE_EDITOR_CLASS_NAME = 'CategoryIdRuleEditor';\nexport const CATEGORY_ID_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type CategoryIdRuleEditorClassSlot =\n\ttypeof CATEGORY_ID_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface CategoryIdRuleEditorClasses {\n\troot: string;\n}\n\nexport type CategoryIdRuleClassKey = keyof CategoryIdRuleEditorClasses;\n\nexport const getCategoryIdRuleEditorUtilityClass = (\n\tslot: CategoryIdRuleEditorClassSlot,\n) => generateUtilityClass(CATEGORY_ID_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const categoryIdRuleEditorClasses: CategoryIdRuleEditorClasses =\n\tgenerateUtilityClasses(CATEGORY_ID_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default categoryIdRuleEditorClasses;\n","import React, {useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {CategoryAutoList} from '@netx/core-category/components/AutoList';\nimport {SelectField} from '@netx/core-components/Form/SelectField';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {SearchValueUnavailableLabel} from '../../../locales';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport type {CommonRuleEditorProps} from '../../../types';\nimport {CategoryType} from '../../constants';\nimport {getCategoryIdTypeLabel} from '../../utils';\nimport {\n\tcategoryIdRuleEditorClasses,\n\tgetCategoryIdRuleEditorUtilityClass,\n\tCategoryIdRuleEditorClasses,\n\tCATEGORY_ID_RULE_EDITOR_CLASS_NAME,\n} from './categoryIdRuleEditorClasses';\n\nexport type CategoryIdRuleEditorOwnerState = WithClasses<\n\tCategoryIdRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: CategoryIdRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getCategoryIdRuleEditorUtilityClass, classes);\n};\n\nconst CategoryIdRuleEditorRoot = styled('div', {\n\tname: CATEGORY_ID_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nexport type CategoryIdRuleEditorProps = WithClasses<\n\tCategoryIdRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: CategoryType;\n\t\telementSubType1Options: CategoryType[];\n\t\telementValue1: number;\n\t\telementValue1Unavailable: boolean;\n\t\telementValue1Label: string;\n\t\telementValue1Loading: boolean;\n\t\tonSubType1Change: (subType1: CategoryType) => void;\n\t\tonValue1Change: (value: number) => void;\n\t}\n>;\n\nconst CategoryIdRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementValue1,\n\telementValue1Label,\n\telementValue1Loading,\n\telementValue1Unavailable,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonValue1Change,\n}: CategoryIdRuleEditorProps) => {\n\tconst ownerState: CategoryIdRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst [categoryName, setCategoryName] = useState('');\n\n\tconst waitingForCategory = elementValue1Loading && categoryName === '';\n\n\tuseEffect(() => {\n\t\tsetCategoryName(elementValue1Label);\n\t}, [elementValue1Label]);\n\n\treturn (\n\t\t<CategoryIdRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<CategoryType, false, true, false>\n\t\t\t\tdata-testid=\"categoryid-rule-sub-type-1\"\n\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\toptions={elementSubType1Options}\n\t\t\t\tvalue={elementSubType1}\n\t\t\t\tonChange={onSubType1Change}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\tgetOptionLabel: getCategoryIdTypeLabel,\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<CategoryAutoList<false, true>\n\t\t\t\tdata-testid=\"categoryid-rule-value-1\"\n\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\tloadingValue={elementValue1Loading}\n\t\t\t\tmultiple={false}\n\t\t\t\tname={'rule-value-1'}\n\t\t\t\tplaceholder={\n\t\t\t\t\twaitingForCategory\n\t\t\t\t\t\t? 'loading...'\n\t\t\t\t\t\t: elementValue1Unavailable\n\t\t\t\t\t\t? SearchValueUnavailableLabel\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t\tvalue={\n\t\t\t\t\telementValue1Unavailable || waitingForCategory\n\t\t\t\t\t\t? (null as any)\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tlabel: categoryName,\n\t\t\t\t\t\t\t\tvalue: elementValue1,\n\t\t\t\t\t\t }\n\t\t\t\t}\n\t\t\t\tonChange={(value) => {\n\t\t\t\t\tif (!value) return;\n\t\t\t\t\tsetCategoryName(value.label);\n\t\t\t\t\tonValue1Change(value.value);\n\t\t\t\t}}\n\t\t\t\tInputLabelProps={{\n\t\t\t\t\tshrink: elementValue1Unavailable || undefined,\n\t\t\t\t}}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</CategoryIdRuleEditorRoot>\n\t);\n};\n\nexport const CategoryIdRuleEditorPrimitive = CategoryIdRuleEditorInner;\n\nexport const CategoryIdRuleEditor = CategoryIdRuleEditorPrimitive;\n\nexport default CategoryIdRuleEditor;\n\nexport type CategoryIdRuleEditorGenericProps = WithClasses<\n\tCategoryIdRuleEditorClasses,\n\tCommonRuleEditorProps\n>;\n\nexport const CategoryIdRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: CategoryIdRuleEditorGenericProps) => {\n\treturn (\n\t\t<CategoryIdRuleEditor\n\t\t\t{...props}\n\t\t\telementValue1={parseInt(elementValue1.toString())}\n\t\t/>\n\t);\n};\n\nexport const CategoryIdRuleEditorGeneric = CategoryIdRuleEditorGenericPrimitive;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const KEYWORD_RULE_EDITOR_CLASS_NAME = 'KeywordRuleEditor';\nexport const KEYWORD_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type KeywordRuleEditorClassSlot =\n\ttypeof KEYWORD_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface KeywordRuleEditorClasses {\n\troot: string;\n}\n\nexport type KeywordRuleEditorClassKey = keyof KeywordRuleEditorClasses;\n\nexport const getKeywordRuleEditorUtilityClass = (\n\tslot: KeywordRuleEditorClassSlot,\n) => generateUtilityClass(KEYWORD_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const keywordRuleEditorClasses: KeywordRuleEditorClasses =\n\tgenerateUtilityClasses(KEYWORD_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default keywordRuleEditorClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {SelectField, TextField} from '@netx/core-components/Form';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {KeywordType} from '../../constants';\nimport {getKeywordTypeLabel} from '../../utils';\nimport {\n\tkeywordRuleEditorClasses,\n\tgetKeywordRuleEditorUtilityClass,\n\tKeywordRuleEditorClasses,\n\tKEYWORD_RULE_EDITOR_CLASS_NAME,\n} from './keywordRuleEditorClasses';\n\nexport type KeywordRuleEditorOwnerState = WithClasses<\n\tKeywordRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: KeywordRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getKeywordRuleEditorUtilityClass, classes);\n};\n\nconst KeywordRuleEditorRoot = styled('div', {\n\tname: KEYWORD_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\t'& > * + *': {\n\t\tmarginLeft: `${theme.spacing(1)}`,\n\t},\n}));\n\nexport type KeywordRuleEditorProps = WithClasses<\n\tKeywordRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: KeywordType;\n\t\telementSubType1Options?: KeywordType[];\n\t\telementValue1: string;\n\t\tonSubType1Change: (subType1: KeywordType) => void;\n\t\tonValue1Change: (value: string) => void;\n\t}\n>;\n\nconst KeywordRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementValue1,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonValue1Change,\n}: KeywordRuleEditorProps) => {\n\tconst ownerState: KeywordRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst _elementSubType1Options = useMemo(\n\t\t() => elementSubType1Options || enumToValues(KeywordType),\n\t\t[elementSubType1Options],\n\t);\n\n\treturn (\n\t\t<KeywordRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<KeywordType, false, true, false>\n\t\t\t\tdata-testid=\"keyword-rule-sub-type-1\"\n\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\tmultiple={false}\n\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\toptions={_elementSubType1Options}\n\t\t\t\tvalue={elementSubType1}\n\t\t\t\tonChange={onSubType1Change}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\tgetOptionLabel: getKeywordTypeLabel,\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<TextField\n\t\t\t\tdata-testid=\"keyword-rule-value-1\"\n\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\tlabel={i18n.t('i18n.keywords')}\n\t\t\t\tname={'rule-value-1'}\n\t\t\t\tvalue={elementValue1.toString()}\n\t\t\t\tonChange={onValue1Change}\n\t\t\t/>\n\t\t</KeywordRuleEditorRoot>\n\t);\n};\n\nexport const KeywordRuleEditorPrimitive = KeywordRuleEditorInner;\n\nexport const KeywordRuleEditor = KeywordRuleEditorPrimitive;\n\nexport default KeywordRuleEditor;\n\nexport type KeywordRuleEditorGenericProps = WithClasses<\n\tKeywordRuleEditorClasses,\n\tCommonRuleEditorProps\n>;\n\nexport const KeywordRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: KeywordRuleEditorGenericProps) => {\n\treturn (\n\t\t<KeywordRuleEditor {...props} elementValue1={elementValue1.toString()} />\n\t);\n};\n\nexport const KeywordRuleEditorGeneric = KeywordRuleEditorGenericPrimitive;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const METADATA_RULE_EDITOR_CLASS_NAME = 'MetadataRuleEditor';\nexport const METADATA_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type MetadataRuleEditorClassSlot =\n\ttypeof METADATA_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface MetadataRuleEditorClasses {\n\troot: string;\n}\n\nexport type MetadataRuleEditorClassKey = keyof MetadataRuleEditorClasses;\n\nexport const getMetadataRuleEditorUtilityClass = (\n\tslot: MetadataRuleEditorClassSlot,\n) => generateUtilityClass(METADATA_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const metadataRuleEditorClasses: MetadataRuleEditorClasses =\n\tgenerateUtilityClasses(METADATA_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default metadataRuleEditorClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {useAttributes} from '@netx/core-attribute/hooks/useAttributes';\nimport {EditableAttribute} from '@netx/core-attribute/components/EditableAttribute';\nimport {ATTRIBUTE_SYSTEM_ID} from '@netx/core-attribute/constants';\nimport {SelectField} from '@netx/core-components/Form/SelectField';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport {SearchValueUnavailableLabel} from '../../../locales';\nimport type {CommonRuleEditorProps} from '../../../types';\nimport {MetadataType, MetadataNoValueTypes} from '../../constants';\nimport {getMetadataTypeLabel} from '../../utils';\nimport {\n\tmetadataRuleEditorClasses,\n\tgetMetadataRuleEditorUtilityClass,\n\tMetadataRuleEditorClasses,\n\tMETADATA_RULE_EDITOR_CLASS_NAME,\n} from './metadataRuleEditorClasses';\n\nexport type MetadataRuleEditorOwnerState = WithClasses<\n\tMetadataRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: MetadataRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getMetadataRuleEditorUtilityClass, classes);\n};\n\nconst MetadataRuleEditorRoot = styled('div', {\n\tname: METADATA_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tflex: '1 1 auto',\n}));\n\nconst MetadataRuleEditorCriteria = styled('div', {\n\tname: METADATA_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Criteria',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nconst MetadataRuleEditorValues = styled('div', {\n\tname: METADATA_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Values',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tmarginTop: theme.spacing(1),\n\t'& > * + *': {\n\t\tmarginLeft: `${theme.spacing(1)} !important`,\n\t},\n}));\n\ntype Option = {\n\tlabel: string;\n\tvalue: string;\n};\n\nexport type MetadataRuleEditorProps = WithClasses<\n\tMetadataRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: MetadataType;\n\t\telementSubType1Options?: MetadataType[];\n\t\t/** attribute value / range start */\n\t\telementValue1: string | number | string[];\n\t\t/** attribute name */\n\t\telementValue2: string;\n\t\t/** range end */\n\t\telementValue3: string | number;\n\t\telementValue2Unavailable?: boolean;\n\t\tonSubType1Change: (subType1: MetadataType) => void;\n\t\tonValue1Change: (value: string | number | string[]) => void;\n\t\tonValue2Change: (value: string) => void;\n\t\tonValue3Change: (value: string | number) => void;\n\t}\n>;\n\nconst SEARCHABLE_SYSTEM_ATTRIBUTES = [\n\tATTRIBUTE_SYSTEM_ID.assetId,\n\tATTRIBUTE_SYSTEM_ID.file,\n\tATTRIBUTE_SYSTEM_ID.name,\n\tATTRIBUTE_SYSTEM_ID.checksum,\n];\n\nconst MetadataRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementValue1,\n\telementValue2,\n\telementValue3,\n\telementValue2Unavailable,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonValue1Change,\n\tonValue2Change,\n\tonValue3Change,\n}: MetadataRuleEditorProps) => {\n\tconst ownerState: MetadataRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst {getAll, getLabelById, state} = useAttributes();\n\n\tconst attributes = useMemo(\n\t\t() =>\n\t\t\tgetAll().filter((attr) => {\n\t\t\t\treturn (\n\t\t\t\t\t!attr.system ||\n\t\t\t\t\tSEARCHABLE_SYSTEM_ATTRIBUTES.includes(attr.attributeid)\n\t\t\t\t);\n\t\t\t}),\n\t\t[state.data],\n\t);\n\n\tconst options = useMemo(\n\t\t() =>\n\t\t\tattributes\n\t\t\t\t.reduce<Option[]>((accum, attr) => {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t...accum,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: getLabelById(attr.attributeid),\n\t\t\t\t\t\t\tvalue: attr.name,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}, [])\n\t\t\t\t.sort((a, b) => a.label.localeCompare(b.label)),\n\t\t[attributes],\n\t);\n\n\tconst selectedAttribute =\n\t\t!elementValue2Unavailable &&\n\t\tattributes.find((attr) => attr.name === elementValue2);\n\n\tconst value = selectedAttribute\n\t\t? {\n\t\t\t\tlabel: getLabelById(selectedAttribute.attributeid),\n\t\t\t\tvalue: selectedAttribute.name,\n\t\t }\n\t\t: null;\n\n\tconst _elementSubType1Options = useMemo(\n\t\t() => elementSubType1Options || enumToValues(MetadataType),\n\t\t[elementSubType1Options],\n\t);\n\n\treturn (\n\t\t<MetadataRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<MetadataRuleEditorCriteria>\n\t\t\t\t<SelectField<Option, false, true, false>\n\t\t\t\t\tdata-testid=\"metadata-rule-value-2\"\n\t\t\t\t\terror={validationErrors?.elementValue2}\n\t\t\t\t\tlabel={i18n.t('i18n.selectAttribute')}\n\t\t\t\t\tlabelKey=\"label\"\n\t\t\t\t\tname={'rule-value-2'}\n\t\t\t\t\toptions={options}\n\t\t\t\t\tplaceholder={\n\t\t\t\t\t\telementValue2Unavailable ? SearchValueUnavailableLabel : undefined\n\t\t\t\t\t}\n\t\t\t\t\tvalue={value as Option}\n\t\t\t\t\tonChange={(option) => onValue2Change(option.value)}\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t}}\n\t\t\t\t\tInputLabelProps={{\n\t\t\t\t\t\tshrink: elementValue2Unavailable || undefined,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t{!elementValue2Unavailable ? (\n\t\t\t\t\t<SelectField<MetadataType, false, true, false>\n\t\t\t\t\t\tdata-testid=\"metadata-rule-sub-type-1\"\n\t\t\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\t\t\toptions={_elementSubType1Options}\n\t\t\t\t\t\tvalue={elementSubType1}\n\t\t\t\t\t\tonChange={onSubType1Change}\n\t\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t\t\tgetOptionLabel: getMetadataTypeLabel,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</MetadataRuleEditorCriteria>\n\n\t\t\t<MetadataRuleEditorValues>\n\t\t\t\t{selectedAttribute &&\n\t\t\t\t!(MetadataNoValueTypes as readonly number[]).includes(\n\t\t\t\t\telementSubType1,\n\t\t\t\t) ? (\n\t\t\t\t\t<EditableAttribute\n\t\t\t\t\t\tdata-testid=\"metadata-rule-value-1\"\n\t\t\t\t\t\tattrData={{\n\t\t\t\t\t\t\t...selectedAttribute,\n\t\t\t\t\t\t\tmandatory: 1,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\telementSubType1 === MetadataType.MATCH_ANY_RANGE\n\t\t\t\t\t\t\t\t? i18n.t('i18n.from')\n\t\t\t\t\t\t\t\t: i18n.t('i18n.value')\n\t\t\t\t\t\t}\n\t\t\t\t\t\tname={'rule-value-1'}\n\t\t\t\t\t\tvalue={elementValue1 === '' ? null : elementValue1}\n\t\t\t\t\t\tonValueChange={\n\t\t\t\t\t\t\t(value1) => onValue1Change(value1 == null ? '' : (value1 as any)) // TODO: fix typing\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\n\t\t\t\t{selectedAttribute &&\n\t\t\t\t[MetadataType.MATCH_ANY_RANGE].includes(elementSubType1) ? (\n\t\t\t\t\t<EditableAttribute\n\t\t\t\t\t\tdata-testid=\"metadata-rule-value-3\"\n\t\t\t\t\t\tattrData={{\n\t\t\t\t\t\t\t...selectedAttribute,\n\t\t\t\t\t\t\tmandatory: 1,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\terror={validationErrors?.elementValue3}\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\telementSubType1 === MetadataType.MATCH_ANY_RANGE\n\t\t\t\t\t\t\t\t? i18n.t('i18n.to')\n\t\t\t\t\t\t\t\t: i18n.t('i18n.value')\n\t\t\t\t\t\t}\n\t\t\t\t\t\tname={'rule-value-3'}\n\t\t\t\t\t\tvalue={elementValue3 === '' ? null : elementValue3}\n\t\t\t\t\t\tonValueChange={(value3: string | number) =>\n\t\t\t\t\t\t\tonValue3Change(value3 == null ? '' : value3)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</MetadataRuleEditorValues>\n\t\t</MetadataRuleEditorRoot>\n\t);\n};\n\nexport const MetadataRuleEditorPrimitive = MetadataRuleEditorInner;\n\nexport const MetadataRuleEditor = MetadataRuleEditorPrimitive;\n\nexport default MetadataRuleEditor;\n\nexport type MetadataRuleEditorGenericProps = WithClasses<\n\tMetadataRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nexport const MetadataRuleEditorGenericPrimitive = ({\n\telementValue2,\n\t...props\n}: MetadataRuleEditorGenericProps) => {\n\treturn (\n\t\t<MetadataRuleEditor {...props} elementValue2={elementValue2.toString()} />\n\t);\n};\n\nexport const MetadataRuleEditorGeneric = MetadataRuleEditorGenericPrimitive;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const CART_RULE_EDITOR_CLASS_NAME = 'CartRuleEditor';\nexport const CART_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type CartRuleEditorClassSlot =\n\ttypeof CART_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface CartRuleEditorClasses {\n\troot: string;\n}\n\nexport type CartRuleEditorClassKey = keyof CartRuleEditorClasses;\n\nexport const getCartRuleEditorUtilityClass = (slot: CartRuleEditorClassSlot) =>\n\tgenerateUtilityClass(CART_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const cartRuleEditorClasses: CartRuleEditorClasses =\n\tgenerateUtilityClasses(CART_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default cartRuleEditorClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\nimport {SelectField} from '@netx/core-components/Form/SelectField';\nimport {useSavedCarts} from '@netx/core-cart-saved';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {\n\tcartRuleEditorClasses,\n\tgetCartRuleEditorUtilityClass,\n\tCartRuleEditorClasses,\n\tCART_RULE_EDITOR_CLASS_NAME,\n} from './cartRuleEditorClasses';\n\nexport type CartRuleEditorOwnerState = WithClasses<CartRuleEditorClasses, {}>;\n\nconst useUtilityClasses = (ownerState: CartRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getCartRuleEditorUtilityClass, classes);\n};\n\nconst CartRuleEditorRoot = styled('div', {\n\tname: CART_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n}));\n\ntype OptionParams = {\n\tlabels: {\n\t\t[k: number]: string;\n\t};\n\tids: number[];\n};\n\nexport type CartRuleEditorProps = WithClasses<\n\tCartRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nconst CartRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementValue1,\n\tonSubType1Change,\n}: CartRuleEditorProps) => {\n\tconst ownerState: CartRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst {savedCarts} = useSavedCarts();\n\n\tconst options = useMemo(() => {\n\t\treturn savedCarts.reduce<OptionParams>(\n\t\t\t(accum, savedCart, index) => {\n\t\t\t\treturn {\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\t...accum.labels,\n\t\t\t\t\t\t[savedCart.id]: savedCart.title,\n\t\t\t\t\t},\n\t\t\t\t\tids: [...accum.ids, savedCart.id],\n\t\t\t\t};\n\t\t\t},\n\t\t\t{labels: {}, ids: []},\n\t\t);\n\t}, [savedCarts]);\n\n\treturn (\n\t\t<CartRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<number, false, true, false>\n\t\t\t\tdata-testid=\"cart-rule-value-1\"\n\t\t\t\toptions={options.ids}\n\t\t\t\tlabel=\"Saved Cart\"\n\t\t\t\tname={'rule-value-1'}\n\t\t\t\tonChange={onSubType1Change}\n\t\t\t\tvalue={(elementValue1 as number) || undefined}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\tgetOptionLabel: (option) => options.labels[option],\n\t\t\t\t}}\n\t\t\t/>\n\t\t</CartRuleEditorRoot>\n\t);\n};\n\nexport const CartRuleEditorPrimitive = CartRuleEditorInner;\n\nexport const CartRuleEditor = CartRuleEditorPrimitive;\n\nexport default CartRuleEditor;\n","import {CategoryType} from '../constants';\nimport {CategoryIdTypeLabel} from '../locales';\n\nexport const getCategoryIdTypeLabel = (type: CategoryType) =>\n\tCategoryIdTypeLabel[type];\n\nexport default getCategoryIdTypeLabel;\n","export default function cellKeyboardNavigation(plugin) {\n\tconst grid = plugin;\n\n\tlet wasEditing;\n\n\tconst cs = grid.lookupFeature('CellSelection');\n\tcs.handleRIGHT = (grid, e) => {\n\t\t// Store for whether or not to edit on next cell\n\t\twasEditing = e.editor !== void 0;\n\t\tgrid.moveSingleSelect(1, 0);\n\t};\n\tcs.handleLEFT = (grid, e) => {\n\t\t// Store for whether or not to edit on next cell\n\t\twasEditing = e.editor !== void 0;\n\t\tgrid.moveSingleSelect(-1, 0);\n\t};\n\n\tgrid.moveSingleSelect = (offsetX, offsetY) => {\n\t\t// We are in the context of the grid\n\t\tconst columnCount = grid.getColumnCount();\n\t\tconst mouseCorner = grid.getMouseDown().plus(grid.getDragExtent());\n\t\tconst rowCount = grid.getRowCount();\n\n\t\tlet newX = mouseCorner.x + offsetX;\n\t\tlet newY = mouseCorner.y + offsetY;\n\n\t\t// Go to next row\n\t\tif (newX >= columnCount) {\n\t\t\tnewX = 0;\n\t\t\tnewY++;\n\t\t}\n\t\t// Go to previous row\n\t\telse if (newX < 0) {\n\t\t\tnewX = columnCount - 1;\n\t\t\tnewY--;\n\t\t}\n\n\t\t// Go to last row\n\t\tif (newY < 0) {\n\t\t\tnewY = rowCount - 1;\n\t\t}\n\t\t// Go to first row\n\t\telse if (newY >= rowCount) {\n\t\t\tnewY = 0;\n\t\t}\n\n\t\tgrid.moveToSingleSelect(newX, newY);\n\n\t\tif (!this.readOnly && wasEditing) {\n\t\t\t// The frustrations. Notice we have to add 1 to y here but not for selection...\n\t\t\tgrid.editAt(new grid.behavior.CellEvent(newX, newY + 1));\n\t\t}\n\t\twasEditing = false;\n\t};\n}\n","import _ from 'underscore';\n\nexport default function scrollHack(plugin) {\n\tconst grid = plugin;\n\tlet currentDeltaProp;\n\n\t// Every 32 ms of scroll silence will give a direction a chance to become the main delta\n\tconst resetCurrentDeltaTimeout = _.debounce(() => {\n\t\tcurrentDeltaProp = null;\n\t}, 32);\n\n\t// Slow down will ya?\n\tconst scroll = _.throttle((scrollBar, delta) => {\n\t\tscrollBar.index += delta;\n\t}, 16);\n\n\tconst fixScrollBar = (scrollBar) => {\n\t\t// Mousewheel triggered\n\t\tconst scrolled = (bar, evt) => {\n\t\t\tconst deltaProp = scrollBar.deltaProp;\n\t\t\tconst delta = evt[deltaProp];\n\n\t\t\t// Store our max scroll extents\n\t\t\tif (deltaProp === 'deltaX') {\n\t\t\t\tgrid._maxScrollX = scrollBar._max;\n\t\t\t} else {\n\t\t\t\tgrid._maxScrollY = scrollBar._max;\n\t\t\t}\n\n\t\t\t// Can we be the main delta?\n\t\t\t// Having an event for a delta of 0/-0 is odd imo\n\t\t\tif ((!currentDeltaProp && delta > 1) || delta < -1) {\n\t\t\t\tcurrentDeltaProp = deltaProp;\n\t\t\t}\n\n\t\t\t// If we are the main delta then we get to scroll\n\t\t\tif (currentDeltaProp === deltaProp) {\n\t\t\t\t// Turn it down a lot - anything over 20x less starts to be negatively noticeable\n\t\t\t\tscroll(scrollBar, delta / 20);\n\t\t\t\t(delta >= 1 || delta <= -1) && resetCurrentDeltaTimeout();\n\t\t\t}\n\n\t\t\tevt.stopPropagation();\n\t\t\tevt.preventDefault();\n\t\t};\n\n\t\t// See finbars\n\t\tif (scrollBar.deltaProp !== null) {\n\t\t\tconst container = scrollBar.container || scrollBar.bar.parentElement;\n\t\t\tcontainer.removeEventListener('wheel', scrollBar._bound.onwheel);\n\t\t\tcontainer.addEventListener('wheel', (evt) => {\n\t\t\t\tscrolled(scrollBar, evt);\n\t\t\t});\n\t\t\tscrollBar._bound.onwheel = (evt) => {\n\t\t\t\tevt.stopPropagation();\n\t\t\t\tevt.preventDefault();\n\t\t\t};\n\t\t} else {\n\t\t\tscrollBar._bound.onwheel = (evt) => {\n\t\t\t\tscrolled(scrollBar, evt);\n\t\t\t};\n\t\t}\n\t};\n\n\tfixScrollBar(grid.sbHScroller);\n\tfixScrollBar(grid.sbVScroller);\n}\n","import type {SearchRules} from '../../types';\nimport {SearchTypeCart} from '../';\n\n/**\n * Check if rules contain current cart\n * @param searchRules Search rules\n * @param id Cart id\n * @returns\n */\nexport const rulesContainCart = (searchRules: SearchRules, id: number) =>\n\tsearchRules.elementTypes.some(\n\t\t(elementType, index) =>\n\t\t\telementType === SearchTypeCart &&\n\t\t\tsearchRules.elementValue1s[index] === id,\n\t);\n\nexport default rulesContainCart;\n","import type {SearchRules} from '../../types';\nimport {rulesContainCart} from './rulesContainCart';\n\n/**\n * Check if rules contain current cart\n * @param searchRules Search rules\n * @returns Contains current cart\n */\nexport const rulesContainCurrentCart = (searchRules: SearchRules) =>\n\trulesContainCart(searchRules, 0);\n\nexport default rulesContainCurrentCart;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface VirtualizedTableRowCellClasses {\n\troot: string;\n\talignRight: string;\n\tcolumnsOverflown: string;\n\tfirstFrozenTrailingColumn: string;\n\tfrozenLeadingCell: string;\n\tfrozenTrailingCell: string;\n\tlastFrozenLeadingColumn: string;\n}\n\nexport const getVirtualizedTableRowCellUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('VirtualizedTableRowCell', slot);\n\nexport const virtualizedTableRowCellClasses = generateUtilityClasses<\n\tkeyof VirtualizedTableRowCellClasses\n>('VirtualizedTableRowCell', [\n\t'root',\n\t'alignRight',\n\t'columnsOverflown',\n\t'firstFrozenTrailingColumn',\n\t'frozenLeadingCell',\n\t'frozenTrailingCell',\n\t'lastFrozenLeadingColumn',\n]);\nexport default virtualizedTableRowCellClasses;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport type {Row} from 'react-table';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport type {BaseItemData, Cell} from '../../types';\nimport {\n\tvirtualizedTableRowCellClasses,\n\tgetVirtualizedTableRowCellUtilityClass,\n\tVirtualizedTableRowCellClasses,\n} from './virtualizedTableRowCellClasses';\n\ntype VirtualizedTableRowCellUtilityClassesProps = WithClasses<\n\tVirtualizedTableRowCellClasses,\n\t{\n\t\talignRight?: boolean;\n\t\tfrozenLeadingCell?: boolean;\n\t\tfrozenTrailingCell?: boolean;\n\t\tfirstFrozenTrailingColumn?: boolean;\n\t\tlastFrozenLeadingColumn?: boolean;\n\t\tcolumnsOverflown?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (\n\townerState: VirtualizedTableRowCellUtilityClassesProps,\n) => {\n\tconst {\n\t\talignRight,\n\t\tclasses,\n\t\tcolumnsOverflown,\n\t\tfirstFrozenTrailingColumn,\n\t\tfrozenLeadingCell,\n\t\tfrozenTrailingCell,\n\t\tlastFrozenLeadingColumn,\n\t} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\talignRight && 'alignRight',\n\t\t\tcolumnsOverflown && 'columnsOverflown',\n\t\t\tfirstFrozenTrailingColumn && 'firstFrozenTrailingColumn',\n\t\t\tfrozenLeadingCell && 'frozenLeadingCell',\n\t\t\tfrozenTrailingCell && 'frozenTrailingCell',\n\t\t\tlastFrozenLeadingColumn && 'lastFrozenLeadingColumn',\n\t\t],\n\t};\n\treturn composeClasses(slots, getVirtualizedTableRowCellUtilityClass, classes);\n};\n\nconst VirtualizedTableRowCellRoot = styled('div', {\n\tname: 'VirtualizedTableRowCell',\n\tslot: 'Root',\n})(({theme}) => ({\n\tbackgroundColor: theme.palette.background.paper,\n\tpadding: theme.spacing(0, 1),\n\tdisplay: 'flex',\n\talignItems: 'center',\n\theight: '100%',\n\t[`&.${virtualizedTableRowCellClasses.alignRight}`]: {\n\t\tjustifyContent: 'flex-end',\n\t},\n\t[`&.${virtualizedTableRowCellClasses.frozenLeadingCell}, &.${virtualizedTableRowCellClasses.frozenTrailingCell}`]: {\n\t\t...theme.mixins.positionSticky,\n\t\tzIndex: 3,\n\t},\n\t[`&:not(.${virtualizedTableRowCellClasses.frozenLeadingCell}):not(.${virtualizedTableRowCellClasses.frozenTrailingCell})`]: {\n\t\tpadding: theme.spacing(0, 2),\n\t},\n\t[`&.${virtualizedTableRowCellClasses.frozenLeadingCell}`]: {\n\t\tleft: 0,\n\t\t[`&.${virtualizedTableRowCellClasses.lastFrozenLeadingColumn}.${virtualizedTableRowCellClasses.columnsOverflown}`]: {\n\t\t\tborderRight: `1px dotted ${theme.palette.custom.border}`,\n\t\t},\n\t},\n\t[`&.${virtualizedTableRowCellClasses.frozenTrailingCell}`]: {\n\t\tright: 0,\n\t\t[`&.${virtualizedTableRowCellClasses.firstFrozenTrailingColumn}.${virtualizedTableRowCellClasses.columnsOverflown}`]: {\n\t\t\tborderLeft: `1px dotted ${theme.palette.custom.border}`,\n\t\t},\n\t},\n}));\n\nexport type VirtualizedTableCellProps<ItemData extends BaseItemData> = {\n\tcell: Cell<ItemData>;\n\tcolumnCount: number;\n\tcolumnWidths: number[];\n\tcolumnsOverflown: boolean;\n\tdisableFocus?: boolean;\n\tindex: number;\n\tleft?: number;\n\tright?: number;\n\tfirstFrozenTrailing?: boolean;\n\tlastFrozenLeading?: boolean;\n\tfrozenLeading?: boolean;\n\tfrozen?: boolean;\n\tfrozenTrailing?: boolean;\n\treadOnly?: boolean;\n\tviewportWidth: number;\n\tisClone?: boolean;\n\tvisible?: boolean;\n};\n\n/**\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nexport interface VirtualizedTableRowCellProps<ItemData extends BaseItemData>\n\textends React.DetailedHTMLProps<\n\t\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\t\tHTMLDivElement\n\t\t>,\n\t\tWithClasses<\n\t\t\tVirtualizedTableRowCellClasses,\n\t\t\tVirtualizedTableCellProps<ItemData> & {\n\t\t\t\tgetCellProps?: (\n\t\t\t\t\trowIndex: number,\n\t\t\t\t\tcolumnIndex: number,\n\t\t\t\t\trow: Row<ItemData>,\n\t\t\t\t) => Partial<VirtualizedTableCellProps<ItemData>>;\n\t\t\t}\n\t\t> {}\n\n/**\n * Virtualized table row cell\\\n * This component should not be called directly outside of `VirtualizedTableRow`\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nexport const VirtualizedTableRowCellPrimitive = <\n\tItemData extends BaseItemData\n>({\n\tclasses: _classes,\n\tclassName,\n\tindex,\n\tcell,\n\tcolumnWidths,\n\tcolumnsOverflown,\n\tfrozen,\n\tfrozenLeading,\n\tfrozenTrailing,\n\tfirstFrozenTrailing,\n\tlastFrozenLeading,\n\tdisableFocus,\n\tisClone,\n\tleft,\n\tright,\n\treadOnly,\n\tvisible,\n\tgetCellProps,\n\t...props\n}: VirtualizedTableRowCellProps<ItemData>) => {\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\talignRight: cell.column.sortType === 'numeric',\n\t\tfrozenLeadingCell: frozenLeading,\n\t\tlastFrozenLeadingColumn: lastFrozenLeading,\n\t\tfrozenTrailingCell: frozenTrailing,\n\t\tfirstFrozenTrailingColumn: firstFrozenTrailing,\n\t\tcolumnsOverflown,\n\t});\n\n\tconst cellProps = cell.getCellProps();\n\n\treturn (\n\t\t<VirtualizedTableRowCellRoot\n\t\t\taria-colindex={index}\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tdata-id={`${cell.column.id}`}\n\t\t\t{...cellProps}\n\t\t\tstyle={{\n\t\t\t\t...cellProps.style,\n\t\t\t\twidth: columnWidths[index],\n\t\t\t\tminWidth: columnWidths[index],\n\t\t\t\tleft,\n\t\t\t\tright,\n\t\t\t}}\n\t\t>\n\t\t\t{visible === false\n\t\t\t\t? null\n\t\t\t\t: cell.render('Cell', {\n\t\t\t\t\t\tdisableFocus,\n\t\t\t\t\t\treadOnly,\n\t\t\t\t\t\tisClone,\n\t\t\t\t\t\t...props,\n\t\t\t\t })}\n\t\t</VirtualizedTableRowCellRoot>\n\t);\n};\n\n/**\n * Memo-ized Virtualized table row cell\\\n * This component should not be called directly outside of `VirtualizedTableRow`\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nexport const VirtualizedTableRowCell = React.memo(\n\tVirtualizedTableRowCellPrimitive,\n) as <ItemData extends BaseItemData>(\n\tprops: VirtualizedTableRowCellProps<ItemData>,\n) => JSX.Element;\n\nexport default VirtualizedTableRowCell;\n","/**\n * @class\n * @extends Netx.Models.SearchRule\n */\nimport Base from './searchRule';\n\nexport default class SearchRule_Clip extends Base {\n\t/**\n\t * What search type are we dealing with\n\t * @type {string}\n\t * @default\n\t */\n\tget searchApi() {\n\t\treturn 'clips';\n\t}\n\n\t/** @type {object} */\n\tget defaults() {\n\t\treturn _.extend(super.defaults, {\n\t\t\telementType: 101, // KEYWORD\n\t\t\telementSubType1: 4, // AND matching of keywords\n\t\t\telementSubType2: 0,\n\t\t\telementValue1: 'supernatural',\n\t\t\telementValue2: '',\n\t\t\telementValue3: '',\n\t\t});\n\t}\n\n\t/**\n\t * Is this rule searching on dynamic metadata?\n\t * (as opposed to system metadata or any other type of search.)\n\t * @method\n\t * @return {boolean}\n\t */\n\tsearchTargetIsMetadata() {\n\t\treturn (\n\t\t\tthis.get('elementType') == 3 &&\n\t\t\t!_.isUndefined(\n\t\t\t\tNetx.asset.attributes.findWhere({name: this.get('elementValue2')}),\n\t\t\t)\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchRule_Clip';\n\t}\n}\n","/** @class */\nimport Base from './searchRules';\nimport Model from '../models/searchRule_clip';\n\nimport customConfig from '../config';\n\nexport default class SearchRules_clips extends Base {\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\topts.sortField = opts.sortField || 'relevance';\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * @type {number}\n\t\t */\n\t\tthis.maxItems = opts.maxItems || customConfig.CHUNK_SIZE + 1;\n\n\t\t/**\n\t\t * @memberOf Netx.Collections.SearchRules_clips\n\t\t * @alias userPrefKeys\n\t\t * @type {object}\n\t\t */\n\t\tthis.userPrefKeys = _.extend(\n\t\t\t{\n\t\t\t\tsortField: 'asset.constituent.videoClips.sort.field',\n\t\t\t\tsortOrder: 'asset.constituent.videoClips.sort.order',\n\t\t\t},\n\t\t\topts.userPrefKeys,\n\t\t);\n\t}\n\n\t/**\n\t * Intialize the Asset Search Object Properties\n\t * @override\n\t * @param {object} opts Properties to set\n\t */\n\tinitProperties(opts = {}) {\n\t\tif (opts.maxItems != null) {\n\t\t\tconsole.warn(\n\t\t\t\t'Error: attempting to set maxItems in search rules collection, but it will be ignored. Set pageSize or chunkSize on asset collection instead.',\n\t\t\t);\n\t\t\tdelete opts.maxItems;\n\t\t}\n\n\t\treturn super.initProperties(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchRules_clips';\n\t}\n}\n","import {KeywordType} from '../constants';\nimport {KeywordTypeLabel} from '../locales';\n\nexport const getKeywordTypeLabel = (type: KeywordType) =>\n\tKeywordTypeLabel[type];\n\nexport default getKeywordTypeLabel;\n","import React from 'react';\n\nimport GenericCell from './Generic';\n\nimport type {BaseItemData, CellProps} from '../../types';\n\nimport {\n\tFontAwesomeIcon,\n\tFontAwesomeIconProps,\n} from '@fortawesome/react-fontawesome';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t},\n\t\ticon: {\n\t\t\tflex: '0 0 auto',\n\t\t\tpaddingRight: 8,\n\t\t\topacity: 0.5,\n\t\t},\n\t});\n\nexport interface GenericIconCellProps<ItemData extends BaseItemData>\n\textends CellProps<ItemData> {\n\ticon: FontAwesomeIconProps['icon'];\n}\n\nconst GenericIconCellPrimitive = <ItemData extends BaseItemData>({\n\tclasses,\n\ticon,\n\trow,\n\t...props\n}: WithStyles<typeof styles> & GenericIconCellProps<ItemData>) => {\n\treturn (\n\t\t<div className={classes.root}>\n\t\t\t<div className={classes.icon}>\n\t\t\t\t<FontAwesomeIcon icon={icon} />\n\t\t\t</div>\n\t\t\t<GenericCell row={row} {...props} />\n\t\t</div>\n\t);\n};\n\nexport const GenericIconCell = withStyles(styles)(\n\tReact.memo(GenericIconCellPrimitive),\n) as <ItemData extends BaseItemData>(\n\tprops: GenericIconCellProps<ItemData>,\n) => JSX.Element;\nexport default GenericIconCell;\n","import React, {useCallback} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport AutoListField, {\n\tCommenExtendProps,\n} from '@netx/core-components/Form/AutoListField';\nimport Tooltip from '@netx/core-components/Tooltip';\nimport getCategoryAutoList, {\n\tCategoryAutoListItem,\n} from '../../api/getCategoryAutoList';\nexport {CategoryAutoListItem} from '../../api/getCategoryAutoList';\n\nexport type CategoryAutoListRef = React.ForwardedRef<HTMLDivElement>;\n\nexport type CategoryAutoListProps<\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false\n> = CommenExtendProps<\n\tCategoryAutoListItem,\n\tMultiple,\n\tDisableClearable,\n\tfalse\n> & {\n\tfilterCategories?: (groups: CategoryAutoListItem[]) => CategoryAutoListItem[];\n\tpermissionMatrixLevel?: number;\n\tpath?: string;\n};\n\nconst getOptionLabel = (option: CategoryAutoListItem) => option?.label;\nconst getOptionSelected = (\n\toption?: CategoryAutoListItem,\n\tvalue?: CategoryAutoListItem,\n) => {\n\treturn option?.value === value?.value;\n};\n\nconst CategoryAutoListInner = <\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false\n>(\n\t{\n\t\tfilterCategories,\n\t\tpermissionMatrixLevel,\n\t\tpath,\n\t\t...props\n\t}: CategoryAutoListProps<Multiple, DisableClearable>,\n\tref: CategoryAutoListRef,\n) => {\n\tconst handleLookup = useCallback(\n\t\tasync (query) => {\n\t\t\tconst categories = await getCategoryAutoList({\n\t\t\t\tquery,\n\t\t\t\tpermissionMatrixLevel,\n\t\t\t});\n\t\t\treturn filterCategories ? filterCategories(categories) : categories;\n\t\t},\n\t\t[filterCategories, permissionMatrixLevel],\n\t);\n\n\treturn (\n\t\t<Tooltip title={path || ''} placement=\"top-start\">\n\t\t\t<AutoListField<CategoryAutoListItem, Multiple, DisableClearable>\n\t\t\t\tref={ref}\n\t\t\t\tname=\"category-auto-list\"\n\t\t\t\tonLookup={handleLookup}\n\t\t\t\tlabel={i18n.t('i18n.category')}\n\t\t\t\tplaceholder={i18n.t('i18n.pleaseSelect')}\n\t\t\t\t{...props}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tgetOptionLabel,\n\t\t\t\t\tisOptionEqualToValue: getOptionSelected,\n\t\t\t\t\t...props?.AutocompleteProps,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</Tooltip>\n\t);\n};\n\nexport const CategoryAutoListPrimitive = React.forwardRef(\n\tCategoryAutoListInner,\n) as <\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false\n>(\n\tprops: CategoryAutoListProps<Multiple, DisableClearable>,\n\tref: CategoryAutoListRef,\n) => JSX.Element;\n\nexport const CategoryAutoList = CategoryAutoListPrimitive;\n\nexport default CategoryAutoList;\n","import type {Asset} from '@netx/core-asset/types';\nimport {\n\tallows,\n\tPermissionMatrixName,\n} from '@netx/core-permissions/utils/allows';\nimport {\n\tcurrentUserMeetsUserLevel,\n\tUserLevel,\n} from '@netx/core-user/utils/currentUserMeetsUserLevel';\n\nexport const canExportPages = (asset?: Asset) =>\n\tasset != null &&\n\tasset.filetypelabel === 'pdf' &&\n\t// TODO: the server is still making us check this for downloading\n\t// even though the server wil lallow a download if the asset\n\t// permissions says so - despite the claim that enhanced acls\n\t// should not be able to promote a user level\n\tcurrentUserMeetsUserLevel(UserLevel.CONSUMER) &&\n\tallows(asset.permissionMatrix, PermissionMatrixName.DOWNLOAD);\n\nexport const canViewPDF = (asset?: Asset) =>\n\tasset != null &&\n\t(asset.filetypelabel === 'pdf' || asset.viewNames.includes('previewPDF'));\n","export let checkinErrors = {\n\t'4100': i18n.t('i18n.errorVersionDuplicate_4100'),\n\t'4101': i18n.t('i18n.errorVersionDuplicate_4101'),\n\t'4102': i18n.t('i18n.errorVersionDuplicate_4102'),\n\tdefault: i18n.t('i18n.errorVersionDuplicate_default'),\n};\n\nexport default {\n\tcheckinErrors,\n};\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class ABCustomization extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {string} defaults.id - Unique ID of a customization\n\t * @property {string} defaults.assetId - Customization asset id\n\t * @property {array} defaults.blocks - Collection of block models for this page\n\t * @property {string} defaults.description - displayed in search, built from first h2\n\t * @property {string} defaults.label - mutable unique key\n\t * @property {boolean} defaults.locked - Locked\n\t * @property {string} defaults.previewUrl - Preview URL\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t// id: 0,\n\t\t\tassetId: 0,\n\t\t\tblocks: [],\n\t\t\tdescription: '',\n\t\t\tlabel: '',\n\t\t\tlocked: false,\n\t\t\tpreviewUrl: '',\n\t\t};\n\t}\n\n\t/**\n\t * RPC methods:\n\t * @rpcs\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @method */\n\t\t\tread: ['getAdBuilderCustomization', 'id'],\n\t\t\t/** @method */\n\t\t\tremove: ['deleteAdBuilderCustomization', 'id'],\n\t\t\t/** @method save */\n\t\t\tcreate(opts) {\n\t\t\t\treturn ['setAdBuilderCustomization', this.self()];\n\t\t\t},\n\t\t\t/** @method */\n\t\t\tupdate(opts) {\n\t\t\t\treturn ['setAdBuilderCustomization', this.self()];\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABCustomization';\n\t}\n}\n","/**\n * Simple prompt dialog view, with no model. Utilized by the {@link module:app#app:prompt|app:prompt} event\n * @class\n * @todo This view is taking advantage of a stupid thing in doTemplate, where if there is no model or collection it extends this whole view onto the template\n * that will be going away as soon as all views taking advantage of this are corrected.\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/promptView.html';\n\nimport Form from '@netx/core/functionality/form';\n\nclass PromptView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = `prompt-view ${opts.className || ''}`;\n\t\topts.eventStr = opts.eventStr || 'app';\n\t\topts.events = {\n\t\t\t'click button[name=\"cancel\"]': 'returnFalse',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.hideOnSubmit = opts.hideOnSubmit !== false;\n\t\topts.id = opts.id || _.uniqueId('app-prompt-');\n\t\topts.modalOptions = {\n\t\t\tsize: 'md',\n\t\t\t...opts.modalOptions,\n\t\t};\n\t\topts.removeOnHide = opts.removeOnHide !== false;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tthis.cancelLabel = opts.cancelLabel || i18n.t('i18n.cancel');\n\t\tthis.classes = opts.classes || '';\n\t\tthis.placeholder = opts.placeholder || '';\n\t\t// TODO: this was a bad idea - the name - it collides with another global window.prompt\n\t\tthis.prompt = opts.prompt || i18n.t('i18n.needInfoBeforeProceeding');\n\t\tthis.required = opts.required !== false;\n\t\tthis.submitLabel = opts.submitLabel || i18n.t('i18n.submit');\n\t\tthis.value = opts.value || '';\n\n\t\t// Add to template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\trequired: this.required,\n\t\t\tsubmitLabel: this.submitLabel,\n\t\t\tcancelLabel: this.cancelLabel,\n\t\t\tplaceholder: this.placeholder,\n\t\t\tpromptMessage: this.prompt,\n\t\t\tvalue: this.value,\n\t\t\t// Just in case someone tries the old way\n\t\t\ttitle: this.headerTitle,\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Will not work without a delay and I have no time to figure out why. Most likely due to the fact it is in a modal and it takes 300 ms to be visible -jse-\n\t\t_.delay(() => {\n\t\t\tthis.focus(this.$(':input:not(button):first'));\n\t\t}, 501);\n\t}\n\n\t/**\n\t * Do not confirm unsaved changes with prompt views\n\t * @override\n\t */\n\tunsavedChanges() {\n\t\treturn false;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'PromptView';\n\t}\n}\n\n// Functionality\nForm(PromptView);\n\nexport default PromptView;\n","import Base from '@netx/core-app/views/promptView';\nimport MaterialCheckboxes from '@netx/core/functionality/materialCheckboxes';\n\nimport {faCheck} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaCheck,\n});\n\nexport default class PromptView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n}\n\nMaterialCheckboxes(PromptView);\n","if (process.env.NODE_ENV === 'production') {\n module.exports = require('./dist/react-table.production.min.js')\n} else {\n module.exports = require('./dist/react-table.development.js')\n}\n","/**\n * Asset Permission model.\n * The DOM defines Many of the integer values in this model com.netxposure.products.imageportal.acl.Constants.\n * @class\n * @note Per Jason W, this model will manage i18n of the various permission labels.\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport {\n\tpermissionLabels,\n\ttargetIds as permissionTargetIds,\n} from '../properties/assetPermissions';\n\nexport default class AssetPermission extends Base {\n\t/** @lends */\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'entryId';\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @type {object}\n\t */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tdeleteAclEntry: 'Deleting permission',\n\t\t\tsetAclEntry: 'Updating permissions',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {number} defaults.pastPosition - The default permission past position\n\t * @property {number} defaults.permission - The default permission ( 1=read, 2=download, 3=add, 5=modify, 7=delete, 9=all )\n\t * @property {string} defaults.permissionLabel - The defualt permission label\n\t * @property {number} defaults.position - The defualt permission position\n\t * @property {number} defaults.principal - The defualt permission principal\n\t * @property {number} defaults.principalId - The defualt permission principal id\n\t * @property {string} defaults.principalLabel - The defualt permission principal label\n\t * @property {boolean} defaults.recursive - The defualt permission recursive\n\t * @property {string} defaults.recursiveLabel - The defualt permission recursive label\n\t * @property {number} defaults.status - The defualt permission status\n\t * @property {number} defaults.target - The defualt permission target ( 0 = category, 1 = asset )\n\t * @property {number} defaults.targetId - The defualt permission target id\n\t * @property {string} defaults.targetLabel - The defualt permission target label\n\t * @property {number} defaults.type - The defualt permission type ( 1 = permit, 0 = deny )\n\t * @property {string} defaults.typeLabel - The defualt permission type label\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t//entryId: 0,\n\t\t\tpastPosition: 0,\n\t\t\tpermission: 9,\n\t\t\tpermissionLabel: '',\n\t\t\tposition: 0,\n\t\t\tprincipal: 0,\n\t\t\tprincipalId: 0,\n\t\t\tprincipalLabel: '',\n\t\t\trecursive: true,\n\t\t\trecursiveLabel: '',\n\t\t\tstatus: 0,\n\t\t\ttarget: 0,\n\t\t\ttargetId: 0,\n\t\t\ttargetLabel: '',\n\t\t\ttype: 0,\n\t\t\ttypeLabel: '',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this model\n\t * @property {object} methods.create - Create new permission\n\t * @property {object} methods.read - Fetch permission\n\t * @property {object} methods.remove - Destroy permission\n\t * @property {object} methods.update - Update permission\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate: function(opts) {\n\t\t\t\treturn ['setAclEntry', _.extend({}, this.self(), {entryId: 0})];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t * @note This returns an array, see parse function\n\t\t\t */\n\t\t\tread: function(opts) {\n\t\t\t\treturn ['getAclObjects', [this.id]];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t */\n\t\t\tremove: ['deleteAclEntry', 'entryId'],\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdate: function(opts) {\n\t\t\t\treturn ['setAclEntry', this.self()];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Parsers for this model\n\t * @property {method} parsers.create - Parse response of permission creation\n\t * @property {method} parsers.read - Parse response of permission read\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {object} data Data\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate: function(data, opts) {\n\t\t\t\tthis.set('entryId', data.id);\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} data Data\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread: function(data, opts) {\n\t\t\t\treturn _.isArray(data) ? data[0] : null;\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * @memberof module:asset/models/assetPermission\n\t\t * @alias target\n\t\t * @type {module:asset/models/asset|Netx.Models.Category}\n\t\t */\n\t\tthis.target = opts.target || undefined;\n\t}\n\n\t/**\n\t * Try to find our target category/asset and enforce permissions. This can fail,\n\t * and we return 'true' unless we're sure access is denied.\n\t * @method\n\t * @param {string} perm Permission\n\t * @return {boolean}\n\t */\n\tallows(perm) {\n\t\tif (this.target && _.isFunction(this.target.allows)) {\n\t\t\treturn this.target.allows(perm);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {object} data Data\n\t * @param {object} opts Options\n\t */\n\tparseAndSave(data, opts) {\n\t\tdata = _.pick.apply(_, [data].concat(_.keys(this.getDefaults())));\n\n\t\t// Only recursive for categories\n\t\tif (data.target != permissionTargetIds.category) {\n\t\t\tdata.recursive = false;\n\t\t}\n\n\t\t// We permit only\n\t\tdata.type = 1;\n\n\t\t// These should be numbers\n\t\t_.each(\n\t\t\t['permission', 'principal', 'principalId', 'target', 'targetId', 'type'],\n\t\t\tfunction(prop) {\n\t\t\t\tif (data[prop] != null) {\n\t\t\t\t\tdata[prop] = Number(data[prop]);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\treturn this.save(data, opts);\n\t}\n\n\t/**\n\t * @method\n\t * @return {string}\n\t */\n\tpermissionLabel() {\n\t\treturn permissionLabels[this.get('permission')];\n\t}\n\n\t/**\n\t * @method\n\t * @return {string}\n\t */\n\tprincipalLabel() {\n\t\treturn this.stripLabel(this.get('principalLabel'));\n\t}\n\n\t/**\n\t * SOOO annoying: 'principalLabel' and 'targetLabel' properties have (STRING) appended to them,\n\t * which means they need filtering before they can work as labels. And there's\n\t * no other way to get the labels without another fetch.\n\t * @method\n\t * @param {string} label principalLabel/targetLabel\n\t * @return {string}\n\t */\n\tstripLabel(label) {\n\t\treturn label.replace(/\\s\\(\\w*\\)$/, '');\n\t}\n\n\t/**\n\t * @method\n\t * @return {string}\n\t */\n\ttargetLabel() {\n\t\treturn this.stripLabel(this.get('targetLabel'));\n\t}\n\n\t/**\n\t * @method\n\t * @return {string}\n\t */\n\ttypeLabel() {\n\t\treturn permissionLabels[this.get('type')];\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetPermission';\n\t}\n}\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-category/templates/categoryTreeNodesView.html -->\\n<header class=\"header flex-row-grid flex-justify-space flex-align-center\">\\n\t<button class=\"action back primary-color-hover\" data-nx-control=\"uplevel\" aria-label=\"Up level\">'+\n((__t=( icons.faAngleLeft ))==null?'':__t)+\n'</button>\\n\t<div id=\"category-tree-title\" class=\"title primary-color mobile-only\" data-nx-control=\"title\"></div>\\n</header>\\n<ul tabindex=\"-1\" role=\"list\" class=\"nx-childviews tree-nodes categories UITableView sub-category parent scrollable\"></ul>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-category/templates/categoryTreeNodeView.html -->\\n<a id=\"folder-link-'+\n((__t=( categoryId ))==null?'':__t)+\n'\" tabindex=\"-1\" class=\"abbreviate category drop\" href=\"#category/'+\n((__t=( categoryId ))==null?'':__t)+\n'\" data-category-id=\"'+\n((__t=( categoryId ))==null?'':__t)+\n'\" title=\"'+\n((__t=( label ))==null?'':__t)+\n'\"><span>'+\n((__t=( label ))==null?'':__t)+\n'</span></a>\\n';\n if(subCategories.length && this.model.get('path').split('/').length < treeMaxDepth) { \n__p+='\\n<a tabindex=\"-1\" href=\"#category/'+\n((__t=( categoryId ))==null?'':__t)+\n'\" data-nx-control=\"downlevel\" data-toggle title=\"'+\n((__t=( label ))==null?'':__t)+\n'\">'+\n((__t=( icons.faAngleRight ))==null?'':__t)+\n'</a>\\n<ul class=\"nx-childviews tree-node sub-category category-list UITableView\"></ul>\\n';\n } \n__p+='\\n';\n}\nreturn __p;\n};\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '@netx/core-asset/models/assetConstituent';\n\nimport AssetsCollection from '@netx/core-asset/collections/assets';\nimport ClipSearchRulesCollection from './searchRules_clips';\nimport PagerModel from '@netx/core-app/models/pager';\n\nimport assetCustomConfig from '@netx/core-asset/config';\n\nexport default class SearchConstituents extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * read() gets assets via either searchAssetBeanObjects or facetedSearch API calls.\n\t\t\t * @todo merge with parent class's read method --- the code is almost identical, perhaps entirely identical.\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\topts = opts || {};\n\t\t\t\tvar search = this.selection.createSearchObject();\n\n\t\t\t\t// TODO: this is boilerplate copied from Netx.Collections.Assets;\n\t\t\t\t// this and that should both use the new paging model instead of the following hackery:\n\t\t\t\tthis.setStartPosition();\n\n\t\t\t\t// Configure paging:\n\t\t\t\t// if opts.chunk is set, use chunk logic to determine the start & length.\n\t\t\t\tif (opts.chunk) {\n\t\t\t\t\tthis._startPosition = opts.refetch\n\t\t\t\t\t\t? this.selection.startPosition\n\t\t\t\t\t\t: this.selection.startPosition + this.length;\n\t\t\t\t\tthis._maxItems = opts.refetch\n\t\t\t\t\t\t? this.length + this.chunkSize\n\t\t\t\t\t\t: this.selection.maxItems;\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise use the standard values.\n\t\t\t\t\tthis._startPosition = this.selection.startPosition;\n\t\t\t\t\tthis._maxItems = this.selection.maxItems;\n\t\t\t\t}\n\n\t\t\t\t// TODO: if/then for faceted search (if/when that becomes a thing)\n\n\t\t\t\treturn [\n\t\t\t\t\tthis.fetchMethod,\n\t\t\t\t\tsearch.sortField,\n\t\t\t\t\tsearch.sortOrder,\n\t\t\t\t\tsearch.matchCriteria,\n\t\t\t\t\tsearch.elementTypes,\n\t\t\t\t\tsearch.elementSubType1s,\n\t\t\t\t\tsearch.elementSubType2s,\n\t\t\t\t\tsearch.elementValue1s,\n\t\t\t\t\tsearch.elementValue2s,\n\t\t\t\t\tsearch.elementValue3s,\n\t\t\t\t\tthis._startPosition,\n\t\t\t\t\tthis._maxItems,\n\t\t\t\t];\n\t\t\t},\n\n\t\t\tfetchAssetConstituentCount(opts) {\n\t\t\t\tthis.fetchingAssetConstituentCount = true; // Cleared in parser.\n\n\t\t\t\tvar search = this.selection.createSearchObject();\n\t\t\t\treturn [\n\t\t\t\t\tthis.fetchMethod,\n\t\t\t\t\tsearch.sortField,\n\t\t\t\t\tsearch.sortOrder,\n\t\t\t\t\tsearch.matchCriteria,\n\t\t\t\t\tsearch.elementTypes,\n\t\t\t\t\tsearch.elementSubType1s,\n\t\t\t\t\tsearch.elementSubType2s,\n\t\t\t\t\tsearch.elementValue1s,\n\t\t\t\t\tsearch.elementValue2s,\n\t\t\t\t\tsearch.elementValue3s,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t */\n\t\t\tread(results, options) {\n\t\t\t\tvar constituents = results;\n\n\t\t\t\t// Check length of results; did we reach the end yet?\n\t\t\t\tif (results.length > this.chunkSize) {\n\t\t\t\t\tconstituents.pop();\n\t\t\t\t\tthis.lastChunk = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.lastChunk = true;\n\t\t\t\t}\n\t\t\t\t// Don't remove existing assets if we are doing a chunk fetch.\n\t\t\t\t// (This options object will be passed to set.)\n\t\t\t\toptions.remove = !options.chunk;\n\n\t\t\t\t// filter out bogus constituents:\n\t\t\t\treturn _.compact(\n\t\t\t\t\t_.map(constituents, c => {\n\t\t\t\t\t\tif (c.constituentId) return c;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t */\n\t\t\tfetchAssetConstituentCount(results, totalItems, fullResults) {\n\t\t\t\tif (_.isUndefined(totalItems)) {\n\t\t\t\t\t// TODO: move away from this throwing-excetion-in-parser pattern. Return false or something.\n\t\t\t\t\tthrow new Error('bad return value from fetchAssetConstituentCount'); // should never happen.\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!this.pager.get('itemTotal') ||\n\t\t\t\t\tthis.pager.get('itemTotal') != totalItems\n\t\t\t\t) {\n\t\t\t\t\t// TODO: Fix this because it is a really stupid thing to do.\n\t\t\t\t\t// This should be setting all relevant information\n\t\t\t\t\tthis.pager.clear();\n\t\t\t\t\tthis.pager.set({itemTotal: totalItems});\n\t\t\t\t}\n\n\t\t\t\tdelete this.fetchingAssetConstituentCount;\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {array} models Array of models / model attribtues\n\t * @param {object} opts Collection options\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * @type {number}\n\t\t * @default\n\t\t */\n\t\tthis.chunkSize = opts.chunkSize || assetCustomConfig.CHUNK_SIZE;\n\n\t\t// An Assets collection can manage paged fetching of its assets. If the value 'chunkSize' is smaller than the value 'pageSize',\n\t\t// chunk loading is enabled.\n\t\t/**\n\t\t * @type {number}\n\t\t * @default\n\t\t */\n\t\tthis.curPage = opts.curPage || 0;\n\n\t\t/**\n\t\t * IMPORTANT: The default value for pageSize needs to be 1 or Netx.asset.cursor paging breaks.\n\t\t * @type {number}\n\t\t * @default\n\t\t */\n\t\tthis.pageSize = opts.pageSize || assetCustomConfig.PAGE_SIZE;\n\n\t\t/**\n\t\t * @type {string}\n\t\t * @default\n\t\t */\n\t\tthis.routeContext = opts.routeContext || '';\n\n\t\t/**\n\t\t * this will contain a SearchRules collection to describe the set of assets this collection will fetch.\n\t\t * @type {Netx.Collections.SearchRules}\n\t\t */\n\t\tthis.selection = opts.selection || new ClipSearchRulesCollection();\n\t\tthis.addSubCollection(this.selection);\n\n\t\tthis.pager = new PagerModel(\n\t\t\t{\n\t\t\t\tpageSize: this.pageSize,\n\t\t\t\tpagesToDisplay: 10,\n\t\t\t\t// I would really like to just do !( opts.pagerRoutes ) but lint yells about confusing use of `!`\n\t\t\t\troutesToPage: opts.pagerRoutes === false ? false : true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcollection: this,\n\t\t\t},\n\t\t);\n\t\tthis.addSubModel(this.pager);\n\n\t\t// When our selection changes, our contents are no longer valid\n\t\tconst invalidate = () => {\n\t\t\tdelete this.fetchingAssetConstituentCount;\n\t\t\t// clear out our contents, so subsequent fetch() runs faster.\n\t\t\tthis.length && this.reset();\n\t\t};\n\n\t\t// Hey, listen!\n\t\tthis\n\t\t\t// Always trigger a 'counted' event when this.pager.itemTotal changes to a defined value,\n\t\t\t// or a 'countUnknown' event when we no longer have a correct value.\n\t\t\t.listenTo(this.pager, 'change:itemTotal', (m, count) => {\n\t\t\t\tcount != null\n\t\t\t\t\t? this.trigger('counted', count)\n\t\t\t\t\t: this.trigger('countUnknown');\n\t\t\t})\n\t\t\t// We will get multiple events here; fire on just the first event\n\t\t\t.listenTo(\n\t\t\t\tthis.selection,\n\t\t\t\t'change add remove reset',\n\t\t\t\t_.throttle(invalidate, 250, {trailing: false}),\n\t\t\t)\n\t\t\t// Keep up with destruction\n\t\t\t.listenTo(this, 'destroy', (model, collection, opts) => {\n\t\t\t\t//Object {remove: true, add: true, merge: true, index: 0}\n\t\t\t\tlet count = this.pager.get('itemTotal');\n\t\t\t\tif (!count || isNaN(count)) count = 0;\n\t\t\t\tif (count) count--;\n\t\t\t\tthis.pager.set('itemTotal', count);\n\t\t\t})\n\t\t\t// When a new search is ran, reset this collection\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'search:basic search:exact search:advanced:submit',\n\t\t\t\t() => {\n\t\t\t\t\t// reset facets and page if context has changed, not if we've come back from elsewhere\n\t\t\t\t\tif (\n\t\t\t\t\t\t!this.hasRouteContext() ||\n\t\t\t\t\t\t(this.lastSearchRoute != '#' + this.routeContext &&\n\t\t\t\t\t\t\tthis.lastSearchRoute !=\n\t\t\t\t\t\t\t\t'#' + this.routeContext + '/page/' + this.curPage)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.curPage = 1;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t)\n\t\t\t// Issue this event whenever we complete a search.\n\t\t\t.listenTo(this, 'sync', () => {\n\t\t\t\tdispatcher.trigger('search:complete', this);\n\t\t\t});\n\n\t\t// this.chunkSize is used for fetching a subset of a page, for endless scroll & such.\n\t\t// allow chunkSize to change.\n\t\tthis.fetch = _.wrap(this.fetch, (origFetch, opts) => {\n\t\t\tif (this.chunkSize) {\n\t\t\t\tthis.selection.maxItems = this.chunkSize + 1;\n\t\t\t}\n\t\t\t// http://stackoverflow.com/questions/4775895/how-to-shift-arguments\n\t\t\treturn origFetch.call(this, opts);\n\t\t});\n\t}\n\n\t/** @method */\n\taddChunk() {\n\t\treturn AssetsCollection.prototype.addChunk.apply(this, arguments);\n\t}\n\n\t/**\n\t * Views that wish to display a count should call assetConstituentCount(), and listen for the 'counted' event.\n\t * @method\n\t * @return {number} Asset count\n\t */\n\tassetConstituentCount() {\n\t\t// Fixes false '0' occurences\n\t\tif (\n\t\t\tthis.pager.has('itemTotal') &&\n\t\t\tthis.pager.get('itemTotal') >= this.length\n\t\t) {\n\t\t\treturn this.pager.get('itemTotal');\n\t\t}\n\n\t\tif (this.fetchingAssetCount || this.length) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthis.pager.set('itemTotal', 0);\n\t\treturn 0;\n\t}\n\n\t/** @method */\n\tsetStartPosition() {\n\t\treturn AssetsCollection.prototype.setStartPosition.apply(this, arguments);\n\t}\n\n\t/**\n\t * Not supported right now\n\t * @method\n\t */\n\tuseFacetedSearch() {\n\t\treturn false;\n\t}\n\n\t////////////////////////////////////\n\t// PAGING\n\t////////////////////////////////////\n\thasRouteContext() {\n\t\treturn AssetsCollection.prototype.hasRouteContext.apply(this, arguments);\n\t}\n\t////////////////////////////////////\n\t// !PAGING\n\t////////////////////////////////////\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchConstituents';\n\t}\n}\n","export * from './categoryIdRule';\nexport {default} from './categoryIdRule';\n\nexport * from './components';\nexport * from './constants';\nexport * from './defaults';\nexport * from './locales';\nexport * from './model';\nexport * from './utils';\nexport * from './types';\nexport * from './validate';\n","export * from './attributesStore';\n","export enum AssetGalleryLayout {\n\tCard = 'card',\n\tCurator = 'curator',\n\tGrid = 'grid',\n\tList = 'list',\n}\n\nexport enum AssetGalleryPref {\n\tCardSize = 'asset.list.cardSize',\n\tCuratorMode = 'asset.list.curatorMode',\n\tLayout = 'asset.list.type',\n\tSortField = 'asset.list.sort.field',\n\tSortOrder = 'asset.list.sort.order',\n\t// attribute.attributeSets.selected.gallery.card\n\t// attribute.attributeSets.selected.gallery.curator\n\t// attribute.attributeSets.selected.gallery.list\n\tSelectedAttributeSet = 'attribute.attributeSets.selected.gallery',\n}\n","import {expirationRuleDefaults} from './defaults';\nimport {ExpirationRule} from './types';\n\nexport const createExpirationRule = (): ExpirationRule => ({\n\t...expirationRuleDefaults,\n});\n\nexport default createExpirationRule;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class PublicLink extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'linkId';\n\t}\n\n\t/** @type {object} */\n\tget defaults() {\n\t\treturn {\n\t\t\taccessCode: '',\n\t\t\taccessCount: undefined, // for access by count, this is the allowed number of accesses before expiration\n\t\t\tcreationDate: '',\n\t\t\texpirationAccesses: 0, // for access by count, this is the number of accesses so far.\n\t\t\texpirationDate: '',\n\t\t\texpirationType: 2, // 1 = by date, 0 = num. of accesses, 2 = permanent\n\t\t\tfileExtension: '',\n\t\t\tincludeSubFolders: 0,\n\t\t\tlinkId: undefined,\n\t\t\tobjectId: 0, // for asset, assetId\n\t\t\tpassword: '', // stores password, or for the referrer securityType it stores the referrer.\n\t\t\tpasswordLabel: '', // usually \"No\" for whatever reason. Applied to the security column, I think.\n\t\t\trecipientEmail: '',\n\t\t\trecipientNote: '',\n\t\t\tsecurityType: 0, // 0 = none, 1 = password, 2 = referrer\n\t\t\t//\n\t\t\t// For Asset links,\n\t\t\t// title = asset name,\n\t\t\t// type = 1,\n\t\t\t//\n\t\t\t// For Category links,\n\t\t\t// type = 2\n\t\t\t//\n\t\t\t// For Search links\n\t\t\t// type = 3\n\t\t\t//\n\t\t\t// For Saved Cart links\n\t\t\t// type = 4\n\t\t\t//\n\t\t\ttitle: '',\n\t\t\ttype: 0,\n\t\t\ttypeLabel: '',\n\n\t\t\tuserId: 0, // user creating/owning the link.\n\t\t\tuserLabel: '', // can be blank\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @method */\n\t\t\tcreate: function() {\n\t\t\t\treturn ['setPublicLink', _.extend({}, this.attributes, {linkId: 0})];\n\t\t\t},\n\t\t\t/** @method */\n\t\t\tread: ['getPublicLinkBean', 'linkId'],\n\t\t\t/** @method */\n\t\t\tremove: ['deletePublicLink', 'linkId'],\n\t\t\t/** @method */\n\t\t\tupdate: function() {\n\t\t\t\treturn ['setPublicLink', this.attributes];\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} r Response object\n\t\t\t * @example\n\t\t\t * {\n\t\t\t * \"id\":28,\n\t\t\t * \"status\":1,\n\t\t\t * \"validationData\":[]\n\t\t\t * }\n\t\t\t */\n\t\t\tcreate: function(r) {\n\t\t\t\tthis.set({linkId: r.id});\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(attrs, opts) {\n\t\tsuper(attrs, opts);\n\n\t\t// Hey, listen\n\t\t// The server wants an integer representing true/false - rather than handle this in possibly multiple locations, let's deal with it here\n\t\tthis.listenTo(this, 'change:includeSubFolders', function() {\n\t\t\tvar val = this.get('includeSubFolders');\n\t\t\tthis.set(\n\t\t\t\t{includeSubFolders: val === true || val === 1 ? 1 : 0},\n\t\t\t\t{silent: true},\n\t\t\t);\n\t\t});\n\t\t// When we hide the password field when someone changes security type we are not emptying the password field\n\t\t// Some might argue, handle it in the view, but I think this is a nice place to put it just in case it were to ever\n\t\t// get wiped out or whatever - handle it on the model level\n\t\tthis.listenTo(this, 'change:securityType', function() {\n\t\t\tvar val = parseInt(this.get('securityType'));\n\t\t\t// Password is no longer a thing - empty it\n\t\t\tif (val !== 1) {\n\t\t\t\tthis.set({password: ''}, {silent: true});\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Return the canonical URL for this public link.\n\t * @method\n\t */\n\tlinkUrl() {\n\t\treturn (\n\t\t\tlocation.origin +\n\t\t\t'/public/' +\n\t\t\tthis.get('accessCode') +\n\t\t\t'/' +\n\t\t\tthis.get('title') +\n\t\t\t'.' +\n\t\t\tthis.get('fileExtension')\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'PublicLink';\n\t}\n}\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/promptView.html -->\\n<div class=\"container\">\\n\t<form id=\"prompt-view-form\" role=\"form\" data-nx-validate-form>\\n\t\t<header>\\n\t\t\t<h2 class=\"title\"><span class=\"text\">'+\n((__t=( headerTitle ))==null?'':__t)+\n'</span></h2>\\n\t\t</header>\\n\t\t<div class=\"container-fluid\">\\n\t\t\t<div class=\"form-group ';\n if (required) { \n__p+='required';\n } \n__p+='\">\\n\t\t\t\t<label class=\"control-label\">'+\n((__t=( promptMessage ))==null?'':__t)+\n'</label>\\n\t\t\t\t<input class=\"form-control\" type=\"text\" name=\"neededInformation\" value=\"'+\n((__t=( value ))==null?'':_.escape(__t))+\n'\" placeholder=\"'+\n((__t=( placeholder ))==null?'':_.escape(__t))+\n'\" '+\n((__t=( required ? 'required' : '' ))==null?'':__t)+\n'>\\n\t\t\t</div>\\n\t\t</div>\\n\t\t<footer>\\n\t\t\t<div class=\"actions\">\\n\t\t\t\t<aside>\\n\t\t\t\t\t<button type=\"button\" class=\"btn btn-default cancel nx-cancel\" data-nx-control=\"cancel\"><span class=\"text\">'+\n((__t=( cancelLabel ))==null?'':__t)+\n'</span></button>\\n\t\t\t\t</aside>\\n\t\t\t\t<bside>\\n\t\t\t\t\t<button type=\"submit\" class=\"btn btn-save submit\" data-nx-control=\"save\"><span class=\"text\">'+\n((__t=( submitLabel ))==null?'':__t)+\n'</span></button>\\n\t\t\t\t</bside>\\n\t\t\t</div>\\n\t\t</footer>\\n\t</form>\\n</div>\\n';\n}\nreturn __p;\n};\n","import {\n\tfaDownload,\n\tfaSave,\n\tfaShare,\n\tfaFilePdf,\n\tfaTrashAlt,\n} from '@fortawesome/pro-solid-svg-icons';\n\nexport const SEARCH_SAVED_ACTION_ICON = <const>{\n\tCREATE: faSave,\n\tCREATE_PDF: faFilePdf,\n\tDELETE: faTrashAlt,\n\tDOWNLOAD: faDownload,\n\tMENU: faShare,\n};\n\nexport type SearchSavedBaseEvent = typeof SEARCH_SAVED_BASE_EVENT;\n\nexport const SEARCH_SAVED_BASE_EVENT = `search:saved`;\n\nexport const SEARCH_SAVED_EVENT = <const>{\n\tCREATE: `${SEARCH_SAVED_BASE_EVENT}:create`,\n\tCREATE_PDF: `${SEARCH_SAVED_BASE_EVENT}:createPDF`,\n\tDELETE: `${SEARCH_SAVED_BASE_EVENT}:delete:react`,\n\tDOWNLOAD: `${SEARCH_SAVED_BASE_EVENT}:download`,\n\tMENU: `${SEARCH_SAVED_BASE_EVENT}:menu`,\n\tVIEW: `${SEARCH_SAVED_BASE_EVENT}:view`,\n};\n","import {assetIsImage} from '@netx/core-asset/enablers';\nimport {completions as autocompletions} from '@netx/core-app/properties/autocomplete';\n\nimport {getViewCollection, getViewModel} from '@netx/core/lib/utils';\nimport {visualSearchEnabled} from '@netx/core-search-visual/enablers';\n\n/**\n * Attribute history search available\n * @method\n * @returns {boolean}\n */\nexport const attributeHistorySearch = (v) => {\n\treturn (\n\t\tNetx.getPreference('metadata.history.enabled', true) &&\n\t\t// That is a mouthful!\n\t\tautocompletions.attributeHistory.data.length > 0\n\t);\n};\n\n/**\n * Does user have rights to delete this saved search?\n * @method\n */\nexport const canDeleteSavedSearch = (v) => {\n\tlet model = getViewModel(v);\n\n\t// DAM-15827 - sometimes the view doesn't have a model\n\tif (!model) {\n\t\tconst collection = getViewCollection(v);\n\t\tmodel = collection && Netx.search.saved.all.get(collection.id);\n\t}\n\n\treturn model && model.allows('delete');\n};\n\nexport const canSaveSearch = (v) => {\n\tconst collection = getViewCollection(v);\n\tif (!collection) return false;\n\n\t// DAM-15475\n\t// No visual searches\n\t// No selected facets\n\tconst selection = collection.selection;\n\treturn (\n\t\t!selection.findWhere({elementType: 27}) &&\n\t\t!selection.searchFacets.hasSelection\n\t);\n};\n\n/**\n * Can we run a visual search on this asset?\n */\nexport const canVisualSearch = (v) => {\n\treturn visualSearchEnabled() && assetIsImage(v);\n};\n\nexport default {\n\tattributeHistorySearch,\n\tcanDeleteSavedSearch,\n\tcanSaveSearch,\n\tcanVisualSearch,\n};\n","import SearchAssetsCollection from '@netx/core-search/collections/searchAssets';\nimport {SEARCH_SAVED_EVENT} from '@netx/core-search-saved/actions';\nimport {\n\tattributeHistorySearch,\n\tcanDeleteSavedSearch,\n\tcanSaveSearch,\n\tcanVisualSearch,\n} from './enablers';\n\nexport default [\n\t{\n\t\tevent: 'search:saved:rename',\n\t\tlabel: i18n.t('i18n.rename'),\n\t\tmatrix: 'manage',\n\t\twrapper: (view, e) => {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t{\n\t\tevent: SEARCH_SAVED_EVENT.VIEW,\n\t\tlabel: i18n.t('i18n.edit'),\n\t\twrapper: (view, e) => {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:basic:view',\n\t\tlabel: i18n.t('i18n.search'),\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:advanced',\n\t\tlabel: i18n.t('i18n.search'),\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:advanced:route',\n\t\troute: 'search/advanced',\n\t\tlabel: i18n.t('i18n.search'),\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:attribute:history:route',\n\t\troute: 'search/attribute/history',\n\t\tenableTest: attributeHistorySearch,\n\t\tlabel: i18n.t('i18n.searchAttributeHistory'),\n\t\tuserLevel: 4,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:facet:option:deselect',\n\t\tlabel: i18n.t('i18n.deselect'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:save',\n\t\tlabel: i18n.t('i18n.saveSearch'),\n\t\tenableTest: canSaveSearch,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:saved:permission:remove',\n\t\tlabel: i18n.t('i18n.removePermission'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:saved:toggleChosen',\n\t\tlabel: i18n.t('i18n.chose'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:saved:delete',\n\t\tlabel: i18n.t('i18n.deleteSearch'),\n\t\tenableTest: canDeleteSavedSearch,\n\t\twrapper(view, e) {\n\t\t\t// if the view is a collectionView, find the saved search for the collection.\n\t\t\tvar model = view.model;\n\t\t\tif (model) {\n\t\t\t\treturn [model ? model : Netx.search.assets, view, e];\n\t\t\t} else if (view.collection instanceof SearchAssetsCollection) {\n\t\t\t\tmodel = view.collection.findSearchModel();\n\t\t\t\treturn [model ? model : Netx.search.assets, view, e];\n\t\t\t} else {\n\t\t\t\tthrow new Error('cannot delete saved search');\n\t\t\t}\n\t\t},\n\t},\n\t/**\n\t * Add all category assets to cart\n\t * @action\n\t */\n\t{\n\t\tevent: 'search:saved:add:to:current:cart',\n\t\tlabel: i18n.t('i18n.addAllToSelection'),\n\t\twrapper(view, e) {\n\t\t\tif (view.model) {\n\t\t\t\treturn [view.model.id];\n\t\t\t}\n\t\t\treturn [Netx.search.assets.selection.at(0).get('elementValue1'), e];\n\t\t},\n\t},\n\n\t/** @action */\n\t{\n\t\tevent: 'search:visual:asset',\n\t\tlabel: i18n.t('i18n.findAssetsLikeThis'),\n\t\tenableTest: canVisualSearch,\n\t\troute: (assetId) => `search/visual/asset/${assetId}`,\n\t\twrapper: (view, e) => [view.model.id],\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'search:saved:landing',\n\t\tlabel: i18n.t('i18n.all'),\n\t\troute: 'search/saved',\n\t},\n];\n","import Menu from '@netx/core/lib/netx-menu';\n\nexport default {\n\tsearch: new Menu({\n\t\tactions: ['share:search:saved'],\n\t}),\n};\n","/**\n * @class\n */\nimport Base from './searchConstituents';\nimport Model from '@netx/core-asset/models/assetConstituent_clip';\n\nimport ClipSearchRulesCollection from './searchRules_clips';\n\nexport default class SearchConstituents_Clips extends Base {\n\t/** @type {string} */\n\tget fetchMethod() {\n\t\treturn 'searchClips';\n\t}\n\n\t/**\n\t * @override\n\t * @param {array} models Array of models / model attribtues\n\t * @param {object} opts Collection options\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t// When our selection changes, our contents are no longer valid\n\t\tconst invalidate = () => {\n\t\t\tdelete this.fetchingConstituentCount;\n\t\t\t// clear out our contents, so subsequent fetch() runs faster.\n\t\t\tthis.length && this.reset();\n\t\t};\n\n\t\t// Hey, listen!\n\t\tthis\n\t\t\t// When a new search is ran, reset this collection\n\t\t\t.listenTo(dispatcher, 'search:clip:basic', () => {\n\t\t\t\t// reset facets and page if context has changed, not if we've come back from elsewhere\n\t\t\t\tif (\n\t\t\t\t\t!this.hasRouteContext() ||\n\t\t\t\t\t(this.lastSearchRoute != '#' + this.routeContext &&\n\t\t\t\t\t\tthis.lastSearchRoute !=\n\t\t\t\t\t\t\t'#' + this.routeContext + '/page/' + this.curPage)\n\t\t\t\t) {\n\t\t\t\t\tthis.curPage = 1;\n\t\t\t\t}\n\t\t\t})\n\t\t\t// We will get multiple events here; fire on just the first event\n\t\t\t.listenTo(\n\t\t\t\tthis.selection,\n\t\t\t\t'change add remove reset',\n\t\t\t\t_.throttle(invalidate, 250, {trailing: false}),\n\t\t\t);\n\t}\n\n\t/**\n\t * Set the params for a basic search.\n\t * @method\n\t * @param {string} str Search string\n\t */\n\tbasic(str, page) {\n\t\t// console.debug('METHOD: search.basic --> ', str);\n\t\tthis.curPage = page ? page : 1;\n\t\tthis.basicSearchStr = str;\n\t\tthis.selection.initProperties();\n\t\tthis.selection.set([\n\t\t\t{\n\t\t\t\telementType: 101, // KEYWORD search\n\t\t\t\telementSubType1: 4, // match ALL keywords\n\t\t\t\telementSubType2: 0,\n\t\t\t\telementValue1: str,\n\t\t\t},\n\t\t]);\n\t\t// if ( Netx.getPreference('search.keywordIncludeContents', true ) ){\n\t\t// \tthis.selection.at(0).set({elementValue2: \"true\"});\n\t\t// }\n\n\t\tthis.routeContext = 'search/clip/basic/' + _.escapeURI(this.basicSearchStr);\n\t\treturn this.fetchSearch('basic');\n\t}\n\n\t/**\n\t * Fetch with our configured search, then emit success or error events defined by typeStr\n\t * @method\n\t * @param {string} typeStr Search type string\n\t * @fires module:search#search:clip:basic:complete\n\t * @fires module:search#search:clip:basic:error\n\t */\n\tfetchSearch(typeStr) {\n\t\treturn this.fetch().then(\n\t\t\t() => {\n\t\t\t\tif (\n\t\t\t\t\tthis.curPage == 1 &&\n\t\t\t\t\tthis.pager.get('itemTotal') > this.pageSize &&\n\t\t\t\t\tthis.routeContext.length\n\t\t\t\t) {\n\t\t\t\t\tNetx.router.navigate(this.routeContext + '/page/' + this.curPage, {\n\t\t\t\t\t\ttrigger: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tdispatcher.trigger('search:clip:' + typeStr + 'complete', this);\n\t\t\t},\n\t\t\terr => {\n\t\t\t\tdispatcher.trigger('search:clip:' + typeStr + 'error', err);\n\t\t\t},\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchConstituents_Clips';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport {ids as attributeTypeIds} from '@netx/core-asset/properties/attributes';\n\nimport moment from '@netx/core/lib/netx-moment';\n\nexport default class SearchAttributeHistoryRule extends Base {\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'templateId';\n\t}\n\n\t/**\n\t * @property {object} defaults - Model defaults\n\t * @property {number} defaults.templateId - Attribute template id\n\t * @property {number} defaults.userId - ID of changing user\n\t * @property {array} defaults.values - Attribute values\n\t * @property {date} defaults.date1 - Change date (start)\n\t * @property {date} defaults.date2 - Change date (end)\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t// templateId : 0,\n\t\t\tdate1: null,\n\t\t\tdate2: null,\n\t\t\tuserId: null,\n\t\t\tuserName: null,\n\t\t\tvalues: null,\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'change:userId', function (model, userId) {\n\t\t\tif (userId == null) {\n\t\t\t\tthis.set('userName', null);\n\t\t\t}\n\t\t});\n\t\tthis.listenTo(this, 'change:date1', function (model, date1) {\n\t\t\tif (date1 == null) {\n\t\t\t\tthis.set('date1', null);\n\t\t\t}\n\t\t});\n\t\tthis.listenTo(this, 'change:date2', function (model, date2) {\n\t\t\tif (date2 == null) {\n\t\t\t\tthis.set('date2', null);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** @override */\n\tgetLabel() {\n\t\tvar attrModel = this.getTemplate();\n\t\tif (!attrModel) return '';\n\n\t\treturn attrModel.getLabel();\n\t}\n\n\t/**\n\t * @method\n\t * @return {module:asset/models/assetAttribute} Attribute template\n\t */\n\tgetTemplate() {\n\t\treturn Netx.getAttribute(this.id);\n\t}\n\n\t/**\n\t * @method\n\t * @return {object}\n\t */\n\ttoSALO() {\n\t\tconst hasRules = Object.values(this.attributes).some(\n\t\t\t(attr) => attr != null,\n\t\t);\n\t\tif (!hasRules) return null;\n\n\t\tlet values = this.get('values') || [];\n\n\t\tconst attr = Netx.getAttribute(this.id);\n\t\tif (attr.get('type') === attributeTypeIds.date) {\n\t\t\tvalues = values.map((value) =>\n\t\t\t\tmoment(value, 'YYYY-MM-DD').format('MM/DD/YYYY'),\n\t\t\t);\n\t\t}\n\n\t\tconst value1 = values.join('<netx-delimiter>');\n\n\t\t// DAM-15662 - must specify delimiter, leave a side blank for unbounded search\n\t\tconst date1 = this.get('date1') || '';\n\t\tconst date2 = this.get('date2') || '';\n\t\tconst value3 =\n\t\t\tdate1.length || date2.length\n\t\t\t\t? [date1, date2].join('<netx-delimiter>')\n\t\t\t\t: '';\n\t\tconst userId = this.get('userId') || '';\n\n\t\t// Integer from 0 - 7\n\t\t// https://kb.netx.net/display/DEVOPS/Attribute+History\n\t\tconst subType1 = parseInt(\n\t\t\t// Set up an array of 1s and 0s and use that as our value\n\t\t\t// [0,0,1] = 1\n\t\t\t// [0,1,0] = 2\n\t\t\t// [0,1,1] = 3\n\t\t\t// [1,0,0] = 4 etc\n\t\t\t[values, userId, value3]\n\t\t\t\t.map((dataItem) => (dataItem.length || dataItem > 0 ? 1 : 0))\n\t\t\t\t.join(''),\n\t\t\t// Base 2\n\t\t\t2,\n\t\t);\n\n\t\treturn {\n\t\t\telementType: 200,\n\t\t\telementSubType1: subType1,\n\t\t\telementSubType2: this.id,\n\t\t\telementValue1: value1,\n\t\t\telementValue2: userId,\n\t\t\telementValue3: value3,\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchAttributeHistoryRule';\n\t}\n}\n","/**\n * @class\n */\nimport Base from './searchRules_assets';\nimport Model from '../models/searchAttributeHistoryRule';\n\nexport default class SearchAttributeHistoryRules extends Base {\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'add remove reset', () => {\n\t\t\tthis.length === 0 && this.add({});\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @return {object} Asset attribute history search object\n\t */\n\tcreateSearchObject() {\n\t\tconst rules = _.compact(\n\t\t\tthis.map((rule) => (rule.toSALO ? rule.toSALO() : rule.attributes)),\n\t\t);\n\n\t\treturn {\n\t\t\tsortField: this.sortField,\n\t\t\tsortOrder: this.sortOrder,\n\t\t\tmatchCriteria: this.matchCriteria,\n\t\t\telementTypes: _.pluck(rules, 'elementType'),\n\t\t\telementSubType1s: _.pluck(rules, 'elementSubType1'),\n\t\t\telementSubType2s: _.pluck(rules, 'elementSubType2'),\n\t\t\telementValue1s: _.pluck(rules, 'elementValue1'),\n\t\t\telementValue2s: _.pluck(rules, 'elementValue2'),\n\t\t\telementValue3s: _.pluck(rules, 'elementValue3'),\n\t\t\tstartPosition: this.startPosition,\n\t\t\tmaxItems: this.maxItems,\n\t\t};\n\t}\n\n\t// After going real deep I realize why we do not try and preserve the rules on a reload at this time\n\t// But below is proof of the amount of garbage we have to currently do to get the rules back into a format\n\t// that we can work with in attribute history search rules\n\t// /**\n\t// * Non-sALO replacement for above strTosALO\n\t// * @method\n\t// * @param {string} str Base64 encoded search string\n\t// */\n\t// loadFromStr(str) {\n\t// \tlet small = '';\n\t// \ttry {\n\t// \t\tsmall = JSON.parse(base64.decode(str));\n\t// \t} catch (e) {\n\t// \t\t// a bogus URL did not decode into a legit object.\n\t// \t\tdispatcher.trigger('app:alert', 'Search not found.', 'Info');\n\t// \t\treturn;\n\t// \t}\n\t//\n\t// \t// clear out any existing rules.\n\t// \tthis.reset();\n\t// \tthis.initProperties();\n\t//\n\t// \t_.each(this.sALOstrMap, (realName, smallName) => {\n\t// \t\tif (small[smallName] == null) return;\n\t//\n\t// \t\t// the elements of a search object are arrays with pluralized names 'element*s';\n\t// \t\t// break those into individual searchRule properties, which are singular\n\t// \t\tif (/^element.*s$/.test(realName)) {\n\t// \t\t\trealName = realName.replace(/s$/, '');\n\t// \t\t\t_.each(small[smallName], (val, idx) => {\n\t// \t\t\t\tlet model = this.at(idx);\n\t// \t\t\t\tif (!model) {\n\t// \t\t\t\t\tmodel = new this.model();\n\t// \t\t\t\t\tthis.add(model);\n\t// \t\t\t\t}\n\t//\n\t// \t\t\t\tif (realName === 'elementType' || realName === 'elementSubType1')\n\t// \t\t\t\t\treturn;\n\t//\n\t// \t\t\t\tswitch (realName) {\n\t// \t\t\t\t\tcase 'elementSubType2':\n\t// \t\t\t\t\t\tmodel.set('templateId', val);\n\t// \t\t\t\t\t\tbreak;\n\t// \t\t\t\t\tcase 'elementValue1':\n\t// \t\t\t\t\t\tlet values = val.split('<netx-delimiter>') || [];\n\t// \t\t\t\t\t\tconst attr = Netx.getAttribute(model.id);\n\t// \t\t\t\t\t\tif (attr && attr.get('type') === attributeTypeIds.date) {\n\t// \t\t\t\t\t\t\tvalues = values.map(value =>\n\t// \t\t\t\t\t\t\t\tmoment(value, 'MM/DD/YYYY').format('YYYY-MM-DD'),\n\t// \t\t\t\t\t\t\t);\n\t// \t\t\t\t\t\t}\n\t// \t\t\t\t\t\tmodel.set('values', values);\n\t// \t\t\t\t\t\tbreak;\n\t// \t\t\t\t\tcase 'elementValue2':\n\t// \t\t\t\t\t\tmodel.set('userId', val || null);\n\t// \t\t\t\t\t\tbreak;\n\t// \t\t\t\t\tcase 'elementValue3':\n\t// \t\t\t\t\t\tval = val.split('<netx-delimiter>') || [];\n\t// \t\t\t\t\t\tmodel.set({\n\t// \t\t\t\t\t\t\tdate1: val[0] || null,\n\t// \t\t\t\t\t\t\tdate2: val[1] || null,\n\t// \t\t\t\t\t\t});\n\t// \t\t\t\t\t\tbreak;\n\t// \t\t\t\t}\n\t// \t\t\t});\n\t// \t\t} else {\n\t// \t\t\t// unpack searchRules properties too:\n\t// \t\t\tthis[realName] = small[smallName];\n\t// \t\t}\n\t// \t});\n\t//\n\t// \treturn this;\n\t// }\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchAttributeHistoryRules';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryView';\nimport Template from '../templates/searchGalleryView.html';\n\nexport default class SearchGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'assets-view flex-column-grid';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.search');\n\t\topts.id = opts.id || 'search';\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchGalleryView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-search/views/searchGalleryView';\n\nexport default class SearchGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'assets-view';\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'click [data-nx-control=\"filters\"]': 'toggleFacets',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\tif (Modernizr.touch || window.innerWidth < 500) {\n\t\t\t// mobile layout\n\t\t\tthis.toggleFacetsOff();\n\t\t} else {\n\t\t\tthis.toggleFacetsOn();\n\t\t}\n\t}\n\t/** @method */\n\ttoggleFacets() {\n\t\tif (this.$el.hasClass('facets-on') || $('body').hasClass('facets-off')) {\n\t\t\tthis.toggleFacetsOff();\n\t\t} else {\n\t\t\tthis.toggleFacetsOn();\n\t\t}\n\t}\n\t/** @method */\n\ttoggleFacetsOff() {\n\t\t// THEM-1542 - faceting-off sets the off widths but does not\n\t\t// change the display. This allows the animation\n\t\t// to complete before the facets disapear.\n\t\tthis.$el.addClass('faceting-off');\n\t\t_.delay(\n\t\t\t_.bind(function () {\n\t\t\t\tthis.removeClass('facets-on').removeClass('faceting-off');\n\t\t\t}, this.$el),\n\t\t\t500,\n\t\t);\n\t}\n\t/** @method */\n\ttoggleFacetsOn() {\n\t\tthis.$el.addClass('facets-on');\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryView';\nimport Template from '../templates/searchConstituentsGalleryView.html';\n\nexport default class SearchConstituentsGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'constituents-view flex-column-grid';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.searchConstituents');\n\t\topts.id = opts.id || 'search-clips';\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchConstituentsGalleryView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryHeaderView';\nimport Template from '../templates/searchConstituentsGalleryHeaderView.html';\n\nimport CoreCollection from '@netx/core/lib/netx-collection';\nimport CoreView from '@netx/core/lib/netx-view';\n\nexport default class SearchConstituentsGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.i18nCountStr =\n\t\t\topts.i18nCountStr || 'search:i18n.nAssetConstituentClips';\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.template = opts.template || Template;\n\n\t\tsuper(opts);\n\n\t\t// If the headerView depends on a list of asset collections\n\t\t// that list should be passed as the option 'collectionList'\n\t\tif (!_.isUndefined(this.collectionList)) {\n\t\t\tif (this.collectionList instanceof CoreCollection) {\n\t\t\t\tthis.listenTo(this.collectionList, 'sync', this.render);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\t\treturn (\n\t\t\tthis\n\t\t\t\t// Update the header when a new fetch goes out\n\t\t\t\t.listenTo(this.collection, 'request:read', this.updateTitle)\n\t\t\t\t// Update the count in the header when models are added/removed\n\t\t\t\t.listenTo(\n\t\t\t\t\tthis.collection,\n\t\t\t\t\t'sync reset add remove',\n\t\t\t\t\t_.debounce(() => {\n\t\t\t\t\t\tthis.updateCount(this.collection.assetConstituentCount());\n\t\t\t\t\t}, 100),\n\t\t\t\t)\n\t\t\t\t// Update the count in the header when we get a count.\n\t\t\t\t.listenTo(this.collection, 'counted countUnknown', this.updateCount)\n\t\t);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\t// TODO: why?\n\t\t// super.preRender();\n\t\t// Super\n\t\tCoreView.prototype.preRender.call(this);\n\n\t\tthis.getHeaderTitle();\n\n\t\t// Additonal template vars\n\t\t_.extend(this.templateVars, this.collection, {\n\t\t\tassetCount: this.collection.assetConstituentCount() || 0,\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @return {string}\n\t */\n\tgetHeaderTitle() {\n\t\tconst regex = /[\\d\\w-*]\\/(\\d*)/i;\n\t\tconst match = Backbone.history.getHash().match(regex);\n\n\t\tlet id;\n\t\tif (match) {\n\t\t\tid = match[1];\n\t\t}\n\n\t\tthis.headerTitle = '';\n\n\t\tif (window.location.hash.includes('search/clip/basic/')) {\n\t\t\tthis.headerTitle = [\n\t\t\t\t'\"',\n\t\t\t\t_.unescapeURI(\n\t\t\t\t\twindow.location.hash.replace('#search/clip/basic/', '').split('/')[0],\n\t\t\t\t),\n\t\t\t\t'\"',\n\t\t\t\t' ' + i18n.t('i18n.constituentClips'),\n\t\t\t].join('');\n\t\t}\n\n\t\treturn this.headerTitle;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchConstituentsGalleryHeaderView';\n\t}\n}\n","/**\n * Displays a single asset constituent\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetConstituentView.html';\n\nexport default class AssetConstituentView extends Base {\n\t/**\n\t * @method\n\t * @param {object} opts View options\n\t */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t\topts.asset = this.asset;\n\n\t\t// Hey, listen!\n\t\tif (this.asset) {\n\t\t\tthis.listenTo(\n\t\t\t\tthis.asset,\n\t\t\t\t'change:permissionMatrix',\n\t\t\t\tthis.debouncedRender,\n\t\t\t);\n\t\t}\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'change', this.debouncedRender);\n\t}\n\n\t/**\n\t * @override\n\t */\n\tpreRender() {\n\t\tsuper.preRender();\n\t\t// add to template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tselected: this.model.get('display') === 1,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetConstituentView';\n\t}\n}\n","/**\n * Displays the constituents for a given asset. In the case of documents constituents are displayed as\n * pages. Video constituents are displayed as keyframes.\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetConstituentsView.html';\n\nimport ChildView from './assetConstituentView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nexport default class AssetConstituentsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t\tid(m) {\n\t\t\t\t\treturn `constituent-${m.id}`;\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\t// Give constitutents access to the asset so that we can respond to permissionMatrix changes\n\t\t\t\t\t// See note in constituents collection method `allows`\n\t\t\t\t\tasset: opts.model,\n\t\t\t\t\tclassName: 'constituent',\n\t\t\t\t\tdataAction: 'asset:constituent:choose',\n\t\t\t\t},\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.constituents');\n\t\topts.id = opts.id || 'asset-constituents-view';\n\t\topts.template = opts.template || Template;\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(\n\t\t\tthis.model,\n\t\t\t'change:permissionMatrix',\n\t\t\tthis.debouncedRender,\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetConstituentsView';\n\t}\n}\n\n// Functionality\nChildViews(AssetConstituentsView);\n","/**\n * @class\n */\nimport Base from '@netx/core-asset/views/assetConstituentView';\n\nexport default class SearchConstituentsListItemView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'constituent search-constituent';\n\t\topts.tagName = opts.tagName || 'div';\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchConstituentsListItemView';\n\t}\n}\n","import Base from '@netx/core-search/views/searchConstituentsListItemView';\n\nimport {faArrowDown, faPencilAlt} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaArrowDown,\n\tfaPencilAlt,\n});\n\nexport default class SearchConstituentsListItemView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-asset/views/assetConstituentsView';\n\nimport ChildView from './searchConstituentsListItemView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nexport default class SearchConstituentsListView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = {\n\t\t\tviewClass: ChildView,\n\t\t\tid(m) {\n\t\t\t\treturn `constituent-${m.id}`;\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.className = opts.className || 'constituent-list-wrapper';\n\t\topts.id = opts.id || 'search-constituents-list-view';\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\tsuper(opts);\n\n\t\tObject.assign(this.templateVars, {\n\t\t\tmessage: '',\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchConstituentsListView';\n\t}\n}\n\n// Functionality\nChildViews(SearchConstituentsListView);\n","/**\n * Displays a single asset clip constituent\n * @class\n */\nimport Base from './assetConstituentView';\nimport Template from '../templates/assetConstituentView_clip.html';\n\nexport default class AssetConstituentView_Clip extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * @memberOf Netx.Views.AssetConstituentView_clip\n\t\t * @property {object} Plugins - Plugins for this view\n\t\t * @property {object} Plugins.tooltip - Tooltip\n\t\t */\n\t\tthis.Plugins.Register({\n\t\t\ttooltip: {\n\t\t\t\tname: 'tooltip',\n\t\t\t\tdataAlias: 'bs.tooltip',\n\t\t\t\tmultiple: false,\n\t\t\t\toptions: {\n\t\t\t\t\tcontainer: 'body',\n\t\t\t\t\ttemplate:\n\t\t\t\t\t\t'<div class=\"tooltip video-clip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\n\t\tthis.stopListening(this.model, 'change');\n\t\treturn (\n\t\t\tthis.listenTo(\n\t\t\t\tthis.model,\n\t\t\t\t'change:startTime change:endTime change:title change:keyframeReady change:display',\n\t\t\t\tthis.debouncedRender,\n\t\t\t)\n\t\t\t\t// Keyframe progress\n\t\t\t\t.listenTo(this.model.progress, 'change', progress => {\n\t\t\t\t\tprogress.get('active')\n\t\t\t\t\t\t? this.showProgress(progress)\n\t\t\t\t\t\t: this.hideProgress();\n\t\t\t\t})\n\t\t);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\t// Cleanup\n\t\tthis.Plugins.Destroy('tooltip');\n\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\t\tconst cacheBuster = model.cacheBuster();\n\t\t// Set on template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tduration: model.getDuration(),\n\t\t\tpreviewModUrl: model.get('previewUrl') + cacheBuster,\n\t\t\tprettyRange: model.getPrettyRange(),\n\t\t\tthumbModUrl: model.get('thumbUrl') + cacheBuster,\n\t\t\tpercent: this.model.progress.get('percent'),\n\t\t\tprogressMessage: this.model.progress.get('message'),\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$progress = this.$('.progress');\n\t\tthis.$progressBar = this.$progress.find('.progress-bar');\n\t\tthis.$progressBarSr = this.$progressBar.find('.sr-only');\n\t\tthis.$progressMessage = this.$progress.find('.nx-progress-message');\n\t\tthis.$tooltip = this.$('[data-toggle=\"tooltip\"]');\n\n\t\t// Initilaize tooltip\n\t\tthis.Plugins.Initialize('tooltip', this.$tooltip);\n\n\t\t// Active progress\n\t\tif (this.model.progress.get('active')) {\n\t\t\tthis.showProgress(this.model.progress);\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t */\n\thideProgress() {\n\t\tthis.$el.removeClass('has-progress');\n\n\t\tthis.$progress && this.$progress.hide();\n\t\tthis.$progressBar &&\n\t\t\tthis.$progressBar.css('width', '0%').attr('aria-valuenow', 0);\n\t\tthis.$progressBarSr &&\n\t\t\tthis.$progressBarSr.html(i18n.t('i18n.percentLoaded', {percent: 0}));\n\t}\n\n\t/**\n\t * Show clip keyframe progress\n\t * @method\n\t * @param {module:asset/models/assetConstituent_clip} model Clip model\n\t * @param {number} progress Keyframe progress\n\t */\n\tkeyframeProgress(model, progress) {\n\t\tthis.$progress && this.$progress.css('width', progress + '%');\n\t}\n\n\t/**\n\t * @method\n\t * @param {Netx.Models.Progress} progress Progress model\n\t */\n\tshowProgress(progress) {\n\t\tthis.$progressMessage &&\n\t\t\tthis.$progressMessage.html(progress.get('message'));\n\t\tconst percent = progress.get('percent');\n\n\t\tif (_.isNumber(percent)) {\n\t\t\tthis.$el.addClass('has-progress');\n\t\t\tthis.$progress && this.$progress.show();\n\n\t\t\tthis.$progressBar &&\n\t\t\t\tthis.$progressBar\n\t\t\t\t\t.css('width', percent + '%')\n\t\t\t\t\t.attr('aria-valuenow', percent);\n\t\t\tthis.$progressBarSr &&\n\t\t\t\tthis.$progressBarSr.html(\n\t\t\t\t\ti18n.t('i18n.percentLoaded', {percent: percent}),\n\t\t\t\t);\n\t\t}\n\t}\n\n\t/** @override */\n\tunbindModelEvents() {\n\t\tsuper.unbindModelEvents();\n\n\t\treturn this.stopListening(this.model.progress);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetConstituentView_Clip';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-asset/views/assetConstituentView_clip';\nimport Template from '../templates/searchConstituentsListItemView_clip.html';\n\nexport default class SearchConstituentsListItemView_Clip extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = `constituent clip search-constituent card-medium nx-card-size-150 ${opts.className ||\n\t\t\t''}`;\n\t\topts.tagName = opts.tagName || 'div';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'change', _.debounce(this.render, 50));\n\t}\n\n\t/**\n\t * @override\n\t */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t_.extend(this.templateVars, {\n\t\t\tprettyRange: this.model.getPrettyRange(),\n\t\t\tduration: this.model.getDuration(),\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Wait for images to load\n\t\tthis.whenImagesLoaded.then(() => {\n\t\t\tthis.$el.addClass('image-ready');\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchConstituentsListItemView_Clip';\n\t}\n}\n","/**\n * @class\n */\nimport Base from './searchConstituentsListView';\nimport Template from '../templates/searchConstituentsListView_clips.html';\n\nimport ChildView from './searchConstituentsListItemView_clip';\n\nexport default class SearchConstituentsListView_Clips extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t\tid(model) {\n\t\t\t\t\treturn `constituent-${model.id}`;\n\t\t\t\t},\n\t\t\t\thref(model) {\n\t\t\t\t\treturn Netx.getUserLevel() >= 4\n\t\t\t\t\t\t? `#asset/${model.get('assetId')}/clips/edit/${model.id}`\n\t\t\t\t\t\t: `#asset/${model.get('assetId')}/clips`;\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\ttagName: 'a',\n\t\t\t\t\tclassName: 'constituent',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t'data-contextmenu-target': 'assetConstituentClipActions',\n\t\t\t\t\t\t'data-nx-template': 'menuView-context',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchConstituentsListView_Clips';\n\t}\n}\n","import BASE_RULE from '../baseRule';\nimport {SearchTypeSavedSearch} from './constants';\nimport {SavedSearchRule} from './types';\n\nexport const savedSearchRuleDefaults: SavedSearchRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeSavedSearch,\n\telementSubType1: 4,\n\telementSubType2: 0,\n\telementValue1: 0,\n};\n\nexport default savedSearchRuleDefaults;\n","import type {SavedSearchId} from '@netx/core-search-saved';\nimport {savedSearchRuleDefaults} from './defaults';\nimport {SavedSearchRule} from './types';\n\nexport const createSavedSearchRule = (id: SavedSearchId): SavedSearchRule => ({\n\t...savedSearchRuleDefaults,\n\telementValue1: id,\n});\n\nexport default createSavedSearchRule;\n","import {csvToArray} from '@netx/core/utils';\nimport {ATTRIBUTE_MULTIPLE_VALUE_TYPES} from '@netx/core-attribute/constants';\nimport {attributesStore} from '@netx/core-attribute/store/attributesStore';\nimport {SearchType} from '../rules/constants';\nimport {MetadataNoValueTypes} from '../rules/metadata/constants';\nimport type {EditablSearchRule, SearchRules} from '../rules/types';\n\nconst getNormalizedMultivalue = (value?: string | number) =>\n\tvalue == null || value === ''\n\t\t? []\n\t\t: value.toString().match(/^\".*\",.*\"$/)\n\t\t? csvToArray(value.toString())\n\t\t: Array.isArray(value)\n\t\t? value\n\t\t: [value.toString()];\n\nexport const convertRulesToRuleObjects = (searchRules: SearchRules) => {\n\tconst ruleObjects: EditablSearchRule[] = [];\n\n\t// This is to support old (perhaps bookmarked or otherwise saved) advanced search urls\n\tconst getMatchingAttributeValues = (index: number) => {\n\t\tconst values: Array<string | number | string[] | number[]> = [];\n\t\tconst elementType = searchRules.elementTypes[index];\n\t\tconst elementSubType1 = searchRules.elementSubType1s[index];\n\t\tconst elementSubType2 = searchRules.elementSubType2s[index];\n\t\tconst elementValue2 = searchRules.elementValue2s[index];\n\t\tfor (let i = index + 1, c = searchRules.elementTypes.length; i < c; i++) {\n\t\t\tif (\n\t\t\t\tsearchRules.elementTypes[i] !== elementType ||\n\t\t\t\tsearchRules.elementValue2s[i] !== elementValue2 ||\n\t\t\t\t// we are not looking at no value attribute rules\n\t\t\t\t(MetadataNoValueTypes as readonly number[]).includes(\n\t\t\t\t\tsearchRules.elementSubType1s[i],\n\t\t\t\t) ||\n\t\t\t\tsearchRules.elementSubType1s[i] !== elementSubType1 ||\n\t\t\t\tsearchRules.elementSubType2s[i] !== elementSubType2\n\t\t\t)\n\t\t\t\tbreak;\n\n\t\t\tvalues.push(getNormalizedMultivalue(searchRules.elementValue1s[i]));\n\t\t}\n\t\treturn values.flat();\n\t};\n\n\tfor (let i = 0, c = searchRules.elementTypes.length; i < c; i++) {\n\t\tconst elementType = searchRules.elementTypes[i];\n\t\tconst elementSubType1 = searchRules.elementSubType1s[i];\n\t\tconst elementSubType2 = searchRules.elementSubType2s[i];\n\t\tconst elementValue1 = searchRules.elementValue1s[i];\n\t\tconst elementValue2 = searchRules.elementValue2s[i];\n\t\tconst elementValue3 = searchRules.elementValue3s[i];\n\n\t\tif (elementType === SearchType.METADATA) {\n\t\t\tconst attr = attributesStore.getAttributeByName(elementValue2.toString());\n\t\t\tif (\n\t\t\t\tattr &&\n\t\t\t\t(ATTRIBUTE_MULTIPLE_VALUE_TYPES as number[]).includes(attr.type)\n\t\t\t) {\n\t\t\t\tconst _elementValue1 = getNormalizedMultivalue(elementValue1);\n\t\t\t\tconst matchingAttributeValues = getMatchingAttributeValues(i);\n\t\t\t\truleObjects.push({\n\t\t\t\t\telementType,\n\t\t\t\t\telementSubType1,\n\t\t\t\t\telementSubType2,\n\t\t\t\t\telementValue1: [..._elementValue1, ...matchingAttributeValues].flat(),\n\t\t\t\t\telementValue2,\n\t\t\t\t\telementValue3,\n\t\t\t\t});\n\t\t\t\ti = i + matchingAttributeValues.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\truleObjects.push({\n\t\t\telementType,\n\t\t\telementSubType1: searchRules.elementSubType1s[i],\n\t\t\telementSubType2: searchRules.elementSubType2s[i],\n\t\t\telementValue1,\n\t\t\telementValue2,\n\t\t\telementValue3,\n\t\t});\n\t}\n\n\treturn ruleObjects;\n};\n\nexport default convertRulesToRuleObjects;\n","import {faPencil} from '@fortawesome/pro-solid-svg-icons';\n\nexport const SEARCH_RULES_ACTION_ICON = <const>{\n\tEDIT_SEARCH: faPencil,\n};\n\nexport type SearchRulesBaseEvent = typeof SEARCH_RULES_BASE_EVENT;\n\nexport const SEARCH_RULES_BASE_EVENT = `search:rules`;\n\nexport const SEARCH_RULES_EVENT = <const>{\n\tEDIT_SEARCH: `${SEARCH_RULES_BASE_EVENT}:edit`,\n};\n","import {AssetGalleryPref} from '@netx/core-asset-gallery/constants';\nimport {getPreference} from '@netx/core-user/utils/getPreference';\n\n/**\n * Get user preferred sort field/order\n * @returns User preferred sort field/order\n */\nexport const getUserSort = () => {\n\treturn {\n\t\tsortField: getPreference(AssetGalleryPref.SortField) || 'file',\n\t\tsortOrder: parseInt(getPreference(AssetGalleryPref.SortOrder) || '0') || 0,\n\t};\n};\n\nexport default getUserSort;\n","import {areSearchTypesSortable} from './areSearchTypesSortable';\nimport {rulesContainCurrentCart} from '../rules/cart/utils';\nimport type {SearchRules} from '../rules/types';\n\n/**\n * Check if search rules are sortable (on the server)\n * @param searchRules\n * @returns Search rules are sortable\n */\nexport const areSearchRulesSortable = (searchRules: SearchRules) =>\n\tareSearchTypesSortable(searchRules.elementTypes) &&\n\t!rulesContainCurrentCart(searchRules);\n\nexport default areSearchRulesSortable;\n","import type {SearchRule, SearchRules} from '../rules';\n\n/**\n * Get a rule by index, used primarily for getting strict typing via `elementType`\n * @param rules Search rules\n * @param index Index to get rule from\n * @returns Rule at index\n */\nexport const getRuleAtIndex = <T extends SearchRules = SearchRules>(\n\trules: T,\n\tindex: number,\n) => {\n\tconst elementType = rules.elementTypes[index];\n\tconst elementSubType1 = rules.elementSubType1s[index];\n\tconst elementSubType2 = rules.elementSubType2s[index];\n\tconst elementValue1 = rules.elementValue1s[index];\n\tconst elementValue2 = rules.elementValue2s[index];\n\tconst elementValue3 = rules.elementValue3s[index];\n\n\treturn {\n\t\telementType,\n\t\telementSubType1,\n\t\telementSubType2,\n\t\telementValue1,\n\t\telementValue2,\n\t\telementValue3,\n\t} as SearchRule<typeof elementType>;\n};\n\nexport default getRuleAtIndex;\n","import BASE_RULE from '../baseRule';\nimport {SearchTypeAdvancedRaw} from './constants';\nimport {AdvancedRawRule} from './types';\n\nexport const advancedRawRuleDefaults: AdvancedRawRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeAdvancedRaw,\n\telementSubType1: 4,\n\telementValue1: '',\n};\n\nexport default advancedRawRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {SearchTypeAttributeHistory} from './constants';\nimport {AttributeHistoryRule} from './types';\n\nexport const attributeHistoryRuleDefaults: AttributeHistoryRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeAttributeHistory,\n\telementSubType1: 4,\n\telementValue1: 0,\n\telementValue3: '',\n};\n\nexport default attributeHistoryRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {CheckoutType, SearchTypeCheckouts} from './constants';\nimport {CheckoutsRule} from './types';\n\nexport const checkoutsRuleDefaults: CheckoutsRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeCheckouts,\n\telementSubType1: CheckoutType.ALL,\n\telementSubType2: 0,\n\t/**\n\t * @default all\n\t */\n\telementValue1: 0,\n};\n\nexport default checkoutsRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {ContentsType, SearchTypeContents} from './constants';\nimport {ContentsRule} from './types';\n\nexport const contentsRuleDefaults: ContentsRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeContents,\n\telementSubType1: ContentsType.MATCH_ALL_FRAGMENTS,\n};\n\nexport default contentsRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {SearchTypeDate, DateType, DateSubType} from './constants';\nimport {DateRule} from './types';\n\nexport const dateRuleDefaults: DateRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeDate,\n\telementSubType1: DateType.CREATION_DATE,\n\telementSubType2: DateSubType.TODAY,\n};\n\nexport default dateRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {\n\tSearchTypeFileAspect,\n\tFileAspectType,\n\tFileAspectSubType,\n\tFileAspectOrientationValue,\n} from './constants';\nimport {FileAspectRule} from './types';\n\nexport const fileAspectRuleDefaults: FileAspectRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeFileAspect,\n\telementSubType1: FileAspectType.ORIENTATION,\n\telementSubType2: FileAspectSubType.EQUAL_TO,\n\telementValue1: FileAspectOrientationValue.LANDSCAPE,\n};\n\nexport default fileAspectRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {SearchTypeFileFormat, FileFormatType} from './constants';\nimport {FileFormatRule} from './types';\n\nexport const fileFormatRuleDefaults: FileFormatRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeFileFormat,\n\telementSubType1: FileFormatType.ONLY,\n\telementValue1: '',\n};\n\nexport default fileFormatRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {SearchTypeFileFormatFamily} from './constants';\nimport {FileFormatFamilyRule} from './types';\n\nexport const fileFormatFamilyRuleDefaults: FileFormatFamilyRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeFileFormatFamily,\n\telementSubType1: 4,\n\telementValue1: '',\n};\n","import BASE_RULE from '../baseRule';\nimport {FileSizeMetric, FileSizeType, SearchTypeFileSize} from './constants';\nimport {FileSizeRule} from './types';\n\nexport const fileSizeRuleDefaults: FileSizeRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeFileSize,\n\telementSubType1: FileSizeType.APPROXIMATELY,\n\telementSubType2: FileSizeMetric.BYTES,\n\telementValue1: 0,\n};\n\nexport default fileSizeRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {UserType, SearchTypeUser} from './constants';\nimport {UserRule} from './types';\n\nexport const userRuleDefaults: UserRule = {\n\t...BASE_RULE,\n\telementType: SearchTypeUser,\n\telementSubType1: UserType.IMPORTED_BY,\n\telementSubType2: 0,\n\telementValue1: 0,\n};\n\nexport default userRuleDefaults;\n","import BASE_RULE from '../baseRule';\nimport {VisualType, SearchTypeVisual} from './constants';\nimport {VisualRule} from './types';\n\nexport const visualRuleDefaults: VisualRule<VisualType.ASSET> = {\n\t...BASE_RULE,\n\telementType: SearchTypeVisual,\n\telementSubType1: VisualType.ASSET,\n\telementValue1: 0,\n};\n\nexport default visualRuleDefaults;\n","import {SearchType} from '../rules/constants';\nimport {advancedRawRuleDefaults} from '../rules/advancedRaw/defaults';\nimport {attributeHistoryRuleDefaults} from '../rules/attributeHistory/defaults';\nimport {cartRuleDefaults} from '../rules/cart/defaults';\nimport {categoryIdRuleDefaults} from '../rules/categoryId/defaults';\nimport {checkoutsRuleDefaults} from '../rules/checkouts/defaults';\nimport {contentsRuleDefaults} from '../rules/contents/defaults';\nimport {dateRuleDefaults} from '../rules/date/defaults';\nimport {expirationRuleDefaults} from '../rules/expiration/defaults';\nimport {fileAspectRuleDefaults} from '../rules/fileAspect/defaults';\nimport {fileFormatRuleDefaults} from '../rules/fileFormat/defaults';\nimport {fileFormatFamilyRuleDefaults} from '../rules/fileFormatFamily/defaults';\nimport {fileSizeRuleDefaults} from '../rules/fileSize/defaults';\nimport {keywordRuleDefaults} from '../rules/keyword/defaults';\nimport {metadataRuleDefaults} from '../rules/metadata/defaults';\nimport {savedSearchRuleDefaults} from '../rules/savedSearch/defaults';\nimport {userRuleDefaults} from '../rules/user/defaults';\nimport {visualRuleDefaults} from '../rules/visual/defaults';\n\nimport {BASE_RULE} from '../rules/baseRule';\n\nconst RuleDefaultsMap = <const>{\n\t[SearchType.ADVANCED_RAW]: advancedRawRuleDefaults,\n\t[SearchType.ATTRIBUTE_HISTORY]: attributeHistoryRuleDefaults,\n\t[SearchType.CART]: cartRuleDefaults,\n\t[SearchType.CATEGORY_ID]: categoryIdRuleDefaults,\n\t[SearchType.CHECKOUTS]: checkoutsRuleDefaults,\n\t[SearchType.CONTENTS]: contentsRuleDefaults,\n\t[SearchType.DATE]: dateRuleDefaults,\n\t[SearchType.EXPIRE]: expirationRuleDefaults,\n\t[SearchType.FILE_ASPECT]: fileAspectRuleDefaults,\n\t[SearchType.FILE_FORMAT]: fileFormatRuleDefaults,\n\t[SearchType.FILE_FORMAT_FAMILY]: fileFormatFamilyRuleDefaults,\n\t[SearchType.FILE_SIZE]: fileSizeRuleDefaults,\n\t[SearchType.KEYWORD]: keywordRuleDefaults,\n\t[SearchType.METADATA]: metadataRuleDefaults,\n\t[SearchType.SAVED_SEARCH]: savedSearchRuleDefaults,\n\t[SearchType.USER]: userRuleDefaults,\n\t[SearchType.VISUAL]: visualRuleDefaults,\n};\n\nexport const getRuleDefaults = (type: SearchType) =>\n\tRuleDefaultsMap[type] || BASE_RULE;\n\nexport default getRuleDefaults;\n","import type {RuleValidationErrors} from '../types';\nimport type {AdvancedRawRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nexport const validateAdvancedRawRule = <\n\tT extends AdvancedRawRule = AdvancedRawRule,\n>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tif (typeof rule.elementValue1 !== 'string' || rule.elementValue1 === '') {\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\t}\n\treturn false;\n};\n\nexport default validateAdvancedRawRule;\n","import {action, computed, observable, makeObservable, runInAction} from 'mobx';\nimport {RuleModel} from '../baseModel';\nimport {SearchTypeAdvancedRaw, TSearchTypeAdvancedRaw} from './constants';\nimport {advancedRawRuleDefaults} from './defaults';\nimport type {AdvancedRawRule} from './types';\nimport {validateAdvancedRawRule} from './validate';\n\nexport class AdvancedRawRuleModel\n\textends RuleModel<TSearchTypeAdvancedRaw>\n\timplements AdvancedRawRule\n{\n\treadonly elementType = SearchTypeAdvancedRaw;\n\treadonly elementSubType1: 4;\n\treadonly elementSubType2: 0;\n\telementValue1: string;\n\treadonly elementValue2: '';\n\treadonly elementValue3: '';\n\n\tget isValid() {\n\t\tconst validation = validateAdvancedRawRule(this);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<AdvancedRawRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...advancedRawRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\telementValue1: observable,\n\t\t\tvalidationErrors: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementValue1: action,\n\t\t});\n\t}\n\n\t/** stubbed */\n\tsetElementSubType1() {}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set raw query\n\t * @param elementValue1 raw query\n\t */\n\tsetElementValue1(elementValue1: string) {\n\t\tthis.elementValue1 = elementValue1;\n\t\tthis.dirty = true;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default AdvancedRawRuleModel;\n","import {action, computed, observable, makeObservable, runInAction} from 'mobx';\nimport {RuleModel} from '../baseModel';\nimport {\n\tSearchTypeAttributeHistory,\n\tTSearchTypeAttributeHistory,\n} from './constants';\nimport {attributeHistoryRuleDefaults} from './defaults';\nimport type {AttributeHistoryRule} from './types';\nimport {validateAttributeHistoryRule} from './validate';\n\nexport class AttributeHistoryRuleModel\n\textends RuleModel<TSearchTypeAttributeHistory>\n\timplements AttributeHistoryRule\n{\n\treadonly elementType = SearchTypeAttributeHistory;\n\telementSubType1: 4;\n\telementSubType2: 0;\n\telementValue1: number;\n\telementValue2: string;\n\telementValue3: '';\n\n\tget isValid() {\n\t\treturn validateAttributeHistoryRule(this);\n\t}\n\n\tconstructor(params?: Partial<Omit<AttributeHistoryRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...attributeHistoryRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\tisValid: computed,\n\t\t\telementValue1: observable,\n\t\t\telementValue2: observable,\n\t\t\tsetElementValue1: action,\n\t\t\tsetElementValue2: action,\n\t\t});\n\t}\n\n\t/** stubbed */\n\tsetElementSubType1() {}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\tsetElementValue1(elementValue1: number) {\n\t\tthis.elementValue1 = elementValue1;\n\t}\n\n\tsetElementValue2(elementValue2: string) {\n\t\tthis.elementValue2 = elementValue2;\n\t}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default AttributeHistoryRuleModel;\n","import {AttributeHistoryRule} from './types';\n\nexport const validateAttributeHistoryRule = <\n\tT extends AttributeHistoryRule = AttributeHistoryRule,\n>(\n\trule: T,\n) => {\n\treturn true;\n};\n\nexport default validateAttributeHistoryRule;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport {UserId} from '../types';\n\n/**\n * `getUserLabel` request params\n * (what is used to send to server)\n */\nexport interface GetUserLabelRequestOptions {\n\tid: UserId;\n}\n\n/**\n * `getUserLabel` request\n * (what gets sent to the server)\n */\nexport type GetUserLabelRequest = [GetUserLabelRequestOptions['id']];\n\n/**\n * `getUserLabel` response\n * (what comes back from the server)\n */\nexport type GetUserLabelResponse = SuccessResponse<GetUserLabelResult>;\n\n/**\n * `getUserLabel` result\n * (what is utilized from the server response)\n */\nexport type GetUserLabelResult = string;\n\nexport const getUserLabelEndpoint = 'getUserLabel';\n\n/**\n * Get user label by id\n * @param fetchParams Fetch params\n */\nexport const getUserLabel = async ({id}: GetUserLabelRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetUserLabelRequest = [id];\n\n\treturn client\n\t\t.post<GetUserLabelResponse>(getUserLabelEndpoint, requestParams)\n\t\t.then((response) => response.data.result);\n};\nexport default getUserLabel;\n","import type {RuleValidationErrors} from '../types';\nimport {CheckoutType} from './constants';\nimport type {CheckoutsRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nexport const validateCheckoutsRule = <T extends CheckoutsRule = CheckoutsRule>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tif (rule.elementSubType1 === CheckoutType.ALL && rule.elementValue1 !== 0)\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\n\tif (\n\t\trule.elementSubType1 === CheckoutType.USER_ID &&\n\t\t(typeof rule.elementValue1 !== 'number' || rule.elementValue1 <= 0)\n\t)\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\n\treturn false;\n};\n\nexport default validateCheckoutsRule;\n","import {\n\taction,\n\tautorun,\n\tobservable,\n\tmakeObservable,\n\tcomputed,\n\treaction,\n\trunInAction,\n} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {getUserLabel} from '@netx/core-user/api/getUserLabel';\nimport {RuleModel} from '../baseModel';\nimport {\n\tCheckoutType,\n\tSearchTypeCheckouts,\n\tTSearchTypeCheckouts,\n} from './constants';\nimport {checkoutsRuleDefaults} from './defaults';\nimport type {CheckoutsRule} from './types';\nimport {validateCheckoutsRule} from './validate';\n\nexport class CheckoutsRuleModel\n\textends RuleModel<TSearchTypeCheckouts>\n\timplements Omit<CheckoutsRule, 'elementValue1'>\n{\n\treadonly elementType = SearchTypeCheckouts;\n\telementSubType1: CheckoutType;\n\telementSubType2: 0;\n\telementValue1: number;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(CheckoutType);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateCheckoutsRule(this as CheckoutsRule);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<CheckoutsRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...checkoutsRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementValue1: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementValue1: action,\n\t\t});\n\n\t\tthis.reactionDisposers.push(\n\t\t\treaction(\n\t\t\t\t() => this.elementSubType1,\n\t\t\t\t(elementSubType1) => {\n\t\t\t\t\tif (elementSubType1 === CheckoutType.ALL) {\n\t\t\t\t\t\tthis.elementValue1 = 0;\n\t\t\t\t\t\tthis.setElementValue1Label('');\n\t\t\t\t\t\tthis.setElementValue1Loading(false);\n\t\t\t\t\t\tthis.dirty = false;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\tautorun(() => {\n\t\t\t\tthis.setElementValue1Unavailable(false);\n\n\t\t\t\tif (!this.elementValue1) return;\n\n\t\t\t\tthis.setElementValue1Loading(true);\n\n\t\t\t\tgetUserLabel({id: this.elementValue1})\n\t\t\t\t\t.then((userLabel) => {\n\t\t\t\t\t\tthis.setElementValue1Label(userLabel);\n\t\t\t\t\t})\n\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\tthis.setElementValue1Unavailable(true);\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis.setElementValue1Loading(false);\n\t\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t}\n\n\tsetElementSubType1(elementSubType1: CheckoutType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\tsetElementValue1(elementValue1: number) {\n\t\tthis.elementValue1 = elementValue1;\n\t\tthis.dirty = true;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default CheckoutsRuleModel;\n","import type {RuleValidationErrors} from '../types';\nimport {ContentsType} from './constants';\nimport {ContentsRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nexport const validateContentsRule = <T extends ContentsRule = ContentsRule>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tif (rule.elementValue1 === '') {\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\t}\n\treturn false;\n};\n\nexport default validateContentsRule;\n","import {action, computed, observable, makeObservable, runInAction} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {RuleModel} from '../baseModel';\nimport {\n\tContentsType,\n\tSearchTypeContents,\n\tTSearchTypeContents,\n} from './constants';\nimport {contentsRuleDefaults} from './defaults';\nimport type {ContentsRule} from './types';\nimport {validateContentsRule} from './validate';\n\nexport class ContentsRuleModel\n\textends RuleModel<TSearchTypeContents>\n\timplements ContentsRule\n{\n\treadonly elementType = SearchTypeContents;\n\telementSubType1: ContentsType;\n\telementSubType2: 0;\n\telementValue1: string;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(ContentsType);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateContentsRule(this);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<ContentsRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...contentsRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\tisValid: computed,\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementValue1: observable,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementValue1: action,\n\t\t});\n\t}\n\n\tsetElementSubType1(elementSubType1: ContentsType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set contents\n\t * @param elementValue1 contents\n\t */\n\tsetElementValue1(elementValue1: string) {\n\t\tthis.elementValue1 = elementValue1;\n\t\tthis.dirty = true;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default ContentsRuleModel;\n","import type {RuleValidationErrors} from '../types';\nimport {\n\tDateSubType,\n\tDateNoValueTypes,\n\tDateSingleValueTypes,\n\tDateSystemDefinedTypes,\n} from './constants';\nimport type {DateRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nconst validateDate = (date: string) =>\n\t/^\\d{4}\\-(0?[1-9]|1[012])\\-(0?[1-9]|[12][0-9]|3[01])$/.test(date);\n\nexport const validateDateRule = <T extends DateRule = DateRule>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tconst hasElementValue1 = rule.elementValue1 !== '';\n\tconst hasElementValue2 = rule.elementValue2 !== '';\n\tconst hasElementValue3 = rule.elementValue3 !== '';\n\n\tconst errors: RuleValidationErrors = {};\n\n\tif (\n\t\t// if system defined, then no value3 should be set\n\t\t(DateSystemDefinedTypes.includes(rule.elementSubType1 as any) &&\n\t\t\thasElementValue3) ||\n\t\t// if not system defined, then value3 should be set\n\t\t(!DateSystemDefinedTypes.includes(rule.elementSubType1 as any) &&\n\t\t\t!hasElementValue3)\n\t)\n\t\terrors.elementValue3 = createValidationObject();\n\n\t// if no values should be set\n\tif ((DateNoValueTypes as readonly number[]).includes(rule.elementSubType2)) {\n\t\tif (hasElementValue1) errors.elementValue1 = createValidationObject();\n\t\tif (hasElementValue2) errors.elementValue2 = createValidationObject();\n\t}\n\t// if only a single value, value1 should be set but not value2\n\telse if (\n\t\t(DateSingleValueTypes as readonly number[]).includes(rule.elementSubType2)\n\t) {\n\t\tif (!hasElementValue1 || !validateDate(rule.elementValue1))\n\t\t\terrors.elementValue1 = createValidationObject();\n\t\tif (hasElementValue2) errors.elementValue2 = createValidationObject();\n\t}\n\t// if `in_between` then we need a value1 and value2 set\n\telse if (rule.elementSubType2 === DateSubType.IN_BETWEEN) {\n\t\tconst compareStartValue = new Date(rule.elementValue1).getTime();\n\t\tconst compareEndValue = new Date(rule.elementValue2).getTime();\n\n\t\tif (!hasElementValue1 || !validateDate(rule.elementValue1))\n\t\t\terrors.elementValue1 = createValidationObject();\n\t\tif (\n\t\t\t!hasElementValue2 ||\n\t\t\t!validateDate(rule.elementValue2) ||\n\t\t\tcompareStartValue >= compareEndValue\n\t\t)\n\t\t\terrors.elementValue2 = createValidationObject();\n\t}\n\n\treturn Object.keys(errors).length ? errors : false;\n};\n\nexport default validateDateRule;\n","import {\n\taction,\n\tobservable,\n\tmakeObservable,\n\tcomputed,\n\trunInAction,\n\treaction,\n} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {RuleModel} from '../baseModel';\nimport {\n\tDateSubType,\n\tDateType,\n\tDateNoValueTypes,\n\tSystemDefined,\n\tSearchTypeDate,\n\tTSearchTypeDate,\n} from './constants';\nimport {dateRuleDefaults} from './defaults';\nimport type {DateRule} from './types';\nimport {validateDateRule} from './validate';\n\nexport class DateRuleModel\n\textends RuleModel<TSearchTypeDate>\n\timplements\n\t\tOmit<DateRule, 'elementValue1' | 'elementValue2' | 'elementValue3'>\n{\n\treadonly elementType = SearchTypeDate;\n\telementSubType1: DateType;\n\telementSubType2: DateSubType;\n\telementValue1: string | '';\n\telementValue2: string | '';\n\telementValue3: string | '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(DateType);\n\t}\n\n\tget elementSubType2Options() {\n\t\treturn enumToValues(DateSubType);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateDateRule(this as DateRule);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<DateRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...dateRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementSubType2: observable,\n\t\t\telementSubType2Options: computed,\n\t\t\telementValue1: observable,\n\t\t\telementValue2: observable,\n\t\t\telementValue3: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementSubType2: action,\n\t\t\tsetElementValue1: action,\n\t\t\tsetElementValue2: action,\n\t\t\tsetElementValue3: action,\n\t\t});\n\n\t\tthis.reactionDisposers.push(\n\t\t\treaction(\n\t\t\t\t() => this.elementSubType1,\n\t\t\t\t(elementSubType1) => {\n\t\t\t\t\t// no value3 if non user defined attribute\n\t\t\t\t\tif (elementSubType1 !== DateType.USER_DEFINED_ATTRIBUTE) {\n\t\t\t\t\t\tthis.elementValue3 = '';\n\t\t\t\t\t}\n\t\t\t\t\tif (this.elementValue1 === '' && this.elementValue2 === '') {\n\t\t\t\t\t\tthis.dirty = false;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\treaction(\n\t\t\t\t() => this.elementSubType2,\n\t\t\t\t(elementSubType2) => {\n\t\t\t\t\t// no value2 if not `in_between`\n\t\t\t\t\tif (DateNoValueTypes.includes(elementSubType2 as any)) {\n\t\t\t\t\t\tthis.elementValue1 = '';\n\t\t\t\t\t\tthis.elementValue2 = '';\n\t\t\t\t\t\tthis.dirty = false;\n\t\t\t\t\t} else if (elementSubType2 !== DateSubType.IN_BETWEEN) {\n\t\t\t\t\t\tthis.elementValue2 = '';\n\t\t\t\t\t\tif (this.elementValue1 === '') {\n\t\t\t\t\t\t\tthis.dirty = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t}\n\n\tsetElementSubType1(elementSubType1: DateType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\tsetElementSubType2(elementSubType2: DateSubType) {\n\t\tthis.elementSubType2 = elementSubType2;\n\t}\n\n\t/**\n\t * @param elementValue1 Start date if `in_between`, selected date if `before` or `after`, otherwise stubbed as `\"\"`\n\t */\n\tsetElementValue1<T2 extends DateSubType = DateSubType>(\n\t\telementValue1: [T2] extends [\n\t\t\tDateSubType.AFTER | DateSubType.BEFORE | DateSubType.IN_BETWEEN,\n\t\t]\n\t\t\t? string\n\t\t\t: '',\n\t) {\n\t\tthis.dirty = this.elementValue1 !== elementValue1;\n\t\tthis.elementValue1 = elementValue1 as this['elementValue1'];\n\t}\n\n\t/**\n\t * @param elementValue2 End date if `in_between`, otherwise stubbed as `\"\"`\n\t */\n\tsetElementValue2<T2 extends DateSubType = DateSubType>(\n\t\telementValue2: [T2] extends [DateSubType.IN_BETWEEN] ? '' : string,\n\t) {\n\t\tthis.dirty = this.elementValue2 !== elementValue2;\n\t\tthis.elementValue2 = elementValue2 as this['elementValue2'];\n\t}\n\n\t/**\n\t * @param elementValue3 User defined attribute name, otherwise stubbed as `\"\"`\n\t */\n\tsetElementValue3<T extends DateType = DateType>(\n\t\telementValue3: [T] extends [SystemDefined] ? '' : string,\n\t) {\n\t\tthis.elementValue3 = elementValue3 as this['elementValue3'];\n\t}\n}\n\nexport default DateRuleModel;\n","import {computed, makeObservable, runInAction} from 'mobx';\nimport {RuleModel} from '../baseModel';\nimport {SearchTypeExpiration, TSearchTypeExpiration} from './constants';\nimport {expirationRuleDefaults} from './defaults';\nimport type {ExpirationRule} from './types';\nimport {validateExpirationRule} from './validate';\n\nexport class ExpirationRuleModel\n\textends RuleModel<TSearchTypeExpiration>\n\timplements ExpirationRule\n{\n\treadonly elementType = SearchTypeExpiration;\n\telementSubType1: 0;\n\telementSubType2: 0;\n\telementValue1: '';\n\telementValue2: '';\n\telementValue3: '';\n\n\tget isValid() {\n\t\treturn validateExpirationRule(this);\n\t}\n\n\tconstructor(params?: Partial<Omit<ExpirationRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...expirationRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\tisValid: computed,\n\t\t});\n\t}\n\n\t/** stubbed */\n\tsetElementSubType1() {}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/** stubbed */\n\tsetElementValue1() {}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default ExpirationRuleModel;\n","import {ExpirationRule} from './types';\n\nexport const validateExpirationRule = <\n\tT extends ExpirationRule = ExpirationRule,\n>(\n\trule: T,\n) => {\n\treturn true;\n};\n\nexport default validateExpirationRule;\n","import type {RuleValidationErrors} from '../types';\nimport {FileAspectType, FileAspectOrientationValue} from './constants';\nimport type {FileAspectRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nexport const validateFileAspectRule = <\n\tT extends FileAspectRule = FileAspectRule,\n>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tif (\n\t\trule.elementSubType1 === FileAspectType.ORIENTATION &&\n\t\t![\n\t\t\tFileAspectOrientationValue.LANDSCAPE,\n\t\t\tFileAspectOrientationValue.PORTRAIT,\n\t\t].includes(rule.elementValue1)\n\t) {\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\t}\n\n\tif (rule.elementValue1.toString() === '')\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\n\treturn false;\n};\n\nexport default validateFileAspectRule;\n","import {\n\taction,\n\tobservable,\n\tmakeObservable,\n\tcomputed,\n\treaction,\n\trunInAction,\n} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {RuleModel} from '../baseModel';\nimport {\n\tFileAspectType,\n\tFileAspectSubType,\n\tFileAspectOrientationValue,\n\tSearchTypeFileAspect,\n\tTSearchTypeFileAspect,\n} from './constants';\nimport {fileAspectRuleDefaults} from './defaults';\nimport type {FileAspectRule} from './types';\nimport {validateFileAspectRule} from './validate';\n\nconst getFileAspectSubTypeOptions = (fileAspectType: FileAspectType) => {\n\tif (fileAspectType !== FileAspectType.ORIENTATION)\n\t\treturn enumToValues(FileAspectSubType);\n\treturn [FileAspectSubType.EQUAL_TO];\n};\n\nexport class FileAspectRuleModel\n\textends RuleModel<TSearchTypeFileAspect>\n\timplements FileAspectRule\n{\n\treadonly elementType = SearchTypeFileAspect;\n\telementSubType1: FileAspectType = fileAspectRuleDefaults.elementSubType1;\n\telementSubType2: FileAspectSubType = fileAspectRuleDefaults.elementSubType2;\n\telementValue1: number = fileAspectRuleDefaults.elementValue1;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(FileAspectType);\n\t}\n\n\tget elementSubType2Options() {\n\t\treturn getFileAspectSubTypeOptions(this.elementSubType1);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateFileAspectRule(this);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<FileAspectRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...fileAspectRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementSubType2: observable,\n\t\t\telementSubType2Options: computed,\n\t\t\telementValue1: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementSubType2: action,\n\t\t\tsetElementValue1: action,\n\t\t});\n\n\t\tthis.reactionDisposers.push(\n\t\t\treaction(\n\t\t\t\t() => this.elementSubType2Options,\n\t\t\t\t(elementSubType2Options) => {\n\t\t\t\t\tif (!elementSubType2Options.includes(this.elementSubType2)) {\n\t\t\t\t\t\tthis.setElementSubType2(elementSubType2Options[0]);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\n\t\tthis.reactionDisposers.push(\n\t\t\treaction(\n\t\t\t\t() => this.elementSubType1,\n\t\t\t\t(elementSubType1, prevElementSubType1) => {\n\t\t\t\t\tif (elementSubType1 === FileAspectType.ORIENTATION) {\n\t\t\t\t\t\tthis.elementValue1 = FileAspectOrientationValue.LANDSCAPE;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (prevElementSubType1 === FileAspectType.ORIENTATION) {\n\t\t\t\t\t\t// set to 0 for input value\n\t\t\t\t\t\tthis.elementValue1 = 0;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Set file aspect type\n\t * @param elementSubType1 FileAspectType\n\t */\n\tsetElementSubType1(elementSubType1: FileAspectType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/**\n\t * Set file aspect compute type\n\t * @param elementSubType2 FileAspectSubType\n\t */\n\tsetElementSubType2(elementSubType2: FileAspectSubType) {\n\t\tthis.elementSubType2 = elementSubType2;\n\t}\n\n\t/**\n\t * Set file aspect\n\t * @param elementValue1 number | FileAspectOrientationValue\n\t */\n\tsetElementValue1(elementValue1: number | FileAspectOrientationValue) {\n\t\tthis.elementValue1 = elementValue1;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default FileAspectRuleModel;\n","import {action, computed, observable, makeObservable} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {fileTypes} from '@netx/core-search/properties/search';\nimport {RuleModel} from '../baseModel';\nimport {\n\tFileFormatType,\n\tSearchTypeFileFormat,\n\tTSearchTypeFileFormat,\n} from './constants';\nimport {fileFormatRuleDefaults} from './defaults';\nimport type {FileFormatRule} from './types';\nimport {validateFileFormatRule} from './validate';\n\nexport class FileFormatRuleModel\n\textends RuleModel<TSearchTypeFileFormat>\n\timplements FileFormatRule\n{\n\treadonly elementType = SearchTypeFileFormat;\n\telementSubType1: FileFormatType;\n\telementSubType2: 0 = 0;\n\telementValue1: string;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(FileFormatType);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateFileFormatRule(this);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<FileFormatRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\tObject.assign(this, {\n\t\t\t...fileFormatRuleDefaults,\n\t\t\telementValue1: Object.keys(fileTypes)[0],\n\t\t\t...params,\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\tisValid: computed,\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementValue1: observable,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementValue1: action,\n\t\t});\n\t}\n\n\t/**\n\t * Set match type\n\t * @param elementSubType1 FileFormatType\n\t */\n\tsetElementSubType1(elementSubType1: FileFormatType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set file format\n\t * @param elementValue1 file format\n\t */\n\tsetElementValue1(elementValue1: string) {\n\t\tthis.elementValue1 = elementValue1;\n\t\tthis.dirty = true;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default FileFormatRuleModel;\n","import {action, computed, observable, makeObservable, runInAction} from 'mobx';\nimport {fileFormatFamilies} from '@netx/core-search/properties/search';\nimport {RuleModel} from '../baseModel';\nimport {\n\tSearchTypeFileFormatFamily,\n\tTSearchTypeFileFormatFamily,\n} from './constants';\nimport {fileFormatFamilyRuleDefaults} from './defaults';\nimport type {FileFormatFamilyRule} from './types';\nimport {validateFileFormatFamily} from './validate';\n\nexport class FileFormatFamilyRuleModel\n\textends RuleModel<TSearchTypeFileFormatFamily>\n\timplements FileFormatFamilyRule\n{\n\treadonly elementType = SearchTypeFileFormatFamily;\n\telementSubType1: 4;\n\telementSubType2: 0;\n\telementValue1: string;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget isValid() {\n\t\tconst validation = validateFileFormatFamily(this);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<FileFormatFamilyRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {\n\t\t\t\t...fileFormatFamilyRuleDefaults,\n\t\t\t\telementValue1: Object.values(fileFormatFamilies)[0],\n\t\t\t\t...params,\n\t\t\t});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\tisValid: computed,\n\t\t\telementValue1: observable,\n\t\t\tsetElementValue1: action,\n\t\t});\n\t}\n\n\t/** stubbed */\n\tsetElementSubType1() {}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set file format family\n\t * @param elementValue1 file format family\n\t */\n\tsetElementValue1(elementValue1: string) {\n\t\tthis.elementValue1 = elementValue1;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default FileFormatFamilyRuleModel;\n","import type {RuleValidationErrors} from '../types';\nimport type {FileSizeRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nexport const validateFileSizeRule = <T extends FileSizeRule = FileSizeRule>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tif (isNaN(rule.elementValue1) || rule.elementValue1.toString() === '') {\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\t}\n\treturn false;\n};\n\nexport default validateFileSizeRule;\n","import {action, computed, observable, makeObservable, runInAction} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {RuleModel} from '../baseModel';\nimport {\n\tFileSizeType,\n\tFileSizeMetric,\n\tSearchTypeFileSize,\n\tTSearchTypeFileSize,\n} from './constants';\nimport {fileSizeRuleDefaults} from './defaults';\nimport type {FileSizeRule} from './types';\nimport {validateFileSizeRule} from './validate';\n\nexport class FileSizeRuleModel\n\textends RuleModel<TSearchTypeFileSize>\n\timplements FileSizeRule\n{\n\treadonly elementType = SearchTypeFileSize;\n\telementSubType1: FileSizeType;\n\telementSubType2: FileSizeMetric;\n\telementValue1: number;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(FileSizeType);\n\t}\n\n\tget elementSubType2Options() {\n\t\treturn enumToValues(FileSizeMetric);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateFileSizeRule(this);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<FileSizeRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...fileSizeRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementSubType2: observable,\n\t\t\telementSubType2Options: computed,\n\t\t\telementValue1: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementSubType2: action,\n\t\t\tsetElementValue1: action,\n\t\t});\n\t}\n\n\t/**\n\t * Set file size compute type\n\t * @param elementSubType1 FileSizeType\n\t */\n\tsetElementSubType1(elementSubType1: FileSizeType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/**\n\t * Set file size metric\n\t * @param elementSubType2 FileSizeMetric\n\t */\n\tsetElementSubType2(elementSubType2: FileSizeMetric) {\n\t\tthis.elementSubType2 = elementSubType2;\n\t}\n\n\t/**\n\t * Set file size\n\t * @param elementValue1 file size\n\t */\n\tsetElementValue1(elementValue1: number) {\n\t\tthis.elementValue1 = elementValue1;\n\t\tthis.dirty = true;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default FileSizeRuleModel;\n","import {action, computed, observable, makeObservable, runInAction} from 'mobx';\nimport {RuleModel} from '../baseModel';\nimport {savedSearchRuleDefaults} from './defaults';\nimport {SearchTypeSavedSearch, TSearchTypeSavedSearch} from './constants';\nimport type {SavedSearchRule} from './types';\nimport {validateSavedSearchRule} from './validate';\n\nexport class SavedSearchRuleModel\n\textends RuleModel<TSearchTypeSavedSearch>\n\timplements SavedSearchRule\n{\n\treadonly elementType = SearchTypeSavedSearch;\n\telementSubType1: 4;\n\telementSubType2: 0;\n\telementValue1: number;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget isValid() {\n\t\treturn validateSavedSearchRule(this);\n\t}\n\n\tconstructor(params?: Partial<Omit<SavedSearchRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...savedSearchRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\telementValue1: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementValue1: action,\n\t\t});\n\t}\n\n\t/** stubbed */\n\tsetElementSubType1() {}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set saved search id\n\t * @param elementValue1 saved search id\n\t */\n\tsetElementValue1(elementValue1: number) {\n\t\tthis.elementValue1 = elementValue1;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default SavedSearchRuleModel;\n","import {SavedSearchRule} from './types';\n\nexport const validateSavedSearchRule = <\n\tT extends SavedSearchRule = SavedSearchRule,\n>(\n\trule: T,\n) => {\n\treturn true;\n};\n\nexport default validateSavedSearchRule;\n","import type {RuleValidationErrors} from '../types';\nimport type {UserRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nexport const validateUserRule = <T extends UserRule = UserRule>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tif (typeof rule.elementValue1 !== 'number' || rule.elementValue1 < 1) {\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\t}\n\treturn false;\n};\n\nexport default validateUserRule;\n","import {\n\taction,\n\tautorun,\n\tcomputed,\n\tobservable,\n\tmakeObservable,\n\trunInAction,\n\treaction,\n} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {getUserLabel} from '@netx/core-user/api/getUserLabel';\nimport {RuleModel} from '../baseModel';\nimport {UserType, SearchTypeUser, TSearchTypeUser} from './constants';\nimport {userRuleDefaults} from './defaults';\nimport type {UserRule} from './types';\nimport {validateUserRule} from './validate';\n\nexport class UserRuleModel\n\textends RuleModel<TSearchTypeUser>\n\timplements UserRule\n{\n\treadonly elementType = SearchTypeUser;\n\telementSubType1: UserType;\n\telementSubType2: 0;\n\telementValue1: number;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(UserType);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateUserRule(this);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<UserRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\tmakeObservable(this, {\n\t\t\tisValid: computed,\n\t\t\telementSubType1: observable,\n\t\t\telementValue1: observable,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementValue1: action,\n\t\t});\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...userRuleDefaults, ...params});\n\t\t});\n\n\t\tthis.reactionDisposers.push(\n\t\t\tautorun(() => {\n\t\t\t\tthis.setElementValue1Unavailable(false);\n\n\t\t\t\tif (!this.elementValue1) return;\n\n\t\t\t\tthis.setElementValue1Loading(true);\n\n\t\t\t\tgetUserLabel({id: this.elementValue1})\n\t\t\t\t\t.then((userLabel) => {\n\t\t\t\t\t\tthis.setElementValue1Label(userLabel);\n\t\t\t\t\t})\n\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\tthis.setElementValue1Unavailable(true);\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis.setElementValue1Loading(false);\n\t\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Set user action to search for\n\t * @param elementSubType1 UserType\n\t */\n\tsetElementSubType1(elementSubType1: UserType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set user id\n\t * @param elementValue1 user id\n\t */\n\tsetElementValue1(elementValue1: number) {\n\t\tthis.elementValue1 = elementValue1;\n\t\tthis.dirty = true;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n}\n\nexport default UserRuleModel;\n","import type {RuleValidationErrors} from '../types';\nimport {VisualType} from './constants';\nimport type {VisualRule} from './types';\nimport {createValidationObject} from '../../utils/createValidationObject';\n\nfunction isHexColor(hex: any) {\n\tif (typeof hex !== 'string') return false;\n\thex = hex.replace(/^#/, '');\n\tconst length = hex.length;\n\treturn length === 6 || (length === 3 && !isNaN(Number('0x' + hex)));\n}\n\nexport const validateVisualRule = <T extends VisualRule = VisualRule>(\n\trule: T,\n): RuleValidationErrors | false => {\n\tif (\n\t\trule.elementSubType1 === VisualType.COLOR &&\n\t\t!isHexColor(rule.elementValue1)\n\t)\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\n\tif (\n\t\trule.elementSubType1 === VisualType.ASSET &&\n\t\t(!Number.isInteger(Number(rule.elementValue1)) ||\n\t\t\t(rule.elementValue1 as any) === 0)\n\t)\n\t\treturn {\n\t\t\telementValue1: createValidationObject(),\n\t\t};\n\n\treturn false;\n};\n\nexport default validateVisualRule;\n","import {\n\taction,\n\tautorun,\n\tcomputed,\n\tobservable,\n\tmakeObservable,\n\trunInAction,\n\treaction,\n} from 'mobx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {RuleModel} from '../baseModel';\nimport {VisualType, SearchTypeVisual, TSearchTypeVisual} from './constants';\nimport {visualRuleDefaults} from './defaults';\nimport type {VisualRule} from './types';\nimport {validateVisualRule} from './validate';\nimport {getAssetBean} from '@netx/core-asset/services/asset/api/getAssetBean';\n\nexport class VisualRuleModel\n\textends RuleModel<TSearchTypeVisual>\n\timplements Omit<VisualRule, 'elementValue1'>\n{\n\treadonly elementType = SearchTypeVisual;\n\telementSubType1: VisualType;\n\telementSubType2: 0;\n\telementValue1: number | string;\n\telementValue2: '';\n\telementValue3: '';\n\n\tget elementSubType1Options() {\n\t\treturn enumToValues(VisualType);\n\t}\n\n\tget isValid() {\n\t\tconst validation = validateVisualRule(this as VisualRule);\n\t\tthis.setValidationErrors(this.dirty && validation ? validation : undefined);\n\t\tif (!validation) return true;\n\t\treturn false;\n\t}\n\n\tconstructor(params?: Partial<Omit<VisualRule, 'elementType'>>) {\n\t\tsuper();\n\n\t\trunInAction(() => {\n\t\t\tObject.assign(this, {...visualRuleDefaults, ...params});\n\t\t});\n\n\t\tmakeObservable(this, {\n\t\t\telementSubType1: observable,\n\t\t\telementSubType1Options: computed,\n\t\t\telementValue1: observable,\n\t\t\tisValid: computed,\n\t\t\tsetElementSubType1: action,\n\t\t\tsetElementValue1: action,\n\t\t});\n\n\t\tthis.reactionDisposers.push(\n\t\t\treaction(\n\t\t\t\t() => this.elementSubType1,\n\t\t\t\t(elementSubType1) => {\n\t\t\t\t\tthis.elementValue1 =\n\t\t\t\t\t\telementSubType1 === VisualType.COLOR ? '#000000' : 0;\n\t\t\t\t\tthis.dirty = false;\n\t\t\t\t\tif (elementSubType1 === VisualType.COLOR) {\n\t\t\t\t\t\tthis.setElementValue1Label('');\n\t\t\t\t\t\tthis.setElementValue1Unavailable(false);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\tautorun(() => {\n\t\t\t\tif (this.elementSubType1 === VisualType.COLOR) return;\n\t\t\t\tthis.setElementValue1Unavailable(false);\n\n\t\t\t\tif (!this.elementValue1) return;\n\t\t\t\tthis.setElementValue1Loading(true);\n\t\t\t\tgetAssetBean({id: this.elementValue1 as number})\n\t\t\t\t\t.then((asset) => this.setElementValue1Label(asset.file))\n\t\t\t\t\t.catch(() => this.setElementValue1Unavailable(true))\n\t\t\t\t\t.finally(() => this.setElementValue1Loading(false));\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Set whether this is an asset or color visual search\n\t * @param elementSubType1 VisualType\n\t */\n\tsetElementSubType1(elementSubType1: VisualType) {\n\t\tthis.elementSubType1 = elementSubType1;\n\t}\n\n\t/** stubbed */\n\tsetElementSubType2() {}\n\n\t/**\n\t * Set search value\n\t * @param elementValue1 hex color string | numerical asset id\n\t */\n\tsetElementValue1<T extends VisualType = VisualType>(\n\t\telementValue1: [T] extends [VisualType.ASSET] ? number : string,\n\t) {\n\t\tthis.elementValue1 = elementValue1 as this['elementValue1'];\n\t\tthis.dirty = true;\n\t}\n\n\t/** stubbed */\n\tsetElementValue2() {}\n\n\t/** stubbed */\n\tsetElementValue3() {}\n\n\ttoRuleObject(): VisualRule {\n\t\treturn {\n\t\t\telementType: this.elementType,\n\t\t\telementSubType1: this.elementSubType1,\n\t\t\telementSubType2: this.elementSubType2,\n\t\t\telementValue1:\n\t\t\t\tthis.elementSubType1 === VisualType.COLOR\n\t\t\t\t\t? // we need to strip this for the server\n\t\t\t\t\t this.elementValue1.toString().replace('#', '')\n\t\t\t\t\t: (this.elementValue1 as number),\n\t\t\telementValue2: this.elementValue2,\n\t\t\telementValue3: this.elementValue3,\n\t\t} as VisualRule<typeof this.elementSubType1>;\n\t}\n}\n\nexport default VisualRuleModel;\n","import {SearchType} from '../rules/constants';\n\nimport {AdvancedRawRuleModel} from '../rules/advancedRaw/model';\nimport {AttributeHistoryRuleModel} from '../rules/attributeHistory/model';\nimport {CartRuleModel} from '../rules/cart/model';\nimport {CategoryIdRuleModel} from '../rules/categoryId/model';\nimport {CheckoutsRuleModel} from '../rules/checkouts/model';\nimport {ContentsRuleModel} from '../rules/contents/model';\nimport {DateRuleModel} from '../rules/date/model';\nimport {ExpirationRuleModel} from '../rules/expiration/model';\nimport {FileAspectRuleModel} from '../rules/fileAspect/model';\nimport {FileFormatRuleModel} from '../rules/fileFormat/model';\nimport {FileFormatFamilyRuleModel} from '../rules/fileFormatFamily/model';\nimport {FileSizeRuleModel} from '../rules/fileSize/model';\nimport {KeywordRuleModel} from '../rules/keyword/model';\nimport {MetadataRuleModel} from '../rules/metadata/model';\nimport {SavedSearchRuleModel} from '../rules/savedSearch/model';\nimport {UserRuleModel} from '../rules/user/model';\nimport {VisualRuleModel} from '../rules/visual/model';\n\nexport const RuleModelMap = <const>{\n\t[SearchType.ADVANCED_RAW]: AdvancedRawRuleModel,\n\t[SearchType.ATTRIBUTE_HISTORY]: AttributeHistoryRuleModel,\n\t[SearchType.CART]: CartRuleModel,\n\t[SearchType.CATEGORY_ID]: CategoryIdRuleModel,\n\t[SearchType.CHECKOUTS]: CheckoutsRuleModel,\n\t[SearchType.CONTENTS]: ContentsRuleModel,\n\t[SearchType.DATE]: DateRuleModel,\n\t[SearchType.EXPIRE]: ExpirationRuleModel,\n\t[SearchType.FILE_ASPECT]: FileAspectRuleModel,\n\t[SearchType.FILE_FORMAT]: FileFormatRuleModel,\n\t[SearchType.FILE_FORMAT_FAMILY]: FileFormatFamilyRuleModel,\n\t[SearchType.FILE_SIZE]: FileSizeRuleModel,\n\t[SearchType.KEYWORD]: KeywordRuleModel,\n\t[SearchType.METADATA]: MetadataRuleModel,\n\t[SearchType.SAVED_SEARCH]: SavedSearchRuleModel,\n\t[SearchType.USER]: UserRuleModel,\n\t[SearchType.VISUAL]: VisualRuleModel,\n};\n\nexport const getRuleModel = (type: SearchType) => RuleModelMap[type];\n\nexport default getRuleModel;\n","import {advancedRawRuleDefaults} from './defaults';\nimport {AdvancedRawRule} from './types';\n\ntype GetFileFormatFamilyRuleParams = {\n\traw: string;\n};\n\nexport const createAdvancedRawRule = ({\n\traw,\n}: GetFileFormatFamilyRuleParams): AdvancedRawRule => ({\n\t...advancedRawRuleDefaults,\n\telementValue1: raw,\n});\n\nexport default createAdvancedRawRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createAdvancedRawRule} from '../advancedRawRule';\nimport type {AdvancedRawRule, TSearchTypeAdvancedRaw} from '../types';\n\nexport type RawAdvancedRawSearchCriteria =\n\tSearchCriteriaRaw<TSearchTypeAdvancedRaw>;\n\nexport const rawAdvancedRawCriteriaToRuleObject = (\n\tcriteria: RawAdvancedRawSearchCriteria,\n): AdvancedRawRule => {\n\treturn createAdvancedRawRule({\n\t\traw: criteria.value1,\n\t});\n};\n\nexport default rawAdvancedRawCriteriaToRuleObject;\n","import {attributeHistoryRuleDefaults} from './defaults';\nimport type {AttributeHistoryRule} from './types';\n\ntype CreateAttributeHistoryRuleParams = {\n\tattributeId: number;\n\tattributeValue: string;\n};\n\nexport const createAttributeHistoryRule = ({\n\tattributeId,\n\tattributeValue,\n}: CreateAttributeHistoryRuleParams): AttributeHistoryRule => ({\n\t...attributeHistoryRuleDefaults,\n\telementValue1: attributeId,\n\telementValue2: attributeValue,\n});\n\nexport default createAttributeHistoryRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createAttributeHistoryRule} from '../attributeHistoryRule';\nimport type {AttributeHistoryRule, TSearchTypeAttributeHistory} from '../types';\n\nexport type RawAttributeHistorySearchCriteria =\n\tSearchCriteriaRaw<TSearchTypeAttributeHistory>;\n\nexport const rawAttributeHistoryCriteriaToRuleObject = (\n\tcriteria: RawAttributeHistorySearchCriteria,\n): AttributeHistoryRule => {\n\treturn createAttributeHistoryRule({\n\t\tattributeId: parseInt(criteria.value1) || 0,\n\t\tattributeValue: criteria.value2,\n\t});\n};\n\nexport default rawAttributeHistoryCriteriaToRuleObject;\n","import type {UserId} from '@netx/core-user/types';\nimport {CheckoutType} from './constants';\nimport {checkoutsRuleDefaults} from './defaults';\nimport {CheckoutsRule} from './types';\n\nexport type CheckoutRuleBaseParams<T extends CheckoutType> = {\n\ttype: T;\n} & ([T] extends [CheckoutType.USER_ID]\n\t? {\n\t\t\tuserId: UserId;\n\t }\n\t: {});\n\nexport type CheckoutAllRuleParams = CheckoutRuleBaseParams<CheckoutType.ALL>;\nexport type CheckoutByUserRuleParams =\n\tCheckoutRuleBaseParams<CheckoutType.USER_ID>;\n\ntype GetCheckoutsRuleParams = CheckoutAllRuleParams | CheckoutByUserRuleParams;\n\nexport function createCheckoutsRule(\n\tparams: CheckoutAllRuleParams,\n): CheckoutsRule<CheckoutType.ALL>;\n\nexport function createCheckoutsRule(\n\tparams: CheckoutByUserRuleParams,\n): CheckoutsRule<CheckoutType.USER_ID>;\n\nexport function createCheckoutsRule(params: GetCheckoutsRuleParams) {\n\tconst {type} = params;\n\treturn {\n\t\t...checkoutsRuleDefaults,\n\t\telementSubType1: type,\n\t\telementValue1: type === CheckoutType.USER_ID ? params.userId : 0,\n\t};\n}\n\nexport default createCheckoutsRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createCheckoutsRule} from '../checkoutsRule';\nimport type {CheckoutsRule, TSearchTypeCheckouts} from '../types';\n\nexport type RawCheckoutsSearchCriteria =\n\tSearchCriteriaRaw<TSearchTypeCheckouts>;\n\nexport const rawCheckoutsCriteriaToRuleObject = (\n\tcriteria: RawCheckoutsSearchCriteria,\n): CheckoutsRule<any> => {\n\treturn createCheckoutsRule({\n\t\ttype: criteria.subtype1,\n\t\tuserId: parseInt(criteria.value1) || 0,\n\t});\n};\n\nexport default rawCheckoutsCriteriaToRuleObject;\n","import {ContentsType} from './constants';\nimport {contentsRuleDefaults} from './defaults';\nimport {ContentsRule} from './types';\n\ntype GetContentsRuleParams<T extends ContentsType = ContentsType> = {\n\ttype?: T;\n\tcontents: string;\n};\n\nexport const createContentsRule = ({\n\tcontents,\n\ttype,\n}: GetContentsRuleParams): ContentsRule => ({\n\t...contentsRuleDefaults,\n\telementSubType1: type != null ? type : contentsRuleDefaults.elementSubType1,\n\telementValue1: contents,\n});\n\nexport default createContentsRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createContentsRule} from '../contentsRule';\nimport type {ContentsRule, TSearchTypeContents} from '../types';\n\nexport type RawContentsSearchCriteria = SearchCriteriaRaw<TSearchTypeContents>;\n\nexport const rawContentsCriteriaToRuleObject = (\n\tcriteria: RawContentsSearchCriteria,\n): ContentsRule => {\n\treturn createContentsRule({\n\t\tcontents: criteria.value1,\n\t\ttype: criteria.subtype1,\n\t});\n};\n\nexport default rawContentsCriteriaToRuleObject;\n","import {\n\tDateSingleValueTypes,\n\tDateSubType,\n\tDateType,\n\tDoesNotRequireDate,\n\tRequiresSingleDate,\n\tSystemDefined,\n} from './constants';\nimport {dateRuleDefaults} from './defaults';\nimport {DateRule} from './types';\n\ntype InBetween = {\n\tfromDate: string;\n\ttoDate: string;\n};\n\ntype SingleValue = {\n\tdate: string;\n};\n\nexport type DateRuleBaseParams<\n\tT extends DateType,\n\tT2 extends DateSubType = DateSubType,\n> = {\n\ttype: T;\n\tsubType: T2;\n} & ([T2] extends [DateSubType.IN_BETWEEN]\n\t? InBetween\n\t: [T2] extends [DateSubType.AFTER | DateSubType.BEFORE]\n\t? SingleValue\n\t: {});\n\ntype SystemDefinedBase<T extends DateSubType = DateSubType> =\n\tDateRuleBaseParams<SystemDefined, T>;\n\ntype SystemDefinedInBetween = SystemDefinedBase<DateSubType.IN_BETWEEN>;\n\ntype SystemDefinedBeforeOrAfter = SystemDefinedBase<RequiresSingleDate>;\ntype SystemDefinedAllOthers = SystemDefinedBase<DoesNotRequireDate>;\n\ntype UserDefinedBase<T extends DateSubType = DateSubType> = DateRuleBaseParams<\n\tDateType.USER_DEFINED_ATTRIBUTE,\n\tT\n> & {\n\tattributeName: string;\n};\ntype UserDefinedInBetween = UserDefinedBase<DateSubType.IN_BETWEEN>;\ntype UserDefinedBeforeOrAfter = UserDefinedBase<RequiresSingleDate>;\ntype UserDefinedAllOthers = UserDefinedBase<DoesNotRequireDate>;\n\ntype GetDateRuleParams =\n\t| UserDefinedInBetween\n\t| UserDefinedBeforeOrAfter\n\t| UserDefinedAllOthers\n\t| SystemDefinedInBetween\n\t| SystemDefinedBeforeOrAfter\n\t| SystemDefinedAllOthers;\n\n// user defined, range needed\nexport function createDateRule(\n\tparams: UserDefinedInBetween,\n): DateRule<DateType.USER_DEFINED_ATTRIBUTE, DateSubType.IN_BETWEEN>;\n// user defined, single date needed\nexport function createDateRule(\n\tparams: UserDefinedBeforeOrAfter,\n): DateRule<DateType.USER_DEFINED_ATTRIBUTE, RequiresSingleDate>;\n// user defined, no date needed\nexport function createDateRule(\n\tparams: UserDefinedAllOthers,\n): DateRule<DateType.USER_DEFINED_ATTRIBUTE, DoesNotRequireDate>;\n\n// system, range needed\nexport function createDateRule(\n\tparams: SystemDefinedInBetween,\n): DateRule<SystemDefined, DateSubType.IN_BETWEEN>;\n// system, single date needed\nexport function createDateRule(\n\tparams: SystemDefinedBeforeOrAfter,\n): DateRule<SystemDefined, RequiresSingleDate>;\n// system, no date value neeeded\nexport function createDateRule(\n\tparams: SystemDefinedAllOthers,\n): DateRule<SystemDefined, DoesNotRequireDate>;\n\nexport function createDateRule(params: GetDateRuleParams) {\n\tconst {subType, type} = params;\n\treturn {\n\t\t...dateRuleDefaults,\n\t\telementSubType1: type,\n\t\telementSubType2: subType,\n\t\telementValue1:\n\t\t\tsubType === DateSubType.IN_BETWEEN\n\t\t\t\t? params.fromDate\n\t\t\t\t: // my least favorite things about constants and includes\n\t\t\t\tDateSingleValueTypes.includes(\n\t\t\t\t\t\tsubType as typeof DateSingleValueTypes[number],\n\t\t\t\t )\n\t\t\t\t? (params as SingleValue).date\n\t\t\t\t: '',\n\t\telementValue2: subType === DateSubType.IN_BETWEEN ? params.toDate : '',\n\t\telementValue3:\n\t\t\ttype === DateType.USER_DEFINED_ATTRIBUTE ? params.attributeName : '',\n\t};\n}\n\nexport default createDateRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createDateRule} from '../dateRule';\nimport type {DateRule, TSearchTypeDate} from '../types';\n\nexport type RawDateSearchCriteria = SearchCriteriaRaw<TSearchTypeDate>;\n\nexport const rawDateCriteriaToRuleObject = (\n\tcriteria: RawDateSearchCriteria,\n): DateRule<any> => {\n\treturn createDateRule({\n\t\ttype: criteria.subtype1,\n\t\tsubType: criteria.subtype2,\n\t\tdate: criteria.value1,\n\t\tattributeName: criteria.value3,\n\t\tfromDate: criteria.value1,\n\t\ttoDate: criteria.value2,\n\t} as any) as DateRule<any>;\n};\n\nexport default rawDateCriteriaToRuleObject;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createExpirationRule} from '../expirationRule';\nimport type {ExpirationRule, TSearchTypeExpiration} from '../types';\n\nexport type RawExpirationSearchCriteria =\n\tSearchCriteriaRaw<TSearchTypeExpiration>;\n\nexport const rawExpirationCriteriaToRuleObject = (\n\tcriteria: RawExpirationSearchCriteria,\n): ExpirationRule => {\n\treturn createExpirationRule();\n};\n\nexport default rawExpirationCriteriaToRuleObject;\n","import {\n\tFileAspectType,\n\tFileAspectSubType,\n\tFileAspectOrientationValue,\n} from './constants';\nimport {fileAspectRuleDefaults} from './defaults';\nimport {FileAspectRule} from './types';\n\ntype GetFileAspectRuleParams<T extends FileAspectType> = {\n\ttype: T;\n} & ([T] extends [FileAspectType.ORIENTATION]\n\t? {\n\t\t\tsubType?: FileAspectSubType.EQUAL_TO;\n\t\t\tvalue: FileAspectOrientationValue;\n\t }\n\t: {\n\t\t\tsubType: FileAspectSubType;\n\t\t\tvalue: number;\n\t });\n\nexport const createFileAspectRule = <\n\tT extends FileAspectType = FileAspectType,\n>({\n\tsubType = FileAspectSubType.EQUAL_TO,\n\ttype,\n\tvalue,\n}: GetFileAspectRuleParams<T>): FileAspectRule => ({\n\t...fileAspectRuleDefaults,\n\telementSubType1: type,\n\telementSubType2: subType,\n\telementValue1: value,\n});\n\nexport default createFileAspectRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createFileAspectRule} from '../fileAspectRule';\nimport type {FileAspectRule, TSearchTypeFileAspect} from '../types';\n\nexport type RawFileAspectSearchCriteria =\n\tSearchCriteriaRaw<TSearchTypeFileAspect>;\n\nexport const rawFileAspectCriteriaToRuleObject = (\n\tcriteria: RawFileAspectSearchCriteria,\n): FileAspectRule => {\n\treturn createFileAspectRule({\n\t\ttype: criteria.subtype1,\n\t\tsubType: criteria.subtype2,\n\t\tvalue: parseInt(criteria.value1) || 0,\n\t});\n};\n\nexport default rawFileAspectCriteriaToRuleObject;\n","import {FileFormatType} from './constants';\nimport {fileFormatRuleDefaults} from './defaults';\nimport {FileFormatRule} from './types';\n\ntype GetFileFormatRuleParams = {\n\tfileFormat: string;\n\ttype: FileFormatType;\n};\n\nexport const createFileFormatRule = ({\n\tfileFormat,\n\ttype,\n}: GetFileFormatRuleParams): FileFormatRule => ({\n\t...fileFormatRuleDefaults,\n\telementSubType1: type,\n\telementValue1: fileFormat,\n});\n\nexport default createFileFormatRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createFileFormatRule} from '../fileFormatRule';\nimport type {FileFormatRule, TSearchTypeFileFormat} from '../types';\n\nexport type RawFileFormatSearchCriteria =\n\tSearchCriteriaRaw<TSearchTypeFileFormat>;\n\nexport const rawFileFormatCriteriaToRuleObject = (\n\tcriteria: RawFileFormatSearchCriteria,\n): FileFormatRule => {\n\treturn createFileFormatRule({\n\t\ttype: criteria.subtype1,\n\t\tfileFormat: criteria.value1,\n\t});\n};\n\nexport default rawFileFormatCriteriaToRuleObject;\n","import {fileFormatFamilyRuleDefaults} from './defaults';\nimport {FileFormatFamilyRule} from './types';\n\ntype GetFileFormatFamilyRuleParams = {\n\tfileFormatFamily: string;\n};\n\nexport const createFileFormatFamilyRule = ({\n\tfileFormatFamily,\n}: GetFileFormatFamilyRuleParams): FileFormatFamilyRule => ({\n\t...fileFormatFamilyRuleDefaults,\n\telementValue1: fileFormatFamily,\n});\n\nexport default createFileFormatFamilyRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createFileFormatFamilyRule} from '../fileFormatFamilyRule';\nimport type {FileFormatFamilyRule, TSearchTypeFileFormatFamily} from '../types';\n\nexport type RawFileFormatFamilySearchCriteria =\n\tSearchCriteriaRaw<TSearchTypeFileFormatFamily>;\n\nexport const rawFileFormatFamilyCriteriaToRuleObject = (\n\tcriteria: RawFileFormatFamilySearchCriteria,\n): FileFormatFamilyRule => {\n\treturn createFileFormatFamilyRule({\n\t\tfileFormatFamily: criteria.value1,\n\t});\n};\n\nexport default rawFileFormatFamilyCriteriaToRuleObject;\n","import {FileSizeType, FileSizeMetric} from './constants';\nimport {fileSizeRuleDefaults} from './defaults';\nimport {FileSizeRule} from './types';\n\ntype GetFileSizeRuleParams<\n\tT extends FileSizeType = typeof fileSizeRuleDefaults.elementSubType1,\n\tT2 extends FileSizeMetric = typeof fileSizeRuleDefaults.elementSubType2,\n> = {\n\tfileSize: number;\n\tmetric?: T2;\n\ttype?: T;\n};\n\nexport const createFileSizeRule = ({\n\tfileSize,\n\tmetric,\n\ttype,\n}: GetFileSizeRuleParams): FileSizeRule => ({\n\t...fileSizeRuleDefaults,\n\telementSubType1: type != null ? type : fileSizeRuleDefaults.elementSubType1,\n\telementSubType2:\n\t\tmetric != null ? metric : fileSizeRuleDefaults.elementSubType2,\n\telementValue1: fileSize,\n});\n\nexport default createFileSizeRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createFileSizeRule} from '../fileSizeRule';\nimport type {FileSizeRule, TSearchTypeFileSize} from '../types';\n\nexport type RawFileSizeSearchCriteria = SearchCriteriaRaw<TSearchTypeFileSize>;\n\nexport const rawFileSizeCriteriaToRuleObject = (\n\tcriteria: RawFileSizeSearchCriteria,\n): FileSizeRule => {\n\treturn createFileSizeRule({\n\t\ttype: criteria.subtype1,\n\t\tmetric: criteria.subtype2,\n\t\tfileSize: parseInt(criteria.value1),\n\t});\n};\n\nexport default rawFileSizeCriteriaToRuleObject;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createSavedSearchRule} from '../savedSearchRule';\nimport type {SavedSearchRule, TSearchTypeSavedSearch} from '../types';\n\nexport type RawSavedSearchSearchCriteria =\n\tSearchCriteriaRaw<TSearchTypeSavedSearch>;\n\nexport const rawSavedSearchCriteriaToRuleObject = (\n\tcriteria: RawSavedSearchSearchCriteria,\n): SavedSearchRule => {\n\treturn createSavedSearchRule(parseInt(criteria.value1) || 0);\n};\n\nexport default rawSavedSearchCriteriaToRuleObject;\n","import {UserType} from './constants';\nimport {userRuleDefaults} from './defaults';\nimport {UserRule} from './types';\n\ntype GetUserRuleParams<\n\tT extends UserType = typeof userRuleDefaults.elementSubType1,\n> = {\n\ttype?: T;\n\tuserId: number;\n};\n\nexport const createUserRule = ({\n\ttype,\n\tuserId,\n}: GetUserRuleParams): UserRule => ({\n\t...userRuleDefaults,\n\telementSubType1: type != null ? type : userRuleDefaults.elementSubType1,\n\telementValue1: userId,\n});\n\nexport default createUserRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createUserRule} from '../userRule';\nimport type {UserRule, TSearchTypeUser} from '../types';\n\nexport type RawUserSearchCriteria = SearchCriteriaRaw<TSearchTypeUser>;\n\nexport const rawUserCriteriaToRuleObject = (\n\tcriteria: RawUserSearchCriteria,\n): UserRule => {\n\treturn createUserRule({\n\t\ttype: criteria.subtype1,\n\t\tuserId: parseInt(criteria.value1) || 0,\n\t});\n};\n\nexport default rawUserCriteriaToRuleObject;\n","import {VisualType} from './constants';\nimport {visualRuleDefaults} from './defaults';\nimport {VisualRule} from './types';\n\ntype VisualRuleBaseParams<T extends VisualType> = {\n\ttype: T;\n} & ([T] extends [VisualType.ASSET]\n\t? {\n\t\t\tassetId: number;\n\t }\n\t: {\n\t\t\t/** hex color */\n\t\t\tcolor: string;\n\t });\n\ntype Asset = VisualRuleBaseParams<VisualType.ASSET>;\ntype Color = VisualRuleBaseParams<VisualType.COLOR>;\n\ntype GetVisualRuleParams = Asset | Color;\n\nexport function createVisualRule(params: Asset): VisualRule<VisualType.ASSET>;\n\nexport function createVisualRule(params: Color): VisualRule<VisualType.COLOR>;\n\nexport function createVisualRule(params: GetVisualRuleParams) {\n\tconst {type} = params;\n\n\treturn {\n\t\t...visualRuleDefaults,\n\t\telementSubType1: type,\n\t\telementValue1: type === VisualType.ASSET ? params.assetId : params.color,\n\t};\n}\n\nexport default createVisualRule;\n","import type {SearchCriteriaRaw} from '../../../types';\nimport {createVisualRule} from '../visualRule';\nimport type {VisualRule, TSearchTypeVisual} from '../types';\n\nexport type RawVisualSearchCriteria = SearchCriteriaRaw<TSearchTypeVisual>;\n\nexport const rawVisualCriteriaToRuleObject = (\n\tcriteria: RawVisualSearchCriteria,\n): VisualRule<any> => {\n\treturn createVisualRule({\n\t\ttype: criteria.subtype1,\n\t\tcolor: criteria.value1,\n\t\tassetId: parseInt(criteria.value1) || 0,\n\t} as any) as VisualRule<any>;\n};\n\nexport default rawVisualCriteriaToRuleObject;\n","import {SearchType} from './constants';\nimport type {SearchCriteriaRaw} from '../types';\n\nimport {rawAdvancedRawCriteriaToRuleObject} from './advancedRaw/utils/rawAdvancedRawCriteriaToRuleObject';\nimport {rawAttributeHistoryCriteriaToRuleObject} from './attributeHistory/utils/rawAttributeHistoryCriteriaToRuleObject';\nimport {rawCartCriteriaToRuleObject} from './cart/utils/rawCartCriteriaToRuleObject';\nimport {rawCategoryIdCriteriaToRuleObject} from './categoryId/utils/rawCategoryIdCriteriaToRuleObject';\nimport {rawCheckoutsCriteriaToRuleObject} from './checkouts/utils/rawCheckoutsCriteriaToRuleObject';\nimport {rawContentsCriteriaToRuleObject} from './contents/utils/rawContentsCriteriaToRuleObject';\nimport {rawDateCriteriaToRuleObject} from './date/utils/rawDateCriteriaToRuleObject';\nimport {rawExpirationCriteriaToRuleObject} from './expiration/utils/rawExpirationCriteriaToRuleObject';\nimport {rawFileAspectCriteriaToRuleObject} from './fileAspect/utils/rawFileAspectCriteriaToRuleObject';\nimport {rawFileFormatCriteriaToRuleObject} from './fileFormat/utils/rawFileFormatCriteriaToRuleObject';\nimport {rawFileFormatFamilyCriteriaToRuleObject} from './fileFormatFamily/utils/rawFileFormatFamilyCriteriaToRuleObject';\nimport {rawFileSizeCriteriaToRuleObject} from './fileSize/utils/rawFileSizeCriteriaToRuleObject';\nimport {rawKeywordCriteriaToRuleObject} from './keyword/utils/rawKeywordCriteriaToRuleObject';\nimport {rawMetadataCriteriaToRuleObject} from './metadata/utils/rawMetadataCriteriaToRuleObject';\nimport {rawSavedSearchCriteriaToRuleObject} from './savedSearch/utils/rawSavedSearchCriteriaToRuleObject';\nimport {rawUserCriteriaToRuleObject} from './user/utils/rawUserCriteriaToRuleObject';\nimport {rawVisualCriteriaToRuleObject} from './visual/utils/rawVisualCriteriaToRuleObject';\n\nexport const RuleObjectFromRawCriteriaMap = <const>{\n\t[SearchType.ADVANCED_RAW]: rawAdvancedRawCriteriaToRuleObject,\n\t[SearchType.ATTRIBUTE_HISTORY]: rawAttributeHistoryCriteriaToRuleObject,\n\t[SearchType.CART]: rawCartCriteriaToRuleObject,\n\t[SearchType.CATEGORY_ID]: rawCategoryIdCriteriaToRuleObject,\n\t[SearchType.CHECKOUTS]: rawCheckoutsCriteriaToRuleObject,\n\t[SearchType.CONTENTS]: rawContentsCriteriaToRuleObject,\n\t[SearchType.DATE]: rawDateCriteriaToRuleObject,\n\t[SearchType.EXPIRE]: rawExpirationCriteriaToRuleObject,\n\t[SearchType.FILE_ASPECT]: rawFileAspectCriteriaToRuleObject,\n\t[SearchType.FILE_FORMAT]: rawFileFormatCriteriaToRuleObject,\n\t[SearchType.FILE_FORMAT_FAMILY]: rawFileFormatFamilyCriteriaToRuleObject,\n\t[SearchType.FILE_SIZE]: rawFileSizeCriteriaToRuleObject,\n\t[SearchType.KEYWORD]: rawKeywordCriteriaToRuleObject,\n\t[SearchType.METADATA]: rawMetadataCriteriaToRuleObject,\n\t[SearchType.SAVED_SEARCH]: rawSavedSearchCriteriaToRuleObject,\n\t[SearchType.USER]: rawUserCriteriaToRuleObject,\n\t[SearchType.VISUAL]: rawVisualCriteriaToRuleObject,\n};\n\n/**\n * Given saved search criteria, get back a legit rule object\n * @param rawCriteria saved search criteria\n * @returns\n */\nexport const getRuleObjectFromRawCriteria = (rawCriteria: SearchCriteriaRaw) =>\n\tRuleObjectFromRawCriteriaMap[rawCriteria.type]?.(\n\t\trawCriteria as unknown as any,\n\t);\n\nexport default getRuleObjectFromRawCriteria;\n","import {csvToArray} from '@netx/core/utils';\nimport {attributesStore} from '@netx/core-attribute/store/attributesStore';\nimport {ATTRIBUTE_MULTIPLE_VALUE_TYPES} from '@netx/core-attribute/constants';\nimport type {SearchCriteriaRaw} from '../types';\nimport {SearchType} from '../rules/constants';\nimport type {SearchRule} from '../rules/types';\nimport {getRuleObjectFromRawCriteria} from '../rules/getRuleObjectFromRawCriteria';\n\nexport type SavedSearchCriteriaToRuleObjectsParams = {\n\tcriteria: SearchCriteriaRaw[];\n};\n\nconst getNormalizedMultivalue = (value?: string) =>\n\tvalue == null || value === ''\n\t\t? []\n\t\t: value.match(/^\".*\",.*\"$/)\n\t\t? csvToArray(value)\n\t\t: Array.isArray(value)\n\t\t? value\n\t\t: [value];\n\nexport const savedSearchCriteriaToRuleObjects = ({\n\tcriteria,\n}: SavedSearchCriteriaToRuleObjectsParams) => {\n\tconst ruleObjects: SearchRule[] = [];\n\n\tconst addRuleObject = (item: typeof criteria[number]) => {\n\t\tconst ruleObject = getRuleObjectFromRawCriteria(item);\n\t\truleObject && ruleObjects.push(ruleObject);\n\t};\n\n\tconst getMatchingAttributeSiblings = (\n\t\titem: typeof criteria[number],\n\t\tstartIndex: number,\n\t) => {\n\t\tconst items: typeof criteria = [];\n\t\tfor (let i = startIndex, c = criteria.length; i < c; i++) {\n\t\t\tconst _item = criteria[i];\n\t\t\tif (\n\t\t\t\t_item.type !== item.type ||\n\t\t\t\t// name does not match\n\t\t\t\t_item.value2 !== item.value2 ||\n\t\t\t\t_item.subtype1 !== item.subtype1 ||\n\t\t\t\t_item.subtype2 !== item.subtype2\n\t\t\t)\n\t\t\t\tbreak;\n\t\t\titems.push(_item);\n\t\t}\n\t\treturn items;\n\t};\n\n\tfor (let i = 0, c = criteria.length; i < c; i++) {\n\t\tconst item = criteria[i];\n\t\t// attribute search rule\n\t\tif (item.type === SearchType.METADATA) {\n\t\t\tconst attr = attributesStore.getAttributeByName(item.value2);\n\t\t\t// we know the attribute is capable of multiple values (multiselect, tag, etc)\n\t\t\tif (\n\t\t\t\tattr &&\n\t\t\t\t(ATTRIBUTE_MULTIPLE_VALUE_TYPES as number[]).includes(attr.type)\n\t\t\t) {\n\t\t\t\tconst value1 = getNormalizedMultivalue(item.value1) as any;\n\t\t\t\t// find matching siblings\n\t\t\t\tconst matchingAttributeSiblings = getMatchingAttributeSiblings(\n\t\t\t\t\titem,\n\t\t\t\t\ti + 1,\n\t\t\t\t);\n\t\t\t\taddRuleObject({\n\t\t\t\t\t...item,\n\t\t\t\t\tvalue1: value1\n\t\t\t\t\t\t.concat(\n\t\t\t\t\t\t\tmatchingAttributeSiblings.map((item) =>\n\t\t\t\t\t\t\t\tgetNormalizedMultivalue(item.value1),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.flat() as any,\n\t\t\t\t});\n\t\t\t\t// skip over items that matched our attribute\n\t\t\t\ti = i + matchingAttributeSiblings.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// just add as is\n\t\taddRuleObject(item);\n\t}\n\n\treturn ruleObjects;\n};\n\nexport default savedSearchCriteriaToRuleObjects;\n","import {\n\tDEFAULT_SEARCH_SORT_FIELD,\n\tDEFAULT_SEARCH_SORT_ORDER,\n\tDEFAULT_SEARCH_MATCH_CRITERIA,\n} from '../../constants';\nimport type {SearchCriteria} from '../../types';\nimport {areRulesValid} from '../../utils';\nimport {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nexport type State = SearchCriteria & {\n\tvalid: boolean;\n};\n\nexport const initialState: State = {\n\telementTypes: [],\n\telementSubType1s: [],\n\telementSubType2s: [],\n\telementValue1s: [],\n\telementValue2s: [],\n\telementValue3s: [],\n\tsortField: DEFAULT_SEARCH_SORT_FIELD,\n\tsortOrder: DEFAULT_SEARCH_SORT_ORDER,\n\tmatchCriteria: DEFAULT_SEARCH_MATCH_CRITERIA,\n\tvalid: false,\n};\n\nconst reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.RESET_SEARCH_RULES:\n\t\t\treturn initialState;\n\n\t\tcase ACTIONS.SET_SEARCH_RULES: {\n\t\t\tconst {valid, ...currentState} = state;\n\t\t\tconst newConditions = {\n\t\t\t\t...currentState,\n\t\t\t\t...action.conditions,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\t...newConditions,\n\t\t\t\tvalid: areRulesValid(newConditions),\n\t\t\t};\n\t\t}\n\t}\n};\n\nexport default reducer;\n","import React, {createContext, useContext} from 'react';\n\nimport type {ArgumentsType} from '@netx/core/typings';\nimport {useSearchRules, initialState} from '../../hooks/useSearchRules';\n\nexport type SearchRulesContextType = ReturnType<typeof useSearchRules>;\n\nconst noop = () => {};\n\nexport const SearchRulesContext = createContext<SearchRulesContextType>({\n\tlastSearchRules: {current: initialState},\n\tstate: initialState,\n\tstateRef: {current: initialState},\n\tresetSearchRules: noop,\n\tsetSearchRules: noop,\n});\n\nexport const useSearchRulesProvider = () => useContext(SearchRulesContext);\n\nexport type SearchRulesProviderProps = React.PropsWithChildren<\n\tArgumentsType<typeof useSearchRules>[0]\n>;\n\nexport const SearchRulesProviderPrimitive = ({\n\tchildren,\n\t...props\n}: SearchRulesProviderProps) => {\n\tconst searchRules = useSearchRules(props);\n\treturn (\n\t\t<SearchRulesContext.Provider value={searchRules}>\n\t\t\t{children}\n\t\t</SearchRulesContext.Provider>\n\t);\n};\n\n/**\n * search rules context provider\\\n * used for setting rules to execute a search (not for managing/editing)\n * @example\n * <SearchRulesProvider ref={searchRulesRef}>\n * \t...\n * </SearchRulesProvider>\n * @example\n * <SearchRulesProvider ref={searchRulesRef}>\n * \t{(searchRules) => (\n * \t\t...\n * \t)}\n * </SearchRulesProvider>\n */\nexport const SearchRulesProvider = React.memo(SearchRulesProviderPrimitive);\nexport default SearchRulesProvider;\n","/**\n * Collection contains saved search models\n * @class\n */\nimport Base from '@netx/core-share/collections/sharedResources';\nimport Model from '../models/savedSearch';\n\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\n\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\n\nexport default class SavedSearches extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetSearchesForUser: 'Loading saved searches',\n\t\t\tgetSharedResources() {\n\t\t\t\treturn this.isFiltered()\n\t\t\t\t\t? 'Filtering saved searches'\n\t\t\t\t\t: 'Loading saved searches';\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetSearchesForUser: 'Loaded saved searches',\n\t\t\tgetSharedResources() {\n\t\t\t\treturn this.isFiltered()\n\t\t\t\t\t? 'Filtered saved searches'\n\t\t\t\t\t: 'Loaded saved searches';\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this collection\n\t * @property {method} methods.fetchBeans - Fetch saved search beans\n\t * @property {method} methods.fetchBeansForUser - Fetch saved search beans for user\n\t */\n\tget methods() {\n\t\treturn _.extend(super.methods, {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeans(opts) {\n\t\t\t\treturn this.fetchBeansForUser(Netx.getUser().id, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {number} userId User id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeansForUser(userId, opts) {\n\t\t\t\tif (Netx.getUserLevel() < 9) userId = Netx.getUser().id;\n\n\t\t\t\treturn [\n\t\t\t\t\t'getSearchesForUser',\n\t\t\t\t\tuserId,\n\t\t\t\t\tthis.modeFilters,\n\t\t\t\t\tthis.filterStr,\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @property {object} parsers - Parsers for this collection\n\t * @property {method} parsers.fetchBeans - Parse response of saved search beans\n\t * @property {method} parsers.fetchBeansForUser - Parse response of saved search beans\n\t */\n\tget parsers() {\n\t\treturn _.extend(super.parsers, {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} data Saved carts\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeans(data, opts) {\n\t\t\t\tthis.set(data, _.extend({merge: true}, opts));\n\n\t\t\t\t!opts.silent && this.trigger('sync', this, data, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} data Saved carts\n\t\t\t * @param {number} userId User id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeansForUser(data, userId, opts) {\n\t\t\t\tthis.set(data, opts);\n\n\t\t\t\t!opts.silent && this.trigger('sync', this, data, opts);\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @listens module:search#search:saved:delete:success\n\t * @listens module:search#search:save:success\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\topts.resourceName = opts.resourceName || 'savedSearch';\n\n\t\tsuper(models, opts);\n\n\t\t// Set name filter if provided\n\t\tthis.filterStr = opts.filterStr || '';\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(dispatcher, 'search:saved:delete:success', savedSearch => {\n\t\t\tconst model = this.get(savedSearch.id);\n\t\t\tmodel && this.remove(model);\n\t\t}).listenTo(\n\t\t\tdispatcher,\n\t\t\t'search:save:success',\n\t\t\t(savedSearches, savedSearch) => {\n\t\t\t\tthis.matchesFilters(savedSearch) &&\n\t\t\t\t\tthis.unshift(savedSearch.attributes);\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @return {module:asset/models/assetSet}\n\t */\n\ttoAssetSet() {\n\t\treturn new AssetSetModel({\n\t\t\ttype: assetSetTypes.search,\n\t\t\tids: this.ids(),\n\t\t\tlabel: i18n.t('i18n.savedSearches'),\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SavedSearches';\n\t}\n}\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport SavedSearchesCollection from '../savedSearches';\n\nexport const allSavedSearches = new SavedSearchesCollection([], {\n\tpager: {pageSize: 0x7fffffff},\n});\n\nallSavedSearches\n\t.on(\n\t\t'add',\n\t\t(model) =>\n\t\t\tmodel.isFavorite() && favoriteSavedSearches.add(model.attributes),\n\t)\n\t.on('destroy', (model) => favoriteSavedSearches.remove(model.id))\n\t.listenTo(dispatcher, 'search:save:success', (_, savedSearchBean) => {\n\t\tconst model = allSavedSearches.get(savedSearchBean.id);\n\t\tif (!model) return;\n\t\tmodel.set({...savedSearchBean.attributes});\n\t});\n\nexport const favoriteSavedSearches = new SavedSearchesCollection([], {\n\tpager: {pageSize: 0x7fffffff, pagesToDisplay: 0},\n\tmodeFilters: ['favorites'],\n});\n\nexport default {allSavedSearches, favoriteSavedSearches};\n","import savedSearchesSingleton from '@netx/core-search/collections/singleton/savedSearch';\nimport useBackboneCollection from '@netx/core-components/hooks/useBackboneCollection';\nimport {useEffect} from 'react';\n\nexport const useSavedSearches = () => {\n\tconst savedSearches = useBackboneCollection(\n\t\tsavedSearchesSingleton.allSavedSearches,\n\t\tfalse,\n\t);\n\n\treturn {\n\t\tsavedSearches,\n\t};\n};\n\nexport default useSavedSearches;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\nimport {ATTRIBUTE_MULTIPLE_VALUE_TYPES} from '@netx/core-attribute/constants';\nimport {attributesStore} from '@netx/core-attribute/store/attributesStore';\nimport {SearchType} from '@netx/core-search-rules/rules/constants';\nimport {SavedSearchBean, SavedSearchId} from '../types';\n\n/**\n * `getSearch` request params\n * (what is used to send to server)\n */\nexport interface GetSearchRequestOptions {\n\tid: SavedSearchId;\n}\n\n/**\n * `getSearch` request\n * (what gets sent to the server)\n */\nexport type GetSearchRequest = [GetSearchRequestOptions['id']];\n\n/**\n * `getSearch` response\n * (what comes back from the server)\n */\nexport type GetSearchResponse = SuccessResponse<GetSearchResult>;\n\n/**\n * `getSearch` result\n * (what is utilized from the server response)\n */\nexport type GetSearchResult = SavedSearchBean;\n\nexport const getSearchEndpoint = 'getSearch';\n\n/**\n * Autolist users\n * @param fetchParams Fetch params\n */\nexport const getSearch = async ({id}: GetSearchRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetSearchRequest = [id];\n\n\treturn client\n\t\t.post<GetSearchResponse>(getSearchEndpoint, requestParams)\n\t\t.then((response) => {\n\t\t\tconst {result} = response.data;\n\t\t\treturn {\n\t\t\t\t...result,\n\t\t\t\tcriteria: result.criteria.map((criteria) => {\n\t\t\t\t\tlet value1 = criteria.value1;\n\t\t\t\t\tswitch (criteria.type) {\n\t\t\t\t\t\tcase SearchType.METADATA: {\n\t\t\t\t\t\t\tconst attr = attributesStore.getAttributeByName(criteria.value2);\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tattr &&\n\t\t\t\t\t\t\t\tATTRIBUTE_MULTIPLE_VALUE_TYPES.includes(attr.type as any)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tvalue1 =\n\t\t\t\t\t\t\t\t\tcriteria.value1 !== '' && criteria.value1.match(/.*\",\".*$/)\n\t\t\t\t\t\t\t\t\t\t? // the server is failing to maintain the proper escaping for a csv string\n\t\t\t\t\t\t\t\t\t\t // this is for older saved searches\n\t\t\t\t\t\t\t\t\t\t `\\\"${criteria.value1}\\\"`\n\t\t\t\t\t\t\t\t\t\t: criteria.value1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...criteria,\n\t\t\t\t\t\tvalue1,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t};\n\t\t});\n};\nexport default getSearch;\n","import {useEffect, useState} from 'react';\n\nimport useComponentIsMounted from '@netx/core-components/hooks/useComponentIsMounted';\nimport {useWhenChangedEffect} from '@netx/core-components/hooks/useWhenChangedEffect';\nimport {useSavedSearches} from './useSavedSearches';\nimport type {SavedSearch, SavedSearchExtended} from '../types';\nimport {getSearch} from '../api';\n\nexport type UseSavedSearchArguments<Extended extends boolean = false> = {\n\tid?: number;\n\textended?: Extended;\n};\n\nexport const useSavedSearch = <Extended extends boolean = false>({\n\tid,\n\textended = false as Extended,\n}: UseSavedSearchArguments<Extended>) => {\n\tconst [savedSearch, setSavedSearch] =\n\t\tuseState<[Extended] extends [false] ? SavedSearch : SavedSearchExtended>();\n\tconst [loading, setLoading] = useState(false);\n\n\tconst {savedSearches} = useSavedSearches();\n\n\tconst {act} = useComponentIsMounted();\n\n\tuseWhenChangedEffect(\n\t\t[id, savedSearches] as const,\n\t\t([id, savedSearches]) => {\n\t\t\tconst savedSearchData =\n\t\t\t\tid && savedSearches.find((savedSearch) => savedSearch.id === id);\n\n\t\t\tif (!savedSearchData) {\n\t\t\t\tsetSavedSearch(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (extended === false) {\n\t\t\t\tsetSavedSearch(savedSearchData as any);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetLoading(true);\n\n\t\t\tgetSearch({id})\n\t\t\t\t.then((bean) => {\n\t\t\t\t\tact(() =>\n\t\t\t\t\t\tsetSavedSearch({\n\t\t\t\t\t\t\t...savedSearchData,\n\t\t\t\t\t\t\t...bean,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tact(() => setLoading(false));\n\t\t\t\t});\n\t\t},\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\treturn {\n\t\tsavedSearch,\n\t\tloading,\n\t};\n};\n\nexport default useSavedSearch;\n","import {\n\taction,\n\tobservable,\n\tmakeObservable,\n\tconfigure,\n\tcomputed,\n\trunInAction,\n} from 'mobx';\n\nconfigure({enforceActions: 'always'});\n\nimport {SearchType, EditableRuleTypes} from '../rules/constants';\nimport {SearchRule} from '../rules/types';\nimport {getRuleModel} from '../utils/getRuleModel';\nimport {RuleModel} from '../rules/baseModel';\nimport {SearchMatchCriteria} from '../constants';\n\nconst array_move = <T extends unknown[]>(\n\tarr: T,\n\told_index: number,\n\tnew_index: number,\n) => {\n\tconst newArr = [...arr];\n\tif (new_index >= arr.length) {\n\t\tlet k = new_index - arr.length + 1;\n\t\twhile (k--) arr.push(undefined);\n\t}\n\tnewArr.splice(new_index, 0, newArr.splice(old_index, 1)[0]);\n\treturn newArr;\n};\n\nexport type SearchRulesStoreParams = {\n\trules?: SearchRule[];\n\tmatchCriteria?: SearchMatchCriteria;\n};\n\nexport class SearchRulesStore {\n\tmatchCriteria: SearchMatchCriteria = SearchMatchCriteria.AND;\n\trules = observable.array<RuleModel>([]);\n\n\tget isValid() {\n\t\treturn !!this.rules.length && !this.rules.some((rule) => !rule.isValid);\n\t}\n\n\tget isSomeDataUnavailable() {\n\t\treturn this.rules.some(\n\t\t\t(rule) =>\n\t\t\t\trule.elementValue1Unavailable ||\n\t\t\t\trule.elementValue2Unavailable ||\n\t\t\t\trule.elementValue3Unavailable,\n\t\t);\n\t}\n\n\tconstructor({\n\t\trules,\n\t\tmatchCriteria = SearchMatchCriteria.AND,\n\t}: SearchRulesStoreParams = {}) {\n\t\trunInAction(() => {\n\t\t\trules &&\n\t\t\t\tthis.rules.replace(\n\t\t\t\t\trules\n\t\t\t\t\t\t.map((rule) => {\n\t\t\t\t\t\t\tconst {elementType, ...rest} = rule;\n\t\t\t\t\t\t\tconst model = getRuleModel(elementType);\n\t\t\t\t\t\t\tif (!model) return;\n\t\t\t\t\t\t\treturn new model(rest as unknown as any); // TODO\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.filter((rule) => rule != null) as RuleModel[],\n\t\t\t\t);\n\n\t\t\tthis.matchCriteria = matchCriteria;\n\t\t});\n\n\t\tmakeObservable(\n\t\t\tthis,\n\t\t\t{\n\t\t\t\taddRule: action,\n\t\t\t\tmatchCriteria: observable,\n\t\t\t\tisSomeDataUnavailable: computed,\n\t\t\t\tisValid: computed,\n\t\t\t\tremoveRule: action,\n\t\t\t\treorderRuleByIndex: action,\n\t\t\t\treplaceRule: action,\n\t\t\t\treset: action,\n\t\t\t\trules: observable,\n\t\t\t\tsetMatchCriteria: action,\n\t\t\t},\n\t\t\t{\n\t\t\t\tdeep: true,\n\t\t\t},\n\t\t);\n\t}\n\n\tgetRules() {\n\t\tconst rules = this.rules.map((rule) => rule.toRuleObject());\n\t\t// console.log('rules', rules, rules.flat());\n\t\treturn rules.flat();\n\t}\n\n\taddRule(searchRule?: SearchRule | SearchType) {\n\t\tif (searchRule == null) {\n\t\t\tconst model = getRuleModel(SearchType.KEYWORD);\n\t\t\tmodel && this.rules.push(new model());\n\t\t\treturn;\n\t\t}\n\n\t\tconst ruleParams =\n\t\t\ttypeof searchRule === 'number' ? {elementType: searchRule} : searchRule;\n\t\tconst {elementType, ...rest} = ruleParams;\n\n\t\tconst model = getRuleModel(elementType);\n\t\tmodel &&\n\t\t\tthis.rules.push(\n\t\t\t\tnew model(rest as any), // TODO\n\t\t\t);\n\t}\n\n\tremoveRule(rule: RuleModel) {\n\t\tthis.rules.replace(this.rules.filter((_rule) => _rule !== rule));\n\t\tif (!this.rules.length) this.addRule();\n\t}\n\n\treset() {\n\t\tthis.rules.replace([]);\n\t\tthis.addRule();\n\t}\n\n\treplaceRule(oldRuleModel: RuleModel, newRule: SearchRule | SearchType) {\n\t\tconst index = this.rules.indexOf(oldRuleModel);\n\t\tif (index < 0) return;\n\t\tconst newRuleModels = [...this.rules];\n\n\t\tconst ruleParams =\n\t\t\ttypeof newRule === 'number' ? {elementType: newRule} : newRule;\n\t\tconst {elementType, ...rest} = ruleParams;\n\t\tconst model = getRuleModel(elementType);\n\t\tif (!model) return;\n\t\tnewRuleModels.splice(\n\t\t\tindex,\n\t\t\t1,\n\t\t\tnew model(rest as any), // TODO\n\t\t);\n\t\tthis.rules.replace(newRuleModels);\n\t}\n\n\treorderRule(fromId: string, toId: string) {\n\t\tconst fromIndex = this.rules.findIndex(({_id}) => _id === fromId);\n\t\tconst toIndex = this.rules.findIndex(({_id}) => _id === toId);\n\t\tif (fromIndex < 0 || toIndex < 0) return;\n\t\tthis.reorderRuleByIndex(fromIndex, toIndex);\n\t}\n\n\treorderRuleByIndex(fromIndex: number, toIndex: number) {\n\t\tthis.rules.replace(array_move(this.rules, fromIndex, toIndex));\n\t}\n\n\tsetMatchCriteria(matchCriteria: SearchMatchCriteria) {\n\t\tthis.matchCriteria = matchCriteria;\n\t}\n}\n","import {useEffect, useState} from 'react';\nimport {useUpdateEffect} from '@netx/core-components/hooks/useUpdateEffect';\nimport {useSavedSearch} from '@netx/core-search-saved/hooks/useSavedSearch';\nimport {SearchMatchCriteria} from '../constants';\nimport {SearchRule} from '../rules';\nimport {SearchRulesStore} from '../store';\nimport {savedSearchCriteriaToRuleObjects} from '../utils';\n\nexport type UseSearchRulesStoreParams = {\n\tmatchCriteria?: SearchMatchCriteria;\n\trules?: SearchRule[];\n\tsavedSearchId?: number;\n};\n\nexport const useSearchRulesStore = ({\n\tmatchCriteria,\n\trules,\n\tsavedSearchId,\n}: UseSearchRulesStoreParams = {}) => {\n\tconst [store, setStore] = useState(\n\t\t() => new SearchRulesStore({rules, matchCriteria}),\n\t);\n\n\tconst {savedSearch, loading: loadingSavedSearch} = useSavedSearch({\n\t\tid: savedSearchId,\n\t\textended: true,\n\t});\n\n\tuseUpdateEffect(() => {\n\t\tsetStore(new SearchRulesStore({rules, matchCriteria}));\n\t}, [rules, matchCriteria]);\n\n\tuseEffect(() => {\n\t\tif (!savedSearch) return;\n\n\t\tconst ruleObjects = savedSearchCriteriaToRuleObjects({\n\t\t\tcriteria: savedSearch.criteria,\n\t\t});\n\t\tsetStore(\n\t\t\tnew SearchRulesStore({\n\t\t\t\trules: ruleObjects,\n\t\t\t\tmatchCriteria: savedSearch.matchCriteria,\n\t\t\t}),\n\t\t);\n\t}, [savedSearch]);\n\n\treturn {\n\t\tstore,\n\t\tloading: loadingSavedSearch,\n\t};\n};\n\nexport default useSearchRulesStore;\n","import React, {createContext, useContext, useImperativeHandle} from 'react';\n\nimport {useSearchRulesStore} from '../hooks/useSearchRulesStore';\nimport type {ArgumentsType} from '@netx/core/typings';\n\nexport type SearchRulesStoreContextType = ReturnType<\n\ttypeof useSearchRulesStore\n>;\n\nexport const SearchRulesStoreContext = createContext<\n\tSearchRulesStoreContextType | undefined\n>(undefined);\n\nexport const useSearchRulesStoreProvider = () => {\n\tconst context = useContext(SearchRulesStoreContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t'`useSearchRulesStoreProvider` must be used within a `SearchRulesStoreProvider`',\n\t\t);\n\t}\n\treturn context;\n};\n\nexport type SearchRulesStoreProviderRef =\n\tReact.RefObject<SearchRulesStoreContextType>;\n\nexport type SearchRulesStoreProviderChildrenProps = SearchRulesStoreContextType;\n\nexport type SearchRulesStoreProviderProps = ArgumentsType<\n\ttypeof useSearchRulesStore\n>[0] & {\n\tref?: SearchRulesStoreProviderRef;\n\tchildren:\n\t\t| React.ReactNode\n\t\t| ((props: SearchRulesStoreProviderChildrenProps) => React.ReactNode);\n};\n\nconst SearchRulesStoreProviderInner = (\n\t{children, ...props}: SearchRulesStoreProviderProps,\n\tref: SearchRulesStoreProviderRef,\n) => {\n\tconst searchRulesStore = useSearchRulesStore(props);\n\n\tuseImperativeHandle(ref, () => searchRulesStore, [searchRulesStore]);\n\n\treturn (\n\t\t<SearchRulesStoreContext.Provider value={searchRulesStore}>\n\t\t\t{typeof children === 'function' ? children(searchRulesStore) : children}\n\t\t</SearchRulesStoreContext.Provider>\n\t);\n};\n\nexport const SearchRulesStoreProviderPrimitive = React.forwardRef<\n\tSearchRulesStoreContextType,\n\tSearchRulesStoreProviderProps\n>(SearchRulesStoreProviderInner);\n\n/**\n * search rules store context provider\\\n * used for managing/editing rules\n * @example\n * <SearchRulesStoreProvider ref={searchRulesStoreRef}>\n * \t...\n * </SearchRulesStoreProvider>\n * @example\n * <SearchRulesStoreProvider ref={searchRulesStoreRef}>\n * \t{(searchRulesStore) => (\n * \t\t...\n * \t)}\n * </SearchRulesStoreProvider>\n */\nexport const SearchRulesStoreProvider = SearchRulesStoreProviderPrimitive;\n\nexport default SearchRulesStoreProvider;\n\nexport const withSearchRulesStore = function <C extends React.ElementType>(\n\tComponent: C,\n) {\n\treturn (\n\t\tprops: JSX.IntrinsicAttributes &\n\t\t\tJSX.LibraryManagedAttributes<C, React.ComponentProps<C>>,\n\t) => {\n\t\treturn (\n\t\t\t<SearchRulesStoreProvider>\n\t\t\t\t<Component {...props} />\n\t\t\t</SearchRulesStoreProvider>\n\t\t);\n\t};\n};\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const ADVANCED_RAW_RULE_EDITOR_CLASS_NAME = 'AdvancedRawRuleEditor';\nexport const ADVANCED_RAW_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type AdvancedRawRuleEditorClassSlot =\n\ttypeof ADVANCED_RAW_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface AdvancedRawRuleEditorClasses {\n\troot: string;\n}\n\nexport type AdvancedRawRuleEditorClassKey = keyof AdvancedRawRuleEditorClasses;\n\nexport const getAdvancedRawRuleEditorUtilityClass = (\n\tslot: AdvancedRawRuleEditorClassSlot,\n) => generateUtilityClass(ADVANCED_RAW_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const advancedRawRuleEditorClasses: AdvancedRawRuleEditorClasses =\n\tgenerateUtilityClasses(ADVANCED_RAW_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default advancedRawRuleEditorClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\nimport {TextField} from '@netx/core-components/Form';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport type {CommonRuleEditorProps, RuleValidationErrors} from '../../../types';\nimport {\n\tadvancedRawRuleEditorClasses,\n\tgetAdvancedRawRuleEditorUtilityClass,\n\tAdvancedRawRuleEditorClasses,\n\tADVANCED_RAW_RULE_EDITOR_CLASS_NAME,\n} from './advancedRawRuleEditorClasses';\n\nexport type AdvancedRawRuleEditorOwnerState = WithClasses<\n\tAdvancedRawRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: AdvancedRawRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getAdvancedRawRuleEditorUtilityClass, classes);\n};\n\nconst AdvancedRawRuleEditorRoot = styled('div', {\n\tname: ADVANCED_RAW_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n}));\n\nexport type AdvancedRawRuleEditorProps = WithClasses<\n\tAdvancedRawRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementValue1: string;\n\t\tonValue1Change: (value: string) => void;\n\t}\n>;\n\nconst AdvancedRawRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementValue1,\n\tvalidationErrors,\n\tonValue1Change,\n}: AdvancedRawRuleEditorProps) => {\n\tconst ownerState: AdvancedRawRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t<AdvancedRawRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<TextField\n\t\t\t\tdata-testid=\"advanced-raw-rule-value-1\"\n\t\t\t\tname=\"rule-value-1\"\n\t\t\t\tlabel={i18n.t('i18n.value')}\n\t\t\t\trequired\n\t\t\t\tvalue={elementValue1.toString()}\n\t\t\t\tonChange={onValue1Change}\n\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t/>\n\t\t</AdvancedRawRuleEditorRoot>\n\t);\n};\n\nexport const AdvancedRawRuleEditorPrimitive = AdvancedRawRuleEditorInner;\n\nexport const AdvancedRawRuleEditor = AdvancedRawRuleEditorPrimitive;\n\nexport default AdvancedRawRuleEditor;\n\nexport type AdvancedRawRuleEditorGenericProps = WithClasses<\n\tAdvancedRawRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\n/**\n * Generic wrapper to accomodate shared rule pattern differences\n */\nexport const AdvancedRawRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: AdvancedRawRuleEditorGenericProps) => {\n\treturn (\n\t\t<AdvancedRawRuleEditor\n\t\t\t{...props}\n\t\t\telementValue1={elementValue1.toString()}\n\t\t/>\n\t);\n};\n\nexport const AdvancedRawRuleEditorGeneric =\n\tAdvancedRawRuleEditorGenericPrimitive;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const ATTRIBUTE_HISTORY_RULE_EDITOR_CLASS_NAME =\n\t'AttributeHistoryRuleEditor';\nexport const ATTRIBUTE_HISTORY_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type AttributeHistoryRuleEditorClassSlot =\n\ttypeof ATTRIBUTE_HISTORY_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface AttributeHistoryRuleEditorClasses {\n\troot: string;\n}\n\nexport type AttributeHistoryRuleEditorClassKey =\n\tkeyof AttributeHistoryRuleEditorClasses;\n\nexport const getAttributeHistoryRuleEditorUtilityClass = (\n\tslot: AttributeHistoryRuleEditorClassSlot,\n) => generateUtilityClass(ATTRIBUTE_HISTORY_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const attributeHistoryRuleEditorClasses: AttributeHistoryRuleEditorClasses =\n\tgenerateUtilityClasses(ATTRIBUTE_HISTORY_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default attributeHistoryRuleEditorClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {\n\tattributeHistoryRuleEditorClasses,\n\tgetAttributeHistoryRuleEditorUtilityClass,\n\tAttributeHistoryRuleEditorClasses,\n\tATTRIBUTE_HISTORY_RULE_EDITOR_CLASS_NAME,\n} from './attributeHistoryRuleEditorClasses';\n\nexport type AttributeHistoryRuleEditorOwnerState = WithClasses<\n\tAttributeHistoryRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (\n\townerState: AttributeHistoryRuleEditorOwnerState,\n) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetAttributeHistoryRuleEditorUtilityClass,\n\t\tclasses,\n\t);\n};\n\nconst AttributeHistoryRuleEditorRoot = styled('div', {\n\tname: ATTRIBUTE_HISTORY_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n}));\n\nexport type AttributeHistoryRuleEditorProps = WithClasses<\n\tAttributeHistoryRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nconst AttributeHistoryRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n}: AttributeHistoryRuleEditorProps) => {\n\tconst ownerState: AttributeHistoryRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t<AttributeHistoryRuleEditorRoot\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t></AttributeHistoryRuleEditorRoot>\n\t);\n};\n\nexport const AttributeHistoryRuleEditorPrimitive =\n\tAttributeHistoryRuleEditorInner;\n\nexport const AttributeHistoryRuleEditor = AttributeHistoryRuleEditorPrimitive;\n\nexport default AttributeHistoryRuleEditor;\n","import {i18n} from '@netx/core/i18n';\nimport {CheckoutType} from './constants';\n\nexport const CheckoutTypeLabel: Record<CheckoutType, string> = {\n\t[CheckoutType.ALL]: i18n.t('i18n.all'),\n\t[CheckoutType.USER_ID]: i18n.t('i18n.specificUser'),\n};\n","import {CheckoutType} from '../constants';\nimport {CheckoutTypeLabel} from '../locales';\n\nexport const getCheckoutsTypeLabel = (type: CheckoutType) =>\n\tCheckoutTypeLabel[type];\n\nexport default getCheckoutsTypeLabel;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const CHECKOUTS_RULE_EDITOR_CLASS_NAME = 'CheckoutsRuleEditor';\nexport const CHECKOUTS_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type CheckoutsRuleEditorClassSlot =\n\ttypeof CHECKOUTS_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface CheckoutsRuleEditorClasses {\n\troot: string;\n}\n\nexport type CheckoutsRuleEditorClassKey = keyof CheckoutsRuleEditorClasses;\n\nexport const getCheckoutsRuleEditorUtilityClass = (\n\tslot: CheckoutsRuleEditorClassSlot,\n) => generateUtilityClass(CHECKOUTS_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const checkoutsRuleEditorClasses: CheckoutsRuleEditorClasses =\n\tgenerateUtilityClasses(CHECKOUTS_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default checkoutsRuleEditorClasses;\n","import React, {useEffect, useMemo, useState} from 'react';\nimport clsx from 'clsx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {SelectField} from '@netx/core-components/Form/SelectField';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {UserAutoList} from '@netx/core-user/components/UserAutoList';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport {SearchValueUnavailableLabel} from '../../../locales';\nimport type {CommonRuleEditorProps} from '../../../types';\nimport {CheckoutType} from '../../constants';\nimport {getCheckoutsTypeLabel} from '../../utils';\nimport {\n\tcheckoutsRuleEditorClasses,\n\tgetCheckoutsRuleEditorUtilityClass,\n\tCheckoutsRuleEditorClasses,\n\tCHECKOUTS_RULE_EDITOR_CLASS_NAME,\n} from './checkoutsRuleEditorClasses';\n\nexport type CheckoutsRuleEditorOwnerState = WithClasses<\n\tCheckoutsRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: CheckoutsRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getCheckoutsRuleEditorUtilityClass, classes);\n};\n\nconst CheckoutsRuleEditorRoot = styled('div', {\n\tname: CHECKOUTS_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nexport type CheckoutsRuleEditorProps = WithClasses<\n\tCheckoutsRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: CheckoutType;\n\t\telementSubType1Options?: CheckoutType[];\n\t\telementValue1: number;\n\t\telementValue1Unavailable: boolean;\n\t\telementValue1Label: string;\n\t\telementValue1Loading: boolean;\n\t\tonSubType1Change: (subType1: CheckoutType) => void;\n\t\tonValue1Change: (value: number) => void;\n\t}\n>;\n\nconst CheckoutsRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementValue1,\n\telementValue1Unavailable,\n\telementValue1Label,\n\telementValue1Loading,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonValue1Change,\n}: CheckoutsRuleEditorProps) => {\n\tconst ownerState: CheckoutsRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst [userName, setUserName] = useState('');\n\n\tuseEffect(() => {\n\t\tsetUserName(elementValue1Label);\n\t}, [elementValue1Label]);\n\n\tconst waitingForUserLabel = elementValue1Loading && userName === '';\n\n\tconst _elementSubType1Options = useMemo(\n\t\t() => elementSubType1Options || enumToValues(CheckoutType),\n\t\t[elementSubType1Options],\n\t);\n\n\treturn (\n\t\t<CheckoutsRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<CheckoutType, false, true, false>\n\t\t\t\tdata-testid=\"checkouts-rule-sub-type-1\"\n\t\t\t\toptions={_elementSubType1Options}\n\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\tonChange={onSubType1Change}\n\t\t\t\tvalue={elementSubType1}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\tgetOptionLabel: getCheckoutsTypeLabel,\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t{elementSubType1 === CheckoutType.USER_ID ? (\n\t\t\t\t<UserAutoList<false, true>\n\t\t\t\t\tdata-testid=\"checkouts-rule-value-1\"\n\t\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\t\tloadingValue={elementValue1Loading}\n\t\t\t\t\tname=\"rule-value-1\"\n\t\t\t\t\tplaceholder={\n\t\t\t\t\t\twaitingForUserLabel\n\t\t\t\t\t\t\t? 'loading...'\n\t\t\t\t\t\t\t: elementValue1Unavailable\n\t\t\t\t\t\t\t? SearchValueUnavailableLabel\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tvalue={\n\t\t\t\t\t\telementValue1Unavailable || waitingForUserLabel\n\t\t\t\t\t\t\t? (null as any)\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tlabel: userName,\n\t\t\t\t\t\t\t\t\tvalue: elementValue1,\n\t\t\t\t\t\t\t }\n\t\t\t\t\t}\n\t\t\t\t\tonChange={(user) => {\n\t\t\t\t\t\tif (!user) return;\n\t\t\t\t\t\tsetUserName(user.label);\n\t\t\t\t\t\tonValue1Change(user.value);\n\t\t\t\t\t}}\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</CheckoutsRuleEditorRoot>\n\t);\n};\n\nexport const CheckoutsRuleEditorPrimitive = CheckoutsRuleEditorInner;\n\nexport const CheckoutsRuleEditor = CheckoutsRuleEditorPrimitive;\n\nexport default CheckoutsRuleEditor;\n\nexport type CheckoutsRuleEditorGenericProps = WithClasses<\n\tCheckoutsRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nexport const CheckoutsRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: CheckoutsRuleEditorGenericProps) => {\n\treturn (\n\t\t<CheckoutsRuleEditor\n\t\t\t{...props}\n\t\t\telementValue1={parseInt(elementValue1.toString()) || 0}\n\t\t/>\n\t);\n};\n\nexport const CheckoutsRuleEditorGeneric = CheckoutsRuleEditorGenericPrimitive;\n","import {i18n} from '@netx/core/i18n';\nimport {ContentsType} from './constants';\n\nexport const ContentsTypeLabel: Record<ContentsType, string> = {\n\t[ContentsType.MATCH_ALL_FRAGMENTS]: i18n.t('i18n.matchAllFragments'),\n\t[ContentsType.MATCH_ALL_WHOLE_WORDS_AND]: i18n.t(\n\t\t'i18n.matchAllWholeWordsAND',\n\t),\n\t[ContentsType.MATCH_ANY_FRAGMENT]: i18n.t('i18n.matchAnyFragment'),\n\t[ContentsType.MATCH_ANY_WHOLE_WORDS_OR]: i18n.t('i18n.matchAnyWholeWordsOR'),\n\t[ContentsType.MATCH_EXACTLY]: i18n.t('i18n.matchExactly'),\n\t[ContentsType.MATCH_EXCLUDE]: i18n.t('i18n.matchExclude'),\n};\n","import {ContentsType} from '../constants';\nimport {ContentsTypeLabel} from '../locales';\n\nexport const getContentsTypeLabel = (type: ContentsType) =>\n\tContentsTypeLabel[type];\n\nexport default getContentsTypeLabel;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const CONTENTS_RULE_EDITOR_CLASS_NAME = 'ContentsRuleEditor';\nexport const CONTENTS_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type ContentsRuleEditorClassSlot =\n\ttypeof CONTENTS_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface ContentsRuleEditorClasses {\n\troot: string;\n}\n\nexport type ContentsRuleEditorClassKey = keyof ContentsRuleEditorClasses;\n\nexport const getContentsRuleEditorUtilityClass = (\n\tslot: ContentsRuleEditorClassSlot,\n) => generateUtilityClass(CONTENTS_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const contentsRuleEditorClasses: ContentsRuleEditorClasses =\n\tgenerateUtilityClasses(CONTENTS_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default contentsRuleEditorClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {SelectField, TextField} from '@netx/core-components/Form';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {ContentsType} from '../../constants';\nimport {getContentsTypeLabel} from '../../utils';\nimport {\n\tcontentsRuleEditorClasses,\n\tgetContentsRuleEditorUtilityClass,\n\tContentsRuleEditorClasses,\n\tCONTENTS_RULE_EDITOR_CLASS_NAME,\n} from './contentsRuleEditorClasses';\n\nexport type ContentsRuleEditorOwnerState = WithClasses<\n\tContentsRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: ContentsRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getContentsRuleEditorUtilityClass, classes);\n};\n\nconst ContentsRuleEditorRoot = styled('div', {\n\tname: CONTENTS_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\t'& > * + *': {\n\t\tmarginLeft: `${theme.spacing(1)} !important`,\n\t},\n}));\n\nexport type ContentsRuleEditorProps = WithClasses<\n\tContentsRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: ContentsType;\n\t\telementSubType1Options?: ContentsType[];\n\t\telementValue1: string;\n\t\tonSubType1Change: (subType1: ContentsType) => void;\n\t\tonValue1Change: (value: string) => void;\n\t}\n>;\n\nconst ContentsRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementValue1,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonValue1Change,\n}: ContentsRuleEditorProps) => {\n\tconst ownerState: ContentsRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst _elementSubType1Options = useMemo(\n\t\t() => elementSubType1Options || enumToValues(ContentsType),\n\t\t[elementSubType1Options],\n\t);\n\n\treturn (\n\t\t<ContentsRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<ContentsType, false, true, false>\n\t\t\t\tdata-testid=\"contents-rule-sub-type-1\"\n\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\toptions={_elementSubType1Options}\n\t\t\t\tvalue={elementSubType1}\n\t\t\t\tonChange={onSubType1Change}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\tgetOptionLabel: getContentsTypeLabel,\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<TextField\n\t\t\t\tdata-testid=\"contents-rule-value-1\"\n\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\tlabel={i18n.t('i18n.contents')}\n\t\t\t\tname=\"rule-value-1\"\n\t\t\t\tvalue={elementValue1}\n\t\t\t\tonChange={onValue1Change}\n\t\t\t/>\n\t\t</ContentsRuleEditorRoot>\n\t);\n};\n\nexport const ContentsRuleEditorPrimitive = ContentsRuleEditorInner;\n\nexport const ContentsRuleEditor = ContentsRuleEditorPrimitive;\n\nexport default ContentsRuleEditor;\n\nexport type ContentsRuleEditorGenericProps = WithClasses<\n\tContentsRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nexport const ContentsRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: ContentsRuleEditorGenericProps) => {\n\treturn (\n\t\t<ContentsRuleEditor {...props} elementValue1={elementValue1.toString()} />\n\t);\n};\n\nexport const ContentsRuleEditorGeneric = ContentsRuleEditorGenericPrimitive;\n","import {i18n} from '@netx/core/i18n';\nimport {DateType, DateSubType} from './constants';\n\nexport const DateRuleTypeLabel: Record<DateType, string> = {\n\t[DateType.CREATION_DATE]: i18n.t('i18n.creationDate'),\n\t[DateType.IMPORT_DATE]: i18n.t('i18n.importDate'),\n\t[DateType.LAST_MODIFIED]: i18n.t('i18n.lastModified'),\n\t[DateType.USER_DEFINED_ATTRIBUTE]: i18n.t('i18n.userDefinedAttribute'),\n};\n\nexport const DateRuleSubTypeLabel: Record<DateSubType, string> = {\n\t[DateSubType.AFTER]: i18n.t('i18n.rangeAfter'),\n\t[DateSubType.BEFORE]: i18n.t('i18n.rangeBefore'),\n\t[DateSubType.IN_BETWEEN]: i18n.t('i18n.rangeInBetween'),\n\t[DateSubType.LAST_MONTH]: i18n.t('i18n.rangeLastMonth'),\n\t[DateSubType.LAST_SIX_MONTHS]: i18n.t('i18n.rangeLastSixMonths'),\n\t[DateSubType.LAST_THREE_MONTHS]: i18n.t('i18n.rangeLastThreeMonths'),\n\t[DateSubType.LAST_WEEK]: i18n.t('i18n.rangeLastWeek'),\n\t[DateSubType.LAST_YEAR]: i18n.t('i18n.rangeLastYear'),\n\t[DateSubType.TODAY]: i18n.t('i18n.today'),\n\t[DateSubType.YESTERDAY]: i18n.t('i18n.rangeYesterday'),\n};\n","import {DateSubType} from '../constants';\nimport {DateRuleSubTypeLabel} from '../locales';\n\nexport const getDateSubTypeLabel = (type: DateSubType) =>\n\tDateRuleSubTypeLabel[type];\n\nexport default getDateSubTypeLabel;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const DATE_RULE_EDITOR_CLASS_NAME = 'DateRuleEditor';\nexport const DATE_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type DateRuleEditorClassSlot =\n\ttypeof DATE_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface DateRuleEditorClasses {\n\troot: string;\n}\n\nexport type DateRuleEditorClassKey = keyof DateRuleEditorClasses;\n\nexport const getDateRuleEditorUtilityClass = (slot: DateRuleEditorClassSlot) =>\n\tgenerateUtilityClass(DATE_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const dateRuleEditorClasses: DateRuleEditorClasses =\n\tgenerateUtilityClasses(DATE_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default dateRuleEditorClasses;\n","import React, {useCallback, useMemo} from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {SelectField, DateField} from '@netx/core-components/Form';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {ATTRIBUTE_TYPE} from '@netx/core-attribute/constants';\nimport {useAttributes} from '@netx/core-attribute/hooks/useAttributes';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport type {CommonRuleEditorProps} from '../../../types';\nimport {DateType, DateSubType, DateSystemDefinedTypes} from '../../constants';\nimport {dateRuleDefaults} from '../../defaults';\nimport {DateRuleTypeLabel} from '../../locales';\nimport {getDateSubTypeLabel} from '../../utils';\nimport {\n\tdateRuleEditorClasses,\n\tgetDateRuleEditorUtilityClass,\n\tDateRuleEditorClasses,\n\tDATE_RULE_EDITOR_CLASS_NAME,\n} from './dateRuleEditorClasses';\n\nexport type DateRuleEditorOwnerState = WithClasses<DateRuleEditorClasses, {}>;\n\nconst useUtilityClasses = (ownerState: DateRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getDateRuleEditorUtilityClass, classes);\n};\n\nconst DateRuleEditorRoot = styled('div', {\n\tname: DATE_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tflex: '1 1 auto',\n}));\n\nconst DateRuleEditorCriteria = styled('div', {\n\tname: DATE_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Criteria',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nconst DateRuleEditorValues = styled('div', {\n\tname: DATE_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Values',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tmarginTop: theme.spacing(2),\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nexport type DateRuleEditorProps = WithClasses<\n\tDateRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: DateType;\n\t\telementSubType1Options: DateType[];\n\t\telementSubType2: DateSubType;\n\t\telementSubType2Options?: DateSubType[];\n\t\telementValue1: string;\n\t\telementValue2: string;\n\t\t/** attribute name */\n\t\telementValue3: string;\n\t\tonSubType1Change: (subType1: DateType) => void;\n\t\tonSubType2Change: (subType2: DateSubType) => void;\n\t\tonValue1Change: (value: string) => void;\n\t\tonValue2Change: (value: string) => void;\n\t\tonValue3Change: (value: string) => void;\n\t}\n>;\n\nconst DateRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementSubType2,\n\telementSubType2Options,\n\telementValue1,\n\telementValue2,\n\telementValue3,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonSubType2Change,\n\tonValue1Change,\n\tonValue2Change,\n\tonValue3Change,\n}: DateRuleEditorProps) => {\n\tconst ownerState: DateRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst {getByType, state: attributeState} = useAttributes();\n\n\tconst _elementSubType2Options = useMemo(\n\t\t() => elementSubType2Options || enumToValues(DateSubType),\n\t\t[elementSubType2Options],\n\t);\n\n\tconst userDates = useMemo(\n\t\t() => getByType(ATTRIBUTE_TYPE.DATE, true),\n\t\t[attributeState.data],\n\t);\n\n\tconst getSubType1OptionLabel = useCallback((option: DateType) => {\n\t\treturn DateRuleTypeLabel[option] || option.toString();\n\t}, []);\n\n\tconst options: Array<string | number> = useMemo(\n\t\t() => [\n\t\t\t...elementSubType1Options.filter(\n\t\t\t\t(opt) => opt !== DateType.USER_DEFINED_ATTRIBUTE,\n\t\t\t),\n\t\t\t...userDates.map((d) => d.name),\n\t\t],\n\t\t[elementSubType1Options],\n\t);\n\n\treturn (\n\t\t<DateRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<DateRuleEditorCriteria>\n\t\t\t\t<SelectField<number | string, false, true, false>\n\t\t\t\t\tdata-testid=\"date-rule-sub-type-1\"\n\t\t\t\t\tlabel={i18n.t('i18n.date')}\n\t\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\t\toptions={options}\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t(DateSystemDefinedTypes as readonly number[]).includes(\n\t\t\t\t\t\t\telementSubType1,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\t? elementSubType1\n\t\t\t\t\t\t\t: elementValue3 || dateRuleDefaults.elementSubType1\n\t\t\t\t\t}\n\t\t\t\t\tonChange={(subType1: DateType) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(DateSystemDefinedTypes as readonly number[]).includes(subType1)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tonSubType1Change(subType1);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonSubType1Change(DateType.USER_DEFINED_ATTRIBUTE);\n\t\t\t\t\t\tonValue3Change(subType1.toString());\n\t\t\t\t\t}}\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t\tgetOptionLabel: getSubType1OptionLabel,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t<SelectField<DateSubType, false, true, false>\n\t\t\t\t\tdata-testid=\"date-rule-sub-type-2\"\n\t\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\t\tname={'rule-sub-type-2'}\n\t\t\t\t\toptions={_elementSubType2Options}\n\t\t\t\t\tvalue={elementSubType2}\n\t\t\t\t\tonChange={onSubType2Change}\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t\tgetOptionLabel: getDateSubTypeLabel,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</DateRuleEditorCriteria>\n\n\t\t\t<DateRuleEditorValues>\n\t\t\t\t{[\n\t\t\t\t\tDateSubType.AFTER,\n\t\t\t\t\tDateSubType.BEFORE,\n\t\t\t\t\tDateSubType.IN_BETWEEN,\n\t\t\t\t].includes(elementSubType2) ? (\n\t\t\t\t\t<DateField\n\t\t\t\t\t\tdata-testid=\"date-rule-value-1\"\n\t\t\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\telementSubType2 === DateSubType.AFTER\n\t\t\t\t\t\t\t\t? i18n.t('i18n.afterDate')\n\t\t\t\t\t\t\t\t: elementSubType2 === DateSubType.BEFORE\n\t\t\t\t\t\t\t\t? i18n.t('i18n.beforeDate')\n\t\t\t\t\t\t\t\t: i18n.t('i18n.from')\n\t\t\t\t\t\t}\n\t\t\t\t\t\tname=\"rule-value-1\"\n\t\t\t\t\t\trequired\n\t\t\t\t\t\tvalue={elementValue1 || null}\n\t\t\t\t\t\tonChange={(value) => onValue1Change(value || '')}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\n\t\t\t\t{[DateSubType.IN_BETWEEN].includes(elementSubType2) ? (\n\t\t\t\t\t<DateField\n\t\t\t\t\t\tdata-testid=\"date-rule-value-2\"\n\t\t\t\t\t\terror={validationErrors?.elementValue2}\n\t\t\t\t\t\tlabel={i18n.t('i18n.to')}\n\t\t\t\t\t\tname=\"rule-value2\"\n\t\t\t\t\t\trequired\n\t\t\t\t\t\tvalue={elementValue2 || null}\n\t\t\t\t\t\tonChange={(value) => onValue2Change(value || '')}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</DateRuleEditorValues>\n\t\t</DateRuleEditorRoot>\n\t);\n};\n\nexport const DateRuleEditorPrimitive = DateRuleEditorInner;\n\nexport const DateRuleEditor = DateRuleEditorPrimitive;\n\nexport default DateRuleEditor;\n\nexport type DateRuleEditorGenericProps = WithClasses<\n\tDateRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nexport const DateRuleEditorGenericPrimitive = ({\n\telementValue1,\n\telementValue2,\n\telementValue3,\n\t...props\n}: DateRuleEditorGenericProps) => {\n\treturn (\n\t\t<DateRuleEditor\n\t\t\t{...props}\n\t\t\telementValue1={elementValue1.toString()}\n\t\t\telementValue2={elementValue2.toString()}\n\t\t\telementValue3={elementValue3.toString()}\n\t\t/>\n\t);\n};\n\nexport const DateRuleEditorGeneric = DateRuleEditorGenericPrimitive;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const EXPIRATION_RULE_EDITOR_CLASS_NAME = 'ExpirationRuleEditor';\nexport const EXPIRATION_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type ExpirationRuleEditorClassSlot =\n\ttypeof EXPIRATION_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface ExpirationRuleEditorClasses {\n\troot: string;\n}\n\nexport type ExpirationRuleEditorClassKey = keyof ExpirationRuleEditorClasses;\n\nexport const getExpirationRuleEditorUtilityClass = (\n\tslot: ExpirationRuleEditorClassSlot,\n) => generateUtilityClass(EXPIRATION_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const expirationRuleEditorClasses: ExpirationRuleEditorClasses =\n\tgenerateUtilityClasses(EXPIRATION_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default expirationRuleEditorClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {\n\texpirationRuleEditorClasses,\n\tgetExpirationRuleEditorUtilityClass,\n\tExpirationRuleEditorClasses,\n\tEXPIRATION_RULE_EDITOR_CLASS_NAME,\n} from './expirationRuleEditorClasses';\n\nexport type ExpirationRuleEditorOwnerState = WithClasses<\n\tExpirationRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: ExpirationRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getExpirationRuleEditorUtilityClass, classes);\n};\n\nconst ExpirationRuleEditorRoot = styled('div', {\n\tname: EXPIRATION_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n}));\n\nexport type ExpirationRuleEditorProps = WithClasses<\n\tExpirationRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nconst ExpirationRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n}: ExpirationRuleEditorProps) => {\n\tconst ownerState: ExpirationRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t<ExpirationRuleEditorRoot\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t></ExpirationRuleEditorRoot>\n\t);\n};\n\nexport const ExpirationRuleEditorPrimitive = ExpirationRuleEditorInner;\n\nexport const ExpirationRuleEditor = ExpirationRuleEditorPrimitive;\n\nexport default ExpirationRuleEditor;\n","import {i18n} from '@netx/core/i18n';\nimport {\n\tFileAspectType,\n\tFileAspectSubType,\n\tFileAspectOrientationValue,\n} from './constants';\n\nexport const FileAspectTypeLabel: Record<FileAspectType, string> = {\n\t[FileAspectType.DURATION]: i18n.t('i18n.durationSeconds'),\n\t[FileAspectType.HEIGHT]: i18n.t('i18n.height'),\n\t[FileAspectType.ORIENTATION]: i18n.t('i18n.orientation'),\n\t[FileAspectType.WIDTH]: i18n.t('i18n.width'),\n};\n\nexport const FileAspectSubTypeLabel: Record<FileAspectSubType, string> = {\n\t[FileAspectSubType.APPROXIMATELY]: i18n.t('i18n.approximately'),\n\t[FileAspectSubType.EQUAL_TO]: i18n.t('i18n.equalTo'),\n\t[FileAspectSubType.GREATER_THAN]: i18n.t('i18n.greaterThan'),\n\t[FileAspectSubType.LESS_THAN]: i18n.t('i18n.lessThan'),\n};\n\nexport const FileAspectOrientationValueLabel: Record<\n\tFileAspectOrientationValue,\n\tstring\n> = {\n\t[FileAspectOrientationValue.LANDSCAPE]: i18n.t('i18n.landscape'),\n\t[FileAspectOrientationValue.PORTRAIT]: i18n.t('i18n.portrait'),\n};\n","import {FileAspectSubType} from '../constants';\nimport {FileAspectSubTypeLabel} from '../locales';\n\nexport const getFileAspectSubTypeLabel = (option: FileAspectSubType) =>\n\tFileAspectSubTypeLabel[option];\n\nexport default getFileAspectSubTypeLabel;\n","import {FileAspectType} from '../constants';\nimport {FileAspectTypeLabel} from '../locales';\n\nexport const getFileAspectTypeLabel = (type: FileAspectType) =>\n\tFileAspectTypeLabel[type];\n\nexport default getFileAspectTypeLabel;\n","import {FileAspectOrientationValue} from '../constants';\nimport {FileAspectOrientationValueLabel} from '../locales';\n\nexport const getOrientationLabel = (orientation: FileAspectOrientationValue) =>\n\tFileAspectOrientationValueLabel[orientation];\n\nexport default getOrientationLabel;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const FILE_ASPECT_RULE_EDITOR_CLASS_NAME = 'FileAspectRuleEditor';\nexport const FILE_ASPECT_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type FileAspectRuleEditorClassSlot =\n\ttypeof FILE_ASPECT_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface FileAspectRuleEditorClasses {\n\troot: string;\n}\n\nexport type FileAspectRuleEditorClassKey = keyof FileAspectRuleEditorClasses;\n\nexport const getFileAspectRuleEditorUtilityClass = (\n\tslot: FileAspectRuleEditorClassSlot,\n) => generateUtilityClass(FILE_ASPECT_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const fileAspectRuleEditorClasses: FileAspectRuleEditorClasses =\n\tgenerateUtilityClasses(FILE_ASPECT_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default fileAspectRuleEditorClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {enumToValues} from '@netx/core/utils/enumToValues';\nimport {SelectField, NumberField} from '@netx/core-components/Form';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {\n\tFileAspectType,\n\tFileAspectSubType,\n\tFileAspectOrientationValue,\n} from '../../constants';\nimport {FileAspectTypeLabel} from '../../locales';\nimport {\n\tgetFileAspectSubTypeLabel,\n\tgetFileAspectTypeLabel,\n\tgetOrientationLabel,\n} from '../../utils';\nimport {\n\tfileAspectRuleEditorClasses,\n\tgetFileAspectRuleEditorUtilityClass,\n\tFileAspectRuleEditorClasses,\n\tFILE_ASPECT_RULE_EDITOR_CLASS_NAME,\n} from './fileAspectRuleEditorClasses';\n\nexport type FileAspectRuleEditorOwnerState = WithClasses<\n\tFileAspectRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: FileAspectRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getFileAspectRuleEditorUtilityClass, classes);\n};\n\nconst FileAspectRuleEditorRoot = styled('div', {\n\tname: FILE_ASPECT_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tflexDirection: 'column',\n}));\n\nconst FileAspectEditorCriteria = styled('div', {\n\tname: FILE_ASPECT_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Criteria',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nconst FileAspectEditorValues = styled('div', {\n\tname: FILE_ASPECT_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Values',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tmarginTop: theme.spacing(2),\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nconst ORIENTATION_OPTIONS = enumToValues(FileAspectOrientationValue);\n\nexport type FileAspectRuleEditorProps = WithClasses<\n\tFileAspectRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: FileAspectType;\n\t\telementSubType1Options: FileAspectType[];\n\t\telementSubType2: FileAspectSubType;\n\t\telementSubType2Options: FileAspectSubType[];\n\t\telementValue1: number | FileAspectOrientationValue;\n\t\tonSubType1Change: (subType1: FileAspectType) => void;\n\t\tonSubType2Change: (subType2: FileAspectSubType) => void;\n\t\tonValue1Change: (value: number | FileAspectOrientationValue) => void;\n\t}\n>;\n\nconst FileAspectRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementSubType2,\n\telementSubType2Options,\n\telementValue1,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonSubType2Change,\n\tonValue1Change,\n}: FileAspectRuleEditorProps) => {\n\tconst ownerState: FileAspectRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t<FileAspectRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<FileAspectEditorCriteria>\n\t\t\t\t<SelectField<FileAspectType, false, true, false>\n\t\t\t\t\tdata-test-id=\"file-aspect-rule-sub-type-1\"\n\t\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\t\toptions={elementSubType1Options}\n\t\t\t\t\tvalue={elementSubType1}\n\t\t\t\t\tonChange={onSubType1Change}\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t\tgetOptionLabel: getFileAspectTypeLabel,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t<SelectField<FileAspectSubType, false, true, false>\n\t\t\t\t\tdata-test-id=\"file-aspect-rule-sub-type-2\"\n\t\t\t\t\tdisabled={elementSubType2Options.length === 1}\n\t\t\t\t\tname={'rule-sub-type-2'}\n\t\t\t\t\toptions={elementSubType2Options}\n\t\t\t\t\tvalue={elementSubType2}\n\t\t\t\t\tonChange={onSubType2Change}\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t\tgetOptionLabel: getFileAspectSubTypeLabel,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</FileAspectEditorCriteria>\n\n\t\t\t<FileAspectEditorValues>\n\t\t\t\t{elementSubType1 === FileAspectType.ORIENTATION ? (\n\t\t\t\t\t<SelectField<FileAspectOrientationValue, false, true, false>\n\t\t\t\t\t\tdata-test-id=\"file-aspect-rule-value-1\"\n\t\t\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\t\t\toptions={ORIENTATION_OPTIONS}\n\t\t\t\t\t\tlabel={FileAspectTypeLabel[elementSubType1]}\n\t\t\t\t\t\tname={'rule-value-1'}\n\t\t\t\t\t\tonChange={onValue1Change}\n\t\t\t\t\t\tvalue={elementValue1 as number}\n\t\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t\t\tgetOptionLabel: getOrientationLabel,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<NumberField\n\t\t\t\t\t\tdata-test-id=\"file-aspect-rule-value-1\"\n\t\t\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\t\t\tlabel={FileAspectTypeLabel[elementSubType1]}\n\t\t\t\t\t\tname=\"rule-value-1\"\n\t\t\t\t\t\trequired\n\t\t\t\t\t\tvalue={parseInt(elementValue1.toString()) || 0}\n\t\t\t\t\t\tonChange={(value) => onValue1Change(parseInt(value))}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</FileAspectEditorValues>\n\t\t</FileAspectRuleEditorRoot>\n\t);\n};\n\nexport const FileAspectRuleEditorPrimitive = FileAspectRuleEditorInner;\n\nexport const FileAspectRuleEditor = FileAspectRuleEditorPrimitive;\n\nexport default FileAspectRuleEditor;\n\nexport type FileAspectRuleEditorGenericProps = WithClasses<\n\tFileAspectRuleEditorClasses,\n\tCommonRuleEditorProps\n>;\n\nexport const FileAspectRuleEditorGenericPrimitive = ({\n\telementValue1,\n\telementValue2,\n\telementValue3,\n\tonValue2Change,\n\tonValue3Change,\n\t...props\n}: FileAspectRuleEditorGenericProps) => {\n\treturn (\n\t\t<FileAspectRuleEditor\n\t\t\t{...props}\n\t\t\telementValue1={parseInt(elementValue1.toString())}\n\t\t/>\n\t);\n};\n\nexport const FileAspectRuleEditorGeneric = FileAspectRuleEditorGenericPrimitive;\n","import {i18n} from '@netx/core/i18n';\nimport {FileFormatType} from './constants';\n\nexport const FileFormatTypeLabel: Record<FileFormatType, string> = {\n\t[FileFormatType.EXCLUDE]: i18n.t('i18n.exclude'),\n\t[FileFormatType.ONLY]: i18n.t('i18n.only'),\n};\n","import {FileFormatType} from '../constants';\nimport {FileFormatTypeLabel} from '../locales';\n\nexport const getFileFormatTypeLabel = (type: FileFormatType) =>\n\tFileFormatTypeLabel[type];\n\nexport default getFileFormatTypeLabel;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const FILE_FORMAT_RULE_EDITOR_CLASS_NAME = 'FileFormatRuleEditor';\nexport const FILE_FORMAT_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type FileFormatRuleEditorClassSlot =\n\ttypeof FILE_FORMAT_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface FileFormatRuleEditorClasses {\n\troot: string;\n}\n\nexport type FileFormatRuleEditorClassKey = keyof FileFormatRuleEditorClasses;\n\nexport const getFileFormatRuleEditorUtilityClass = (\n\tslot: FileFormatRuleEditorClassSlot,\n) => generateUtilityClass(FILE_FORMAT_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const fileFormatRuleEditorClasses: FileFormatRuleEditorClasses =\n\tgenerateUtilityClasses(FILE_FORMAT_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default fileFormatRuleEditorClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\nimport {SelectField} from '@netx/core-components/Form/SelectField';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {fileTypes} from '@netx/core-search/properties/search';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {FileFormatType} from '../../constants';\nimport {getFileFormatTypeLabel} from '../../utils';\nimport {\n\tfileFormatRuleEditorClasses,\n\tgetFileFormatRuleEditorUtilityClass,\n\tFileFormatRuleEditorClasses,\n\tFILE_FORMAT_RULE_EDITOR_CLASS_NAME,\n} from './fileFormatRuleEditorClasses';\n\nexport type FileFormatRuleEditorOwnerState = WithClasses<\n\tFileFormatRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: FileFormatRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getFileFormatRuleEditorUtilityClass, classes);\n};\n\nconst FileFormatRuleEditorRoot = styled('div', {\n\tname: FILE_FORMAT_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\t'& > * + *': {\n\t\tmarginLeft: `${theme.spacing(1)} !important`,\n\t},\n}));\n\nexport type FileFormatRuleEditorProps = WithClasses<\n\tFileFormatRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: FileFormatType;\n\t\telementSubType1Options: FileFormatType[];\n\t\telementValue1: string;\n\t\tonSubType1Change: (subType1: FileFormatType) => void;\n\t\tonValue1Change: (value: string) => void;\n\t}\n>;\n\nconst FileFormatRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementValue1,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonValue1Change,\n}: FileFormatRuleEditorProps) => {\n\tconst ownerState: FileFormatRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst valueOptions = useMemo(() => {\n\t\treturn Object.keys(fileTypes);\n\t}, []);\n\n\treturn (\n\t\t<FileFormatRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<FileFormatType, false, true, false>\n\t\t\t\tdata-testid=\"file-format-rule-sub-type-1\"\n\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\toptions={elementSubType1Options}\n\t\t\t\tvalue={elementSubType1}\n\t\t\t\tonChange={onSubType1Change}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\tgetOptionLabel: getFileFormatTypeLabel,\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<SelectField<string, false, true, false>\n\t\t\t\tdata-testid=\"file-format-rule-value-1\"\n\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\tlabel={i18n.t('i18n.fileFormat')}\n\t\t\t\tname={'rule-value-1'}\n\t\t\t\toptions={valueOptions}\n\t\t\t\tvalue={elementValue1}\n\t\t\t\tonChange={onValue1Change}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</FileFormatRuleEditorRoot>\n\t);\n};\n\nexport const FileFormatRuleEditorPrimitive = FileFormatRuleEditorInner;\n\nexport const FileFormatRuleEditor = FileFormatRuleEditorPrimitive;\n\nexport default FileFormatRuleEditor;\n\nexport type FileFormatRuleEditorGenericProps = WithClasses<\n\tFileFormatRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nexport const FileFormatRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: FileFormatRuleEditorGenericProps) => {\n\treturn (\n\t\t<FileFormatRuleEditor {...props} elementValue1={elementValue1.toString()} />\n\t);\n};\n\nexport const FileFormatRuleEditorGeneric = FileFormatRuleEditorGenericPrimitive;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const FILE_FORMAT_FAMILYRULE_EDITOR_CLASS_NAME =\n\t'FileFormatFamilyRuleEditor';\nexport const FILE_FORMAT_FAMILYRULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type FileFormatFamilyRuleEditorClassSlot =\n\ttypeof FILE_FORMAT_FAMILYRULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface FileFormatFamilyRuleEditorClasses {\n\troot: string;\n}\n\nexport type FileFormatFamilyRuleEditorClassKey =\n\tkeyof FileFormatFamilyRuleEditorClasses;\n\nexport const getFileFormatFamilyRuleEditorUtilityClass = (\n\tslot: FileFormatFamilyRuleEditorClassSlot,\n) => generateUtilityClass(FILE_FORMAT_FAMILYRULE_EDITOR_CLASS_NAME, slot);\n\nexport const fileFormatFamilyRuleEditorClasses: FileFormatFamilyRuleEditorClasses =\n\tgenerateUtilityClasses(FILE_FORMAT_FAMILYRULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default fileFormatFamilyRuleEditorClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\nimport {SelectField} from '@netx/core-components/Form/SelectField';\nimport {fileFormatFamilies} from '@netx/core-search/properties/search';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {\n\tfileFormatFamilyRuleEditorClasses,\n\tgetFileFormatFamilyRuleEditorUtilityClass,\n\tFileFormatFamilyRuleEditorClasses,\n\tFILE_FORMAT_FAMILYRULE_EDITOR_CLASS_NAME,\n} from './fileFormatFamilyRuleEditorClasses';\n\nexport type FileFormatFamilyRuleEditorOwnerState = WithClasses<\n\tFileFormatFamilyRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (\n\townerState: FileFormatFamilyRuleEditorOwnerState,\n) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetFileFormatFamilyRuleEditorUtilityClass,\n\t\tclasses,\n\t);\n};\n\nconst FileFormatFamilyRuleEditorRoot = styled('div', {\n\tname: FILE_FORMAT_FAMILYRULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n}));\n\nexport type FileFormatFamilyRuleEditorProps = WithClasses<\n\tFileFormatFamilyRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementValue1: string;\n\t\tonValue1Change: (value1: string) => void;\n\t}\n>;\n\nconst FileFormatFamilyRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementValue1,\n\tvalidationErrors,\n\tonValue1Change,\n}: FileFormatFamilyRuleEditorProps) => {\n\tconst ownerState: FileFormatFamilyRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst valueOptions = useMemo(() => Object.values(fileFormatFamilies), []);\n\n\treturn (\n\t\t<FileFormatFamilyRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<string, false, true, false>\n\t\t\t\tdata-testid=\"file-format-family-rule-value-1\"\n\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\tlabel={i18n.t('i18n.fileFormatFamily')}\n\t\t\t\tname=\"rule-value-1\"\n\t\t\t\toptions={valueOptions}\n\t\t\t\tvalue={elementValue1}\n\t\t\t\tonChange={onValue1Change}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</FileFormatFamilyRuleEditorRoot>\n\t);\n};\n\nexport const FileFormatFamilyRuleEditorPrimitive =\n\tFileFormatFamilyRuleEditorInner;\n\nexport const FileFormatFamilyRuleEditor = FileFormatFamilyRuleEditorPrimitive;\n\nexport default FileFormatFamilyRuleEditor;\n\nexport type FileFormatFamilyRuleEditorGenericProps = WithClasses<\n\tFileFormatFamilyRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nexport const FileFormatFamilyRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: FileFormatFamilyRuleEditorGenericProps) => {\n\treturn (\n\t\t<FileFormatFamilyRuleEditor\n\t\t\t{...props}\n\t\t\telementValue1={elementValue1.toString()}\n\t\t/>\n\t);\n};\n\nexport const FileFormatFamilyRuleEditorGeneric =\n\tFileFormatFamilyRuleEditorGenericPrimitive;\n","import {i18n} from '@netx/core/i18n';\nimport {FileSizeType, FileSizeMetric} from './constants';\n\nexport const FileSizeTypeLabel: Record<FileSizeType, string> = {\n\t[FileSizeType.APPROXIMATELY]: i18n.t('i18n.approximately'),\n\t[FileSizeType.EQUAL_TO]: i18n.t('i18n.equalTo'),\n\t[FileSizeType.GREATER_THAN]: i18n.t('i18n.greaterThan'),\n\t[FileSizeType.LESS_THAN]: i18n.t('i18n.lessThan'),\n};\n\nexport const FileSizeSubTypeLabel: Record<FileSizeMetric, string> = {\n\t[FileSizeMetric.BYTES]: i18n.t('i18n.unitBytes'),\n\t[FileSizeMetric.GBYTES]: i18n.t('i18n.unitGbytes'),\n\t[FileSizeMetric.KBYTES]: i18n.t('i18n.unitKbytes'),\n\t[FileSizeMetric.MBYTES]: i18n.t('i18n.unitMbytes'),\n};\n","import {FileSizeType} from '../constants';\nimport {FileSizeTypeLabel} from '../locales';\n\nexport const getFileSizeTypeLabel = (type: FileSizeType) =>\n\tFileSizeTypeLabel[type];\n\nexport default getFileSizeTypeLabel;\n","import {FileSizeMetric} from '../constants';\nimport {FileSizeSubTypeLabel} from '../locales';\n\nexport const getFileSizeSubTypeLabel = (subType: FileSizeMetric) =>\n\tFileSizeSubTypeLabel[subType];\n\nexport default getFileSizeSubTypeLabel;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const FILE_SIZE_RULE_EDITOR_CLASS_NAME = 'FileSizeRuleEditor';\nexport const FILE_SIZE_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type FileSizeRuleEditorClassSlot =\n\ttypeof FILE_SIZE_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface FileSizeRuleEditorClasses {\n\troot: string;\n}\n\nexport type FileSizeRuleEditorClassKey = keyof FileSizeRuleEditorClasses;\n\nexport const getFileSizeRuleEditorUtilityClass = (\n\tslot: FileSizeRuleEditorClassSlot,\n) => generateUtilityClass(FILE_SIZE_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const fileSizeRuleEditorClasses: FileSizeRuleEditorClasses =\n\tgenerateUtilityClasses(FILE_SIZE_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default fileSizeRuleEditorClasses;\n","import React from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\nimport {InputAdornment} from '@mui/material';\nimport {SelectField, NumberField} from '@netx/core-components/Form';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {FileSizeType, FileSizeMetric} from '../../constants';\nimport {getFileSizeSubTypeLabel, getFileSizeTypeLabel} from '../../utils';\nimport {\n\tfileSizeRuleEditorClasses,\n\tgetFileSizeRuleEditorUtilityClass,\n\tFileSizeRuleEditorClasses,\n\tFILE_SIZE_RULE_EDITOR_CLASS_NAME,\n} from './fileSizeRuleEditorClasses';\n\nexport type FileSizeRuleEditorOwnerState = WithClasses<\n\tFileSizeRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: FileSizeRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getFileSizeRuleEditorUtilityClass, classes);\n};\n\nconst FileSizeRuleEditorRoot = styled('div', {\n\tname: FILE_SIZE_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\tflexDirection: 'column',\n}));\n\nconst FileSizeEditorCriteria = styled('div', {\n\tname: FILE_SIZE_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Criteria',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nconst FileSizeEditorValues = styled('div', {\n\tname: FILE_SIZE_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Values',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tmarginTop: theme.spacing(2),\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nexport type FileSizeRuleEditorProps = WithClasses<\n\tFileSizeRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: FileSizeType;\n\t\telementSubType1Options: FileSizeType[];\n\t\telementSubType2: FileSizeMetric;\n\t\telementSubType2Options: FileSizeMetric[];\n\t\telementValue1: number;\n\t\tonSubType1Change: (subType1: FileSizeType) => void;\n\t\tonSubType2Change: (subType2: FileSizeMetric) => void;\n\t\tonValue1Change: (value: number) => void;\n\t}\n>;\n\nconst FileSizeRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementSubType2,\n\telementSubType2Options,\n\telementValue1,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonSubType2Change,\n\tonValue1Change,\n}: FileSizeRuleEditorProps) => {\n\tconst ownerState: FileSizeRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\treturn (\n\t\t<FileSizeRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<FileSizeEditorCriteria>\n\t\t\t\t<SelectField<FileSizeType, false, true, false>\n\t\t\t\t\tdata-testid=\"file-size-rule-sub-type-1\"\n\t\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\t\tname={'rule-sub-type1'}\n\t\t\t\t\toptions={elementSubType1Options}\n\t\t\t\t\tvalue={elementSubType1}\n\t\t\t\t\tonChange={onSubType1Change}\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t\tgetOptionLabel: getFileSizeTypeLabel,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t<SelectField<FileSizeMetric, false, true, false>\n\t\t\t\t\tdata-testid=\"file-size-rule-sub-type-2\"\n\t\t\t\t\tname={'rule-sub-type-2'}\n\t\t\t\t\tlabel={i18n.t('i18n.unit')}\n\t\t\t\t\toptions={elementSubType2Options}\n\t\t\t\t\tvalue={elementSubType2}\n\t\t\t\t\tonChange={onSubType2Change}\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t\tgetOptionLabel: getFileSizeSubTypeLabel,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</FileSizeEditorCriteria>\n\n\t\t\t<FileSizeEditorValues>\n\t\t\t\t<NumberField\n\t\t\t\t\tdata-testid=\"file-size-rule-value-1\"\n\t\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\t\tlabel={i18n.t('i18n.size')}\n\t\t\t\t\tname=\"rule-value-1\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t!isNaN(elementValue1) && elementValue1.toString() !== ''\n\t\t\t\t\t\t\t? elementValue1\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\tonChange={(value) => onValue1Change(parseInt(value))}\n\t\t\t\t\tInputProps={{\n\t\t\t\t\t\tendAdornment: (\n\t\t\t\t\t\t\t<InputAdornment position=\"end\" disablePointerEvents>\n\t\t\t\t\t\t\t\t{getFileSizeSubTypeLabel(elementSubType2)}\n\t\t\t\t\t\t\t</InputAdornment>\n\t\t\t\t\t\t),\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</FileSizeEditorValues>\n\t\t</FileSizeRuleEditorRoot>\n\t);\n};\n\nexport const FileSizeRuleEditorPrimitive = FileSizeRuleEditorInner;\n\nexport const FileSizeRuleEditor = FileSizeRuleEditorPrimitive;\n\nexport default FileSizeRuleEditor;\n\nexport type FileSizeRuleEditorGenericProps = WithClasses<\n\tFileSizeRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nexport const FileSizeRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: FileSizeRuleEditorGenericProps) => {\n\treturn (\n\t\t<FileSizeRuleEditor\n\t\t\t{...props}\n\t\t\telementValue1={parseInt(elementValue1.toString())}\n\t\t/>\n\t);\n};\n\nexport const FileSizeRuleEditorGeneric = FileSizeRuleEditorGenericPrimitive;\n","import {i18n} from '@netx/core/i18n';\n\nexport const SEARCH_SAVED_ACTION_LABELS = {\n\tCREATE: i18n.t('i18n.saveSearch'),\n\tCREATE_PDF: i18n.t('i18n.createPDF'),\n\tDELETE: i18n.t('i18n.deleteSearch'),\n\tDOWNLOAD: i18n.t('i18n.download'),\n\tMENU: i18n.t('i18n.share'),\n};\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const SAVED_SEARCH_RULE_EDITOR_CLASS_NAME = 'SavedSearchRuleEditor';\nexport const SAVED_SEARCH_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type SavedSearchRuleEditorClassSlot =\n\ttypeof SAVED_SEARCH_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface SavedSearchRuleEditorClasses {\n\troot: string;\n}\n\nexport type SavedSearchRuleEditorClassKey = keyof SavedSearchRuleEditorClasses;\n\nexport const getSavedSearchRuleEditorUtilityClass = (\n\tslot: SavedSearchRuleEditorClassSlot,\n) => generateUtilityClass(SAVED_SEARCH_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const savedSearchRuleEditorClasses: SavedSearchRuleEditorClasses =\n\tgenerateUtilityClasses(SAVED_SEARCH_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default savedSearchRuleEditorClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\nimport {SelectField} from '@netx/core-components/Form/SelectField';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {useSavedSearches} from '@netx/core-search-saved';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {\n\tsavedSearchRuleEditorClasses,\n\tgetSavedSearchRuleEditorUtilityClass,\n\tSavedSearchRuleEditorClasses,\n\tSAVED_SEARCH_RULE_EDITOR_CLASS_NAME,\n} from './savedSearchRuleEditorClasses';\n\nexport type SavedSearchRuleEditorOwnerState = WithClasses<\n\tSavedSearchRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: SavedSearchRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getSavedSearchRuleEditorUtilityClass, classes);\n};\n\nconst SavedSearchRuleEditorRoot = styled('div', {\n\tname: SAVED_SEARCH_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n}));\n\ntype OptionParams = {\n\tlabels: {\n\t\t[k: number]: string;\n\t};\n\tids: number[];\n};\n\nexport type SavedSearchRuleEditorProps = WithClasses<\n\tSavedSearchRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nconst SavedSearchRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementValue1,\n\tonValue1Change,\n}: SavedSearchRuleEditorProps) => {\n\tconst ownerState: SavedSearchRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst {savedSearches} = useSavedSearches();\n\n\tconst options = useMemo(() => {\n\t\treturn savedSearches.reduce<OptionParams>(\n\t\t\t(accum, savedCart, index) => {\n\t\t\t\treturn {\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\t...accum.labels,\n\t\t\t\t\t\t[savedCart.id]: savedCart.title,\n\t\t\t\t\t},\n\t\t\t\t\tids: [...accum.ids, savedCart.id],\n\t\t\t\t};\n\t\t\t},\n\t\t\t{labels: {}, ids: []},\n\t\t);\n\t}, [savedSearches]);\n\n\treturn (\n\t\t<SavedSearchRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<number, false, true, false>\n\t\t\t\tdata-testid=\"saved-search-rule-value-1\"\n\t\t\t\tlabel=\"Saved search\"\n\t\t\t\tname={'rule-value-1'}\n\t\t\t\toptions={options.ids}\n\t\t\t\tvalue={(elementValue1 as number) || undefined}\n\t\t\t\tonChange={onValue1Change}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\tgetOptionLabel: (option) => options.labels[option],\n\t\t\t\t}}\n\t\t\t/>\n\t\t</SavedSearchRuleEditorRoot>\n\t);\n};\n\nexport const SavedSearchRuleEditorPrimitive = SavedSearchRuleEditorInner;\n\nexport const SavedSearchRuleEditor = SavedSearchRuleEditorPrimitive;\n\nexport default SavedSearchRuleEditor;\n","import {i18n} from '@netx/core/i18n';\nimport {UserType} from './constants';\n\nexport const UserTypeLabel: Record<UserType, string> = {\n\t[UserType.IMPORTED_BY]: i18n.t('i18n.importedBy'),\n\t[UserType.MODIFIED_BY]: i18n.t('i18n.modifiedBy'),\n};\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const USER_RULE_EDITOR_CLASS_NAME = 'UserRuleEditor';\nexport const USER_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type UserRuleEditorClassSlot =\n\ttypeof USER_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface UserRuleEditorClasses {\n\troot: string;\n}\n\nexport type UserRuleEditorClassKey = keyof UserRuleEditorClasses;\n\nexport const getUserRuleEditorUtilityClass = (slot: UserRuleEditorClassSlot) =>\n\tgenerateUtilityClass(USER_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const userRuleEditorClasses: UserRuleEditorClasses =\n\tgenerateUtilityClasses(USER_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default userRuleEditorClasses;\n","import React, {useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {SelectField} from '@netx/core-components/Form/SelectField';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {UserAutoList} from '@netx/core-user/components/UserAutoList';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport {SearchValueUnavailableLabel} from '../../../locales';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {UserType} from '../../constants';\nimport {UserTypeLabel} from '../../locales';\nimport {\n\tuserRuleEditorClasses,\n\tgetUserRuleEditorUtilityClass,\n\tUserRuleEditorClasses,\n\tUSER_RULE_EDITOR_CLASS_NAME,\n} from './userRuleEditorClasses';\n\nexport type UserRuleEditorOwnerState = WithClasses<UserRuleEditorClasses, {}>;\n\nconst useUtilityClasses = (ownerState: UserRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getUserRuleEditorUtilityClass, classes);\n};\n\nconst UserRuleEditorRoot = styled('div', {\n\tname: USER_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\t'& > * + *': {\n\t\tmarginLeft: theme.spacing(1),\n\t},\n}));\n\nconst getSubType1OptionLabel = (option: UserType) => UserTypeLabel[option];\n\nexport type UserRuleEditorProps = WithClasses<\n\tUserRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: UserType;\n\t\telementSubType1Options: UserType[];\n\t\telementValue1: number;\n\t\telementValue1Unavailable: boolean;\n\t\telementValue1Label: string;\n\t\telementValue1Loading: boolean;\n\t\tonSubType1Change: (subType1: UserType) => void;\n\t\tonValue1Change: (value: number) => void;\n\t}\n>;\n\nconst UserRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementValue1,\n\telementValue1Unavailable,\n\telementValue1Label,\n\telementValue1Loading,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonValue1Change,\n}: UserRuleEditorProps) => {\n\tconst ownerState: UserRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst [userName, setUserName] = useState('');\n\n\tuseEffect(() => {\n\t\tsetUserName(elementValue1Label);\n\t}, [elementValue1Label]);\n\n\tconst waitingForUserLabel = elementValue1Loading && userName === '';\n\n\treturn (\n\t\t<UserRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<UserType, false, true, false>\n\t\t\t\tdata-testid=\"user-rule-sub-type-1\"\n\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\toptions={elementSubType1Options}\n\t\t\t\tvalue={elementSubType1}\n\t\t\t\tonChange={onSubType1Change}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\tgetOptionLabel: getSubType1OptionLabel,\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<UserAutoList<false, true>\n\t\t\t\tdata-testid=\"user-rule-value-1\"\n\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\tloadingValue={elementValue1Loading}\n\t\t\t\tname={'rule-value-1'}\n\t\t\t\tplaceholder={\n\t\t\t\t\twaitingForUserLabel\n\t\t\t\t\t\t? 'loading...'\n\t\t\t\t\t\t: elementValue1Unavailable\n\t\t\t\t\t\t? SearchValueUnavailableLabel\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t\tvalue={\n\t\t\t\t\telementValue1Unavailable || waitingForUserLabel\n\t\t\t\t\t\t? (null as any)\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tlabel: userName,\n\t\t\t\t\t\t\t\tvalue: elementValue1,\n\t\t\t\t\t\t }\n\t\t\t\t}\n\t\t\t\tonChange={(user) => {\n\t\t\t\t\tsetUserName(user.label);\n\t\t\t\t\tonValue1Change(user.value);\n\t\t\t\t}}\n\t\t\t\tInputLabelProps={{\n\t\t\t\t\tshrink: elementValue1Unavailable || undefined,\n\t\t\t\t}}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</UserRuleEditorRoot>\n\t);\n};\n\nexport const UserRuleEditorPrimitive = UserRuleEditorInner;\n\nexport const UserRuleEditor = UserRuleEditorPrimitive;\n\nexport default UserRuleEditor;\n\nexport type UserRuleEditorGenericProps = WithClasses<\n\tUserRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nexport const UserRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: UserRuleEditorGenericProps) => {\n\treturn (\n\t\t<UserRuleEditor\n\t\t\t{...props}\n\t\t\telementValue1={parseInt(elementValue1.toString()) || 0}\n\t\t/>\n\t);\n};\n\nexport const UserRuleEditorGeneric = UserRuleEditorGenericPrimitive;\n","import l from \"react\";\nimport yt from \"@mui/material/InputAdornment\";\nimport xt from \"@mui/material/Button\";\nimport { styled as B } from \"@mui/material/styles\";\nimport { jsx as c, jsxs as ft, Fragment as St } from \"react/jsx-runtime\";\nimport wt from \"@mui/material/Popover\";\nimport K from \"@mui/material/Box\";\nimport ht from \"@mui/material/Slider\";\nimport Mt from \"@mui/material/TextField\";\nconst Ct = \"linear-gradient(45deg, #ccc 25%, transparent 25%), linear-gradient(135deg, #ccc 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #ccc 75%), linear-gradient(135deg, transparent 75%, #ccc 75%)\", At = \"linear-gradient(to top, #000000, transparent), linear-gradient(to right, #ffffff, transparent)\", kt = {\n Button: B(xt)(() => ({\n backgroundSize: \"8px 8px\",\n backgroundPosition: \"0 0, 4px 0, 4px -4px, 0px 4px\",\n transition: \"none\",\n boxShadow: \"0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08)\",\n border: 0,\n borderRadius: 4,\n width: \"24px\",\n aspectRatio: \"1 / 1\",\n height: \"24px\",\n minWidth: 0\n }))\n}, Rt = (e) => {\n const {\n bgColor: t,\n className: r,\n disablePopover: n,\n isBgColorValid: o,\n ...a\n } = e;\n return /* @__PURE__ */ c(kt.Button, {\n disableTouchRipple: !0,\n style: {\n backgroundColor: o ? t : void 0,\n backgroundImage: o ? void 0 : Ct,\n cursor: n ? \"default\" : void 0\n },\n className: `MuiColorInput-Button ${r || \"\"}`,\n ...a\n });\n}, Ht = {\n Container: B(\"div\")(() => ({\n width: 300,\n padding: 8\n }))\n}, It = (e) => {\n const {\n children: t,\n className: r,\n ...n\n } = e;\n return /* @__PURE__ */ c(wt, {\n className: `MuiColorInput-Popover ${r || \"\"}`,\n anchorOrigin: {\n vertical: \"bottom\",\n horizontal: \"left\"\n },\n ...n,\n children: /* @__PURE__ */ c(Ht.Container, {\n children: t\n })\n });\n}, Pt = {\n Slider: B(ht, {\n shouldForwardProp: (e) => e !== \"$rgbaFrom\" && e !== \"$rgbaTo\"\n })(() => ({\n height: 8,\n \"& .MuiSlider-rail\": {\n opacity: 1,\n background: \"linear-gradient(to right, rgba(var(--rgb-r), var(--rgb-g), var(--rgb-b), 0) 0%, rgba(var(--rgb-r), var(--rgb-g), var(--rgb-b), 1) 100%)\"\n },\n \"& .MuiSlider-track\": {\n color: \"transparent\",\n border: 0\n },\n \"& .MuiSlider-thumb\": {\n backgroundColor: \"#ffffff\",\n border: \"3px solid currentColor\"\n }\n }))\n}, Tt = (e) => {\n const {\n rgbColor: t,\n style: r,\n className: n,\n ...o\n } = e, a = {\n \"--rgb-r\": t.r,\n \"--rgb-g\": t.g,\n \"--rgb-b\": t.b,\n ...r\n };\n return /* @__PURE__ */ c(Pt.Slider, {\n className: `MuiColorInput-AlphaSlider ${n || \"\"}`,\n style: a,\n ...o\n });\n}, L = {\n up: \"ArrowUp\",\n down: \"ArrowDown\",\n left: \"ArrowLeft\",\n right: \"ArrowRight\"\n}, Ft = {\n ArrowUp: {\n type: \"hsvV\",\n value: 1\n },\n ArrowDown: {\n type: \"hsvV\",\n value: -1\n },\n ArrowLeft: {\n type: \"hsvS\",\n value: -1\n },\n ArrowRight: {\n type: \"hsvS\",\n value: 1\n }\n};\nfunction Bt(e) {\n return e === L.up || e === L.down || e === L.left || e === L.right;\n}\nfunction _(e, t, r) {\n return Math.max(t, Math.min(e, r));\n}\nfunction tt(e) {\n return typeof e == \"number\";\n}\nfunction et(e, t, r) {\n const n = e.toLocaleString(\"en\", {\n useGrouping: !1,\n minimumFractionDigits: t,\n maximumFractionDigits: r\n });\n return Number(n);\n}\nfunction Et(e, t, r) {\n const n = e.getBoundingClientRect(), o = t - n.left, a = r - n.top;\n return {\n x: _(o / n.width, 0, 1),\n y: _(1 - a / n.height, 0, 1)\n };\n}\nfunction Nt(e) {\n const t = l.useRef();\n return t.current = e, l.useCallback((...r) => t.current?.(...r), []);\n}\nconst rt = {\n Space: B(\"div\")(() => ({\n width: \"100%\",\n height: \"180px\",\n boxSizing: \"border-box\",\n outline: 0,\n position: \"relative\",\n backgroundImage: At\n })),\n Thumb: B(\"div\")(() => ({\n position: \"absolute\",\n border: \"3px solid #ffffff\",\n borderRadius: \"50%\",\n width: \"20px\",\n height: \"20px\",\n marginLeft: \"-10px\",\n marginBottom: \"-10px\",\n outline: 0,\n boxSizing: \"border-box\",\n willChange: \"left, bottom\",\n transition: \"box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms\",\n \"&:hover\": {\n boxShadow: \"0px 0px 0px 4px rgba(255 255 255 / 0.16)\"\n },\n \"&.MuiColorInput-Thumb-active\": {\n boxShadow: \"0px 0px 0px 8px rgba(255 255 255 / 0.16)\"\n },\n \"@media (hover: none)\": {\n boxShadow: \"none\"\n }\n }))\n}, Vt = (e) => {\n const {\n hsv: t,\n onChange: r,\n currentHue: n\n } = e, o = l.useRef(!1), a = l.useRef(null), [i, s] = l.useState(!1), u = Nt((h, S) => {\n if (!a.current)\n return;\n const {\n x: I,\n y: A\n } = Et(a.current, h, S);\n r({\n s: I,\n v: A\n }), a.current && document.activeElement !== a.current && a.current.focus();\n }), x = l.useCallback(() => {\n o.current && (o.current = !1, s(!1));\n }, []), v = l.useCallback((h) => {\n o.current && u(h.clientX, h.clientY);\n }, []);\n l.useEffect(() => (document.addEventListener(\"mousemove\", v, !1), document.addEventListener(\"mouseup\", x, !1), () => {\n document.removeEventListener(\"mousemove\", v, !1), document.removeEventListener(\"mouseup\", x, !1);\n }), [x, v]);\n const g = (h) => {\n h.preventDefault(), o.current = !0, u(h.clientX, h.clientY), s(!0);\n }, m = (h) => {\n if (Bt(h.key)) {\n h.preventDefault();\n const {\n type: S,\n value: I\n } = Ft[h.key], A = h.shiftKey ? 10 : 1, V = S === \"hsvS\" ? t.s : t.v, E = _(V + I * A * 0.01, 0, 1);\n s(!0), r({\n s: S === \"hsvS\" ? E : t.s,\n v: S === \"hsvV\" ? E : t.v\n });\n }\n }, C = t.s * 100, H = t.v * 100;\n return /* @__PURE__ */ c(rt.Space, {\n onMouseDown: g,\n ref: a,\n className: \"MuiColorInput-ColorSpace\",\n style: {\n backgroundColor: `hsl(${n} 100% 50%)`\n },\n role: \"slider\",\n \"aria-valuetext\": `Saturation ${et(C, 0, 0)}%, Brightness ${et(H, 0, 0)}%`,\n onKeyDown: m,\n tabIndex: 0,\n children: /* @__PURE__ */ c(rt.Thumb, {\n \"aria-label\": \"Color space thumb\",\n className: i ? \"MuiColorInput-Thumb-active\" : \"\",\n style: {\n left: `${C}%`,\n bottom: `${H}%`\n }\n })\n });\n}, $t = {\n Slider: B(ht)(() => ({\n height: 8,\n \"& .MuiSlider-rail\": {\n opacity: 1,\n background: \"linear-gradient(to right, rgb(255, 0, 0) 0%, rgb(255, 255, 0) 17%, rgb(0, 255, 0) 33%, rgb(0, 255, 255) 50%, rgb(0, 0, 255) 67%, rgb(255, 0, 255) 83%, rgb(255, 0, 0) 100%)\"\n },\n \"& .MuiSlider-track\": {\n color: \"transparent\",\n border: 0\n },\n \"& .MuiSlider-thumb\": {\n backgroundColor: \"#ffffff\",\n border: \"3px solid currentColor\"\n }\n }))\n}, Lt = (e) => {\n const {\n className: t,\n ...r\n } = e;\n return /* @__PURE__ */ c($t.Slider, {\n className: `MuiColorInput-HueSlider ${t || \"\"}`,\n ...r\n });\n};\nfunction d(e, t) {\n Ot(e) && (e = \"100%\");\n var r = Dt(e);\n return e = t === 360 ? e : Math.min(t, Math.max(0, parseFloat(e))), r && (e = parseInt(String(e * t), 10) / 100), Math.abs(e - t) < 1e-6 ? 1 : (t === 360 ? e = (e < 0 ? e % t + t : e % t) / parseFloat(String(t)) : e = e % t / parseFloat(String(t)), e);\n}\nfunction O(e) {\n return Math.min(1, Math.max(0, e));\n}\nfunction Ot(e) {\n return typeof e == \"string\" && e.indexOf(\".\") !== -1 && parseFloat(e) === 1;\n}\nfunction Dt(e) {\n return typeof e == \"string\" && e.indexOf(\"%\") !== -1;\n}\nfunction ct(e) {\n return e = parseFloat(e), (isNaN(e) || e < 0 || e > 1) && (e = 1), e;\n}\nfunction D(e) {\n return e <= 1 ? \"\".concat(Number(e) * 100, \"%\") : e;\n}\nfunction R(e) {\n return e.length === 1 ? \"0\" + e : String(e);\n}\nfunction _t(e, t, r) {\n return {\n r: d(e, 255) * 255,\n g: d(t, 255) * 255,\n b: d(r, 255) * 255\n };\n}\nfunction nt(e, t, r) {\n e = d(e, 255), t = d(t, 255), r = d(r, 255);\n var n = Math.max(e, t, r), o = Math.min(e, t, r), a = 0, i = 0, s = (n + o) / 2;\n if (n === o)\n i = 0, a = 0;\n else {\n var u = n - o;\n switch (i = s > 0.5 ? u / (2 - n - o) : u / (n + o), n) {\n case e:\n a = (t - r) / u + (t < r ? 6 : 0);\n break;\n case t:\n a = (r - e) / u + 2;\n break;\n case r:\n a = (e - t) / u + 4;\n break;\n }\n a /= 6;\n }\n return { h: a, s: i, l: s };\n}\nfunction U(e, t, r) {\n return r < 0 && (r += 1), r > 1 && (r -= 1), r < 1 / 6 ? e + (t - e) * (6 * r) : r < 1 / 2 ? t : r < 2 / 3 ? e + (t - e) * (2 / 3 - r) * 6 : e;\n}\nfunction jt(e, t, r) {\n var n, o, a;\n if (e = d(e, 360), t = d(t, 100), r = d(r, 100), t === 0)\n o = r, a = r, n = r;\n else {\n var i = r < 0.5 ? r * (1 + t) : r + t - r * t, s = 2 * r - i;\n n = U(s, i, e + 1 / 3), o = U(s, i, e), a = U(s, i, e - 1 / 3);\n }\n return { r: n * 255, g: o * 255, b: a * 255 };\n}\nfunction at(e, t, r) {\n e = d(e, 255), t = d(t, 255), r = d(r, 255);\n var n = Math.max(e, t, r), o = Math.min(e, t, r), a = 0, i = n, s = n - o, u = n === 0 ? 0 : s / n;\n if (n === o)\n a = 0;\n else {\n switch (n) {\n case e:\n a = (t - r) / s + (t < r ? 6 : 0);\n break;\n case t:\n a = (r - e) / s + 2;\n break;\n case r:\n a = (e - t) / s + 4;\n break;\n }\n a /= 6;\n }\n return { h: a, s: u, v: i };\n}\nfunction Gt(e, t, r) {\n e = d(e, 360) * 6, t = d(t, 100), r = d(r, 100);\n var n = Math.floor(e), o = e - n, a = r * (1 - t), i = r * (1 - o * t), s = r * (1 - (1 - o) * t), u = n % 6, x = [r, i, a, a, s, r][u], v = [s, r, r, i, a, a][u], g = [a, a, s, r, r, i][u];\n return { r: x * 255, g: v * 255, b: g * 255 };\n}\nfunction ot(e, t, r, n) {\n var o = [\n R(Math.round(e).toString(16)),\n R(Math.round(t).toString(16)),\n R(Math.round(r).toString(16))\n ];\n return n && o[0].startsWith(o[0].charAt(1)) && o[1].startsWith(o[1].charAt(1)) && o[2].startsWith(o[2].charAt(1)) ? o[0].charAt(0) + o[1].charAt(0) + o[2].charAt(0) : o.join(\"\");\n}\nfunction Wt(e, t, r, n, o) {\n var a = [\n R(Math.round(e).toString(16)),\n R(Math.round(t).toString(16)),\n R(Math.round(r).toString(16)),\n R(Kt(n))\n ];\n return o && a[0].startsWith(a[0].charAt(1)) && a[1].startsWith(a[1].charAt(1)) && a[2].startsWith(a[2].charAt(1)) && a[3].startsWith(a[3].charAt(1)) ? a[0].charAt(0) + a[1].charAt(0) + a[2].charAt(0) + a[3].charAt(0) : a.join(\"\");\n}\nfunction Kt(e) {\n return Math.round(parseFloat(e) * 255).toString(16);\n}\nfunction it(e) {\n return b(e) / 255;\n}\nfunction b(e) {\n return parseInt(e, 16);\n}\nfunction Ut(e) {\n return {\n r: e >> 16,\n g: (e & 65280) >> 8,\n b: e & 255\n };\n}\nvar Y = {\n aliceblue: \"#f0f8ff\",\n antiquewhite: \"#faebd7\",\n aqua: \"#00ffff\",\n aquamarine: \"#7fffd4\",\n azure: \"#f0ffff\",\n beige: \"#f5f5dc\",\n bisque: \"#ffe4c4\",\n black: \"#000000\",\n blanchedalmond: \"#ffebcd\",\n blue: \"#0000ff\",\n blueviolet: \"#8a2be2\",\n brown: \"#a52a2a\",\n burlywood: \"#deb887\",\n cadetblue: \"#5f9ea0\",\n chartreuse: \"#7fff00\",\n chocolate: \"#d2691e\",\n coral: \"#ff7f50\",\n cornflowerblue: \"#6495ed\",\n cornsilk: \"#fff8dc\",\n crimson: \"#dc143c\",\n cyan: \"#00ffff\",\n darkblue: \"#00008b\",\n darkcyan: \"#008b8b\",\n darkgoldenrod: \"#b8860b\",\n darkgray: \"#a9a9a9\",\n darkgreen: \"#006400\",\n darkgrey: \"#a9a9a9\",\n darkkhaki: \"#bdb76b\",\n darkmagenta: \"#8b008b\",\n darkolivegreen: \"#556b2f\",\n darkorange: \"#ff8c00\",\n darkorchid: \"#9932cc\",\n darkred: \"#8b0000\",\n darksalmon: \"#e9967a\",\n darkseagreen: \"#8fbc8f\",\n darkslateblue: \"#483d8b\",\n darkslategray: \"#2f4f4f\",\n darkslategrey: \"#2f4f4f\",\n darkturquoise: \"#00ced1\",\n darkviolet: \"#9400d3\",\n deeppink: \"#ff1493\",\n deepskyblue: \"#00bfff\",\n dimgray: \"#696969\",\n dimgrey: \"#696969\",\n dodgerblue: \"#1e90ff\",\n firebrick: \"#b22222\",\n floralwhite: \"#fffaf0\",\n forestgreen: \"#228b22\",\n fuchsia: \"#ff00ff\",\n gainsboro: \"#dcdcdc\",\n ghostwhite: \"#f8f8ff\",\n goldenrod: \"#daa520\",\n gold: \"#ffd700\",\n gray: \"#808080\",\n green: \"#008000\",\n greenyellow: \"#adff2f\",\n grey: \"#808080\",\n honeydew: \"#f0fff0\",\n hotpink: \"#ff69b4\",\n indianred: \"#cd5c5c\",\n indigo: \"#4b0082\",\n ivory: \"#fffff0\",\n khaki: \"#f0e68c\",\n lavenderblush: \"#fff0f5\",\n lavender: \"#e6e6fa\",\n lawngreen: \"#7cfc00\",\n lemonchiffon: \"#fffacd\",\n lightblue: \"#add8e6\",\n lightcoral: \"#f08080\",\n lightcyan: \"#e0ffff\",\n lightgoldenrodyellow: \"#fafad2\",\n lightgray: \"#d3d3d3\",\n lightgreen: \"#90ee90\",\n lightgrey: \"#d3d3d3\",\n lightpink: \"#ffb6c1\",\n lightsalmon: \"#ffa07a\",\n lightseagreen: \"#20b2aa\",\n lightskyblue: \"#87cefa\",\n lightslategray: \"#778899\",\n lightslategrey: \"#778899\",\n lightsteelblue: \"#b0c4de\",\n lightyellow: \"#ffffe0\",\n lime: \"#00ff00\",\n limegreen: \"#32cd32\",\n linen: \"#faf0e6\",\n magenta: \"#ff00ff\",\n maroon: \"#800000\",\n mediumaquamarine: \"#66cdaa\",\n mediumblue: \"#0000cd\",\n mediumorchid: \"#ba55d3\",\n mediumpurple: \"#9370db\",\n mediumseagreen: \"#3cb371\",\n mediumslateblue: \"#7b68ee\",\n mediumspringgreen: \"#00fa9a\",\n mediumturquoise: \"#48d1cc\",\n mediumvioletred: \"#c71585\",\n midnightblue: \"#191970\",\n mintcream: \"#f5fffa\",\n mistyrose: \"#ffe4e1\",\n moccasin: \"#ffe4b5\",\n navajowhite: \"#ffdead\",\n navy: \"#000080\",\n oldlace: \"#fdf5e6\",\n olive: \"#808000\",\n olivedrab: \"#6b8e23\",\n orange: \"#ffa500\",\n orangered: \"#ff4500\",\n orchid: \"#da70d6\",\n palegoldenrod: \"#eee8aa\",\n palegreen: \"#98fb98\",\n paleturquoise: \"#afeeee\",\n palevioletred: \"#db7093\",\n papayawhip: \"#ffefd5\",\n peachpuff: \"#ffdab9\",\n peru: \"#cd853f\",\n pink: \"#ffc0cb\",\n plum: \"#dda0dd\",\n powderblue: \"#b0e0e6\",\n purple: \"#800080\",\n rebeccapurple: \"#663399\",\n red: \"#ff0000\",\n rosybrown: \"#bc8f8f\",\n royalblue: \"#4169e1\",\n saddlebrown: \"#8b4513\",\n salmon: \"#fa8072\",\n sandybrown: \"#f4a460\",\n seagreen: \"#2e8b57\",\n seashell: \"#fff5ee\",\n sienna: \"#a0522d\",\n silver: \"#c0c0c0\",\n skyblue: \"#87ceeb\",\n slateblue: \"#6a5acd\",\n slategray: \"#708090\",\n slategrey: \"#708090\",\n snow: \"#fffafa\",\n springgreen: \"#00ff7f\",\n steelblue: \"#4682b4\",\n tan: \"#d2b48c\",\n teal: \"#008080\",\n thistle: \"#d8bfd8\",\n tomato: \"#ff6347\",\n turquoise: \"#40e0d0\",\n violet: \"#ee82ee\",\n wheat: \"#f5deb3\",\n white: \"#ffffff\",\n whitesmoke: \"#f5f5f5\",\n yellow: \"#ffff00\",\n yellowgreen: \"#9acd32\"\n};\nfunction qt(e) {\n var t = { r: 0, g: 0, b: 0 }, r = 1, n = null, o = null, a = null, i = !1, s = !1;\n return typeof e == \"string\" && (e = Xt(e)), typeof e == \"object\" && (w(e.r) && w(e.g) && w(e.b) ? (t = _t(e.r, e.g, e.b), i = !0, s = String(e.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\") : w(e.h) && w(e.s) && w(e.v) ? (n = D(e.s), o = D(e.v), t = Gt(e.h, n, o), i = !0, s = \"hsv\") : w(e.h) && w(e.s) && w(e.l) && (n = D(e.s), a = D(e.l), t = jt(e.h, n, a), i = !0, s = \"hsl\"), Object.prototype.hasOwnProperty.call(e, \"a\") && (r = e.a)), r = ct(r), {\n ok: i,\n format: e.format || s,\n r: Math.min(255, Math.max(t.r, 0)),\n g: Math.min(255, Math.max(t.g, 0)),\n b: Math.min(255, Math.max(t.b, 0)),\n a: r\n };\n}\nvar zt = \"[-\\\\+]?\\\\d+%?\", Yt = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\", k = \"(?:\".concat(Yt, \")|(?:\").concat(zt, \")\"), q = \"[\\\\s|\\\\(]+(\".concat(k, \")[,|\\\\s]+(\").concat(k, \")[,|\\\\s]+(\").concat(k, \")\\\\s*\\\\)?\"), z = \"[\\\\s|\\\\(]+(\".concat(k, \")[,|\\\\s]+(\").concat(k, \")[,|\\\\s]+(\").concat(k, \")[,|\\\\s]+(\").concat(k, \")\\\\s*\\\\)?\"), y = {\n CSS_UNIT: new RegExp(k),\n rgb: new RegExp(\"rgb\" + q),\n rgba: new RegExp(\"rgba\" + z),\n hsl: new RegExp(\"hsl\" + q),\n hsla: new RegExp(\"hsla\" + z),\n hsv: new RegExp(\"hsv\" + q),\n hsva: new RegExp(\"hsva\" + z),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n};\nfunction Xt(e) {\n if (e = e.trim().toLowerCase(), e.length === 0)\n return !1;\n var t = !1;\n if (Y[e])\n e = Y[e], t = !0;\n else if (e === \"transparent\")\n return { r: 0, g: 0, b: 0, a: 0, format: \"name\" };\n var r = y.rgb.exec(e);\n return r ? { r: r[1], g: r[2], b: r[3] } : (r = y.rgba.exec(e), r ? { r: r[1], g: r[2], b: r[3], a: r[4] } : (r = y.hsl.exec(e), r ? { h: r[1], s: r[2], l: r[3] } : (r = y.hsla.exec(e), r ? { h: r[1], s: r[2], l: r[3], a: r[4] } : (r = y.hsv.exec(e), r ? { h: r[1], s: r[2], v: r[3] } : (r = y.hsva.exec(e), r ? { h: r[1], s: r[2], v: r[3], a: r[4] } : (r = y.hex8.exec(e), r ? {\n r: b(r[1]),\n g: b(r[2]),\n b: b(r[3]),\n a: it(r[4]),\n format: t ? \"name\" : \"hex8\"\n } : (r = y.hex6.exec(e), r ? {\n r: b(r[1]),\n g: b(r[2]),\n b: b(r[3]),\n format: t ? \"name\" : \"hex\"\n } : (r = y.hex4.exec(e), r ? {\n r: b(r[1] + r[1]),\n g: b(r[2] + r[2]),\n b: b(r[3] + r[3]),\n a: it(r[4] + r[4]),\n format: t ? \"name\" : \"hex8\"\n } : (r = y.hex3.exec(e), r ? {\n r: b(r[1] + r[1]),\n g: b(r[2] + r[2]),\n b: b(r[3] + r[3]),\n format: t ? \"name\" : \"hex\"\n } : !1)))))))));\n}\nfunction w(e) {\n return Boolean(y.CSS_UNIT.exec(String(e)));\n}\nvar M = function() {\n function e(t, r) {\n t === void 0 && (t = \"\"), r === void 0 && (r = {});\n var n;\n if (t instanceof e)\n return t;\n typeof t == \"number\" && (t = Ut(t)), this.originalInput = t;\n var o = qt(t);\n this.originalInput = t, this.r = o.r, this.g = o.g, this.b = o.b, this.a = o.a, this.roundA = Math.round(100 * this.a) / 100, this.format = (n = r.format) !== null && n !== void 0 ? n : o.format, this.gradientType = r.gradientType, this.r < 1 && (this.r = Math.round(this.r)), this.g < 1 && (this.g = Math.round(this.g)), this.b < 1 && (this.b = Math.round(this.b)), this.isValid = o.ok;\n }\n return e.prototype.isDark = function() {\n return this.getBrightness() < 128;\n }, e.prototype.isLight = function() {\n return !this.isDark();\n }, e.prototype.getBrightness = function() {\n var t = this.toRgb();\n return (t.r * 299 + t.g * 587 + t.b * 114) / 1e3;\n }, e.prototype.getLuminance = function() {\n var t = this.toRgb(), r, n, o, a = t.r / 255, i = t.g / 255, s = t.b / 255;\n return a <= 0.03928 ? r = a / 12.92 : r = Math.pow((a + 0.055) / 1.055, 2.4), i <= 0.03928 ? n = i / 12.92 : n = Math.pow((i + 0.055) / 1.055, 2.4), s <= 0.03928 ? o = s / 12.92 : o = Math.pow((s + 0.055) / 1.055, 2.4), 0.2126 * r + 0.7152 * n + 0.0722 * o;\n }, e.prototype.getAlpha = function() {\n return this.a;\n }, e.prototype.setAlpha = function(t) {\n return this.a = ct(t), this.roundA = Math.round(100 * this.a) / 100, this;\n }, e.prototype.toHsv = function() {\n var t = at(this.r, this.g, this.b);\n return { h: t.h * 360, s: t.s, v: t.v, a: this.a };\n }, e.prototype.toHsvString = function() {\n var t = at(this.r, this.g, this.b), r = Math.round(t.h * 360), n = Math.round(t.s * 100), o = Math.round(t.v * 100);\n return this.a === 1 ? \"hsv(\".concat(r, \", \").concat(n, \"%, \").concat(o, \"%)\") : \"hsva(\".concat(r, \", \").concat(n, \"%, \").concat(o, \"%, \").concat(this.roundA, \")\");\n }, e.prototype.toHsl = function() {\n var t = nt(this.r, this.g, this.b);\n return { h: t.h * 360, s: t.s, l: t.l, a: this.a };\n }, e.prototype.toHslString = function() {\n var t = nt(this.r, this.g, this.b), r = Math.round(t.h * 360), n = Math.round(t.s * 100), o = Math.round(t.l * 100);\n return this.a === 1 ? \"hsl(\".concat(r, \", \").concat(n, \"%, \").concat(o, \"%)\") : \"hsla(\".concat(r, \", \").concat(n, \"%, \").concat(o, \"%, \").concat(this.roundA, \")\");\n }, e.prototype.toHex = function(t) {\n return t === void 0 && (t = !1), ot(this.r, this.g, this.b, t);\n }, e.prototype.toHexString = function(t) {\n return t === void 0 && (t = !1), \"#\" + this.toHex(t);\n }, e.prototype.toHex8 = function(t) {\n return t === void 0 && (t = !1), Wt(this.r, this.g, this.b, this.a, t);\n }, e.prototype.toHex8String = function(t) {\n return t === void 0 && (t = !1), \"#\" + this.toHex8(t);\n }, e.prototype.toRgb = function() {\n return {\n r: Math.round(this.r),\n g: Math.round(this.g),\n b: Math.round(this.b),\n a: this.a\n };\n }, e.prototype.toRgbString = function() {\n var t = Math.round(this.r), r = Math.round(this.g), n = Math.round(this.b);\n return this.a === 1 ? \"rgb(\".concat(t, \", \").concat(r, \", \").concat(n, \")\") : \"rgba(\".concat(t, \", \").concat(r, \", \").concat(n, \", \").concat(this.roundA, \")\");\n }, e.prototype.toPercentageRgb = function() {\n var t = function(r) {\n return \"\".concat(Math.round(d(r, 255) * 100), \"%\");\n };\n return {\n r: t(this.r),\n g: t(this.g),\n b: t(this.b),\n a: this.a\n };\n }, e.prototype.toPercentageRgbString = function() {\n var t = function(r) {\n return Math.round(d(r, 255) * 100);\n };\n return this.a === 1 ? \"rgb(\".concat(t(this.r), \"%, \").concat(t(this.g), \"%, \").concat(t(this.b), \"%)\") : \"rgba(\".concat(t(this.r), \"%, \").concat(t(this.g), \"%, \").concat(t(this.b), \"%, \").concat(this.roundA, \")\");\n }, e.prototype.toName = function() {\n if (this.a === 0)\n return \"transparent\";\n if (this.a < 1)\n return !1;\n for (var t = \"#\" + ot(this.r, this.g, this.b, !1), r = 0, n = Object.entries(Y); r < n.length; r++) {\n var o = n[r], a = o[0], i = o[1];\n if (t === i)\n return a;\n }\n return !1;\n }, e.prototype.toString = function(t) {\n var r = Boolean(t);\n t = t ?? this.format;\n var n = !1, o = this.a < 1 && this.a >= 0, a = !r && o && (t.startsWith(\"hex\") || t === \"name\");\n return a ? t === \"name\" && this.a === 0 ? this.toName() : this.toRgbString() : (t === \"rgb\" && (n = this.toRgbString()), t === \"prgb\" && (n = this.toPercentageRgbString()), (t === \"hex\" || t === \"hex6\") && (n = this.toHexString()), t === \"hex3\" && (n = this.toHexString(!0)), t === \"hex4\" && (n = this.toHex8String(!0)), t === \"hex8\" && (n = this.toHex8String()), t === \"name\" && (n = this.toName()), t === \"hsl\" && (n = this.toHslString()), t === \"hsv\" && (n = this.toHsvString()), n || this.toHexString());\n }, e.prototype.toNumber = function() {\n return (Math.round(this.r) << 16) + (Math.round(this.g) << 8) + Math.round(this.b);\n }, e.prototype.clone = function() {\n return new e(this.toString());\n }, e.prototype.lighten = function(t) {\n t === void 0 && (t = 10);\n var r = this.toHsl();\n return r.l += t / 100, r.l = O(r.l), new e(r);\n }, e.prototype.brighten = function(t) {\n t === void 0 && (t = 10);\n var r = this.toRgb();\n return r.r = Math.max(0, Math.min(255, r.r - Math.round(255 * -(t / 100)))), r.g = Math.max(0, Math.min(255, r.g - Math.round(255 * -(t / 100)))), r.b = Math.max(0, Math.min(255, r.b - Math.round(255 * -(t / 100)))), new e(r);\n }, e.prototype.darken = function(t) {\n t === void 0 && (t = 10);\n var r = this.toHsl();\n return r.l -= t / 100, r.l = O(r.l), new e(r);\n }, e.prototype.tint = function(t) {\n return t === void 0 && (t = 10), this.mix(\"white\", t);\n }, e.prototype.shade = function(t) {\n return t === void 0 && (t = 10), this.mix(\"black\", t);\n }, e.prototype.desaturate = function(t) {\n t === void 0 && (t = 10);\n var r = this.toHsl();\n return r.s -= t / 100, r.s = O(r.s), new e(r);\n }, e.prototype.saturate = function(t) {\n t === void 0 && (t = 10);\n var r = this.toHsl();\n return r.s += t / 100, r.s = O(r.s), new e(r);\n }, e.prototype.greyscale = function() {\n return this.desaturate(100);\n }, e.prototype.spin = function(t) {\n var r = this.toHsl(), n = (r.h + t) % 360;\n return r.h = n < 0 ? 360 + n : n, new e(r);\n }, e.prototype.mix = function(t, r) {\n r === void 0 && (r = 50);\n var n = this.toRgb(), o = new e(t).toRgb(), a = r / 100, i = {\n r: (o.r - n.r) * a + n.r,\n g: (o.g - n.g) * a + n.g,\n b: (o.b - n.b) * a + n.b,\n a: (o.a - n.a) * a + n.a\n };\n return new e(i);\n }, e.prototype.analogous = function(t, r) {\n t === void 0 && (t = 6), r === void 0 && (r = 30);\n var n = this.toHsl(), o = 360 / r, a = [this];\n for (n.h = (n.h - (o * t >> 1) + 720) % 360; --t; )\n n.h = (n.h + o) % 360, a.push(new e(n));\n return a;\n }, e.prototype.complement = function() {\n var t = this.toHsl();\n return t.h = (t.h + 180) % 360, new e(t);\n }, e.prototype.monochromatic = function(t) {\n t === void 0 && (t = 6);\n for (var r = this.toHsv(), n = r.h, o = r.s, a = r.v, i = [], s = 1 / t; t--; )\n i.push(new e({ h: n, s: o, v: a })), a = (a + s) % 1;\n return i;\n }, e.prototype.splitcomplement = function() {\n var t = this.toHsl(), r = t.h;\n return [\n this,\n new e({ h: (r + 72) % 360, s: t.s, l: t.l }),\n new e({ h: (r + 216) % 360, s: t.s, l: t.l })\n ];\n }, e.prototype.onBackground = function(t) {\n var r = this.toRgb(), n = new e(t).toRgb();\n return new e({\n r: n.r + (r.r - n.r) * r.a,\n g: n.g + (r.g - n.g) * r.a,\n b: n.b + (r.b - n.b) * r.a\n });\n }, e.prototype.triad = function() {\n return this.polyad(3);\n }, e.prototype.tetrad = function() {\n return this.polyad(4);\n }, e.prototype.polyad = function(t) {\n for (var r = this.toHsl(), n = r.h, o = [this], a = 360 / t, i = 1; i < t; i++)\n o.push(new e({ h: (n + i * a) % 360, s: r.s, l: r.l }));\n return o;\n }, e.prototype.equals = function(t) {\n return this.toRgbString() === new e(t).toRgbString();\n }, e;\n}();\nfunction Zt(e) {\n return typeof e == \"string\";\n}\nfunction F(e, t) {\n return e.toString(t);\n}\nfunction st(e, t, r) {\n return new M(e === \"transparent\" ? t : e, r);\n}\nfunction Jt(e) {\n return Zt(e) ? e : new M(e).toString();\n}\nconst Qt = (e) => {\n const {\n currentColor: t,\n format: r,\n onChange: n,\n isAlphaHidden: o\n } = e, [a, i] = l.useState(t.toHsv()), s = (v, g) => {\n if (!tt(g))\n return;\n const m = _(360 * g / 100, 0, 359);\n i((H) => ({\n ...H,\n h: m\n }));\n const C = new M({\n ...a,\n a: t.toHsv().a,\n h: m\n });\n n?.(F(C, r));\n }, u = (v, g) => {\n if (!tt(g))\n return;\n const m = t.clone().setAlpha(g);\n n?.(F(m, r));\n }, x = ({\n s: v,\n v: g\n }) => {\n const m = new M({\n h: a.h,\n a: t.toHsv().a,\n s: v,\n v: g\n });\n i((C) => ({\n ...C,\n s: v,\n v: g\n })), n?.(F(m, r));\n };\n return /* @__PURE__ */ ft(K, {\n className: \"MuiColorInput-PopoverBody\",\n children: [/* @__PURE__ */ c(Vt, {\n currentHue: a.h,\n hsv: a,\n onChange: x\n }), /* @__PURE__ */ c(K, {\n mt: \"10px\",\n px: \"3px\",\n children: /* @__PURE__ */ c(Lt, {\n min: 0,\n max: 100,\n step: 1,\n onChange: s,\n \"aria-label\": \"hue\",\n value: a.h * 100 / 360\n })\n }), o ? null : /* @__PURE__ */ c(K, {\n mt: \"10px\",\n px: \"3px\",\n children: /* @__PURE__ */ c(Tt, {\n min: 0,\n max: 1,\n step: 0.01,\n \"aria-label\": \"alpha\",\n rgbColor: t.toRgb(),\n onChange: u,\n value: t.getAlpha()\n })\n })]\n });\n}, te = l.forwardRef((e, t) => {\n const {\n className: r,\n ...n\n } = e;\n return /* @__PURE__ */ c(Mt, {\n className: `MuiColorInput-TextField ${r || \"\"}`,\n ref: t,\n ...n\n });\n}), ee = \"black\", re = \"rgb\";\nfunction ne(e) {\n return typeof e == \"object\" && !Array.isArray(e) && e !== null;\n}\nfunction ut(e, t) {\n typeof t == \"function\" ? t(e) : t && ne(t) && \"current\" in t && (t.current = e);\n}\nfunction de(e) {\n return new M(e).isValid;\n}\nconst ge = l.forwardRef((e, t) => {\n const {\n value: r,\n format: n,\n onChange: o,\n PopoverProps: a,\n fallbackValue: i,\n isAlphaHidden: s,\n disablePopover: u,\n ...x\n } = e, {\n onBlur: v,\n InputProps: g,\n ...m\n } = x, {\n onClose: C,\n ...H\n } = a || {}, h = i || ee, S = m.disabled || g?.disabled || !1, I = l.useRef(null), A = l.useRef(null), [V, E] = l.useState(null), P = n || re, j = st(r, h, {\n format: P\n }), [X, N] = l.useState(r), [Z, $] = l.useState(r), lt = (f) => {\n f.preventDefault(), f.stopPropagation(), !S && !u && E(I.current);\n }, G = (f) => {\n const p = new M(f);\n o?.(f, {\n hex: p.toHexString(),\n hsv: p.toHsvString(),\n hsl: p.toHslString(),\n rgb: p.toRgbString(),\n hex8: p.toHex8String()\n });\n }, dt = (f) => {\n const p = f.target.value;\n N(p);\n const W = new M(p), T = F(W, P);\n $(T), G(T);\n }, gt = (...f) => {\n C?.(...f), E(null), queueMicrotask(() => {\n A.current?.focus();\n });\n }, pt = (f) => {\n v?.(f);\n const p = new M(X);\n if (p.isValid)\n p.format !== P && N(F(p, P));\n else {\n const W = new M(h), T = F(W, P);\n N(T), $(T), G(T);\n }\n };\n l.useEffect(() => {\n if (r !== Z) {\n const p = st(r, h).originalInput;\n $(p), N(p);\n }\n }, [r, Z, h]);\n const bt = (f) => {\n N(f), $(f), G(f);\n }, vt = (f) => {\n I.current = f, t && ut(f, t);\n }, mt = (f) => {\n A.current = f, A && ut(f, A);\n }, J = Boolean(V), Q = J ? \"color-popover\" : void 0;\n return /* @__PURE__ */ ft(St, {\n children: [/* @__PURE__ */ c(te, {\n ref: vt,\n spellCheck: \"false\",\n type: \"text\",\n autoComplete: \"off\",\n onChange: dt,\n value: Jt(X),\n onBlur: pt,\n inputRef: mt,\n disabled: S,\n InputProps: {\n startAdornment: /* @__PURE__ */ c(yt, {\n position: \"start\",\n children: /* @__PURE__ */ c(Rt, {\n disabled: S,\n \"aria-describedby\": Q,\n disablePopover: u || !1,\n component: u ? \"span\" : void 0,\n bgColor: j.toString(),\n isBgColorValid: j.isValid,\n onClick: u ? void 0 : lt\n })\n }),\n ...g\n },\n ...m\n }), u ? null : /* @__PURE__ */ c(It, {\n id: Q,\n open: J,\n anchorEl: V,\n onClose: gt,\n ...H,\n children: /* @__PURE__ */ c(Qt, {\n onChange: bt,\n currentColor: j,\n format: P,\n isAlphaHidden: s\n })\n })]\n });\n});\nexport {\n ge as MuiColorInput,\n de as matchIsValidColor\n};\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nexport type AssetAutoListItem = {\n\t/** user name */\n\tlabel: string;\n\t/** user id */\n\tvalue: number;\n};\n\n/**\n * `getAssetAutoList` request params\n * (what is used to send to server)\n */\nexport interface GetAssetAutoListRequestOptions {\n\tquery: string;\n}\n\n/**\n * `getAssetAutoList` request\n * (what gets sent to the server)\n */\nexport type GetAssetAutoListRequest = [GetAssetAutoListRequestOptions['query']];\n\n/**\n * `getAssetAutoList` response\n * (what comes back from the server)\n */\nexport type GetAssetAutoListResponse = SuccessResponse<GetAssetAutoListResult>;\n\n/**\n * `getAssetAutoList` result\n * (what is utilized from the server response)\n */\nexport type GetAssetAutoListResult = (Omit<AssetAutoListItem, 'value'> & {\n\tvalue: string;\n})[];\n\nexport const getAssetAutoListEndpoint = 'getAssetAutoList';\n\n/**\n * Autolist assets\n * @param fetchParams Fetch params\n */\nexport const getAssetAutoList = async ({\n\tquery,\n}: GetAssetAutoListRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetAssetAutoListRequest = [query];\n\n\treturn client\n\t\t.post<GetAssetAutoListResponse>(getAssetAutoListEndpoint, requestParams)\n\t\t.then((response) =>\n\t\t\tresponse.data.result.map<AssetAutoListItem>((d) => ({\n\t\t\t\t...d,\n\t\t\t\tvalue: parseInt(d.value),\n\t\t\t})),\n\t\t);\n};\nexport default getAssetAutoList;\n","import React, {useCallback} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport AutoListField, {\n\tCommenExtendProps,\n} from '@netx/core-components/Form/AutoListField';\nimport getAssetAutoList, {AssetAutoListItem} from '../../api/getAssetAutoList';\n\nexport {AssetAutoListItem} from '../../api/getAssetAutoList';\n\nexport type AssetAutoListRef = React.ForwardedRef<HTMLDivElement>;\n\nexport type AssetAutoListProps<\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false,\n> = CommenExtendProps<AssetAutoListItem, Multiple, DisableClearable, false> & {\n\tfilterAssets?: (groups: AssetAutoListItem[]) => AssetAutoListItem[];\n};\n\nconst getOptionLabel = (option: AssetAutoListItem) => option?.label;\nconst getOptionSelected = (\n\toption?: AssetAutoListItem,\n\tvalue?: AssetAutoListItem,\n) => {\n\treturn option?.value === value?.value;\n};\n\nconst AssetAutoListInner = <\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false,\n>(\n\t{filterAssets, ...props}: AssetAutoListProps<Multiple, DisableClearable>,\n\tref: AssetAutoListRef,\n) => {\n\tconst handleLookup = useCallback(\n\t\tasync (query) => {\n\t\t\tconst assets = await getAssetAutoList({\n\t\t\t\tquery,\n\t\t\t});\n\t\t\treturn filterAssets ? filterAssets(assets) : assets;\n\t\t},\n\t\t[filterAssets],\n\t);\n\n\treturn (\n\t\t<AutoListField<AssetAutoListItem, Multiple, DisableClearable>\n\t\t\tref={ref}\n\t\t\tname=\"user-auto-list\"\n\t\t\tonLookup={handleLookup}\n\t\t\tlabel={i18n.t('i18n.asset')}\n\t\t\tmultiple={false as Multiple}\n\t\t\tplaceholder={i18n.t('i18n.pleaseSelect')}\n\t\t\t{...props}\n\t\t\tAutocompleteProps={{\n\t\t\t\tgetOptionLabel,\n\t\t\t\tisOptionEqualToValue: getOptionSelected,\n\t\t\t\t...props?.AutocompleteProps,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const AssetAutoListPrimitive = React.forwardRef(AssetAutoListInner) as <\n\tMultiple extends boolean = false,\n\tDisableClearable extends boolean = false,\n>(\n\tprops: AssetAutoListProps<Multiple, DisableClearable>,\n) => JSX.Element;\n\nexport const AssetAutoList = AssetAutoListPrimitive;\n\nexport default AssetAutoList;\n","import {i18n} from '@netx/core/i18n';\nimport {VisualType} from './constants';\n\nexport const VisualTypeLabel: Record<VisualType, string> = {\n\t[VisualType.ASSET]: i18n.t('i18n.asset'),\n\t[VisualType.COLOR]: i18n.t('i18n.color'),\n};\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const VISUAL_RULE_EDITOR_CLASS_NAME = 'VisualRuleEditor';\nexport const VISUAL_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type VisualRuleEditorClassSlot =\n\ttypeof VISUAL_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface VisualRuleEditorClasses {\n\troot: string;\n}\n\nexport type VisualRuleEditorClassKey = keyof VisualRuleEditorClasses;\n\nexport const getVisualRuleEditorUtilityClass = (\n\tslot: VisualRuleEditorClassSlot,\n) => generateUtilityClass(VISUAL_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const visualRuleEditorClasses: VisualRuleEditorClasses =\n\tgenerateUtilityClasses(VISUAL_RULE_EDITOR_CLASS_NAME, ['root']);\n\nexport default visualRuleEditorClasses;\n","import React, {useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {i18n} from '@netx/core/i18n';\nimport {MuiColorInput} from 'mui-color-input';\nimport {AssetAutoList} from '@netx/core-asset/components/AssetAutoList';\nimport {SelectField} from '@netx/core-components/Form/SelectField';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {SearchSubTypeLabel} from '../../../../locales';\nimport {SearchValueUnavailableLabel} from '../../../locales';\nimport {CommonRuleEditorProps} from '../../../types';\nimport {VisualType} from '../../constants';\nimport {VisualTypeLabel} from '../../locales';\nimport {\n\tvisualRuleEditorClasses,\n\tgetVisualRuleEditorUtilityClass,\n\tVisualRuleEditorClasses,\n\tVISUAL_RULE_EDITOR_CLASS_NAME,\n} from './visualRuleEditorClasses';\n\nexport type VisualRuleEditorOwnerState = WithClasses<\n\tVisualRuleEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: VisualRuleEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getVisualRuleEditorUtilityClass, classes);\n};\n\nconst VisualRuleEditorRoot = styled('div', {\n\tname: VISUAL_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '1 1 auto',\n\t'& > * + *': {\n\t\tmarginLeft: `${theme.spacing(1)} !important`,\n\t},\n}));\n\nconst getSubType1OptionLabel = (option: VisualType) => VisualTypeLabel[option];\n\nexport type VisualRuleEditorProps = WithClasses<\n\tVisualRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> & {\n\t\telementSubType1: VisualType;\n\t\telementSubType1Options: VisualType[];\n\t\telementValue1: number | string;\n\t\telementValue1Unavailable: boolean;\n\t\telementValue1Label: string;\n\t\telementValue1Loading: boolean;\n\t\tonSubType1Change: (subType1: VisualType) => void;\n\t\tonValue1Change: (value: number | string) => void;\n\t}\n>;\n\nconst VisualRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\telementSubType1,\n\telementSubType1Options,\n\telementValue1,\n\telementValue1Label,\n\telementValue1Loading,\n\telementValue1Unavailable,\n\tvalidationErrors,\n\tonSubType1Change,\n\tonValue1Change,\n}: VisualRuleEditorProps) => {\n\tconst [assetName, setAssetName] = useState('');\n\n\tconst ownerState: VisualRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tuseEffect(() => {\n\t\tif (elementSubType1 === VisualType.COLOR) {\n\t\t\tsetAssetName('');\n\t\t\treturn;\n\t\t}\n\t\tsetAssetName(elementValue1Label);\n\t}, [elementValue1Label, elementSubType1]);\n\n\tconst waitingForAsset = elementValue1Loading && assetName === '';\n\n\treturn (\n\t\t<VisualRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SelectField<VisualType, false, true, false>\n\t\t\t\tdata-testid=\"visual-rule-sub-type-1\"\n\t\t\t\tlabel={SearchSubTypeLabel}\n\t\t\t\tname={'rule-sub-type-1'}\n\t\t\t\toptions={elementSubType1Options}\n\t\t\t\tvalue={elementSubType1}\n\t\t\t\tonChange={onSubType1Change}\n\t\t\t\tAutocompleteProps={{\n\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\tgetOptionLabel: getSubType1OptionLabel,\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t{elementSubType1 === VisualType.COLOR ? (\n\t\t\t\t<MuiColorInput\n\t\t\t\t\tdata-testid=\"visual-rule-value-1\"\n\t\t\t\t\terror={!!validationErrors?.elementValue1}\n\t\t\t\t\thelperText={validationErrors?.elementValue1}\n\t\t\t\t\tlabel={i18n.t('i18n.color')}\n\t\t\t\t\tformat=\"hex\"\n\t\t\t\t\tisAlphaHidden\n\t\t\t\t\tfallbackValue=\"#000000\"\n\t\t\t\t\tname=\"rule-value-1\"\n\t\t\t\t\tvalue={elementValue1.toString() || '#000000'}\n\t\t\t\t\tonChange={onValue1Change}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<AssetAutoList<false, true>\n\t\t\t\t\tdata-testid=\"visual-rule-value-1\"\n\t\t\t\t\terror={validationErrors?.elementValue1}\n\t\t\t\t\tloadingValue={elementValue1Loading}\n\t\t\t\t\tname=\"rule-value-1\"\n\t\t\t\t\tplaceholder={\n\t\t\t\t\t\twaitingForAsset\n\t\t\t\t\t\t\t? 'loading...'\n\t\t\t\t\t\t\t: elementValue1Unavailable\n\t\t\t\t\t\t\t? SearchValueUnavailableLabel\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tvalue={\n\t\t\t\t\t\telementValue1Unavailable || waitingForAsset\n\t\t\t\t\t\t\t? (null as any)\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tlabel: assetName,\n\t\t\t\t\t\t\t\t\tvalue: elementValue1,\n\t\t\t\t\t\t\t }\n\t\t\t\t\t}\n\t\t\t\t\tonChange={(asset) => {\n\t\t\t\t\t\tsetAssetName(asset.label);\n\t\t\t\t\t\tonValue1Change(asset.value);\n\t\t\t\t\t}}\n\t\t\t\t\tInputLabelProps={{\n\t\t\t\t\t\tshrink: elementValue1Unavailable || undefined,\n\t\t\t\t\t}}\n\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\tdisableClearable: true,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</VisualRuleEditorRoot>\n\t);\n};\n\nexport const VisualRuleEditorPrimitive = VisualRuleEditorInner;\n\nexport const VisualRuleEditor = VisualRuleEditorPrimitive;\n\nexport default VisualRuleEditor;\n\nexport type VisualRuleEditorGenericProps = WithClasses<\n\tVisualRuleEditorClasses,\n\tCommonRuleEditorProps & {}\n>;\n\nexport const VisualRuleEditorGenericPrimitive = ({\n\telementValue1,\n\t...props\n}: VisualRuleEditorGenericProps) => {\n\treturn (\n\t\t<VisualRuleEditor\n\t\t\t{...props}\n\t\t\telementValue1={\n\t\t\t\tArray.isArray(elementValue1) ? elementValue1[0] : elementValue1\n\t\t\t}\n\t\t/>\n\t);\n};\n\nexport const VisualRuleEditorGeneric = VisualRuleEditorGenericPrimitive;\n","import {SearchType} from './constants';\n\nimport {AdvancedRawRuleEditorGeneric} from './advancedRaw/components';\nimport {AttributeHistoryRuleEditor} from './attributeHistory/components';\nimport {CartRuleEditor} from './cart/components';\nimport {CategoryIdRuleEditorGeneric} from './categoryId/components';\nimport {CheckoutsRuleEditorGeneric} from './checkouts/components';\nimport {ContentsRuleEditorGeneric} from './contents/components';\nimport {DateRuleEditorGeneric} from './date/components';\nimport {ExpirationRuleEditor} from './expiration/components';\nimport {FileAspectRuleEditorGeneric} from './fileAspect/components';\nimport {FileFormatRuleEditorGeneric} from './fileFormat/components';\nimport {FileFormatFamilyRuleEditorGeneric} from './fileFormatFamily/components';\nimport {FileSizeRuleEditorGeneric} from './fileSize/components';\nimport {KeywordRuleEditorGeneric} from './keyword/components';\nimport {MetadataRuleEditorGeneric} from './metadata/components';\nimport {SavedSearchRuleEditor} from './savedSearch/components';\nimport {UserRuleEditorGeneric} from './user/components';\nimport {VisualRuleEditorGeneric} from './visual/components';\n\nexport const RuleEditorComponentMap = <const>{\n\t[SearchType.ADVANCED_RAW]: AdvancedRawRuleEditorGeneric,\n\t[SearchType.ATTRIBUTE_HISTORY]: AttributeHistoryRuleEditor,\n\t[SearchType.CART]: CartRuleEditor,\n\t[SearchType.CATEGORY_ID]: CategoryIdRuleEditorGeneric,\n\t[SearchType.CHECKOUTS]: CheckoutsRuleEditorGeneric,\n\t[SearchType.CONTENTS]: ContentsRuleEditorGeneric,\n\t[SearchType.DATE]: DateRuleEditorGeneric,\n\t[SearchType.EXPIRE]: ExpirationRuleEditor,\n\t[SearchType.FILE_ASPECT]: FileAspectRuleEditorGeneric,\n\t[SearchType.FILE_FORMAT]: FileFormatRuleEditorGeneric,\n\t[SearchType.FILE_FORMAT_FAMILY]: FileFormatFamilyRuleEditorGeneric,\n\t[SearchType.FILE_SIZE]: FileSizeRuleEditorGeneric,\n\t[SearchType.KEYWORD]: KeywordRuleEditorGeneric,\n\t[SearchType.METADATA]: MetadataRuleEditorGeneric,\n\t[SearchType.SAVED_SEARCH]: SavedSearchRuleEditor,\n\t[SearchType.USER]: UserRuleEditorGeneric,\n\t[SearchType.VISUAL]: VisualRuleEditorGeneric,\n};\n\n/**\n * Given search rule type, get an editor component\n * @param searchType search type\n * @returns\n */\nexport const getEditorComponent = (searchType: SearchType) =>\n\tRuleEditorComponentMap[searchType];\n\nexport default getEditorComponent;\n","import {useUserPref} from '@netx/core-components/hooks/useUserPref';\nimport {SearchVisualPref} from '../constants';\n\nexport const useIsVisualSearchEnabled = () => {\n\tconst [visualEnabled] = useUserPref(SearchVisualPref.ENABLED, {\n\t\tasBoolean: true,\n\t});\n\n\treturn visualEnabled;\n};\n\nexport default useIsVisualSearchEnabled;\n","import {useMemo} from 'react';\nimport {SearchTypeLabel} from '../locales';\nimport {SearchType, EditableRuleTypes} from '../rules/constants';\nimport {useIsVisualSearchEnabled} from '@netx/core-search-visual/hooks';\n\nexport type UseSearchRuleTypeOptionsParams = {\n\tfilter?: string;\n};\n\nexport const useSearchRuleTypeOptions = ({\n\tfilter,\n}: UseSearchRuleTypeOptionsParams = {}) => {\n\tconst visualEnabled = useIsVisualSearchEnabled();\n\n\tconst options = useMemo(() => {\n\t\treturn EditableRuleTypes.reduce<{label: string; value: number}[]>(\n\t\t\t(accum, type) => {\n\t\t\t\tif (type === SearchType.VISUAL && !visualEnabled) return accum;\n\n\t\t\t\tconst label = SearchTypeLabel[type];\n\t\t\t\tif (\n\t\t\t\t\tfilter != null &&\n\t\t\t\t\tfilter !== '' &&\n\t\t\t\t\t!label.toLowerCase().includes(filter)\n\t\t\t\t)\n\t\t\t\t\treturn accum;\n\n\t\t\t\treturn [\n\t\t\t\t\t...accum,\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\tvalue: type,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t},\n\t\t\t[],\n\t\t).sort((a, b) => a.label.localeCompare(b.label));\n\t}, [visualEnabled, filter]);\n\n\treturn options;\n};\n\nexport default useSearchRuleTypeOptions;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\nimport {\n\tSelectField,\n\tSelectFieldProps,\n} from '@netx/core-components/Form/SelectField';\nimport {useSearchRuleTypeOptions} from '../../hooks';\nimport {SearchTypeLabel} from '../../locales';\nimport type {SearchType} from '../../rules/constants';\n\nexport type SearchRuleTypeSelectorProps = Omit<\n\tSelectFieldProps<\n\t\tReturnType<typeof useSearchRuleTypeOptions>[number],\n\t\tfalse,\n\t\ttrue,\n\t\tfalse\n\t>,\n\t'name' | 'options' | 'onChange' | 'value'\n> & {\n\tonChange(type: SearchType): void;\n\tvalue: SearchType;\n};\n\nconst SearchRuleTypeSelectorInner = ({\n\tvalue,\n\tonChange,\n\t...props\n}: SearchRuleTypeSelectorProps) => {\n\tconst options = useSearchRuleTypeOptions();\n\n\treturn (\n\t\t<SelectField<typeof options[number], false, true, false>\n\t\t\toptions={options}\n\t\t\tlabel={i18n.t('i18n.type')}\n\t\t\tmultiple={false}\n\t\t\tlabelKey={'label'}\n\t\t\tname={'rule-type'}\n\t\t\tvalue={{\n\t\t\t\tlabel: SearchTypeLabel[value],\n\t\t\t\tvalue: value,\n\t\t\t}}\n\t\t\tonChange={(option) => option && onChange(option.value)}\n\t\t\t{...props}\n\t\t\tAutocompleteProps={{\n\t\t\t\t...props.AutocompleteProps,\n\t\t\t\tdisableClearable: true,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const SearchRuleTypeSelectorPrimitive = SearchRuleTypeSelectorInner;\n\nexport const SearchRuleTypeSelector = SearchRuleTypeSelectorPrimitive;\n\nexport default SearchRuleTypeSelector;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const SEARCH_RULE_EDITOR_CLASS_NAME = 'SearchRuleEditor';\nexport const SEARCH_RULE_EDITOR_CLASS_SLOTS = ['root'] as const;\n\nexport type SearchRuleEditorClassSlot =\n\ttypeof SEARCH_RULE_EDITOR_CLASS_SLOTS[number];\n\nexport interface SearchRuleEditorClasses {\n\troot: string;\n\tdataUnavailable: string;\n\tremoveDisabled: string;\n}\n\nexport type SearchRuleEditorClassKey = keyof SearchRuleEditorClasses;\n\nexport const getSearchRuleEditorUtilityClass = (\n\tslot: SearchRuleEditorClassSlot,\n) => generateUtilityClass(SEARCH_RULE_EDITOR_CLASS_NAME, slot);\n\nexport const searchRuleEditorClasses: SearchRuleEditorClasses =\n\tgenerateUtilityClasses(SEARCH_RULE_EDITOR_CLASS_NAME, [\n\t\t'root',\n\t\t'removeDisabled',\n\t\t'dataUnavailable',\n\t]);\n\nexport default searchRuleEditorClasses;\n","import React, {useMemo} from 'react';\nimport clsx from 'clsx';\nimport {observer} from 'mobx-react-lite';\nimport {faTimes} from '@fortawesome/pro-solid-svg-icons';\nimport {i18n} from '@netx/core/i18n';\nimport {Alert} from '@netx/core-components/Alert';\nimport {IconButton} from '@netx/core-components/IconButton';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {SearchRulesActionLabel} from '../../locales';\nimport type {SearchType} from '../../rules/constants';\nimport {getEditorComponent} from '../../rules/getEditorComponent';\nimport type {SearchRule, CommonRuleEditorProps} from '../../rules/types';\nimport {SearchRuleTypeSelector} from '../SearchRuleTypeSelector';\nimport {\n\tsearchRuleEditorClasses,\n\tgetSearchRuleEditorUtilityClass,\n\tSearchRuleEditorClasses,\n\tSEARCH_RULE_EDITOR_CLASS_NAME,\n} from './searchRuleEditorClasses';\n\nexport type SearchRuleEditorOwnerState = WithClasses<\n\tSearchRuleEditorClasses,\n\t{\n\t\tdataUnavailable?: boolean;\n\t\tremoveDisabled?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: SearchRuleEditorOwnerState) => {\n\tconst {classes, dataUnavailable, removeDisabled} = ownerState;\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\tdataUnavailable && 'dataUnavailable',\n\t\t\tremoveDisabled && 'removeDisabled',\n\t\t],\n\t};\n\treturn composeClasses(slots, getSearchRuleEditorUtilityClass, classes);\n};\n\nconst SearchRuleEditorRoot = styled('div', {\n\tname: SEARCH_RULE_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tbackground: theme.palette.background.paper,\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tborderRadius: 4,\n\tborder: `1px solid ${theme.palette.custom.border}`,\n\t'& + &': {\n\t\tmarginTop: 8,\n\t},\n\t[`&.${searchRuleEditorClasses.dataUnavailable}`]: {\n\t\tborderColor: theme.palette.warning.main,\n\t},\n}));\n\nconst SearchRuleEditorHeader = styled('div')(({theme}) => ({\n\talignItems: 'center',\n\tdisplay: 'flex',\n\tpadding: theme.spacing(2, 1),\n}));\n\nconst SearchRuleEditorContent = styled('div')(({theme}) => ({\n\talignItems: 'center',\n\tdisplay: 'flex',\n\tpadding: theme.spacing(0, 2, 2, 2),\n}));\n\nconst SearchRuleTypeSelectorRoot = styled(SearchRuleTypeSelector)(\n\t({theme}) => ({\n\t\tflex: '1 1 auto',\n\t\tpaddingLeft: theme.spacing(1),\n\t\tpaddingRight: theme.spacing(1),\n\t}),\n);\n\nconst SearchRuleEditorUnsupportedAlert = styled(Alert)(({theme}) => ({\n\twidth: '100%',\n}));\n\nexport type SearchRuleEditorProps = WithClasses<\n\tSearchRuleEditorClasses,\n\tPick<CommonRuleEditorProps, 'validationErrors'> &\n\t\t// TODO: we need to find a way to deal with this typing on a different level\n\t\t// we need an editable type vs a created type\n\t\tOmit<SearchRule, 'elementValue1'> & {\n\t\t\t_id: string;\n\t\t\telementValue1: string | number | string[];\n\t\t\telementSubType1Options: number[];\n\t\t\telementSubType2Options: number[];\n\t\t\telementValue1Unavailable: boolean;\n\t\t\telementValue2Unavailable: boolean;\n\t\t\telementValue3Unavailable: boolean;\n\t\t\telementValue1Loading: boolean;\n\t\t\telementValue2Loading: boolean;\n\t\t\telementValue3Loading: boolean;\n\t\t\telementValue1Label: string;\n\t\t\telementValue2Label: string;\n\t\t\telementValue3Label: string;\n\t\t\tisValid: boolean;\n\t\t\tremoveDisabled?: boolean;\n\t\t\tonRemove(): void;\n\t\t\tonSubType1Change(subType1: number): void;\n\t\t\tonSubType2Change(subType2: number): void;\n\t\t\tonUpdateType(type: SearchType): void;\n\t\t\tonValue1Change(value1: string | number | string[]): void;\n\t\t\tonValue2Change(value2: string | number): void;\n\t\t\tonValue3Change(value3: string | number): void;\n\t\t}\n>;\n\nconst SearchRuleEditorInner = ({\n\tclasses: _classes,\n\tclassName,\n\t_id,\n\telementType,\n\telementValue1Unavailable,\n\telementValue2Unavailable,\n\telementValue3Unavailable,\n\tremoveDisabled,\n\tonRemove,\n\tonUpdateType,\n\t...props\n}: SearchRuleEditorProps) => {\n\tconst ownerState: SearchRuleEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tdataUnavailable:\n\t\t\telementValue1Unavailable ||\n\t\t\telementValue2Unavailable ||\n\t\t\telementValue3Unavailable,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst Component = useMemo(\n\t\t() => getEditorComponent(elementType),\n\t\t[elementType],\n\t);\n\n\tconst handleTypeChange = (value: SearchType) => {\n\t\tvalue !== elementType && onUpdateType(value);\n\t};\n\n\tconst handleRemove = () => onRemove();\n\n\treturn (\n\t\t<SearchRuleEditorRoot className={clsx(classes.root, className)}>\n\t\t\t<SearchRuleEditorHeader>\n\t\t\t\t<SearchRuleTypeSelectorRoot\n\t\t\t\t\tvalue={elementType}\n\t\t\t\t\tonChange={handleTypeChange}\n\t\t\t\t/>\n\t\t\t\t{!removeDisabled ? (\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\ticon={faTimes}\n\t\t\t\t\t\tlabel={SearchRulesActionLabel.DELETE_RULE}\n\t\t\t\t\t\tonClick={handleRemove}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</SearchRuleEditorHeader>\n\n\t\t\t<SearchRuleEditorContent>\n\t\t\t\t{Component ? (\n\t\t\t\t\t<Component\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t\telementValue1Unavailable={elementValue1Unavailable}\n\t\t\t\t\t\telementValue2Unavailable={elementValue2Unavailable}\n\t\t\t\t\t\telementValue3Unavailable={elementValue3Unavailable}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<SearchRuleEditorUnsupportedAlert severity=\"error\">\n\t\t\t\t\t\t{i18n.t('i18n.notSupported')}\n\t\t\t\t\t</SearchRuleEditorUnsupportedAlert>\n\t\t\t\t)}\n\t\t\t</SearchRuleEditorContent>\n\t\t</SearchRuleEditorRoot>\n\t);\n};\n\nexport const SearchRuleEditorPrimitive = SearchRuleEditorInner;\n\nexport const SearchRuleEditor = observer(SearchRuleEditorPrimitive);\n\nexport default SearchRuleEditor;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const SEARCH_RULES_EDITOR_LIST_CLASS_NAME = 'SearchRulesEditorList';\nexport const SEARCH_RULES_EDITOR_LIST_CLASS_SLOTS = ['root'] as const;\n\nexport type SearchRulesEditorListClassSlot =\n\ttypeof SEARCH_RULES_EDITOR_LIST_CLASS_SLOTS[number];\n\nexport interface SearchRulesEditorListClasses {\n\troot: string;\n}\n\nexport type SearchRulesEditorListClassKey = keyof SearchRulesEditorListClasses;\n\nexport const getSearchRulesEditorListUtilityClass = (\n\tslot: SearchRulesEditorListClassSlot,\n) => generateUtilityClass(SEARCH_RULES_EDITOR_LIST_CLASS_NAME, slot);\n\nexport const searchRulesEditorListClasses: SearchRulesEditorListClasses =\n\tgenerateUtilityClasses(SEARCH_RULES_EDITOR_LIST_CLASS_NAME, ['root']);\n\nexport default searchRulesEditorListClasses;\n","import React, {useEffect} from 'react';\nimport clsx from 'clsx';\nimport {reaction} from 'mobx';\nimport {observer} from 'mobx-react-lite';\nimport scrollIntoView from 'scroll-into-view-if-needed';\nimport {Skeleton} from '@mui/material';\nimport {\n\tScrollBorder,\n\tscrollBorderClasses,\n} from '@netx/core-components/ScrollBorder';\nimport {faList} from '@fortawesome/pro-solid-svg-icons';\nimport {FallbackMessage} from '@netx/core-components/FallbackMessage';\nimport {useSharedRef} from '@netx/core-components/hooks/useSharedRef';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {useSearchRulesStoreProvider} from '../../contexts';\nimport {SearchRuleEditor} from '../SearchRuleEditor';\nimport {SearchType} from '../../rules';\nimport {\n\tsearchRulesEditorListClasses,\n\tgetSearchRulesEditorListUtilityClass,\n\tSearchRulesEditorListClasses,\n\tSEARCH_RULES_EDITOR_LIST_CLASS_NAME,\n} from './searchRulesEditorListClasses';\nimport {RuleModel} from '../../rules/baseModel';\n\nexport type SearchRulesEditorListOwnerState = WithClasses<\n\tSearchRulesEditorListClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: SearchRulesEditorListOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getSearchRulesEditorListUtilityClass, classes);\n};\n\nconst SearchRulesEditorListRoot = styled('div', {\n\tname: SEARCH_RULES_EDITOR_LIST_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tflex: '1 1 auto',\n\twidth: '100%',\n\toverflow: 'hidden',\n\tdisplay: 'flex',\n}));\n\nconst SearchRulesEditorListScrollBorder = styled(ScrollBorder, {\n\tname: SEARCH_RULES_EDITOR_LIST_CLASS_NAME,\n\tslot: 'ScrollBorder',\n})(({theme}) => ({\n\tflex: '1 1 auto',\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\t[`& .${scrollBorderClasses.scrollWrapper}`]: {\n\t\tpadding: theme.spacing(1, 2),\n\t},\n}));\n\nexport type SearchRulesEditorListProps = WithClasses<\n\tSearchRulesEditorListClasses,\n\t{\n\t\tref?: React.ForwardedRef<HTMLDivElement>;\n\t\tloading?: boolean;\n\t\trules: RuleModel[];\n\t\tonRemoveRule(rule: RuleModel): void;\n\t\tonUpdateRuleType(rule: RuleModel, type: SearchType): void;\n\t\tonSubType1Change(rule: RuleModel, subType1: number): void;\n\t\tonSubType2Change(rule: RuleModel, subType2: number): void;\n\t\tonValue1Change(rule: RuleModel, value1: number | string): void;\n\t\tonValue2Change(rule: RuleModel, value2: number | string): void;\n\t\tonValue3Change(rule: RuleModel, value3: number | string): void;\n\t}\n>;\n\nconst SearchRulesEditorListInner = (\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tloading,\n\t\trules,\n\t\tonRemoveRule,\n\t\tonUpdateRuleType,\n\t\tonSubType1Change,\n\t\tonSubType2Change,\n\t\tonValue1Change,\n\t\tonValue2Change,\n\t\tonValue3Change,\n\t}: SearchRulesEditorListProps,\n\tref: React.ForwardedRef<HTMLDivElement>,\n) => {\n\tconst ownerState: SearchRulesEditorListOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst handleRemoveRule = (rule: RuleModel) => () => onRemoveRule(rule);\n\n\tconst handleTypeChange = (rule: RuleModel) => (type: SearchType) =>\n\t\tonUpdateRuleType(rule, type);\n\n\tconst handleSubType1Change = (rule: RuleModel) => (subType1: number) =>\n\t\tonSubType1Change(rule, subType1);\n\n\tconst handleSubType2Change = (rule: RuleModel) => (subType2: number) =>\n\t\tonSubType2Change(rule, subType2);\n\n\tconst handleValue1Change = (rule: RuleModel) => (value1: number | string) =>\n\t\tonValue1Change(rule, value1);\n\n\tconst handleValue2Change = (rule: RuleModel) => (value2: number | string) =>\n\t\tonValue2Change(rule, value2);\n\n\tconst handleValue3Change = (rule: RuleModel) => (value3: number | string) =>\n\t\tonValue3Change(rule, value3);\n\n\treturn (\n\t\t<SearchRulesEditorListRoot className={clsx(classes.root, className)}>\n\t\t\t<SearchRulesEditorListScrollBorder innerRef={ref}>\n\t\t\t\t{rules.length ? (\n\t\t\t\t\trules.map((rule, index) => (\n\t\t\t\t\t\t<SearchRuleEditor\n\t\t\t\t\t\t\tkey={rule._id}\n\t\t\t\t\t\t\tremoveDisabled={rules.length === 1}\n\t\t\t\t\t\t\tvalidationErrors={rule.validationErrors}\n\t\t\t\t\t\t\tonRemove={handleRemoveRule(rule)}\n\t\t\t\t\t\t\tonUpdateType={handleTypeChange(rule)}\n\t\t\t\t\t\t\tonSubType1Change={handleSubType1Change(rule)}\n\t\t\t\t\t\t\tonSubType2Change={handleSubType2Change(rule)}\n\t\t\t\t\t\t\tonValue1Change={handleValue1Change(rule)}\n\t\t\t\t\t\t\tonValue2Change={handleValue2Change(rule)}\n\t\t\t\t\t\t\tonValue3Change={handleValue3Change(rule)}\n\t\t\t\t\t\t\t{...rule}\n\t\t\t\t\t\t\t// some issues with getter values being spread in mobx\n\t\t\t\t\t\t\tisValid={rule.isValid}\n\t\t\t\t\t\t\telementSubType1Options={rule.elementSubType1Options}\n\t\t\t\t\t\t\telementSubType2Options={rule.elementSubType2Options}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))\n\t\t\t\t) : !loading ? (\n\t\t\t\t\t<FallbackMessage variant=\"light\" icon={faList} title=\"No rules\" />\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{new Array(3).fill(null).map((_, index) => (\n\t\t\t\t\t\t\t<Skeleton\n\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\tvariant=\"rectangular\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t// TODO: this could be handled better/dynamically\n\t\t\t\t\t\t\t\t\theight: 132,\n\t\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\t\tmarginBottom: 8,\n\t\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</SearchRulesEditorListScrollBorder>\n\t\t</SearchRulesEditorListRoot>\n\t);\n};\n\nexport const SearchRulesEditorListPrimitive = React.forwardRef(\n\tSearchRulesEditorListInner,\n) as (props: SearchRulesEditorListProps) => JSX.Element;\n\nexport const SearchRulesEditorList = observer(SearchRulesEditorListPrimitive);\n\nexport default SearchRulesEditorList;\n\nexport type SearchRulesEditorListContainerProps = Omit<\n\tSearchRulesEditorListProps,\n\t| 'onRemoveRule'\n\t| 'onSubType1Change'\n\t| 'onSubType2Change'\n\t| 'onUpdateRuleType'\n\t| 'onValue1Change'\n\t| 'onValue2Change'\n\t| 'onValue3Change'\n\t| 'rules'\n>;\n\nexport const SearchRulesEditorListContainer = observer(\n\tReact.forwardRef<HTMLDivElement, SearchRulesEditorListContainerProps>(\n\t\t(props: SearchRulesEditorListContainerProps, ref) => {\n\t\t\tconst {store} = useSearchRulesStoreProvider();\n\n\t\t\tconst innerRef = useSharedRef(null, [ref]);\n\n\t\t\tuseEffect(() => {\n\t\t\t\t// TODO: this is gross, was in a hurry\n\t\t\t\t// need to find a good way/hook to deal with scroll into view on newly added children\n\t\t\t\tconst dispose = reaction(\n\t\t\t\t\t() => store.rules.length,\n\t\t\t\t\t(length, lastLength) => {\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tif (length <= lastLength) return;\n\t\t\t\t\t\t\tconst els =\n\t\t\t\t\t\t\t\tinnerRef.current?.querySelectorAll('.SearchRuleEditor-root') ||\n\t\t\t\t\t\t\t\t[];\n\t\t\t\t\t\t\tif (!els.length) return;\n\t\t\t\t\t\t\tscrollIntoView(els[els.length - 1], {\n\t\t\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t\t\t\tscrollMode: 'if-needed',\n\t\t\t\t\t\t\t\tblock: 'center',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}, 16);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose();\n\t\t\t\t};\n\t\t\t}, [store]);\n\n\t\t\treturn (\n\t\t\t\t<SearchRulesEditorList\n\t\t\t\t\tref={innerRef}\n\t\t\t\t\t{...props}\n\t\t\t\t\trules={store.rules}\n\t\t\t\t\tonRemoveRule={store.removeRule.bind(store)}\n\t\t\t\t\tonSubType1Change={(rule, subType1) =>\n\t\t\t\t\t\trule.setElementSubType1(subType1)\n\t\t\t\t\t}\n\t\t\t\t\tonSubType2Change={(rule, subType2) =>\n\t\t\t\t\t\trule.setElementSubType2(subType2)\n\t\t\t\t\t}\n\t\t\t\t\tonUpdateRuleType={store.replaceRule.bind(store)}\n\t\t\t\t\tonValue1Change={(rule, value1) => rule.setElementValue1(value1)}\n\t\t\t\t\tonValue2Change={(rule, value2) => rule.setElementValue2(value2)}\n\t\t\t\t\tonValue3Change={(rule, value3) => rule.setElementValue3(value3)}\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t),\n);\n","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"alignItems\", \"autoFocus\", \"component\", \"children\", \"dense\", \"disableGutters\", \"divider\", \"focusVisibleClassName\", \"selected\", \"className\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { unstable_composeClasses as composeClasses } from '@mui/base';\nimport { alpha } from '@mui/system';\nimport styled, { rootShouldForwardProp } from '../styles/styled';\nimport useThemeProps from '../styles/useThemeProps';\nimport ButtonBase from '../ButtonBase';\nimport useEnhancedEffect from '../utils/useEnhancedEffect';\nimport useForkRef from '../utils/useForkRef';\nimport ListContext from '../List/ListContext';\nimport listItemButtonClasses, { getListItemButtonUtilityClass } from './listItemButtonClasses';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const overridesResolver = (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.dense && styles.dense, ownerState.alignItems === 'flex-start' && styles.alignItemsFlexStart, ownerState.divider && styles.divider, !ownerState.disableGutters && styles.gutters];\n};\n\nconst useUtilityClasses = ownerState => {\n const {\n alignItems,\n classes,\n dense,\n disabled,\n disableGutters,\n divider,\n selected\n } = ownerState;\n const slots = {\n root: ['root', dense && 'dense', !disableGutters && 'gutters', divider && 'divider', disabled && 'disabled', alignItems === 'flex-start' && 'alignItemsFlexStart', selected && 'selected']\n };\n const composedClasses = composeClasses(slots, getListItemButtonUtilityClass, classes);\n return _extends({}, classes, composedClasses);\n};\n\nconst ListItemButtonRoot = styled(ButtonBase, {\n shouldForwardProp: prop => rootShouldForwardProp(prop) || prop === 'classes',\n name: 'MuiListItemButton',\n slot: 'Root',\n overridesResolver\n})(({\n theme,\n ownerState\n}) => _extends({\n display: 'flex',\n flexGrow: 1,\n justifyContent: 'flex-start',\n alignItems: 'center',\n position: 'relative',\n textDecoration: 'none',\n minWidth: 0,\n boxSizing: 'border-box',\n textAlign: 'left',\n paddingTop: 8,\n paddingBottom: 8,\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.shortest\n }),\n '&:hover': {\n textDecoration: 'none',\n backgroundColor: (theme.vars || theme).palette.action.hover,\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n },\n [`&.${listItemButtonClasses.selected}`]: {\n backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.mainChannel} / ${theme.vars.palette.action.selectedOpacity})` : alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity),\n [`&.${listItemButtonClasses.focusVisible}`]: {\n backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.mainChannel} / calc(${theme.vars.palette.action.selectedOpacity} + ${theme.vars.palette.action.focusOpacity}))` : alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity + theme.palette.action.focusOpacity)\n }\n },\n [`&.${listItemButtonClasses.selected}:hover`]: {\n backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.mainChannel} / calc(${theme.vars.palette.action.selectedOpacity} + ${theme.vars.palette.action.hoverOpacity}))` : alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity + theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.mainChannel} / ${theme.vars.palette.action.selectedOpacity})` : alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity)\n }\n },\n [`&.${listItemButtonClasses.focusVisible}`]: {\n backgroundColor: (theme.vars || theme).palette.action.focus\n },\n [`&.${listItemButtonClasses.disabled}`]: {\n opacity: (theme.vars || theme).palette.action.disabledOpacity\n }\n}, ownerState.divider && {\n borderBottom: `1px solid ${(theme.vars || theme).palette.divider}`,\n backgroundClip: 'padding-box'\n}, ownerState.alignItems === 'flex-start' && {\n alignItems: 'flex-start'\n}, !ownerState.disableGutters && {\n paddingLeft: 16,\n paddingRight: 16\n}, ownerState.dense && {\n paddingTop: 4,\n paddingBottom: 4\n}));\nconst ListItemButton = /*#__PURE__*/React.forwardRef(function ListItemButton(inProps, ref) {\n const props = useThemeProps({\n props: inProps,\n name: 'MuiListItemButton'\n });\n\n const {\n alignItems = 'center',\n autoFocus = false,\n component = 'div',\n children,\n dense = false,\n disableGutters = false,\n divider = false,\n focusVisibleClassName,\n selected = false,\n className\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const context = React.useContext(ListContext);\n const childContext = {\n dense: dense || context.dense || false,\n alignItems,\n disableGutters\n };\n const listItemRef = React.useRef(null);\n useEnhancedEffect(() => {\n if (autoFocus) {\n if (listItemRef.current) {\n listItemRef.current.focus();\n } else if (process.env.NODE_ENV !== 'production') {\n console.error('MUI: Unable to set focus to a ListItemButton whose component has not been rendered.');\n }\n }\n }, [autoFocus]);\n\n const ownerState = _extends({}, props, {\n alignItems,\n dense: childContext.dense,\n disableGutters,\n divider,\n selected\n });\n\n const classes = useUtilityClasses(ownerState);\n const handleRef = useForkRef(listItemRef, ref);\n return /*#__PURE__*/_jsx(ListContext.Provider, {\n value: childContext,\n children: /*#__PURE__*/_jsx(ListItemButtonRoot, _extends({\n ref: handleRef,\n href: other.href || other.to,\n component: (other.href || other.to) && component === 'div' ? 'a' : component,\n focusVisibleClassName: clsx(classes.focusVisible, focusVisibleClassName),\n ownerState: ownerState,\n className: clsx(classes.root, className)\n }, other, {\n classes: classes,\n children: children\n }))\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? ListItemButton.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * Defines the `align-items` style property.\n * @default 'center'\n */\n alignItems: PropTypes.oneOf(['center', 'flex-start']),\n\n /**\n * If `true`, the list item is focused during the first mount.\n * Focus will also be triggered if the value changes from false to true.\n * @default false\n */\n autoFocus: PropTypes.bool,\n\n /**\n * The content of the component if a `ListItemSecondaryAction` is used it must\n * be the last child.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes.elementType,\n\n /**\n * If `true`, compact vertical padding designed for keyboard and mouse input is used.\n * The prop defaults to the value inherited from the parent List component.\n * @default false\n */\n dense: PropTypes.bool,\n\n /**\n * If `true`, the component is disabled.\n * @default false\n */\n disabled: PropTypes.bool,\n\n /**\n * If `true`, the left and right padding is removed.\n * @default false\n */\n disableGutters: PropTypes.bool,\n\n /**\n * If `true`, a 1px light border is added to the bottom of the list item.\n * @default false\n */\n divider: PropTypes.bool,\n\n /**\n * This prop can help identify which element has keyboard focus.\n * The class name will be applied when the element gains the focus through keyboard interaction.\n * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).\n * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/HEAD/explainer.md).\n * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components\n * if needed.\n */\n focusVisibleClassName: PropTypes.string,\n\n /**\n * @ignore\n */\n href: PropTypes.string,\n\n /**\n * Use to apply selected styling.\n * @default false\n */\n selected: PropTypes.bool,\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])\n} : void 0;\nexport default ListItemButton;","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME =\n\t'SearchRulesEditorDropdown';\nexport const SEARCH_RULES_EDITOR_DROPDOWN_CLASS_SLOTS = [\n\t'root',\n\t'button',\n\t'menu',\n\t'openIcon',\n] as const;\n\nexport type SearchRulesEditorDropdownClassSlot =\n\ttypeof SEARCH_RULES_EDITOR_DROPDOWN_CLASS_SLOTS[number];\n\nexport interface SearchRulesEditorDropdownClasses {\n\troot: string;\n\tbutton: string;\n\tmenu: string;\n\topen: string;\n\topenIcon: string;\n}\n\nexport type SearchRulesEditorDropdownClassKey =\n\tkeyof SearchRulesEditorDropdownClasses;\n\nexport const getSearchRulesEditorDropdownUtilityClass = (\n\tslot: SearchRulesEditorDropdownClassSlot,\n) => generateUtilityClass(SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME, slot);\n\nexport const searchRulesEditorDropdownClasses: SearchRulesEditorDropdownClasses =\n\tgenerateUtilityClasses(SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME, [\n\t\t'root',\n\t\t'button',\n\t\t'menu',\n\t\t'open',\n\t\t'openIcon',\n\t]);\n\nexport default searchRulesEditorDropdownClasses;\n","import React, {useRef, useState} from 'react';\nimport clsx from 'clsx';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCaretDown} from '@fortawesome/pro-solid-svg-icons';\nimport {\n\tButton,\n\tButtonGroup,\n\tList,\n\tListItem,\n\tListItemButton,\n\tListItemText,\n\tPopover,\n\tPopoverActions,\n\tpopoverClasses,\n} from '@mui/material';\nimport {\n\tScrollBorder,\n\tscrollBorderClasses,\n} from '@netx/core-components/ScrollBorder';\nimport {SearchFilter} from '@netx/core-components/SearchFilter';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport type {SearchType} from '../../rules';\nimport {SearchRulesActionLabel} from '../../locales';\nimport {useSearchRuleTypeOptions} from '../../hooks';\nimport {\n\tsearchRulesEditorDropdownClasses,\n\tgetSearchRulesEditorDropdownUtilityClass,\n\tSearchRulesEditorDropdownClasses,\n\tSEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME,\n} from './searchRulesEditorDropdownClasses';\n\nexport type SearchRulesEditorDropdownOwnerState = WithClasses<\n\tSearchRulesEditorDropdownClasses,\n\t{\n\t\topen?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: SearchRulesEditorDropdownOwnerState) => {\n\tconst {classes, open} = ownerState;\n\tconst slots = {\n\t\troot: ['root', open && 'open'],\n\t\topenIcon: ['openIcon'],\n\t\tmenu: ['menu'],\n\t\toptionsFilter: ['optionsFilter'],\n\t\toptionsList: ['optionsList'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetSearchRulesEditorDropdownUtilityClass,\n\t\tclasses,\n\t);\n};\n\nconst SearchRulesEditorDropdownRoot = styled('div', {\n\tname: SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\tflex: '0 0 auto',\n\tposition: 'relative',\n}));\n\nconst SearchRulesEditorDropdownButton = styled(ButtonGroup, {\n\tname: SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME,\n\tslot: 'Button',\n})(({theme}) => ({}));\n\nconst SearchRulesEditorDropdownOpenIcon = styled(FontAwesomeIcon, {\n\tname: SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME,\n\tslot: 'OpenIcon',\n})(({theme}) => ({\n\ttransition: theme.transitions.create('transform', {\n\t\tduration: theme.transitions.duration.short,\n\t}),\n}));\n\nconst SearchRulesEditorDropdownMenu = styled(Popover, {\n\tname: SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME,\n\tslot: 'Menu',\n})(({theme}) => ({\n\t[`& .${popoverClasses.paper}`]: {\n\t\tdisplay: 'flex',\n\t},\n}));\n\nconst SearchRulesEditorDropdownOptions = styled('div', {\n\tname: SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME,\n\tslot: 'Options',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\toverflow: 'hidden',\n\tminHeight: 0,\n}));\n\nconst SearchRulesEditorDropdownOptionsList = styled(List, {\n\tname: SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME,\n\tslot: 'OptionsList',\n})(({theme}) => ({}));\n\nconst SearchRulesEditorDropdownOptionsFilter = styled('div', {\n\tname: SEARCH_RULES_EDITOR_DROPDOWN_CLASS_NAME,\n\tslot: 'OptionsFilter',\n})(({theme}) => ({\n\tflex: '0 0 auto',\n\tpadding: theme.spacing(1, 2),\n}));\n\nconst SearchRulesEditorDropdownOptionsScrollBorder = styled(ScrollBorder)(\n\t({theme}) => ({\n\t\tdisplay: 'flex',\n\t\tflexDirection: 'column',\n\t\t[`&. ${scrollBorderClasses.scrollWrapper}`]: {\n\t\t\tflex: '1 1 auto',\n\t\t},\n\t}),\n);\n\nexport interface SearchRulesEditorDropdownProps\n\textends Omit<\n\t\t\tReact.DetailedHTMLProps<\n\t\t\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\t\t\tHTMLDivElement\n\t\t\t>,\n\t\t\t'onSelect'\n\t\t>,\n\t\tWithClasses<\n\t\t\tSearchRulesEditorDropdownClasses,\n\t\t\t{\n\t\t\t\tdisabled?: boolean;\n\t\t\t}\n\t\t> {\n\tonSelect(type?: SearchType): void;\n}\n\nconst SearchRulesEditorDropdownInner = ({\n\tclasses: _classes,\n\tclassName,\n\tdisabled,\n\tonSelect,\n}: SearchRulesEditorDropdownProps) => {\n\tconst [open, setOpen] = React.useState(false);\n\tconst anchorRef = React.useRef<HTMLDivElement>(null);\n\tconst [filter, setFilter] = useState('');\n\n\tconst ownerState = {\n\t\tclasses: _classes,\n\t\topen,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst options = useSearchRuleTypeOptions({filter});\n\n\tconst popoverActions = useRef<PopoverActions>(null);\n\n\tconst handleClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) =>\n\t\tsetOpen(true);\n\n\tconst handleClose = () => setOpen(false);\n\n\tconst handleFilter = (filter: string) => setFilter(filter.toLowerCase());\n\n\tconst handleSelect = (searchType: SearchType) => () => {\n\t\tsetOpen(false);\n\t\tonSelect(searchType);\n\t};\n\n\treturn (\n\t\t<SearchRulesEditorDropdownRoot className={clsx(classes.root, className)}>\n\t\t\t<SearchRulesEditorDropdownButton\n\t\t\t\tvariant=\"contained\"\n\t\t\t\tref={anchorRef}\n\t\t\t\taria-label=\"split button\"\n\t\t\t\tclassName={classes.openIcon}\n\t\t\t>\n\t\t\t\t<Button disabled={disabled} onClick={() => onSelect()}>\n\t\t\t\t\t{SearchRulesActionLabel.ADD_RULE}\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\taria-controls={open ? 'split-button-menu' : undefined}\n\t\t\t\t\taria-expanded={open ? 'true' : undefined}\n\t\t\t\t\taria-label=\"select search rule type\"\n\t\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t>\n\t\t\t\t\t<SearchRulesEditorDropdownOpenIcon\n\t\t\t\t\t\tclassName={classes.openIcon}\n\t\t\t\t\t\ticon={faCaretDown}\n\t\t\t\t\t\trotation={open ? 180 : undefined}\n\t\t\t\t\t/>\n\t\t\t\t</Button>\n\t\t\t</SearchRulesEditorDropdownButton>\n\n\t\t\t<SearchRulesEditorDropdownMenu\n\t\t\t\tclassName={classes.menu}\n\t\t\t\topen={open}\n\t\t\t\tonClose={handleClose}\n\t\t\t\taction={popoverActions}\n\t\t\t\tanchorEl={anchorRef.current}\n\t\t\t>\n\t\t\t\t<SearchRulesEditorDropdownOptions>\n\t\t\t\t\t<SearchRulesEditorDropdownOptionsFilter\n\t\t\t\t\t\tclassName={classes.optionsFilter}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SearchFilter\n\t\t\t\t\t\t\tfilterStr={filter}\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\tvariant=\"rounded\"\n\t\t\t\t\t\t\tonFilter={handleFilter}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SearchRulesEditorDropdownOptionsFilter>\n\t\t\t\t\t<SearchRulesEditorDropdownOptionsScrollBorder>\n\t\t\t\t\t\t<SearchRulesEditorDropdownOptionsList\n\t\t\t\t\t\t\tdisablePadding\n\t\t\t\t\t\t\tclassName={classes.optionsList}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{options.map((option) => (\n\t\t\t\t\t\t\t\t<ListItem key={option.value} disablePadding>\n\t\t\t\t\t\t\t\t\t<ListItemButton onClick={handleSelect(option.value)}>\n\t\t\t\t\t\t\t\t\t\t<ListItemText>{option.label}</ListItemText>\n\t\t\t\t\t\t\t\t\t</ListItemButton>\n\t\t\t\t\t\t\t\t</ListItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SearchRulesEditorDropdownOptionsList>\n\t\t\t\t\t</SearchRulesEditorDropdownOptionsScrollBorder>\n\t\t\t\t</SearchRulesEditorDropdownOptions>\n\t\t\t</SearchRulesEditorDropdownMenu>\n\t\t</SearchRulesEditorDropdownRoot>\n\t);\n};\n\nexport const SearchRulesEditorDropdownPrimitive =\n\tSearchRulesEditorDropdownInner;\n\nexport const SearchRulesEditorDropdown = SearchRulesEditorDropdownPrimitive;\n\nexport default SearchRulesEditorDropdown;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"actions\", \"children\", \"defaultValue\", \"name\", \"onChange\", \"value\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport FormGroup from '../FormGroup';\nimport useForkRef from '../utils/useForkRef';\nimport useControlled from '../utils/useControlled';\nimport RadioGroupContext from './RadioGroupContext';\nimport useId from '../utils/useId';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst RadioGroup = /*#__PURE__*/React.forwardRef(function RadioGroup(props, ref) {\n const {\n // private\n // eslint-disable-next-line react/prop-types\n actions,\n children,\n defaultValue,\n name: nameProp,\n onChange,\n value: valueProp\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const rootRef = React.useRef(null);\n const [value, setValueState] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: 'RadioGroup'\n });\n React.useImperativeHandle(actions, () => ({\n focus: () => {\n let input = rootRef.current.querySelector('input:not(:disabled):checked');\n\n if (!input) {\n input = rootRef.current.querySelector('input:not(:disabled)');\n }\n\n if (input) {\n input.focus();\n }\n }\n }), []);\n const handleRef = useForkRef(ref, rootRef);\n\n const handleChange = event => {\n setValueState(event.target.value);\n\n if (onChange) {\n onChange(event, event.target.value);\n }\n };\n\n const name = useId(nameProp);\n return /*#__PURE__*/_jsx(RadioGroupContext.Provider, {\n value: {\n name,\n onChange: handleChange,\n value\n },\n children: /*#__PURE__*/_jsx(FormGroup, _extends({\n role: \"radiogroup\",\n ref: handleRef\n }, other, {\n children: children\n }))\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? RadioGroup.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The content of the component.\n */\n children: PropTypes.node,\n\n /**\n * The default value. Use when the component is not controlled.\n */\n defaultValue: PropTypes.any,\n\n /**\n * The name used to reference the value of the control.\n * If you don't provide this prop, it falls back to a randomly generated name.\n */\n name: PropTypes.string,\n\n /**\n * Callback fired when a radio button is selected.\n *\n * @param {React.ChangeEvent<HTMLInputElement>} event The event source of the callback.\n * @param {string} value The value of the selected radio button.\n * You can pull out the new value by accessing `event.target.value` (string).\n */\n onChange: PropTypes.func,\n\n /**\n * Value of the selected radio button. The DOM API casts this to a string.\n */\n value: PropTypes.any\n} : void 0;\nexport default RadioGroup;","import React from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {FormControl, FormControlLabel, Radio, RadioGroup} from '@mui/material';\nimport {SearchMatchCriteriaLabel} from '../../locales';\nimport {SearchMatchCriteria} from '../../constants';\nimport {useSearchRulesStoreProvider} from '../../contexts/SearchRulesStoreContext';\n\nexport type SearchRulesMatchCriteriaSelectorProps = {\n\tvalue: number;\n\tonChange(value: number): void;\n};\n\nconst SearchRulesMatchCriteriaSelectorInner = ({\n\tvalue,\n\tonChange,\n}: SearchRulesMatchCriteriaSelectorProps) => {\n\treturn (\n\t\t<FormControl>\n\t\t\t<RadioGroup\n\t\t\t\trow\n\t\t\t\taria-label=\"Match type\"\n\t\t\t\tname=\"search-rules-match-criteria-group\"\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={(event, value) => onChange?.(parseInt(value))}\n\t\t\t>\n\t\t\t\t<FormControlLabel\n\t\t\t\t\tvalue={SearchMatchCriteria.AND}\n\t\t\t\t\tcontrol={<Radio />}\n\t\t\t\t\tlabel={SearchMatchCriteriaLabel[SearchMatchCriteria.AND]}\n\t\t\t\t/>\n\t\t\t\t<FormControlLabel\n\t\t\t\t\tvalue={SearchMatchCriteria.OR}\n\t\t\t\t\tcontrol={<Radio />}\n\t\t\t\t\tlabel={SearchMatchCriteriaLabel[SearchMatchCriteria.OR]}\n\t\t\t\t/>\n\t\t\t</RadioGroup>\n\t\t</FormControl>\n\t);\n};\n\nexport const SearchRulesMatchCriteriaSelectorPrimitive =\n\tSearchRulesMatchCriteriaSelectorInner;\n\nexport const SearchRulesMatchCriteriaSelector =\n\tSearchRulesMatchCriteriaSelectorPrimitive;\n\nexport default SearchRulesMatchCriteriaSelector;\n\nexport type SearchRulesMatchCriteriaSelectorContainerProps = Omit<\n\tSearchRulesMatchCriteriaSelectorProps,\n\t'value' | 'onChange'\n>;\n\nexport const SearchRulesMatchCriteriaSelectorContainer = observer(\n\t(props: SearchRulesMatchCriteriaSelectorContainerProps) => {\n\t\tconst {store} = useSearchRulesStoreProvider();\n\t\treturn (\n\t\t\t<SearchRulesMatchCriteriaSelector\n\t\t\t\t{...props}\n\t\t\t\tvalue={store.matchCriteria}\n\t\t\t\tonChange={(value) =>\n\t\t\t\t\tstore.setMatchCriteria(value || SearchMatchCriteria.AND)\n\t\t\t\t}\n\t\t\t/>\n\t\t);\n\t},\n);\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport const SEARCH_RULES_EDITOR_CLASS_NAME = 'SearchRulesEditor';\nexport const SEARCH_RULES_EDITOR_CLASS_SLOTS = ['root', 'form'] as const;\n\nexport type SearchRulesEditorClassSlot =\n\ttypeof SEARCH_RULES_EDITOR_CLASS_SLOTS[number];\n\nexport interface SearchRulesEditorClasses {\n\troot: string;\n\tform: string;\n}\n\nexport type SearchRulesEditorClassKey = keyof SearchRulesEditorClasses;\n\nexport const getSearchRulesEditorUtilityClass = (\n\tslot: SearchRulesEditorClassSlot,\n) => generateUtilityClass(SEARCH_RULES_EDITOR_CLASS_NAME, slot);\n\nexport const searchRulesEditorClasses: SearchRulesEditorClasses =\n\tgenerateUtilityClasses(SEARCH_RULES_EDITOR_CLASS_NAME, ['root', 'form']);\n\nexport default searchRulesEditorClasses;\n","import React, {FormEvent} from 'react';\nimport clsx from 'clsx';\nimport {observer} from 'mobx-react-lite';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faUndo} from '@fortawesome/pro-solid-svg-icons';\nimport {Box, Collapse} from '@mui/material';\nimport {Alert} from '@netx/core-components/Alert';\nimport {Form} from '@netx/core-components/Form/Form';\nimport Button from '@netx/core-components/Button';\nimport {SubmitButton} from '@netx/core-components/SubmitButton';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {useSearchRulesStoreProvider} from '../../contexts';\nimport type {SearchMatchCriteria} from '../../constants';\nimport {\n\tSearchDataUnavailableMessage,\n\tSearchRulesActionLabel,\n} from '../../locales';\nimport type {SearchType} from '../../rules/constants';\nimport type {SearchRule} from '../../rules/types';\nimport {\n\tSearchRulesEditorListContainer,\n\tSearchRulesEditorListContainerProps,\n} from '../SearchRulesEditorList';\nimport {SearchRulesEditorDropdown} from './SearchRulesEditorDropdown';\nimport {SearchRulesMatchCriteriaSelectorContainer} from './SearchRulesMatchCriteriaSelector';\nimport {\n\tsearchRulesEditorClasses,\n\tgetSearchRulesEditorUtilityClass,\n\tSearchRulesEditorClasses,\n\tSEARCH_RULES_EDITOR_CLASS_NAME,\n} from './searchRulesEditorClasses';\n\nexport type SearchRulesEditorOwnerState = WithClasses<\n\tSearchRulesEditorClasses,\n\t{}\n>;\n\nconst useUtilityClasses = (ownerState: SearchRulesEditorOwnerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t\tform: ['form'],\n\t};\n\treturn composeClasses(slots, getSearchRulesEditorUtilityClass, classes);\n};\n\nconst SearchRulesEditorAlertCollapse = styled(Collapse)(({theme}) => ({\n\t//width: 'calc(100% - 28px)',\n\tflex: '0 0 auto',\n}));\n\nconst SearchRulesEditorRoot = styled('div', {\n\tname: SEARCH_RULES_EDITOR_CLASS_NAME,\n\tslot: 'Root',\n})(({theme}) => ({\n\t...theme.mixins.flexFillColumn,\n\toverflow: 'hidden',\n\tpadding: 0,\n\twidth: '100%',\n}));\n\nconst SearchRulesEditorHeader = styled('div', {\n\tname: SEARCH_RULES_EDITOR_CLASS_NAME,\n\tslot: 'Header',\n})(({theme}) => ({\n\talignItems: 'center',\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\toverflow: 'hidden',\n\tpadding: theme.spacing(1, 2, 2, 2),\n}));\n\nconst SearchRulesEditorFooter = styled('div', {\n\tname: SEARCH_RULES_EDITOR_CLASS_NAME,\n\tslot: 'Footer',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tjustifyContent: 'flex-end',\n\tpadding: theme.spacing(2),\n}));\n\nconst SearchRulesEditorForm = styled(Form, {\n\tname: SEARCH_RULES_EDITOR_CLASS_NAME,\n\tslot: 'Form',\n})(({theme}) => ({\n\t...theme.mixins.flexFillColumn,\n\toverflow: 'hidden',\n}));\n\nconst SearchRulesEditorDropdownRoot = styled(SearchRulesEditorDropdown)(\n\t({theme}) => ({\n\t\tmarginRight: theme.spacing(3),\n\t}),\n);\n\nconst SearchRulesEditorAlert = styled(Alert)(({theme}) => ({\n\tmargin: theme.spacing(0, 2, 1, 2),\n}));\n\nexport type SearchRulesEditorProps = WithClasses<\n\tSearchRulesEditorClasses,\n\tOmit<SearchRulesEditorListContainerProps, 'ref'> & {\n\t\tref?: React.RefObject<HTMLDivElement>;\n\t\tdisableAdd?: boolean;\n\t\tlistRef?: React.RefObject<HTMLDivElement>;\n\t\tisValid: boolean;\n\t\tisSomeDataUnavailable?: boolean;\n\t\tloading?: boolean;\n\t\tonAddNewRule: (type?: SearchType) => void;\n\t\tonResetRules: () => void;\n\t\tonSubmit: () => void;\n\t}\n>;\n\nconst SearchRulesEditorInner = (\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\t\tdisableAdd,\n\t\tlistRef,\n\t\tisSomeDataUnavailable,\n\t\tisValid,\n\t\tloading,\n\t\tonAddNewRule,\n\t\tonResetRules,\n\t\tonSubmit,\n\t\t...props\n\t}: SearchRulesEditorProps,\n\tref: React.RefObject<HTMLDivElement>,\n) => {\n\tconst ownerState: SearchRulesEditorOwnerState = {\n\t\tclasses: _classes,\n\t\tclassName,\n\t};\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst handleSumbit = async (event: FormEvent) => {\n\t\tevent.preventDefault();\n\t\tonSubmit();\n\t};\n\n\treturn (\n\t\t<SearchRulesEditorRoot ref={ref} className={clsx(classes.root, className)}>\n\t\t\t<SearchRulesEditorAlertCollapse in={isSomeDataUnavailable}>\n\t\t\t\t<SearchRulesEditorAlert severity=\"warning\">\n\t\t\t\t\t{SearchDataUnavailableMessage}\n\t\t\t\t</SearchRulesEditorAlert>\n\t\t\t</SearchRulesEditorAlertCollapse>\n\n\t\t\t<SearchRulesEditorHeader>\n\t\t\t\t<SearchRulesEditorDropdownRoot\n\t\t\t\t\tdisabled={disableAdd}\n\t\t\t\t\tonSelect={onAddNewRule}\n\t\t\t\t/>\n\t\t\t\t<SearchRulesMatchCriteriaSelectorContainer />\n\n\t\t\t\t<Box sx={{flex: '1 1 auto'}} />\n\n\t\t\t\t<Button\n\t\t\t\t\tstartIcon={<FontAwesomeIcon style={{marginLeft: 4}} icon={faUndo} />}\n\t\t\t\t\tsx={{marginLeft: 1}}\n\t\t\t\t\tonClick={onResetRules}\n\t\t\t\t>\n\t\t\t\t\t{SearchRulesActionLabel.RESET}\n\t\t\t\t</Button>\n\t\t\t</SearchRulesEditorHeader>\n\n\t\t\t<SearchRulesEditorForm className={classes.form} onSubmit={handleSumbit}>\n\t\t\t\t<SearchRulesEditorListContainer\n\t\t\t\t\t{...props}\n\t\t\t\t\tref={listRef}\n\t\t\t\t\tloading={loading}\n\t\t\t\t/>\n\t\t\t\t<SearchRulesEditorFooter>\n\t\t\t\t\t<SubmitButton\n\t\t\t\t\t\tdisabled={!isValid}\n\t\t\t\t\t\tonClick={onSubmit}\n\t\t\t\t\t\tlabel={SearchRulesActionLabel.SEARCH}\n\t\t\t\t\t/>\n\t\t\t\t</SearchRulesEditorFooter>\n\t\t\t</SearchRulesEditorForm>\n\t\t</SearchRulesEditorRoot>\n\t);\n};\n\nexport const SearchRulesEditorPrimitive = React.forwardRef(\n\tSearchRulesEditorInner,\n) as (props: SearchRulesEditorProps) => JSX.Element;\n\nexport const SearchRulesEditor = observer(SearchRulesEditorPrimitive);\n\nexport default SearchRulesEditor;\n\nexport type SearchRulesEditorContainerSubmitData = {\n\trules: SearchRule[];\n\tmatchCriteria: SearchMatchCriteria;\n};\n\nexport type SearchRulesEditorContainerProps = Omit<\n\tSearchRulesEditorProps,\n\t| 'isSomeDataUnavailable'\n\t| 'isValid'\n\t| 'store'\n\t| 'onAddNewRule'\n\t| 'onResetRules'\n\t| 'onSubmit'\n> & {\n\tonSubmit(submitData: SearchRulesEditorContainerSubmitData): void;\n};\n\nexport const SearchRulesEditorContainer = observer(\n\t({onSubmit, ...props}: SearchRulesEditorContainerProps) => {\n\t\tconst {store} = useSearchRulesStoreProvider();\n\n\t\tconst handleSubmit = () => {\n\t\t\tonSubmit({\n\t\t\t\trules: store.getRules(),\n\t\t\t\tmatchCriteria: store.matchCriteria,\n\t\t\t});\n\t\t};\n\n\t\treturn (\n\t\t\t<SearchRulesEditor\n\t\t\t\t// TODO: maxItems prop\n\t\t\t\tdisableAdd={store.rules.length >= 10}\n\t\t\t\t{...props}\n\t\t\t\tisValid={store.isValid}\n\t\t\t\tisSomeDataUnavailable={store.isSomeDataUnavailable}\n\t\t\t\tonAddNewRule={store.addRule.bind(store)}\n\t\t\t\tonResetRules={store.reset.bind(store)}\n\t\t\t\tonSubmit={handleSubmit}\n\t\t\t/>\n\t\t);\n\t},\n);\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\nimport {observer} from 'mobx-react-lite';\nimport {faSearch} from '@fortawesome/pro-solid-svg-icons';\nimport {Dialog, DialogProps} from '@netx/core-components/Dialog';\nimport {styled} from '@netx/core-components/Theme';\nimport type {SearchMatchCriteria} from '../../constants';\nimport {SearchRulesStoreProvider} from '../../contexts/SearchRulesStoreContext';\nimport type {SearchRule} from '../../rules/types';\nimport {\n\tSearchRulesEditorContainer,\n\tSearchRulesEditorContainerProps,\n} from './SearchRulesEditor';\n\nconst SearchRulesEditorDialogRoot = styled(Dialog)(({theme}) => ({\n\t'& > .MuiDialog-container > .MuiPaper-root': {\n\t\tminHeight: 336,\n\t\tmaxHeight: `calc(100% - 96px)`,\n\t\theight: 600,\n\t},\n}));\n\nexport type SearchRulesEditorDialogProps = SearchRulesEditorContainerProps & {\n\topen: boolean;\n\tonClose?: () => void;\n\tDialogProps?: Partial<Omit<DialogProps, 'onClose' | 'open' | 'ref'>>;\n};\n\nconst SearchRulesEditorDialogInner = (\n\t{onClose, loading, open, DialogProps, ...props}: SearchRulesEditorDialogProps,\n\tref: DialogProps['ref'],\n) => {\n\treturn (\n\t\t<SearchRulesEditorDialogRoot\n\t\t\tfullWidth\n\t\t\ticon={faSearch}\n\t\t\tisWorking={loading}\n\t\t\tmaxWidth=\"lg\"\n\t\t\tpreventBackdropClose\n\t\t\ttitle={i18n.t('i18n.advancedSearch')}\n\t\t\t{...DialogProps}\n\t\t\topen={open}\n\t\t\tref={ref}\n\t\t\tonClose={onClose}\n\t\t>\n\t\t\t<SearchRulesEditorContainer {...props} loading={loading} />\n\t\t</SearchRulesEditorDialogRoot>\n\t);\n};\n\nexport const SearchRulesEditorDialogPrimtive = React.forwardRef(\n\tSearchRulesEditorDialogInner,\n) as (\n\tprops: SearchRulesEditorDialogProps,\n\tref: DialogProps['ref'],\n) => JSX.Element;\n\nexport const SearchRulesEditorDialog = observer(\n\tSearchRulesEditorDialogPrimtive,\n);\n\nexport default SearchRulesEditorDialog;\n\nexport type SearchRulesEditorDialogContainerProps =\n\tSearchRulesEditorDialogProps & {\n\t\tsearchId?: number;\n\t\trules?: SearchRule[];\n\t\tmatchCriteria?: SearchMatchCriteria;\n\t};\n\nexport const SearchRulesEditorDialogContainer = ({\n\tmatchCriteria,\n\trules,\n\tsearchId,\n\t...props\n}: SearchRulesEditorDialogContainerProps) => {\n\treturn (\n\t\t<SearchRulesStoreProvider\n\t\t\tmatchCriteria={matchCriteria}\n\t\t\trules={rules}\n\t\t\tsavedSearchId={searchId}\n\t\t>\n\t\t\t{({loading}) => {\n\t\t\t\treturn <SearchRulesEditorDialog loading={loading} {...props} />;\n\t\t\t}}\n\t\t</SearchRulesStoreProvider>\n\t);\n};\n","import Base from '@netx/core/lib/netx-react-view';\n\nimport {withTheme} from '@netx/core-components/Theme';\nimport {withContextMenu} from '@netx/core-components/ContextMenu';\nimport {withConfirmation} from '@netx/core-components/Confirmation';\nimport {withSnackbar} from '@netx/core-components/Snackbar';\nimport {SearchRulesEditorDialogContainer} from '../components/SearchRulesEditor';\nimport type {SearchMatchCriteria} from '../constants';\nimport type {SearchRule} from '../rules/types';\n\nconst Component = withTheme(\n\twithContextMenu(\n\t\twithSnackbar(withConfirmation(SearchRulesEditorDialogContainer)),\n\t),\n);\n\ntype SearchCriteria = {\n\trules: SearchRule[];\n\tmatchCriteria?: SearchMatchCriteria;\n};\n\ntype SubmitData = Required<SearchCriteria>;\n\nexport type SearchEditorViewOptions = {\n\tsearchCriteria?: SearchCriteria;\n\tsearchId?: number;\n\topen?: boolean;\n\tonSubmit(submitData: SubmitData): void;\n};\n\nexport class SearchEditorView extends Base {\n\topen: boolean;\n\tsearchId?: number;\n\tsearchCriteria?: SearchCriteria;\n\n\tonSubmit: SearchEditorViewOptions['onSubmit'];\n\n\tconstructor(opts: SearchEditorViewOptions) {\n\t\tsuper(opts);\n\n\t\tthis.open = opts.open !== false;\n\t\tthis.searchId = opts.searchId;\n\t\tthis.searchCriteria = opts.searchCriteria;\n\t\tthis.onSubmit = opts.onSubmit;\n\t}\n\n\trender() {\n\t\treturn super.render(Component, {\n\t\t\topen: this.open,\n\t\t\tsearchId: this.searchId,\n\t\t\trules: this.searchCriteria?.rules,\n\t\t\tmatchCriteria: this.searchCriteria?.matchCriteria,\n\t\t\tonSubmit: this.onSubmit,\n\t\t\tonClose: () => {\n\t\t\t\tthis.open = false;\n\t\t\t\tthis.render();\n\t\t\t},\n\t\t\tDialogProps: {\n\t\t\t\tTransitionProps: {\n\t\t\t\t\tonExited: () => this.remove(),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\tstatic get __name__() {\n\t\treturn 'SearchEditorView';\n\t}\n}\n\nexport default SearchEditorView;\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport _ from 'underscore';\n\nimport {SearchMatchCriteria} from '@netx/core-search-rules/constants';\nimport type {SearchRule} from '@netx/core-search-rules/rules/types';\nimport {convertToRules} from '@netx/core-search-rules/utils/convertToRules';\nimport {encodeBase64Rules} from '@netx/core-search-rules/utils/encodeBase64Rules';\nimport {getUserSort} from '@netx/core-search-rules/utils/getUserSort';\nimport {SEARCH_RULES_EVENT, SEARCH_RULES_BASE_EVENT} from './actions';\nimport {SearchEditorView, SearchEditorViewOptions} from './views';\n\ndispatcher.once(`${SEARCH_RULES_BASE_EVENT}:init`, () => {\n\tNetx.router.on(`route:search:rules:edit`, () => {\n\t\tdispatcher.trigger(SEARCH_RULES_EVENT.EDIT_SEARCH);\n\t});\n\n\tlet routeRemoved = false;\n\tlet editView: SearchEditorView | undefined;\n\n\tconst routeListener = (newRoute: string, previousRoute: string) => {\n\t\tif (!editView) return;\n\t\trouteRemoved = true;\n\t\teditView.open = false;\n\t\teditView.render();\n\t};\n\n\tdispatcher.on(\n\t\t`${SEARCH_RULES_EVENT.EDIT_SEARCH}:show`,\n\t\t(viewOptions: Partial<SearchEditorViewOptions>) => {\n\t\t\tdispatcher.off('routed', routeListener);\n\n\t\t\trouteRemoved = false;\n\n\t\t\tif (!editView) {\n\t\t\t\teditView = new SearchEditorView({\n\t\t\t\t\tonSubmit: ({\n\t\t\t\t\t\trules,\n\t\t\t\t\t\tmatchCriteria = SearchMatchCriteria.AND,\n\t\t\t\t\t}: {\n\t\t\t\t\t\trules: SearchRule[];\n\t\t\t\t\t\tmatchCriteria: SearchMatchCriteria;\n\t\t\t\t\t}) => {\n\t\t\t\t\t\tconst rulesObject = convertToRules(...rules);\n\t\t\t\t\t\tconst encodedRules = encodeBase64Rules({\n\t\t\t\t\t\t\t...rulesObject,\n\t\t\t\t\t\t\t...getUserSort(),\n\t\t\t\t\t\t\tmatchCriteria,\n\t\t\t\t\t\t});\n\t\t\t\t\t\teditView!.open = false;\n\t\t\t\t\t\teditView!.render();\n\t\t\t\t\t\tNetx.router.navigate(`search/advanced/${encodedRules}`, true);\n\t\t\t\t\t\t// TODO: firing this off for reset listeners in constitutents stuff\n\t\t\t\t\t\t// when that gets switched over to react/contexts we can kill this event altogether\n\t\t\t\t\t\tdispatcher.trigger('search:advanced:submit');\n\t\t\t\t\t},\n\t\t\t\t\t...viewOptions,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\teditView.open = viewOptions?.open !== false;\n\t\t\t\teditView.searchId = viewOptions?.searchId;\n\t\t\t\teditView.searchCriteria = viewOptions?.searchCriteria;\n\t\t\t\teditView.onSubmit = viewOptions?.onSubmit || editView.onSubmit;\n\t\t\t}\n\n\t\t\teditView.render().on('removed', () => {\n\t\t\t\tdispatcher.off('route', routeListener);\n\t\t\t\teditView = undefined;\n\t\t\t\tif (!routeRemoved && (viewOptions as any).isRouted) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!(viewOptions as any).routeMatch ||\n\t\t\t\t\t\twindow.location.hash === `#${(viewOptions as any).routeMatch}`\n\t\t\t\t\t) {\n\t\t\t\t\t\tNetx.router.back();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_.defer(() => {\n\t\t\t\t// remove if route changes\n\t\t\t\tdispatcher.once('routed', routeListener);\n\t\t\t});\n\t\t},\n\t);\n\n\tdispatcher.on(\n\t\tSEARCH_RULES_EVENT.EDIT_SEARCH,\n\t\t(opts: SearchEditorViewOptions) =>\n\t\t\tdispatcher.trigger(`${SEARCH_RULES_EVENT.EDIT_SEARCH}:show`, opts),\n\t);\n\n\tdispatcher\n\t\t.trigger(`${SEARCH_RULES_BASE_EVENT}:extend`)\n\t\t.trigger(`${SEARCH_RULES_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${SEARCH_RULES_BASE_EVENT}:initialized`, () =>\n\t\t\t\tresolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${SEARCH_RULES_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import {action, makeObservable, observable} from 'mobx';\nimport {SearchMatchCriteria} from '@netx/core-search-rules/constants';\nimport {createKeywordRule} from '@netx/core-search-rules/rules/keyword/keywordRule';\nimport type {SearchRule} from '@netx/core-search-rules/rules/types';\n\n/**\n * Cache last search criteria\n * @todo improve\n */\nclass SearchCriteriaCache {\n\tmatchCriteria: SearchMatchCriteria = SearchMatchCriteria.AND;\n\trules = observable.array<SearchRule>([createKeywordRule({keyword: ''})]);\n\n\tconstructor() {\n\t\tmakeObservable(this, {\n\t\t\tmatchCriteria: observable,\n\t\t\trules: observable,\n\t\t\tupdate: action,\n\t\t});\n\t}\n\n\tupdate(rules?: SearchRule[], matchCriteria?: SearchMatchCriteria) {\n\t\tif (rules != null) this.rules.replace(rules);\n\t\tif (matchCriteria != null) this.matchCriteria = matchCriteria;\n\t}\n}\n\nexport const searchCriteriaCache = new SearchCriteriaCache();\n\nexport default searchCriteriaCache;\n","import {visualSearchEnabled} from '@netx/core-search-visual/enablers';\n\nconst routes = {\n\t'search/edit': 'search:rules:edit',\n\t/**\n\t * @route\n\t * @param {base64} string Base64 encoded search object representing a set of advanced search rules\n\t * @param {number} page Page number\n\t * @fires module:search#search:routed\n\t */\n\t'search/advanced(/:string)(/page/:page)'(string, page) {\n\t\tdispatcher.trigger('search:routed', 'advanced', string, page);\n\t},\n\n\t/**\n\t * @route\n\t * @param {string} string Basic search substring\n\t * @param {number} page Page number\n\t * @fires module:search#search:routed\n\t */\n\t'search/basic/*string(/page/:page)'(string, page) {\n\t\tdispatcher.trigger('search:routed', 'basic', string, page);\n\t},\n\n\t/**\n\t * @route\n\t * @param {string} string Exact search string\n\t * @param {number} page Page number\n\t * @fires module:search#search:routed\n\t */\n\t'search/exact/*string(/page/:page)'(string, page) {\n\t\tdispatcher.trigger('search:routed', 'exact', string, page);\n\t},\n\n\t/**\n\t * Displays the landing page for saved searches\n\t * @route\n\t * @fires module:search#search:saved:routed\n\t * @fires module:search#search:saved:landing:routed\n\t */\n\t'search/saved(/:id)(/page/:page)'(id, page) {\n\t\t// routing to specific saved cart\n\t\tif (id && !isNaN(parseInt(id))) {\n\t\t\tdispatcher.trigger('search:saved:routed', id, page);\n\t\t}\n\t\t// routing to landing page\n\t\telse {\n\t\t\tdispatcher.trigger('search:saved:landing:routed');\n\t\t}\n\t},\n\n\t/**\n\t * forward this route\n\t * @route\n\t * @deprecated\n\t */\n\t'search/:id/pdf'(id) {\n\t\tconsole.warn('search/:id/pdf route is way deprecated, gone in 8.10.');\n\t\tNetx.router.reroute('search/' + id, true);\n\t},\n};\n\n// NOTE: you can use RegExps as route strings, but only if you\n// call router.route() directly; the _extend pattern doesn't work for that.\n//\n// This routes should only target numeric ids, so we need regexps here.\nNetx.router.route(/^search\\/(\\d+)\\/share/, function (id) {\n\tid = parseInt(id, 10);\n\tdispatcher.trigger('share:search:saved', id);\n});\n\nif (Netx.getPreference('metadata.history.enabled', true)) {\n\t_.extend(routes, {\n\t\t/**\n\t\t * @route\n\t\t * @param {base64} string Base64 encoded search object representing a set of attribute history search rules\n\t\t * @param {number} page Page number\n\t\t * @fires module:search#search:routed\n\t\t */\n\t\t'search/attribute/history/:string/page/:page'(string, page) {\n\t\t\tdispatcher.trigger('search:routed', 'attributeHistory', string, page);\n\t\t},\n\t\t'search/attribute/history(/:string)'(string) {\n\t\t\tdispatcher.trigger('search:routed', 'attributeHistory', string);\n\t\t},\n\t});\n}\n\n// Video clip search routes\nif (\n\tNetx.getUserLevel() >= 2 &&\n\tNetx.getPreference('asset.constituent.videoClips.enabled', true)\n) {\n\t_.extend(routes, {\n\t\t/**\n\t\t * Right now we are only supporting basic clip searches\n\t\t * @route\n\t\t * @param {string} string Basic search substring\n\t\t * @fires module:search#search:routed\n\t\t */\n\t\t'search/clip/basic/*string/page/:page'(string, page) {\n\t\t\tdispatcher.trigger('search:routed', 'clip:basic', string, page);\n\t\t},\n\t\t'search/clip/basic/*string'(string) {\n\t\t\tdispatcher.trigger('search:routed', 'clip:basic', string);\n\t\t},\n\t});\n}\n\n// Visual search routes\nif (visualSearchEnabled()) {\n\t_.extend(routes, {\n\t\t/**\n\t\t * @route\n\t\t * @param {string} string Visaul asset id\n\t\t * @fires module:search#search:routed\n\t\t */\n\t\t'search/visual/asset/*string/page/:page'(string, page) {\n\t\t\tdispatcher.trigger('search:routed', 'visual:asset', string, page);\n\t\t},\n\t\t'search/visual/asset/*string'(string) {\n\t\t\tdispatcher.trigger('search:routed', 'visual:asset', string);\n\t\t},\n\t\t/**\n\t\t * @route\n\t\t * @param {string} string Visual color substring\n\t\t * @fires module:search#search:routed\n\t\t */\n\t\t'search/visual/color/*string/page/:page'(string, page) {\n\t\t\tdispatcher.trigger('search:routed', 'visual:color', string, page);\n\t\t},\n\t\t'search/visual/color/*string'(string) {\n\t\t\tdispatcher.trigger('search:routed', 'visual:color', string);\n\t\t},\n\t});\n}\n\nexport default routes;\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport type {AssetId} from '@netx/core-asset/types';\nimport {searchCriteriaCache} from '@netx/core-search/cache';\nimport {SearchMatchCriteria} from '@netx/core-search-rules';\nimport {createVisualRule} from '@netx/core-search-rules/rules/visual/visualRule';\nimport {VisualType} from '@netx/core-search-rules/rules/visual/constants';\nimport {convertToRules} from '@netx/core-search-rules/utils/convertToRules';\nimport {SEARCH_VISUAL_EVENT, SEARCH_VISUAL_BASE_EVENT} from './actions';\n\ndispatcher.once(`${SEARCH_VISUAL_BASE_EVENT}:init`, () => {\n\tdispatcher.on(SEARCH_VISUAL_EVENT.ASSET, (assetId: AssetId, page: string) => {\n\t\tconst pageNo = parseInt(page) || 1;\n\t\tdispatcher.trigger('search:mode', 'visual:asset');\n\n\t\t// Make sure the route is reflected\n\t\tNetx.router.navigate(\n\t\t\t`search/visual/asset/${assetId}/page/${pageNo}`,\n\t\t\tfalse,\n\t\t);\n\n\t\tconst searchRule = createVisualRule({\n\t\t\ttype: VisualType.ASSET,\n\t\t\tassetId,\n\t\t});\n\n\t\tsearchCriteriaCache.update([searchRule], SearchMatchCriteria.AND);\n\n\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\tconditions: convertToRules(searchRule),\n\t\t\tpage: pageNo,\n\t\t});\n\t});\n\n\tdispatcher.on(SEARCH_VISUAL_EVENT.COLOR, (color: string, page: string) => {\n\t\tdispatcher.trigger('search:mode', 'visual:color');\n\n\t\tconst searchRule = createVisualRule({\n\t\t\ttype: VisualType.COLOR,\n\t\t\tcolor,\n\t\t});\n\n\t\tsearchCriteriaCache.update([searchRule], SearchMatchCriteria.AND);\n\n\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\tconditions: convertToRules(searchRule),\n\t\t\tpage: parseInt(page) || 1,\n\t\t});\n\t});\n\n\tdispatcher.trigger(`${SEARCH_VISUAL_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${SEARCH_VISUAL_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${SEARCH_VISUAL_BASE_EVENT}:initialized`, () =>\n\t\t\t\tresolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${SEARCH_VISUAL_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport SearchAssetsCollecion from '@netx/core-search/collections/searchAssets';\nimport SavedSearchModel from '@netx/core-search/models/savedSearch';\nimport {SearchCriteria} from '@netx/core-search-rules';\nimport {convertRulesToCollection} from '@netx/core-search-rules/utils/convertRulesToCollection';\nimport {SEARCH_SAVED_EVENT, SEARCH_SAVED_BASE_EVENT} from './actions';\nimport type {SavedSearch} from './types';\nimport {SEARCH_RULES_EVENT} from '@netx/core-search-rules/actions';\n\ndispatcher.once(`${SEARCH_SAVED_BASE_EVENT}:init`, () => {\n\tdispatcher.on(SEARCH_SAVED_EVENT.CREATE, (criteria: SearchCriteria) => {\n\t\tconst collection = new SearchAssetsCollecion([]);\n\t\tcollection.selection = convertRulesToCollection(criteria);\n\t\tdispatcher.trigger('search:save', collection);\n\t});\n\n\tdispatcher.on(SEARCH_SAVED_EVENT.DELETE, (savedSearch: SavedSearch) => {\n\t\tconst model = new SavedSearchModel(savedSearch);\n\t\tdispatcher.trigger(`search:saved:delete`, model);\n\t});\n\n\tdispatcher.on(SEARCH_SAVED_EVENT.DOWNLOAD, (savedSearch: SavedSearch) => {\n\t\tdispatcher.trigger(`share:search:download`, savedSearch.id);\n\t});\n\n\tdispatcher.on(SEARCH_SAVED_EVENT.CREATE_PDF, (savedSearch: SavedSearch) => {\n\t\tconst model = new SavedSearchModel(savedSearch);\n\t\tdispatcher.trigger(`share:search:gallery:createPDF`, model);\n\t});\n\n\tdispatcher.on(SEARCH_SAVED_EVENT.MENU, (savedSearch: SavedSearch) => {\n\t\tconst model = new SavedSearchModel(savedSearch);\n\t\tdispatcher.trigger(`share:menu`, model);\n\t});\n\n\tdispatcher.on(SEARCH_SAVED_EVENT.VIEW, (savedSearch: SavedSearch) => {\n\t\tdispatcher.trigger(SEARCH_RULES_EVENT.EDIT_SEARCH, {\n\t\t\tsearchId: savedSearch.id,\n\t\t});\n\t});\n\n\tdispatcher.trigger(`${SEARCH_SAVED_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${SEARCH_SAVED_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${SEARCH_SAVED_BASE_EVENT}:initialized`, () =>\n\t\t\t\tresolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${SEARCH_SAVED_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","/**\n * The search module handles custom & simplified asset searches\n *\n * @module search\n */\n\nimport SavedSearchDispatchListeners from '@netx/core-search/controllers/savedSearchController';\n\n// Collections\nimport AssetSearchRulesCollection from './collections/searchRules_assets';\nimport ClipSearchRulesCollection from './collections/searchRules_clips';\nimport ClipSearchConstituentsCollection from './collections/searchConstituents_clips';\nimport SearchAssetsCollection from './collections/searchAssets';\nimport SearchAttributeHistoryRulesCollection from './collections/searchAttributeHistoryRules';\n\n// Views\nimport SearchGalleryView from './views/searchGalleryView';\nimport SearchConstituentsGalleryView from './views/searchConstituentsGalleryView';\nimport SearchConstituentsGalleryHeaderView from './views/searchConstituentsGalleryHeaderView';\nimport SearchConstituentsListView_clips from './views/searchConstituentsListView_clips';\nimport {getPreference} from '@netx/core-user/utils/getPreference';\n\nimport {SearchMatchCriteria} from '@netx/core-search-rules/constants';\nimport {\n\tcreateCategoryIdRule,\n\tCategoryType,\n} from '@netx/core-search-rules/rules/categoryId';\nimport {\n\tcreateKeywordRule,\n\tKeywordType,\n} from '@netx/core-search-rules/rules/keyword';\nimport {\n\tcreateMetadataRule,\n\tMetadataType,\n} from '@netx/core-search-rules/rules/metadata';\nimport {createSavedSearchRule} from '@netx/core-search-rules/rules/savedSearch/savedSearchRule';\nimport {convertRulesToRuleObjects} from '@netx/core-search-rules/utils/convertRulesToRuleObjects';\nimport {convertToRules} from '@netx/core-search-rules/utils/convertToRules';\nimport {decodeBase64Rules} from '@netx/core-search-rules/utils/decodeBase64Rules';\nimport {encodeBase64Rules} from '@netx/core-search-rules/utils/encodeBase64Rules';\n\nimport {SEARCH_RULES_EVENT} from '@netx/core-search-rules/actions';\nimport SearchRulesController from '@netx/core-search-rules/controller';\nimport {searchCriteriaCache} from './cache';\nimport customConfig from './config';\nimport routes from './routes';\n\nimport {\n\tassets as searchAssets,\n\tdateSubTypes1_default,\n\tmodes as searchModes,\n\tsystemAttributes as searchableSystemAttributes,\n} from './properties/search';\n\nimport {isEscapedURI} from '@netx/core/lib/underscore-netx';\nimport {ids as assetAttributeTypeIds} from '@netx/core-asset/properties/attributes';\nimport {checksumEnabled} from '@netx/core-asset/enablers';\n\nimport savedCartsSingleton from './collections/singleton/savedSearch';\nimport {visualSearchEnabled} from '@netx/core-search-visual/enablers';\nimport SearchVisualController from '@netx/core-search-visual/controller';\nimport SavedSearchController from '@netx/core-search-saved/controller';\n\n//=================================\n//\tSHAREABLE TYPES\n//=================================\n// Define shareable types introduced by this module.\n_.extend(Netx.ShareableTypes, {\n\t'saved search': {\n\t\tlabel: i18n.t('i18n.savedSearch'),\n\t},\n});\n//=================================\n//\t!SHAREABLE TYPES\n//=================================\n\n//=================================\n//\tINIT\n//=================================\n/**\n * @event module:search#search:init\n * @fires module:search#search:extend\n * @fires module:search#search:initialized\n */\ndispatcher.once('search:init', function (options) {\n\t// Instances\n\tvar NS = (Netx.search = {\n\t\trules: {\n\t\t\tassets: new AssetSearchRulesCollection([\n\t\t\t\t{\n\t\t\t\t\telementType: 1,\n\t\t\t\t\telementSubType1: 4,\n\t\t\t\t},\n\t\t\t]),\n\t\t},\n\t\tmode: 'basic', // clip\n\t});\n\tNS.options = options = _.extend({}, customConfig, options);\n\n\tvar appViews = Netx.app.appViews,\n\t\tmodalViews = Netx.app.modalViews;\n\n\t// Search assets collection\n\tNS.assets = new SearchAssetsCollection([]);\n\t// Re-fetch when attributes change\n\tNS.assets.listenTo(dispatcher, 'asset:attributes:updated', () => {\n\t\tthis.syncedOnce && this.fetch();\n\t});\n\n\tNS.bootstrap = [\n\t\tSavedSearchController.initialize(),\n\t\tSearchRulesController.initialize(),\n\t\tvisualSearchEnabled() ? SearchVisualController.initialize() : true,\n\t];\n\n\t// Fetch the DAM lists of file types & format families into search/properties/search\n\tNS.rules.assets.fetchSearchCriteria();\n\n\t// Saved searches\n\tNS.saved = {\n\t\tall: savedCartsSingleton.allSavedSearches,\n\t\tfavorite: savedCartsSingleton.favoriteSavedSearches,\n\t};\n\n\tif (!visualSearchEnabled()) {\n\t\tdelete searchModes['visual:color'];\n\t\tvar searchOptions = searchAssets.elementTypes.options;\n\t\tvar idx = _.indexOf(searchOptions, _.findWhere(searchOptions, {val: 27}));\n\t\tif (idx) {\n\t\t\tsearchOptions = searchOptions.splice(idx, 1);\n\t\t}\n\t}\n\n\t// Valid user\n\tif (Netx.getUserLevel() > 0) {\n\t\t// Fetch saved searches\n\t\tNS.saved.all.fetch();\n\n\t\t// Deal with date search types related to attribute templates\n\t\t// TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO\n\t\t// We need to make a collection for our advanced search rule individual things, populate it with the defined properties\n\t\t// and then that collection can listen for these events and handle this itself - I moved this here now because\n\t\t// I was dealing with some search related stuff and it struck me that attributes collection was far to involved\n\t\t// in module it should know nothing about - attribtues do not depend on search but some things in search depend\n\t\t// on attribute - so this is the best place until we manage the advanced rules in a more backbone friendly manner.\n\t\t// Also, if we do not turn these advanced search options in to collection - how will we know to update advanced search\n\t\t// when options on properties are changed?\n\t\t// This cannot go in SearchRules collection as we create a lot of those - and really, our search rule options are getting\n\t\t// advanced enough (and the template messy enough) that it is about time we think about moving over to models/collections\n\t\t// TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO\n\t\t// https://jira.netx.net/browse/DAM-9364\n\t\t+(function () {\n\t\t\tvar advancedSearchDate = searchAssets.elementSubType1s[4];\n\n\t\t\t// Deal with search types based on user prefs\n\t\t\t// Expiration enabled?\n\t\t\tif (Netx.getPreference('asset.expire.enabled', true)) {\n\t\t\t\tsearchAssets.sortFields.expirationDate = i18n.t(\n\t\t\t\t\t'search:i18n.expirationDate',\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (checksumEnabled()) {\n\t\t\t\tsearchAssets.sortFields.checksum = i18n.t('i18n.checksum');\n\t\t\t\tsearchableSystemAttributes.push('checksum');\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {Netx.Models.Attribute} model Attribute model\n\t\t\t */\n\t\t\tfunction addToAdvancedSearch_date(model) {\n\t\t\t\t// Must be type date and the attribute must be for an asset (not clips currently)\n\t\t\t\tif (\n\t\t\t\t\tmodel.get('type') !== assetAttributeTypeIds.date ||\n\t\t\t\t\t!model.isForObjectType('asset')\n\t\t\t\t) {\n\t\t\t\t\treturn removeFromAdvancedSearch_date(model);\n\t\t\t\t}\n\t\t\t\t// Vars\n\t\t\t\tif (\n\t\t\t\t\t!_.findWhere(advancedSearchDate.options, {label: model.get('name')})\n\t\t\t\t) {\n\t\t\t\t\tadvancedSearchDate.options.push({\n\t\t\t\t\t\tval: model.get('name'),\n\t\t\t\t\t\tlabel: model.get('name'),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {Netx.Models.Attribute} model Attribute model\n\t\t\t */\n\t\t\tfunction removeFromAdvancedSearch_date(model) {\n\t\t\t\t// vars\n\t\t\t\tvar idx = _.indexOf(\n\t\t\t\t\tadvancedSearchDate.options,\n\t\t\t\t\t_.findWhere(advancedSearchDate.options, {label: model.get('name')}),\n\t\t\t\t);\n\t\t\t\tif (idx > -1) {\n\t\t\t\t\tadvancedSearchDate.options.splice(idx, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {module:asset/collections/attributes} collection Attributes\n\t\t\t */\n\t\t\tfunction populateFromDateAttributes(collection) {\n\t\t\t\t// Populate the advanced search options for subtype1 date\n\t\t\t\tadvancedSearchDate.options = dateSubTypes1_default.concat(\n\t\t\t\t\t_.compact(\n\t\t\t\t\t\tcollection.map(function (model) {\n\t\t\t\t\t\t\t// Is date and is for asset (no system attributes)\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!model.get('system') &&\n\t\t\t\t\t\t\t\tmodel.get('type') === assetAttributeTypeIds.date &&\n\t\t\t\t\t\t\t\tmodel.isForObjectType('asset')\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tval: model.get('name'),\n\t\t\t\t\t\t\t\t\tlabel: model.get('name'),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * @event module:asset#asset:attributes:fetched\n\t\t\t * @param {Netx.Collection.Attributes} collection Attributes collection\n\t\t\t */\n\t\t\tdispatcher.on('asset:attributes:fetched', populateFromDateAttributes);\n\t\t\t/**\n\t\t\t * @event module:asset#asset:attribute:added\n\t\t\t * @param {Netx.Models.Attribute} model Attribute model\n\t\t\t */\n\t\t\tdispatcher.on('asset:attribute:added', addToAdvancedSearch_date);\n\t\t\t/**\n\t\t\t * @event module:asset#asset:attribute:changed\n\t\t\t * @param {Netx.Models.Attribute} model Attribute model\n\t\t\t */\n\t\t\tdispatcher.on('asset:attribute:changed', addToAdvancedSearch_date);\n\t\t\t/**\n\t\t\t * @event module:asset#asset:attribute:removed\n\t\t\t * @param {Netx.Models.Attribute} model Attribute model\n\t\t\t */\n\t\t\tdispatcher.on('asset:attribute:removed', removeFromAdvancedSearch_date);\n\n\t\t\t// Populate from initial data\n\t\t\tpopulateFromDateAttributes(Netx.getAttributesByObjectType('asset'));\n\t\t})();\n\t}\n\n\t//=================================\n\t//\tEVENT LISTENERS\n\t//=================================\n\n\tSavedSearchDispatchListeners();\n\n\t/**\n\t * So SearchWidgetView doesn't need to call upon the router\n\t * @event module:search#search:navigate\n\t * @param {string} type Search path\n\t */\n\tdispatcher.on('search:navigate', (path) => {\n\t\tNetx.router.navigate(path, {\n\t\t\ttrigger: true,\n\t\t});\n\t});\n\n\t/**\n\t * @event module:search#search:routed\n\t * @param {string} type Search type\n\t * @param {string} str Search string\n\t * @param {number} page Page number\n\t * @see module:search#search:advanced\n\t * @see module:search#search:basic\n\t * @see module:search#search:exact\n\t * @see module:search#visual:asset\n\t * @see module:search#visual:color\n\t */\n\tdispatcher.on('search:routed', function (type, str, page) {\n\t\tdispatcher.trigger('search:' + type, str, page);\n\t});\n\n\t/**\n\t * if an asset was deleted, remove it from our collection if it's there.\n\t * @event module:search#asset:deleted\n\t * @param {number|string} id Asset id\n\t */\n\tdispatcher.on('asset:deleted', function (id) {\n\t\tid = parseInt(id);\n\t\tvar out = NS.assets.find(function (a) {\n\t\t\treturn a.get('assetId') === id;\n\t\t});\n\t\tif (out) {\n\t\t\tNS.assets.remove(out);\n\t\t}\n\t});\n\n\t/**\n\t * Add all assets in a saved search to the current cart (this does not clear current cart's assets)\n\t * @event module:search#search:saved:add:to:current:cart\n\t * @param {number} id SavedSearch id\n\t * @fires module:cart#cart:addAll\n\t * @see module:cart#cart:addAll:error\n\t * @see module:cart#cart:addAll:success\n\t */\n\tdispatcher.on('search:saved:add:to:current:cart', function (id) {\n\t\tdispatcher.trigger(\n\t\t\t'cart:addAll',\n\t\t\tnew AssetSearchRulesCollection([createSavedSearchRule(parseInt(id))]),\n\t\t);\n\t});\n\n\t/**\n\t * @event module:search#search:advanced:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'search:advanced:show',\n\t\tfunction (viewOptions) {\n\t\t\tdispatcher.trigger(SEARCH_RULES_EVENT.EDIT_SEARCH, {\n\t\t\t\tsearchCriteria: {\n\t\t\t\t\trules: searchCriteriaCache.rules,\n\t\t\t\t\tmatchCriteria: searchCriteriaCache.matchCriteria,\n\t\t\t\t},\n\t\t\t\t...viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:search#search:advanced\n\t * @param {base64} str Advanced search string\n\t * @param {number} page Page number\n\t * @fires module:search#search:advanced:show\n\t * @fires module:search#search:gallery:show\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t */\n\tdispatcher.on('search:advanced', function (str, page) {\n\t\tif (str) {\n\t\t\t// cache the rules for later editing\n\t\t\tconst searchCriteria = decodeBase64Rules(str);\n\n\t\t\tsearchCriteriaCache.update(\n\t\t\t\tconvertRulesToRuleObjects(searchCriteria),\n\t\t\t\tsearchCriteria.matchCriteria,\n\t\t\t);\n\n\t\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\t\tconditions: searchCriteria,\n\t\t\t\tpage: parseInt(page) || 1,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// with no route argument, just show the search rules view\n\t\tdispatcher.trigger('search:advanced:show', {\n\t\t\trouteMatch: 'search/advanced',\n\t\t\tisRouted: window.location.hash.includes('search/advanced'),\n\t\t});\n\t});\n\n\t/**\n\t * @event module:search#search:attribute:value\n\t * @param {string} attrName Attribute name\n\t * @param {mixed} value Attribute value\n\t */\n\tdispatcher.on('search:attribute:value', function (attrName, value) {\n\t\tif (!Array.isArray(value)) value = [value];\n\n\t\t// create a rule for each value passed\n\t\tconst rules =\n\t\t\tattrName === 'folderPath'\n\t\t\t\t? value.map((val) =>\n\t\t\t\t\t\tcreateCategoryIdRule({id: val, type: CategoryType.ONLY_RECURSIVE}),\n\t\t\t\t )\n\t\t\t\t: value.map((val) =>\n\t\t\t\t\t\tcreateMetadataRule({\n\t\t\t\t\t\t\ttype: MetadataType.MATCH_EXACTLY, // DAM-13419 - use \"AND\" // DAM-13880 - no no, use \"EXACT\"\n\t\t\t\t\t\t\tname: attrName,\n\t\t\t\t\t\t\tvalue: val,\n\t\t\t\t\t\t}),\n\t\t\t\t );\n\n\t\tconst searchStr = encodeBase64Rules({\n\t\t\t...convertToRules(...rules),\n\t\t\tmatchCriteria: SearchMatchCriteria.OR,\n\t\t});\n\n\t\t// send to advanced search\n\t\tNetx.router.navigate(`search/advanced/${searchStr}`, true);\n\t});\n\n\tif (Netx.getPreference('metadata.history.enabled', true)) {\n\t\tNS.rules.attributeHistory = new SearchAttributeHistoryRulesCollection([{}]);\n\n\t\t/**\n\t\t * @event module:search#search:attributeHistory:show\n\t\t * @param {object} viewOptions View options\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'search:attributeHistory:show',\n\t\t\tfunction (viewOptions) {\n\t\t\t\t// We are opting to remove all others. The workflow currently doesn't make sense to have an\n\t\t\t\t// advanced search paired with any other views - that is why we are using set instead of add\n\t\t\t\timport(\n\t\t\t\t\t/* webpackChunkName: \"view-searchAttributeHistoryRules\" */ './views/searchAttributeHistoryRulesView'\n\t\t\t\t).then((View) => {\n\t\t\t\t\tmodalViews.add({\n\t\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\t\tshowActions: ['search:attributeHistory:show'],\n\t\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\n\t\t/**\n\t\t * @event module:search#search:attributeHistory\n\t\t * @param {base64} str Advanced search string\n\t\t * @param {number} page Page number\n\t\t * @fires module:search#search:attribute:history:show\n\t\t */\n\t\tdispatcher.on('search:attributeHistory', function (str, page) {\n\t\t\tconst {hash} = window.location;\n\n\t\t\tif (str) {\n\t\t\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\t\t\tconditions: decodeBase64Rules(str),\n\t\t\t\t\tpage: parseInt(page) || 1,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// with no route argument, just show the search rules view\n\t\t\tdispatcher.trigger('search:attributeHistory:show', {\n\t\t\t\tcollection: NS.rules.attributeHistory,\n\t\t\t\trouteMatch: 'search/attribute/history',\n\t\t\t\tisRouted: hash.includes('search/attribute/history'),\n\t\t\t\tNS: NS,\n\t\t\t});\n\t\t});\n\n\t\t/**\n\t\t * @event mdule:search#search:attribute:history:submit\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'search:attributeHistory:submit',\n\t\t\tfunction () {\n\t\t\t\tvar str = NS.rules.attributeHistory.toStr();\n\t\t\t\tif (str !== 'e30=') {\n\t\t\t\t\tNetx.router.navigate('search/attribute/history/' + str, true);\n\t\t\t\t} else {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'app:alert',\n\t\t\t\t\t\ti18n.t('i18n.searchParametersNotProvided'),\n\t\t\t\t\t\ti18n.t('i18n.error'),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\t}\n\n\t/**\n\t * @event module:search#search:gallery:show\n\t * @param {object} viewOptions View options\n\t * @see module:search#search:advanced\n\t * @see module:search#search:basic\n\t * @see module:search#search:exact\n\t */\n\tdispatcher.on(\n\t\t'search:gallery:show',\n\t\tfunction (viewOptions) {\n\t\t\tappViews.add({\n\t\t\t\tviewClass: SearchGalleryView,\n\t\t\t\tshowActions: ['search:gallery:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:search#search:basic\n\t * @param {string} str Search string\n\t * @param {number} page Page number\n\t * @fires module:search#search:gallery:show\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t */\n\tdispatcher.on('search:basic', function (str, page) {\n\t\tstr = (str || '').trim();\n\n\t\tlet escapedStr = str;\n\t\tlet unescapedStr = str;\n\t\t// Already escaped\n\t\tif (isEscapedURI(str)) {\n\t\t\tunescapedStr = _.unescapeURI(str);\n\t\t} else {\n\t\t\t// Bacnkbone will strip the \"%20\" and put the space back and push it into history\n\t\t\t// which will require two browser back button clicks to get back from\n\t\t\tescapedStr = _.escapeURI(str).replace(/%20/g, ' ');\n\t\t}\n\n\t\t// Vars\n\t\t// var assets = NS.assets;\n\t\tlet exactMatch = false;\n\t\tlet hash = window.location.hash;\n\t\tconst pageStr = _.isNumeric(page) ? `/page/${page}` : '';\n\t\tconst searchRoute = `search/basic/${escapedStr}${pageStr}`;\n\n\t\t// HTML-1079: If this 'basic' search is enclosed in single or double quotes, it's really an 'exact' search.\n\t\texactMatch = str.match(/^\"(.*)\"$/) || str.match(/^'(.*)'$/);\n\t\tif (exactMatch) {\n\t\t\tdispatcher.trigger('search:exact', exactMatch[1], page);\n\t\t\treturn;\n\t\t}\n\n\t\t// TODO: i18n this 'basic' string ... i18n/translation for route path elements in general.\n\t\tif (hash != `#${searchRoute}`) {\n\t\t\t// No trigger - just fixing the route\n\t\t\tNetx.router.navigate(searchRoute);\n\t\t\thash = `#${searchRoute}`;\n\t\t}\n\n\t\t// Trigger search mode\n\t\tdispatcher.trigger('search:mode', 'basic');\n\n\t\tif (pageStr.length === 0) hash += '/page/1';\n\n\t\tconst ruleItems = [createKeywordRule({keyword: str})];\n\n\t\t// see below, if we match an asset id we will be switching to `OR`\n\t\tlet matchCriteria = SearchMatchCriteria.AND;\n\n\t\t// brought over from search assets collection\n\t\t// DAM-10194 - if simpleAssetIdSearchEnabled is true, AND search is an integer, also search by asset id\n\t\tif (getPreference('image.simpleAssetIdSearchEnabled', true)) {\n\t\t\t// check that we have a whole, positive number\n\t\t\tconst strAsNumber = Math.floor(Number(str));\n\t\t\tif (\n\t\t\t\t!isNaN(strAsNumber) &&\n\t\t\t\tstrAsNumber !== Infinity &&\n\t\t\t\tstrAsNumber >= 0 &&\n\t\t\t\tString(strAsNumber) === str\n\t\t\t) {\n\t\t\t\t// add search rule for assetId\n\t\t\t\truleItems.push(\n\t\t\t\t\tcreateMetadataRule({\n\t\t\t\t\t\ttype: MetadataType.MATCH_ALL_WILD_CARDS,\n\t\t\t\t\t\tname: 'assetId',\n\t\t\t\t\t\tvalue: str,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tmatchCriteria = SearchMatchCriteria.OR;\n\t\t\t}\n\t\t}\n\n\t\tsearchCriteriaCache.update(ruleItems, matchCriteria);\n\n\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\tconditions: {\n\t\t\t\t...convertToRules(...ruleItems),\n\t\t\t\tmatchCriteria,\n\t\t\t},\n\t\t\tpage: parseInt(page) || 1,\n\t\t});\n\t});\n\n\t/**\n\t * @event module:search#search:exact\n\t * @param {string} str A complete string (with diacriticals) to search for\n\t * @fires module:search#search:gallery:show\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t */\n\tdispatcher.on('search:exact', function (str, page) {\n\t\tstr = (str || '').trim();\n\n\t\tlet escapedStr = str;\n\t\tlet unescapedStr = str;\n\n\t\t// Already escaped\n\t\tif (isEscapedURI(str)) {\n\t\t\tunescapedStr = _.unescapeURI(str);\n\t\t} else {\n\t\t\t// Bacnkbone will strip the \"%20\" and put the space back and push it into history\n\t\t\t// which will require two browser back button clicks to get back from\n\t\t\tescapedStr = _.escapeURI(str).replace(/%20/g, ' ');\n\t\t}\n\n\t\t// var assets = NS.assets;\n\t\tlet {hash} = window.location;\n\t\tconst pageStr = _.isNumeric(page) ? `/page/${page}` : '';\n\t\t// TODO: i18n this 'basic' string ... i18n/translation for route path elements in general.\n\t\tconst searchRoute = `search/exact/${escapedStr}${pageStr}`;\n\n\t\tif (hash !== `#${searchRoute}`) {\n\t\t\t// No trigger - just fixing the route\n\t\t\tNetx.router.navigate(searchRoute);\n\t\t\thash = `#${searchRoute}`;\n\t\t}\n\n\t\tconst searchRule = createKeywordRule({\n\t\t\tkeyword: str,\n\t\t\ttype: KeywordType.MATCH_EXACTLY_INCLUDING_DIACRITICAL_MARKS,\n\t\t});\n\n\t\tsearchCriteriaCache.update([searchRule], SearchMatchCriteria.AND);\n\n\t\t// Trigger search mode\n\t\t// We stil lcall this mode `basic` since there is no other clear indication to the user of the destinction between the two modes\n\t\t// (other than they themselves searching with quotes or no quotes)\n\t\t// TODO: Ultimately I think this should trigger with \"exact\" - but we need to rewrite the code in our search widget view to treat\n\t\t// \"exact\" and \"basic\" as the same option in the search mode dropdown\n\t\tdispatcher.trigger('search:mode', 'basic');\n\n\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\tconditions: convertToRules(searchRule),\n\t\t\tpage: parseInt(page) || 1,\n\t\t});\n\t});\n\n\t// Video clips are enabled\n\tif (\n\t\tNetx.getUserLevel() >= 2 &&\n\t\tNetx.getPreference('asset.constituent.videoClips.enabled', true)\n\t) {\n\t\t// Clip collections\n\t\tNS.clips = new ClipSearchConstituentsCollection([]);\n\t\tNS.rules.clips = new ClipSearchRulesCollection([\n\t\t\t{\n\t\t\t\telementType: 101,\n\t\t\t\telementSubType1: 4,\n\t\t\t},\n\t\t]);\n\n\t\t/**\n\t\t * @event module:search#search:clip:gallery:show\n\t\t * @param {object} viewOptions View options\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'search:clip:gallery:show',\n\t\t\tfunction (viewOptions) {\n\t\t\t\tappViews.add({\n\t\t\t\t\tviewClass: SearchConstituentsGalleryView,\n\t\t\t\t\tshowActions: ['search:clip:gallery:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\n\t\t/**\n\t\t * @event module:search#search:clip:basic\n\t\t * @param {string} str Search string\n\t\t * @param {number} page Page number\n\t\t * @fires module:search#search:mode\n\t\t * @fires module:search#search:clip:gallery:show\n\t\t * @fires module:asset#asset:cursor:cacheFetch\n\t\t */\n\t\tdispatcher.on('search:clip:basic', function (str, page) {\n\t\t\tstr = (str || '').trim();\n\n\t\t\tvar escapedStr = str,\n\t\t\t\tunescapedStr = str;\n\n\t\t\t// Already escaped\n\t\t\tif (isEscapedURI(str)) {\n\t\t\t\tunescapedStr = _.unescapeURI(str);\n\t\t\t} else {\n\t\t\t\tescapedStr = _.escapeURI(str);\n\t\t\t}\n\n\t\t\tvar clips = NS.clips,\n\t\t\t\thash = window.location.hash,\n\t\t\t\tpageStr = _.isNumeric(page) ? '/page/' + page : '',\n\t\t\t\t// TODO: i18n this 'basic' string ... i18n/translation for route path elements in general.\n\t\t\t\tsearchRoute = 'search/clip/basic/' + escapedStr + pageStr;\n\n\t\t\tif (hash != '#' + searchRoute) {\n\t\t\t\t// No trigger - just fixing the route\n\t\t\t\tNetx.router.navigate(searchRoute);\n\t\t\t}\n\n\t\t\t// Trigger search mode\n\t\t\tdispatcher.trigger('search:mode', 'clip');\n\n\t\t\t// If we were just at this search, then don't reload it:\n\t\t\tif (clips.lastSearchRoute != hash) {\n\t\t\t\t// otherwise, carry on with 'clip'\n\t\t\t\tclips.lastSearchRoute = hash;\n\t\t\t\tclips.basic(unescapedStr, page);\n\t\t\t} else {\n\t\t\t\t// Cache the search selection for asset detail use\n\t\t\t\tdispatcher.trigger('asset:cursor:cacheFetch', clips);\n\t\t\t}\n\n\t\t\t// Show\n\t\t\tdispatcher.trigger('search:clip:gallery:show', {\n\t\t\t\tcollection: clips,\n\t\t\t\tviews: {\n\t\t\t\t\theader: {\n\t\t\t\t\t\tviewClass: SearchConstituentsGalleryHeaderView,\n\t\t\t\t\t\tcollection: clips,\n\t\t\t\t\t},\n\t\t\t\t\tassets: {\n\t\t\t\t\t\tviewClass: SearchConstituentsListView_clips,\n\t\t\t\t\t\tcollection: clips,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t\t/**\n\t\t * @event module:search#search:clip:basic:complete\n\t\t * @param {array} data Search data\n\t\t * @see module:search#search:clip:basic\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'search:clip:basic:complete',\n\t\t\tfunction (data) {\n\t\t\t\t// console.log(data);\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\t\t/**\n\t\t * @event module:search#search:clip:basic:error\n\t\t * @param {string} error Error string\n\t\t * @fires module:app#app:alert\n\t\t * @see module:search#search:clip:basic\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'search:clip:basic:error',\n\t\t\tfunction (error) {\n\t\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\t} else {\n\t\t// Not available in the search mode dropdown\n\t\tdelete searchModes.clip;\n\t}\n\n\t/**\n\t * @event module:search#search:mode\n\t * @param {string} modeStr Mode (basic, clip, color, exact)\n\t * @fires module:search#search:mode:updated\n\t */\n\tdispatcher.on('search:mode', function (modeStr) {\n\t\tvar changed = NS.mode !== modeStr;\n\t\tif (changed) {\n\t\t\tNS.mode = modeStr;\n\t\t\tdispatcher.trigger('search:mode:updated', modeStr);\n\t\t}\n\t});\n\n\t/**\n\t * @event module:search#search:saved:delete\n\t * @param {Netx.Models.SavedSearch} model SavedSearch model\n\t * @fires module:app#app:confirm:delete\n\t * @see module:search#search:saved:delete:confirmed\n\t */\n\tdispatcher.on(\n\t\t'search:saved:delete',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\t\tmessage: i18n.t('i18n.deleteSavedSearchMessage'),\n\t\t\t\teventStr: 'search:saved:delete',\n\t\t\t\targs: [model],\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:search#search:saved:delete:confirmed\n\t * @param {Netx.Models.SavedSearch} model SavedSearch model\n\t * @fires module:search#search:saved:delete:error\n\t * @fires module:search#search:saved:delete:success\n\t * @see module:search#search:saved:delete\n\t */\n\tdispatcher.on('search:saved:delete:confirmed', function (model) {\n\t\tmodel.destroy({wait: true}).then(\n\t\t\tfunction () {\n\t\t\t\t// If we are currently viewing the deleted saved search - route to landing\n\t\t\t\tif (window.location.href.includes(model.getRoute())) {\n\t\t\t\t\tNetx.router.navigate('search/saved', {trigger: true});\n\t\t\t\t}\n\t\t\t\tdispatcher.trigger('search:saved:delete:success', model);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('search:saved:delete:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:search#search:saved:delete:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:search#search:saved:delete:confirmed\n\t */\n\tdispatcher.on(\n\t\t'search:saved:delete:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, 'Danger');\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:search#search:saved:delete:success\n\t * @param {Netx.Models.SavedSearch} model SavedSearch model\n\t * @fires module:notification#notification\n\t * @see module:search#search:saved:delete:confirmed\n\t */\n\tdispatcher.on(\n\t\t'search:saved:delete:success',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'search',\n\t\t\t\tids: [model.id],\n\t\t\t\ttitle: i18n.t('i18n.savedSearchesUpdated', {\n\t\t\t\t\tdefaultValue: 'Saved searches updated',\n\t\t\t\t}),\n\t\t\t\tdescription: i18n.t('i18n.savedSearchSuccessfullyDeleted', {\n\t\t\t\t\tdefaultValue:\n\t\t\t\t\t\t'The saved search \"__search__\" was successfully deleted',\n\t\t\t\t\tsearch: model.get('title'),\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:search#search:saved:landing:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'search:saved:landing:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-savedSearchLanding\" */ './views/savedSearchLandingView'\n\t\t\t).then((View) => {\n\t\t\t\tappViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['search:saved:landing:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:search#search:saved:landing:routed\n\t * @fires module:search#search:saved:landing\n\t */\n\tdispatcher.on('search:saved:landing:routed', function () {\n\t\tdispatcher.trigger('search:saved:landing');\n\t});\n\t/**\n\t * @event module:search#search:saved:landing\n\t * @fires module:search#search:saved:landing:show\n\t */\n\tdispatcher.on('search:saved:landing', function () {\n\t\tdispatcher.trigger('search:saved:landing:show', {\n\t\t\tcollection: NS.saved.all.deepClone(),\n\t\t});\n\t});\n\n\t/**\n\t * @event module:search#search:saved:routed\n\t * @param {number|string} id SavedSearch id\n\t * @fires module:search#search:saved:toGallery\n\t */\n\tdispatcher.on(\n\t\t'search:saved:routed',\n\t\tfunction (id, page) {\n\t\t\t// Ensure page\n\t\t\tpage = page || 1;\n\t\t\t//Netx.views.savedSearchesView.show(); // show searches in sidebar\n\t\t\tdispatcher.trigger('search:saved:toGallery', id, page);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Viewing saved searches\n\t * @event module:search#search:saved:toGallery\n\t * @param {number|string} id SavedSearch id\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t */\n\tdispatcher.on(\n\t\t'search:saved:toGallery',\n\t\tfunction (id, page) {\n\t\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\t\tconditions: convertToRules(createSavedSearchRule(parseInt(id))),\n\t\t\t\tpage: parseInt(page) || 1,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t//=================================\n\t//\t!EVENT LISTENERS\n\t//=================================\n\n\t/**\n\t * @event module:search#search:facet:option:deselect\n\t * @param {Netx.Models.SarchFacetModel} model SearchFacet\n\t * @fires module:search#search:facet:option:toggle\n\t */\n\tdispatcher.on('search:facet:option:deselect', function (model) {\n\t\tdispatcher.trigger('search:facet:option:toggle', model);\n\t});\n\n\t//=================================\n\t//\t!EVENT LISTENERS\n\t//=================================\n\t// After the module has run through its init routine,\n\t// stop listening for subsequent init events which would\n\t// cause duplicate listeners and instances to be created.\n\t$.when.apply(this, NS.bootstrap).then(function () {\n\t\tdelete NS.bootstrap;\n\t\tdispatcher.trigger('search:extend', NS);\n\t\tdispatcher.trigger('search:initialized', NS);\n\t});\n});\n//=================================\n//\t!INIT\n//=================================\n\nexport default {\n\tinitialize(opts) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdispatcher.once('search:initialized', () => {\n\t\t\t\tresolve(routes);\n\t\t\t});\n\t\t\tdispatcher.trigger('search:init');\n\t\t});\n\t},\n};\n","import AssetSearchRulesCollection from '../collections/searchRules_assets';\nimport SearchAssetsCollection from '../collections/searchAssets';\n\nexport default function () {\n\tconst NS = Netx.search;\n\tconst modalViews = Netx.app.modalViews;\n\n\t/**\n\t * @event module:search#search:save:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'search:save:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-searchSave\" */ '../views/searchSaveView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['search:save:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Show search-saving UI\n\t * @event module:search#search:save\n\t * @param {Netx.Collections.SearchAssets} collection SearchAssets collection\n\t * @fires module:search#search:save:show\n\t * @see module:search#search:save:confirmed\n\t */\n\tdispatcher.on('search:save', function (collection) {\n\t\tdispatcher.trigger('search:save:show', {\n\t\t\tcollection,\n\t\t});\n\t});\n\n\tdispatcher.on('search:saved:rename', function (model) {\n\t\tmodel.fetchBean().then(() => {\n\t\t\tdispatcher.trigger('search:save:show', {\n\t\t\t\tmodel,\n\t\t\t});\n\t\t});\n\t});\n\n\t/**\n\t * Saving a search: we set the 'save me' flags and re-submit it.\n\t * @event module:search#search:save:confirmed\n\t * @param {object} data Search data\n\t * @param {Netx.Collections.SearchAssets} collectionOrModel SearchAssets collection or saved search model\n\t * @fires module:search#search:save:error\n\t * @fires module:search#search:save:success\n\t * @see module:search#search:save\n\t */\n\tdispatcher.on('search:save:confirmed', function (data, collectionOrModel) {\n\t\t// editing\n\t\tif (collectionOrModel.isModel) {\n\t\t\tcollectionOrModel\n\t\t\t\t.fetchBean()\n\t\t\t\t.then(() => {\n\t\t\t\t\treturn collectionOrModel\n\t\t\t\t\t\t.set({\n\t\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\t\tnotifyType: data.notifyType,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.save()\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t'search:save:success',\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tcollectionOrModel,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((ex) => {\n\t\t\t\t\tdispatcher.trigger('search:save:error', ex);\n\t\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tlet assets = collectionOrModel;\n\n\t\t// Saved search\n\t\t// We need to parse out its criteria as the selection (search rules) on a saved search assets collection\n\t\t// is the search rules for loading a saved cart - not the rules that were involved in originally creating the saved cart\n\t\tif (assets.id) {\n\t\t\tvar savedSearch = NS.saved.all.get(assets.id);\n\t\t\tif (!savedSearch) {\n\t\t\t\treturn dispatcher.trigger(\n\t\t\t\t\t'search:save:error',\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\ti18n.t('i18n.couldNotCreateSavedSearchFromSavedSearch', {\n\t\t\t\t\t\t\tdefaultValue:\n\t\t\t\t\t\t\t\t'Trying to create a saved search from another saved search that no longer exists or cannot be found.',\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\tcollectionOrModel,\n\t\t\t\t);\n\t\t\t}\n\t\t\tassets = new SearchAssetsCollection([], {\n\t\t\t\tselection: new AssetSearchRulesCollection(\n\t\t\t\t\t_.map(savedSearch.get('criteria'), function (c) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\telementType: c.type,\n\t\t\t\t\t\t\telementValue1: c.value1,\n\t\t\t\t\t\t\telementValue2: c.value2,\n\t\t\t\t\t\t\telementValue3: c.value3,\n\t\t\t\t\t\t\telementSubType1: c.subtype1,\n\t\t\t\t\t\t\telementSubType2: c.subtype2,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t});\n\t\t}\n\n\t\t// Save the search\n\t\t// TODO: we need to store the match criteria\n\t\tassets\n\t\t\t.saveSearch(data.title, data.description, data.notifyType, data.global)\n\t\t\t.then(\n\t\t\t\tfunction (savedSearch) {\n\t\t\t\t\tdispatcher.trigger('search:save:success', assets, savedSearch);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('search:save:error', err);\n\t\t\t\t},\n\t\t\t);\n\t});\n\n\t/**\n\t * @event module:search#search:save:error\n\t * @param {string} error Error string\n\t * @param {Netx.Collections.SearchAssets} collection SearchAssets collection\n\t * @fires module:app#app:alert\n\t * @see module:search#search:save:confirmed\n\t */\n\tdispatcher.on(\n\t\t'search:save:error',\n\t\tfunction (error, collection) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:search#search:save:success\n\t * @param {Netx.Collections.SearchAssets} collection SearchAssets collection\n\t * @param {Netx.Models.SavedSearch} model SavedSearch model\n\t * @fires module:notification#notification\n\t * @see module:search#search:save:confirmed\n\t */\n\tdispatcher.on(\n\t\t'search:save:success',\n\t\tfunction (collection, model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'search',\n\t\t\t\tids: [model.id],\n\t\t\t\ttitle: i18n.t('i18n.savedSearchesUpdated', {\n\t\t\t\t\tdefaultValue: 'Saved searches updated',\n\t\t\t\t}),\n\t\t\t\tdescription: i18n.t('i18n.searchWasSuccessfullySaved', {\n\t\t\t\t\tdefaultValue: 'Your search \"__search__\" was successfully saved',\n\t\t\t\t\tsearch: model.get('title'),\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n}\n","export {default} from '@netx/core-search/controller';\n\nimport SearchFacetsView from './views/searchFacetsView';\nimport SearchGalleryHeaderView from './views/searchGalleryHeaderView';\nimport AssetListView from '@netx/core-asset/views/assetListView';\n\nimport {isEscapedURI} from '@netx/core/lib/underscore-netx';\nimport assetCustomConfig from '@netx/core-asset/config';\nimport AssetListViewTypeManagerView from '@netx/core-asset/views/assetListViewTypeManager';\n\n/** Search Module Extensions */\ndispatcher.once('search:extend', function (NS) {\n\t// Use faceted search\n\t// Filter mode is driven by the property `search.facet.filterMode` - default is quite literally \"DEFAULT\"\n\t// See Netx.Collections.SearchFacets\n\tNS.assets.useFacetedSearch(true);\n\n\t/**\n\t * @event module:search#search:facet:onOff\n\t * @param {collection} object Assets collection\n\t * @fires module:search#search:facets:on\n\t * @fires module:asset#search:facets:off\n\t */\n\tdispatcher.on('search:facet:onOff', function (collection) {\n\t\t// is this collection relevant to what is going on?\n\t\tif (collection.hasRouteContext && collection.hasRouteContext()) {\n\t\t\tvar hasOption = _.find(\n\t\t\t\tcollection.selection.searchFacets.models,\n\t\t\t\tfunction (facet, idx, all) {\n\t\t\t\t\treturn facet.get('options').length > 0;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (hasOption) {\n\t\t\t\tdispatcher.trigger('search:facets:on');\n\t\t\t} else {\n\t\t\t\tdispatcher.trigger('search:facets:off');\n\t\t\t}\n\t\t}\n\t\t// else don't worry about it\n\t});\n\n\tdispatcher.on('search:facets:off', function () {\n\t\t// Netx.user.prefs.setUserPreference('showFacets', false);\n\t\t$('body').addClass('facets-off');\n\t});\n\tdispatcher.on('search:facets:on', function () {\n\t\t// Netx.user.prefs.setUserPreference('showFacets', true);\n\t\t$('body').removeClass('facets-off');\n\t});\n\n\t// THEM-1297 - new listener. Instead of triggering the search:exact directly from the search widget,\n\t// and not triggering the route, navigating here, everyone wins.\n\tdispatcher.on('search:typeahead:selected', function (searchStr) {\n\t\tconst escapedStr = _.escapeURI(searchStr).replace(/%20/g, ' ');\n\t\tNetx.router.navigate('search/exact/' + escapedStr, {trigger: true});\n\t});\n\n\t// Old advanced search code from core until portal can join the react gallery\n\tdispatcher.off('search:advanced');\n\tdispatcher.on('search:advanced', function (str, page) {\n\t\tvar hash = window.location.hash;\n\n\t\t// portal does not offer an advanced search modal\n\t\tif (!str) return;\n\n\t\t// Ensure page\n\t\tpage = page || 1;\n\n\t\tvar assets = NS.assets;\n\n\t\t// If we weren't just at this search,\n\t\tif (assets.lastSearchRoute != hash) {\n\t\t\t// decode and perform the search.\n\t\t\tassets.lastSearchRoute = hash;\n\t\t\tassets.advanced(str, page);\n\t\t} else {\n\t\t\t// but if we were, don't reload it:\n\t\t\t// just cache the selection\n\t\t\tdispatcher.trigger('asset:cursor:cacheFetch', assets);\n\t\t}\n\n\t\tdispatcher.trigger('search:gallery:show', {\n\t\t\tcollection: NS.assets,\n\t\t\tNS: NS,\n\t\t\tviews: {\n\t\t\t\tfacets: {\n\t\t\t\t\tviewClass: SearchFacetsView,\n\t\t\t\t\tcollection: NS.assets.selection.searchFacets,\n\t\t\t\t},\n\t\t\t\theader: {\n\t\t\t\t\tviewClass: SearchGalleryHeaderView,\n\t\t\t\t\tcollection: NS.assets,\n\t\t\t\t},\n\t\t\t\tassets: {\n\t\t\t\t\tviewClass: AssetListView,\n\t\t\t\t\tcollection: NS.assets,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\n\t/**\n\t * @event module:search#search:basic\n\t * @param {string} str Search string\n\t * @param {number} page Page number\n\t * @fires module:search#search:gallery:show\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t */\n\tdispatcher.off('search:basic');\n\tdispatcher.on('search:basic', function (str, page) {\n\t\t// overriding to put facets on the bottom\n\n\t\tdispatcher.trigger('search:facets:refresh');\n\n\t\tstr = (str || '').trim();\n\n\t\tvar escapedStr = str,\n\t\t\tunescapedStr = str;\n\n\t\t// Already escaped\n\t\tif (isEscapedURI(str)) {\n\t\t\tunescapedStr = _.unescapeURI(str);\n\t\t} else {\n\t\t\tescapedStr = _.escapeURI(str).replace(/%20/g, ' ');\n\t\t}\n\n\t\t// Vars\n\t\tvar assets = NS.assets,\n\t\t\texactMatch = false,\n\t\t\thash = window.location.hash,\n\t\t\tpageStr = _.isNumeric(page) ? '/page/' + page : '',\n\t\t\tsearchRoute = 'search/basic/' + escapedStr + pageStr;\n\n\t\t// HTML-1079: If this 'basic' search is enclosed in single or double quotes, it's really an 'exact' search.\n\t\texactMatch = str.match(/^\"(.*)\"$/) || str.match(/^'(.*)'$/);\n\t\tif (exactMatch) {\n\t\t\tdispatcher.trigger('search:exact', exactMatch[1], page);\n\t\t\treturn;\n\t\t}\n\n\t\t// TODO: i18n this 'basic' string ... i18n/translation for route path elements in general.\n\t\tif (hash != '#' + searchRoute) {\n\t\t\t// No trigger - just fixing the route\n\t\t\tNetx.router.navigate(searchRoute);\n\t\t\thash = '#' + searchRoute;\n\t\t}\n\n\t\t// Trigger search mode\n\t\tdispatcher.trigger('search:mode', 'basic');\n\n\t\tif (pageStr.length === 0) {\n\t\t\thash += '/page/1';\n\t\t}\n\n\t\t// If we were just at this search, then don't reload it:\n\t\tif (assets.lastSearchRoute != hash) {\n\t\t\t// otherwise, carry on with 'basic'\n\t\t\tassets.lastSearchRoute = hash;\n\t\t\tassets.basic(unescapedStr, page);\n\t\t} else {\n\t\t\t// Cache the search selection for asset detail use\n\t\t\tdispatcher.trigger('asset:cursor:cacheFetch', assets);\n\t\t\t// DAM-19563 DAM-19485 - no fetch, make sure facets haven't been turned off\n\t\t\tdispatcher.trigger('search:facet:onOff', assets);\n\t\t}\n\n\t\t// Show\n\t\tdispatcher.trigger('search:gallery:show', {\n\t\t\tcollection: assets,\n\t\t\tviews: {\n\t\t\t\theader: {\n\t\t\t\t\tviewClass: SearchGalleryHeaderView,\n\t\t\t\t\tcollection: assets,\n\t\t\t\t},\n\t\t\t\tassets: {\n\t\t\t\t\tviewClass: AssetListView,\n\t\t\t\t\tcollection: assets,\n\t\t\t\t},\n\t\t\t\tfacets: {\n\t\t\t\t\tviewClass: SearchFacetsView,\n\t\t\t\t\tcollection: assets.selection.searchFacets,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\n\t/**\n\t * @event module:search#search:exact\n\t * @param {string} str A complete string (with diacriticals) to search for\n\t * @fires module:search#search:gallery:show\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t */\n\tdispatcher.off('search:exact');\n\tdispatcher.on('search:exact', function (str, page) {\n\t\tstr = (str || '').trim();\n\n\t\tvar escapedStr = str,\n\t\t\tunescapedStr = str;\n\n\t\t// Already escaped\n\t\tif (isEscapedURI(str)) {\n\t\t\tunescapedStr = _.unescapeURI(str);\n\t\t} else {\n\t\t\t// Bacnkbone will strip the \"%20\" and put the space back and push it into history\n\t\t\t// which will require two browser back button clicks to get back from\n\t\t\tescapedStr = _.escapeURI(str).replace(/%20/g, ' ');\n\t\t}\n\n\t\tvar assets = NS.assets,\n\t\t\thash = window.location.hash,\n\t\t\tpageStr = _.isNumeric(page) ? '/page/' + page : '',\n\t\t\t// TODO: i18n this 'basic' string ... i18n/translation for route path elements in general.\n\t\t\tsearchRoute = 'search/exact/' + escapedStr + pageStr;\n\n\t\tif (hash !== '#' + searchRoute) {\n\t\t\t// No trigger - just fixing the route\n\t\t\tNetx.router.navigate(searchRoute);\n\t\t\thash = '#' + searchRoute;\n\t\t}\n\n\t\t// Trigger search mode\n\t\t// We stil lcall this mode `basic` since there is no other clear indication to the user of the destinction between the two modes\n\t\t// (other than they themselves searching with quotes or no quotes)\n\t\t// TODO: Ultimately I think this should trigger with \"exact\" - but we need to rewrite the code in our search widget view to treat\n\t\t// \"exact\" and \"basic\" as the same option in the search mode dropdown\n\t\tdispatcher.trigger('search:mode', 'basic');\n\n\t\t// If we were just at this search, then don't reload it:\n\t\tif (assets.lastSearchRoute != hash) {\n\t\t\t// otherwise, carry on with 'basic'\n\t\t\tassets.lastSearchRoute = hash;\n\t\t\tassets.exact(unescapedStr, page);\n\t\t} else {\n\t\t\t// Cache the search selection for asset detail use\n\t\t\tdispatcher.trigger('asset:cursor:cacheFetch', assets);\n\t\t}\n\n\t\tdispatcher.trigger('search:gallery:show', {\n\t\t\tcollection: assets,\n\t\t\tviews: {\n\t\t\t\tfacets: {\n\t\t\t\t\tviewClass: SearchFacetsView,\n\t\t\t\t\tcollection: assets.selection.searchFacets,\n\t\t\t\t},\n\t\t\t\theader: {\n\t\t\t\t\tviewClass: SearchGalleryHeaderView,\n\t\t\t\t\tcollection: assets,\n\t\t\t\t},\n\t\t\t\tassets: {\n\t\t\t\t\tviewClass: assetCustomConfig.LIST_TYPES_ENABLED\n\t\t\t\t\t\t? AssetListViewTypeManagerView\n\t\t\t\t\t\t: AssetListView,\n\t\t\t\t\tcollection: assets,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t});\n\n\t/**\n\t * Viewing saved searches\n\t * @event module:search#search:saved:toGallery\n\t * @param {number|string} id SavedSearch id\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t */\n\tdispatcher.off('search:saved:toGallery');\n\tdispatcher.on(\n\t\t'search:saved:toGallery',\n\t\tfunction (id, page) {\n\t\t\tid = parseInt(id);\n\t\t\t// Load this saved search, unless it's already loaded.\n\t\t\t// TODO: some kind of interface for determining if the current route is already loaded in searchAssets -- for\n\t\t\t// basic, exact, advanced and saved. The mess below only works for saved searches, and we really shouldn't be peeking\n\t\t\t// around inside an object's guts like this.\n\t\t\t//\n\t\t\t// ALSO: we don't ever fetch the saved search object for this search, and perhaps we should do that & give it to the view to work with.\n\t\t\t// Or more generally, create some standard relationship between a Netx.Model that describes a set of assets and the Netx.Collection that\n\t\t\t// fetches/pages those assets.\n\t\t\tvar assets = NS.assets,\n\t\t\t\thash = window.location.hash;\n\t\t\t// If we were just at this search, then don't reload it:\n\t\t\tif (assets.lastSearchRoute != hash) {\n\t\t\t\tassets.lastSearchRoute = hash;\n\t\t\t\tassets.saved(id, page); // fetch saved search.\n\t\t\t} else {\n\t\t\t\t// Cache the search selection for asset detail use\n\t\t\t\tdispatcher.trigger('asset:cursor:cacheFetch', assets);\n\t\t\t}\n\n\t\t\tPromise.all([\n\t\t\t\tassetCustomConfig.LIST_TYPES_ENABLED\n\t\t\t\t\t? import(\n\t\t\t\t\t\t\t/* webpackChunkName: \"view-savedSearchAssetList\" */ '@netx/core-asset/views/assetListViewTypeManager'\n\t\t\t\t\t )\n\t\t\t\t\t: import(\n\t\t\t\t\t\t\t/* webpackChunkName: \"view-savedSearchAssetList\" */ '@netx/core-asset/views/assetListView'\n\t\t\t\t\t ),\n\t\t\t\timport(\n\t\t\t\t\t/* webpackChunkName: \"view-savedSearchAssetList\" */ './views/searchFacetsView'\n\t\t\t\t),\n\t\t\t\timport(\n\t\t\t\t\t/* webpackChunkName: \"view-savedSearchAssetList\" */ './views/searchGalleryHeaderView'\n\t\t\t\t),\n\t\t\t]).then((imports) => {\n\t\t\t\tconst [\n\t\t\t\t\tAssetListView,\n\t\t\t\t\tSearchFacetsView,\n\t\t\t\t\tSearchGalleryHeaderView,\n\t\t\t\t] = imports;\n\n\t\t\t\tdispatcher.trigger('search:gallery:show', {\n\t\t\t\t\tcollection: NS.assets,\n\t\t\t\t\tNS: NS,\n\t\t\t\t\tviews: {\n\t\t\t\t\t\tfacets: {\n\t\t\t\t\t\t\tviewClass: SearchFacetsView.default,\n\t\t\t\t\t\t\tcollection: NS.assets.selection.searchFacets,\n\t\t\t\t\t\t},\n\t\t\t\t\t\theader: {\n\t\t\t\t\t\t\tviewClass: SearchGalleryHeaderView.default,\n\t\t\t\t\t\t\tcollection: NS.assets,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tassets: {\n\t\t\t\t\t\t\tviewClass: AssetListView.default,\n\t\t\t\t\t\t\tcollection: NS.assets,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n}); // search:extend\n","/**\n * Search module\n */\n\nimport actions from './actions';\nimport menus from './menus';\nimport controller from './controller';\nimport Asset from '@netx/core-asset';\n\n// Call on this function to load everything needed for the module prior to initialization\nfunction loadDependencies() {\n\treturn new Promise((resolve, reject) => {\n\t\tdispatcher.trigger('netx:load:module', Asset, {\n\t\t\terror: reject,\n\t\t\tinitialized: resolve,\n\t\t});\n\t});\n}\n\n/**\n * @property {object} exports - Our module exports\n * @property {string} exports.namespace - Module namespace\n * @property {function} exports.initialize - Module initializer\n */\nexport default {\n\tnamespace: 'search',\n\tinitialize() {\n\t\treturn loadDependencies().then(() => {\n\t\t\t// Register actions\n\t\t\tNetx.Actions.Register(actions);\n\t\t\t// Extend menus\n\t\t\tNetx.addMenus(menus);\n\n\t\t\treturn controller.initialize();\n\t\t});\n\t},\n};\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/appTabItemView.html';\n\nclass AppTabItemView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\tconst model = opts.model;\n\t\tconst tabName = model.get('name') || _.toCamelCase(model.id);\n\t\topts.attributes = {\n\t\t\t'data-nx-control': `tab-${tabName}`,\n\t\t\t...opts.attributes,\n\t\t};\n\t\topts.events = {\n\t\t\tclick: 'tabClicked',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.template = opts.template || Template;\n\t\tif (model.get('hasTotal')) {\n\t\t\topts.collection = model.get('view').collection;\n\t\t}\n\t\tsuper(opts);\n\n\t\tthis.iconOnly = opts.viewSpec.get('iconOnly') || false;\n\n\t\t// Related view\n\t\tthis.model.has('view')\n\t\t\t? this.addRelatedView()\n\t\t\t: this.listenToOnce(this.model, 'change:view', this.addRelatedView);\n\n\t\t// Set our unique tab attribute\n\t\tthis.$el.addClass(`${tabName}-tab-item`);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(\n\t\t\tthis.model,\n\t\t\t'change:active',\n\t\t\tthis.toggleActive,\n\t\t).listenTo(this.model, 'change:unsavedChanges', this.toggleUnsavedChanges);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\t\tconst relatedView = this.relatedView || {};\n\n\t\tconst action = Netx.Actions.Find(model.get('uniqueShowAction')) || {};\n\t\t// Additional template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\taction: model.get('uniqueShowAction'),\n\t\t\tlabel: this.iconOnly\n\t\t\t\t? ''\n\t\t\t\t: model.get('label') || action.label || relatedView.headerTitle,\n\t\t\ticon: model.get('icon') || action.icon,\n\t\t\thasTotal: model.get('hasTotal') === true,\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$title = this.$('.nx-title');\n\n\t\tthis.toggleActive();\n\t}\n\n\t/**\n\t * Once our model has its view property,\n\t * remeber it at .relatedView, and use it to toggle our crumbs.\n\t * (.relatedView also used in theme override ...)\n\t * @method\n\t */\n\taddRelatedView() {\n\t\tthis.relatedView = this.model.get('view');\n\t}\n\n\t/**\n\t * We run everything through actions\n\t * But in some cases one might want to know if a tab was shown strictly via a tab click\n\t * This also presents the ability to silence the click and prevent the action from firing\n\t * should you `preventDefault`\n\t * This event cannot be caught on any view we might be nested in as the action code in netx-view\n\t * silences events and prevent propagation - so it would be too late at any higher level\n\t * @param {event} e Click event\n\t */\n\ttabClicked(e) {\n\t\tconst event = new CustomEvent('tabClick', {\n\t\t\tview: window,\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t\tdetail: this.model,\n\t\t});\n\t\tif (!this.el.dispatchEvent(event)) {\n\t\t\t// User cancelled event - cancel original click event\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\t/** @method */\n\ttoggleActive() {\n\t\tthis.$el.toggleClass('active', this.model.get('active') === true);\n\t\t// Update title (it could have changed context)\n\t\t//if (this.relatedView) {\n\t\tthis.$title &&\n\t\t\tthis.$title.html(\n\t\t\t\tthis.model.get('label') ||\n\t\t\t\t\t(this.relatedView && this.relatedView.headerTitle),\n\t\t\t);\n\t\t//}\n\t}\n\n\t/** @method */\n\ttoggleUnsavedChanges() {\n\t\tthis.$el.toggleClass(\n\t\t\t'unsaved-changes',\n\t\t\tthis.model.get('unsavedChanges') === true,\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t */\n\tupdateCount(count) {\n\t\tif (!this.model.get('hasTotal')) return;\n\n\t\t// Might not have rendered yet\n\t\tif (!this.$count) return;\n\n\t\tif (count == null) {\n\t\t\tconst collection = this.collection;\n\t\t\tif (\n\t\t\t\t!collection ||\n\t\t\t\t!this.$count ||\n\t\t\t\t!this.$count.length ||\n\t\t\t\t(this.requireSync && !collection.syncedOnce)\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tcount = collection.getTotal();\n\t\t}\n\n\t\tthis.$count.attr('data-count', count);\n\t\tthis.$count.html(count);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AppTabItemView';\n\t}\n}\n\nexport default AppTabItemView;\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appTabItemView';\n\nexport default class AppTabItemView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\tconst model = opts.model;\n\t\tconst active = model.get('active');\n\t\tconst index = model.collection.indexOf(model);\n\t\t// Support a vertical list over horizontal tabs\n\t\tconst useList = opts.useList === true;\n\n\t\topts.attributes = {\n\t\t\t'data-action': model.get('uniqueShowAction'),\n\t\t\t'aria-selected': active || !index,\n\t\t\t'data-nx-tab-name': model.get('name'),\n\t\t\t'data-nx-form-ignore': true,\n\t\t\trole: 'tab',\n\t\t};\n\t\tif (!useList) {\n\t\t\topts.attributes.type = 'button';\n\t\t}\n\n\t\topts.className = useList\n\t\t\t? `mdc-list-item nx-action`\n\t\t\t: `mdc-tab ${active || !index ? 'mdc-tab--active' : ''} nx-action`;\n\t\topts.tagName = useList ? 'a' : 'button';\n\n\t\tsuper(opts);\n\n\t\tthis.useList = useList === true;\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\t\tObject.assign(this.templateVars, {\n\t\t\tindex: model.collection.indexOf(model),\n\t\t\tuseList: this.useList,\n\t\t});\n\t}\n\n\t/** @method */\n\ttoggleActive() {\n\t\t// We are completely overriding the parent to deal with some inconsistencies\n\t\t// between core design and material theme\n\t\tconst model = this.model;\n\t\tthis.$title &&\n\t\t\tthis.$title.html(\n\t\t\t\tmodel.get('label') ||\n\t\t\t\t\t(this.relatedView && this.relatedView.headerTitle),\n\t\t\t);\n\n\t\tconst active = model.get('active') === true;\n\t\tconst el = this.el;\n\n\t\t// We just need to reflect selected item\n\t\tif (this.useList) {\n\t\t\tel.classList.toggle('mdc-list-item--selected', active);\n\t\t\treturn;\n\t\t}\n\n\t\t// Because we drop and render a bit we need to handle a few more class states\n\t\t// with mdc tabs\n\t\tel.classList.toggle('mdc-tab--active', active);\n\t\tel.setAttribute('aria-selected', active);\n\t\tel.querySelector('.mdc-tab-indicator').classList.toggle(\n\t\t\t'mdc-tab-indicator--active',\n\t\t\tactive,\n\t\t);\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/appTabItemsView.html';\n\nimport ChildViews from '@netx/core/functionality/childViews';\nimport ChildView from './appTabItemView';\n\nclass AppTabItemsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t\t// Edge case: this is a view that happens to use a viewCollection to simply populate it's children and not\n\t\t\t\t// to inherit everything from them. Rather than try and accomplish this solution somehow in addChildView\n\t\t\t\t// I figured it best to be handled in the views that are utilizing a viewCollection differently than say\n\t\t\t\t// a netx-multiView would - since these options get applied last (superceed all others) we just put back the\n\t\t\t\t// values we do not want to inherit from a viewSpec\n\t\t\t\toptions(model, opts) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttagName: 'li',\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\trole: 'presentation',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmodel: model,\n\t\t\t\t\t\tcollection: model.collection,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\t\treturn this.listenTo(\n\t\t\tthis.collection,\n\t\t\t'add remove',\n\t\t\t_.debounce(this.tabsChanged, 25),\n\t\t);\n\t}\n\n\t/** @method */\n\ttabsChanged() {\n\t\tthis.$el.toggleClass('multiple-tabs', this.collection.length > 1);\n\t}\n\n\t/**\n\t * @static\n\t * @type {string}\n\t */\n\tstatic get __name__() {\n\t\treturn 'AppTabItemsView';\n\t}\n}\n\n// Functionality\nChildViews(AppTabItemsView);\n\nexport default AppTabItemsView;\n","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport { cssClasses } from './constants';\n/**\n * Stores result from computeHorizontalScrollbarHeight to avoid redundant processing.\n */\nvar horizontalScrollbarHeight_;\n/**\n * Computes the height of browser-rendered horizontal scrollbars using a self-created test element.\n * May return 0 (e.g. on OS X browsers under default configuration).\n */\nexport function computeHorizontalScrollbarHeight(documentObj, shouldCacheResult) {\n if (shouldCacheResult === void 0) { shouldCacheResult = true; }\n if (shouldCacheResult && typeof horizontalScrollbarHeight_ !== 'undefined') {\n return horizontalScrollbarHeight_;\n }\n var el = documentObj.createElement('div');\n el.classList.add(cssClasses.SCROLL_TEST);\n documentObj.body.appendChild(el);\n var horizontalScrollbarHeight = el.offsetHeight - el.clientHeight;\n documentObj.body.removeChild(el);\n if (shouldCacheResult) {\n horizontalScrollbarHeight_ = horizontalScrollbarHeight;\n }\n return horizontalScrollbarHeight;\n}\n//# sourceMappingURL=util.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar cssClasses = {\n ANIMATING: 'mdc-tab-scroller--animating',\n SCROLL_AREA_SCROLL: 'mdc-tab-scroller__scroll-area--scroll',\n SCROLL_TEST: 'mdc-tab-scroller__test',\n};\nvar strings = {\n AREA_SELECTOR: '.mdc-tab-scroller__scroll-area',\n CONTENT_SELECTOR: '.mdc-tab-scroller__scroll-content',\n};\nexport { cssClasses, strings, };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar MDCTabScrollerRTL = /** @class */ (function () {\n function MDCTabScrollerRTL(adapter) {\n this.adapter_ = adapter;\n }\n return MDCTabScrollerRTL;\n}());\nexport { MDCTabScrollerRTL };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTabScrollerRTL;\n//# sourceMappingURL=rtl-scroller.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCTabScrollerRTL } from './rtl-scroller';\nvar MDCTabScrollerRTLDefault = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabScrollerRTLDefault, _super);\n function MDCTabScrollerRTLDefault() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTabScrollerRTLDefault.prototype.getScrollPositionRTL = function () {\n var currentScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n var right = this.calculateScrollEdges_().right;\n // Scroll values on most browsers are ints instead of floats so we round\n return Math.round(right - currentScrollLeft);\n };\n MDCTabScrollerRTLDefault.prototype.scrollToRTL = function (scrollX) {\n var edges = this.calculateScrollEdges_();\n var currentScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n var clampedScrollLeft = this.clampScrollValue_(edges.right - scrollX);\n return {\n finalScrollPosition: clampedScrollLeft,\n scrollDelta: clampedScrollLeft - currentScrollLeft,\n };\n };\n MDCTabScrollerRTLDefault.prototype.incrementScrollRTL = function (scrollX) {\n var currentScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n var clampedScrollLeft = this.clampScrollValue_(currentScrollLeft - scrollX);\n return {\n finalScrollPosition: clampedScrollLeft,\n scrollDelta: clampedScrollLeft - currentScrollLeft,\n };\n };\n MDCTabScrollerRTLDefault.prototype.getAnimatingScrollPosition = function (scrollX) {\n return scrollX;\n };\n MDCTabScrollerRTLDefault.prototype.calculateScrollEdges_ = function () {\n var contentWidth = this.adapter_.getScrollContentOffsetWidth();\n var rootWidth = this.adapter_.getScrollAreaOffsetWidth();\n return {\n left: 0,\n right: contentWidth - rootWidth,\n };\n };\n MDCTabScrollerRTLDefault.prototype.clampScrollValue_ = function (scrollX) {\n var edges = this.calculateScrollEdges_();\n return Math.min(Math.max(edges.left, scrollX), edges.right);\n };\n return MDCTabScrollerRTLDefault;\n}(MDCTabScrollerRTL));\nexport { MDCTabScrollerRTLDefault };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTabScrollerRTLDefault;\n//# sourceMappingURL=rtl-default-scroller.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCTabScrollerRTL } from './rtl-scroller';\nvar MDCTabScrollerRTLNegative = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabScrollerRTLNegative, _super);\n function MDCTabScrollerRTLNegative() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTabScrollerRTLNegative.prototype.getScrollPositionRTL = function (translateX) {\n var currentScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n return Math.round(translateX - currentScrollLeft);\n };\n MDCTabScrollerRTLNegative.prototype.scrollToRTL = function (scrollX) {\n var currentScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n var clampedScrollLeft = this.clampScrollValue_(-scrollX);\n return {\n finalScrollPosition: clampedScrollLeft,\n scrollDelta: clampedScrollLeft - currentScrollLeft,\n };\n };\n MDCTabScrollerRTLNegative.prototype.incrementScrollRTL = function (scrollX) {\n var currentScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n var clampedScrollLeft = this.clampScrollValue_(currentScrollLeft - scrollX);\n return {\n finalScrollPosition: clampedScrollLeft,\n scrollDelta: clampedScrollLeft - currentScrollLeft,\n };\n };\n MDCTabScrollerRTLNegative.prototype.getAnimatingScrollPosition = function (scrollX, translateX) {\n return scrollX - translateX;\n };\n MDCTabScrollerRTLNegative.prototype.calculateScrollEdges_ = function () {\n var contentWidth = this.adapter_.getScrollContentOffsetWidth();\n var rootWidth = this.adapter_.getScrollAreaOffsetWidth();\n return {\n left: rootWidth - contentWidth,\n right: 0,\n };\n };\n MDCTabScrollerRTLNegative.prototype.clampScrollValue_ = function (scrollX) {\n var edges = this.calculateScrollEdges_();\n return Math.max(Math.min(edges.right, scrollX), edges.left);\n };\n return MDCTabScrollerRTLNegative;\n}(MDCTabScrollerRTL));\nexport { MDCTabScrollerRTLNegative };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTabScrollerRTLNegative;\n//# sourceMappingURL=rtl-negative-scroller.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCTabScrollerRTL } from './rtl-scroller';\nvar MDCTabScrollerRTLReverse = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabScrollerRTLReverse, _super);\n function MDCTabScrollerRTLReverse() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTabScrollerRTLReverse.prototype.getScrollPositionRTL = function (translateX) {\n var currentScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n // Scroll values on most browsers are ints instead of floats so we round\n return Math.round(currentScrollLeft - translateX);\n };\n MDCTabScrollerRTLReverse.prototype.scrollToRTL = function (scrollX) {\n var currentScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n var clampedScrollLeft = this.clampScrollValue_(scrollX);\n return {\n finalScrollPosition: clampedScrollLeft,\n scrollDelta: currentScrollLeft - clampedScrollLeft,\n };\n };\n MDCTabScrollerRTLReverse.prototype.incrementScrollRTL = function (scrollX) {\n var currentScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n var clampedScrollLeft = this.clampScrollValue_(currentScrollLeft + scrollX);\n return {\n finalScrollPosition: clampedScrollLeft,\n scrollDelta: currentScrollLeft - clampedScrollLeft,\n };\n };\n MDCTabScrollerRTLReverse.prototype.getAnimatingScrollPosition = function (scrollX, translateX) {\n return scrollX + translateX;\n };\n MDCTabScrollerRTLReverse.prototype.calculateScrollEdges_ = function () {\n var contentWidth = this.adapter_.getScrollContentOffsetWidth();\n var rootWidth = this.adapter_.getScrollAreaOffsetWidth();\n return {\n left: contentWidth - rootWidth,\n right: 0,\n };\n };\n MDCTabScrollerRTLReverse.prototype.clampScrollValue_ = function (scrollX) {\n var edges = this.calculateScrollEdges_();\n return Math.min(Math.max(edges.right, scrollX), edges.left);\n };\n return MDCTabScrollerRTLReverse;\n}(MDCTabScrollerRTL));\nexport { MDCTabScrollerRTLReverse };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTabScrollerRTLReverse;\n//# sourceMappingURL=rtl-reverse-scroller.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses, strings } from './constants';\nimport { MDCTabScrollerRTLDefault } from './rtl-default-scroller';\nimport { MDCTabScrollerRTLNegative } from './rtl-negative-scroller';\nimport { MDCTabScrollerRTLReverse } from './rtl-reverse-scroller';\nvar MDCTabScrollerFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabScrollerFoundation, _super);\n function MDCTabScrollerFoundation(adapter) {\n var _this = _super.call(this, tslib_1.__assign({}, MDCTabScrollerFoundation.defaultAdapter, adapter)) || this;\n /**\n * Controls whether we should handle the transitionend and interaction events during the animation.\n */\n _this.isAnimating_ = false;\n return _this;\n }\n Object.defineProperty(MDCTabScrollerFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTabScrollerFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTabScrollerFoundation, \"defaultAdapter\", {\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n eventTargetMatchesSelector: function () { return false; },\n addClass: function () { return undefined; },\n removeClass: function () { return undefined; },\n addScrollAreaClass: function () { return undefined; },\n setScrollAreaStyleProperty: function () { return undefined; },\n setScrollContentStyleProperty: function () { return undefined; },\n getScrollContentStyleValue: function () { return ''; },\n setScrollAreaScrollLeft: function () { return undefined; },\n getScrollAreaScrollLeft: function () { return 0; },\n getScrollContentOffsetWidth: function () { return 0; },\n getScrollAreaOffsetWidth: function () { return 0; },\n computeScrollAreaClientRect: function () { return ({ top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 }); },\n computeScrollContentClientRect: function () { return ({ top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 }); },\n computeHorizontalScrollbarHeight: function () { return 0; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n MDCTabScrollerFoundation.prototype.init = function () {\n // Compute horizontal scrollbar height on scroller with overflow initially hidden, then update overflow to scroll\n // and immediately adjust bottom margin to avoid the scrollbar initially appearing before JS runs.\n var horizontalScrollbarHeight = this.adapter_.computeHorizontalScrollbarHeight();\n this.adapter_.setScrollAreaStyleProperty('margin-bottom', -horizontalScrollbarHeight + 'px');\n this.adapter_.addScrollAreaClass(MDCTabScrollerFoundation.cssClasses.SCROLL_AREA_SCROLL);\n };\n /**\n * Computes the current visual scroll position\n */\n MDCTabScrollerFoundation.prototype.getScrollPosition = function () {\n if (this.isRTL_()) {\n return this.computeCurrentScrollPositionRTL_();\n }\n var currentTranslateX = this.calculateCurrentTranslateX_();\n var scrollLeft = this.adapter_.getScrollAreaScrollLeft();\n return scrollLeft - currentTranslateX;\n };\n /**\n * Handles interaction events that occur during transition\n */\n MDCTabScrollerFoundation.prototype.handleInteraction = function () {\n // Early exit if we aren't animating\n if (!this.isAnimating_) {\n return;\n }\n // Prevent other event listeners from handling this event\n this.stopScrollAnimation_();\n };\n /**\n * Handles the transitionend event\n */\n MDCTabScrollerFoundation.prototype.handleTransitionEnd = function (evt) {\n // Early exit if we aren't animating or the event was triggered by a different element.\n var evtTarget = evt.target;\n if (!this.isAnimating_ ||\n !this.adapter_.eventTargetMatchesSelector(evtTarget, MDCTabScrollerFoundation.strings.CONTENT_SELECTOR)) {\n return;\n }\n this.isAnimating_ = false;\n this.adapter_.removeClass(MDCTabScrollerFoundation.cssClasses.ANIMATING);\n };\n /**\n * Increment the scroll value by the scrollXIncrement\n * @param scrollXIncrement The value by which to increment the scroll position\n */\n MDCTabScrollerFoundation.prototype.incrementScroll = function (scrollXIncrement) {\n // Early exit for non-operational increment values\n if (scrollXIncrement === 0) {\n return;\n }\n if (this.isRTL_()) {\n return this.incrementScrollRTL_(scrollXIncrement);\n }\n this.incrementScroll_(scrollXIncrement);\n };\n /**\n * Scrolls to the given scrollX value\n */\n MDCTabScrollerFoundation.prototype.scrollTo = function (scrollX) {\n if (this.isRTL_()) {\n return this.scrollToRTL_(scrollX);\n }\n this.scrollTo_(scrollX);\n };\n /**\n * @return Browser-specific {@link MDCTabScrollerRTL} instance.\n */\n MDCTabScrollerFoundation.prototype.getRTLScroller = function () {\n if (!this.rtlScrollerInstance_) {\n this.rtlScrollerInstance_ = this.rtlScrollerFactory_();\n }\n return this.rtlScrollerInstance_;\n };\n /**\n * @return translateX value from a CSS matrix transform function string.\n */\n MDCTabScrollerFoundation.prototype.calculateCurrentTranslateX_ = function () {\n var transformValue = this.adapter_.getScrollContentStyleValue('transform');\n // Early exit if no transform is present\n if (transformValue === 'none') {\n return 0;\n }\n // The transform value comes back as a matrix transformation in the form\n // of `matrix(a, b, c, d, tx, ty)`. We only care about tx (translateX) so\n // we're going to grab all the parenthesized values, strip out tx, and\n // parse it.\n var match = /\\((.+?)\\)/.exec(transformValue);\n if (!match) {\n return 0;\n }\n var matrixParams = match[1];\n // tslint:disable-next-line:ban-ts-ignore \"Unused vars\" should be a linter warning, not a compiler error.\n // @ts-ignore These unused variables should retain their semantic names for clarity.\n var _a = tslib_1.__read(matrixParams.split(','), 6), a = _a[0], b = _a[1], c = _a[2], d = _a[3], tx = _a[4], ty = _a[5];\n return parseFloat(tx); // tslint:disable-line:ban\n };\n /**\n * Calculates a safe scroll value that is > 0 and < the max scroll value\n * @param scrollX The distance to scroll\n */\n MDCTabScrollerFoundation.prototype.clampScrollValue_ = function (scrollX) {\n var edges = this.calculateScrollEdges_();\n return Math.min(Math.max(edges.left, scrollX), edges.right);\n };\n MDCTabScrollerFoundation.prototype.computeCurrentScrollPositionRTL_ = function () {\n var translateX = this.calculateCurrentTranslateX_();\n return this.getRTLScroller().getScrollPositionRTL(translateX);\n };\n MDCTabScrollerFoundation.prototype.calculateScrollEdges_ = function () {\n var contentWidth = this.adapter_.getScrollContentOffsetWidth();\n var rootWidth = this.adapter_.getScrollAreaOffsetWidth();\n return {\n left: 0,\n right: contentWidth - rootWidth,\n };\n };\n /**\n * Internal scroll method\n * @param scrollX The new scroll position\n */\n MDCTabScrollerFoundation.prototype.scrollTo_ = function (scrollX) {\n var currentScrollX = this.getScrollPosition();\n var safeScrollX = this.clampScrollValue_(scrollX);\n var scrollDelta = safeScrollX - currentScrollX;\n this.animate_({\n finalScrollPosition: safeScrollX,\n scrollDelta: scrollDelta,\n });\n };\n /**\n * Internal RTL scroll method\n * @param scrollX The new scroll position\n */\n MDCTabScrollerFoundation.prototype.scrollToRTL_ = function (scrollX) {\n var animation = this.getRTLScroller().scrollToRTL(scrollX);\n this.animate_(animation);\n };\n /**\n * Internal increment scroll method\n * @param scrollX The new scroll position increment\n */\n MDCTabScrollerFoundation.prototype.incrementScroll_ = function (scrollX) {\n var currentScrollX = this.getScrollPosition();\n var targetScrollX = scrollX + currentScrollX;\n var safeScrollX = this.clampScrollValue_(targetScrollX);\n var scrollDelta = safeScrollX - currentScrollX;\n this.animate_({\n finalScrollPosition: safeScrollX,\n scrollDelta: scrollDelta,\n });\n };\n /**\n * Internal increment scroll RTL method\n * @param scrollX The new scroll position RTL increment\n */\n MDCTabScrollerFoundation.prototype.incrementScrollRTL_ = function (scrollX) {\n var animation = this.getRTLScroller().incrementScrollRTL(scrollX);\n this.animate_(animation);\n };\n /**\n * Animates the tab scrolling\n * @param animation The animation to apply\n */\n MDCTabScrollerFoundation.prototype.animate_ = function (animation) {\n var _this = this;\n // Early exit if translateX is 0, which means there's no animation to perform\n if (animation.scrollDelta === 0) {\n return;\n }\n this.stopScrollAnimation_();\n // This animation uses the FLIP approach.\n // Read more here: https://aerotwist.com/blog/flip-your-animations/\n this.adapter_.setScrollAreaScrollLeft(animation.finalScrollPosition);\n this.adapter_.setScrollContentStyleProperty('transform', \"translateX(\" + animation.scrollDelta + \"px)\");\n // Force repaint\n this.adapter_.computeScrollAreaClientRect();\n requestAnimationFrame(function () {\n _this.adapter_.addClass(MDCTabScrollerFoundation.cssClasses.ANIMATING);\n _this.adapter_.setScrollContentStyleProperty('transform', 'none');\n });\n this.isAnimating_ = true;\n };\n /**\n * Stops scroll animation\n */\n MDCTabScrollerFoundation.prototype.stopScrollAnimation_ = function () {\n this.isAnimating_ = false;\n var currentScrollPosition = this.getAnimatingScrollPosition_();\n this.adapter_.removeClass(MDCTabScrollerFoundation.cssClasses.ANIMATING);\n this.adapter_.setScrollContentStyleProperty('transform', 'translateX(0px)');\n this.adapter_.setScrollAreaScrollLeft(currentScrollPosition);\n };\n /**\n * Gets the current scroll position during animation\n */\n MDCTabScrollerFoundation.prototype.getAnimatingScrollPosition_ = function () {\n var currentTranslateX = this.calculateCurrentTranslateX_();\n var scrollLeft = this.adapter_.getScrollAreaScrollLeft();\n if (this.isRTL_()) {\n return this.getRTLScroller().getAnimatingScrollPosition(scrollLeft, currentTranslateX);\n }\n return scrollLeft - currentTranslateX;\n };\n /**\n * Determines the RTL Scroller to use\n */\n MDCTabScrollerFoundation.prototype.rtlScrollerFactory_ = function () {\n // Browsers have three different implementations of scrollLeft in RTL mode,\n // dependent on the browser. The behavior is based off the max LTR\n // scrollLeft value and 0.\n //\n // * Default scrolling in RTL *\n // - Left-most value: 0\n // - Right-most value: Max LTR scrollLeft value\n //\n // * Negative scrolling in RTL *\n // - Left-most value: Negated max LTR scrollLeft value\n // - Right-most value: 0\n //\n // * Reverse scrolling in RTL *\n // - Left-most value: Max LTR scrollLeft value\n // - Right-most value: 0\n //\n // We use those principles below to determine which RTL scrollLeft\n // behavior is implemented in the current browser.\n var initialScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n this.adapter_.setScrollAreaScrollLeft(initialScrollLeft - 1);\n var newScrollLeft = this.adapter_.getScrollAreaScrollLeft();\n // If the newScrollLeft value is negative,then we know that the browser has\n // implemented negative RTL scrolling, since all other implementations have\n // only positive values.\n if (newScrollLeft < 0) {\n // Undo the scrollLeft test check\n this.adapter_.setScrollAreaScrollLeft(initialScrollLeft);\n return new MDCTabScrollerRTLNegative(this.adapter_);\n }\n var rootClientRect = this.adapter_.computeScrollAreaClientRect();\n var contentClientRect = this.adapter_.computeScrollContentClientRect();\n var rightEdgeDelta = Math.round(contentClientRect.right - rootClientRect.right);\n // Undo the scrollLeft test check\n this.adapter_.setScrollAreaScrollLeft(initialScrollLeft);\n // By calculating the clientRect of the root element and the clientRect of\n // the content element, we can determine how much the scroll value changed\n // when we performed the scrollLeft subtraction above.\n if (rightEdgeDelta === newScrollLeft) {\n return new MDCTabScrollerRTLReverse(this.adapter_);\n }\n return new MDCTabScrollerRTLDefault(this.adapter_);\n };\n MDCTabScrollerFoundation.prototype.isRTL_ = function () {\n return this.adapter_.getScrollContentStyleValue('direction') === 'rtl';\n };\n return MDCTabScrollerFoundation;\n}(MDCFoundation));\nexport { MDCTabScrollerFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTabScrollerFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { applyPassive } from '@material/dom/events';\nimport { matches } from '@material/dom/ponyfill';\nimport { MDCTabScrollerFoundation } from './foundation';\nimport * as util from './util';\nvar MDCTabScroller = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabScroller, _super);\n function MDCTabScroller() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTabScroller.attachTo = function (root) {\n return new MDCTabScroller(root);\n };\n MDCTabScroller.prototype.initialize = function () {\n this.area_ = this.root_.querySelector(MDCTabScrollerFoundation.strings.AREA_SELECTOR);\n this.content_ = this.root_.querySelector(MDCTabScrollerFoundation.strings.CONTENT_SELECTOR);\n };\n MDCTabScroller.prototype.initialSyncWithDOM = function () {\n var _this = this;\n this.handleInteraction_ = function () { return _this.foundation_.handleInteraction(); };\n this.handleTransitionEnd_ = function (evt) { return _this.foundation_.handleTransitionEnd(evt); };\n this.area_.addEventListener('wheel', this.handleInteraction_, applyPassive());\n this.area_.addEventListener('touchstart', this.handleInteraction_, applyPassive());\n this.area_.addEventListener('pointerdown', this.handleInteraction_, applyPassive());\n this.area_.addEventListener('mousedown', this.handleInteraction_, applyPassive());\n this.area_.addEventListener('keydown', this.handleInteraction_, applyPassive());\n this.content_.addEventListener('transitionend', this.handleTransitionEnd_);\n };\n MDCTabScroller.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.area_.removeEventListener('wheel', this.handleInteraction_, applyPassive());\n this.area_.removeEventListener('touchstart', this.handleInteraction_, applyPassive());\n this.area_.removeEventListener('pointerdown', this.handleInteraction_, applyPassive());\n this.area_.removeEventListener('mousedown', this.handleInteraction_, applyPassive());\n this.area_.removeEventListener('keydown', this.handleInteraction_, applyPassive());\n this.content_.removeEventListener('transitionend', this.handleTransitionEnd_);\n };\n MDCTabScroller.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n eventTargetMatchesSelector: function (evtTarget, selector) { return matches(evtTarget, selector); },\n addClass: function (className) { return _this.root_.classList.add(className); },\n removeClass: function (className) { return _this.root_.classList.remove(className); },\n addScrollAreaClass: function (className) { return _this.area_.classList.add(className); },\n setScrollAreaStyleProperty: function (prop, value) { return _this.area_.style.setProperty(prop, value); },\n setScrollContentStyleProperty: function (prop, value) { return _this.content_.style.setProperty(prop, value); },\n getScrollContentStyleValue: function (propName) { return window.getComputedStyle(_this.content_).getPropertyValue(propName); },\n setScrollAreaScrollLeft: function (scrollX) { return _this.area_.scrollLeft = scrollX; },\n getScrollAreaScrollLeft: function () { return _this.area_.scrollLeft; },\n getScrollContentOffsetWidth: function () { return _this.content_.offsetWidth; },\n getScrollAreaOffsetWidth: function () { return _this.area_.offsetWidth; },\n computeScrollAreaClientRect: function () { return _this.area_.getBoundingClientRect(); },\n computeScrollContentClientRect: function () { return _this.content_.getBoundingClientRect(); },\n computeHorizontalScrollbarHeight: function () { return util.computeHorizontalScrollbarHeight(document); },\n };\n // tslint:enable:object-literal-sort-keys\n return new MDCTabScrollerFoundation(adapter);\n };\n /**\n * Returns the current visual scroll position\n */\n MDCTabScroller.prototype.getScrollPosition = function () {\n return this.foundation_.getScrollPosition();\n };\n /**\n * Returns the width of the scroll content\n */\n MDCTabScroller.prototype.getScrollContentWidth = function () {\n return this.content_.offsetWidth;\n };\n /**\n * Increments the scroll value by the given amount\n * @param scrollXIncrement The pixel value by which to increment the scroll value\n */\n MDCTabScroller.prototype.incrementScroll = function (scrollXIncrement) {\n this.foundation_.incrementScroll(scrollXIncrement);\n };\n /**\n * Scrolls to the given pixel position\n * @param scrollX The pixel value to scroll to\n */\n MDCTabScroller.prototype.scrollTo = function (scrollX) {\n this.foundation_.scrollTo(scrollX);\n };\n return MDCTabScroller;\n}(MDCComponent));\nexport { MDCTabScroller };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar cssClasses = {\n ACTIVE: 'mdc-tab-indicator--active',\n FADE: 'mdc-tab-indicator--fade',\n NO_TRANSITION: 'mdc-tab-indicator--no-transition',\n};\nvar strings = {\n CONTENT_SELECTOR: '.mdc-tab-indicator__content',\n};\nexport { cssClasses, strings, };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses, strings } from './constants';\nvar MDCTabIndicatorFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabIndicatorFoundation, _super);\n function MDCTabIndicatorFoundation(adapter) {\n return _super.call(this, tslib_1.__assign({}, MDCTabIndicatorFoundation.defaultAdapter, adapter)) || this;\n }\n Object.defineProperty(MDCTabIndicatorFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTabIndicatorFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTabIndicatorFoundation, \"defaultAdapter\", {\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n addClass: function () { return undefined; },\n removeClass: function () { return undefined; },\n computeContentClientRect: function () { return ({ top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 }); },\n setContentStyleProperty: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n MDCTabIndicatorFoundation.prototype.computeContentClientRect = function () {\n return this.adapter_.computeContentClientRect();\n };\n return MDCTabIndicatorFoundation;\n}(MDCFoundation));\nexport { MDCTabIndicatorFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTabIndicatorFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCTabIndicatorFoundation } from './foundation';\n/* istanbul ignore next: subclass is not a branch statement */\nvar MDCFadingTabIndicatorFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCFadingTabIndicatorFoundation, _super);\n function MDCFadingTabIndicatorFoundation() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCFadingTabIndicatorFoundation.prototype.activate = function () {\n this.adapter_.addClass(MDCTabIndicatorFoundation.cssClasses.ACTIVE);\n };\n MDCFadingTabIndicatorFoundation.prototype.deactivate = function () {\n this.adapter_.removeClass(MDCTabIndicatorFoundation.cssClasses.ACTIVE);\n };\n return MDCFadingTabIndicatorFoundation;\n}(MDCTabIndicatorFoundation));\nexport { MDCFadingTabIndicatorFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCFadingTabIndicatorFoundation;\n//# sourceMappingURL=fading-foundation.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCTabIndicatorFoundation } from './foundation';\n/* istanbul ignore next: subclass is not a branch statement */\nvar MDCSlidingTabIndicatorFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCSlidingTabIndicatorFoundation, _super);\n function MDCSlidingTabIndicatorFoundation() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCSlidingTabIndicatorFoundation.prototype.activate = function (previousIndicatorClientRect) {\n // Early exit if no indicator is present to handle cases where an indicator\n // may be activated without a prior indicator state\n if (!previousIndicatorClientRect) {\n this.adapter_.addClass(MDCTabIndicatorFoundation.cssClasses.ACTIVE);\n return;\n }\n // This animation uses the FLIP approach. You can read more about it at the link below:\n // https://aerotwist.com/blog/flip-your-animations/\n // Calculate the dimensions based on the dimensions of the previous indicator\n var currentClientRect = this.computeContentClientRect();\n var widthDelta = previousIndicatorClientRect.width / currentClientRect.width;\n var xPosition = previousIndicatorClientRect.left - currentClientRect.left;\n this.adapter_.addClass(MDCTabIndicatorFoundation.cssClasses.NO_TRANSITION);\n this.adapter_.setContentStyleProperty('transform', \"translateX(\" + xPosition + \"px) scaleX(\" + widthDelta + \")\");\n // Force repaint before updating classes and transform to ensure the transform properly takes effect\n this.computeContentClientRect();\n this.adapter_.removeClass(MDCTabIndicatorFoundation.cssClasses.NO_TRANSITION);\n this.adapter_.addClass(MDCTabIndicatorFoundation.cssClasses.ACTIVE);\n this.adapter_.setContentStyleProperty('transform', '');\n };\n MDCSlidingTabIndicatorFoundation.prototype.deactivate = function () {\n this.adapter_.removeClass(MDCTabIndicatorFoundation.cssClasses.ACTIVE);\n };\n return MDCSlidingTabIndicatorFoundation;\n}(MDCTabIndicatorFoundation));\nexport { MDCSlidingTabIndicatorFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCSlidingTabIndicatorFoundation;\n//# sourceMappingURL=sliding-foundation.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCFadingTabIndicatorFoundation } from './fading-foundation';\nimport { MDCTabIndicatorFoundation } from './foundation';\nimport { MDCSlidingTabIndicatorFoundation } from './sliding-foundation';\nvar MDCTabIndicator = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabIndicator, _super);\n function MDCTabIndicator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTabIndicator.attachTo = function (root) {\n return new MDCTabIndicator(root);\n };\n MDCTabIndicator.prototype.initialize = function () {\n this.content_ = this.root_.querySelector(MDCTabIndicatorFoundation.strings.CONTENT_SELECTOR);\n };\n MDCTabIndicator.prototype.computeContentClientRect = function () {\n return this.foundation_.computeContentClientRect();\n };\n MDCTabIndicator.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n addClass: function (className) { return _this.root_.classList.add(className); },\n removeClass: function (className) { return _this.root_.classList.remove(className); },\n computeContentClientRect: function () { return _this.content_.getBoundingClientRect(); },\n setContentStyleProperty: function (prop, value) { return _this.content_.style.setProperty(prop, value); },\n };\n // tslint:enable:object-literal-sort-keys\n if (this.root_.classList.contains(MDCTabIndicatorFoundation.cssClasses.FADE)) {\n return new MDCFadingTabIndicatorFoundation(adapter);\n }\n // Default to the sliding indicator\n return new MDCSlidingTabIndicatorFoundation(adapter);\n };\n MDCTabIndicator.prototype.activate = function (previousIndicatorClientRect) {\n this.foundation_.activate(previousIndicatorClientRect);\n };\n MDCTabIndicator.prototype.deactivate = function () {\n this.foundation_.deactivate();\n };\n return MDCTabIndicator;\n}(MDCComponent));\nexport { MDCTabIndicator };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar cssClasses = {\n ACTIVE: 'mdc-tab--active',\n};\nvar strings = {\n ARIA_SELECTED: 'aria-selected',\n CONTENT_SELECTOR: '.mdc-tab__content',\n INTERACTED_EVENT: 'MDCTab:interacted',\n RIPPLE_SELECTOR: '.mdc-tab__ripple',\n TABINDEX: 'tabIndex',\n TAB_INDICATOR_SELECTOR: '.mdc-tab-indicator',\n};\nexport { cssClasses, strings, };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses, strings } from './constants';\nvar MDCTabFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabFoundation, _super);\n function MDCTabFoundation(adapter) {\n var _this = _super.call(this, tslib_1.__assign({}, MDCTabFoundation.defaultAdapter, adapter)) || this;\n _this.focusOnActivate_ = true;\n return _this;\n }\n Object.defineProperty(MDCTabFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTabFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTabFoundation, \"defaultAdapter\", {\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n addClass: function () { return undefined; },\n removeClass: function () { return undefined; },\n hasClass: function () { return false; },\n setAttr: function () { return undefined; },\n activateIndicator: function () { return undefined; },\n deactivateIndicator: function () { return undefined; },\n notifyInteracted: function () { return undefined; },\n getOffsetLeft: function () { return 0; },\n getOffsetWidth: function () { return 0; },\n getContentOffsetLeft: function () { return 0; },\n getContentOffsetWidth: function () { return 0; },\n focus: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n MDCTabFoundation.prototype.handleClick = function () {\n // It's up to the parent component to keep track of the active Tab and\n // ensure we don't activate a Tab that's already active.\n this.adapter_.notifyInteracted();\n };\n MDCTabFoundation.prototype.isActive = function () {\n return this.adapter_.hasClass(cssClasses.ACTIVE);\n };\n /**\n * Sets whether the tab should focus itself when activated\n */\n MDCTabFoundation.prototype.setFocusOnActivate = function (focusOnActivate) {\n this.focusOnActivate_ = focusOnActivate;\n };\n /**\n * Activates the Tab\n */\n MDCTabFoundation.prototype.activate = function (previousIndicatorClientRect) {\n this.adapter_.addClass(cssClasses.ACTIVE);\n this.adapter_.setAttr(strings.ARIA_SELECTED, 'true');\n this.adapter_.setAttr(strings.TABINDEX, '0');\n this.adapter_.activateIndicator(previousIndicatorClientRect);\n if (this.focusOnActivate_) {\n this.adapter_.focus();\n }\n };\n /**\n * Deactivates the Tab\n */\n MDCTabFoundation.prototype.deactivate = function () {\n // Early exit\n if (!this.isActive()) {\n return;\n }\n this.adapter_.removeClass(cssClasses.ACTIVE);\n this.adapter_.setAttr(strings.ARIA_SELECTED, 'false');\n this.adapter_.setAttr(strings.TABINDEX, '-1');\n this.adapter_.deactivateIndicator();\n };\n /**\n * Returns the dimensions of the Tab\n */\n MDCTabFoundation.prototype.computeDimensions = function () {\n var rootWidth = this.adapter_.getOffsetWidth();\n var rootLeft = this.adapter_.getOffsetLeft();\n var contentWidth = this.adapter_.getContentOffsetWidth();\n var contentLeft = this.adapter_.getContentOffsetLeft();\n return {\n contentLeft: rootLeft + contentLeft,\n contentRight: rootLeft + contentLeft + contentWidth,\n rootLeft: rootLeft,\n rootRight: rootLeft + rootWidth,\n };\n };\n return MDCTabFoundation;\n}(MDCFoundation));\nexport { MDCTabFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTabFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCRipple } from '@material/ripple/component';\nimport { MDCRippleFoundation } from '@material/ripple/foundation';\nimport { MDCTabIndicator } from '@material/tab-indicator/component';\nimport { MDCTabFoundation } from './foundation';\nvar MDCTab = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTab, _super);\n function MDCTab() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTab.attachTo = function (root) {\n return new MDCTab(root);\n };\n MDCTab.prototype.initialize = function (rippleFactory, tabIndicatorFactory) {\n if (rippleFactory === void 0) { rippleFactory = function (el, foundation) { return new MDCRipple(el, foundation); }; }\n if (tabIndicatorFactory === void 0) { tabIndicatorFactory = function (el) { return new MDCTabIndicator(el); }; }\n this.id = this.root_.id;\n var rippleSurface = this.root_.querySelector(MDCTabFoundation.strings.RIPPLE_SELECTOR);\n var rippleAdapter = tslib_1.__assign({}, MDCRipple.createAdapter(this), { addClass: function (className) { return rippleSurface.classList.add(className); }, removeClass: function (className) { return rippleSurface.classList.remove(className); }, updateCssVariable: function (varName, value) { return rippleSurface.style.setProperty(varName, value); } });\n var rippleFoundation = new MDCRippleFoundation(rippleAdapter);\n this.ripple_ = rippleFactory(this.root_, rippleFoundation);\n var tabIndicatorElement = this.root_.querySelector(MDCTabFoundation.strings.TAB_INDICATOR_SELECTOR);\n this.tabIndicator_ = tabIndicatorFactory(tabIndicatorElement);\n this.content_ = this.root_.querySelector(MDCTabFoundation.strings.CONTENT_SELECTOR);\n };\n MDCTab.prototype.initialSyncWithDOM = function () {\n var _this = this;\n this.handleClick_ = function () { return _this.foundation_.handleClick(); };\n this.listen('click', this.handleClick_);\n };\n MDCTab.prototype.destroy = function () {\n this.unlisten('click', this.handleClick_);\n this.ripple_.destroy();\n _super.prototype.destroy.call(this);\n };\n MDCTab.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n setAttr: function (attr, value) { return _this.root_.setAttribute(attr, value); },\n addClass: function (className) { return _this.root_.classList.add(className); },\n removeClass: function (className) { return _this.root_.classList.remove(className); },\n hasClass: function (className) { return _this.root_.classList.contains(className); },\n activateIndicator: function (previousIndicatorClientRect) { return _this.tabIndicator_.activate(previousIndicatorClientRect); },\n deactivateIndicator: function () { return _this.tabIndicator_.deactivate(); },\n notifyInteracted: function () { return _this.emit(MDCTabFoundation.strings.INTERACTED_EVENT, { tabId: _this.id }, true /* bubble */); },\n getOffsetLeft: function () { return _this.root_.offsetLeft; },\n getOffsetWidth: function () { return _this.root_.offsetWidth; },\n getContentOffsetLeft: function () { return _this.content_.offsetLeft; },\n getContentOffsetWidth: function () { return _this.content_.offsetWidth; },\n focus: function () { return _this.root_.focus(); },\n };\n // tslint:enable:object-literal-sort-keys\n return new MDCTabFoundation(adapter);\n };\n Object.defineProperty(MDCTab.prototype, \"active\", {\n /**\n * Getter for the active state of the tab\n */\n get: function () {\n return this.foundation_.isActive();\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTab.prototype, \"focusOnActivate\", {\n set: function (focusOnActivate) {\n this.foundation_.setFocusOnActivate(focusOnActivate);\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Activates the tab\n */\n MDCTab.prototype.activate = function (computeIndicatorClientRect) {\n this.foundation_.activate(computeIndicatorClientRect);\n };\n /**\n * Deactivates the tab\n */\n MDCTab.prototype.deactivate = function () {\n this.foundation_.deactivate();\n };\n /**\n * Returns the indicator's client rect\n */\n MDCTab.prototype.computeIndicatorClientRect = function () {\n return this.tabIndicator_.computeContentClientRect();\n };\n MDCTab.prototype.computeDimensions = function () {\n return this.foundation_.computeDimensions();\n };\n /**\n * Focuses the tab\n */\n MDCTab.prototype.focus = function () {\n this.root_.focus();\n };\n return MDCTab;\n}(MDCComponent));\nexport { MDCTab };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar strings = {\n ARROW_LEFT_KEY: 'ArrowLeft',\n ARROW_RIGHT_KEY: 'ArrowRight',\n END_KEY: 'End',\n ENTER_KEY: 'Enter',\n HOME_KEY: 'Home',\n SPACE_KEY: 'Space',\n TAB_ACTIVATED_EVENT: 'MDCTabBar:activated',\n TAB_SCROLLER_SELECTOR: '.mdc-tab-scroller',\n TAB_SELECTOR: '.mdc-tab',\n};\nvar numbers = {\n ARROW_LEFT_KEYCODE: 37,\n ARROW_RIGHT_KEYCODE: 39,\n END_KEYCODE: 35,\n ENTER_KEYCODE: 13,\n EXTRA_SCROLL_AMOUNT: 20,\n HOME_KEYCODE: 36,\n SPACE_KEYCODE: 32,\n};\nexport { numbers, strings };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { numbers, strings } from './constants';\nvar ACCEPTABLE_KEYS = new Set();\n// IE11 has no support for new Set with iterable so we need to initialize this by hand\nACCEPTABLE_KEYS.add(strings.ARROW_LEFT_KEY);\nACCEPTABLE_KEYS.add(strings.ARROW_RIGHT_KEY);\nACCEPTABLE_KEYS.add(strings.END_KEY);\nACCEPTABLE_KEYS.add(strings.HOME_KEY);\nACCEPTABLE_KEYS.add(strings.ENTER_KEY);\nACCEPTABLE_KEYS.add(strings.SPACE_KEY);\nvar KEYCODE_MAP = new Map();\n// IE11 has no support for new Map with iterable so we need to initialize this by hand\nKEYCODE_MAP.set(numbers.ARROW_LEFT_KEYCODE, strings.ARROW_LEFT_KEY);\nKEYCODE_MAP.set(numbers.ARROW_RIGHT_KEYCODE, strings.ARROW_RIGHT_KEY);\nKEYCODE_MAP.set(numbers.END_KEYCODE, strings.END_KEY);\nKEYCODE_MAP.set(numbers.HOME_KEYCODE, strings.HOME_KEY);\nKEYCODE_MAP.set(numbers.ENTER_KEYCODE, strings.ENTER_KEY);\nKEYCODE_MAP.set(numbers.SPACE_KEYCODE, strings.SPACE_KEY);\nvar MDCTabBarFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabBarFoundation, _super);\n function MDCTabBarFoundation(adapter) {\n var _this = _super.call(this, tslib_1.__assign({}, MDCTabBarFoundation.defaultAdapter, adapter)) || this;\n _this.useAutomaticActivation_ = false;\n return _this;\n }\n Object.defineProperty(MDCTabBarFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTabBarFoundation, \"numbers\", {\n get: function () {\n return numbers;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTabBarFoundation, \"defaultAdapter\", {\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n scrollTo: function () { return undefined; },\n incrementScroll: function () { return undefined; },\n getScrollPosition: function () { return 0; },\n getScrollContentWidth: function () { return 0; },\n getOffsetWidth: function () { return 0; },\n isRTL: function () { return false; },\n setActiveTab: function () { return undefined; },\n activateTabAtIndex: function () { return undefined; },\n deactivateTabAtIndex: function () { return undefined; },\n focusTabAtIndex: function () { return undefined; },\n getTabIndicatorClientRectAtIndex: function () { return ({ top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 }); },\n getTabDimensionsAtIndex: function () { return ({ rootLeft: 0, rootRight: 0, contentLeft: 0, contentRight: 0 }); },\n getPreviousActiveTabIndex: function () { return -1; },\n getFocusedTabIndex: function () { return -1; },\n getIndexOfTabById: function () { return -1; },\n getTabListLength: function () { return 0; },\n notifyTabActivated: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Switches between automatic and manual activation modes.\n * See https://www.w3.org/TR/wai-aria-practices/#tabpanel for examples.\n */\n MDCTabBarFoundation.prototype.setUseAutomaticActivation = function (useAutomaticActivation) {\n this.useAutomaticActivation_ = useAutomaticActivation;\n };\n MDCTabBarFoundation.prototype.activateTab = function (index) {\n var previousActiveIndex = this.adapter_.getPreviousActiveTabIndex();\n if (!this.indexIsInRange_(index) || index === previousActiveIndex) {\n return;\n }\n var previousClientRect;\n if (previousActiveIndex !== -1) {\n this.adapter_.deactivateTabAtIndex(previousActiveIndex);\n previousClientRect = this.adapter_.getTabIndicatorClientRectAtIndex(previousActiveIndex);\n }\n this.adapter_.activateTabAtIndex(index, previousClientRect);\n this.scrollIntoView(index);\n this.adapter_.notifyTabActivated(index);\n };\n MDCTabBarFoundation.prototype.handleKeyDown = function (evt) {\n // Get the key from the event\n var key = this.getKeyFromEvent_(evt);\n // Early exit if the event key isn't one of the keyboard navigation keys\n if (key === undefined) {\n return;\n }\n // Prevent default behavior for movement keys, but not for activation keys, since :active is used to apply ripple\n if (!this.isActivationKey_(key)) {\n evt.preventDefault();\n }\n if (this.useAutomaticActivation_) {\n if (this.isActivationKey_(key)) {\n return;\n }\n var index = this.determineTargetFromKey_(this.adapter_.getPreviousActiveTabIndex(), key);\n this.adapter_.setActiveTab(index);\n this.scrollIntoView(index);\n }\n else {\n var focusedTabIndex = this.adapter_.getFocusedTabIndex();\n if (this.isActivationKey_(key)) {\n this.adapter_.setActiveTab(focusedTabIndex);\n }\n else {\n var index = this.determineTargetFromKey_(focusedTabIndex, key);\n this.adapter_.focusTabAtIndex(index);\n this.scrollIntoView(index);\n }\n }\n };\n /**\n * Handles the MDCTab:interacted event\n */\n MDCTabBarFoundation.prototype.handleTabInteraction = function (evt) {\n this.adapter_.setActiveTab(this.adapter_.getIndexOfTabById(evt.detail.tabId));\n };\n /**\n * Scrolls the tab at the given index into view\n * @param index The tab index to make visible\n */\n MDCTabBarFoundation.prototype.scrollIntoView = function (index) {\n // Early exit if the index is out of range\n if (!this.indexIsInRange_(index)) {\n return;\n }\n // Always scroll to 0 if scrolling to the 0th index\n if (index === 0) {\n return this.adapter_.scrollTo(0);\n }\n // Always scroll to the max value if scrolling to the Nth index\n // MDCTabScroller.scrollTo() will never scroll past the max possible value\n if (index === this.adapter_.getTabListLength() - 1) {\n return this.adapter_.scrollTo(this.adapter_.getScrollContentWidth());\n }\n if (this.isRTL_()) {\n return this.scrollIntoViewRTL_(index);\n }\n this.scrollIntoView_(index);\n };\n /**\n * Private method for determining the index of the destination tab based on what key was pressed\n * @param origin The original index from which to determine the destination\n * @param key The name of the key\n */\n MDCTabBarFoundation.prototype.determineTargetFromKey_ = function (origin, key) {\n var isRTL = this.isRTL_();\n var maxIndex = this.adapter_.getTabListLength() - 1;\n var shouldGoToEnd = key === strings.END_KEY;\n var shouldDecrement = key === strings.ARROW_LEFT_KEY && !isRTL || key === strings.ARROW_RIGHT_KEY && isRTL;\n var shouldIncrement = key === strings.ARROW_RIGHT_KEY && !isRTL || key === strings.ARROW_LEFT_KEY && isRTL;\n var index = origin;\n if (shouldGoToEnd) {\n index = maxIndex;\n }\n else if (shouldDecrement) {\n index -= 1;\n }\n else if (shouldIncrement) {\n index += 1;\n }\n else {\n index = 0;\n }\n if (index < 0) {\n index = maxIndex;\n }\n else if (index > maxIndex) {\n index = 0;\n }\n return index;\n };\n /**\n * Calculates the scroll increment that will make the tab at the given index visible\n * @param index The index of the tab\n * @param nextIndex The index of the next tab\n * @param scrollPosition The current scroll position\n * @param barWidth The width of the Tab Bar\n */\n MDCTabBarFoundation.prototype.calculateScrollIncrement_ = function (index, nextIndex, scrollPosition, barWidth) {\n var nextTabDimensions = this.adapter_.getTabDimensionsAtIndex(nextIndex);\n var relativeContentLeft = nextTabDimensions.contentLeft - scrollPosition - barWidth;\n var relativeContentRight = nextTabDimensions.contentRight - scrollPosition;\n var leftIncrement = relativeContentRight - numbers.EXTRA_SCROLL_AMOUNT;\n var rightIncrement = relativeContentLeft + numbers.EXTRA_SCROLL_AMOUNT;\n if (nextIndex < index) {\n return Math.min(leftIncrement, 0);\n }\n return Math.max(rightIncrement, 0);\n };\n /**\n * Calculates the scroll increment that will make the tab at the given index visible in RTL\n * @param index The index of the tab\n * @param nextIndex The index of the next tab\n * @param scrollPosition The current scroll position\n * @param barWidth The width of the Tab Bar\n * @param scrollContentWidth The width of the scroll content\n */\n MDCTabBarFoundation.prototype.calculateScrollIncrementRTL_ = function (index, nextIndex, scrollPosition, barWidth, scrollContentWidth) {\n var nextTabDimensions = this.adapter_.getTabDimensionsAtIndex(nextIndex);\n var relativeContentLeft = scrollContentWidth - nextTabDimensions.contentLeft - scrollPosition;\n var relativeContentRight = scrollContentWidth - nextTabDimensions.contentRight - scrollPosition - barWidth;\n var leftIncrement = relativeContentRight + numbers.EXTRA_SCROLL_AMOUNT;\n var rightIncrement = relativeContentLeft - numbers.EXTRA_SCROLL_AMOUNT;\n if (nextIndex > index) {\n return Math.max(leftIncrement, 0);\n }\n return Math.min(rightIncrement, 0);\n };\n /**\n * Determines the index of the adjacent tab closest to either edge of the Tab Bar\n * @param index The index of the tab\n * @param tabDimensions The dimensions of the tab\n * @param scrollPosition The current scroll position\n * @param barWidth The width of the tab bar\n */\n MDCTabBarFoundation.prototype.findAdjacentTabIndexClosestToEdge_ = function (index, tabDimensions, scrollPosition, barWidth) {\n /**\n * Tabs are laid out in the Tab Scroller like this:\n *\n * Scroll Position\n * +---+\n * | | Bar Width\n * | +-----------------------------------+\n * | | |\n * | V V\n * | +-----------------------------------+\n * V | Tab Scroller |\n * +------------+--------------+-------------------+\n * | Tab | Tab | Tab |\n * +------------+--------------+-------------------+\n * | |\n * +-----------------------------------+\n *\n * To determine the next adjacent index, we look at the Tab root left and\n * Tab root right, both relative to the scroll position. If the Tab root\n * left is less than 0, then we know it's out of view to the left. If the\n * Tab root right minus the bar width is greater than 0, we know the Tab is\n * out of view to the right. From there, we either increment or decrement\n * the index.\n */\n var relativeRootLeft = tabDimensions.rootLeft - scrollPosition;\n var relativeRootRight = tabDimensions.rootRight - scrollPosition - barWidth;\n var relativeRootDelta = relativeRootLeft + relativeRootRight;\n var leftEdgeIsCloser = relativeRootLeft < 0 || relativeRootDelta < 0;\n var rightEdgeIsCloser = relativeRootRight > 0 || relativeRootDelta > 0;\n if (leftEdgeIsCloser) {\n return index - 1;\n }\n if (rightEdgeIsCloser) {\n return index + 1;\n }\n return -1;\n };\n /**\n * Determines the index of the adjacent tab closest to either edge of the Tab Bar in RTL\n * @param index The index of the tab\n * @param tabDimensions The dimensions of the tab\n * @param scrollPosition The current scroll position\n * @param barWidth The width of the tab bar\n * @param scrollContentWidth The width of the scroller content\n */\n MDCTabBarFoundation.prototype.findAdjacentTabIndexClosestToEdgeRTL_ = function (index, tabDimensions, scrollPosition, barWidth, scrollContentWidth) {\n var rootLeft = scrollContentWidth - tabDimensions.rootLeft - barWidth - scrollPosition;\n var rootRight = scrollContentWidth - tabDimensions.rootRight - scrollPosition;\n var rootDelta = rootLeft + rootRight;\n var leftEdgeIsCloser = rootLeft > 0 || rootDelta > 0;\n var rightEdgeIsCloser = rootRight < 0 || rootDelta < 0;\n if (leftEdgeIsCloser) {\n return index + 1;\n }\n if (rightEdgeIsCloser) {\n return index - 1;\n }\n return -1;\n };\n /**\n * Returns the key associated with a keydown event\n * @param evt The keydown event\n */\n MDCTabBarFoundation.prototype.getKeyFromEvent_ = function (evt) {\n if (ACCEPTABLE_KEYS.has(evt.key)) {\n return evt.key;\n }\n return KEYCODE_MAP.get(evt.keyCode);\n };\n MDCTabBarFoundation.prototype.isActivationKey_ = function (key) {\n return key === strings.SPACE_KEY || key === strings.ENTER_KEY;\n };\n /**\n * Returns whether a given index is inclusively between the ends\n * @param index The index to test\n */\n MDCTabBarFoundation.prototype.indexIsInRange_ = function (index) {\n return index >= 0 && index < this.adapter_.getTabListLength();\n };\n /**\n * Returns the view's RTL property\n */\n MDCTabBarFoundation.prototype.isRTL_ = function () {\n return this.adapter_.isRTL();\n };\n /**\n * Scrolls the tab at the given index into view for left-to-right user agents.\n * @param index The index of the tab to scroll into view\n */\n MDCTabBarFoundation.prototype.scrollIntoView_ = function (index) {\n var scrollPosition = this.adapter_.getScrollPosition();\n var barWidth = this.adapter_.getOffsetWidth();\n var tabDimensions = this.adapter_.getTabDimensionsAtIndex(index);\n var nextIndex = this.findAdjacentTabIndexClosestToEdge_(index, tabDimensions, scrollPosition, barWidth);\n if (!this.indexIsInRange_(nextIndex)) {\n return;\n }\n var scrollIncrement = this.calculateScrollIncrement_(index, nextIndex, scrollPosition, barWidth);\n this.adapter_.incrementScroll(scrollIncrement);\n };\n /**\n * Scrolls the tab at the given index into view in RTL\n * @param index The tab index to make visible\n */\n MDCTabBarFoundation.prototype.scrollIntoViewRTL_ = function (index) {\n var scrollPosition = this.adapter_.getScrollPosition();\n var barWidth = this.adapter_.getOffsetWidth();\n var tabDimensions = this.adapter_.getTabDimensionsAtIndex(index);\n var scrollWidth = this.adapter_.getScrollContentWidth();\n var nextIndex = this.findAdjacentTabIndexClosestToEdgeRTL_(index, tabDimensions, scrollPosition, barWidth, scrollWidth);\n if (!this.indexIsInRange_(nextIndex)) {\n return;\n }\n var scrollIncrement = this.calculateScrollIncrementRTL_(index, nextIndex, scrollPosition, barWidth, scrollWidth);\n this.adapter_.incrementScroll(scrollIncrement);\n };\n return MDCTabBarFoundation;\n}(MDCFoundation));\nexport { MDCTabBarFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTabBarFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCTabScroller } from '@material/tab-scroller/component';\nimport { MDCTab } from '@material/tab/component';\nimport { MDCTabFoundation } from '@material/tab/foundation';\nimport { MDCTabBarFoundation } from './foundation';\nvar strings = MDCTabBarFoundation.strings;\nvar tabIdCounter = 0;\nvar MDCTabBar = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTabBar, _super);\n function MDCTabBar() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTabBar.attachTo = function (root) {\n return new MDCTabBar(root);\n };\n Object.defineProperty(MDCTabBar.prototype, \"focusOnActivate\", {\n set: function (focusOnActivate) {\n this.tabList_.forEach(function (tab) { return tab.focusOnActivate = focusOnActivate; });\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTabBar.prototype, \"useAutomaticActivation\", {\n set: function (useAutomaticActivation) {\n this.foundation_.setUseAutomaticActivation(useAutomaticActivation);\n },\n enumerable: true,\n configurable: true\n });\n MDCTabBar.prototype.initialize = function (tabFactory, tabScrollerFactory) {\n if (tabFactory === void 0) { tabFactory = function (el) { return new MDCTab(el); }; }\n if (tabScrollerFactory === void 0) { tabScrollerFactory = function (el) { return new MDCTabScroller(el); }; }\n this.tabList_ = this.instantiateTabs_(tabFactory);\n this.tabScroller_ = this.instantiateTabScroller_(tabScrollerFactory);\n };\n MDCTabBar.prototype.initialSyncWithDOM = function () {\n var _this = this;\n this.handleTabInteraction_ = function (evt) { return _this.foundation_.handleTabInteraction(evt); };\n this.handleKeyDown_ = function (evt) { return _this.foundation_.handleKeyDown(evt); };\n this.listen(MDCTabFoundation.strings.INTERACTED_EVENT, this.handleTabInteraction_);\n this.listen('keydown', this.handleKeyDown_);\n for (var i = 0; i < this.tabList_.length; i++) {\n if (this.tabList_[i].active) {\n this.scrollIntoView(i);\n break;\n }\n }\n };\n MDCTabBar.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.unlisten(MDCTabFoundation.strings.INTERACTED_EVENT, this.handleTabInteraction_);\n this.unlisten('keydown', this.handleKeyDown_);\n this.tabList_.forEach(function (tab) { return tab.destroy(); });\n if (this.tabScroller_) {\n this.tabScroller_.destroy();\n }\n };\n MDCTabBar.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n scrollTo: function (scrollX) { return _this.tabScroller_.scrollTo(scrollX); },\n incrementScroll: function (scrollXIncrement) { return _this.tabScroller_.incrementScroll(scrollXIncrement); },\n getScrollPosition: function () { return _this.tabScroller_.getScrollPosition(); },\n getScrollContentWidth: function () { return _this.tabScroller_.getScrollContentWidth(); },\n getOffsetWidth: function () { return _this.root_.offsetWidth; },\n isRTL: function () { return window.getComputedStyle(_this.root_).getPropertyValue('direction') === 'rtl'; },\n setActiveTab: function (index) { return _this.foundation_.activateTab(index); },\n activateTabAtIndex: function (index, clientRect) { return _this.tabList_[index].activate(clientRect); },\n deactivateTabAtIndex: function (index) { return _this.tabList_[index].deactivate(); },\n focusTabAtIndex: function (index) { return _this.tabList_[index].focus(); },\n getTabIndicatorClientRectAtIndex: function (index) { return _this.tabList_[index].computeIndicatorClientRect(); },\n getTabDimensionsAtIndex: function (index) { return _this.tabList_[index].computeDimensions(); },\n getPreviousActiveTabIndex: function () {\n for (var i = 0; i < _this.tabList_.length; i++) {\n if (_this.tabList_[i].active) {\n return i;\n }\n }\n return -1;\n },\n getFocusedTabIndex: function () {\n var tabElements = _this.getTabElements_();\n var activeElement = document.activeElement;\n return tabElements.indexOf(activeElement);\n },\n getIndexOfTabById: function (id) {\n for (var i = 0; i < _this.tabList_.length; i++) {\n if (_this.tabList_[i].id === id) {\n return i;\n }\n }\n return -1;\n },\n getTabListLength: function () { return _this.tabList_.length; },\n notifyTabActivated: function (index) {\n return _this.emit(strings.TAB_ACTIVATED_EVENT, { index: index }, true);\n },\n };\n // tslint:enable:object-literal-sort-keys\n return new MDCTabBarFoundation(adapter);\n };\n /**\n * Activates the tab at the given index\n * @param index The index of the tab\n */\n MDCTabBar.prototype.activateTab = function (index) {\n this.foundation_.activateTab(index);\n };\n /**\n * Scrolls the tab at the given index into view\n * @param index THe index of the tab\n */\n MDCTabBar.prototype.scrollIntoView = function (index) {\n this.foundation_.scrollIntoView(index);\n };\n /**\n * Returns all the tab elements in a nice clean array\n */\n MDCTabBar.prototype.getTabElements_ = function () {\n return [].slice.call(this.root_.querySelectorAll(strings.TAB_SELECTOR));\n };\n /**\n * Instantiates tab components on all child tab elements\n */\n MDCTabBar.prototype.instantiateTabs_ = function (tabFactory) {\n return this.getTabElements_().map(function (el) {\n el.id = el.id || \"mdc-tab-\" + ++tabIdCounter;\n return tabFactory(el);\n });\n };\n /**\n * Instantiates tab scroller component on the child tab scroller element\n */\n MDCTabBar.prototype.instantiateTabScroller_ = function (tabScrollerFactory) {\n var tabScrollerElement = this.root_.querySelector(strings.TAB_SCROLLER_SELECTOR);\n if (tabScrollerElement) {\n return tabScrollerFactory(tabScrollerElement);\n }\n return null;\n };\n return MDCTabBar;\n}(MDCComponent));\nexport { MDCTabBar };\n//# sourceMappingURL=component.js.map","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appTabItemsView';\nimport '../css/appTabItems.less';\n\nimport ChildView from './appTabItemView';\n\nimport {MDCTabBar} from '@material/tab-bar';\nimport MaterialList from '@netx/core/functionality/materialList';\n\nclass AppTabItemsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = {\n\t\t\tviewClass(model) {\n\t\t\t\t// Do not render out a tab item view for this\n\t\t\t\tif (model.get('hideTab')) return;\n\t\t\t\treturn ChildView;\n\t\t\t},\n\t\t\t// Edge case: this is a view that happens to use a viewCollection to simply populate it's children and not\n\t\t\t// to inherit everything from them. Rather than try and accomplish this solution somehow in addChildView\n\t\t\t// I figured it best to be handled in the views that are utilizing a viewCollection differently than say\n\t\t\t// a netx-multiView would - since these options get applied last (superceed all others) we just put back the\n\t\t\t// values we do not want to inherit from a viewSpec\n\t\t\toptions(model, opts) {\n\t\t\t\treturn {\n\t\t\t\t\ttagName: 'li',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\trole: 'presentation',\n\t\t\t\t\t},\n\t\t\t\t\tmodel: model,\n\t\t\t\t\tcollection: model.collection,\n\t\t\t\t\tuseList: this.useList,\n\t\t\t\t};\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.materialList = {\n\t\t\tchildViews: true,\n\t\t\t...opts.materialList,\n\t\t};\n\t\tsuper(opts);\n\n\t\tthis.useList = opts.useList === true;\n\t}\n\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\t\treturn this.listenTo(this.collection, 'change:active', (tab, active) => {\n\t\t\tif (!active) return;\n\t\t\tthis.checkMaterialTabActive();\n\t\t});\n\t}\n\n\t/** @method */\n\tcheckMaterialTabActive() {\n\t\tif (!this.tabBar) return;\n\n\t\tconst active = this.collection.findWhere({active: true});\n\t\tif (!active) return;\n\n\t\tconst name = active.get('name');\n\t\tconst idx = this.tabBar.tabList_.findIndex((tab) => {\n\t\t\treturn tab.root_.getAttribute('data-nx-tab-name') === name;\n\t\t});\n\t\tif (idx > -1) {\n\t\t\tthis.tabBar.activateTab(idx);\n\t\t}\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tif (this.tabBar) {\n\t\t\tthis.tabBar.destroy();\n\t\t\tdelete this.tabBar;\n\t\t}\n\n\t\tsuper.preRender();\n\n\t\tObject.assign(this.templateVars, {\n\t\t\tuseList: this.useList,\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\tthis.setupMaterial();\n\t}\n\n\t/** @method */\n\tsetupMaterial() {\n\t\tif (this.useList) return;\n\n\t\tif (this.tabBar) {\n\t\t\tthis.tabBar.destroy();\n\t\t\tdelete this.tabBar;\n\t\t}\n\n\t\tconst el = this.el.querySelector('.mdc-tab-bar');\n\t\tif (!el) return;\n\n\t\tconst tabBar = (this.tabBar = new MDCTabBar(el));\n\t\treturn tabBar;\n\t}\n\n\t/** @override */\n\ttabsChanged() {\n\t\tsuper.tabsChanged();\n\n\t\tthis.setupMaterial();\n\t\tthis.checkMaterialTabActive();\n\t}\n}\n\nMaterialList(AppTabItemsView);\n\nexport default AppTabItemsView;\n","/**\n * A view for managaing tabbed views\n * All objects provided in `this.tabs` must conform to {@link Netx.Models.AppView}\n * @class\n *\n * @example\n * // View\n * /**\n * * @class\n * * @extends Netx.Views.TabView\n * *\\/\n * Netx.Views.ModuleFooView = Netx.Views.TabView.extend(/** @lends Netx.Views.ModuleFooView *\\/{\n * /**\n * * @type {string}\n * * @private\n * *\\/\n * module: 'module',\n * /** @type {template} *\\/\n * template: ModuleFooTemplate,\n * /** @type {string} *\\/\n * id: 'module-foo-view',\n * /** @type {i18n} *\\/\n * headerTitle: i18n.t('i18n.foo'),\n * /** @type {string} *\\/\n * defaultTab: 'fooBar', // The `name` of the tab\n * /**\n * * @override\n * * @returns {array} Tabs\n * * @see Netx.Models.AppView\n * * @see Netx.Collections.AppViews\n * *\\/\n * tabs() {\n * return [\n * // FooFoo\n * {\n * viewClass : ModuleFooFooView,\n * label : i18n.t('i18n.fooFoo'), // If you do not set this we will look into the view for `headerTitle`\n * iconOnly : true, // anything but true will display a label on the tab\n * name : 'fooFoo', // If you did not set this then your tab name is \"moduleFooFooView\"\n * uniqueShowAction : 'module:foo:foo:routed', // The event to fire when clicked. If you do not set this then your tab action will be automatically handled with `appView:[view.cid]:show` and the view will show automatically when clicked.\n * viewOptions : {\n * collection: this.fooFooCollection\n * }\n * },\n * // FooBar\n * {\n * viewClass : ModuleFooBarView,\n * label : i18n.t('i18n.fooBar'), // If you do not set this we will look into the view for `headerTitle`\n * iconOnly : true, // anything but true will display a label on the tab\n * showActions : ['module:foo:fooBar'], // If yet stet this then your view will show when the tab is clicked and when these events fire\n * name : 'fooBar', // If you did not set this then your tab name is \"moduleFooBarView\"\n * viewOptions : {\n * model: this.fooBarModel\n * }\n * }\n * ];\n * }\n * } );\n *\n * // If you want to decide what happens when a tab is clicked - provide a `uniqueShowAction`\n * // When you provide a `uniqueShowAction`, you are telling the tab view that you are going to handle everything to get that view shown\n * // If ommited, a dummy action is created and registered `appView:[view.cid]:show` and the view will just show itself when the corresponding tab is clicked\n * [\n * // Foo\n * {\n * ...\n * uniqueShowAction : 'module:foo:route'\n * }\n * ];\n *\n * // If you want other actions to trigger the showing of a tab - add them to the `showActions` array\n * // This means that, on top of clicking the tab, these actions firing wil lalso cause the corresponding view to show\n * [\n * // Foo\n * {\n * ...\n * showActions : ['module:foo:bar']\n * }\n * ];\n *\n * // If you want a simpler name for targetting your tab view - provide a `name`, otherwise the view name will be used in camelcase form\n * [\n * // Foo\n * {\n * ...\n * name : \"foo\"\n * }\n * ];\n *\n * // Calling on the view from a controller\n * /**\n * * @event module:module#module:foo:show\n * * @param {object} viewOptions View options\n * *\\/\n * dispatcher.on('module:foo:show', function( viewOptions ) {\n * Netx.app.appViews.add( {\n * viewClass : ModuleFooView, // View constructor\n * showActions : ['module:foo:show'], // An array of actions that this view will show itself on\n * viewOptions : viewOptions\n * } );\n * }, window );\n *\n * /**\n * * @event module:module#module:foo:routed\n * * @param {string} tab Tab name (tab name must match either the `name` given to the tabbed view within when it was defined - and if none was provided it would be the `viewClass` in camelCase form \"moduleFooFooView\")\n * * @fires module:module#module:foo\n * *\\/\n * dispatcher.on('module:foo:routed', function( tab ) {\n * // Do anything special because we came from route, if you want and then pass along\n * dispatcher.trigger('module:foo', tab );\n * } );\n *\n * /**\n * * @event module:module#module:foo\n * * @param {string} tab Tab name\n * * @fires module:module#module:foo:show\n * *\\/\n * dispatcher.on('module:foo', function( tab ) {\n * // Do any logic you need before calling on view\n * dispatcher.trigger('module:foo:show', {\n * tab: tab\n * } );\n * } );\n */\n\nimport Base from './netx-multiView';\n\nimport AppViewModel from '@netx/core-app/models/appView';\nimport AppTabItemsView from '@netx/core-app/views/appTabItemsView';\n\nclass TabView extends Base {\n\t/** @type {boolean} */\n\tget isTabView() {\n\t\treturn this.constructor.__isTabView__;\n\t}\n\n\t/**\n\t * @override\n\t * @listens {@link Netx.Models.AppView#change:viewOptions:tab}\n\t * @listens {@link Netx.Collections.AppViews#change:enabled}\n\t */\n\tconstructor(opts = {}) {\n\t\t/**\n\t\t * @property {object} childView - Child view object\n\t\t * @property {string} childView.viewClass - The view class to use when creating `childView`\n\t\t * @property {boolean} childView.noRender - Do not render the `childView` at creation (we will handle that when we need to)\n\t\t * @property {string} childView.target - The css selector to use when injecting a newly created `childView`\n\t\t * @property {object} childView.options - The view option to extend onto `childView` at creation (all the standard backbone view properties)\n\t\t * @property {object} childView.options.attributes - The `data-`attributes to extend on to `childView` at creation\n\t\t */\n\t\topts.childView = {\n\t\t\tviewClass(model) {\n\t\t\t\treturn model.get('viewClass');\n\t\t\t},\n\t\t\tnoRender: true,\n\t\t\ttarget: '[data-nx-control=\"tab-content\"]:first',\n\t\t\toptions: {\n\t\t\t\tattributes: {\n\t\t\t\t\t'data-layer': '',\n\t\t\t\t\trole: 'tabpanel',\n\t\t\t\t},\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\t// Unless explictely asked to, tabs will wait to be activated before instantiating their related view\n\t\topts.instantiateOnAdd = opts.instantiateOnAdd === true;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * Classes that will be added to views when they enter our `viewCollection`\n\t\t * These classes will be removed when they are removed from our `viewCollection`\n\t\t * This allows for transient views to have what they need when thye move from `multiView` to `multiView`\n\t\t * @type {string}\n\t\t * @default\n\t\t */\n\t\tthis.additionalViewClasses = opts.additionalViewClasses || 'tab-pane';\n\n\t\t/**\n\t\t * Automatically set tabs on first render\n\t\t * This will add the `this.tabs` to `this.viewCollection` and spawn `childView`s accordingly\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.automaticallySetTabs = opts.automaticallySetTabs !== false;\n\n\t\t/**\n\t\t * Should the view be immediately shown when added to our view collection\n\t\t * This would happen in `viewInstantiated`\n\t\t * @type {boolean}\n\t\t * @default\n\t\t */\n\t\tthis.showOnAdd = opts.showOnAdd === true;\n\n\t\t/**\n\t\t * The tab (`viewSpec` name) that should be shown if `tab` was not passed to `this` at creation\n\t\t * @type {string}\n\t\t * @default\n\t\t */\n\t\tthis.defaultTab = opts.defaultTab;\n\n\t\tthis.tab = opts.tab;\n\n\t\t/**\n\t\t * Options for the tabs view\n\t\t * @memberOf Netx.Views.TabView\n\t\t * @alias tabsViewOptions\n\t\t * @type {object}\n\t\t */\n\t\tthis.tabsViewOptions = opts.tabsViewOptions || {};\n\n\t\t/**\n\t\t * Tabs view\n\t\t * @memberOf Netx.Views.TabView\n\t\t * @alias tabsView\n\t\t * @type {Netx.Views.AppTabItemsView}\n\t\t */\n\t\tthis.tabsView = this.addSubView(\n\t\t\tnew AppTabItemsView({\n\t\t\t\tcollection: this.viewCollection,\n\t\t\t\t...this.tabsViewOptions,\n\t\t\t}),\n\t\t);\n\n\t\t// Hey, listen!\n\t\tif (this.viewSpec) {\n\t\t\tthis.listenTo(\n\t\t\t\tthis.viewSpec,\n\t\t\t\t'change:viewOptions:tab',\n\t\t\t\t(viewSpec, tab) => {\n\t\t\t\t\tthis.showViewByName(tab || this.defaultTab);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\t// Hey, listen!\n\t\tthis\n\t\t\t// This logic could move to `multiview` itself but am putting in tabs to start with\n\t\t\t.listenTo(this.viewCollection, 'change:enabled', (viewSpec, enabled) => {\n\t\t\t\tconst activeView = this.getActiveView();\n\t\t\t\t// We must have an active view\n\t\t\t\t// The active view must match the view that has changed\n\t\t\t\t// And that view is now disabled\n\t\t\t\tactiveView &&\n\t\t\t\t\tactiveView.viewSpec.id === viewSpec.id &&\n\t\t\t\t\t!enabled &&\n\t\t\t\t\tthis.showFirstEnabledView(viewSpec.id);\n\t\t\t})\n\t\t\t// Tab changed on view\n\t\t\t.listenTo(this, 'nx:change:tab', (view, newTab, oldTab) => {\n\t\t\t\t// Make sure it was us\n\t\t\t\tif (view.cid === this.cid) {\n\t\t\t\t\tthis.tabChanged(newTab, oldTab);\n\t\t\t\t}\n\t\t\t})\n\t\t\t// Wait until we have rendered once\n\t\t\t.listenToOnce(this, 'rendered', () => {\n\t\t\t\tthis.automaticallySetTabs &&\n\t\t\t\t\tthis.viewCollection.set(\n\t\t\t\t\t\t_.isFunction(this.tabs) ? this.tabs() : this.tabs,\n\t\t\t\t\t);\n\t\t\t});\n\n\t\tthis.$el.addClass('tab-view');\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$tabs = this.$('[data-nx-control=\"tabpanel\"]:first');\n\n\t\t// Tabs\n\t\tthis.$tabs.length &&\n\t\t\tthis.tabsView &&\n\t\t\tthis.tabsView.setElement(this.$tabs).render();\n\t}\n\n\t/**\n\t * @override\n\t * @param {module:core/lib/netx-view} view Instance of `netx-view`\n\t */\n\tbeforeShowView(view) {\n\t\t// Prevent the content area from jumping\n\t\tconst currentHeight = this.$childTargetEl.height();\n\t\tif (currentHeight) {\n\t\t\tthis.$childTargetEl.height(currentHeight);\n\t\t}\n\n\t\treturn super.beforeShowView(view);\n\t}\n\n\tregisterView(viewSpec) {\n\t\tsuper.registerView(viewSpec);\n\n\t\tconst tabName = viewSpec.get('name');\n\t\t// Defined tab\n\t\tif (this.tab) {\n\t\t\t// Does the view name match our set tab?\n\t\t\tif (tabName === this.tab) {\n\t\t\t\tlet view = viewSpec.get('view');\n\t\t\t\tif (!view) {\n\t\t\t\t\tview = this.instantiateView(viewSpec);\n\t\t\t\t}\n\t\t\t\t// Since a tab was provided - we will not run through the event system\n\t\t\t\t// as the logic to deduce that tab has already occured somewhere - and\n\t\t\t\t// it could very well create a loop\n\t\t\t\tthis.showView(view);\n\t\t\t}\n\t\t}\n\t\t// Default\n\t\telse if (tabName === this.defaultTab) {\n\t\t\tlet view = viewSpec.get('view');\n\t\t\tif (!view) {\n\t\t\t\tview = this.instantiateView(viewSpec);\n\t\t\t}\n\t\t\t// Make sure the shown promise has been fulfilled on this view before we try showing anything further\n\t\t\tthis.whenShown.then(() => {\n\t\t\t\t// Run through actions instead od directly showing the view - as no tab was provided via viewOptions\n\t\t\t\t// If there are no listeners for the view's `uniqueShowAction` - we are still always listening and will\n\t\t\t\t// show the view - if any other view makes further attempts to show the view, nothing will double down\n\t\t\t\t// since the view will already be shown. And if any other event is able to show the view before we try,\n\t\t\t\t// nothing will double down since the veiw has already been shown.\n\t\t\t\tthis.showTab(tabName);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Provided with the view we are changing to and the knowledge of the current view\n\t * you can block the change by returning `false`\n\t * @method\n\t * @param {Netx.View} view Instance of `Netx.View` we are changing to\n\t * @returns {boolean} Ok to change to and show view\n\t */\n\tviewChanging(view) {\n\t\tlet canChange = super.viewChanging(view);\n\n\t\tif (!canChange) return false;\n\n\t\t// Store last tab (if we can)\n\t\tconst activeView = this.getActiveView();\n\t\tif (activeView) {\n\t\t\tthis.lastTab = activeView.viewSpec.get('name');\n\t\t}\n\n\t\tconst viewSpec = view.viewSpec;\n\n\t\tlet routedView = false;\n\t\t// Only if our original view collection\n\t\tif (view.viewSpec.isMyOriginalCollection(this.viewCollection)) {\n\t\t\t// Check if the view was a result of routing\n\t\t\tif (view.isRouted !== false && Backbone.history.isRouting()) {\n\t\t\t\troutedView = true;\n\t\t\t}\n\t\t}\n\n\t\t// test the view's action\n\t\tcanChange = this.isViewActionValid(viewSpec);\n\n\t\t// We should not be showing this view based on action tests\n\t\tif (!canChange) {\n\t\t\tconst activeView = this.getActiveView();\n\t\t\t// There is not another view already showing ( If there is already an active view we just return false and stay where we are )\n\t\t\t// and we have other views we can show than this one\n\t\t\tif (!activeView && this.viewCollection.length > 1) {\n\t\t\t\t// Defer so our return gets processed first\n\t\t\t\t_.defer(() => {\n\t\t\t\t\tthis.showFirstEnabledView(viewSpec.id);\n\t\t\t\t});\n\t\t\t} else if (activeView && routedView) {\n\t\t\t\t// @if NODE_ENV='development'\n\t\t\t\tconsole.log('Putting route back', view.viewSpec.id);\n\t\t\t\t// @endif\n\n\t\t\t\t// Route back to where we were before we opened the modal.\n\t\t\t\tif (!_.isUndefined(view.routeMatch)) {\n\t\t\t\t\tNetx.router.exitRoute(view.routeMatch);\n\t\t\t\t} else {\n\t\t\t\t\tNetx.router.back();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn canChange;\n\t}\n\n\t/** @override */\n\tviewInstantiated(view) {\n\t\t// All child views will be fully removed on hide\n\t\tif (view.viewSpec.isMyOriginalCollection(this.viewCollection)) {\n\t\t\tview.removeOnHide = true;\n\t\t\tview.removeOnSimpleHide = false;\n\t\t}\n\n\t\tsuper.viewInstantiated(view);\n\n\t\t// // Defer so all actions have been registered in the viewSpec\n\t\t// // These get deduced at the same time as our method\n\t\t// _.defer(() => {\n\t\t// \tconst tabName = view.viewSpec.get('name');\n\t\t// \t// Defined tab\n\t\t// \tif (this.tab) {\n\t\t// \t\t// Does the view name match our set tab?\n\t\t// \t\tif (tabName === this.tab) {\n\t\t// \t\t\t// Since a tab was provided - we will not run through the event system\n\t\t// \t\t\t// as the logic to deduce that tab has already occured somewhere - and\n\t\t// \t\t\t// it could very well create a loop\n\t\t// \t\t\tthis.showView(view);\n\t\t// \t\t}\n\t\t// \t}\n\t\t// \t// Default\n\t\t// \telse if (tabName === this.defaultTab) {\n\t\t// \t\t// Make sure the shown promise has been fulfilled on this view before we try showing anything further\n\t\t// \t\tthis.whenShown.then(() => {\n\t\t// \t\t\t// Run through actions instead od directly showing the view - as no tab was provided via viewOptions\n\t\t// \t\t\t// If there are no listeners for the view's `uniqueShowAction` - we are still always listening and will\n\t\t// \t\t\t// show the view - if any other view makes further attempts to show the view, nothing will double down\n\t\t// \t\t\t// since the view will already be shown. And if any other event is able to show the view before we try,\n\t\t// \t\t\t// nothing will double down since the veiw has already been shown.\n\t\t// \t\t\tthis.showTab(tabName);\n\t\t// \t\t});\n\t\t// \t}\n\t\t// });\n\t}\n\n\t/** @override */\n\tviewAfterShown(view) {\n\t\tsuper.viewAfterShown(view);\n\n\t\t// Reset height\n\t\tview.rendered.then(() => {\n\t\t\tthis.$childTargetEl.height('');\n\t\t});\n\t}\n\n\t/**\n\t * `show` is about to start on a `childView`\n\t * At this point no animations or actual hiding [should] have taken place\n\t * @override\n\t * @param {Netx.View} view View (created via {@link Netx.Models.AppView})\n\t * @listens {@link Netx.Views.MultiView#view:showing|view:showing}\n\t */\n\tviewOnShowing(view) {\n\t\tsuper.viewOnShowing(view);\n\n\t\t// Store current tab\n\t\tthis.tab = view.viewSpec.get('name');\n\n\t\t// Fire custom event\n\t\tthis.trigger('nx:change:tab', this, this.tab, this.lastTab);\n\t}\n\n\t/**\n\t * This is different to `showView` as it will run through the action system\n\t * (and takes a tab name as opposed to a view instance)\n\t * @method\n\t * @param {string} name Tab name\n\t */\n\tshowTab(name) {\n\t\tlet viewSpec;\n\t\t// The `viewSpec` was passed\n\t\tif (name instanceof AppViewModel) {\n\t\t\tviewSpec = name;\n\t\t}\n\t\t// Assume view was passed (if it is a form view we get bad results for instanceof Netx.View - which I beleive is due to our wraaping that view's constructor)\n\t\telse if (name.cid) {\n\t\t\tviewSpec = this.viewCollection.findWhere({view: name});\n\t\t}\n\t\t// The name of the tab was passed\n\t\telse {\n\t\t\tviewSpec = this.viewCollection.findWhere({name: name});\n\t\t}\n\t\tif (viewSpec && this.isViewActionValid(viewSpec)) {\n\t\t\tconst action = Netx.Actions.Find(viewSpec.get('uniqueShowAction'));\n\t\t\taction && this.performAction(action, [viewSpec.get('view'), null]);\n\t\t}\n\t}\n\n\t/**\n\t * Tab has changed\n\t * @param {string} newTab New tab `name`\n\t * @param {string} oldTab Old tab `name`\n\t */\n\ttabChanged(newTab, oldTab) {\n\t\t//\n\t}\n\n\t/**\n\t * Define and return tab objects.\n\t * Override me with an array or method in your view\n\t * @method\n\t * @returns {array} Tabs\n\t * @see Netx.Models.AppView\n\t * @see Netx.Collections.AppViews\n\t */\n\ttabs() {\n\t\treturn [];\n\t}\n\n\t/** @type {boolean} */\n\tstatic get __isTabView__() {\n\t\treturn true;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'TabView';\n\t}\n}\n\nexport default TabView;\n","import savedCartsSingleton from '@netx/core-cart/collections/singleton/savedCart';\nimport useBackboneCollection from '@netx/core-components/hooks/useBackboneCollection';\nimport type {SavedCart} from '../types';\n\nexport const useSavedCarts = () => {\n\tconst savedCarts = useBackboneCollection(\n\t\tsavedCartsSingleton.allSavedCarts,\n\t\tfalse,\n\t);\n\n\treturn {\n\t\tsavedCarts,\n\t};\n};\n\nexport default useSavedCarts;\n","/**\n * Defines a different template for the category nodes in a drilldown category treee UI.\n * @class\n */\nimport Base from './categoryTreeNodeView';\nimport Template from '../templates/categoryTreeSelectNodeView.html';\n\nimport ChildView from './categoryTreeSelectNodeView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nexport default class CategoryTreeSelectNodeView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\t// for webpack, because of circular reference of categoryTreeSelectNodeView\n\t\t// ChildView = require('./categoryTreeSelectNodeView').default;\n\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tlazyLoad: true,\n\t\t\t\tviewClass: ChildView,\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additonal template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tselectedCategory: this.tree.selectedCategory || null,\n\t\t\tselectName: this.filtered\n\t\t\t\t? 'select-category-filtered'\n\t\t\t\t: 'select-category',\n\t\t\tuniqueId: _.uniqueId(`select-category-${this.model.id}`),\n\t\t\thasAddPermission: this.model.allows('add'),\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t */\n\tcheckActive() {\n\t\t// Do nothing\n\t}\n\n\t/**\n\t * @method\n\t */\n\tmakeActive() {\n\t\t// Do nothing\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CategoryTreeSelectNodeView';\n\t}\n}\n\n// Functionality\nChildViews(CategoryTreeSelectNodeView);\n","/**\n * CategoryTreeSelectNodesView uses a category tree and a search filter to let a user select a category\n * @class\n */\nimport Base from './categoryTreeNodesView';\nimport Template from '../templates/categoryTreeSelectNodesView.html';\n\nimport ChildView from './categoryTreeSelectNodeView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nexport default class CategoryTreeSelectNodesView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t\tlazyLoad: true,\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// If we are not filtered and we have a selected category on the tree - open it up\n\t\tif (!this.filtered && this.tree && this.tree.selectedCategory) {\n\t\t\tthis.setSelection(this.tree.selectedCategory);\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} catId Category id\n\t * @fires module:category#category:tree:open\n\t */\n\tsetSelection(catId) {\n\t\t// Ensure number\n\t\tcatId = parseInt(catId);\n\t\tif (!catId) return;\n\n\t\tdispatcher.trigger('category:tree:open', catId, this.tree, true);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CategoryTreeSelectNodesView';\n\t}\n}\n\n// Functionality\nChildViews(CategoryTreeSelectNodesView);\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/categoryTreeView.html';\n\nimport CategoryTreeNodesView from './categoryTreeNodesView';\nimport CategoryTreeSelectNodesView from './categoryTreeSelectNodesView';\n\nconst TreeViews = {\n\tCategoryTreeNodesView: CategoryTreeNodesView,\n\tCategoryTreeSelectNodesView: CategoryTreeSelectNodesView,\n};\n\nexport default class CategoryTreeView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'search nx-search': 'search',\n\t\t\t\t'click [data-nx-control=\"refresh\"]': 'refreshTree',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.categories');\n\t\topts.id = opts.id || 'category-tree-view';\n\t\topts.modalOptions = _.extend(\n\t\t\t{\n\t\t\t\tsize: 'lg',\n\t\t\t},\n\t\t\topts.modalOptions,\n\t\t);\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * The view class name of the tree nodes to use\n\t\t * @type {string}\n\t\t * @default\n\t\t */\n\t\tthis.treeViewClass = opts.treeViewClass || 'CategoryTreeNodesView';\n\n\t\t// Full view\n\t\tthis.treeNodesView = this.addSubView(\n\t\t\tnew TreeViews[this.treeViewClass]({\n\t\t\t\tcollection: this.collection.topLevelCategories,\n\t\t\t\ttree: this.collection,\n\t\t\t}),\n\t\t);\n\t\t// Filtered view\n\t\tthis.filteredTreeNodesView = this.addSubView(\n\t\t\tnew TreeViews[this.treeViewClass]({\n\t\t\t\tcollection: this.collection.filteredCategories,\n\t\t\t\ttree: this.collection,\n\t\t\t\tfiltered: true,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$all = this.$('[data-nx-control=\"all\"]');\n\t\tthis.$filtered = this.$('[data-nx-control=\"filtered\"]');\n\t\tthis.$search = this.$('nx-search');\n\n\t\tthis.$el.attr('data-depth', 1).removeClass('filtered');\n\n\t\t// this.search();\n\t\tthis.treeNodesView.setElement(this.$all).render();\n\t\tthis.filteredTreeNodesView.setElement(this.$filtered).render();\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Click event\n\t * @fires module:category#category:tree:refresh\n\t */\n\trefreshTree(e) {\n\t\tdispatcher.trigger('category:tree:refresh', this.collection);\n\t}\n\n\t/** @override */\n\tremove() {\n\t\t// Clear the category filter before removing this view, or it will stick\n\t\t// around the next time we show this view.\n\t\tthis.collection.clearSearch();\n\t\treturn super.remove();\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} Search event\n\t * @fires module:category#category:tree:search\n\t * @fires module:category#category:tree:search:clear\n\t */\n\tsearch(e) {\n\t\tconst searchStr = (this.$search && this.$search.val().trim()) || '';\n\t\t// We have a search string. It is at least 2 characters\n\t\tif (searchStr.length > 1) {\n\t\t\tthis.$el.addClass('filtered');\n\t\t\tdispatcher.trigger('category:tree:search', searchStr, this.collection);\n\t\t} else {\n\t\t\tthis.$el.removeClass('filtered');\n\t\t\t// searchString is set by searchCategoryName() but since it is never called here we never set the searchString on the collection.\n\t\t\t// It must be set here to avoid the wrong string being used when refreshing the tree\n\t\t\tdispatcher.trigger('category:tree:search:clear', this.collection);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CategoryTreeView';\n\t}\n}\n","import Base from '@netx/core-category/views/categoryTreeView';\n\nimport {\n\tfaAngleLeft,\n\tfaArrowCircleLeft,\n\tfaFolder,\n\tfaPencilAlt,\n\tfaPlus,\n\tfaSyncAlt,\n} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaAngleLeft,\n\tfaArrowCircleLeft,\n\tfaFolder,\n\tfaPencilAlt,\n\tfaPlus,\n\tfaSyncAlt,\n});\n\nexport default class CategoryTreeView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/categoryTreeSelectView.html';\nimport CategoryModel from '../models/category';\nimport Form from '@netx/core/functionality/form';\n\nimport CategoryTreeView from './categoryTreeView';\n\nexport default class CategoryTreeSelectView extends Base {\n\t/**\n\t * @override\n\t * @fires module:app#app:confirm\n\t * @fires module:category#category:tree:set:selection\n\t */\n\tconstructor(opts = {}) {\n\t\topts.eventStr = opts.eventStr || 'category:select';\n\t\topts.events = {\n\t\t\t'change [name=\"select-category\"]': 'categorySelected',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.selectCategory');\n\t\topts.hideOnSubmit = opts.hideOnSubmit !== false;\n\t\topts.id = opts.id || 'category-tree-select-view';\n\t\topts.modalOptions = {\n\t\t\tsize: 'md',\n\t\t\t...opts.modalOptions,\n\t\t};\n\t\topts.removeOnHide = opts.removeOnHide !== false;\n\t\topts.requiresChanges = opts.requiresChanges !== true;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tthis.hideEditButton = opts.hideEditButton || false;\n\n\t\tthis.tree = opts.tree || this.collection;\n\n\t\t// Hey, listen!\n\t\t// A category has been edited, if it is new, prompt the user to use it\n\t\tthis.listenTo(dispatcher, 'category:edit:success', (cat, isNew) => {\n\t\t\tif (!isNew || !(cat instanceof CategoryModel)) return;\n\n\t\t\tconst uniqueEvent = _.uniqueId('category:select:');\n\n\t\t\tthis\n\t\t\t\t// Listen for confirmation\n\t\t\t\t.listenToOnce(dispatcher, uniqueEvent + ':confirmed', (cat) => {\n\t\t\t\t\t// Stop listening to cancelled\n\t\t\t\t\tthis.stopListening(dispatcher, uniqueEvent + ':cancelled');\n\t\t\t\t\t// Update selection\n\t\t\t\t\tdispatcher.trigger('category:tree:set:selection', cat.id, this.tree);\n\t\t\t\t\t// Wait to be shown before firing submit\n\t\t\t\t\tthis.listenToOnce(this, 'shown', () => {\n\t\t\t\t\t\tthis.submit();\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t// Listen for cancel\n\t\t\t\t.listenToOnce(dispatcher, uniqueEvent + ':cancelled', () => {\n\t\t\t\t\t// Stop listening to confirmed\n\t\t\t\t\tthis.stopListening(dispatcher, uniqueEvent + ':confirmed');\n\t\t\t\t});\n\n\t\t\t// Confirm with user if they would like to use the newly created category as their selection\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t(\n\t\t\t\t\t'category:i18n.wouldYoulikeToUseNewlyCreatedCategoryAsSelection',\n\t\t\t\t\t{\n\t\t\t\t\t\tdefaultValue:\n\t\t\t\t\t\t\t'Would you like to use the newly created category \"__category__\" as your selection?',\n\t\t\t\t\t\tcategory: cat.get('name'),\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t\teventStr: uniqueEvent,\n\t\t\t\targs: [cat],\n\t\t\t});\n\t\t});\n\n\t\t// Tree nodes view\n\t\tthis.treeView = this.addSubView(\n\t\t\tnew CategoryTreeView({\n\t\t\t\tcollection: this.tree,\n\t\t\t\ttreeViewClass: 'CategoryTreeSelectNodesView',\n\t\t\t\thideEditButton: this.hideEditButton,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$tree = this.$('[data-nx-control=\"tree\"]:first');\n\t\tthis.treeView.setElement(this.$tree).render();\n\t}\n\n\t/** @override */\n\tsubmitArgs() {\n\t\treturn [\n\t\t\t{categoryId: this.tree.selectedCategory},\n\t\t\tthis.model || this.collection,\n\t\t].concat(this.args);\n\t}\n\n\t/** @override */\n\tsubmitReady() {\n\t\treturn !isNaN(this.tree.selectedCategory);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Change event\n\t * @fires module:category#category:tree:set:selection\n\t */\n\tcategorySelected(e) {\n\t\tconst $target = this.$(e.target);\n\t\tconst oldCatId = this.tree.selectedCatgeory;\n\n\t\tif ($target.is(':checked')) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'category:tree:set:selection',\n\t\t\t\tparseInt($target.closest('[data-nx-model-id]').data('nx-model-id')),\n\t\t\t\tthis.tree,\n\t\t\t);\n\t\t\tthis.$(\n\t\t\t\t'[data-nx-control=\"select-category\"][value=\"' +\n\t\t\t\t\tthis.tree.selectedCategory +\n\t\t\t\t\t'\"]',\n\t\t\t).prop('checked', true);\n\t\t}\n\t\t// Make sure any others get unset ( like filtered vs full tree and vice versa)\n\t\tif (oldCatId && oldCatId !== this.tree.selectedCategory) {\n\t\t\tthis.$(\n\t\t\t\t'[data-nx-control=\"select-category\"][value=\"' + oldCatId + '\"]',\n\t\t\t).prop('checked', false);\n\t\t}\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CategoryTreeSelectView';\n\t}\n}\n\n// Functionality\nForm(CategoryTreeSelectView);\n","import React from 'react';\n\nexport type {FixedSizeList} from 'react-window';\n\nimport {\n\tVirtualizedTable,\n\tVirtualizedTableProps,\n} from '../../components/VirtualizedTable';\nimport {TableLayoutProvider, TableLayoutProviderProps} from '../../contexts';\nimport type {BaseItemData} from '../../types';\n\n/**\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n */\nexport interface VirtualizedTableContainerProps<ItemData extends BaseItemData>\n\textends Omit<VirtualizedTableProps<ItemData>, 'itemSize'> {\n\tcolumns: TableLayoutProviderProps<ItemData>['columns'];\n\tfrozenLeadingColumnCount?: number;\n\tfrozenTrailingColumnCount?: number;\n\tpageSize?: number;\n}\n\n/**\n * Virtualized table container\\\n * Renders `VirtualizedTable` within a `TableProvider`\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n */\nexport const VirtualizedTableContainerPrimitive = <\n\tItemData extends BaseItemData\n>({\n\tcolumns,\n\tfrozenTrailingColumnCount = 0,\n\tfrozenLeadingColumnCount = 0,\n\tpageSize,\n\t// Passed to `VirtualizedTable`\n\t...props\n}: VirtualizedTableContainerProps<ItemData>) => {\n\treturn (\n\t\t<TableLayoutProvider<ItemData>\n\t\t\tcolumns={columns}\n\t\t\tfrozenLeadingColumnCount={frozenLeadingColumnCount}\n\t\t\tfrozenTrailingColumnCount={frozenTrailingColumnCount}\n\t\t\tpageSize={pageSize}\n\t\t\ttotalRows={props.total}\n\t\t>\n\t\t\t<VirtualizedTable<ItemData> {...props} columns={columns} />\n\t\t</TableLayoutProvider>\n\t);\n};\n\n/**\n * Memo-ized Virtualized table container\\\n * Renders `VirtualizedTable` within a `TableLayoutProvider`\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\\\n */\nexport const VirtualizedTableContainer = React.memo(\n\tVirtualizedTableContainerPrimitive,\n) as <ItemData extends BaseItemData>(\n\tprops: VirtualizedTableContainerProps<ItemData>,\n) => JSX.Element;\n\nexport default VirtualizedTableContainer;\n","import React from 'react';\n\nimport {bytes} from '@netx/core/lib/underscore-netx';\n\nimport GenericCell from './Generic';\nimport type {BaseItemData, CellProps} from '../../types';\n\n/**\n * Display a `byte` formatted cell\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nconst ByteCellPrimitive = <ItemData extends BaseItemData>({\n\tvalue,\n\t...props\n}: CellProps<ItemData>) => (\n\t<GenericCell<ItemData> {...props} value={bytes(value)} />\n);\n\nexport const ByteCell = React.memo(ByteCellPrimitive) as <\n\tItemData extends BaseItemData\n>(\n\tprops: CellProps<ItemData>,\n) => JSX.Element;\nexport default ByteCell;\n","import React, {useEffect} from 'react';\nimport {useSortable} from '@dnd-kit/sortable';\n\nimport IconButton from '@netx/core-components/IconButton';\nimport {ArrowFocusTrapItemActions} from '@netx/core-components/ArrowFocusTrap';\nimport {faEquals as EqualsIcon} from '@fortawesome/pro-solid-svg-icons';\nimport type {BaseItemData, CellProps} from '../../types';\nimport {useArrowFocusTrap} from '@netx/core-components/ArrowFocusTrap';\n\nimport {styled} from '@netx/core-components/Theme';\n\nconst DragHandleCellRoot = styled(IconButton)(({theme}) => ({\n\tcursor: 'grab',\n}));\n\nconst DragHandleCellPrimitive = <ItemData extends BaseItemData>({\n\trow,\n\tisClone,\n}: CellProps<ItemData>) => {\n\tconst {attributes, listeners, isDragging} = useSortable({\n\t\tdisabled: isClone,\n\t\tid: isClone ? '' : (row.original as any).id?.toString() ?? row.id,\n\t});\n\n\treturn (\n\t\t<ArrowFocusTrapItemActions index={row.index}>\n\t\t\t<DragHandleCellRoot\n\t\t\t\t{...listeners}\n\t\t\t\t{...attributes}\n\t\t\t\ticon={EqualsIcon}\n\t\t\t\tdisabled={isDragging}\n\t\t\t/>\n\t\t</ArrowFocusTrapItemActions>\n\t);\n};\n\nexport const DragHandleCell = DragHandleCellPrimitive;\nexport default DragHandleCell;\n","/**\n * This is a view for statically showing all attribute names and values for a particular asset and attribute set\n * @class\n * @extends Netx.View\n * @TODO One day it might be worth turning this into a child view setup - but not today\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetAttributesView.html';\n\nexport default class AssetAttributesView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'asset-attributes';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * Length of attribute value before it gets truncated\n\t\t * @type {number}\n\t\t * @default\n\t\t */\n\t\tthis.truncateValuesAt = opts.truncateValuesAt || 60;\n\t}\n\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\t\treturn this.listenTo(\n\t\t\tthis.collection,\n\t\t\t'sync add remove reset',\n\t\t\t_.debounce(this.render, 5),\n\t\t);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\t// This is a hold over until the system attrs are part of the attribute system fully\n\t\treturn this.listenTo(\n\t\t\tthis.model,\n\t\t\t'change:attributeValues change:file',\n\t\t\t_.debounce(this.render, 5),\n\t\t);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\t\tconst metadata = model.metadata;\n\t\tconst noValueStr = i18n.t('i18n.noValue');\n\t\tconst setAttributes = this.collection.getAttributes();\n\t\tconst primaryAttribute = setAttributes.at(0);\n\n\t\t// Map our data so the template does not have to\n\t\tconst assetAttributes = _.compact(\n\t\t\tsetAttributes.map(attrModel => {\n\t\t\t\tlet value = model.getAttribute(attrModel.id);\n\t\t\t\tconst formattedValue = model.getAttribute(attrModel.id, null, {\n\t\t\t\t\tformat: true,\n\t\t\t\t\ttruncateAt: this.truncateValuesAt,\n\t\t\t\t});\n\n\t\t\t\t// Ensure string for what is to come\n\t\t\t\tvalue = value.toString();\n\n\t\t\t\tconst empty = value === '';\n\t\t\t\treturn {\n\t\t\t\t\tname: attrModel.get('name'),\n\t\t\t\t\tlabel: attrModel.getLabel(),\n\t\t\t\t\tvalue: (!empty && value) || noValueStr,\n\t\t\t\t\tformattedValue: (!empty && formattedValue) || noValueStr,\n\t\t\t\t\tempty: empty,\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\t// Additonal template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tassetAttributes: assetAttributes,\n\t\t\tprimaryAttribute:\n\t\t\t\t(primaryAttribute &&\n\t\t\t\t\t_.findWhere(assetAttributes, {name: primaryAttribute.get('name')})) ||\n\t\t\t\tfalse,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetAttributesView';\n\t}\n}\n","/** @override */\nimport Base from '@netx/core-asset/views/assetAttributesView';\n\nimport cmsConfig from '@netx/core-cms/config';\n\nexport default class AssetAttributesView extends Base {\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst noValueStr = i18n.t('i18n.noValue');\n\t\tconst detailAttributes = Netx.asset.attributeSets.filters.get(\n\t\t\t'detailAttributes',\n\t\t);\n\t\tconst attributeIds = detailAttributes\n\t\t\t? detailAttributes.get('attributeIds')\n\t\t\t: [];\n\t\tconst setAttributes = this.collection.getAttributes();\n\t\tconst model = this.model;\n\n\t\tlet assetAttributes = [];\n\t\tattributeIds.forEach((attrId, idx, all) => {\n\t\t\tconst attr = setAttributes.find({attributeid: attrId});\n\t\t\tif (attr) {\n\t\t\t\tassetAttributes.push(attr);\n\t\t\t}\n\t\t});\n\t\tassetAttributes = assetAttributes.map((attrModel) => {\n\t\t\tlet value = model.getAttribute(attrModel.id);\n\t\t\tconst formattedValue = model.getAttribute(attrModel.id, null, {\n\t\t\t\tformat: true,\n\t\t\t\ttruncateAt: this.truncateValuesAt,\n\t\t\t});\n\n\t\t\t// Ensure string for what is to come\n\t\t\tvalue = value.toString();\n\n\t\t\tconst empty = value === '';\n\t\t\treturn {\n\t\t\t\tid: attrModel.id,\n\t\t\t\tname: attrModel.get('name'),\n\t\t\t\tlabel: attrModel.getLabel(),\n\t\t\t\tvalue: (!empty && value) || noValueStr,\n\t\t\t\tformattedValue: (!empty && formattedValue) || noValueStr,\n\t\t\t\tempty: empty,\n\t\t\t};\n\t\t});\n\n\t\tObject.assign(this.templateVars, {\n\t\t\tassetAttributes: assetAttributes,\n\t\t});\n\t}\n}\n","const NAME = 'materialTextFields';\n\nimport {MDCTextField} from '@material/textfield';\nimport {purgeEls} from '@netx/core/lib/utils';\nimport {notchOutlinePatch} from './patches/mdc-textfield';\n\nexport default function (target) {\n\tif (!target || target.hasFunctionality(NAME)) return target;\n\n\ttarget.addInitializer((instance, opts = {}) => {\n\t\tlet materialTextFields = [];\n\t\tlet dateComponents = [];\n\n\t\tconst cleanUp = () => {\n\t\t\t_.invoke(materialTextFields, 'destroy');\n\t\t\tmaterialTextFields = [];\n\t\t\tdateComponents = [];\n\t\t};\n\n\t\tconst getMaterailTextField = (el) => {\n\t\t\tfor (let i = 0, c = materialTextFields.length; i < c; i++) {\n\t\t\t\tconst textField = materialTextFields[i];\n\t\t\t\tif (textField.input_ === el) {\n\t\t\t\t\treturn textField;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tinstance.events = {\n\t\t\t'change .mdc-text-field [data-provide=\"datepicker\"]'(e) {\n\t\t\t\tconst target = e.currentTarget;\n\t\t\t\tdateComponents.forEach((textField) => {\n\t\t\t\t\tif (textField.input_ !== target) return;\n\t\t\t\t\t// This will fix the floating label and validation\n\t\t\t\t\tconst foundation = textField.foundation_;\n\t\t\t\t\tfoundation.deactivateFocus();\n\t\t\t\t});\n\t\t\t},\n\t\t\t...instance.events,\n\t\t};\n\n\t\tinstance.materialTextFieldFloatLabel = (el, shouldFloat = false) => {\n\t\t\tconst textField = getMaterailTextField(el);\n\t\t\tif (!textField || !textField.label_) return;\n\t\t\ttextField.label_.float(shouldFloat);\n\t\t\ttextField.foundation_.notchOutline &&\n\t\t\t\ttextField.foundation_.notchOutline(shouldFloat);\n\t\t};\n\n\t\t// Hey, listen!\n\t\tinstance\n\t\t\t.on('preRenderHook', cleanUp)\n\t\t\t.on('removeHook', cleanUp)\n\t\t\t.on('postRenderHook', () => {\n\t\t\t\tdateComponents = [];\n\t\t\t\tmaterialTextFields = purgeEls(\n\t\t\t\t\t[...instance.el.querySelectorAll('.mdc-text-field')],\n\t\t\t\t\tinstance.getExcludedViews(),\n\t\t\t\t).map((field) => {\n\t\t\t\t\t// Hack for typeahead - we want the styles but mdc will grab it first (since it gets prepended)\n\t\t\t\t\t// Remove the class before creating mdc-text-field and then re-add\n\t\t\t\t\tconst ttInputEl = field.querySelector(\n\t\t\t\t\t\t'.mdc-text-field__input.tt-hint',\n\t\t\t\t\t);\n\t\t\t\t\tif (ttInputEl) {\n\t\t\t\t\t\tttInputEl.classList.remove('mdc-text-field__input');\n\t\t\t\t\t}\n\n\t\t\t\t\tconst inputEl = field.querySelector('.mdc-text-field__input');\n\t\t\t\t\tif (!inputEl) return;\n\n\t\t\t\t\tconst textField = new MDCTextField(field);\n\t\t\t\t\tif (field.classList.contains('mdc-text-field--textarea')) {\n\t\t\t\t\t\tnotchOutlinePatch(textField);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (inputEl.getAttribute('data-provide') === 'datepicker') {\n\t\t\t\t\t\tdateComponents.push(textField);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Put the class back for styles\n\t\t\t\t\tif (ttInputEl) {\n\t\t\t\t\t\tttInputEl.classList.add('mdc-text-field__input');\n\t\t\t\t\t}\n\n\t\t\t\t\treturn textField;\n\t\t\t\t});\n\t\t\t});\n\t}, NAME);\n\n\treturn target;\n}\n","import {cssClasses, numbers} from '@material/textfield/constants';\n\n/**\n * As of v3 there is no mechanism for material components to know that measurable widths\n * have changed - so if a textfield has a value, is a textarea, and was rendered prior to\n * being measurable in the DOM, we wind up with a missing floating label\n * This will hopefully go away as we switch over to react\n * @function\n * @param {MDCTextfield} textfield Instance of mdc-textfield\n */\nexport const notchOutlinePatch = (textfield) => {\n\t// Do not patch twice\n\tif (!textfield || textfield.notchOutlinePatched_) return;\n\ttextfield.notchOutlinePatched_ = true;\n\n\tconst foundation = textfield.foundation_;\n\tconst adapter = foundation.adapter_;\n\tfoundation.notchOutline = _.wrap(\n\t\tfoundation.notchOutline,\n\t\t(notchOutline, openNotch) => {\n\t\t\ttextfield.notchOutlinePatchTimeout &&\n\t\t\t\tclearTimeout(textfield.notchOutlinePatchTimeout);\n\t\t\tif (!adapter.hasOutline()) return;\n\t\t\tif (!openNotch) return notchOutline.call(foundation, openNotch);\n\n\t\t\tconst isDense = adapter.hasClass(cssClasses.DENSE);\n\t\t\tconst labelScale = isDense\n\t\t\t\t? numbers.DENSE_LABEL_SCALE\n\t\t\t\t: numbers.LABEL_SCALE;\n\t\t\tconst labelWidth = adapter.getLabelWidth() * labelScale;\n\t\t\tif (!labelWidth || isNaN(labelWidth)) {\n\t\t\t\treturn (textfield.notchOutlinePatchTimeout = setTimeout(() => {\n\t\t\t\t\tfoundation.notchOutline(openNotch);\n\t\t\t\t}, 100));\n\t\t\t}\n\t\t\tadapter.notchOutline(labelWidth);\n\t\t},\n\t);\n\n\t// Make sure we clean up our timer\n\tfoundation.destroy = _.wrap(foundation.destroy, (destroy) => {\n\t\ttextfield.notchOutlinePatchTimeout &&\n\t\t\tclearTimeout(textfield.notchOutlinePatchTimeout);\n\t\tdestroy.call(foundation);\n\t});\n\n\t// Fun hack for our inputs that have floating labels regardless of having a value or not\n\tconst forceFloat =\n\t\tadapter.hasLabel() &&\n\t\ttextfield.label_.root_.classList.contains(\n\t\t\t'mdc-floating-label--float-above',\n\t\t);\n\n\t// Since this patch is applied after init and init calls float label if there is a value, call it again\n\t// As seen in foundation.init:\n\tif (adapter.isFocused()) {\n\t\tfoundation.inputFocusHandler_();\n\t} else if (forceFloat || (adapter.hasLabel() && foundation.shouldFloat)) {\n\t\tfoundation.notchOutline(true);\n\t\tadapter.floatLabel(true);\n\t}\n};\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface TableRowClasses {\n\t/** Styles applied to the root element. */\n\troot: string;\n\tactive: string;\n\tclickable: string;\n\tisClone: string;\n\tisDragging: string;\n\treadOnly: string;\n\tsortActive: string;\n}\n\nexport const getTableRowClass = (slot: string) =>\n\tgenerateUtilityClass('TableRow', slot);\n\nexport const tableRowClasses = generateUtilityClasses('TableRow', [\n\t'root',\n\t'active',\n\t'clickable',\n\t'isClone',\n\t'isDragging',\n\t'readOnly',\n\t'sortActive',\n]);\nexport default tableRowClasses;\n","import React, {useCallback, DOMAttributes} from 'react';\nimport clsx from 'clsx';\nimport type {Row} from 'react-table';\n\nimport useSharedRef from '@netx/core-components/hooks/useSharedRef';\nimport type {Position} from '@netx/core-components/types';\nimport {useArrowFocusTrapItem} from '@netx/core-components/ArrowFocusTrap';\nimport {composeClasses, styled, WithClasses} from '@netx/core-components/Theme';\nimport {useTableLayoutProvider} from '../../contexts';\nimport type {BaseItemData} from '../../types';\nimport {\n\tVirtualizedTableRowCell,\n\tVirtualizedTableRowCellProps,\n} from '../VirtualizedTableRowCell';\nimport {\n\tgetTableRowClass,\n\ttableRowClasses,\n\tTableRowClasses,\n} from './tableRowClasses';\n\nexport type TableRowUtilityClassProps = WithClasses<\n\tTableRowClasses,\n\t{\n\t\tactive?: boolean;\n\t\tclickable?: boolean;\n\t\tisClone?: boolean;\n\t\tisDragging?: boolean;\n\t\treadOnly?: boolean;\n\t\tsortActive?: boolean;\n\t}\n>;\n\nconst useUtilityClasses = (ownerState: TableRowUtilityClassProps) => {\n\tconst {\n\t\tclasses,\n\t\tactive,\n\t\tclickable,\n\t\tisClone,\n\t\tisDragging,\n\t\tsortActive,\n\t\treadOnly,\n\t} = ownerState;\n\n\tconst slots = {\n\t\troot: [\n\t\t\t'root',\n\t\t\tclickable && 'clickable',\n\t\t\tactive && 'active',\n\t\t\tisDragging && 'isDragging',\n\t\t\tisClone && 'isClone',\n\t\t\tsortActive && 'sortActive',\n\t\t\treadOnly && 'readOnly',\n\t\t],\n\t};\n\treturn composeClasses(slots, getTableRowClass, classes);\n};\n\nconst TableRowRoot = styled('div', {\n\tname: 'TableRow',\n\tslot: 'Root',\n})(({theme}) => ({\n\tborderBottom: `1px solid ${theme.palette.custom.border}`,\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tminWidth: '100%',\n\t// safari ¯\\_(ツ)_/¯\n\tWebkitTransform: 'translate3d(0, 0, 0)',\n\tWebkitPerspective: 1000,\n\tWebkitBackfaceVisibility: 'hidden',\n\t'&:focus': {\n\t\toutline: 'none',\n\t\tzIndex: 3,\n\t},\n\t[`&.${tableRowClasses.clickable}`]: {\n\t\t[`&:not(${tableRowClasses.readOnly})`]: {\n\t\t\t[`&:not(.${tableRowClasses.sortActive}):not(.${tableRowClasses.isClone})`]: {\n\t\t\t\tcursor: 'pointer',\n\t\t\t},\n\t\t},\n\t\t[`&:not(.${tableRowClasses.sortActive}):not(.${tableRowClasses.isClone})`]: {\n\t\t\t[`&:hover, &:focus, &:active`]: {\n\t\t\t\tbackgroundColor: theme.palette.mode === 'light' ? '#f1f1f1' : '#323232',\n\t\t\t\t'& [role=\"cell\"]': {\n\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\ttheme.palette.mode === 'light' ? '#f1f1f1' : '#323232',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t[`&:not(.${tableRowClasses.sortActive}):not(.${tableRowClasses.isClone})`]: {\n\t\t[`&.${tableRowClasses.active}`]: {\n\t\t\tbackgroundColor: theme.palette.mode === 'light' ? '#f1f1f1' : '#323232',\n\t\t\t'& [role=\"cell\"]': {\n\t\t\t\tbackgroundColor: theme.palette.mode === 'light' ? '#f1f1f1' : '#323232',\n\t\t\t},\n\t\t},\n\t},\n\t[`&.${tableRowClasses.isDragging}`]: {\n\t\tvisibility: 'hidden !important' as 'hidden',\n\t},\n\t[`&.${tableRowClasses.isClone}`]: {\n\t\theight: 55,\n\t\tbackgroundColor: theme.palette.secondary.main,\n\t\t'& [role=\"cell\"]': {\n\t\t\tbackgroundColor: theme.palette.mode === 'light' ? '#f1f1f1' : '#323232',\n\t\t},\n\t\tborder: `1px solid ${theme.palette.custom.border}`,\n\t},\n\t[`&.${tableRowClasses.sortActive}`]: {\n\t\tpointerEvents: 'none',\n\t\t[`&:not(.${tableRowClasses.isClone})`]: {\n\t\t\topacity: 0.8,\n\t\t},\n\t},\n}));\n\ntype HTMLDivElementEvents = Required<DOMAttributes<HTMLDivElement>>;\ntype Ref = React.ForwardedRef<HTMLDivElement>;\n\nexport interface TableRowProps<ItemData extends BaseItemData>\n\textends Omit<\n\t\t\tReact.DetailedHTMLProps<\n\t\t\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\t\t\tHTMLDivElement\n\t\t\t>,\n\t\t\t'onClick' | 'onContextMenu' | 'onKeyDown'\n\t\t>,\n\t\tWithClasses<\n\t\t\tTableRowClasses,\n\t\t\t{\n\t\t\t\tindex: number;\n\t\t\t\tdataIndex: number;\n\t\t\t\tsortActive?: boolean;\n\t\t\t\t/** prevent interactivity and things like re-preparing row */\n\t\t\t\tisClone?: boolean;\n\t\t\t\trowData: Row<ItemData>;\n\t\t\t\tdisableTabIndex?: boolean;\n\t\t\t\tdisableFocus?: boolean;\n\t\t\t\tselected?: boolean;\n\t\t\t\tonClick?: (\n\t\t\t\t\tevent: React.MouseEvent<HTMLElement, MouseEvent>,\n\t\t\t\t\tindex: number,\n\t\t\t\t\trowData: Row<ItemData>,\n\t\t\t\t) => void | boolean;\n\t\t\t\tonContextMenu?: (\n\t\t\t\t\tpostion: Position,\n\t\t\t\t\tindex: number,\n\t\t\t\t\trowData: Row<ItemData>,\n\t\t\t\t) => void | boolean;\n\t\t\t\tprepareRow(row: Row<ItemData>): void;\n\t\t\t\treadOnly?: boolean;\n\t\t\t\t/** will be appended with `-${row-index}` */\n\t\t\t\trowId?: string;\n\t\t\t\tisDragging?: boolean;\n\t\t\t\tisScrolling?: boolean;\n\t\t\t\tisSorting?: boolean;\n\t\t\t\tvisibleColumnIndexes?: boolean[];\n\t\t\t\tVirtualizedTableRowCellProps?: Partial<\n\t\t\t\t\tVirtualizedTableRowCellProps<ItemData>\n\t\t\t\t>;\n\t\t\t}\n\t\t> {}\n\nconst TableRowInner = <ItemData extends BaseItemData>(\n\t{\n\t\tclasses: _classes,\n\t\tclassName,\n\n\t\tdataIndex,\n\t\tdisableFocus,\n\t\tdisableTabIndex,\n\t\tindex,\n\t\tisClone,\n\t\tisDragging,\n\t\tisScrolling,\n\t\tisSorting,\n\t\tonClick,\n\t\tonContextMenu,\n\t\tprepareRow,\n\t\treadOnly,\n\t\trowData,\n\t\trowId,\n\t\tselected,\n\t\tsortActive,\n\t\tvisibleColumnIndexes,\n\t\tstyle,\n\t\tVirtualizedTableRowCellProps,\n\t\t...props\n\t}: TableRowProps<ItemData>,\n\tref: Ref,\n) => {\n\tconst innerRef = useSharedRef(null, [ref]);\n\n\tconst {state} = useTableLayoutProvider();\n\tconst {isActive, attributes, handleItemClick} = useArrowFocusTrapItem({\n\t\tindex,\n\t\tref: innerRef,\n\t});\n\n\t!isClone && prepareRow(rowData);\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: _classes,\n\t\tactive: isActive,\n\t\tisClone,\n\t\tisDragging,\n\t\tclickable: !isClone && !!onClick,\n\t\treadOnly,\n\t\tsortActive,\n\t});\n\n\t// Some common actions for a row that will skip over all the event nonsense and get\n\t// right to the pertinent data\n\tconst handleContextMenu = useCallback<HTMLDivElementEvents['onContextMenu']>(\n\t\t(event) => {\n\t\t\tif (isClone || !rowData || !onContextMenu) return;\n\t\t\tif (\n\t\t\t\tonContextMenu(\n\t\t\t\t\t{top: event.clientY, left: event.clientX},\n\t\t\t\t\tindex,\n\t\t\t\t\trowData,\n\t\t\t\t) === false\n\t\t\t) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t},\n\t\t[index, onContextMenu, rowData, isClone],\n\t);\n\n\tconst handleClick = useCallback<HTMLDivElementEvents['onClick']>(\n\t\t(event) => {\n\t\t\thandleItemClick(event);\n\n\t\t\tif (isClone || !rowData || !onClick || !event.isTrusted) return;\n\t\t\tif (onClick(event, dataIndex, rowData) === false) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t},\n\t\t[dataIndex, onClick, rowData, isClone, handleItemClick],\n\t);\n\n\treturn (\n\t\t<TableRowRoot\n\t\t\taria-rowindex={index}\n\t\t\tdata-data-index={dataIndex}\n\t\t\t// TODO: fix this - we cannot gurantee everything has an `id`\n\t\t\t// we need to support in both our props and typing the ability\n\t\t\t// to define what the `id` could be (like `assetId`)\n\t\t\t// @ts-ignore\n\t\t\tdata-id={rowData.original.id}\n\t\t\tid={rowId != null ? `${rowId}-${index}` : undefined}\n\t\t\trole=\"row\"\n\t\t\t{...props}\n\t\t\t{...attributes}\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tonClick={handleClick}\n\t\t\tonContextMenu={handleContextMenu}\n\t\t\t// We handle keydown events at a higher level due to our focus trap\n\t\t\t// but need keydown listeners if we present a click listener\n\t\t\tonKeyDown={() => {}}\n\t\t\tref={innerRef}\n\t\t\tstyle={{\n\t\t\t\t...style,\n\t\t\t\twidth: state.totalColumnsWidth,\n\t\t\t}}\n\t\t>\n\t\t\t{(rowData?.cells || []).map((cell, columnIndex) => (\n\t\t\t\t<VirtualizedTableRowCell\n\t\t\t\t\tkey={`${(rowData.original as any).id}-${cell.column.id}`}\n\t\t\t\t\tcell={cell}\n\t\t\t\t\tcolumnCount={state.columnCount}\n\t\t\t\t\tdisableFocus={disableFocus}\n\t\t\t\t\tcolumnWidths={state.columnWidths}\n\t\t\t\t\tcolumnsOverflown={state.columnsOverflown}\n\t\t\t\t\tfirstFrozenTrailing={state.columnsFirstFrozenTrailing === columnIndex}\n\t\t\t\t\tlastFrozenLeading={state.columnsLastFrozenLeading === columnIndex}\n\t\t\t\t\tfrozen={state.columnsFrozen[columnIndex]}\n\t\t\t\t\tfrozenLeading={state.columnsFrozenLeading[columnIndex]}\n\t\t\t\t\tfrozenTrailing={state.columnsFrozenTrailing[columnIndex]}\n\t\t\t\t\tleft={state.frozenLeadingColumnPositions[columnIndex]}\n\t\t\t\t\tright={state.frozenTrailingColumnPositions[columnIndex]}\n\t\t\t\t\tindex={columnIndex}\n\t\t\t\t\tisClone={isClone}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tviewportWidth={state.viewportWidth}\n\t\t\t\t\tvisible={visibleColumnIndexes?.[columnIndex]}\n\t\t\t\t\t{...VirtualizedTableRowCellProps}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</TableRowRoot>\n\t);\n};\n\n/**\n * Table row\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nexport const TableRowPrimitive = React.forwardRef(TableRowInner) as <\n\tItemData extends BaseItemData\n>(\n\tprops: TableRowProps<ItemData>,\n\tref?: Ref,\n) => JSX.Element;\n\n/**\n * Memo-ized Table row\\\n * `ItemData` - The data specificlly from the return of a server request (will be unique data for each child)\n */\nexport const TableRow = React.memo(TableRowPrimitive) as <\n\tItemData extends BaseItemData\n>(\n\tprops: TableRowProps<ItemData>,\n\tref?: Ref,\n) => JSX.Element;\nexport default TableRow;\n","import React, {useEffect} from 'react';\n\nimport Attribute, {\n\tAttributeProps,\n} from '@netx/core-attribute/components/Attribute';\nimport {\n\twithForm,\n\tWithFormPropsIn,\n\tWithFormPropsOut,\n} from '@netx/core-components/Form';\nimport Theme from '@netx/core-components/Theme';\n\nexport interface CellEditorProps\n\textends WithFormPropsIn,\n\t\tOmit<AttributeProps, 'form'> {\n\tonChange(value: any): void;\n}\n\n/** For cell editing within the hypergrid */\nconst CellEditor: React.FC<WithFormPropsOut<CellEditorProps>> = ({\n\tonChange,\n\tform,\n\t...props\n}) => {\n\tuseEffect(() => {\n\t\tonChange(form.values[props.attrData.name]);\n\t}, [form.values, props.attrData.name]);\n\n\treturn (\n\t\t<Theme>\n\t\t\t<Attribute\n\t\t\t\t{...props}\n\t\t\t\tlimitHeightToContainer\n\t\t\t\tmatchContainerHeight\n\t\t\t\tform={form}\n\t\t\t\thideLabel\n\t\t\t\tname={props.attrData.name}\n\t\t\t\tvalue={form.values[props.attrData.name]}\n\t\t\t/>\n\t\t</Theme>\n\t);\n};\n\nexport default withForm<CellEditorProps>(CellEditor);\n","import {i18n} from '@netx/core/i18n';\n\nimport {TOKEN_DOWNLOAD_OPTION_TYPES} from './constants';\nimport {TokenDownloadOption} from './types';\n\n/**\n * Get download option label from download option\n * @param downloadOption\n * @return Download option label\n */\nexport const getOptionLabel = (downloadOption: TokenDownloadOption) => {\n\tswitch (downloadOption.type) {\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.ORIGINAL:\n\t\t\treturn i18n.t('i18n.original');\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.PROXY:\n\t\t\treturn downloadOption.name === 'preview'\n\t\t\t\t? i18n.t('i18n.preview')\n\t\t\t\t: i18n.t('i18n.thumbnail'); // NOTE: we do not want to use the translation for `thumb`\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.CONTACT_SHEET:\n\t\t\treturn i18n.t('i18n.PDFContactSheet');\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.METADATA:\n\t\t\treturn i18n.t('i18n.attributeData');\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.HISTORICAL:\n\t\t\treturn i18n.t('i18n.attributeHistory');\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.MANUAL_REPURPOSE: {\n\t\t\tif (downloadOption.family === 'audio') return i18n.t('i18n.audio');\n\t\t\tif (downloadOption.family === 'document') return i18n.t('i18n.pages');\n\t\t\tif (downloadOption.family === 'image') return i18n.t('i18n.image');\n\t\t}\n\t}\n\treturn downloadOption.name;\n};\n\n/**\n * Get download option header (type) label from download option\n * @param downloadOption\n * @return Download option header label\n */\nexport const getOptionHeaderLabel = (downloadOption: TokenDownloadOption) => {\n\tif (downloadOption.type === 'historical') return i18n.t('i18n.history');\n\treturn i18n.t(`i18n.${downloadOption.type}`);\n};\n","/**\n * A cross browser element for search inputs and that darn little clear search button\n * @author Justin Sephiroth Enos <justin@netx.net>\n */\n\n// Polyfill needed for Edge\nimport '@webcomponents/custom-elements';\n\n// One day when shadow dom is production ready and doesn't require a million pollyfills we can extend the input element itself\n// then we would not need to pipe anything through or mirror attributes etc.\n// Unfortuantely you cannot append elemnts to an input (save textarea and selects) - I mean, you technically can you just would not\n// be able to see the apended element outside of inpsection\n\nclass NxSearch extends HTMLElement {\n\t// Get input value\n\tget value() {\n\t\treturn this.input.value;\n\t}\n\n\t// Set input value\n\tset value(value) {\n\t\tthis.input.value = value;\n\t\tthis.checkCancelButton();\n\t\tthis.input.dispatchEvent(this.getSearchEvent(value));\n\t}\n\n\t// Attributes to watch for changes on\n\t// If any of these change `attributeChangedCallback` gets fired\n\tstatic get observedAttributes() {\n\t\treturn ['class', 'placeholder'];\n\t}\n\n\tconnectedCallback() {\n\t\t// If we already have an input element, then lets not add another\n\t\tif (this.input) return;\n\t\t\n\t\t// Create cancel button\n\t\tconst cancelButton = document.createElement('a');\n\t\t// Icon\n\t\tcancelButton.innerHTML = '×';\n\t\t// Will probably be handy for tests etc\n\t\tcancelButton.setAttribute('data-nx-control', 'clear-search');\n\n\t\t// Append and store the button\n\t\tthis.cancelButton = this.appendChild(cancelButton);\n\n\t\t// Deal with clearing the search text\n\t\tthis.cancelButton.addEventListener('click', e => {\n\t\t\t// Clear out the current value\n\t\t\tthis.input.value = '';\n\t\t\t// Dispatch search event\n\t\t\tthis.input.dispatchEvent(this.getSearchEvent(''));\n\t\t\t// Dispatch change event\n\t\t\tthis.input.dispatchEvent(this.getChangeEvent());\n\t\t\t// Deal with cancel button\n\t\t\tthis.checkCancelButton();\n\t\t});\n\n\t\t// Create input element\n\t\tconst input = document.createElement('input');\n\t\t// Append and store input element\n\t\tthis.input = this.appendChild(input);\n\n\t\t// Fire saerch event when user hits enter\n\t\tconst fireOnEnterOnly = this.hasAttribute('data-nx-enter-only');\n\n\t\tif (fireOnEnterOnly) {\n\t\t\tthis.input.addEventListener('keydown', e => {\n\t\t\t\tconst keyCode = e.keyCode || e.which;\n\t\t\t\tif (keyCode === 13) {\n\t\t\t\t\tconst eventType = this.input.value !== '' ? 'search' : 'reset'; \n\t\t\t\t\t// Dispatch search event\n\t\t\t\t\tthis.input.dispatchEvent(this.getSearchEvent(this.input.value, eventType));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// List for keyup and trigger search event/check state of cancel button\n\t\tthis.input.addEventListener(\n\t\t\t'keyup',\n\t\t\t_.debounce(e => {\n\t\t\t\t// Dispatch search event\n\t\t\t\t!fireOnEnterOnly &&\n\t\t\t\t\tinput.dispatchEvent(this.getSearchEvent(this.input.value));\n\t\t\t\t// Deal with cancel button\n\t\t\t\tthis.checkCancelButton();\n\t\t\t}, 50),\n\t\t);\n\n\t\t// Mirror our attributes to the input\n\t\tfor (let attr of this.attributes) {\n\t\t\tthis.input.setAttribute(attr.nodeName, attr.value);\n\t\t}\n\n\t\t// We make this decision around here\n\t\tthis.input.setAttribute('type', 'text');\n\n\t\t// Deal with cancel button\n\t\tthis.checkCancelButton();\n\t}\n\n\t// If any observed attributes from `observedAttributes` get changed\n\t// add those onto the input element\n\tattributeChangedCallback(name, previousValue, newValue) {\n\t\tthis.input && this.input.setAttribute(name, newValue);\n\t}\n\n\t// Manage the state of the cancel button\n\tcheckCancelButton() {\n\t\t// IE does not like me setting inline styles- probably for the best\n\t\tthis.cancelButton.classList[this.input.value.length ? 'remove' : 'add'](\n\t\t\t'hide',\n\t\t);\n\t}\n\n\tgetSearchEvent(str, type) {\n\t\tconst event = document.createEvent('Event');\n\t\tevent.initEvent(type || 'search', true, true);\n\t\tevent.detail = str;\n\t\treturn event;\n\t}\n\n\tgetChangeEvent() {\n\t\tconst event = document.createEvent('Event');\n\t\tevent.initEvent('change', true, true);\n\t\treturn event;\n\t}\n}\n\n// Define our custom element\nwindow.customElements.define('nx-search', NxSearch);\n\nexport default NxSearch;\n","/**\n * NetxDragResize\n * @extends NetxDrag\n */\nimport netxDrag from './jquery-netx-drag';\n\n// Constructor\nfunction NetxDragResize(options, el) {\n\t// Extend options\n\tthis.options = _.extend(options, {\n\t\t// No autoscroll for us\n\t\tautoscroll: false,\n\t});\n\n\t// Main element\n\tthis.el = $(el);\n\t// Uniqueness\n\tthis.uuid = new Date().getTime();\n\tthis.name = 'netx-drag-resize-' + this.uuid;\n\tthis.ns = '.' + this.name;\n\t// You're not alone\n\tthis.stand_alone = false;\n\t// Initialize\n\tthis.init(options);\n\tthis.el.addClass('netx-drag-resize');\n}\n\n// Extend\nNetxDragResize.prototype = $.extend({}, netxDrag.Constructor.prototype, {\n\t/**\n\t * @overrride\n\t * @param {object} options Init options\n\t */\n\tinit: function(options) {\n\t\t// Our drag handler\n\t\tthis.$dragHandler = $('<div>', {\n\t\t\tclass:\n\t\t\t\t'netx-drag-resize__handle--' +\n\t\t\t\toptions.dragFrom +\n\t\t\t\t' netx-drag-resize__handle--' +\n\t\t\t\toptions.direction +\n\t\t\t\t' netx-drag-resize__handle ' +\n\t\t\t\tthis.name,\n\t\t});\n\t\tthis.el.append(this.$dragHandler);\n\t\t// Reset size on double click\n\t\tthis.$dragHandler.on('dblclick', _.bind(this.reset, this));\n\t\t// this.dragHandler is the be all\n\t\tthis.targetItems = this.targetItem = this.$items = this.$dragHandler;\n\t\t// And of course our handle as well\n\t\tthis.options.handle = this.$dragHandler;\n\n\t\tif (options.startWidth) {\n\t\t\toptions.startWidth = options.usePercent\n\t\t\t\t? options.startWidth\n\t\t\t\t: parseInt(options.startWidth);\n\t\t}\n\t\tif (options.startHeight) {\n\t\t\toptions.startHeight = options.usePercent\n\t\t\t\t? options.startHeight\n\t\t\t\t: parseInt(options.startHeight);\n\t\t}\n\n\t\twindow.requestAnimationFrame(\n\t\t\tfunction() {\n\t\t\t\tif (!this.el) return;\n\t\t\t\t// Properly handle use of percent\n\t\t\t\tif (options.startWidth) {\n\t\t\t\t\toptions.startWidth &&\n\t\t\t\t\t\toptions.startWidth !== '0' &&\n\t\t\t\t\t\tthis.el.css({\n\t\t\t\t\t\t\twidth: options.startWidth,\n\t\t\t\t\t\t\t'min-width': options.startWidth,\n\t\t\t\t\t\t\t'max-width': options.startWidth,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (options.startHeight) {\n\t\t\t\t\toptions.startHeight &&\n\t\t\t\t\t\toptions.startHeight !== '0' &&\n\t\t\t\t\t\tthis.el.css({\n\t\t\t\t\t\t\theight: options.startWidth,\n\t\t\t\t\t\t\t'min-height': options.startWidth,\n\t\t\t\t\t\t\t'max-height': options.startWidth,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}.bind(this),\n\t\t);\n\n\t\tthis.currentWidth = options.startHeight;\n\t\tthis.currentWidth = options.startWidth;\n\n\t\t// Super\n\t\treturn netxDrag.Constructor.prototype.init.apply(this, arguments);\n\t},\n\t/**\n\t * @overrride\n\t * @param {event} e Event\n\t * @returns {object} this\n\t */\n\t_dragHandler: function(e) {\n\t\t// Store initial values\n\t\tvar offset = this.el.offset();\n\t\tthis.last_width = this.init_width = this.el.width();\n\t\tthis.last_width = this.init_height = this.el.height();\n\t\tthis.last_left = offset.left;\n\t\tthis.last_top = offset.top;\n\n\t\t// Super\n\t\treturn netxDrag.Constructor.prototype._dragHandler.apply(this, arguments);\n\t},\n\t/**\n\t * @override\n\t */\n\tonDragHandler: function() {\n\t\t// Optimize\n\t\tthis.el[0].style['will-change'] =\n\t\t\tthis.options.direction === 'horizontal' ? 'width' : 'height';\n\t},\n\t/**\n\t * @override\n\t * @param {event} e Event\n\t * @returns {object} this\n\t */\n\tonDragStart: function(e) {\n\t\t// Vars\n\t\tvar _e;\n\n\t\t// Add class\n\t\tthis.el.addClass('netx-drag-resize--resizing');\n\t\tthis.$body.addClass('drag-resizing');\n\n\t\tthis.parent = this.el.parent();\n\n\t\t// Parent dimensions\n\t\tthis.parentHeight = this.parent.outerHeight();\n\t\tthis.parentWidth = this.parent.outerWidth();\n\t\t//console.log( this.el.parent(), this.el.parent().width() );\n\n\t\t// Dispatch event\n\t\t_e = this._getDragEvent('dragresizestart', e, this.ui);\n\t\tthis.el[0].dispatchEvent(_e);\n\t},\n\t/**\n\t * Override\n\t * @param {event} e Event\n\t * @returns {object} this\n\t */\n\tonDragMove: _.throttle(function(e) {\n\t\t// Vars\n\t\tvar bottom,\n\t\t\tdiffLeft,\n\t\t\tdiffTop,\n\t\t\tdistance,\n\t\t\t_e,\n\t\t\th,\n\t\t\theight,\n\t\t\tleft,\n\t\t\tnewHeight,\n\t\t\tnewWidth,\n\t\t\tos,\n\t\t\tparentScrollHeight,\n\t\t\tparentScrollWidth,\n\t\t\tright,\n\t\t\tscrollDiffX,\n\t\t\tscrollDiffY,\n\t\t\tthisLeft,\n\t\t\tthisTop,\n\t\t\ttop,\n\t\t\twidth;\n\n\t\t// ============\n\t\t// Differences\n\t\t// ============\n\t\t// Check scroll difference\n\t\tscrollDiffY = this.scrollContainer.scroll.y - this.con_scroll_y;\n\t\tscrollDiffX = this.scrollContainer.scroll.x - this.con_scroll_x;\n\t\t// Compensate for scrolling that may occur during dragging\n\t\t// The amount we have moved from screen top\n\t\tdiffTop = this.ui.pointer.diff_top + scrollDiffY;\n\t\t// The amount we have moved from screen left\n\t\tdiffLeft = this.ui.pointer.diff_left + scrollDiffX;\n\t\t// ============\n\t\t// !Differences\n\t\t// ============\n\n\t\t// ============\n\t\t// Bounds\n\t\t// ============\n\t\t// Where the mouse first made click contact (y)\n\t\ttop = this.ms_init_pos.top;\n\t\tbottom = top + diffTop;\n\t\t// Where the mouse first made click contact (x)\n\t\tleft = this.ms_init_pos.left;\n\t\tright = left + diffLeft;\n\t\t// ============\n\t\t// !Bounds\n\t\t// ============\n\n\t\t// ============\n\t\t// Horizontal\n\t\t// ============\n\t\tif (this.options.direction === 'horizontal') {\n\t\t\t// Distance moved\n\t\t\tdistance = this.options.dragFrom === 'left' ? left - right : right - left;\n\t\t\t// What would be our new width\n\t\t\twidth = this.setWidth(this.init_width + distance);\n\t\t\t// Store\n\t\t\tthis.last_width = width;\n\t\t\tthis.last_left = this.el.offset().left;\n\t\t\t// Dispatch event\n\t\t\t_e = this._getDragEvent(\n\t\t\t\t'dragresizing',\n\t\t\t\te,\n\t\t\t\t_.extend(this.ui, {\n\t\t\t\t\twidth: width,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.el[0].dispatchEvent(_e);\n\t\t}\n\t\t// ============\n\t\t// !Horizontal\n\t\t// ============\n\n\t\t// ============\n\t\t// Vertical\n\t\t// ============\n\t\telse {\n\t\t\t// Distance moved\n\t\t\tdistance = this.options.dragFrom === 'top' ? top - bottom : bottom - top;\n\t\t\t// What would be our new height\n\t\t\theight = this.setHeight(this.init_height + distance);\n\t\t\t// Store\n\t\t\tthis.last_height = height;\n\t\t\tthis.last_top = this.el.offset().top;\n\t\t\t// Dispatch event\n\t\t\t_e = this._getDragEvent(\n\t\t\t\t'dragresizing',\n\t\t\t\te,\n\t\t\t\t_.extend(this.ui, {\n\t\t\t\t\theight: height,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.el[0].dispatchEvent(_e);\n\t\t}\n\t\t// ============\n\t\t// !Vertical\n\t\t// ============\n\t}, 50),\n\t/**\n\t * @override\n\t * @param {event} e Event\n\t * @returns {object} this\n\t */\n\tonDragStop: function(e) {\n\t\t// Vars\n\t\tvar _e;\n\t\t// Kill the class\n\t\t_.delay(\n\t\t\t_.bind(function() {\n\t\t\t\tthis.el.removeClass('netx-drag-resize--resizing');\n\t\t\t\tthis.$body.removeClass('drag-resizing');\n\t\t\t}, this),\n\t\t\t100,\n\t\t);\n\n\t\tthis.el[0].style.willChange = '';\n\n\t\t// Dispatch event\n\t\t_e = this._getDragEvent('dragresizeend', e, this.ui);\n\t\tthis.el[0].dispatchEvent(_e);\n\t},\n\t/**\n\t * @override\n\t * @returns {object} this\n\t */\n\tdestroy: function() {\n\t\t// Kill all events in our namespace\n\t\tthis.el.off(this.ns);\n\t\tthis.$doc && this.$doc.off(this.ns);\n\t\tthis.$proxyEl && this.$proxyEl.off(this.ns);\n\t\tthis.$scrollContainer && this.$scrollContainer.off(this.ns);\n\t\tthis.$win && this.$win.off(this.ns);\n\n\t\t// Clean up our drag handler\n\t\tthis.$dragHandler.remove();\n\t\t// Cleanup element\n\t\tthis.el.removeData('netxDragResize').removeClass(this.name);\n\t\t// Remove observer\n\t\tthis.observer && this.observer.disconnect();\n\n\t\tthis.el.removeClass('netx-drag-resize');\n\n\t\tdelete this.el;\n\t\tdelete this.$proxyEl;\n\n\t\t// Chain\n\t\treturn this;\n\t},\n\t_ignoreDrag: function(e) {\n\t\t// This allows support for cloned elements controlling this resize\n\t\tif (!$(e.target).hasClass('netx-drag-resize__handle ' + this.name))\n\t\t\treturn true;\n\t\treturn false;\n\t},\n\t/**\n\t * @override\n\t * @param {event} e Event\n\t * @returns {object} Positions, sorting item, indexes, etc.\n\t */\n\t_getDragData: function(e) {\n\t\t// Vars\n\t\tvar os;\n\t\t// Get position data\n\t\tos = this._getOffset(e);\n\t\tos.height = this.last_height;\n\t\tos.width = this.last_width;\n\t\tos.position = {\n\t\t\ttop: this.last_top,\n\t\t\tleft: this.last_left,\n\t\t};\n\t\t// Set element\n\t\tos.$element = this.el;\n\t\treturn os;\n\t},\n\t/**\n\t * @method\n\t * @param {number} newHeight Height to set\n\t * @return {number} Height\n\t */\n\tsetHeight: function(newHeight) {\n\t\tvar height, parentScrollHeight, thisTop;\n\t\t// Ensure it is at least as tall as set in this.options.minHeight\n\t\tif (newHeight < this.options.minHeight) {\n\t\t\tnewHeight = this.options.minHeight;\n\t\t}\n\t\t// Ensure it is at most as tall as set in this.options.maxHeight\n\t\tif (newHeight > this.options.maxHeight) {\n\t\t\tnewHeight = this.options.maxHeight;\n\t\t}\n\t\t// Get percentage or just set in pixels\n\t\theight = this.options.usePercent\n\t\t\t? ((newHeight / this.parentHeight) * 100).toFixed(3) + '%'\n\t\t\t: newHeight;\n\t\t// Update element\n\t\tthis.el.css({\n\t\t\theight: height,\n\t\t\t'min-height': height,\n\t\t\t'max-height': height,\n\t\t});\n\t\t// Where are we on the left\n\t\tthisTop = this.el.offset().top;\n\t\t// Did we go too far?\n\t\tif (thisTop + newHeight > this.win_size.h) {\n\t\t\t// Valid width\n\t\t\tnewHeight = this.win_size.h - thisTop;\n\t\t\t// Get percentage or just set in pixels\n\t\t\theight = this.options.usePercent\n\t\t\t\t? ((newHeight / this.parentHeight) * 100).toFixed(3) + '%'\n\t\t\t\t: newHeight;\n\t\t\t// Fix element\n\t\t\tthis.el.css({\n\t\t\t\theight: height,\n\t\t\t\t'min-height': height,\n\t\t\t\t'max-height': height,\n\t\t\t});\n\t\t}\n\t\t// Again, too far?\n\t\tif (this.options.underflowParent) {\n\t\t\tparentScrollHeight = this.parent[0].scrollHeight;\n\t\t\tif (parentScrollHeight > this.parentHeight) {\n\t\t\t\t// Valid width\n\t\t\t\tnewHeight = newHeight - (parentScrollHeight - this.parentHeight);\n\t\t\t\t// Get percentage or just set in pixels\n\t\t\t\theight = this.options.usePercent\n\t\t\t\t\t? ((newWidth / this.parentHeight) * 100).toFixed(3) + '%'\n\t\t\t\t\t: newHeight;\n\t\t\t\t// Fix element\n\t\t\t\tthis.el.css({\n\t\t\t\t\theight: height,\n\t\t\t\t\t'min-height': height,\n\t\t\t\t\t'max-height': height,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.currentHeight = height;\n\n\t\treturn height;\n\t},\n\t/**\n\t * @method\n\t * @param {number} newWidth Width to set\n\t * @return {number} Width\n\t */\n\tsetWidth: function(newWidth) {\n\t\tvar parentScrollWidth, thisLeft, width;\n\t\t// Ensure it is at least as wide as set in this.options.minWidth\n\t\tif (newWidth < this.options.minWidth) {\n\t\t\tnewWidth = this.options.minWidth;\n\t\t}\n\t\t// Ensure it is at most as wide as set in this.options.maxWidth\n\t\tif (newWidth > this.options.maxWidth) {\n\t\t\tnewWidth = this.options.maxWidth;\n\t\t}\n\t\t// Get percentage or just set in pixels\n\t\twidth = this.options.usePercent\n\t\t\t? ((newWidth / this.parentWidth) * 100).toFixed(3) + '%'\n\t\t\t: newWidth;\n\t\t// Update element\n\t\tthis.el.css({\n\t\t\twidth: width,\n\t\t\t'min-width': width,\n\t\t\t'max-width': width,\n\t\t});\n\t\t// Where are we on the left\n\t\tthisLeft = this.el.offset().left;\n\t\t// Did we go too far?\n\t\tif (thisLeft + newWidth > this.win_size.w) {\n\t\t\t// Valid width\n\t\t\tnewWidth = this.win_size.w - thisLeft;\n\t\t\t// Get percentage or just set in pixels\n\t\t\twidth = this.options.usePercent\n\t\t\t\t? ((newWidth / this.parentWidth) * 100).toFixed(3) + '%'\n\t\t\t\t: newWidth;\n\t\t\t// Fix element\n\t\t\tthis.el.css({\n\t\t\t\twidth: width,\n\t\t\t\t'min-width': width,\n\t\t\t\t'max-width': width,\n\t\t\t});\n\t\t}\n\t\t// Again, too far?\n\t\tif (this.options.underflowParent) {\n\t\t\tparentScrollWidth = this.parent[0].scrollWidth;\n\t\t\tif (parentScrollWidth > this.parentWidth) {\n\t\t\t\t// Valid width\n\t\t\t\tnewWidth = newWidth - (parentScrollWidth - this.parentWidth);\n\t\t\t\t// Get percentage or just set in pixels\n\t\t\t\twidth = this.options.usePercent\n\t\t\t\t\t? ((newWidth / this.parentWidth) * 100).toFixed(3) + '%'\n\t\t\t\t\t: newWidth;\n\t\t\t\t// Fix element\n\t\t\t\tthis.el.css({\n\t\t\t\t\twidth: width,\n\t\t\t\t\t'min-width': width,\n\t\t\t\t\t'max-width': width,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.currentWidth = width;\n\n\t\treturn width;\n\t},\n\t\n\t// Event to resize width on window resize\n\t// If there's not enough room for the element, we'll shrink it\n\t// and expand it back as it gets more room (until it hits its originally set width)\n\t_updateStageSize() {\n\t\tnetxDrag.Constructor.prototype._updateStageSize.apply(this, arguments);\n\t\t\n\t\tlet dimensionAdjusted = false;\n\t\tlet newWidth = null;\n\t\t\n\t\tconst el = this.el[0];\n\t\tconst parent = el.parentElement;\n\t\t\n\t\tif (!el || !parent) return;\n\t\t\n\t\t// Get dimensions for element and its parent\n\t\tconst elRect = el.getBoundingClientRect();\n\t\tconst parentRect = parent.getBoundingClientRect();\n\n\t\t// Use tempWidth to keep track of what width we have the element set to\n\t\tthis.tempWidth = this.tempWidth || this.currentWidth;\n\n\t\t// Keep previous parent dimensions around so we know if we need to shrink or expand\n\t\tthis.previousParentRect = this.previousParentRect || parentRect;\n\n\t\tif (elRect.left + elRect.width > parentRect.right) {\n\t\t\t// Window is shrinking and there is not enough room for us anymore\n\n\t\t\tdimensionAdjusted = true;\n\n\t\t\t// Find new width that will let us fit perfectly\n\t\t\tnewWidth = Math.floor(parentRect.right - elRect.left);\n\t\t} else if (\n\t\t\tthis.previousParentRect.width < parentRect.width &&\n\t\t\tthis.tempWidth < this.currentWidth\n\t\t) {\n\t\t\t// Window is expanding and we haven't reached our originally set width yet\n\n\t\t\tdimensionAdjusted = true;\n\n\t\t\t// Figure out what our new width should be (add parent size difference onto tempWidth):\n\t\t\tnewWidth = Math.floor(\n\t\t\t\tthis.tempWidth + (parentRect.width - this.previousParentRect.width),\n\t\t\t);\n\n\t\t\t// The originally set width is our upper bound we shall not pass\n\t\t\tif (newWidth > this.currentWidth) {\n\t\t\t\tnewWidth = this.currentWidth;\n\t\t\t}\n\t\t}\n\n\t\tif (dimensionAdjusted) {\n\t\t\tthis.el.css({\n\t\t\t\twidth: newWidth,\n\t\t\t\tmaxWidth: newWidth,\n\t\t\t\tminWidth: newWidth,\n\t\t\t});\n\n\t\t\tthis.tempWidth = newWidth;\n\t\t}\n\n\t\tthis.previousParentRect = parentRect;\n\t}\n});\n\n// Your plugin methods\nvar methods = {\n\tproxyFor: function($el) {\n\t\tthis.proxy = $el.data('netxDragResize');\n\t},\n\treset: function(e) {\n\t\tthis.last_width = 0;\n\t\tthis.last_height = 0;\n\t\tthis.ui = this._getDragData(e);\n\t\tthis.el.css({\n\t\t\theight: '',\n\t\t\t'max-height': '',\n\t\t\t'max-width': '',\n\t\t\t'min-height': '',\n\t\t\t'min-width': '',\n\t\t\twidth: '',\n\t\t});\n\t\tvar _e = this._getDragEvent('dragresizereset', e, this.ui);\n\t\tthis.el[0].dispatchEvent(_e);\n\t},\n};\n\n_.extend(NetxDragResize.prototype, methods);\n\n// Make plugin accessible via jQuery namesapce\nfunction Plugin(option) {\n\t// Cache it\n\tvar _arguments = arguments;\n\n\treturn this.each(function() {\n\t\tvar $this = $(this),\n\t\t\tplugin = $this.data('netxDragResize'),\n\t\t\toptions = _.extend(\n\t\t\t\t{},\n\t\t\t\t$.fn.netxDragResize.defaults,\n\t\t\t\t_.isObject(option) && option ? option : {},\n\t\t\t);\n\n\t\tif (plugin) {\n\t\t\tif (typeof option === 'object' || !option) {\n\t\t\t\tplugin.init();\n\t\t\t} else if (option.charAt(0) !== '_' && plugin[option]) {\n\t\t\t\tplugin[option](_arguments[1]);\n\t\t\t} else {\n\t\t\t\tplugin.init();\n\t\t\t}\n\t\t\treturn $this;\n\t\t} else if (option != 'destroy') {\n\t\t\tplugin = new NetxDragResize(options, $this[0]);\n\t\t\t$this.data('netxDragResize', plugin);\n\t\t\treturn $this;\n\t\t}\n\t});\n}\n\n$.fn.netxDragResize = Plugin;\n$.fn.netxDragResize.Constructor = NetxDragResize;\n\n// Defaults\n$.fn.netxDragResize.defaults = _.extend({}, netxDrag.defaults, {\n\tdirection: 'horizontal',\n\tdragFrom: 'right',\n\tmaxHeight: Infinity,\n\tmaxWidth: Infinity,\n\tminHeight: 20,\n\tminWidth: 20,\n\tusePercent: false,\n\tunderflowParent: true,\n});\n\nexport default Plugin;\n","import {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\n\nexport const expirationTypes = {\n\tindefinite: 'indefinite',\n\taccesses: 'accesses',\n\tdate: 'date',\n};\n\nexport const securityTypes = {\n\tnone: 'none',\n\tpassword: 'password',\n\t// referrer: \"referrer\", // someday ...\n\t// ipAddr: \"ipAddr\" // someday ...\n};\n\n// savedCart is a token type, current cart is not.\nexport let accessTypes = _.omit(assetSetTypes, 'cart');\n\nexport default {accessTypes, expirationTypes, securityTypes};\n","export const TOKEN_PASSWORD_PLACEHOLDER = '********';\n\nexport * from '@netx/core-share-request/constants';\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/downloadShareView.html -->\\n<div class=\"container-fluid\">\\n\t<form>\\n\t\t<button class=\"btn btn-primary\" type=\"submit\"><span class=\"text\" data-i18n=\"share:i18n.download\">i18n.download</span></button>\\n\t</form>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/emailShareView.html -->\\n<div class=\"container\">\\n\t<form name=\"emailShareForm\" data-nx-validate-form>\\n\t\t<div class=\"container-fluid flex-column-grid\">\\n\t\t\t';\n if(!_.isUndefined(Netx.user.prefs.getPreference('share.message'))) { \n__p+='\\n\t\t\t<p>'+\n((__t=( Netx.user.prefs.getPreference('share.message') ))==null?'':__t)+\n'</p>\\n\t\t\t';\n } \n__p+='\\n\t\t\t<input type=\"hidden\" id=\"emailFrom\" class=\"form-control\" required value=\"'+\n((__t=( Netx.user.profile.get('email') ))==null?'':__t)+\n'\">\\n\t\t\t<div class=\"form-group\">\\n\t\t\t\t<label class=\"control-label full-width\" for=\"emailTo\"><span data-i18n=\"i18n.contacts\">i18n.contacts</span></label>\\n\t\t\t\t<input class=\"item form-control\" name=\"emailTo\" type=\"text\" required \\n\t\t\t\t\tpattern=\"[a-z0-9._%+-]+@[a-z0-9.-]+\\\\.[a-z]{2,15}$\"\\n\t\t\t\t\tdata-fv-message=\"Please enter a valid email address.\"\\n\t\t\t\t\tmultiple=\"multiple\" \\n\t\t\t\t\tdata-fv-emailAddress-multiple=\"true\">\\n\t\t\\n\t\t\t</div>\\n\t\t\t<div class=\"form-group\">\\n\t\t\t\t<label class=\"control-label full-width\" for=\"emailNotes\"><span data-i18n=\"i18n.message\">i18n.message</span></label>\\n\t\t\t\t<textarea id=\"emailNotes\" name=\"emailNotes\" rows=\"3\" class=\"form-control\"></textarea>\\n\t\t\t</div>\\n\t\t</div>\\n\t\t<footer>\\n\t\t\t<div class=\"actions double\">\\n\t\t\t\t<button type=\"button\" class=\"btn btn-default cancel nx-cancel pull-left\" data-nx-control=\"cancel\"><span class=\"text\" data-i18n=\"i18n.cancel\">i18n.cancel</span></button>\\n\t\t\t\t<button type=\"submit\" class=\"btn btn-save submit\"><span class=\"text\" data-i18n=\"i18n.send\">i18n.send</span></button>\\n\t\t\t</div>\\n\t\t</footer>\\n\t</form>\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/mediaServiceShareView.html -->\\n<div class=\"container\">\\n\t<form name=\"media-service-share-view-form\" role=\"form\" data-nx-validate-form>\\n\t\t<header>\\n\t\t\t<h2 class=\"title\"><span class=\"text\">'+\n((__t=( headerTitle ))==null?'':__t)+\n'</span></h2>\\n\t\t</header>\\n\t\t<div class=\"container-fluid\">\\n\t\t';\n if( !authenticated ) { \n__p+='\\n\t\t\tNo authenticated services\\n\t\t';\n } else { \n__p+='\\n\t\t\t';\n _.each( mediaServices, function( service, k ) { \n__p+='\\n\t\t\t\t';\n if( service.get('authenticated') && (service.get('name') === 'YouTube' || service.get('name') === 'Brightcove') ) {\n__p+='\\n\t\t\t\t<div class=\"form-group\">\\n\t\t\t\t\t<span class=\"checkbox inline\">\\n\t\t\t\t\t\t<input id=\\'publish-'+\n((__t=( service.get('name') ))==null?'':__t)+\n'\\' type=\"checkbox\" name=\"'+\n((__t=( service.get('id') ))==null?'':_.escape(__t))+\n'\" value=\"1\">\\n\t\t\t\t\t\t<label for=\"publish-'+\n((__t=( service.get('name') ))==null?'':__t)+\n'\">'+\n((__t=( service.get('label') ))==null?'':__t)+\n'</label>\\n\t\t\t\t\t</span>\\n\t\t\t\t</div>\\n\t\t\t\t';\n } \n__p+='\\n\t\t\t';\n } ); \n__p+='\\n\t\t';\n } \n__p+='\\n\t\t</div>\\n\t\t<footer>\\n\t\t\t<div class=\"actions\">\\n\t\t\t\t<aside>\\n\t\t\t\t\t<button type=\"button\" class=\"btn btn-default cancel nx-cancel\" data-nx-control=\"cancel\"><span class=\"text\" data-i18n=\"i18n.cancel\">i18n.cancel</span></button>\\n\t\t\t\t</aside>\\n\t\t\t\t<bside>\\n\t\t\t\t\t<button type=\"submit\" class=\"btn btn-save submit\" data-nx-control=\"save\"><span class=\"text\" data-i18n=\"i18n.publish\">i18n.publish</span></button>\\n\t\t\t\t</bside>\\n\t\t\t</div>\\n\t\t</footer>\\n\t</form>\\n</div>\\n';\n}\nreturn __p;\n};\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}\nmodule.exports = _toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// Drag resize fpor column headers\nimport 'core-libs/nx-drag/jquery-netx-dragresize';\n\nimport Backgrid from 'backgrid';\n// Backgrid filters\nimport {ClientSideFilter} from 'core-libs/backgrid-filter';\nBackgrid.Extension.ClientSideFilter = ClientSideFilter;\n\nimport 'core-libs/backgrid-select-all';\n// Interesting he is so stubborn, may take him up on it\n// https://github.com/AmiliaApp/backgrid-select-filter/issues/5\nimport {SelectFilter} from 'core-libs/backgrid-select-filter';\nBackgrid.Extension.SelectFilter = SelectFilter;\n\nBackgrid.StringFormatter.prototype.fromRaw = (rawValue, model) => {\n\tif (_.isUndefined(rawValue) || _.isNull(rawValue)) return '';\n return rawValue + '';\n}\n\nBackgrid.StringCell.prototype.render = function () {\n var $el = this.$el;\n $el.empty();\n var model = this.model;\n var columnName = this.column.get(\"name\");\n $el.text(this.formatter.fromRaw(model.get(columnName), model));\n $el.addClass(columnName);\n this.updateStateClassesMaybe();\n this.delegateEvents();\n return this;\n};\n\n/**\n * Add some ui components to your cells\n * Only works with html like cells - like HtmlCell and BooleanCell\n * @type {object}\n */\nBackgrid.UIComponents = {\n\t/**\n\t * Datepicker component\n\t * @method\n\t */\n\tdatepicker: function() {\n\t\tvar plugins = this.plugins = this.plugins || {};\n\t\tif( plugins.selectpicker ) {\n\t\t\tplugins.datepicker.destroy();\n\t\t\tdelete plugins.datepicker;\n\t\t}\n\n\t\t// Check that we want it\n\t\tvar datepicker = this.column.get('datepicker');\n\t\tif( datepicker ) {\n\t\t\tvar $dateEl = this.$(':input[type=\"text\"], :input[type=\"date\"]');\n\t\t\tif( $dateEl.length ) {\n\t\t\t\t// Enforce these attributes so we do not conflict with a built in browser date picker\n\t\t\t\t$dateEl\n\t\t\t\t\t.attr('type', 'text')\n\t\t\t\t\t.attr('data-provider', 'datepicker');\n\n\t\t\t\t$dateEl.datepicker( _.extend( {\n\t\t\t\t\tautoclose : true,\n\t\t\t\t\tdisableTouchKeyboard : 'true',\n\t\t\t\t\tformat : 'yyyy-mm-dd'\n\t\t\t\t}, datepicker ) );\n\t\t\t\t// Store for cleanup\n\t\t\t\tplugins.datepicker = $dateEl.data('datepicker');\n\t\t\t\tthis.$el.addClass('datepicker-cell');\n\t\t\t}\n\t\t}\n\t},\n\t/**\n\t * Selectpicker component\n\t * @method\n\t */\n\tselectpicker: function() {\n\t\tvar plugins = this.plugins = this.plugins || {};\n\t\tif( plugins.selectpicker ) {\n\t\t\tplugins.selectpicker.destroy();\n\t\t\tdelete plugins.selectpicker;\n\t\t}\n\n\t\t// Check that we want it\n\t\tvar selectpicker = this.column.get('selectpicker');\n\t\tif( selectpicker ) {\n\t\t\tvar $selectEl = this.$('select');\n\t\t\tif( $selectEl.length ) {\n\t\t\t\t$selectEl.selectpicker( _.extend( {\n\t\t\t\t\tcontainer: 'body'\n\t\t\t\t}, selectpicker ) );\n\t\t\t\t// Store for cleanup\n\t\t\t\tplugins.selectpicker = $selectEl.data('selectpicker');\n\t\t\t\tthis.$el.addClass('selectpicker-cell');\n\t\t\t}\n\t\t}\n\t},\n\t/**\n\t * Tooltip component\n\t * @method\n\t */\n\ttooltip: function() {\n\t\t// Setup and cleanup any existing instances\n\t\tvar plugins = this.plugins = this.plugins || {};\n\t\tif( plugins.tooltip ) {\n\t\t\tplugins.tooltip.destroy();\n\t\t\tdelete plugins.tooltip;\n\t\t}\n\n\t\t// Check that we want it\n\t\tvar tooltip = this.column.get('tooltip');\n\t\tif( tooltip ) {\n\t\t\tvar enabled = true,\n\t\t\t\t$tooltipEl = this.$el,\n\t\t\t\ttooltipOptions = _.extend( {\n\t\t\t\t\tplacement : 'top',\n\t\t\t\t\tcontainer : 'body',\n\t\t\t\t\ttitle : ''\n\t\t\t\t}, tooltip );\n\n\t\t\t// We want to pass the model to the function\n\t\t\tif( _.isFunction( tooltipOptions.title ) ) {\n\t\t\t\ttooltipOptions.title = _.partial( tooltipOptions.title, this.model );\n\t\t\t}\n\t\t\t// A tooltip target has been specified\n\t\t\tif( tooltipOptions.target ) {\n\t\t\t\t$tooltipEl = this.$( tooltipOptions.target );\n\t\t\t}\n\n\t\t\tif( _.isFunction( tooltip.enabled ) ) {\n\t\t\t\tenabled = tooltip.enabled( this.model );\n\t\t\t}\n\t\t\telse if( _.isBoolean( tooltip.enabled ) ) {\n\t\t\t\tenabled = tooltip.enabled;\n\t\t\t}\n\n\t\t\t// Everything looks good\n\t\t\tif( enabled && $tooltipEl.length ) {\n\t\t\t\t$tooltipEl\n\t\t\t\t\t.attr('data-toggle', 'tooltip')\n\t\t\t\t\t.tooltip( _.omit( tooltipOptions, 'target' ) );\n\t\t\t\t// Store for cleanup\n\t\t\t\tplugins.tooltip = $tooltipEl.data('bs.tooltip');\n\t\t\t\tthis.$el.addClass('tooltip-cell');\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n// ======================\n// Custom cells\n// ======================\n/**\n * Backgrid.BooleanCell extension:\n * if present, test omitRender() method to see if we should omit the render.\n * (Overriden in v8)\n * @class\n * @extends Backgrid.BooleanCell\n */\nBackgrid.BooleanCell = Backgrid.BooleanCell.extend(/** @lends Backgrid.BooleanCell */{\n\t/** @type {string} */\n\tclassName: 'boolean-cell',\n\t/**\n\t * @override\n\t * @param {object} opts Backgrid view options\n\t */\n\tinitialize: function( opts ) {\n\t\t// Super\n\t\tBackgrid.Cell.prototype.initialize.apply( this, arguments );\n\n\t\tvar column = this.column,\n\t\t\tmodel = this.model;\n\n\t\t// Just update the state\n\t\tthis.stopListening( model, \"change:\" + column.get(\"name\") );\n\t\tthis.listenTo( model, \"change:\" + column.get(\"name\"), function ( model, newValue ) {\n\t\t\tnewValue = this.formatter.fromRaw( model.get( column.get(\"name\") ), model );\n\t\t\tif ( !this.$checkbox ) return;\n\n\t\t\tthis.$checkbox\n\t\t\t\t.prop('checked', newValue ? true : false )\n\t\t\t\t.prop('disabled', this.isEnabled() === false || null );\n\t\t} );\n\t},\n\t/** @override */\n\trender: function() {\n\t\tvar model = this.model,\n\t\t\tcolumn = this.column,\n\t\t\t// This needs an unique ID to map the label to the input; don't use it for anything else pls.\n\t\t\tid = _.uniqueId('checkbox-uid-'),\n\t\t\t// Should we not render\n\t\t\tomitRender = column.get('omitRender'),\n\t\t\t// Title for the checkbox\n\t\t\ttitle = column.get('title'),\n\t\t\t// The formatter can perform any extra calculations to return the desired result.\n\t\t\tvalue = this.formatter.fromRaw( model.get( column.get(\"name\") ), model );\n\n\t\t// Clean up and add classes\n\t\tthis.$el.empty().addClass( column.get('className') || column.get('name') + '-attr' );\n\n\t\t// If we should not render\n\t\tif ( _.isFunction( omitRender ) && omitRender( value, model ) ) {\n\t\t\t// leave blank\n\t\t\tdelete this.$checkbox;\n\t\t}\n\t\telse {\n\t\t\tvar enabled = this.isEnabled();\n\n\t\t\tthis.$el.append( [\n\t\t\t\t'<span class=\"checkbox inline\">',\n\t\t\t\t\t'<input id=\"', id, '\" class=\"switch\" type=\"checkbox\"', value ? \" checked\" : \"\", enabled ? \"\" : \" disabled\", ' data-nx-ignore=\"change\">',\n\t\t\t\t\t'<label for=\"', id , '\" title=\"', title, '\"></label>',\n\t\t\t\t'</span>'\n\t\t\t\t].join(\"\")\n\t\t\t);\n\t\t\t// Cache\n\t\t\tthis.$checkbox = this.$el.find('input[type=\"checkbox\"]');\n\t\t}\n\n\t\t// Avialable UI components for this cell type\n\t\tBackgrid.UIComponents.tooltip.apply( this, arguments );\n\n\t\t// Delegate events\n\t\tthis.delegateEvents();\n\n\t\treturn this;\n\t},\n\t/** @override */\n\tformatter : _.extend( {}, Backgrid.CellFormatter, {\n\t\tfromRaw: function( raw, model ){\n\t\t\t// No formatting at all. However, subclasses/instances can override this method\n\t\t\t// to perform any sort of logic needed to return any synthetic boolean value\n\t\t\t// -- just be sure to return something truthy/falsethy .\n\t\t\treturn raw;\n\t\t}\n\t} )\n});\n\n/**\n * Backgrid.ControlCell\n * @class\n * @extends Backgrid.Cell\n */\nBackgrid.ControlCell = Backgrid.Cell.extend(/** @lends Backgrid.ControlCell */{\n\t/** @type {string} */\n\tclassName: 'control-cell',\n\t/**\n\t * @override\n\t * @param {object} opts Backbone view options\n\t */\n\tinitialize: function( opts ) {\n\t\t// Super\n\t\tBackgrid.Cell.prototype.initialize.apply( this, arguments );\n\n\t\tvar column = this.column,\n\t\t\tmodel = this.model;\n\n\t\t// We are neither editable nor sortable\n\t\tcolumn.set( {\n\t\t\teditable : false,\n\t\t\tsortable : false\n\t\t} );\n\n\t\t// Listen to all changes\n\t\tthis.stopListening( model, 'change:' + column.get('name') );\n\t\tthis.listenTo( model.collection, 'change sync', _.debounce( this.render, 10 ) );\n\t},\n\t/** @override */\n\trender: function() {\n\t\tvar column = this.column,\n\t\t\tmodel = this.model;\n\n\t\tthis.$el\n\t\t\t.empty()\n\t\t\t.addClass( column.get('className') || column.get('name') + '-attr' );\n\n\n\t\tvar omitRender = column.get('omitRender');\n\t\t// If we should not render\n\t\tif ( _.isFunction( omitRender ) && omitRender( model.get( column.get('name') ), model ) ) {\n\t\t\treturn this;\n\t\t}\n\t\telse {\n\t\t\tvar nxActions = Netx.Actions,\n\t\t\t\taction;\n\n\t\t\tthis.$el.html( [\n\t\t\t\t'<div class=\"actions\">',\n\t\t\t\t\t_.compact( _.map( this.formatter.fromRaw( ( column.get('actions') || [] ).slice(), model ), function( name ) {\n\t\t\t\t\t\taction = nxActions.Find( name );\n\t\t\t\t\t\tif( action ) {\n\t\t\t\t\t\t\tconst icon = typeof action.icon === 'string' ? `<i class=\"fa fa-${action.icon}\"></i>` : action.icon;\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t'<a class=\"action nx-action\" data-action=\"' + name + '\">',\n\t\t\t\t\t\t\t\t\ticon ? icon : '<span class=\"text\">' + action.label + '</span>',\n\t\t\t\t\t\t\t\t'</a>'\n\t\t\t\t\t\t\t].join(\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tconsole.warn(\"Could not find action\", name );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) ).join(\"\"),\n\t\t\t\t'</div>'\n\t\t\t].join(\"\") );\n\n\n\t\t\t// TODO: once we piece out our action code, enabling, disabling, checking validity etc revisit\n\t\t\t// Call our actions\n\t\t\tthis.initializeActions();\n\t\t\tthis.renderActions();\n\n\t\t\t// Avialable UI components for this cell type\n\t\t\tBackgrid.UIComponents.tooltip.apply( this, arguments );\n\n\t\t\treturn this;\n\t\t}\n\t},\n\t/** @override */\n\tformatter : _.extend( {}, Backgrid.CellFormatter, {\n\t\tfromRaw: function( raw, model ){\n\t\t\t// No formatting at all. However, subclasses/instances can override this method\n\t\t\t// to perform any sort of logic needed to omit any actions\n\t\t\t// -- just be sure to return an array of action names.\n\t\t\treturn raw;\n\t\t}\n\t} )\n} );\n\n/**\n * Backgrid.DateCellEditor\n * Sets the right attributes for, and initializes, the datepicker\n * @class\n * @extends Backgrid.InputCellEditor\n */\nBackgrid.DateCellEditor = Backgrid.InputCellEditor.extend(/** @lends Backgrid.DateCellEditor */{\n\t/**\n\t * @override\n\t * @param {object} opts Backgrid view options\n\t */\n\tinitialize: function( opts ) {\n\t\t// Super\n\t\tBackgrid.InputCellEditor.prototype.initialize.apply( this, arguments );\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this.model.collection, 'backgrid:editing', this.killDatepicker);\n\t},\n\t/** @override */\n\trender: function() {\n\t\tvar r = Backgrid.InputCellEditor.prototype.render.apply( this, arguments );\n\t\t// Avialable UI components for this cell type\n\t\tBackgrid.UIComponents.datepicker.apply( this, arguments );\n\t\tBackgrid.UIComponents.tooltip.apply( this, arguments );\n\t\treturn r;\n\t},\n\t/**\n\t * @override\n\t * @param {event} e jQuery event\n\t */\n\tsaveOrCancel: function ( e ) {\n\t\t// Blur will always fire here first before we can do anything (blur fires before the click is ever registered on reset)\n\t\t// Lets check that it wasn't caused by Cell.resetValue()\n\t\t// Cell.resetValue() calls this.saveOrCancel( cancelEvent ) and also dispatches an event 'backgrid:reset'\n\t\t// We also do want the interaction with the calendar to be considered a true input blur - if the calendar is still visible then nothing has been chosen yet\n\t\tif( e.type === \"blur\" ) {\n\t\t\t_.delay( _.bind( function() {\n\t\t\t\t// Method will be handled with another event\n\t\t\t\tvar datepicker = this.plugins && this.plugins.datepicker;\n\t\t\t\tif( this.wasReset || ( datepicker && datepicker.picker.is(\":visible\") ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Super\n\t\t\t\treturn Backgrid.InputCellEditor.prototype.saveOrCancel.apply( this, [ e ] );\n\t\t\t}, this ), 200 );\n\t\t}\n\t\telse {\n\t\t\t// Super\n\t\t\treturn Backgrid.InputCellEditor.prototype.saveOrCancel.apply( this, arguments );\n\t\t}\n\t},\n\t/** @method */\n\tkillDatepicker: function( model, collection ) {\n\t\tif( model != this.model && this.datepicker ) {\n\t\t\tthis.$el.removeClass('editor');\n\t\t\tvar plugins = this.plugins || {};\n\t\t\tif( plugins.datepicker ) {\n\t\t\t\tplugins.datepicker.remove();\n\t\t\t\tdelete plugins.datepicker;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n/**\n * Backgrid.HandleCell\n * Sets the right attributes for reorder handle\n * @class\n * @extends Backgrid.Cell\n */\nBackgrid.HandleCell = Backgrid.Cell.extend( {\n\t/** @type {string} */\n\tclassName: 'handle-cell handle handle-icon',\n\t/**\n\t * @override\n\t * @param {object} opts Backbone view options\n\t */\n\tinitialize: function( opts ) {\n\t\t// Super\n\t\tBackgrid.Cell.prototype.initialize.apply( this, arguments );\n\n\t\tthis.column.set( {\n\t\t\tname : 'handle',\n\t\t\tlabel : '',\n\t\t\teditable : false,\n\t\t\tsortable : false\n\t\t} );\n\t},\n\t/** @override */\n\trender: function() {\n\t\tthis.$el\n\t\t\t.empty()\n\t\t\t.html('<i class=\"fa fa-equals\"></i>');\n\n\t\treturn this;\n\t}\n} );\n\n/**\n * Backgrid.HtmlFormatter\n * Useful Backgrid formatter for when you'd like to be able to dump raw HTML directly into a table cell.\n * It's a copy of Backgrid.Cell.render() with slight tweaks.\n * @class\n * @extends Backgrid.Cell\n */\nBackgrid.HtmlCell = Backgrid.Cell.extend(/** @lends Backgrid.HtmlCell */{\n\t/** @type {string} */\n\tclassName: 'html-cell',\n\t/**\n\t * @override\n\t * @param {object} opts Backbone view options\n\t */\n\tinitialize: function( opts ) {\n\t\t// Super\n\t\tBackgrid.Cell.prototype.initialize.apply( this, arguments );\n\n\t\tvar column = this.column;\n\t\tif (!column.get('sortValue')) {\n\t\t\tcolumn.set({\n\t\t\t\tsortable : false\n\t\t\t});\n\t\t}\n\t},\n\t/** @override */\n\trender: function(){\n\t\tthis.$el.empty();\n\n\t\tvar column = this.column,\n\t\t\tmodel = this.model;\n\n\t\tthis.$el\n\t\t\t.html( this.formatter.fromRaw( model.get( column.get(\"name\") ), model ) )\n\t\t\t.addClass( column.get('className') || column.get('name') + \"-attr\" );\n\n\t\tthis.delegateEvents();\n\n\t\t// Avialable UI components for this cell type\n\t\tBackgrid.UIComponents.tooltip.apply( this, arguments );\n\t\tBackgrid.UIComponents.selectpicker.apply( this, arguments );\n\n\t\treturn this;\n\t}\n} );\n\n/**\n * Backgrid.ImageCell\n * @class\n * @extends Backgrid.Cell\n */\nBackgrid.ImageCell = Backgrid.Cell.extend(/** @lends Backgrid.ImageCell */{\n\t/** @type {string} */\n\tclassName: 'image-cell',\n\t/**\n\t * @override\n\t * @param {object} opts Backbone view options\n\t */\n\tinitialize: function( opts ) {\n\t\t// Super\n\t\tBackgrid.Cell.prototype.initialize.apply( this, arguments );\n\n\t\t// We are neither editable nor sortable\n\t\tthis.column.set( {\n\t\t\teditable : false,\n\t\t\tsortable : false\n\t\t} );\n\t},\n\t/** @override */\n\trender: function() {\n\t\tvar column = this.column,\n\t\t\tmodel = this.model;\n\n\t\tthis.$el\n\t\t\t.empty()\n\t\t\t.addClass( column.get('className') || column.get('name') + '-attr' );\n\n\t\tvar omitRender = column.get('omitRender');\n\t\t// If we should not render\n\t\tif ( _.isFunction( omitRender ) && omitRender( model.get( column.get('name') ), model ) ) {\n\t\t\treturn this;\n\t\t}\n\t\telse {\n\t\t\tthis.$el.html( [\n\t\t\t\t'<div class=\"thumbnail\">',\n\t\t\t\t\t'<img src=\"' + model.get( column.get('name') ) + '\">',\n\t\t\t\t'</div>'\n\t\t\t].join(\"\") );\n\n\t\t\t// Avialable UI components for this cell type\n\t\t\tBackgrid.UIComponents.tooltip.apply( this, arguments );\n\n\t\t\treturn this;\n\t\t}\n\t},\n\t/** @override */\n\tformatter : _.extend( {}, Backgrid.CellFormatter, {\n\t\tfromRaw: function( raw, model ) {\n\t\t\t// No formatting at all. However, subclasses/instances can override this method\n\t\t\t// to perform any sort of logic needed to omit any actions\n\t\t\t// -- just be sure to return an array of action names.\n\t\t\treturn raw;\n\t\t}\n\t} )\n} );\n\n/**\n * Backgrid.NetxNumberCellEditor\n * Can enforce decimals and length\n * @class\n * @extends Backgrid.InputCellEditor\n */\nBackgrid.NetxNumberCellEditor = Backgrid.InputCellEditor.extend(/** @lends Backgrid.NetxNumberCellEditor */{\n\t/**\n\t * @override\n\t * @type {object}\n\t */\n\tevents: _.extend( {}, Backgrid.InputCellEditor.prototype.events, {\n\t\t'keyup': 'validate'\n\t} ),\n\t/** @override */\n\tpostRender: function() {\n\t\t// Super\n\t\tBackgrid.InputCellEditor.prototype.postRender.apply( this, arguments );\n\n\t\t// Store at post render in case these things change\n\t\tthis.decimalLength = this.formatter.decimals,\n\t\tthis.maxLength = this.formatter.maxLength;\n\t},\n\t/**\n\t * @method\n\t * @param {event} e Keyup event\n\t */\n\tvalidate: function( e ) {\n\t\tvar decimals = 0,\n\t\t\tvalidInput = false,\n\t\t\tvalue = this.$el.val();\n\t\t// Decimal number attribute\n\t\tif( this.decimalLength ) {\n\t\t\t// Check only numbers and decimals\n\t\t\tvalidInput = /^[0-9\\.]*$/.test(value);\n\t\t\tif( !validInput ) {\n\t\t\t\tthis.$el.val( value.replace(/[^0-9\\.]+/g,'') );\n\t\t\t\tconsole.warn(\"Only integers and decimals allowed.\");\n\t\t\t}\n\t\t\t// Check for decimals\n\t\t\tdecimals = value.split(\".\");\n\t\t\t// Decimals exist and are too many\n\t\t\tif( decimals[1] && decimals[1].length > this.decimalLength ) {\n\t\t\t\tthis.$el.val( [ decimals[0], decimals[1].substring( 0, this.decimalLength ) ].join(\".\") );\n\t\t\t\tconsole.warn(\"Only \" + this.decimalLength + \" decimals allowed.\");\n\t\t\t}\n\t\t}\n\t\t// Whole number attribute value\n\t\telse {\n\t\t\t// Check only numbers\n\t\t\tvalidInput = /^[0-9]*$/.test(value);\n\t\t\tif( !validInput ) {\n\t\t\t\tthis.$el.val( value.replace(/[^0-9]+/g,'') );\n\t\t\t\tconsole.warn(\"This is a whole number attribute. No decimals.\");\n\t\t\t}\n\t\t}\n\t\t// Whole number attribute value that has too many digits\n\t\tif( !this.decimalLength && this.maxLength && value.length > this.maxLength ) {\n\t\t\tthis.$el.val( value.substring( 0, this.maxLength ) );\n\t\t\tconsole.warn(\"Max length for this attribute is: \" + this.maxLength );\n\t\t}\n\t}\n} );\n\n/**\n * Backgrid.TextareaCellEditor\n * A custom cell editor for Backgrid.TextareaCell\n * @class\n * @extends Backgrid.InputCellEditor\n */\nBackgrid.TextareaCellEditor = Backgrid.InputCellEditor.extend(/** @lends Backgrid.TextareaCellEditor */{\n\t/** @type {string} */\n\ttagName: 'textarea',\n\t/** @override */\n\tsaveOrCancel: function( e ) {\n\t\t// Vars\n\t\tvar key;\n\n\t\t// Get keycode\n\t\tkey = e.keyCode || e.which;\n\t\t// If enter, ignore - it's a textarea\n\t\tif( key === 13 ) return;\n\t\t// Super\n\t\treturn Backgrid.InputCellEditor.prototype.saveOrCancel.apply( this, arguments );\n\t}\n} );\n\n/**\n * Backgrid.TextareaCell\n * A custom cell for textareas\n * @class\n * @extends Backgrid.StringCell\n */\nBackgrid.TextareaCell = Backgrid.StringCell.extend(/** @lends Backgrid.TextareaCell */{\n\t/** @type {Backgrid.TextareaCellEditor} */\n\teditor: Backgrid.TextareaCellEditor\n} );\n// ======================\n// !Custom cells\n// ======================\n\n\n// ======================\n// Backgrid enhancements\n// ======================\n/**\n * We want to provide the ability to reset a cell to its original value\n * In order to do this we need an element and an event and to modify how InputCellEditor blur event works\n * We are also supporting multiple cell selections as well\n */\n+function() { // Keep out of global scope\n\t// Create copy of original Backgrid.Body.prototype\n\tvar Grid = _.extend( {}, Backgrid.Grid.prototype );\n\t// Extend Backgrid.Body.prototype\n\t_.extend( Backgrid.Grid.prototype, {\n\t\t/**\n\t\t * Delegates to Backgrid.Body#getRowById.\n\t\t * @method\n\t\t * @param {number} id Model id\n\t\t */\n\t\tgetRowById: function( id ) {\n\t\t\treturn this.body.getRowById.apply( this.body, arguments );\n\t\t},\n\t\t/**\n\t\t * Delegates to Backgrid.Body#hideRow.\n\t\t * @method\n\t\t * @param {Backbone.Model} mode Row model\n\t\t * @param {number} index Row index\n\t\t */\n\t\thideRow: function( model, index ) {\n\t\t\tthis.body.hideRow.apply( this.body, arguments );\n\t\t\treturn this;\n\t\t}\n\t} );\n\n\t// Create copy of original Backgrid.Body.prototype\n\tvar Body = _.extend( {}, Backgrid.Body.prototype );\n\t// Extend Backgrid.Body.prototype\n\t_.extend( Backgrid.Body.prototype, {\n\t\t/**\n\t\t * @method\n\t\t * @param {number} id Model id\n\t\t * @return {Backgrid.Row} wor Row\n\t\t */\n\t\tgetRowById: function( id ) {\n\t\t\tvar rows = this.rows;\n\t\t\tfor( var i = 0, c = rows.length, row; i < c; i++ ) {\n\t\t\t\trow = rows[ i ];\n\t\t\t\tif ( row.model && row.model.id === id ) {\n\t\t\t\t\treturn row;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t/**\n\t\t * Well, if you remove a row it is removed from the collection - and not a copy of the collection\n\t\t * THE COLLECTION - so anywhere else you use the collection those rows (models) will be gone too (because same collection)\n\t\t * So here is a helper funtion to hide rows rather than remove them\n\t\t * @method\n\t\t * @param {Backbone.Model} mode Row model\n\t\t * @param {number} index Row index\n\t\t */\n\t\thideRow: function( model, index ) {\n\t\t\t// Vars\n\t\t\tvar row;\n\t\t\t// Nothing provided\n\t\t\tif( _.isUndefined( model ) && _.isUndefined( index ) ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t// Find index\n\t\t\tif ( _.isUndefined( index ) ) {\n\t\t\t\tindex = _.indexOf( this.collection.models, model );\n\t\t\t}\n\t\t\t// Get row\n\t\t\trow = this.rows[ index ];\n\t\t\t// Hide row if found\n\t\t\trow && row.$el && row.$el.hide();\n\n\t\t\treturn this;\n\t\t}\n\t} );\n\n\t// Create copy of original Backgrid.HeaderCell\n\tvar HeaderCell = _.extend( {}, Backgrid.HeaderCell.prototype );\n\t// Extend Backgrid.HeaderCell\n\t_.extend( Backgrid.HeaderCell.prototype, {\n\t\t/** @type {boolean} */\n\t\tuseAdvancedMenu: true,\n\t\t/**\n\t\t * @override\n\t\t * @param {object} opts Backgrid view options\n\t\t */\n\t\tinitialize: function( opts ) {\n\t\t\tthis.listenTo( this, 'context:menu:rendered', function( mv ) {\n\t\t\t\tvar e = $.Event( 'contextmenuRendered', { contextMenu: mv } );\n\t\t\t\tthis.$el.trigger( e );\n\t\t\t} );\n\t\t\t// Super\n\t\t\tHeaderCell.initialize.apply( this, arguments );\n\t\t},\n\t\t/** @override */\n\t\trender: function() {\n\t\t\tvar plugins = this.plugins = this.plugins || {};\n\t\t\tplugins.resizer && plugins.resizer.destroy();\n\n\t\t\tvar r = HeaderCell.render.apply( this, arguments );\n\n\t\t\t// Is column resizable\n\t\t\tvar resizable = this.column.get('resizable');\n\t\t\tvar sortable = this.column.get('sortable');\n\n\t\t\tif (!sortable) {\n\t\t\t\tvar span = document.createElement('span');\n\t\t\t\tspan.innerText = this.el.innerText;\n\t\t\t\tthis.el.innerText = '';\n\t\t\t\tthis.el.appendChild(span);\n\t\t\t}\n\n\t\t\t// Suport column resizing\n\t\t\tif ( resizable ) {\n\t\t\t\tthis.$el.netxDragResize( _.extend( {\n\t\t\t\t\tdragFrom : 'right',\n\t\t\t\t\tminWidth : 20,\n\t\t\t\t\tusePercent : false,\n\t\t\t\t\tunderflowParent : false\n\t\t\t\t}, _.isObject( resizable ) ? resizable : {} ) );\n\t\t\t\tplugins.resizer = this.$el.data('netxDragResize');\n\t\t\t}\n\t\t\t// Support context menus\n\t\t\tif ( this.column.get('contextMenu') ) {\n\t\t\t\tthis.$el.attr( 'data-contextmenu-target', this.column.get('contextMenu') );\n\t\t\t\tthis.menuCollection = this.column.get('menuCollection');\n\t\t\t}\n\n\t\t\t// Backgrid.HeaderCell already adds the attribute name as a class, so we only\n\t\t\t// need to support the className property.\n\t\t\t// Remove auto generated className and add defined className\n\t\t\tthis.$el.removeClass( this.column.get('name') );\n\t\t\tif ( this.column.has('className') ) {\n\t\t\t\tthis.$el.addClass( this.column.get('className') || \"\" );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Do this to avoid conflicts with columns names like: active, label, success etc\n\t\t\t\tthis.$el.addClass( this.column.get('name') + '-attr' );\n\t\t\t}\n\n\t\t\tif ( !this.column.has('title') ) {\n\t\t\t\tthis.$el.attr('title', this.column.get('label') );\n\t\t\t}\n\n\t\t\t// Get the underlying cells for this column header so we can determin type\n\t\t\tvar cell = this.column.get('cell');\n\t\t\tcell && this.$el.addClass( cell.prototype.className || \"\" );\n\n\t\t\treturn r;\n\t\t},\n\t\t/** @override */\n\t\tremove() {\n\t\t\tthis.$el.netxDragResize('destroy');\n\n\t\t\treturn HeaderCell.remove.apply( this, arguments );\n\t\t}\n\t} );\n\n\t// Enforce the max length of a number cell\n\t// And point its editor tour number editor\n\t// Create copy of original Backgrid.NumberCell\n\tvar NumberCell = _.extend( {}, Backgrid.NumberCell.prototype );\n\t// Extend Backgrid.InputCellEditor\n\t_.extend( Backgrid.NumberCell.prototype, {\n\t\t/**\n\t\t * @override\n\t\t * @type {Backgrid.NetxNumberCellEditor}\n\t\t */\n\t\teditor: Backgrid.NetxNumberCellEditor,\n\t\t/**\n\t\t * @override\n\t\t * @param {object} opts Backgrid view options\n\t\t */\n\t\tinitialize: function( opts ) {\n\t\t\t// Super\n\t\t\tNumberCell.initialize.apply( this, arguments );\n\t\t\tthis.formatter.maxLength = this.maxLength;\n\t\t}\n\t} );\n\n\t// Create copy of original Backgrid.Cell\n\tvar Cell = _.extend( {}, Backgrid.Cell.prototype );\n\t// Extend Backgrid.Cell\n\t_.extend( Backgrid.Cell.prototype, {\n\t\t/** @override */\n\t\tinitialize: function( opts ) {\n\t\t\t// Super\n\t\t\tCell.initialize.apply( this, arguments );\n\n\t\t\tvar column = this.column,\n\t\t\t\tmodel = this.model;\n\n\t\t\tif ( _.isArray( column.get('renderFor') ) ) {\n\t\t\t\t_.each( column.get('renderFor'), function( attr ) {\n\t\t\t\t\tthis.listenTo( model, 'change:' + attr, _.debounce( this.render, 10 ) );\n\t\t\t\t}, this );\n\t\t\t}\n\n\t\t\t// Re-render on error, ensuring our state is matched\n\t\t\tthis.listenTo( model, 'error', function() {\n\t\t\t\tthis.render();\n\t\t\t} );\n\t\t},\n\t\t/**\n\t\t * @method\n\t\t * @return {boolean} Enabled\n\t\t */\n\t\tisEnabled: function() {\n\t\t\tvar column = this.column;\n\t\t\tvar model = this.model;\n\t\t\tvar editUserLevel = column.get('editUserLevel');\n\t\t\t// like netx-view we check user level and permission matrix if available\n\t\t\tvar matrix = column.get('matrix');\n\t\t\tvar enabled = ( !editUserLevel || Netx.getUserLevel() >= editUserLevel ) && ( !matrix || model.allows(matrix) );\n\n\t\t\tif ( enabled && _.isFunction( column.get('enabled') ) ) {\n\t\t\t\tenabled = column.get('enabled')( model );\n\t\t\t}\n\n\t\t\treturn enabled;\n\t\t},\n\t\t/** @override */\n\t\tremove: function() {\n\t\t\t// Clean up any plugins/ui components\n\t\t\tif( this.plugins ) {\n\t\t\t\t_.each( this.plugins, function( p, k ) {\n\t\t\t\t\tp.destroy();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn Cell.remove.apply( this, arguments );\n\t\t},\n\t\t/**\n\t\t * Add a class to each cell, based on the name of the attribute it's showing,\n\t\t * but allow a column definition to override that name via a 'className' property.\n\t\t * @override\n\t\t */\n\t\trender: function() {\n\t\t\t// Super\n\t\t\tvar r = Cell.render.apply( this );\n\t\t\tthis.$el.addClass( this.column.get('className') || this.column.get('name') + '-attr' );\n\n\t\t\t// Cell type class names\n\t\t\tif( this instanceof Backgrid.DateCell ) {\n\t\t\t\tthis.$el.addClass('date-cell');\n\t\t\t}\n\t\t\telse if( this instanceof Backgrid.StringCell ) {\n\t\t\t\tthis.$el.addClass('string-cell');\n\t\t\t}\n\t\t\telse if( this instanceof Backgrid.NumberCell ) {\n\t\t\t\tthis.$el.addClass('number-cell');\n\t\t\t}\n\t\t\telse if( this instanceof Backgrid.TimeCell ) {\n\t\t\t\tthis.$el.addClass('time-cell');\n\t\t\t}\n\t\t\treturn r;\n\t\t}\n\t} );\n}();\n\n// Set editor for Backgrid.DateCell\n_.extend( Backgrid.DateCell.prototype, {\n\teditor: Backgrid.DateCellEditor\n} );\n\n// Make column sorting case insensitive\nBackgrid.Column.prototype.sortValue = function() {\n\tvar sortValue = this.get(\"sortValue\");\n\tif (_.isString(sortValue)) return this[sortValue];\n\telse if (_.isFunction(sortValue)) return sortValue;\n\n\treturn function (model, colName) {\n\t\tvar val = model.get(colName);\n\t\treturn _.isString( val ) ? val.toLowerCase() : val;\n\t};\n};\n// ======================\n// !Backgrid enhancements\n// ======================\n\n\nif( Backgrid.Extension.ClientSideFilter ) {\n\t// https://jira.netx.net/browse/DAM-9696\n\t// Fixes for backgrid client side filter (for our uses - we are not trying to do anything fancy and it has no safeguards against regexp characters)\n\tBackgrid.Extension.ClientSideFilter.prototype.makeRegExp = function( query ) {\n\t\tvar escapeChars = ['+','-','\\\\','/'];\n\t\tvar str = _.map( query.trim(), function( char, idx ) {\n\t\t\tif( _.indexOf( escapeChars, char ) > -1 ) {\n\t\t\t\treturn '\\\\' + char;\n\t\t\t}\n\t\t\treturn char;\n\t\t} ).join('');\n\n\t\treturn new RegExp( str, \"i\");\n\t};\n\n\t// ClientSideFilter doesn't clean up its shadowCollection instance, leading to memory leaks.\n\t// Here, at least we corral our own references.\n\t// But see also: https://jira.netx.net/browse/DAM-8958\n\tBackgrid.Extension.ClientSideFilter.prototype.remove = _.wrap( Backgrid.Extension.ClientSideFilter.prototype.remove, function( remove ) {\n\t\tif( this.shadowCollection ) {\n\t\t\tthis.shadowCollection.each( function( model ) {\n\t\t\t\t// Reference to collection\n\t\t\t\tmodel.removeCollectionReference && model.removeCollectionReference( this.shadowCollection );\n\t\t\t}, this );\n\t\t}\n\t\t// Super\n\t\treturn remove.apply( this, _.rest( arguments ) );\n\t} );\n}\n\nexport default Backgrid;","import {\n\tassetCanRepurpose,\n\tassetCanReview,\n\tassetExpirationEnabled,\n\tassetExpires,\n\tassetHasConstituents_pages,\n\tassetIsPresent,\n\tassetNotCheckedOut,\n\tassetNotPending,\n\tassetRequestsEnabled,\n\tcanCheckIn,\n\tcanCheckOut,\n\tcanDownloadVersion,\n\tcanLock,\n\tcanManageVersions,\n\tcanRemoveAssetFromCategory,\n\tcanUnlock,\n\tcanZoomAsset,\n} from './enablers';\nimport {\n\tallowsDelete,\n\tcanUseGridEditor,\n\tcategoryAndAssetCanEdit,\n\tcollectionNotEmpty,\n\tnotMobile,\n\treviewEnabled,\n} from '@netx/core/lib/netx-enablers';\n\nimport {canViewPDF} from '@netx/core-pdf-viewer/enablers';\n\nimport {UserLevel} from '@netx/core-user/constants';\n\nexport default [\n\t/**\n\t * Export attribute history\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:attributeHistory:export',\n\t\tlabel: i18n.t('i18n.export'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t},\n\t/**\n\t * Delete an asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:delete',\n\t\tlabel: i18n.t('i18n.deleteAsset'),\n\t\tmatrix: 'delete',\n\t\tenableTest: allowsDelete,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.attributes, e];\n\t\t},\n\t},\n\t/**\n\t * Save the asset fileInfo and asset attributes forms at the same time\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:infoAndAttributes:save',\n\t\tlabel: i18n.t('i18n.save'),\n\t\tmatrix: 'modify',\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Route to selected asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:route',\n\t\tlabel: i18n.t('i18n.route'),\n\t\tenableTest: assetNotPending,\n\t\troute(model) {\n\t\t\treturn `asset/${model.id}`;\n\t\t},\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Open the zoom window & show an asset at high res\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:zoom',\n\t\tlabel: i18n.t('i18n.zoom'),\n\t\tenableTest: canZoomAsset,\n\t\tdisabledClass: 'hide',\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\tvar model;\n\t\t\tif (view.model) {\n\t\t\t\tmodel = view.model;\n\t\t\t} else if (view.collection) {\n\t\t\t\tmodel = view.collection.models[0];\n\t\t\t} else {\n\t\t\t\tthrow new Error('bad argument to asset:zoom');\n\t\t\t}\n\t\t\treturn [model];\n\t\t},\n\t\troute(model) {\n\t\t\treturn `asset/${model.id}/zoom`;\n\t\t},\n\t},\n\n\t// ===============\n\t// CATEGORY\n\t// ===============\n\t/**\n\t * Manipulate the categories an asset resides in\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:category:add',\n\t\tlabel: i18n.t('i18n.addCategory'),\n\t\tuserLevel: 7,\n\t\tmatrix: 'modify',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:category:edit',\n\t\tlabel: i18n.t('i18n.editCategory'),\n\t\tenableTest: categoryAndAssetCanEdit,\n\t\tuserLevel: 7,\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.get('asset'), view.model];\n\t\t},\n\t},\n\t/**\n\t * Remove asset from category\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:category:remove',\n\t\tlabel: i18n.t('i18n.removeCategory'),\n\t\tenableTest: [categoryAndAssetCanEdit, canRemoveAssetFromCategory],\n\t\tuserLevel: 7,\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.get('asset'), view.model.get('categoryid')];\n\t\t},\n\t},\n\t// ===============\n\t// !CATEGORY\n\t// ===============\n\n\t// ===============\n\t// CHECK IN/OUT\n\t// ===============\n\t/**\n\t * Raise the asset checkin view\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:checkin',\n\t\tlabel: i18n.t('i18n.checkIn'),\n\t\tenableTest: canCheckIn,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\twrapper(v) {\n\t\t\treturn [v.model];\n\t\t},\n\t},\n\t/**\n\t * Remove a file (the file) from the asset checkin queue\n\t * @action\n\t *\n\t */\n\t{\n\t\tevent: 'asset:checkin:remove:file',\n\t\tlabel: i18n.t('i18n.removeFile'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.id];\n\t\t},\n\t\t// NOTE: this action's event is caught directly by the appoproate Upload model.\n\t},\n\t/**\n\t * Check out an asset, and trigger a download.\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:checkout',\n\t\tlabel: i18n.t('i18n.checkOut'),\n\t\tenableTest: canCheckOut,\n\t\ttestOnSync: true,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\twrapper(view) {\n\t\t\treturn view.model ? [view.model] : [];\n\t\t},\n\t},\n\t/**\n\t * Cancel check out of an asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:checkout:cancel',\n\t\tlabel: i18n.t('i18n.cancel'),\n\t\tenableTest: canCheckIn,\n\t\ttestOnSync: true,\n\t\tmatrix: 'modify',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t// ===============\n\t// !CHECK IN/OUT\n\t// ===============\n\n\t// ===============\n\t// CONSTITUENTS\n\t// ===============\n\t/**\n\t * Choose an asset consituent as the thumbnail for an asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:constituent:choose',\n\t\tlabel: i18n.t('i18n.chooseThisImageForTheAssetThumbnail'),\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\tuserLevel: UserLevel.PRODUCER,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * Delete an asset clip constituent\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:constituent:clip:delete',\n\t\tlabel: i18n.t('i18n.deleteAssetConstituentClip'),\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\tuserLevel: UserLevel.PRODUCER,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * Download an asset clip constituent\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:constituent:clip:download',\n\t\tlabel: i18n.t('i18n.downloadClip'),\n\t\tmatrix: 'download',\n\t\tuserLevel: UserLevel.PRODUCER,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Edit an asset constituent clip\n\t * @event\n\t */\n\t{\n\t\tevent: 'asset:constituent:clip:edit',\n\t\tlabel: i18n.t('i18n.editClip'),\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\tuserLevel: UserLevel.PRODUCER,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.get('assetId'), view.model.id];\n\t\t},\n\t},\n\t/**\n\t * Create a new asset constituent clip\n\t * @event\n\t */\n\t{\n\t\tevent: 'asset:constituent:clip:new',\n\t\tlabel: i18n.t('i18n.newClip'),\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\tuserLevel: 4,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.id];\n\t\t},\n\t},\n\t/**\n\t * Route to asset from constituent\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:constituent:route:asset',\n\t\tlabel: i18n.t('i18n.gotoAsset'),\n\t\troute(v) {\n\t\t\treturn 'asset/' + v.model.get('assetId');\n\t\t},\n\t},\n\t// ===============\n\t// !CONSTITUENTS\n\t// ===============\n\n\t// ===============\n\t// CUSTOM THUMBNAIL\n\t// ===============\n\t/** @action */\n\t{\n\t\tevent: 'asset:customThumbnail:select',\n\t\tlabel: i18n.t('i18n.addCustomThumbnail'),\n\t\tenableTest: assetIsPresent,\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\tuserLevel: 4,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t// ===============\n\t// !CUSTOM THUMBNAIL\n\t// ===============\n\n\t// ===============\n\t// DETAIL\n\t// ===============\n\t/**\n\t * hide the assetDetailView and return to previous path\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:detail:exit',\n\t\tlabel: i18n.t('i18n.returnToTheList'),\n\t},\n\t// ===============\n\t// !DETAIL\n\t// ===============\n\n\t// ===============\n\t// DOC VIEWER\n\t// ===============\n\t/**\n\t * Open the document viewer\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:docview',\n\t\tlabel: i18n.t('i18n.viewDocument'),\n\t\tenableTest: (v) => canViewPDF(v.model.attributes),\n\t\ttestOnSync: true,\n\t\twrapper(v, e) {\n\t\t\treturn [{assetId: v.model.id}];\n\t\t},\n\t},\n\t/**\n\t * Route to the document viewer\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:docview:route',\n\t\tlabel: i18n.t('i18n.viewDocument'),\n\t\tenableTest: (v) => canViewPDF(v.model.attributes),\n\t\ttestOnSync: true,\n\t\t// https://jira.netx.net/browse/DAM-9016\n\t\tuserLevel: 1,\n\t\troute(m) {\n\t\t\treturn `document/${m.assetId}`;\n\t\t},\n\t\twrapper(v, e) {\n\t\t\treturn [v.model.attributes];\n\t\t},\n\t},\n\t/**\n\t * open pdf in browser tab\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:docview:browser',\n\t\tlabel: i18n.t('asset:i18n.viewDocument'),\n\t\tuserLevel: 1,\n\t\twrapper(v, e) {\n\t\t\treturn [v.model, v, e];\n\t\t},\n\t},\n\t// ===============\n\t// !DOC VIEWER\n\t// ===============\n\n\t// ===============\n\t// EXPIRATION\n\t// ===============\n\t/**\n\t * View expiring assets\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:expirations:route',\n\t\tlabel: i18n.t('i18n.expiringAssets'),\n\t\tenableTest: assetExpirationEnabled,\n\t\troute: 'assets/expiring',\n\t\t// DAM-7767\n\t\t// Note (and Jason Wehling should see this, too) that all expired asset pagination – Flex's and now this – only works properly for admin users.\n\t\t// We'll need to move expiration state of assets to Solr before permission-filtered results will page correctly.\n\t\tuserLevel: 9,\n\t},\n\t/**\n\t * Manage expiration\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:manage:expire',\n\t\tlabel: i18n.t('i18n.manageExpiration'),\n\t\tuserLevel: 7,\n\t\tmatrix: 'delete',\n\t\tenableTest: assetExpirationEnabled,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * Set an asset to expire\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:expire',\n\t\tlabel: i18n.t('i18n.expire'),\n\t\tuserLevel: 7,\n\t\tmatrix: 'delete',\n\t\tenableTest: assetExpirationEnabled,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\t// Support option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\treturn [model, e];\n\t\t},\n\t},\n\t/**\n\t * Unset an asset to expire\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:unexpire',\n\t\tlabel: i18n.t('i18n.unexpire'),\n\t\tuserLevel: 7,\n\t\tmatrix: 'delete',\n\t\tenableTest: assetExpires,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\t// Support option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\treturn [model, e];\n\t\t},\n\t},\n\t// ===============\n\t// !EXPIRATION\n\t// ===============\n\n\t// =========================\n\t// LOCK/UNOLOCK (read-only)\n\t// =========================\n\t/**\n\t * Lock an asset (set readOnly)\n\t * This is outside of the matrix\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:lock',\n\t\tlabel: i18n.t('i18n.lockAsset'),\n\t\tenableTest: canLock,\n\t\ttestOnSync: true,\n\t\tuserLevel: 9,\n\t\twrapper(view, e) {\n\t\t\t// Support for option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\treturn [model, e];\n\t\t},\n\t},\n\t/**\n\t * Unlock an asset (unset readOnly)\n\t * This is outside of the matrix\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:unlock',\n\t\tlabel: i18n.t('i18n.unlockAsset'),\n\t\tenableTest: canUnlock,\n\t\ttestOnSync: true,\n\t\tuserLevel: 9,\n\t\twrapper(view, e) {\n\t\t\t// Support for option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\treturn [model, e];\n\t\t},\n\t},\n\t// =========================\n\t// !LOCK/UNOLOCK (read-only)\n\t// =========================\n\n\t// ===============\n\t// PDF\n\t// ===============\n\t/**\n\t * Create PDF from collection\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:createPDF',\n\t\tlabel: i18n.t('i18n.createPDF'),\n\t\tenableTest: collectionNotEmpty,\n\t\tuserLevel: 3,\n\t\tmatrix: 'download',\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\tif (view && view.collection) {\n\t\t\t\treturn [view.collection];\n\t\t\t} else {\n\t\t\t\treturn [Netx.cart.current];\n\t\t\t}\n\t\t},\n\t},\n\t// ===============\n\t// !PDF\n\t// ===============\n\n\t// ===============\n\t// PROJECTS\n\t// ===============\n\t/**\n\t * Add to or create project from cart\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:project',\n\t\tlabel: i18n.t('i18n.review'),\n\t\tenableTest: [notMobile, reviewEnabled, assetCanReview],\n\t\twrapper(view) {\n\t\t\treturn [view.model.attributes];\n\t\t},\n\t},\n\t/**\n\t * Add asset to project\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:project:add',\n\t\tlabel: i18n.t('i18n.addToProject'),\n\t\tenableTest: [notMobile, reviewEnabled],\n\t\twrapper(view) {\n\t\t\treturn [view.model.attributes];\n\t\t},\n\t},\n\t/**\n\t * Create project from asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:project:new',\n\t\tlabel: i18n.t('i18n.newProjectFromAsset'),\n\t\tenableTest: [notMobile, reviewEnabled, assetCanReview],\n\t\twrapper(view) {\n\t\t\treturn [view.model.attributes];\n\t\t},\n\t},\n\t// ===============\n\t// !PROJECTS\n\t// ===============\n\n\t// ===============\n\t// REIMPORT\n\t// ===============\n\t/**\n\t * reimport an asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:reimport',\n\t\tlabel: i18n.t('i18n.reimport'),\n\t\tenableTest: [assetNotCheckedOut],\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t// ===============\n\t// !REIMPORT\n\t// ===============\n\n\t// ===============\n\t// REPURPOSE\n\t// ===============\n\t/**\n\t * repurpose an asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:repurpose:asset',\n\t\tlabel: i18n.t('i18n.repurpose'),\n\t\tenableTest: assetCanRepurpose,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.attributes, e];\n\t\t},\n\t},\n\t// ===============\n\t// !REPURPOSE\n\t// ===============\n\n\t/** @action */\n\t{\n\t\tevent: 'asset:requests',\n\t\tlabel: i18n.t('i18n.uploadRequests'),\n\t\tenableTest: assetRequestsEnabled,\n\t\tuserLevel: 5,\n\t},\n\t/**\n\t * Route to category asset requests\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:requests:route',\n\t\tlabel: i18n.t('i18n.uploadRequests'),\n\t\tenableTest: [assetRequestsEnabled, notMobile],\n\t\troute: 'assets/requests',\n\t\tuserLevel: 5,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'asset:request:delete',\n\t\tlabel: i18n.t('i18n.deleteUploadRequest'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'asset:request:edit',\n\t\tlabel: i18n.t('i18n.editUploadRequest'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'asset:request:new',\n\t\tlabel: i18n.t('i18n.addUploadRequest'),\n\t},\n\n\t// ===============\n\t// RESYNC\n\t// ===============\n\t/**\n\t * resync an asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:resync',\n\t\tlabel: i18n.t('i18n.resync'),\n\t\tenableTest: assetIsPresent,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.attributes, e];\n\t\t},\n\t},\n\t// ===============\n\t// !RESYNC\n\t// ===============\n\n\t// ===============\n\t// SELECTION\n\t// ===============\n\t/**\n\t * select an asset; that is, add its model to Netx.cart.current.\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:selection:add',\n\t\tlabel: i18n.t('i18n.addThisAssetToSelection'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * de-select an asset (remove from Netx.cart.current)\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:selection:remove',\n\t\tlabel: i18n.t('i18n.removeThisAssetFromSelection'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * clear current asset selection (reset Netx.cart.current)\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:selection:empty',\n\t\tlabel: 'reset the selection',\n\t},\n\t/**\n\t * Select the currently routed assets (single asset, cart, category, or search)\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:selection:selectRoutedAssets',\n\t\t// A label for this is hard because it might refer to any of those four concepts.\n\t\t// TODO: enabler that checks the current route to make sure it's something we can parse\n\t},\n\t// ===============\n\t// !SELECTION\n\t// ===============\n\n\t// ===============\n\t// TAG PANEL\n\t// ===============\n\t/**\n\t * Open grid editor\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:tagPanel:grid',\n\t\tlabel: i18n.t('i18n.editAttributes'),\n\t\tenableTest: canUseGridEditor,\n\t\tuserLevel: 4,\n\t},\n\t/**\n\t * Route to and open grid editor\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:tagPanel:grid:route',\n\t\tlabel: i18n.t('i18n.editAttributes'),\n\t\tenableTest: canUseGridEditor,\n\t\troute: 'assets/grideditor',\n\t\tuserLevel: 4,\n\t},\n\t/**\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:tagPanel:grid:toggle:column',\n\t\tlabel: i18n.t('i18n.toggleColumn'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t// ===============\n\t// !TAG PANEL\n\t// ===============\n\n\t// ===============\n\t// VERSIONS\n\t// ===============\n\t/**\n\t * Delete a version\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:versions:delete',\n\t\tlabel: i18n.t('i18n.deleteVersion'),\n\t\tenableTest: canManageVersions,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * Download a version\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:version:download',\n\t\tlabel: i18n.t('i18n.downloadVersion'),\n\t\tenableTest: canDownloadVersion,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * Reactivate a version\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:versions:reactivate',\n\t\tlabel: i18n.t('i18n.reactivateVersion'),\n\t\tenableTest: canManageVersions,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t// ===============\n\t// !VERSIONS\n\t// ===============\n\n\t// ===============\n\t// VIEWS\n\t// ===============\n\t/**\n\t * Add a view to an asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:views:add',\n\t\tlabel: i18n.t('i18n.addView'),\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t},\n\t/**\n\t * Delete an asset view\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:views:delete',\n\t\tlabel: i18n.t('i18n.deleteView'),\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Download an asset view\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:views:download',\n\t\tlabel: i18n.t('i18n.downloadView'),\n\t\tmatrix: 'download',\n\t\tuserLevel: 2,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Edit a view on an asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:views:edit',\n\t\tlabel: i18n.t('i18n.editView'),\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Remove view file from queue\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:views:remove:file',\n\t\tlabel: i18n.t('i18n.removeFile'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.id, e];\n\t\t},\n\t},\n\t// ===============\n\t// !VIEWS\n\t// ===============\n\n\t/**\n\t * Route to zoom\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:zoom:route',\n\t\tlabel: i18n.t('i18n.zoom'),\n\t\tenableTest: canZoomAsset,\n\t\ttestOnSync: true,\n\t\tuserLevel: 1,\n\t\troute(m) {\n\t\t\treturn `asset/${m.id}/zoom`;\n\t\t},\n\t\twrapper(v, e) {\n\t\t\treturn [v.model, v, e];\n\t\t},\n\t},\n];\n","import actions from '@netx/core-asset/actions';\nimport {extendActions} from '@netx/core/lib/underscore-netx';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {\n\tfaDownload,\n\tfaPencilAlt,\n\tfaPlus,\n\tfaSignInAlt,\n\tfaSignOutAlt,\n\tfaTimes,\n\tfaTrashAlt,\n} from '@fortawesome/pro-solid-svg-icons';\nimport {\n\tfaCalendarMinus,\n\tfaCalendarPlus,\n\tfaClock,\n} from '@fortawesome/pro-regular-svg-icons';\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaDownload: icon(faDownload, iconOpts).html,\n\tfaPencilAlt: icon(faPencilAlt, iconOpts).html,\n\tfaPlus: icon(faPlus, iconOpts).html,\n\tfaSignInAlt: icon(faSignInAlt, iconOpts).html,\n\tfaSignOutAlt: icon(faSignOutAlt, iconOpts).html,\n\tfaTimes: icon(faTimes, iconOpts).html,\n\tfaTrashAlt: icon(faTrashAlt, iconOpts).html,\n\tfaCalendarMinus: icon(faCalendarMinus, iconOpts).html,\n\tfaCalendarPlus: icon(faCalendarPlus, iconOpts).html,\n\tfaClock: icon(faClock, iconOpts).html,\n};\n\n// Extend actions defined in core file\nlet newActions = extendActions(actions, [\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:category:add',\n\t\tlabel: i18n.t('i18n.addAssetCategory'),\n\t\ticon: icons.faPlus,\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:category:edit',\n\t\tlabel: i18n.t('i18n.editAssetCategory'),\n\t\ticon: icons.faPencilAlt,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.get('asset'), view.model, view, e];\n\t\t},\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:category:remove',\n\t\ticon: icons.faTrashAlt,\n\t\tlabel: i18n.t('i18n.removeFromCategory'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.get('asset'), view.model.get('categoryid')];\n\t\t},\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:checkin',\n\t\ticon: icons.faSignInAlt,\n\t\tlabel: i18n.t('i18n.checkInNewVersion'),\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:checkout',\n\t\ticon: icons.faSignOutAlt,\n\t\tlabel: i18n.t('i18n.checkOutCurrentVersion'),\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:checkout:cancel',\n\t\ticon: icons.faTimes,\n\t},\n\t/**\n\t * Route to the document viewer\n\t * @action\n\t */\n\t{\n\t\tevent: 'asset:docview:route',\n\t\tuserLevel: 1,\n\t\tdisabledClass: 'hide',\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:expire',\n\t\ticon: icons.faCalendarPlus,\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:unexpire',\n\t\ticon: icons.faCalendarMinus,\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:views:delete',\n\t\tlabel: i18n.t('i18n.deleteView'),\n\t\ticon: icons.faTrashAlt,\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:views:download',\n\t\tlabel: i18n.t('i18n.download'),\n\t\ticon: icons.faDownload,\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'asset:views:edit',\n\t\tlabel: i18n.t('i18n.edit'),\n\t\ticon: icons.faPencilAlt,\n\t},\n]);\n\n// New actions\nnewActions = newActions.concat([\n\t/** @action */\n\t{\n\t\tevent: 'asset:export:info',\n\t\tlabel: i18n.t('i18n.exportInfo'),\n\t},\n]);\n\nexport default newActions;\n","import Menu from '@netx/core/lib/netx-menu';\n\nexport default {\n\t/**\n\t * Context menu for a single miniAsset\n\t */\n\tassetContextMenu: new Menu({\n\t\tactions: [\n\t\t\t'asset:delete',\n\t\t\t'asset:resync',\n\t\t\t'cart:add',\n\t\t\t'cart:remove',\n\t\t\t'share:asset:download',\n\t\t\t'share:asset:menu',\n\t\t],\n\t}),\n\t/**\n\t * operations for asset expiration\n\t */\n\tassetExpirationActions: new Menu({\n\t\tlabel: i18n.t('i18n.assetExpiration'),\n\t\tactions: ['asset:expire', 'asset:unexpire'],\n\t}),\n\t/**\n\t * operations on a group of assets in the Gallery\n\t */\n\tassetList: new Menu({\n\t\tactions: [\n\t\t\t'share:asset:createPDF',\n\t\t\t'cart:addPage',\n\t\t\t//'upload:import:show',\n\t\t\t'cart:addAll',\n\t\t],\n\t}),\n\t/**\n\t * tabs in the asset detail view\n\t */\n\tassetTabs: new Menu({\n\t\tactions: [\n\t\t\t'asset:detail:fileinfo',\n\t\t\t'asset:detail:attributes',\n\t\t\t'asset:detail:views',\n\t\t\t'asset:detail:links',\n\t\t\t'asset:detail:categories',\n\t\t\t'asset:detail:pages',\n\t\t\t'asset:detail:times',\n\t\t\t'asset:detail:layers',\n\t\t\t'asset:detail:versions',\n\t\t\t'asset:detail:permissions',\n\t\t\t'asset:detail:metadata',\n\t\t\t'asset:detail:index',\n\t\t],\n\t}),\n\t/**\n\t * Operations on asset views. These all assume Netx.asset.current.views.selectedView is set to the selected view\n\t */\n\tassetViews: new Menu({\n\t\tactions: ['asset:views:download'],\n\t}),\n};\n","import menus from '@netx/core-asset/menus';\nimport Menu from '@netx/core/lib/netx-menu';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {faEllipsisV} from '@fortawesome/pro-solid-svg-icons';\nconst icons = {\n\tfaEllipsisV: icon(faEllipsisV).html,\n};\n\n// Override asset context menu\nmenus.assetContextMenu = new Menu({\n\tactions: [\n\t\t'cart:add',\n\t\t'cart:remove',\n\t\t'share:asset:download',\n\t\t'asset:share:menu',\n\t],\n});\nmenus.assetDetail = new Menu({\n\tactions: [\n\t\t'share:asset:createPDF',\n\t\t'cart:add',\n\t\t'cart:remove',\n\t\t'share:asset:download',\n\t\t'asset:share:menu',\n\t],\n});\n\n// New menus\n_.extend(menus, {\n\t/**\n\t * Asset actions menu\n\t * @menu\n\t */\n\tassetActions: new Menu({\n\t\tactions: [\n\t\t\t'share:asset:download',\n\t\t\t'cart:toggle',\n\t\t\t'share:asset:menu',\n\t\t\tnew Menu({\n\t\t\t\ticon: icons.faEllipsisV,\n\t\t\t\tactions: [\n\t\t\t\t\t'asset:customThumbnail:select',\n\t\t\t\t\t'share:asset:createPDF',\n\t\t\t\t\t'asset:resync',\n\t\t\t\t\t'asset:reimport',\n\t\t\t\t\t'asset:repurpose',\n\t\t\t\t\t'asset:delete',\n\t\t\t\t\t'asset:checkin',\n\t\t\t\t\t'asset:checkout',\n\t\t\t\t\t'asset:manage:expire',\n\t\t\t\t],\n\t\t\t}),\n\t\t],\n\t}),\n\t/**\n\t * Asset context menu (when in selection)\n\t * @menu\n\t */\n\tassetSelectionContextMenu: new Menu({\n\t\tactions: [\n\t\t\t'cart:saved:removeAssets',\n\t\t\t'share:asset:download',\n\t\t\t'cart:remove',\n\t\t\t'asset:share:menu',\n\t\t],\n\t}),\n\t/**\n\t * Asset context menu (when in collection)\n\t * @menu\n\t */\n\tassetSavedCollectionContextMenu: new Menu({\n\t\tactions: [\n\t\t\t'cart:add',\n\t\t\t'savedCart:remove',\n\t\t\t'share:cart:download',\n\t\t\t'share:menu',\n\t\t\t'cart:saved:manage:assets:expire',\n\t\t\t['asset:delete'],\n\t\t\t['share:cart:createPDF', 'asset:resync'],\n\t\t],\n\t}),\n\t/**\n\t * Asset category actions menu\n\t * @menu\n\t */\n\tassetCategoryActions: new Menu({\n\t\tactions: ['asset:category:edit', 'asset:category:remove'],\n\t}),\n\t/**\n\t * Asset category actions menu\n\t * @menu\n\t */\n\tassetConstituentClipActions: new Menu({\n\t\tactions: [\n\t\t\t['asset:constituent:route:asset'],\n\t\t\t'asset:constituent:clip:download',\n\t\t\t'asset:constituent:clip:edit',\n\t\t],\n\t}),\n\t/**\n\t * Asset list attribute display menu\n\t * @menu\n\t */\n\tassetListColumnContextMenu: new Menu({\n\t\tactions: ['share:asset:download', 'cart:add', 'cart:remove', 'share:menu'],\n\t}),\n\t/**\n\t * Asset view table row menu\n\t * @menu\n\t */\n\tassetViewActions: new Menu({\n\t\tactions: ['asset:views:download', 'asset:views:edit', 'asset:views:delete'],\n\t}),\n\t/**\n\t * Asset permission actions menu\n\t * @menu\n\t */\n\tpermissionAssetActions: new Menu({\n\t\tactions: ['permissions:asset:edit', 'permissions:asset:delete'],\n\t}),\n});\n\nexport default menus;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport AssetRequestAttributesCollection from '../collections/assetRequestAttributes';\nimport CategoryModel from '@netx/core-category/models/category';\n\nimport {isEmptyValue} from '@netx/core/lib/underscore-netx';\n\nexport default class AssetRequest extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * The unique ID for this model\n\t * @type {string}\n\t */\n\tget idAttribute() {\n\t\treturn 'requestId';\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {number} defaults.requestId - ID\n\t * @property {array} defaults.attributeCaptions - An array of customn captions for selected attributes\n\t * @property {array} defaults.attributeLabels - An array of custom labels for selected attributes\n\t * @property {array} defaults.attributeNames - An array of selected attrobute names\n\t * @property {array} defaults.attributePlaceholders - An array of custom placeholders for selected attributes\n\t * @property {array} defaults.attributeRequired - An array of custom requires for selected attributes\n\t * @property {number} defaults.categoryId - The id of the category where the assets will be uploaded\n\t * @property {string} defaults.categoryName - The name of the category where the assets will be uploaded\n\t * @property {string} defaults.categoryPath - The path of the category where the assets will be uploaded\n\t * @property {string} defaults.creationDate - Asset request creation date (as string)\n\t * @property {number} defaults.notifyId - The id of user/group that will be notified when upload has completed\n\t * @property {string} defaults.notifyLabel - The label of user/group that will be notified when upload has completed\n\t * @property {number} defaults.notifyType - The notify type ( 0 - none, 1 - user, 2 - group )\n\t * @property {string} defaults.token - Token string\n\t * @property {string} defaults.url - URL (endpoint)\n\t * @property {number} defaults.userId - The id of the user who created the asset request\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t// requestId: 0,\n\t\t\tattributeCaptions: [],\n\t\t\tattributeLabels: [],\n\t\t\tattributeNames: [],\n\t\t\tattributePlaceholders: [],\n\t\t\tattributeRequired: [],\n\t\t\tcategoryId: 0,\n\t\t\tcategoryName: '',\n\t\t\tcategoryPath: '',\n\t\t\tcreationDate: '',\n\t\t\tnotifyId: 0,\n\t\t\tnotifyLabel: '',\n\t\t\tnotifyType: 0,\n\t\t\ttoken: '',\n\t\t\turl: '',\n\t\t\tuserId: 0,\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - The methods available on this model\n\t * @property {method} methods.create - Create new asset request\n\t * @property {method} methods._fetch - Fetch asset request without setting any data (see create/update)\n\t * @property {method} methods.read - Fetch asset request\n\t * @property {method} methods.remove - Destroy asset request\n\t * @property {method} methods.update - Update asset request\n\t * @property {method} methods.getAssetRequest - Fetch single asset request record (used in tandem with or read method)\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\t// TODO: need the server to return full beans on create\n\t\t\tcreate(opts) {\n\t\t\t\treturn this.setAssetRequest(opts).then(response => {\n\t\t\t\t\tthis.set({requestId: response.id}, opts);\n\t\t\t\t\treturn this.fetch(opts);\n\t\t\t\t});\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn this.getAssetRequest(opts).then(data => {\n\t\t\t\t\treturn this.parseAttributes(data);\n\t\t\t\t});\n\t\t\t},\n\t\t\t/** @method */\n\t\t\tremove: ['deleteAssetRequest', 'requestId'],\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\t// TODO: need the server to return full beans on update\n\t\t\tupdate(opts) {\n\t\t\t\treturn this.setAssetRequest(opts).then(response => {\n\t\t\t\t\treturn this.fetch(opts);\n\t\t\t\t});\n\t\t\t},\n\t\t\t/** @method */\n\t\t\tgetAssetRequest: ['getAssetRequest', 'requestId'],\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tsetAssetRequest(opts) {\n\t\t\t\treturn ['setAssetRequest', this.self()];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Send an email message containing a link to this token.\n\t\t\t * @method\n\t\t\t * @param {object} emailOpts Email options (as sent by email form) -- .emailTo (address/addresses) is required, .emailNotes (message) is optional\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tmail(emailOpts = {}, opts = {}) {\n\t\t\t\temailOpts = emailOpts || {};\n\n\t\t\t\tconst notes = emailOpts.emailNotes || '';\n\n\t\t\t\t// Assert we have a to: address\n\t\t\t\tlet to = emailOpts.emailTo;\n\t\t\t\tif (!to) {\n\t\t\t\t\tthrow new Error(\"Can't send email to null address\");\n\t\t\t\t}\n\n\t\t\t\tif (!_.isArray(to)) {\n\t\t\t\t\t// Divide multiple addrs & make this an array.\n\t\t\t\t\t// DEVNOTE: the API requires this I guess, but really it's the MTA's job to un-splice commas.\n\t\t\t\t\t// (Because valid addrs can contain comments, which can contain commas.)\n\t\t\t\t\t// http://stackoverflow.com/questions/566396/validate-multiple-emails-comma-separated-with-javascript\n\t\t\t\t\t// (Or if you haven't eaten recently: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html)\n\t\t\t\t\t//\n\t\t\t\t\t// TODO: Use a nice custom form field for entering emails,\n\t\t\t\t\t// one that keeps them split up & gives us an array of them here\n\t\t\t\t\t// instead of joining them with commas.\n\t\t\t\t\tto = to.split(',');\n\t\t\t\t}\n\n\t\t\t\t// Convert that array into the API's desired user-selecting object, which looks like this:\n\t\t\t\t// {\n\t\t\t\t// userIds: [ // array of uids (isNumeric) ],\n\t\t\t\t// groupId: [ // array of gids (isNumeric) ],\n\t\t\t\t// emails: [ // array of addresses (isString) ]\n\t\t\t\t// }\n\t\t\t\tto = {\n\t\t\t\t\tuserIds: [],\n\t\t\t\t\tgroupIds: [],\n\t\t\t\t\temails: to,\n\t\t\t\t};\n\n\t\t\t\t// Send the message:\n\t\t\t\treturn ['shareTokenWithRecipients', this.get('token'), to, notes];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * So we can utilize the child system in setListView\n\t\t * @memberof module:asset/models/assetRequest\n\t\t * @alias attributesSelected\n\t\t * @type {Netx.Coillections.AssetRequestAttributes}\n\t\t */\n\t\tthis.attributesSelected = new AssetRequestAttributesCollection([]);\n\n\t\tif (this.id) {\n\t\t\tthis.parseAttributes(this.attributes);\n\t\t}\n\t}\n\t/**\n\t * @method\n\t * @param {object} data Model attributes - passed from constructor or sync\n\t */\n\tparseAttributes(data) {\n\t\tconst selectedAttributes = [];\n\t\tconst assetAttributes = Netx.getAttributesByObjectType('asset');\n\n\t\tconst {\n\t\t\tattributes,\n\t\t\tattributeCaptions,\n\t\t\tattributeLabels,\n\t\t\tattributeNames,\n\t\t\tattributePlaceholders,\n\t\t\tattributeRequired,\n\t\t} = data;\n\n\t\t// Once fetched- parse out our parallel arrays into seperate models\n\t\tattributeNames.forEach((attrName, idx) => {\n\t\t\tconst attr = assetAttributes.findWhere({name: attrName});\n\t\t\tif (!attr) return;\n\n\t\t\tselectedAttributes.push({\n\t\t\t\t...attr.attributes,\n\t\t\t\tcaption: attributeCaptions[idx],\n\t\t\t\tlabel: attributeLabels[idx],\n\t\t\t\tplaceholder: attributePlaceholders[idx],\n\t\t\t\trequired: attributeRequired[idx],\n\t\t\t});\n\t\t});\n\n\t\tthis.attributesSelected.set(selectedAttributes);\n\n\t\t// TODO: The DAM is not emptying this for us\n\t\tif (!data.notifyType) {\n\t\t\tdata.notifyLabel = '';\n\t\t}\n\n\t\treturn data;\n\t}\n\t/**\n\t * @method\n\t * @param {object} data Data to save\n\t * @param {object} opts Request options\n\t */\n\tparseAndSave(data, opts) {\n\t\t// Set our notifyId depending on notifyType\n\t\tif (data.notifyType) {\n\t\t\tdata.notifyId = data[`notifyId-${data.notifyType}`];\n\t\t}\n\n\t\t// Loop over selected attributes\n\t\tconst attributesSelected = [];\n\t\tconst assetAttributes = Netx.getAttributesByObjectType('asset');\n\n\t\tconst attrIds = Object.values(\n\t\t\tdata['asset-request-attributes-item'] || {},\n\t\t).map(Number);\n\n\t\tconst attributeCaptions = data.attributeCaptions || [];\n\t\tconst attributeLabels = data.attributeLabels || [];\n\t\tconst attributePlaceholders = data.attributePlaceholders || [];\n\t\tconst attributeRequired = data.attributeRequired || [];\n\n\t\tattrIds.forEach((id, idx) => {\n\t\t\tconst attr = assetAttributes.get(id);\n\t\t\tattr &&\n\t\t\t\tattributesSelected.push({\n\t\t\t\t\t...attr.attributes,\n\t\t\t\t\tcaption: !isEmptyValue(attributeCaptions[id])\n\t\t\t\t\t\t? attributeCaptions[id]\n\t\t\t\t\t\t: '',\n\t\t\t\t\tlabel: !isEmptyValue(attributeLabels[id]) ? attributeLabels[id] : '',\n\t\t\t\t\tplaceholder: !isEmptyValue(attributePlaceholders[id])\n\t\t\t\t\t\t? attributePlaceholders[id]\n\t\t\t\t\t\t: '',\n\t\t\t\t\trequired: attributeRequired[id] || false,\n\t\t\t\t});\n\t\t});\n\n\t\t// Setup our asset request data\n\t\tconst assetRequestData = {\n\t\t\t..._.mapObject(_.pick(data, 'notifyId', 'notifyType', 'categoryId'), d =>\n\t\t\t\tparseInt(d),\n\t\t\t),\n\t\t\tselected: attributesSelected,\n\t\t};\n\n\t\t// Update our selected collection\n\t\tthis.attributesSelected.set(assetRequestData.selected || []);\n\n\t\t// If notify type is not set or is an invalid number, turn notification off\n\t\tif (!assetRequestData.notifyType || isNaN(assetRequestData.notifyType)) {\n\t\t\tObject.assign(assetRequestData, {\n\t\t\t\tnotifyId: 0,\n\t\t\t\tnotifyType: 0,\n\t\t\t});\n\t\t}\n\n\t\t// If this is a new request, set the creating user's id\n\t\tif (this.isNew()) {\n\t\t\tthis.attributes.userId = Netx.getUser().id;\n\t\t}\n\n\t\t// Save\n\t\treturn this.save(\n\t\t\t{\n\t\t\t\t..._.omit(assetRequestData, 'selected'),\n\t\t\t\t...this.attributesSelected.getParallelArrays(),\n\t\t\t},\n\t\t\t{wait: true, ...opts},\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetRequest';\n\t}\n}\n","/**\n * AssetView model\n * @class\n * @todo Document defaults, methods and parsers\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class AssetView extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'viewId';\n\t}\n\n\t/** @type {object} */\n\tget defaults() {\n\t\treturn {\n\t\t\t// DAM internal IDs\n\t\t\t//viewId: 0,\n\t\t\timageId: 0, // aka assetId\n\t\t\tautoTaskId: 0, // (seems like it is assetId as well)\n\t\t\t// description\n\t\t\tname: '',\n\t\t\tdescription: '',\n\t\t\tcreationDate: '',\n\t\t\tthumb: '', // URL to preview image\n\t\t\t// file properties\n\t\t\tfileHeight: 0,\n\t\t\tfileWidth: 0,\n\t\t\tfileSize: 0,\n\t\t\tfileSizeLabel: '', // such as '2.4 MB'\n\t\t\tfileTypeId: 0,\n\t\t\tfileTypeLabel: '', // 'jpg', 'pdf', etc\n\t\t\t// metadata\n\t\t\tviewMetadataLabels: [],\n\t\t\tviewMetadataValues: [],\n\t\t};\n\t}\n\n\t/** @rpc */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate(opts) {\n\t\t\t\treturn ['setViewData', this.self(), this.file ? this.file.name : null];\n\t\t\t},\n\t\t\t/** @method */\n\t\t\tread: ['getViewObjectsForAsset', 'imageId'],\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdate(file, opts) {\n\t\t\t\treturn ['setViewData', this.self(), this.file ? this.file.name : null];\n\t\t\t},\n\t\t\t/** @method */\n\t\t\tremove: ['deleteView', 'viewId'],\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * Pick this one view's data out of the results of getViewObjectsForAsset\n\t\t\t * @function\n\t\t\t * @param {mixed} result Result\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(result, opts) {\n\t\t\t\tif (_.isArray(result)) {\n\t\t\t\t\treturn _.findWhere(result, {viewId: this.id});\n\t\t\t\t}\n\n\t\t\t\tif (_.isNumber(result)) {\n\t\t\t\t\treturn {viewId: result};\n\t\t\t\t}\n\n\t\t\t\t// will never happen unless the API suddenly changes ...\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {number} id ID\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate(id, opts) {\n\t\t\t\treturn {viewId: id};\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * Optional pointer to the relevant asset model\n\t\t * @memberof module:asset/models/assetView\n\t\t * @alias asset\n\t\t * @type {module:asset/models/asset}\n\t\t */\n\t\tthis.asset = opts.asset || undefined;\n\n\t\t/**\n\t\t * @memberof module:asset/models/assetView\n\t\t * @alias file\n\t\t * @type {object}\n\t\t */\n\t\tthis.file = opts.file || undefined;\n\t}\n\n\t/**\n\t * Attempt to check permission against this view's asset. This is necessary because\n\t * the view model does not have its own matrix, so it needs to refer back to an asset.\n\t * The asset may not exist or be findable, in which case we'll return 'true'\n\t * @param {string} matrixBit One of the matrix bit names from permission/properties/assetPermissions#matrixNames\n\t * @return {boolean}\n\t */\n\tallows(matrixBit) {\n\t\tif (this.asset && this.asset.id == this.get('imageId')) {\n\t\t\treturn this.asset.allows(matrixBit);\n\t\t}\n\n\t\tif (\n\t\t\tNetx.asset &&\n\t\t\tNetx.asset.current &&\n\t\t\tNetx.asset.current.id == this.get('imageId')\n\t\t) {\n\t\t\treturn Netx.asset.current.allows(matrixBit);\n\t\t}\n\n\t\tconsole.warn('could not find asset for view matrix permission test');\n\t\treturn true;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetView';\n\t}\n}\n","/**\n * AssetIndex -- represents a set of search keys generated by the DAM for an asset\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '@netx/core-app/models/labelValue';\n\nexport default class AssetIndex extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch asset indices\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @method */\n\t\t\tread: ['getIndexRecord', 'assetId'],\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Set the assetId property before fetching to select an individual asset's keys\n\t\t * @type {number}\n\t\t */\n\t\tthis.assetId = opts.assetId || undefined;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetIndex';\n\t}\n}\n","/**\n * One point of embedded metadata, having schema, name and value.\n * @class\n */\n\n// The big question: Metadata or Metadatum? Here's some links that don't help:\n//\n// http://www.theguardian.com/news/datablog/2010/jul/16/data-plural-singular\n// http://blogs.wsj.com/economics/2012/07/05/is-data-is-or-is-data-aint-a-plural/\n// http://www.motherjones.com/kevin-drum/2012/07/more-data-please\n// https://public.wsu.edu/~brians/errors/data.html\n//\n// In truth, we are going to need different names for the set and the unit, or else there could be\n// complications with the Netx.Views namespace. Therefore:\n\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class AssetMetadatum extends Base {\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {string} defaults.schema - Schema of metadata, named by a string: 'exif', 'dc', etc.\n\t * @property {number} defaults.name - Name of data\n\t * @property {boolean} defaults.value - Value of data\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\tschema: '',\n\t\t\tname: '',\n\t\t\tvalue: '',\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetMetadatum';\n\t}\n}\n","/**\n * AssetMetadata -- represents a set of embedded metadata (XMP, etc) fields extracted from an asset by the DAM\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetMetadatum';\n\nimport {map as syncMap} from '../properties/assetAttributesMetadata';\n\nexport default class AssetMetadata extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetAssetMetadata: 'Loading embedded metadata',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetAssetMetadata: 'Loaded embedded metadata',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch asset metadata\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @method */\n\t\t\tread: ['getAssetMetadata', 'assetId'],\n\t\t};\n\t}\n\n\t/**\n\t * @function\n\t * @param {array} results Results\n\t * @param {object} opts Request options\n\t */\n\tparse(results, opts) {\n\t\treturn _.map(results, this.lvbToMetadata);\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Set the assetId property before fetching to select an individual asset's metadata\n\t\t * @type {number}\n\t\t */\n\t\tthis.assetId = opts.assetId || undefined;\n\t}\n\n\t/**\n\t * Convert a label/value beans from our API fetch call to\n\t * a set of attributes for a Metadata model\n\t * @method\n\t * @param {object} lvb Label value bean\n\t * @return {object} Metadata\n\t */\n\tlvbToMetadata(lvb) {\n\t\tlet name, schema;\n\n\t\tconst split = lvb.label.match(/^(.+):(.+)/);\n\t\tif (!split) {\n\t\t\tschema = ''; // should not happen!\n\t\t\tname = lvb.label;\n\t\t} else {\n\t\t\tschema = split[1];\n\t\t\tname = split[2];\n\t\t}\n\t\treturn {\n\t\t\tschema: syncMap[schema] || schema,\n\t\t\tname: name,\n\t\t\tvalue: lvb.value,\n\t\t};\n\t}\n\n\t/**\n\t * Convert this collection to a structured object, where the top-level\n\t * property names are the schema names.\n\t * @method\n\t * @return {object} Object\n\t */\n\ttoObject() {\n\t\tconst theObj = {};\n\t\tthis.each((model) => {\n\t\t\tconst schema = model.get('schema');\n\t\t\ttheObj[schema] = theObj[schema] || {};\n\t\t\ttheObj[schema][model.get('name')] = model.get('value');\n\t\t});\n\t\treturn theObj;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetMetadata';\n\t}\n}\n","/**\n * Asset permisions collection\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetPermission';\n\nexport default class AssetPermissions extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {array} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetAcls: 'Loading permissions',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetAcls: 'Loaded permissions',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this collection\n\t * @property {method} methods.read - Fetch asset permissions\n\t * @property {method} methods.fetchAll - Fetch all permissions\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn ['getAcls', 2, this.target.id];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchAll(opts) {\n\t\t\t\treturn ['getAcls', 0, 0];\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.comparator = opts.comparator || 'position';\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * @memberof module:asset/models/assetPermission\n\t\t * @alias target\n\t\t * @type {module:asset/models/asset|Netx.Models.Category}\n\t\t */\n\t\tthis.target = opts.target || undefined;\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} ids Model ids to delete\n\t */\n\tdeletePermissions(ids) {\n\t\treturn this.deleteMultiple.apply(this, arguments);\n\t}\n\n\t/**\n\t * @method\n\t * @param {module:asset/models/assetPermission} perm Permission\n\t * @param {number} position Position\n\t * @param {object} opts Options\n\t */\n\tsetPosition(perm, position, opts) {\n\t\tconst currentPosition = perm.get('position');\n\t\t// No change\n\t\tif (currentPosition === position) {\n\t\t\treturn new $.Deferred().resolve();\n\t\t}\n\n\t\t// This is ugly, but beats refetching the whole damn thing\n\t\tconst newPositionData = _.compact(\n\t\t\tthis.map((model) => {\n\t\t\t\t// Already being taken care of\n\t\t\t\tif (model === perm) return;\n\n\t\t\t\tlet myPos = model.get('position');\n\n\t\t\t\t// We came after the item being repositioned\n\t\t\t\t// and we are now before the new position\n\t\t\t\tif (myPos > currentPosition && myPos <= position) {\n\t\t\t\t\tmyPos--;\n\t\t\t\t}\n\t\t\t\t// We came before the item being repositioned\n\t\t\t\t// and we are now after the new position\n\t\t\t\telse if (myPos < currentPosition && myPos >= position) {\n\t\t\t\t\tmyPos++;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tentryId: model.id,\n\t\t\t\t\tposition: myPos,\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\treturn perm.save({position: position}, opts).then(\n\t\t\t() => {\n\t\t\t\t// Update the `position`s\n\t\t\t\tthis.set(newPositionData, {\n\t\t\t\t\tadd: false,\n\t\t\t\t\tmerge: true,\n\t\t\t\t\tremove: false,\n\t\t\t\t});\n\n\t\t\t\treturn this.fetch();\n\t\t\t},\n\t\t\t() => {\n\t\t\t\t// Re-sort to get the models back to the right position/order\n\t\t\t\tthis.sort();\n\t\t\t},\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetPermissions';\n\t}\n}\n","/**\n * @class\n * @extends Netx.Model\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class AssetUsage extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * The unique ID for this model\n\t * @type {string}\n\t */\n\tget idAttribute() {\n\t\treturn 'date';\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {string} defaults.date - Date of usage\n\t * @property {string} defaults.details - Details about usage\n\t * @property {string} defaults.domain - Domain of usage\n\t * @property {string} defaults.item - Some item\n\t * @property {string} defaults.user - Username of accessor\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\tdate: '',\n\t\t\tdetails: '',\n\t\t\tdomain: '',\n\t\t\titem: '',\n\t\t\tuser: '',\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetUsage';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetUsage';\n\nexport default class AssetUsage extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch asset usage data\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @method */\n\t\t\tread: ['getAssetStatData', 'assetId'],\n\t\t};\n\t}\n\t/**\n\t * @property {object} parsers - Parsers for this model\n\t * @property {method} parsers.getAssetStatData \t- Parse response for i18n\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t...super.parsers,\n\t\t\tread: function (dataArr, opts) {\n\t\t\t\t// any item returned with 'i18n.' needs translating\n\t\t\t\treturn dataArr.map((usageOb, idx, all) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof usageOb.item === 'string' &&\n\t\t\t\t\t\tusageOb.item.startsWith('i18n.')\n\t\t\t\t\t) {\n\t\t\t\t\t\tusageOb.item = i18n.t(usageOb.item);\n\t\t\t\t\t}\n\t\t\t\t\treturn usageOb;\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Set the assetId property before fetching to select an individual asset's keys.\n\t\t * @type {number}\n\t\t * @default\n\t\t */\n\t\tthis.assetId = opts.assetId || undefined;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetUsage';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetVersion';\n\nexport default class AssetVersions extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @property {object} methods - Model RPC methods\n\t * @property {array} methods.read - Fetch versions\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @method */\n\t\t\tread(opts) {\n\t\t\t\treturn ['getVersionObjectsForAsset', this.assetId];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * The DAM always sorts these by create-date, newest first; so we'll do the same with any client-side additions.\n\t * @method\n\t * @param {object} a Version a\n\t * @param {object} b Version b\n\t * @return {number}\n\t */\n\t// NOTE: we can't just set comparitor to 'creationDate' because it sorts backwards. Is there an easier way than this?\n\tcomparator(a, b) {\n\t\treturn a.get('creationDate') < b.get('creationDate') ? 1 : -1;\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * The id of the asset we are fetching version for\n\t\t * @type {number}\n\t\t * @default\n\t\t */\n\t\tthis.assetId = opts.assetId || 0;\n\t}\n\n\t/**\n\t * Get the asset version that is currently active.\n\t * @method\n\t * @return {module:asset/models/assetVersion}\n\t */\n\tcurrent() {\n\t\treturn this.findWhere({original: 1});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetVersions';\n\t}\n}\n","/**\n * Netx.Collections.AssetViews fetches a set of module:asset/models/assetView objects for a given\n * asset from the DAM.\n * @class\n * @extends Netx.Collection\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetView';\nimport UploadModel from '@netx/core-upload/models/upload';\n\nimport customConfig from '../config';\n\nexport default class AssetViews extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetViewObjectsForAsset: 'Loading views',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetViewObjectsForAsset: 'Loaded views',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch asset views\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\tread: ['getViewObjectsForAsset', 'assetId'],\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/** @type {number} */\n\t\tthis.assetId = opts.assetId || undefined;\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'upload:asset:view:success',\n\t\t\t(upload, assetView) => {\n\t\t\t\tif (assetView.get('imageId') === this.assetId) {\n\t\t\t\t\tthis.add(assetView, {merge: true});\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetViews';\n\t}\n}\n","/**\n * A collection tailored for the grid viewer\n * This collection does not use models as it creates a lot of overhead for the data to be displayed\n * All data is stored in an array `this.data`\n * In order to maintain a pure copy use `this.getJSON` for setting data on hypergrid\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\n\nimport CoreView from '@netx/core/lib/netx-view';\nimport ProgressModel from '@netx/core-app/models/progress';\n\nimport {isEmptyValue} from '@netx/core/lib/underscore-netx';\n\nconst round = Math.round;\n\nexport default class Grid extends Base {\n\t/**\n\t * When loading data\n\t * @type {i18n}\n\t */\n\tget loadingMessage() {\n\t\treturn i18n.t('i18n.gridEditorLoadingData');\n\t}\n\n\t/**\n\t * @property {object} parsers - Parsers for this collection\n\t * @property {function} parsers.read - Read parser\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} results Results\n\t\t\t * @param {object} opts Request options\n\t\t\t * @return {array} Parsed results\n\t\t\t */\n\t\t\tread(results, opts) {\n\t\t\t\tthis.schema = this.getSchema();\n\t\t\t\treturn _.compact(_.map(results, (result) => this.parseRow(result)));\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Total cell count\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = 0;\n\n\t\t/**\n\t\t * Total field count (columns)\n\t\t * @type {number}\n\t\t */\n\t\tthis.fieldCount = 0;\n\n\t\t/**\n\t\t * @memberof module:grid/collections/grid\n\t\t * @alias columnProperties\n\t\t * @type {array}\n\t\t */\n\t\tthis.columnProperties = [];\n\n\t\t/**\n\t\t * @memberof module:grid/collections/grid\n\t\t * @alias data\n\t\t * @type {array}\n\t\t */\n\t\tthis.data = [];\n\n\t\t/**\n\t\t * @memberof module:grid/collections/grid\n\t\t * @alias editorTypes\n\t\t * @type {array}\n\t\t */\n\t\tthis.editorTypes = [];\n\n\t\t/**\n\t\t * @memberof module:grid/collections/grid\n\t\t * @alias fields\n\t\t * @type {array}\n\t\t */\n\t\tthis.fields = [];\n\n\t\t/**\n\t\t * @memberof module:grid/collections/grid\n\t\t * @alias headers\n\t\t * @type {array}\n\t\t */\n\t\tthis.headers = [];\n\n\t\t/**\n\t\t * @type {string}\n\t\t */\n\t\tthis.primaryColumn = opts.primaryColumn || 'id';\n\n\t\t/**\n\t\t * @memberof module:grid/collections/grid\n\t\t * @alias requiredFields\n\t\t * @type {array}\n\t\t */\n\t\tthis.requiredFields = [];\n\n\t\t/**\n\t\t * @memberof module:grid/collections/grid\n\t\t * @alias progress\n\t\t * @type {module:app/models/progress}\n\t\t */\n\t\tthis.progress = new ProgressModel(null, {delay: 0});\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'request:read', () => {\n\t\t\tthis.progress.update(100, this.loadingMessage);\n\t\t}).listenTo(this, 'sync reset', (collection, data, opts = {}) => {\n\t\t\tthis.progress.complete();\n\n\t\t\t// If it was a chunk we are just updating data (not the schema)\n\t\t\topts.chunk || this.filtering ? this.updateData(data) : this.setData(data);\n\n\t\t\tdelete this.filtering;\n\t\t});\n\t}\n\n\t/**\n\t * Get cell value\n\t * If editing the grid, this would be the current value\n\t * @method\n\t * @param {Hypergrid} grid Grid\n\t * @param {number} x Column index\n\t * @param {number} y Row index\n\t * @return {mixed} Value\n\t */\n\tgetCellValue(grid, x, y) {\n\t\treturn grid.behavior.dataModel.getValue(x, y);\n\t}\n\n\t/**\n\t * Get column from index\n\t * @method\n\t * @param {Hypergrid} grid Grid\n\t * @param {number} x Column index\n\t * @return {Hypergrid.Column} Column\n\t */\n\tgetColumn(grid, x) {\n\t\treturn grid.behavior.getColumn(x);\n\t}\n\n\t/**\n\t * Get column index from field name\n\t * @method\n\t * @param {string} field Field name\n\t * @return {number}\n\t */\n\tgetColumnIndex(field) {\n\t\treturn this.fields.indexOf(field);\n\t}\n\n\t/**\n\t * Get the value for a column\n\t * @method\n\t * @param {Hypergrid} grid Grid\n\t * @param {Hypergrid.Column|number} column Column or column index\n\t * @return {mixed|undefined} Value (If `undefined`, the column has multiple values)\n\t */\n\tgetColumnValue(grid, column) {\n\t\tif (!_.isObject(column)) {\n\t\t\tcolumn = this.getColumn(grid, column);\n\t\t}\n\n\t\tif (!column) return;\n\n\t\tconst gridData = this.getGridData(grid);\n\t\tconst field = column.name;\n\t\tconst columnProps = column.properties;\n\n\t\tlet values;\n\t\t// Just add each asset and corresponding attribute value\n\t\tfor (let i = 0, c = gridData.length, value; i < c; i++) {\n\t\t\tvalue = this.parseOutValue(gridData[i][field], column.name);\n\n\t\t\tif (!Array.isArray(value)) {\n\t\t\t\tvalue = [value];\n\t\t\t}\n\n\t\t\t// Store the first value\n\t\t\tif (values === void 0) {\n\t\t\t\tvalues = value;\n\t\t\t}\n\n\t\t\tif (value.join() !== values.join()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\treturn values;\n\t}\n\n\t/**\n\t * Get a single row of data by primary\n\t * @method\n\t * @param {number|string} primary Primary\n\t * @return {object} Data\n\t */\n\tgetData(primary) {\n\t\tconst data = _.findWhere(this.data, {\n\t\t\t[this.primaryColumn]: primary,\n\t\t});\n\t\treturn data && _.clone(data);\n\t}\n\n\t/**\n\t * Get hypergrid's version of the data\n\t * @method\n\t * @param {Hypergrid} grid Grid\n\t * @return {array} Grid data\n\t */\n\tgetGridData(grid) {\n\t\treturn grid.behavior.dataModel.dataSource.data;\n\t}\n\n\t/**\n\t * Used to get data for hypergrid\n\t * @method\n\t * @return {array} JSON data\n\t */\n\tgetJSON() {\n\t\treturn _.map(this.data, (d) => _.clone(d));\n\t}\n\n\t/**\n\t * Get the primary value for row\n\t * @method\n\t * @param {Hypergrid} grid Grid\n\t * @param {number} y Row\n\t * @return {mixed} Primary\n\t */\n\tgetPrimary(grid, y) {\n\t\treturn grid.behavior.dataModel.getValueByField(y, this.primaryColumn);\n\t}\n\n\t/**\n\t * Get row data from primary value\n\t * @method\n\t * @param {Hypergrid} grid Grid\n\t * @param {number|string} primary Primary\n\t * @return {object} Row data\n\t */\n\tgetRowData(grid, primary) {\n\t\tconst data = this.getGridData(grid);\n\t\tconst field = this.primaryColumn;\n\n\t\tfor (let i = 0, c = data.length, d; i < c; i++) {\n\t\t\tif ((d = data[i])[field] === primary) {\n\t\t\t\treturn d;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get row index from primary value\n\t * @method\n\t * @param {Hypergrid} grid Grid\n\t * @param {number|string} primary Primary\n\t * @return {number} Row index\n\t */\n\tgetRowIndex(grid, primary) {\n\t\treturn grid.behavior.dataModel.getRowIndex(this.primaryColumn, primary);\n\t}\n\n\t/**\n\t * Override this method to provide a schema\n\t * @method\n\t * @return {array}\n\t */\n\tgetSchema() {\n\t\treturn [];\n\t}\n\n\t/**\n\t * @method\n\t * @return {object} sort params\n\t */\n\tgetSortParams() {\n\t\treturn this.sortParams || this.defaultSortParams || {};\n\t}\n\n\t/**\n\t * Get a field (column) value from primary value\n\t * If editing the grid, this would be the original value\n\t * @method\n\t * @param {string} field Field name\n\t * @param {number|string} primary Primary value\n\t * @return {mixed} Value\n\t */\n\tgetValue(field, primary) {\n\t\tconst data = this.getData(primary);\n\t\treturn data && data[field];\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} field Sort field name\n\t * @param {string} order Sort order\n\t * @return {boolean} New sort\n\t */\n\tisNewSort(field, order) {\n\t\tconst sortParams = this.getSortParams();\n\t\treturn sortParams.field !== field || sortParams.order !== order;\n\t}\n\n\t/**\n\t * Parse single column\n\t * @method\n\t * @param {object} field Schema field\n\t */\n\tparseColumn(field) {\n\t\tconst idx = this.fields.length;\n\n\t\t// Add to fields\n\t\tthis.fields.push(field.name);\n\t\t// Add to headers - we do not want to internationalize attribute names\n\t\tthis.headers.push(field.header);\n\n\t\tfield.required && this.requiredFields.push(field.name);\n\n\t\t// Get things we care about\n\t\tthis.columnProperties[idx] = _.extend(_.omit(field, 'name', 'header'), {\n\t\t\teditable: !field.readOnly,\n\t\t\treadOnly: this.readOnly || field.readOnly,\n\t\t});\n\n\t\t// I feel like this should happen in the view - because editor type, but it is also\n\t\t// very related to schema data and I think the view should not need to know anything\n\t\t// about the schema\n\t\tlet editorType = null;\n\t\tif (!field.readOnly) {\n\t\t\teditorType = field.type || 'textfield';\n\t\t\tswitch (editorType) {\n\t\t\t\tcase 'int':\n\t\t\t\tcase 'float':\n\t\t\t\t\teditorType = 'number';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date':\n\t\t\t\t\teditorType = 'datepicker';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'text':\n\t\t\t\t\teditorType = 'textfield';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.editorTypes.push(editorType);\n\t}\n\n\t/**\n\t * Parse our columns from the collection schema\n\t * @override\n\t */\n\tparseColumns() {\n\t\t// Reset\n\t\tthis.columnProperties = [];\n\t\tthis.editorTypes = [];\n\t\tthis.fields = [];\n\t\tthis.headers = [];\n\t\tthis.requiredFields = [];\n\n\t\tconst schema = this.schema;\n\t\tfor (let i = 0, c = schema.length; i < c; i++) {\n\t\t\tthis.parseColumn(schema[i]);\n\t\t}\n\t}\n\n\t/**\n\t * Get the value parsed for entering grid editor\n\t * @method\n\t * @param {mixed} value Value\n\t * @param {string} field Field name\n\t * @return {mixed} Parsed in value\n\t */\n\tparseInValue(value, field) {\n\t\tconst schema = _.findWhere(this.schema, {name: field}) || {};\n\n\t\tif (isEmptyValue(value)) {\n\t\t\tvalue = schema.multivalue ? [] : '';\n\t\t}\n\n\t\tif (schema && schema.parseInValue) {\n\t\t\tvalue = schema.parseInValue(value);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t/**\n\t * Parse a single row of data from the collection\n\t * @method\n\t * @param {object} data Row data\n\t * @return {object} Parsed row data\n\t */\n\tparseRow(data) {\n\t\t_.each(data, (value, field, all) => {\n\t\t\tall[field] = this.parseInValue(value, field);\n\t\t});\n\t\treturn data;\n\t}\n\n\t/**\n\t * @override\n\t * @param {array} models Models\n\t */\n\treset(models) {\n\t\tthis.data = models || [];\n\t\tthis.length = this.data.length;\n\t}\n\n\t/**\n\t * We do not use models, just maintain an array of raw data\n\t * @override\n\t * @param {array} models Models\n\t */\n\tset(models, opts = {}) {\n\t\t// If it was a chunk just concat (do not wipe out)\n\t\tthis.data = opts.chunk ? this.data.concat(models) : models;\n\n\t\tthis.length = this.data.length;\n\t}\n\n\t/**\n\t * Set data (resets schema)\n\t * @method\n\t * @param {array} data Data\n\t */\n\tsetData(data) {\n\t\tthis.schema = this.getSchema();\n\n\t\tthis.parseColumns();\n\n\t\tthis.primaryIdx = this.getColumnIndex(this.primaryColumn);\n\t\tthis.fieldCount = this.fields.length;\n\t\tthis.count = this.fieldCount * this.length;\n\n\t\tthis.trigger('grid:set:data', this, this.getJSON());\n\t}\n\n\t/**\n\t * Update data (does not reset schema)\n\t * Should be used when chunking was involved\n\t * @method\n\t * @param {array} newData New data\n\t */\n\tupdateData(newData) {\n\t\tthis.count = this.fieldCount * this.length;\n\n\t\tthis.trigger('grid:update:data', this, this.getJSON());\n\t}\n\n\t// For possibly large jobs that can not currently be handled via webworkers\n\tbreakItUp() {\n\t\treturn CoreView.prototype.breakItUp.apply(this, arguments);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Grid';\n\t}\n}\n","/**\n * Attribute history data tailored for use in a grid view\n * https://kb.netx.net/pages/viewpage.action?spaceKey=DEV&title=Attribute+History\n * @class\n */\nimport Base from '@netx/core-grid/collections/grid';\n\nimport PagerModel from '@netx/core-app/models/pager';\n\nimport moment from '@netx/core/lib/netx-moment';\n\nexport default class AssetAttributeHistory extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {object} */\n\tget defaultSortParams() {\n\t\treturn {\n\t\t\tfield: 'creation_date',\n\t\t\torder: 'desc',\n\t\t};\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetAssetAttributeHistory: 'Loading attribute history',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetAssetAttributeHistory: 'Loaded attribute history',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Collection methods\n\t * @property {method} methods.read - Fetch data\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * Get attribute history\n\t\t\t * @method\n\t\t\t * @param {object} opts Options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\tif (!opts || !opts.chunk) {\n\t\t\t\t\tthis.pager.firstPage({silent: true});\n\t\t\t\t}\n\t\t\t\treturn [\n\t\t\t\t\t'getAssetAttributeHistory',\n\t\t\t\t\tthis.assetId,\n\t\t\t\t\tthis.sortParams || this.defaultSortParams,\n\t\t\t\t\tthis.searchString,\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {method} parsers.read - Parse fetched data\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} response Data\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(response, opts) {\n\t\t\t\t// Setup schema\n\t\t\t\tthis.schema = this.getSchema();\n\n\t\t\t\t// Get tracked attributes\n\t\t\t\tconst trackedAttributes = Netx.asset.attributes.filterByHistory();\n\t\t\t\tlet attrModel, obj;\n\n\t\t\t\treturn _.map(response, (data) => {\n\t\t\t\t\t// The order of the fields does not matter - see `this.getSchema`\n\t\t\t\t\tobj = {\n\t\t\t\t\t\tassetId: data.assetId,\n\t\t\t\t\t\tcreation_date: moment(data.createDate).format(\n\t\t\t\t\t\t\t'dddd, MMMM Do YYYY @ h:mm:ss a',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcreation_user_label: data.createUserName,\n\t\t\t\t\t};\n\t\t\t\t\t// Loop over attributes and flatten\n\t\t\t\t\t_.each(data.attributes, (attr) => {\n\t\t\t\t\t\tif ((attrModel = trackedAttributes.get(attr.templateId))) {\n\t\t\t\t\t\t\tlet value = attrModel.get('multivalue')\n\t\t\t\t\t\t\t\t? attr.values\n\t\t\t\t\t\t\t\t: attr.values[0];\n\t\t\t\t\t\t\tif (value == null) {\n\t\t\t\t\t\t\t\tvalue = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tobj[attrModel.get('name')] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn this.parseRow(obj);\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * @type {string}\n\t\t */\n\t\tthis.primaryColumn = opts.primaryColumn || 'assetId';\n\n\t\t/**\n\t\t * Paging model\n\t\t * @memberof module:asset/collections/assetAttributeHistory\n\t\t * @alias pager\n\t\t * @type {module:app/models/pager}\n\t\t */\n\t\tthis.pager = new PagerModel(\n\t\t\t{pageSize: opts.pageSize || 20},\n\t\t\t{collection: this},\n\t\t);\n\n\t\t/**\n\t\t * @memberof module:asset/collections/assetAttributeHistory\n\t\t * @alias searchString\n\t\t * @type {string}\n\t\t */\n\t\tthis.searchString = opts.searchString || '';\n\n\t\t/**\n\t\t * @memberof module:asset/collections/assetAttributeHistory\n\t\t * @alias sortParams\n\t\t * @type {object}\n\t\t */\n\t\tthis.sortParams = opts.sortParams || null;\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Options\n\t */\n\taddChunk(opts) {\n\t\tthis.pager.nextPage(_.extend({chunk: true, remove: false}, opts));\n\t}\n\n\t/** @method */\n\tclearSearch() {\n\t\tif (this.searchString !== '') {\n\t\t\tthis.searchString = '';\n\t\t\tthis.filtering = true;\n\t\t\treturn this.fetch({duplicateQueryPolicy: 'abort'});\n\t\t}\n\t\treturn new $.Deferred().resolveWith(this, [this, this.models]);\n\t}\n\n\t/**\n\t * This is the schema that grid view will request\n\t * @method\n\t * @return {array}\n\t */\n\tgetSchema() {\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: 'creation_date',\n\t\t\t\theader: i18n.t('i18n.date'),\n\t\t\t\ttype: 'date',\n\t\t\t\treadOnly: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'creation_user_label',\n\t\t\t\theader: i18n.t('i18n.user'),\n\t\t\t\ttype: 'string',\n\t\t\t\treadOnly: true,\n\t\t\t},\n\t\t].concat(\n\t\t\t_.compact(\n\t\t\t\tNetx.asset.attributes.filterByHistory().map((attrModel) => {\n\t\t\t\t\tif (attrModel.get('system')) return;\n\n\t\t\t\t\tconst spec2 = attrModel.get('spec2');\n\t\t\t\t\tlet type = attrModel.getTypeName();\n\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase 'number':\n\t\t\t\t\t\t\ttype = spec2 && spec2 !== 4 ? 'float' : 'int';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: attrModel.get('name'),\n\t\t\t\t\t\theader: attrModel.getLabel(),\n\t\t\t\t\t\tmultivalue: attrModel.get('multivalue'),\n\t\t\t\t\t\treadOnly: true,\n\t\t\t\t\t\tsortable: false,\n\t\t\t\t\t\ttype: type,\n\n\t\t\t\t\t\t// For display\n\t\t\t\t\t\tformatValue(value, opts = {}) {\n\t\t\t\t\t\t\t// No clickable URL support in grid at the moment\n\t\t\t\t\t\t\topts.parseURL = false;\n\t\t\t\t\t\t\topts.html = false;\n\t\t\t\t\t\t\treturn attrModel.format(value, opts);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tparseInValue: _.bind(attrModel.parseInValue, attrModel),\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} str Search string\n\t */\n\tsearch(str) {\n\t\tif (str != null && str !== '' && this.searchString !== str) {\n\t\t\tthis.searchString = str;\n\t\t\tthis.filtering = true;\n\t\t\treturn this.fetch({duplicateQueryPolicy: 'abort'});\n\t\t}\n\t\treturn new $.Deferred().resolveWith(this, [this, this.models]);\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} field Field to sort on\n\t * @param {string} order Sort order\n\t */\n\tsetSort(field, order) {\n\t\tif (this.isNewSort(field, order)) {\n\t\t\tthis.sortParams = {\n\t\t\t\tfield: field,\n\t\t\t\torder: order,\n\t\t\t};\n\t\t\tthis.filtering = true;\n\t\t\treturn this.fetch({duplicateQueryPolicy: 'abort'});\n\t\t}\n\t\treturn new $.Deferred().resolveWith(this, [this, this.models]);\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} field Field to sort on\n\t * @param {string} order Sort order\n\t */\n\tunsetSort() {\n\t\tif (this.sortParams) {\n\t\t\tthis.sortParams = null;\n\t\t\tthis.filtering = true;\n\t\t\treturn this.fetch({duplicateQueryPolicy: 'abort'});\n\t\t}\n\t\treturn new $.Deferred().resolveWith(this, [this, this.models]);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetAttributeHistory';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class Comment extends Base {\n\t/**\n\t * @property {object} defaults - Model defaults\n\t * @property {number} defaults.id - Comment id\n\t * @property {number} defaults.annotationId - Annotation id\n\t * @property {string} defaults.authorEmail - Author email\n\t * @property {number} defaults.authorId - Author id\n\t * @property {string} defaults.authorLabel - Author label\n\t * @property {string} defaults.creationDate - Creation date\n\t * @property {string} defaults.comment - Comment text\n\t * @property {boolean} defaults.isEdited - Comment edited\n\t * @property {string} defaults.lastModDate - Modification date\n\t * @property {number} defaults.rootCommentId - Root comment id (N/A until we start supporting comment threads)\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t// id: 0,\n\t\t\tannotationId: 0,\n\t\t\tauthorEmail: '',\n\t\t\tauthorId: Netx.getUser().id,\n\t\t\tauthorLabel: '',\n\t\t\tcomment: '',\n\t\t\tcreationDate: '',\n\t\t\tisEdited: false,\n\t\t\tlastModDate: '',\n\t\t\trootCommentId: 0,\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {string} perm Permission\n\t * @return {boolean} Allowed\n\t */\n\tallows(perm) {\n\t\tperm = perm || 'read';\n\n\t\tif (perm === 'read') return true;\n\t\t// look to see if the user has edit\n\t\t// rights for the project itself\n\t\tconst allowed = this.collection.canEdit();\n\t\treturn allowed && this.get('authorId') === Netx.getUser().id;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Comment';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/comment';\n\nimport PagerModel from '@netx/core-app/models/pager';\n\nexport default class Comments extends Base {\n\t/**\n\t * @override\n\t * @param {array} models An array of models or model attributes\n\t * @param {opts} Collection options\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.comparator = opts.comparator || 'creationDate';\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Paging model\n\t\t * @memberof module:comment/collections/comments\n\t\t * @alias pager\n\t\t * @type {module:app/models/pager}\n\t\t */\n\t\tthis.pager = new PagerModel(\n\t\t\t{},\n\t\t\t{\n\t\t\t\tcollection: this,\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} comment Comment\n\t * @param {object} opts Options\n\t */\n\taddComment(comment, opts) {\n\t\tconst model = new this.model({\n\t\t\tcomment: comment,\n\t\t});\n\t\treturn model.save().then(() => {\n\t\t\tthis.add(model, opts);\n\t\t\treturn model;\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Comments';\n\t}\n}\n","/**\n * A single comment for a project review annotation\n * @class\n */\nimport Base from '@netx/core-comment/models/comment';\n\nexport default class ProjectReviewAnnotationComment extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} defaults - Model defaults\n\t * @property {number} defaults.annotationId - Annotation id\n\t *\n\t * @property {string} defaults.projectStatus - Project status (open/closed)\n\t */\n\tget defaults() {\n\t\treturn _.extend(super.defaults || {}, {\n\t\t\tannotationId: 0,\n\t\t\t// Client attributes\n\t\t\tprojectStatus: 'open',\n\t\t});\n\t}\n\n\t/** @type {array} */\n\tget clientAttrs() {\n\t\treturn ['projectStatus'];\n\t}\n\n\t/**\n\t * @property {object} methods - Model methods\n\t * @property {method} create - Create new comment\n\t * @property {method} update - Update existing comment\n\t * @property {method} remove - Delete (destroy) comment\n\t */\n\tget methods() {\n\t\treturn _.extend(super.methods || {}, {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate: function(opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'addCommentToAnnotation',\n\t\t\t\t\tthis.get('annotationId'),\n\t\t\t\t\tthis.self(),\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdate: function(opts) {\n\t\t\t\treturn ['updateCommentForAnnotation', this.self()];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tremove: function(opts) {\n\t\t\t\treturn ['deleteCommentFromAnnotation', this.id];\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @param {string} perm Permission\n\t * @return {boolean} Allowed\n\t */\n\tallows(perm) {\n\t\tvar allowed = super.allows(perm);\n\n\t\treturn allowed && perm !== 'read'\n\t\t\t? this.get('projectStatus') === 'open'\n\t\t\t: allowed;\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} status Status\n\t * @param {object} opts Options\n\t */\n\tsetProjectStatus(status, opts) {\n\t\treturn this.set('projectStatus', status, opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectReviewAnnotationComment';\n\t}\n}\n","/**\n * Collection of project review annotation `comments`\n * @class\n */\nimport Base from '@netx/core-comment/collections/comments';\nimport Model from '../models/projectReviewAnnotationComment';\n\nexport default class ProjectReviewAnnotationComments extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {atring} */\n\tget roomName() {\n\t\treturn 'ANNOTATION_COMMENTS_' + this.annotationId;\n\t}\n\n\t/**\n\t * @property {object} methods - Collection methods\n\t * @property {method} methods.read - Fetch comments\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'getCommentsForAnnotation',\n\t\t\t\t\tthis.annotationId,\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {method} parsers.read - Parse fetched comments\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} comments Comments\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(comments, opts) {\n\t\t\t\tvar projectStatus = this.projectStatus;\n\t\t\t\treturn _.map(comments, (comment) =>\n\t\t\t\t\t_.extend(comment, {projectStatus: projectStatus}),\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\n\t\tthis.canEditProject = opts.canEditProject === true;\n\n\t\t/**\n\t\t * @memberof module:project/models/projectReviewAnnotationComments\n\t\t * @alias annotationId\n\t\t * @type {number}\n\t\t */\n\t\tthis.annotationId = opts.annotationId;\n\n\t\t/**\n\t\t * @memberof module:project/models/projectReviewAnnotationComments\n\t\t * @alias projectStatus\n\t\t * @type {string}\n\t\t */\n\t\tthis.projectStatus = opts.projectStatus || 'open';\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'sync', this.subscribe);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} comment Comment object\n\t * @param {object} opts Request options\n\t */\n\taddComment(comment, opts) {\n\t\tconst model = new this.model(\n\t\t\t_.extend(\n\t\t\t\t_.pick.apply(_, [comment].concat(_.keys(this.model.GetDefaults()))),\n\t\t\t\t{\n\t\t\t\t\tannotationId: this.annotationId,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\n\t\treturn model.save().then(() => {\n\t\t\tthis.add(model, opts);\n\t\t\treturn model;\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} id Comment id\n\t * @param {object} opts Request options\n\t */\n\tremoveComment(id, opts) {\n\t\tconst model = this.get(id);\n\n\t\tif (!model) {\n\t\t\treturn new $.Deferred().reject(\n\t\t\t\tnew Error('Annotation comment model with id `' + id + '` not found'),\n\t\t\t);\n\t\t}\n\n\t\treturn model.destroy(_.extend({wait: true}, opts));\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} status Status\n\t * @param {object} opts Options\n\t * @fires updateStatus\n\t */\n\tsetProjectStatus(status, opts = {}) {\n\t\tthis.projectStatus = status;\n\n\t\tthis.invoke('setProjectStatus', status, opts);\n\t\t!opts.silent && this.trigger('updateStatus', this, status);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} data Message data\n\t */\n\tsubscriptionMessage(data) {\n\t\tif (data.action === 'add') {\n\t\t\t_.delay(() => {\n\t\t\t\tconst model = this.get(data.id);\n\t\t\t\t!model && this.add(data.dto);\n\t\t\t}, 200);\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = this.get(data.id);\n\t\tswitch (data.action) {\n\t\t\t// case 'add':\n\t\t\t// \t!model && this.add( data.dto );\n\t\t\t// \tbreak;\n\t\t\tcase 'edit':\n\t\t\t\tmodel ? model.set(data.dto) : this.add(data.dto);\n\t\t\t\tbreak;\n\t\t\tcase 'delete':\n\t\t\t\tmodel && this.remove(model);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean}\n\t */\n\tcanEdit() {\n\t\treturn this.canEditProject === true;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectReviewAnnotationComments';\n\t}\n}\n","/**\n * A single project review annotation that contains a collection of project review annotation `comments`\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport AssetAnnotationsCommentsCollection from '../collections/projectReviewAnnotationComments';\nimport AssetAnnotationCommentModel from '../models/projectReviewAnnotationComment';\n\nexport default class ProjectReviewAnnotation extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} defaults - Model defaults\n\t * @property {number} defaults.id - Annotation id\n\t * @property {number} defaults.commentCount - Comment count\n\t * @property {string} defaults.creationDate - Creation date\n\t * @property {string} defaults.creatorEmail - Creator email\n\t * @property {number} defaults.creatorId - Creator id\n\t * @property {string} defaults.creatorLabel - Creator label\n\t * @property {string} defualts.fillStyle - Shape fill style\n\t * @property {object} defaults.firstComment - First comment\n\t * @property {number} defaults.height - Height\n\t * @property {string} defaults.lastModDate - Modification date\n\t * @property {number} defaults.lineWidth - Shape line width\n\t * @property {number} defaults.originX - X coord\n\t * @property {number} defaults.originY - Y coord\n\t * @property {number} defaults.reviewId - Review id\n\t * @property {string} defaults.strokeStyle - Shape stroke style\n\t * @property {string} defaults.type - Shape type\n\t * @property {number} defaults.width - Width\n\t *\n\t * @property {boolean} defaults.active - Active\n\t * @property {string} defaults.projectStatus - Project status\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t// id : 0,\n\t\t\tcommentCount: 0,\n\t\t\tcreationDate: '',\n\t\t\tcreatorEmail: '',\n\t\t\tcreatorId: Netx.getUser().id,\n\t\t\tcreatorLabel: '',\n\t\t\tfillStyle: 'rgba(255, 255, 255, 0.05)',\n\t\t\tfirstComment: {},\n\t\t\theight: 0,\n\t\t\tlineWidth: 1,\n\t\t\tlastModDate: '',\n\t\t\toriginX: 0,\n\t\t\toriginY: 0,\n\t\t\treviewId: 0,\n\t\t\tstrokeStyle: 'rgba(0, 0, 0, 1)',\n\t\t\ttype: 'rectangle',\n\t\t\twidth: 0,\n\n\t\t\t// Client side\n\t\t\tactive: false,\n\t\t\tprojectStatus: 'open',\n\t\t};\n\t}\n\n\t/** @type {array} */\n\tget clientAttrs() {\n\t\treturn ['active', 'projectStatus'];\n\t}\n\n\t/**\n\t * @property {object} methods - Model methods\n\t * @property {method} methods.create - Create new annotation\n\t * @property {method} methods.update - Update exisiting annotation\n\t * @property {method} methods.remove - Delete (destroy) annotation\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate: function (opts) {\n\t\t\t\treturn ['addAnnotationToReview', this.get('reviewId'), this.self()];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdate: function (opts) {\n\t\t\t\treturn ['updateAnnotationForReview', this.self()];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tremove: function (opts) {\n\t\t\t\treturn ['deleteAnnotationFromReview', this.id];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {opts} Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * @memberof module:project/models/projectReviewAnnotation\n\t\t * @alias comments\n\t\t * @type {module:project/collections/projectReviewAnnotationComments}\n\t\t */\n\t\tthis.comments = new AssetAnnotationsCommentsCollection([], {\n\t\t\tannotationId: this.id,\n\t\t\tprojectStatus: this.get('projectStatus'),\n\t\t\tcanEditProject: this.allows('edit'),\n\t\t});\n\t\tthis.addSubCollection(this.comments);\n\n\t\t/**\n\t\t * @memberof module:project/models/projectReviewAnnotation\n\t\t * @alias firstComment\n\t\t * @type {module:project/models/projectReviewAnnotationComment}\n\t\t */\n\t\tthis.firstComment = new AssetAnnotationCommentModel(\n\t\t\tthis.get('firstComment'),\n\t\t);\n\t\tthis.addSubModel(this.firstComment);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'change:id', function (model, id, opts) {\n\t\t\tthis.comments.annotationId = this.id;\n\t\t});\n\t\tthis.listenTo(this, 'change:firstComment', function (\n\t\t\tmodel,\n\t\t\tfirstComment,\n\t\t\topts,\n\t\t) {\n\t\t\tthis.firstComment.set(firstComment, opts);\n\t\t});\n\t\tthis.listenTo(this, 'change:projectStatus', function (model, status, opts) {\n\t\t\tthis.comments.setProjectStatus(status, opts);\n\t\t});\n\t\tthis.listenTo(\n\t\t\tthis.comments,\n\t\t\t'add remove reset sync',\n\t\t\t_.debounce(function () {\n\t\t\t\tvar commentCount = this.comments.length;\n\t\t\t\tcommentCount\n\t\t\t\t\t? this.firstComment.set(this.comments.at(0).attributes)\n\t\t\t\t\t: this.firstComment.unset();\n\n\t\t\t\tthis.set('commentCount', commentCount);\n\t\t\t}, 25),\n\t\t);\n\t}\n\n\t/**\n\t * @override\n\t * @param {string} perm Permission\n\t * @return {boolean} Allowed\n\t */\n\tallows(perm) {\n\t\treturn (perm || 'read') !== 'read'\n\t\t\t? // is the project open?\n\t\t\t // did the user create it?\n\t\t\t // does user have edit rights on project?\n\t\t\t this.collection &&\n\t\t\t\t\tthis.collection.canEdit() &&\n\t\t\t\t\tthis.get('projectStatus') === 'open' &&\n\t\t\t\t\tthis.get('creatorId') === Netx.getUser().id\n\t\t\t: true;\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tgetComments(opts) {\n\t\tthis.comments.canEditProject = opts.canEditProject || false;\n\t\treturn this.comments.fetch(opts);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} scale Scale\n\t * @return {object} Shape data\n\t */\n\tgetShapeData(scale) {\n\t\tscale = Number(scale) || 1;\n\n\t\tvar round = Math.round;\n\t\treturn _.extend(\n\t\t\t_.pick(\n\t\t\t\tthis.attributes,\n\t\t\t\t'id',\n\t\t\t\t'lineWidth',\n\t\t\t\t'fillStyle',\n\t\t\t\t'strokeStyle',\n\t\t\t\t'type',\n\t\t\t),\n\t\t\t{\n\t\t\t\twidth: round(this.get('width') * scale),\n\t\t\t\theight: round(this.get('height') * scale),\n\t\t\t\tx: round(this.get('originX') * scale),\n\t\t\t\ty: round(this.get('originY') * scale),\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} status Status\n\t * @param {object} opts Options\n\t */\n\tsetProjectStatus(status, opts) {\n\t\treturn this.set('projectStatus', status, opts);\n\t}\n\n\t/**\n\t * We do not subscribe to any websocket channels\n\t * but our sub collection does\n\t * @override\n\t */\n\tunsubscribe() {\n\t\tthis.comments.unsubscribe();\n\t\treturn this;\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} x X\n\t * @param {number} y Y\n\t * @param {object} opts Options\n\t */\n\tupdatePosition(x, y, opts) {\n\t\treturn this.save(\n\t\t\t{\n\t\t\t\toriginX: x,\n\t\t\t\toriginY: y,\n\t\t\t},\n\t\t\topts,\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} width Width\n\t * @param {number} height Height\n\t * @param {object} opts Options\n\t */\n\tupdateSize(width, height, opts) {\n\t\treturn this.save(\n\t\t\t{\n\t\t\t\twidth: width,\n\t\t\t\theight: height,\n\t\t\t},\n\t\t\topts,\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} width Width\n\t * @param {number} height Height\n\t * @param {number} x X\n\t * @param {number} y Y\n\t * @param {object} opts Options\n\t */\n\tupdateSizeAndPosition(width, height, x, y, opts) {\n\t\treturn this.save(\n\t\t\t{\n\t\t\t\twidth: width,\n\t\t\t\theight: height,\n\t\t\t\toriginX: x,\n\t\t\t\toriginY: y,\n\t\t\t},\n\t\t\topts,\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} style Style object\n\t * @param {object} opts Options\n\t */\n\tupdateStyle(style, opts) {\n\t\treturn this.save(style, opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectReviewAnnotation';\n\t}\n}\n","/**\n * Collection of project review `annotations`\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/projectReviewAnnotation';\n\nimport PagerModel from '@netx/core-app/models/pager';\n\nexport default class ProjectReviewAnnotations extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget roomName() {\n\t\treturn 'ANNOTATIONS_' + this.reviewId;\n\t}\n\n\t/**\n\t * @property {object} methods - Collection methods\n\t * @property {object} methods.read - Fetch annotations\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'getAnnotationsForReview',\n\t\t\t\t\tthis.reviewId,\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {method} parsers.read - Parse fetched annotations\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} annotations Annotations\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(annotations, opts) {\n\t\t\t\t// Pass along the project `status`\n\t\t\t\tconst projectStatus = this.projectStatus;\n\t\t\t\treturn _.map(annotations, (annotation) =>\n\t\t\t\t\t_.extend(annotation, {projectStatus: projectStatus}),\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tif (!opts.reviewId) {\n\t\t\tthrow new Error('`reviewId` required');\n\t\t}\n\n\t\tsuper(models, opts);\n\n\t\tthis.canEditProject = opts.canEditProject === true;\n\n\t\t/**\n\t\t * @memberof module:project/collections/projectReviewAnnotations\n\t\t * @alias reviewId\n\t\t * @type {number}\n\t\t */\n\t\tthis.reviewId = opts.reviewId;\n\n\t\t/**\n\t\t * Paging model\n\t\t * @memberof module:project/collections/projectReviewAnnotations\n\t\t * @alias pager\n\t\t * @type {module:app/models/pager}\n\t\t */\n\t\t// We cannot page these really - not for what they are used for\n\t\tthis.pager = new PagerModel({pageSize: 0x7fffff}, {collection: this});\n\t\tthis.addSubModel(this.pager);\n\n\t\t/**\n\t\t * @memberof module:project/collections/projectReviewAnnotations\n\t\t * @alias projectStatus\n\t\t * @type {string}\n\t\t */\n\t\tthis.projectStatus = opts.projectStatus || 'open';\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'change:active', (model, active) => {\n\t\t\tif (!active) return;\n\n\t\t\tthis.each((m) => {\n\t\t\t\tm !== model && m.get('active') && m.set('active', false);\n\t\t\t});\n\t\t}).listenTo(this, 'sync', (annotations, data, opts) => {\n\t\t\tif (annotations !== this) return;\n\t\t\tthis.subscribe();\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} annotation Annotation object\n\t * @param {object} opts Request options\n\t * @return {module:project/models/projectReviewAnnotation} Annotation model\n\t */\n\taddAnnotation(annotation, opts) {\n\t\tconst model = new this.model(\n\t\t\t_.extend(\n\t\t\t\t_.pick.apply(_, [annotation].concat(_.keys(this.model.GetDefaults()))),\n\t\t\t\t{\n\t\t\t\t\toriginX: annotation.x,\n\t\t\t\t\toriginY: annotation.y,\n\t\t\t\t\treviewId: this.reviewId,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\n\t\treturn model.save(opts).then(() => {\n\t\t\tthis.add(model);\n\t\t\treturn model;\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} id Annotation id\n\t * @param {object} opts Request options\n\t * @return {module:project/models/projectReviewAnnotation}\n\t */\n\tremoveAnnotation(id, opts) {\n\t\tconst model = this.get(id);\n\n\t\tif (!model) return new $.Deferred().reject();\n\n\t\treturn model.destroy(_.extend({wait: true}, opts));\n\t}\n\n\t/**\n\t * @method\n\t */\n\tresetActive() {\n\t\tconst activeAnnotation = this.findWhere({active: true});\n\t\tactiveAnnotation && activeAnnotation.set('active', false);\n\t\treturn this;\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} status Status\n\t * @param {object} opts Options\n\t */\n\tsetProjectStatus(status, opts = {}) {\n\t\tthis.projectStatus = status;\n\n\t\tthis.invoke('setProjectStatus', status, opts);\n\t\t!opts.silent && this.trigger('updateStatus', this, status);\n\n\t\treturn this;\n\t}\n\t/**\n\t * @method\n\t * @return {boolean}\n\t */\n\tcanEdit() {\n\t\treturn this.canEditProject === true;\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} data Message data\n\t */\n\tsubscriptionMessage(data) {\n\t\t// TODO: this is a hack for 8.12\n\t\t// In 9.0 the websocket response will come after the post response and the case below can be used\n\t\tif (data.action === 'add') {\n\t\t\treturn _.delay(() => {\n\t\t\t\tconst model = this.get(data.id);\n\t\t\t\t!model && this.add(data.dto);\n\t\t\t}, 1000);\n\t\t}\n\n\t\tconst model = this.get(data.id);\n\t\tswitch (data.action) {\n\t\t\t// case 'add':\n\t\t\t// \t!model && this.add( data.dto );\n\t\t\t// \tbreak;\n\t\t\tcase 'edit':\n\t\t\t\tmodel ? model.set(data.dto) : this.add(data.dto);\n\t\t\t\tbreak;\n\t\t\tcase 'delete':\n\t\t\t\tmodel && this.remove(model);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectReviewAnnotations';\n\t}\n}\n","/**\n * A single decision for a project review\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class ProjectReviewDecision extends Base {\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'user';\n\t}\n\n\t/**\n\t * @property {object} defaults - Model defaults\n\t * @property {number} defaults.user - User id\n\t * @property {string} defaults.userEmail - User email\n\t * @property {string} defaults.userLabel - User label\n\t * @property {string} defaults.decision - Decision\n\t * @property {string} defaults.decision - Decision data\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\tuser: 0,\n\t\t\tuserEmail: '',\n\t\t\tuserLabel: '',\n\t\t\tdecision: '',\n\t\t\tdecisionDate: '',\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectReviewDecision';\n\t}\n}\n","/**\n * Collection of project review `decisions`\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/projectReviewDecision';\n\nexport default class ProjectReviewDecisions extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget roomName() {\n\t\treturn 'PROJECT_REVIEW_DECISIONS_' + this.reviewId;\n\t}\n\n\t/**\n\t * @property {object} methods - Collection methods\n\t * @property {method} methods.read - Fetch decisions\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn ['getUserDecisionsForReview', this.reviewId];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection methods\n\t * @property {method} parsers.read - Parse fetched decisions\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} data Data\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(data, opts) {\n\t\t\t\treturn data.userDecisions;\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {array} models An array of models or model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * @memberof module:project/collections/projectReviewDecisions\n\t\t * @alias reviewId\n\t\t * @type {number}\n\t\t */\n\t\tthis.reviewId = opts.reviewId;\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'sync', this.subscribe);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectReviewDecisions';\n\t}\n}\n","export let approvalModes = {\n\tnone: i18n.t('i18n.none'),\n\tall: i18n.t('i18n.all'),\n\tany: i18n.t('i18n.any'),\n};\n\nexport let decision = {\n\tapproved: i18n.t('i18n.approved'),\n\t'needs work': i18n.t('i18n.needsWork'),\n\trejected: i18n.t('i18n.rejected'),\n};\n\nexport let status = {\n\tclosed: i18n.t('i18n.closed'),\n\topen: i18n.t('i18n.open'),\n};\n\nexport default {approvalModes, decision, status};\n","/**\n * A single project review that contains collections for review `annotations` and review `decisions`\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport AssetProjectReviewAnnotationsCollection from '../collections/projectReviewAnnotations';\nimport AssetProjectReviewDecisionsCollection from '../collections/projectReviewDecisions';\n\nimport {decision as projectDecisions} from '../properties/projects';\n\nexport default class ProjectReview extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @property {object} defaults - Model defaults\n\t * @property {number} defaults.id - Review id\n\t * @property {number} defaults.approvedCount - Review's approval count\n\t * @property {number} defaults.assetId - Asset id\n\t * @property {string} defaults.description - Review description\n\t * @property {string} defaults.decision - Review overall decision (\"approved\"/\"needs work\"/\"rejected\")\n\t * @property {string} defaults.decisionDate - Review overall decision date\n\t * @property {number} defaults.height - Asset original height\n\t * @property {boolean} defaults.isRestricted - Review is restricted (?)\n\t * @property {number} defaults.needsWorkCount - Review's \"needs work\" count\n\t * @property {string} defaults.previewUrl - Preview url\n\t * @property {number} defaults.projectId - Project id\n\t * @property {number} defaults.rejectedCount - Review's rejected count\n\t * @property {string} defaults.status - Review's current status (\"open\"/\"decided\")\n\t * @property {string} defaults.thumbUrl - Thumbnail url\n\t * @property {string} defaults.title - Review title\n\t * @property {string} defaults.type - Review type (\"asset\" is the only value so far)\n\t * @property {string} defaults.userDecision - User's decision on the review (\"approved\"/\"needs work\"/\"rejected\")\n\t * @property {number} defaults.width - Asset original width\n\t * @property {string} defaults.zoomUrl - Zoom url\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t// id: 0,\n\t\t\tapprovedCount: 0,\n\t\t\tassetId: 0,\n\t\t\tdecision: '',\n\t\t\tdecisionDate: '',\n\t\t\tdescription: '',\n\t\t\theight: 0,\n\t\t\tisRestricted: false,\n\t\t\tneedsWorkCount: 0,\n\t\t\tpreviewUrl: '',\n\t\t\tprojectId: 0,\n\t\t\trejectedCount: 0,\n\t\t\tstatus: '',\n\t\t\tthumbUrl: '',\n\t\t\ttitle: '',\n\t\t\ttype: '',\n\t\t\tuserDecision: '',\n\t\t\twidth: 0,\n\t\t\tzoomUrl: '',\n\n\t\t\t// Client attributes\n\t\t\tactive: false,\n\t\t\tpermission: 'read',\n\t\t\tprojectStatus: 'open',\n\t\t};\n\t}\n\n\t/** @type {array} */\n\tget clientAttrs() {\n\t\treturn ['active', 'permission', 'projectStatus'];\n\t}\n\n\t/**\n\t * @property {object} methods - Model methods\n\t * @property {method} methods.remove - Delete review (asset from project)\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * Delete self from project\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tremove: function (opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'deleteAssetsFromProject',\n\t\t\t\t\t[this.get('assetId')],\n\t\t\t\t\tthis.get('projectId'),\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {string} decision Decision\n\t\t\t * @param {object} opts Options\n\t\t\t */\n\t\t\tsetReviewDecision: function (decision, opts) {\n\t\t\t\tif (projectDecisions[decision] == null) {\n\t\t\t\t\treturn new $.Deferred().reject(\n\t\t\t\t\t\tnew Error('Unknow decision `' + decision + '`'),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Unset if already set\n\t\t\t\tvar existing = this.decisions.get(Netx.getUser().id);\n\t\t\t\tif (existing && existing.get('decision') === decision) {\n\t\t\t\t\tdecision = '';\n\t\t\t\t}\n\n\t\t\t\treturn ['setReviewDecision', this.id, decision];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Model parsers\n\t * @property {function} parsers.setReviewDecision - Parse set decision\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {object} review Review\n\t\t\t * @param {string} decision Decision\n\t\t\t * @param {object} opts Options\n\t\t\t */\n\t\t\tsetReviewDecision: function (review, decision, opts) {\n\t\t\t\tthis.set(review);\n\t\t\t\treturn review;\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Options\n\t */\n\tconstructor(attrs, opts) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * @memberof module:project/models/projectReview\n\t\t * @alias annotations\n\t\t * @type {module:project/collections/projectReviewAnnotations}\n\t\t */\n\t\tthis.annotations = new AssetProjectReviewAnnotationsCollection([], {\n\t\t\treviewId: this.id,\n\t\t\tprojectStatus: this.get('projectStatus'),\n\t\t\tcanEditProject: this.allows('edit'),\n\t\t});\n\t\tthis.addSubCollection(this.annotations);\n\n\t\t/**\n\t\t * @memberof module:project/models/projectReview\n\t\t * @alias decisions\n\t\t * @type {module:project/collections/projectReviewDecisions}\n\t\t */\n\t\tthis.decisions = new AssetProjectReviewDecisionsCollection([], {\n\t\t\treviewId: this.id,\n\t\t});\n\t\tthis.addSubCollection(this.decisions);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'change:active', function (model, active) {\n\t\t\tif (!active) {\n\t\t\t\t// Cleanup\n\t\t\t\tthis.resetActiveAnnotation().unsubscribe();\n\t\t\t} else {\n\t\t\t\t// Fetch data\n\t\t\t\tthis.getAnnotations();\n\t\t\t\tthis.getDecisions();\n\t\t\t}\n\t\t});\n\t\tthis.listenTo(this, 'change:id', function (model, id, opts) {\n\t\t\tthis.annotations.reviewId = id;\n\t\t\tthis.decisions.reviewId = id;\n\t\t});\n\t\tthis.listenTo(this, 'change:projectStatus', function (model, status, opts) {\n\t\t\tthis.annotations.setProjectStatus(status, opts);\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} annotation Annotation object\n\t * @param {object} opts Request options\n\t */\n\taddAnnotation(annotation, opts) {\n\t\treturn this.annotations.addAnnotation(annotation, opts);\n\t}\n\n\t/**\n\t * @override\n\t * @param {string} perm Permission\n\t * @return {boolean} Allowed\n\t */\n\tallows(perm) {\n\t\tvar allowed = super.allows(perm);\n\t\treturn allowed && perm !== 'read'\n\t\t\t? this.get('projectStatus') === 'open'\n\t\t\t: allowed;\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean} Can decide\n\t */\n\tcanMakeDecision() {\n\t\t// This is not my favorite approach\n\t\t// We need to know things about our parent project\n\t\t// If we are not part of a parent reviews collection that belongs to a parent project model\n\t\t// then we would be having some other problems outside of this gem - just due to the current\n\t\t// workflow / distribution of data\n\t\treturn this.collection.canMakeDecision();\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tgetAnnotations(opts) {\n\t\treturn this.annotations.fetch(opts);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tgetDecisions(opts) {\n\t\treturn this.decisions.fetch(opts);\n\t}\n\n\t/**\n\t * @method\n\t * @return {string} Orientation\n\t */\n\tgetOrientation() {\n\t\treturn this.get('width') > this.get('height') ? 'landscape' : 'portrait';\n\t}\n\n\t/**\n\t * @method\n\t * @return {number} Scale\n\t */\n\tgetZoomProxyScale() {\n\t\tvar width = this.get('width'),\n\t\t\theight = this.get('height');\n\n\t\t// Largest side is 1000\n\t\treturn width > height ? 1000 / width : 1000 / height;\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} id Annotation id\n\t * @param {object} opts Request options\n\t */\n\tremoveAnnotation(id, opts) {\n\t\tvar model = this.get(id);\n\n\t\tif (!model) return new $.Deferred().reject();\n\n\t\treturn model.destroy(_.extend({wait: true}, opts));\n\t}\n\n\t/**\n\t * @method\n\t */\n\tresetActiveAnnotation() {\n\t\tthis.annotations.resetActive();\n\t\treturn this;\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} status Status\n\t */\n\tsetProjectStatus(status) {\n\t\treturn this.set('projectStatus', status);\n\t}\n\n\t/**\n\t * We do not subscribe to any websocket channels\n\t * but our sub collections do\n\t * @override\n\t */\n\tunsubscribe() {\n\t\tthis.annotations.unsubscribe();\n\t\tthis.decisions.unsubscribe();\n\t\treturn this;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectReview';\n\t}\n}\n","/**\n * A collection of project `reviews`\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/projectReview';\n\nimport SorterModel from '@netx/core-app/models/sorter';\nimport PagerModel from '@netx/core-app/models/pager';\n\nexport default class ProjectReviews extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget roomName() {\n\t\treturn 'PROJECT_REVIEWS_' + this.project.id;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetReviewsForAsset: 'Loading reviews for asset',\n\t\t\tgetReviewsForProject: 'Loading review assets',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetReviewsForAsset: 'Loaded reviews for asset',\n\t\t\tgetReviewsForProject: 'Loaded review assets',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Collection methods\n\t * @property {method} methods.read - Fetch reviews\n\t * @property {method} methods.getReviewsForAsset - Fetch reviews for asset\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts = {}) {\n\t\t\t\tif (this.assetId) return this.getReviewsForAsset(this.assetId, opts);\n\n\t\t\t\t// Set `startId` if provided\n\t\t\t\tthis.pager.set('startId', opts.startId || null);\n\t\t\t\treturn [\n\t\t\t\t\t'getReviewsForProject',\n\t\t\t\t\tthis.getProjectId(),\n\t\t\t\t\tthis.sorter.getSortDTO(),\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {number} assetId Asset id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tgetReviewsForAsset(assetId, opts) {\n\t\t\t\tthis.assetId = assetId;\n\t\t\t\treturn [\n\t\t\t\t\t'getReviewsForAsset',\n\t\t\t\t\tassetId,\n\t\t\t\t\tthis.sorter.getSortDTO(),\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {method} parsers.read - Parse fetched reviews\n\t * @property {method} parsers.getReviewsForAsset - Parse fetched reviews for asset\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} reviews Reviews data\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(reviews, opts) {\n\t\t\t\t// Reset `startId`\n\t\t\t\tthis.pager.set('startId', null);\n\n\t\t\t\tconst project = this.project;\n\t\t\t\tconst permission = project.get('permission');\n\t\t\t\tconst projectStatus = project.get('status');\n\n\t\t\t\treturn _.map(reviews, review =>\n\t\t\t\t\t_.extend(review, {\n\t\t\t\t\t\tpermission: permission,\n\t\t\t\t\t\tprojectStatus: projectStatus,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} reviews Reviews data\n\t\t\t * @param {number} assetId Asset id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tgetReviewsForAsset(reviews, assetId, opts) {\n\t\t\t\treviews = _.map(reviews, review => {\n\t\t\t\t\tconst project = review.project;\n\t\t\t\t\treturn _.extend(\n\t\t\t\t\t\t_.pick(\n\t\t\t\t\t\t\treview,\n\t\t\t\t\t\t\t'assetId',\n\t\t\t\t\t\t\t'decision',\n\t\t\t\t\t\t\t'decisionDate',\n\t\t\t\t\t\t\t'id',\n\t\t\t\t\t\t\t'projectId',\n\t\t\t\t\t\t\t'status',\n\t\t\t\t\t\t),\n\t\t\t\t\t\t_.pick(\n\t\t\t\t\t\t\tproject,\n\t\t\t\t\t\t\t'creationDate',\n\t\t\t\t\t\t\t'description',\n\t\t\t\t\t\t\t'hasApprovers',\n\t\t\t\t\t\t\t'hasDecisions',\n\t\t\t\t\t\t\t'title',\n\t\t\t\t\t\t),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprojectStatus: project.status,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tthis.set(reviews, opts);\n\t\t\t\treturn reviews;\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Parent project\n\t\t * @memberof module:project/collections/projectReviews\n\t\t * @alias project\n\t\t * @type {module:project/models/project}\n\t\t */\n\t\tthis.project = opts.project;\n\n\t\t/**\n\t\t * Paging model\n\t\t * @memberof module:project/collections/projectReviews\n\t\t * @alias pager\n\t\t * @type {module:app/models/pager}\n\t\t */\n\t\tthis.pager = new PagerModel(\n\t\t\t{\n\t\t\t\tpageSize: 25,\n\t\t\t\t// TODO: See notes in pager model\n\t\t\t\troutesToPage: false,\n\t\t\t\t...opts.pager,\n\t\t\t},\n\t\t\t{collection: this},\n\t\t);\n\t\tthis.addSubModel(this.pager);\n\n\t\t/**\n\t\t * Sorting model\n\t\t * @memberof module:project/collections/projectReviews\n\t\t * @alias sorter\n\t\t * @type {module:app/models/sorter}\n\t\t */\n\t\tthis.sorter = new SorterModel(\n\t\t\t{\n\t\t\t\tfield: 'title',\n\t\t\t\torder: opts.sortOrder || 'desc',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcollection: this,\n\t\t\t\tsortableFields: ['title'],\n\t\t\t},\n\t\t);\n\t\tthis.addSubModel(this.sorter);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'change:active', (model, active) => {\n\t\t\tif (!active) return;\n\t\t\tthis.each(m => {\n\t\t\t\tm !== model && m.get('active') && m.set('active', false);\n\t\t\t});\n\t\t})\n\t\t\t.listenTo(this, 'sync', reviews => {\n\t\t\t\tif (reviews !== this) return;\n\t\t\t\tthis.project && this.project.id && this.subscribe();\n\t\t\t})\n\t\t\t.listenTo(this.project, 'change:status', this.setProjectStatus)\n\t\t\t.listenTo(this, 'request:getReviewsForAsset', (self, xhr, opts) => {\n\t\t\t\tthis.trigger('request:read', self, xhr, opts);\n\t\t\t})\n\t\t\t.listenTo(this, 'complete:getReviewsForAsset', (self, data, opts) => {\n\t\t\t\t!opts.silent && this.trigger('sync', self, data, opts);\n\t\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean} Can decide\n\t */\n\tcanMakeDecision() {\n\t\treturn this.project.canMakeDecision();\n\t}\n\n\t/**\n\t * @method\n\t * @return {module:project/models/projectReview} Review\n\t */\n\tgetActive() {\n\t\treturn this.findWhere({active: true});\n\t}\n\n\t/**\n\t * @method\n\t * @return {number} Project id\n\t */\n\tgetProjectId() {\n\t\treturn this.project.id;\n\t}\n\n\t/**\n\t * @method\n\t * @return {module:project/models/projectReview} Review\n\t */\n\tnextReview() {\n\t\tif (!this.length) return;\n\n\t\tconst active = this.getActive();\n\t\tconst idx = active && active.getIndex();\n\t\tif (!active || idx > this.length - 2) {\n\t\t\treturn this.selectReview(this.at(0).id);\n\t\t}\n\t\treturn this.selectReview(this.at(idx + 1));\n\t}\n\n\t/**\n\t * @method\n\t * @return {module:project/models/projectReview} Review\n\t */\n\tpreviousReview() {\n\t\tif (!this.length) return;\n\n\t\tconst active = this.getActive();\n\t\tconst idx = active && active.getIndex();\n\t\tif (!active || idx < 1) {\n\t\t\treturn this.selectReview(this.at(this.length - 1).id);\n\t\t}\n\t\treturn this.selectReview(this.at(idx - 1));\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} id Review id\n\t * @param {object} opts Request options\n\t */\n\tremoveReview(id, opts) {\n\t\tconst model = this.get(id);\n\n\t\tif (!model) return new $.Deferred().reject();\n\n\t\treturn model.destroy(_.extend({wait: true}, opts));\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} id Review id\n\t * @return {module:project/models/projectReview} Review\n\t * @fires selectReview\n\t */\n\tselectReview(id) {\n\t\tconst review = this.get(id);\n\t\treview && review.set('active', true);\n\n\t\treturn review;\n\t}\n\n\t/**\n\t * @method\n\t * @param {module:project/models/project} project Parent project\n\t * @param {string} status Status\n\t * @param {object} opts Options\n\t * @fires updateStatus\n\t */\n\tsetProjectStatus(project, status, opts) {\n\t\tthis.invoke('setProjectStatus', status, opts);\n\t\treturn this;\n\t}\n\n\t/** @override */\n\tsubscriptionMessage(data) {\n\t\tconst model = this.get(data.id);\n\t\tswitch (data.action) {\n\t\t\t// case 'add':\n\t\t\t// \t!model && this.add( data.dto );\n\t\t\t// \tbreak;\n\t\t\tcase 'edit':\n\t\t\t\tmodel && model.set(_.omit(data.dto, 'userDecision'));\n\t\t\t\tbreak;\n\t\t\tcase 'delete':\n\t\t\t\tmodel && this.remove(model);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectReviews';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-permissions/models/participant';\n\nexport default class ProjectParticipant extends Base {\n\t/**\n\t * @property {object} defaults - Model defaults\n\t * @property {boolean} defaults.approver - Is participant an approver\n\t */\n\tget defaults() {\n\t\treturn _.extend(super.defaults, {\n\t\t\tapprover: false,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectParticipant';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-permissions/collections/participants';\nimport Model from '../models/projectParticipant';\n\nexport default class ProjectParticpants extends Base {\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {function} parsers.read - Parse fetched results\n\t */\n\tget parsers() {\n\t\treturn _.extend(super.parsers, {\n\t\t\t/**\n\t\t\t * @override\n\t\t\t * @param {array} participants Participants\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(participants, opts) {\n\t\t\t\tconst approvers = opts.approvers || {};\n\n\t\t\t\treturn _.map(participants, participant => {\n\t\t\t\t\t// We want to combine the type and id `<type>-<id>`\n\t\t\t\t\t// `all` has no id and is just \"all\"\n\t\t\t\t\tconst uniqueId = _.compact(\n\t\t\t\t\t\t_.values(_.pick(participant, 'type', 'id')),\n\t\t\t\t\t).join('-');\n\n\t\t\t\t\tlet selector;\n\t\t\t\t\t// Check if we are an approver\n\t\t\t\t\tif (participant.type === 'group') {\n\t\t\t\t\t\tselector = approvers.groupIds;\n\t\t\t\t\t} else if (participant.type === 'user') {\n\t\t\t\t\t\tselector = approvers.userIds;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn _.extend(participant, {\n\t\t\t\t\t\tapprover: selector && selector.indexOf(participant.id) > -1,\n\t\t\t\t\t\tuniqueId: uniqueId,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ProjectParticpants';\n\t}\n}\n","/**\n * A simple model for generalizing our `UserSelector` members\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class UserSelector_Member extends Base {\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {string} defaults.id - The default user selector id (will be the id of the selector prepended by either \"group-\" or \"user-\")\n\t * @property {string} defaults.email - The default user selector email\n\t * @property {string} defaults.name - The default user selector name\n\t * @property {string} defaults.realId - The default user selector real id (before it was prepended for our uses)\n\t * @property {string} defaults.type - The default user selector type (user/group)\n\t * @property {number} defaults.users - The default user selector users\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t// id : '',\n\t\t\temail: '',\n\t\t\tname: '',\n\t\t\trealId: null,\n\t\t\ttype: '',\n\t\t\tusers: null,\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'UserSelector_Member';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/userSelector_member';\n\nimport GroupCollection from './groups';\nimport UserCollection from './users';\n\nexport default class UserSelectorMembers extends Base {\n\t/**\n\t * @property {object} parsers - Collection parsers (not typical - we do not fetch from the server ourselves)\n\t * @property {function} parsers.group - Parse model for group selector\n\t * @property {function} parsers.user - Parse model for userselector\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {Netx.Models.Group} model Group model\n\t\t\t * @return {object}\n\t\t\t */\n\t\t\tgroup(model) {\n\t\t\t\tif (!model.id) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tid: 'group-' + model.id,\n\t\t\t\t\tname: model.get('name'),\n\t\t\t\t\trealId: model.id,\n\t\t\t\t\ttype: 'group',\n\t\t\t\t\tusers: model.get('memberIds').length,\n\t\t\t\t};\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {Netx.Models.UserProfile} model User model\n\t\t\t * @return {object}\n\t\t\t */\n\t\t\tuser(model) {\n\t\t\t\tif (!model.id) return null;\n\n\t\t\t\tlet name = model.get('name3');\n\t\t\t\tname += (name ? ', ' : '') + model.get('name1');\n\t\t\t\treturn {\n\t\t\t\t\temail: model.get('email'),\n\t\t\t\t\tid: 'user-' + model.id,\n\t\t\t\t\tname: name,\n\t\t\t\t\trealId: model.id,\n\t\t\t\t\ttype: 'user',\n\t\t\t\t\tusers: 1,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * @memberOf Netx.Collections.UserSelectors\n\t\t * @property {object} selectors - The selectors avialble to this collection\n\t\t * @property {Netx.Collections.Groups} selectors.group - The group selector\n\t\t * @property {Netx.Collections.Users} selectors.user - The user selector\n\t\t */\n\t\tthis.selectors = {\n\t\t\t// email - TBD\n\t\t\tgroup: new GroupCollection([]),\n\t\t\tuser: new UserCollection([]),\n\t\t};\n\n\t\t/**\n\t\t * @memberOf Netx.Collections.UserSelectors\n\t\t * @alias userSelector\n\t\t * @type {object}\n\t\t */\n\t\tthis.setUserSelector(opts.userSelector || {});\n\n\t\tmodels = models || [];\n\t\t// Loop over selectors\n\t\t_.each(this.selectors, (selector, type) => {\n\t\t\tif (!this.selectorsEnabled[type]) return;\n\n\t\t\tlet parser = this.parsers[type];\n\t\t\tif (!_.isFunction(parser)) return;\n\n\t\t\t// Add the models for this selector\n\t\t\tmodels = models.concat(selector.map(parser));\n\t\t\t// Store reference to collection for cleanup later\n\t\t\tthis.addSubCollection(selector);\n\n\t\t\t// Hey, listen!\n\t\t\tthis\n\t\t\t\t// Listen for adds\n\t\t\t\t.listenTo(selector, 'add', (model, collection, opts) => {\n\t\t\t\t\tmodel.id && this.add(parser(model));\n\t\t\t\t})\n\t\t\t\t// Listen for changes\n\t\t\t\t.listenTo(selector, 'change', (model, opts) => {\n\t\t\t\t\tconst m = this.get(type + '-' + model.id);\n\t\t\t\t\tm && m.set(parser(model));\n\t\t\t\t})\n\t\t\t\t// Listen for removals\n\t\t\t\t.listenTo(selector, 'remove', (model, collection, opts) => {\n\t\t\t\t\tthis.remove(type + '-' + model.id);\n\t\t\t\t})\n\t\t\t\t// Listen for reset\n\t\t\t\t.listenTo(selector, 'reset', (collection, opts) => {\n\t\t\t\t\tthis.remove(this.filter(m => m.id.includes(type + '-')));\n\t\t\t\t\tthis.set(_.compact(collection.map(parser)), {remove: false});\n\t\t\t\t})\n\t\t\t\t// Listen for sync\n\t\t\t\t.listenTo(selector, 'sync', (collection, response, opts) => {\n\t\t\t\t\tif (collection._listenId === selector._listenId) {\n\t\t\t\t\t\tthis.remove(this.filter(m => m.id.includes(type + '-')));\n\t\t\t\t\t\tthis.set(_.compact(collection.map(parser)), {remove: false});\n\t\t\t\t\t\tthis.trigger('sync', this, response, opts);\n\t\t\t\t\t}\n\t\t\t\t\t// It was actually an attribute set model that synced\n\t\t\t\t\telse if (collection.constructor.__isModel__) {\n\t\t\t\t\t\tthis.add(parser(collection), {merge: true});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\n\t\t// Set initial data\n\t\tthis.set(models);\n\t}\n\n\t/**\n\t * Add member by id to selector type (email/group/user)\n\t * @method\n\t * @param {number} id Selector id\n\t * @param {string} type Selector type\n\t */\n\taddMember(id, type) {\n\t\tconst selector = this.selectors[type];\n\t\tif (!selector) return;\n\n\t\t// Create selector member model\n\t\tconst model = new selector.model({\n\t\t\t[selector.model.prototype.idAttribute || 'id']: parseInt(id),\n\t\t});\n\t\t// Fetch the model and add to the selector (which will add a generalized model to us)\n\t\treturn model.fetch().then(() => {\n\t\t\tselector.unshift(model);\n\t\t\treturn this;\n\t\t});\n\t}\n\n\t/**\n\t * Fetch selectors full model data - this is not your typical collection\n\t * @override\n\t * @param {object} opts Request options\n\t * @return {promise}\n\t */\n\tfetch(opts) {\n\t\tconst selectors = this.selectors;\n\t\tconst selectorsEnabled = this.selectorsEnabled;\n\t\treturn this.when(\n\t\t\t// email - TBD\n\t\t\tselectorsEnabled.group ? selectors.group.getGroups(opts) : true,\n\t\t\tselectorsEnabled.user ? selectors.user.getUsers(opts) : true,\n\t\t);\n\t}\n\n\t/**\n\t * Get member by id from selector type (email/group/user)\n\t * @method\n\t * @param {number} id Selector id\n\t * @param {string} type Selector type\n\t * @return {Netx.Models.Group|Netx.Models.UserProfile}\n\t */\n\tgetMember(id, type) {\n\t\tconst selector = this.selectors[type];\n\t\treturn selector && selector.get(parseInt(id));\n\t}\n\n\t/**\n\t * Get member ids from selector type (email/group/user)\n\t * @method\n\t * @param {number} id Selector id\n\t * @param {string} type Selector type\n\t * @return {array}\n\t */\n\tgetMemberIds(type) {\n\t\tconst selector = this.selectors[type];\n\t\treturn (selector && selector.ids()) || [];\n\t}\n\n\t/**\n\t * Remove member by id from selector type (email/group/user)\n\t * @method\n\t * @param {number} id Selector id\n\t * @param {string} type Selector type\n\t */\n\tremoveMember(id, type) {\n\t\tconst selector = this.selectors[type];\n\t\tselector && selector.remove(parseInt(id));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Reset the `userSelector` and fetch the selectors (puts back to initial state)\n\t * @method\n\t * @param {object} userSelector User selector object\n\t * @return {promise}\n\t */\n\tresetUserSelector(userSelector) {\n\t\treturn this.setUserSelector(userSelector);\n\t}\n\n\t/**\n\t * @method\n\t */\n\tsetMembers() {\n\t\t// Set groups\n\t\tif (this.selectorsEnabled.group) {\n\t\t\tthis.selectors.group.set(\n\t\t\t\t_.map(this.userSelector.get('groupIds'), groupId => {\n\t\t\t\t\treturn {groupId: groupId};\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\t// Set users\n\t\tif (this.selectorsEnabled.user) {\n\t\t\tthis.selectors.user.set(\n\t\t\t\t_.map(this.userSelector.get('userIds'), userId => {\n\t\t\t\t\treturn {userId: userId};\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Sets `userSelector` data and enablers\n\t * @param {object} userSelector User selector object\n\t * @param {boolean} fetch Fetch selectors\n\t */\n\tsetUserSelector(userSelector, fetch) {\n\t\tif (this.userSelector) {\n\t\t\tthis.stopListening(this.userSelector);\n\t\t}\n\t\t// Update `userSelector`\n\t\tthis.userSelector = userSelector || this.userSelector;\n\n\t\t// In case we are the result of a backgrid shadow collection\n\t\tuserSelector = this.userSelector.attributes || {};\n\n\t\t// Set enabled\n\t\tthis.selectorsEnabled = {\n\t\t\tall: _.isBoolean(userSelector.all),\n\t\t\temail: _.isArray(userSelector.emails),\n\t\t\tgroup: _.isArray(userSelector.groupIds),\n\t\t\tnone: _.isBoolean(userSelector.none),\n\t\t\tuser: _.isArray(userSelector.userIds),\n\t\t};\n\n\t\t// Set selector collections\n\t\tthis.setMembers();\n\n\t\treturn this;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'UserSelectorMembers';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport UserSelectorMembersCollection from '../collections/userSelectorMembers';\n\nimport {deepObjectExtend} from '@netx/core/lib/utils';\n\nexport default class UserSelector extends Base {\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {boolean} defaults.all - The default user selector all selected\n\t * @property {array} defaults.emails - The default user selector email addresses\n\t * @property {array} defaults.groupIds - The default user selector group ids\n\t * @property {boolean} defaults.none - The default user selector none selected (?)\n\t * @property {array} defaults.userIds - The default user selector user ids\n\t */\n\tget defaults() {\n\t\t// Not defining any keys currently, using as reference\n\t\t// We test `this.has` for things\n\t\treturn {\n\t\t\t// all : undefined,\n\t\t\t// emails : undefined,\n\t\t\t// groupIds : undefined,\n\t\t\t// none : undefined,\n\t\t\t// userIds : undefined\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * Backup initial data\n\t\t * @memberof module:user/models/userSelector\n\t\t * @alias userSelectorObject\n\t\t * @type {object}\n\t\t */\n\t\tthis.userSelectorObject = deepObjectExtend(attrs || {});\n\n\t\t/**\n\t\t * Members collection\n\t\t * @memberof module:user/models/userSelector\n\t\t * @alias selectorMembers\n\t\t * @type {module:user/collections/userSelectorMembers}\n\t\t */\n\t\tthis.selectorMembers = new UserSelectorMembersCollection(null, {\n\t\t\tuserSelector: this,\n\t\t});\n\n\t\t// Hey, listen!\n\t\t// When all selected changes\n\t\tthis.listenTo(this, 'change:all', function(model, all) {\n\t\t\t// Empty arrays if selected\n\t\t\t// Put back old data if deselected\n\t\t\tthis.set({\n\t\t\t\tgroupIds: all ? [] : this.userSelectorObject.groupIds,\n\t\t\t\tuserIds: all ? [] : this.userSelectorObject.userIds,\n\t\t\t});\n\t\t});\n\n\t\t// When a member is added we will update our record\n\t\tthis.listenTo(this.selectorMembers, 'add', function(member) {\n\t\t\t// Add to our sttributes\n\t\t\tswitch (member.get('type')) {\n\t\t\t\tcase 'group':\n\t\t\t\t\tvar groupIds = this.get('groupIds');\n\t\t\t\t\tgroupIds &&\n\t\t\t\t\t\tthis.set('groupIds', groupIds.concat([member.get('realId')]));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'user':\n\t\t\t\t\tvar userIds = this.get('userIds');\n\t\t\t\t\tuserIds &&\n\t\t\t\t\t\tthis.set('userIds', userIds.concat([member.get('realId')]));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\t// When a member is removed we will update our record\n\t\tthis.listenTo(this.selectorMembers, 'remove', function(member) {\n\t\t\t// Remove from our sttributes\n\t\t\tswitch (member.get('type')) {\n\t\t\t\tcase 'group':\n\t\t\t\t\tvar groupIds = this.get('groupIds');\n\t\t\t\t\tgroupIds &&\n\t\t\t\t\t\tthis.set('groupIds', _.without(groupIds, member.get('realId')));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'user':\n\t\t\t\t\tvar userIds = this.get('userIds');\n\t\t\t\t\tuserIds &&\n\t\t\t\t\t\tthis.set('userIds', _.without(userIds, member.get('realId')));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} opts Request options\n\t */\n\tfetch(opts) {\n\t\treturn this.selectorMembers.fetch(opts);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} id Member id\n\t * @param {string} type Member type\n\t */\n\taddMember(id, type) {\n\t\treturn this.selectorMembers.addMember(id, type);\n\t}\n\n\t/** @method */\n\tdeselectAll() {\n\t\treturn this.set('all', false);\n\t}\n\n\t/**\n\t * Depending on the state of `usetSelector` get the autocompletion type needed\n\t * @method\n\t * @return {string}\n\t */\n\tgetCompletionType() {\n\t\tvar hasGroupIds = this.has('groupIds'),\n\t\t\thasUserIds = this.has('userIds');\n\n\t\t// Will need to rework when we support the email selector\n\t\tif (hasGroupIds && hasUserIds) {\n\t\t\treturn 'userOrGroup';\n\t\t}\n\t\tif (hasGroupIds) {\n\t\t\treturn 'group';\n\t\t}\n\t\tif (hasUserIds) {\n\t\t\treturn 'user';\n\t\t}\n\n\t\treturn '';\n\t}\n\n\t/**\n\t * Will return an object of all changed data or false\n\t * @method\n\t * @return {boolean|object}\n\t */\n\tgetChanges() {\n\t\tvar changes = {},\n\t\t\tuserSelector = this.userSelectorObject;\n\n\t\t// All selection\n\t\tif (this.has('all') && this.get('all') !== userSelector.all) {\n\t\t\tchanges.all = this.get('all');\n\t\t}\n\t\t// Group selection\n\t\tif (\n\t\t\tthis.has('groupIds') &&\n\t\t\tuserSelector.groupIds.join() !== this.get('groupIds').join()\n\t\t) {\n\t\t\tchanges.groupIds = this.get('groupIds');\n\t\t}\n\t\t// User selection\n\t\tif (\n\t\t\tthis.has('userIds') &&\n\t\t\tuserSelector.userIds.join() !== this.get('userIds').join()\n\t\t) {\n\t\t\tchanges.userIds = this.get('userIds');\n\t\t}\n\t\t// None selection (?)\n\t\tif (this.has('none') && this.get('none') !== userSelector.none) {\n\t\t\tchanges.none = this.get('none');\n\t\t}\n\t\treturn !_.isEmpty(changes) ? changes : false;\n\t}\n\n\t/**\n\t * @param {number} id Member id\n\t * @param {string} type Member type\n\t * @return {Netx.Model}\n\t */\n\tgetMember(id, type) {\n\t\treturn this.selectorMembers.getMember(id, type);\n\t}\n\n\t/**\n\t * @method\n\t * @return {array}\n\t */\n\tids() {\n\t\treturn this.selectorMembers.ids();\n\t}\n\n\t/**\n\t * Provided a userSelector object will test if it matches\n\t * this `userSelector`\n\t * @method\n\t * @param {object} userSelector User selector\n\t * @return {boolean} Matches\n\t */\n\tmatches(userSelector) {\n\t\tif (userSelector instanceof this.constructor) {\n\t\t\tuserSelector = userSelector.self();\n\t\t}\n\n\t\tvar all = this.has('all') && this.get('all') === true,\n\t\t\tnone = this.has('none') && this.get('none') === true;\n\n\t\treturn (\n\t\t\tuserSelector.all === all &&\n\t\t\tuserSelector.none === none &&\n\t\t\t(userSelector.emails || []).join() ===\n\t\t\t\t(this.get('emails') || []).join() &&\n\t\t\t(userSelector.groupIds || []).join() ===\n\t\t\t\t(this.get('groupIds') || []).join() &&\n\t\t\t(userSelector.userIds || []).join() === (this.get('userIds') || []).join()\n\t\t);\n\t}\n\n\t/**\n\t * @param {number} id Member id\n\t * @param {string} type Member type\n\t */\n\tremoveMember(id, type) {\n\t\treturn this.selectorMembers.removeMember(id, type);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} userSelectorObject User selector object\n\t * @param {object} opts Options\n\t */\n\treset(userSelectorObject, opts) {\n\t\tthis.userSelectorObject = userSelectorObject || this.userSelectorObject;\n\t\tthis.set(this.userSelectorObject, opts);\n\t\treturn this.selectorMembers.resetUserSelector(this, opts);\n\t}\n\n\t/**\n\t * @method\n\t */\n\tselectAll() {\n\t\treturn this.set('all', true);\n\t}\n\n\t/**\n\t * @param {number} id Member id\n\t * @param {string} type Member type\n\t */\n\ttoggleMember(id, type) {\n\t\t// Define variables\n\t\tvar member = this.getMember(id, type);\n\t\t// Is the user already attached to this permission - remove it\n\t\tif (member) {\n\t\t\treturn this.removeMember(id, type);\n\t\t}\n\t\t// If not add the user to the permission\n\t\tif (id) {\n\t\t\treturn this.addMember(id, type);\n\t\t}\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'UserSelector';\n\t}\n}\n","/**\n * A single project that contains a collection of project `reviews`\n * @class\n */\nimport Base from '@netx/core-share/models/sharedResource';\n\nimport AssetProjectReviewsCollection from '../collections/projectReviews';\nimport ProjectParticipantsCollection from '../collections/projectParticipants';\nimport UserSelectorModel from '@netx/core-user/models/userSelector';\n\nimport {approvalModes, status as projectStatuses} from '../properties/projects';\n\nexport default class Project extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * Room name for websocket subscription\n\t * @type {string}\n\t */\n\tget roomName() {\n\t\treturn `PROJECT_${this.id}`;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @property {object} defaults - Model defaults\n\t * @property {object} defaults.approvers - Project's user selector of approvers\n\t * @property {string} defaults.approvalMode - Project approval mode (any/all/none)\n\t * @property {string} defaults.creationDate - Project creation date\n\t * @property {number} defaults.creationUser - Project creation user\n\t * @property {string} defaults.description - Project description\n\t * @property {string} defaults.dueDate - Project expiration date\n\t * @property {boolean} defaults.hasApprovers - Project has approvers\n\t * @property {boolean} defaults.hasDecisions - Project has decisions\n\t * @property {string} defaults.modDate - Project last modification date\n\t * @property {string} defaults.modUser - Project last modifying user\n\t * @property {string} defaults.status - Project's current status\n\t * @property {string} defaults.title - Project title\n\t */\n\tget defaults() {\n\t\tconst userId = Netx.getUser().id;\n\t\treturn _.extend(super.defaults, {\n\t\t\t// id: 0,\n\t\t\tapprovalMode: 'none',\n\t\t\tapprovers: {\n\t\t\t\tall: false,\n\t\t\t\temails: [],\n\t\t\t\tgroupIds: [],\n\t\t\t\tnone: false,\n\t\t\t\tuserIds: [],\n\t\t\t},\n\t\t\tcreationDate: '',\n\t\t\tcreationUser: userId,\n\t\t\tdescription: '',\n\t\t\tdueDate: '',\n\t\t\thasApprovers: false,\n\t\t\thasDecisions: false,\n\t\t\tmodDate: '',\n\t\t\tmodUser: userId,\n\t\t\tstatus: 'open',\n\t\t\ttitle: '',\n\t\t});\n\t}\n\n\t/**\n\t * @property {object} methods - Model methods\n\t * @property {method} methods.create - Create new project from asset ids or cart id\n\t * @property {method} methods.read - Fetch project\n\t * @property {method} methods.remove - Delete project\n\t * @property {method} methods.update - Update existing project\n\t * @property {method} methods.addAssetsToProject - Add assets to existing project\n\t * @property {method} methods.deleteAssetsFromProject - Remove assets fromexisting project\n\t */\n\tget methods() {\n\t\treturn _.extend(super.methods, {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate(opts) {\n\t\t\t\tif (!this.assetIds) {\n\t\t\t\t\t// && this.cartId == null) {\n\t\t\t\t\treturn new $.Deferred().reject(\n\t\t\t\t\t\tnew Error('cartId or assetIds required'),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// if (this.cartId != null) {\n\t\t\t\t// \treturn ['createProjectFromCartAssets', this.self(), this.cartId];\n\t\t\t\t// }\n\t\t\t\treturn ['createProjectFromAssets', this.self(), this.assetIds];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t */\n\t\t\tfetchBean: ['getProject', 'id'],\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tremove(opts) {\n\t\t\t\treturn ['deleteProject', this.id];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdate(opts) {\n\t\t\t\treturn this.updateProject(opts).then((project, opts) => {\n\t\t\t\t\t// Due to the fractured nature of a shared resource vs a project bean\n\t\t\t\t\treturn this.participants.fetch(opts).then(participants => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tparticipantCount: participants.length,\n\t\t\t\t\t\t\t...project,\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {array} assetIds Asset ids\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\taddAssetsToProject(assetIds, opts) {\n\t\t\t\treturn ['addAssetsToProject', assetIds, this.id];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {array} assetIds Asset ids\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tdeleteAssetsFromProject(assetIds, opts) {\n\t\t\t\treturn ['deleteAssetsFromProject', assetIds, this.id];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdateProject(opts) {\n\t\t\t\treturn ['updateProject', this.self()];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {string} status Status\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdateProjectStatus(status, opts) {\n\t\t\t\tif (projectStatuses[status] == null) {\n\t\t\t\t\treturn new $.Deferred().reject(\n\t\t\t\t\t\tnew Error('Unknow status `' + status + '`'),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn ['updateProjectStatus', this.id, status];\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @property {object} parsers - Model parsers\n\t * @property {function} parsers.addAssetsToProject - Parse add assets\n\t * @property {function} parsers.deleteAssetsFromProject - Parse remove assets\n\t */\n\tget parsers() {\n\t\treturn _.extend(super.parsers, {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {object} project Project\n\t\t\t * @param {array} assetIds Asset ids\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\taddAssetsToProject(project, assetIds, opts) {\n\t\t\t\tthis.syncedOnce && this.fetch(opts);\n\t\t\t\treturn project;\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {object} project Project\n\t\t\t * @param {array} assetIds Asset ids\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tdeleteAssetsFromProject(project, assetIds, opts) {\n\t\t\t\tthis.syncedOnce && this.fetch(opts);\n\t\t\t\treturn project;\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {object} project Project\n\t\t\t * @param {string} status Status\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdateProjectStatus(project, status, opts) {\n\t\t\t\tthis.set(project);\n\t\t\t\treturn project;\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {opts} Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\t/**\n\t\t * Resource type name\n\t\t * @type {string}\n\t\t */\n\t\topts.resourceName = 'project';\n\n\t\t// We have special needs for our participants\n\t\topts.participants = ProjectParticipantsCollection;\n\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * @memberof module:project/models/project\n\t\t * @alias reviews\n\t\t * @type {module:project/collections/projectReviews}\n\t\t */\n\t\tthis.reviews = new AssetProjectReviewsCollection([], {\n\t\t\tproject: this,\n\t\t\t...opts.reviews,\n\t\t});\n\t\tthis.addSubCollection(this.reviews);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'sync', this.subscribe);\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} assetIds Asset ids\n\t * @param {object} opts Request options\n\t */\n\taddAssets(assetIds, opts) {\n\t\treturn this.addAssetsToProject.apply(this, arguments);\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean} Can decide\n\t */\n\tcanMakeDecision() {\n\t\treturn (\n\t\t\tthis.isOpen() &&\n\t\t\tthis.get('hasApprovers') === true &&\n\t\t\t_.contains(this.get('approvers').userIds, Netx.getUser().id)\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean} Can modify approval mode\n\t */\n\tcanModifyApprovalMode() {\n\t\treturn this.get('hasDecisions') === false;\n\t}\n\n\t/**\n\t * @method\n\t * @return {module:project/models/projectReview} Review\n\t */\n\tgetActiveReview() {\n\t\treturn this.reviews.getActive();\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} opts Request options\n\t * @return {object} Approvers\n\t */\n\tgetApprovers(opts) {\n\t\tconst approvers = this.get('approvers');\n\t\t// Only users for now\n\t\treturn {\n\t\t\tuserIds: approvers.userIds ? approvers.userIds.slice(0) : [],\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} opts Request options\n\t */\n\tgetParticipants(opts = {}) {\n\t\topts.approvers = this.get('approvers');\n\n\t\treturn super.getParticipants(opts);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} reviewId Review id\n\t * @param {object} opts Request options\n\t */\n\tgetReviews(reviewId, opts) {\n\t\treturn this.reviews.fetch(\n\t\t\t_.extend(opts || {}, {\n\t\t\t\tstartId: parseInt(reviewId) || null,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @return {object} Approvers\n\t */\n\tgetUserSelector() {\n\t\t// We only support user ids for now\n\t\treturn _.pick(this.get('approvers'), 'userIds');\n\t}\n\n\t/**\n\t * Is project `status` closed?\n\t * @method\n\t * @return {boolean} Is closed\n\t */\n\tisClosed() {\n\t\treturn this.get('status') === 'closed';\n\t}\n\n\t/**\n\t * Is project `status` open?\n\t * @method\n\t * @return {boolean} Is open\n\t */\n\tisOpen() {\n\t\treturn this.get('status') === 'open';\n\t}\n\n\t/**\n\t * @method\n\t * @return {module:project/models/projectReview} Review\n\t */\n\tnextReview() {\n\t\treturn this.reviews.nextReview();\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} data Data\n\t * @param {object} opts Request options\n\t * @fires module:user#user:prefs:set\n\t */\n\tparseAndSave(data, opts) {\n\t\t// Store users desired approval mode for future creation\n\t\t// Per DAM-13308\n\t\t// if (\n\t\t// \tdata.approvalMode != null &&\n\t\t// \tapprovalModes[ data.approvalMode ] != null\n\t\t// ) {\n\t\t// \tNetx.setPreference('project.approvalMode', data.approvalMode );\n\t\t// }\n\n\t\tlet approvers = data.approvers;\n\t\tif (approvers) {\n\t\t\tconst approvalMode = this.get('approvalMode');\n\t\t\tconst approverCount = (approvers.userIds || []).length;\n\n\t\t\t// Only users for now\n\t\t\tapprovers = data.approvers = {\n\t\t\t\tall: false,\n\t\t\t\temails: null,\n\t\t\t\tgroupIds: null,\n\t\t\t\tnone: false,\n\t\t\t\tuserIds: approvers.userIds || [],\n\t\t\t};\n\n\t\t\t// Per DAM-13308\n\t\t\t// Set the mode based on sytem property\n\t\t\tif (approvalMode === 'none' && approverCount) {\n\t\t\t\tdata.approvalMode = Netx.getPreference(\n\t\t\t\t\t'review.approval.requireAll',\n\t\t\t\t\ttrue,\n\t\t\t\t)\n\t\t\t\t\t? 'all'\n\t\t\t\t\t: 'any';\n\t\t\t} else if (!approverCount) {\n\t\t\t\tdata.approvalMode = 'none';\n\t\t\t}\n\t\t}\n\n\t\t// Check that we can modify approval mode and if so that we are\n\t\t// setting a valid mode\n\t\tif (\n\t\t\tdata.approvalMode &&\n\t\t\t(!this.canModifyApprovalMode() ||\n\t\t\t\tapprovalModes[data.approvalMode] == null)\n\t\t) {\n\t\t\tdelete data.approvalMode;\n\t\t}\n\n\t\treturn this.save(\n\t\t\t_.pick.apply(_, [data].concat(_.keys(this.constructor.GetDefaults()))),\n\t\t\t_.extend({wait: true}, opts),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @return {module:project/models/projectReview} Review\n\t */\n\tpreviousReview() {\n\t\treturn this.reviews.previousReview();\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} assetIds Asset ids\n\t * @param {object} opts Request options\n\t */\n\tremoveAssets(assetIds, opts) {\n\t\treturn this.deleteAssetsFromProject.apply(this, arguments);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} id Review id\n\t * @return {module:project/models/projectReview} Review\n\t */\n\tselectReview(id) {\n\t\treturn this.reviews.selectReview(id);\n\t}\n\n\t/** @override */\n\tset(key, val, opts) {\n\t\tif (key == null) return this;\n\n\t\t// Handle both `\"key\", value` and `{key: value}` -style arguments.\n\t\tlet attrs;\n\t\tif (typeof key === 'object') {\n\t\t\tattrs = key;\n\t\t\topts = val;\n\t\t} else {\n\t\t\t(attrs = {})[key] = val;\n\t\t}\n\n\t\topts || (opts = {});\n\n\t\tlet approversChanged = false;\n\t\tif (attrs.approvers) {\n\t\t\tconst oldApprovers = this.get('approvers');\n\t\t\tif (oldApprovers) {\n\t\t\t\tapproversChanged =\n\t\t\t\t\tattrs.approvers.userIds.join() !==\n\t\t\t\t\t(oldApprovers.userIds || []).join();\n\t\t\t\t// Blow it out so that we can get a change event from backbone on this object\n\t\t\t\tif (approversChanged) {\n\t\t\t\t\tthis.attributes.approvers = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn super.set(attrs, opts);\n\t}\n\n\t/**\n\t * @override\n\t */\n\tunsubscribe() {\n\t\tthis.reviews.unsubscribe();\n\t\treturn super.unsubscribe();\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Project';\n\t}\n}\n","/**\n * Collection of `projects`\n * A standard `fetch` will populate it with {@link module:share/models/sharedResource} data\n * @class\n */\nimport Base from '@netx/core-share/collections/sharedResources';\nimport Model from '../models/project';\n\nexport default class Projects extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget preferredFetchMethod() {\n\t\treturn 'fetchBeansForUser';\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetAllProjects: 'Loading reviews',\n\t\t\tgetProjectsForAsset: 'Loading reviews for asset',\n\t\t\tgetProjectsForUser: 'Loading reviews',\n\t\t};\n\t}\n\n\t/** @type {object}*/\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetAllProjects: 'Loaded reviews',\n\t\t\tgetProjectsForAsset: 'Loading reviews for asset',\n\t\t\tgetProjectsForUser: 'Loaded reviews',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Collection methods\n\t * @property {method} methods.fetchBeans - Fetch project beans\n\t * @property {method} methods.fetchBeansForUser - Fetch project beans for user\n\t * @property {method} methods.getProjectsForAsset - Fetch project beans for asset\n\t */\n\tget methods() {\n\t\treturn _.extend(super.methods, {\n\t\t\t/**\n\t\t\t * A `pageListDTO` `read` for all projects (admin only)\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeans(opts) {\n\t\t\t\t// If not an admin, send to the user specific call\n\t\t\t\tif (Netx.getUserLevel() < 9) return this.fetchBeansForUser();\n\n\t\t\t\treturn [\n\t\t\t\t\t'getAllProjects',\n\t\t\t\t\tthis.filterStr,\n\t\t\t\t\tthis.sorter.getSortDTO(),\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * A `pageListDTO` `read` for all projects pertaining to a specific user\n\t\t\t * @method\n\t\t\t * @param {number} userId User id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeansForUser(userId, opts) {\n\t\t\t\tvar currentUser = Netx.getUser();\n\t\t\t\tuserId =\n\t\t\t\t\tuserId == null || currentUser.get('type') < 9\n\t\t\t\t\t\t? currentUser.id\n\t\t\t\t\t\t: userId;\n\n\t\t\t\treturn [\n\t\t\t\t\t'getProjectsForUser',\n\t\t\t\t\tuserId,\n\t\t\t\t\tthis.filterStr,\n\t\t\t\t\tthis.sorter.getSortDTO(),\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t\t/**\n\t\t\t * A `read` for a particular asset\n\t\t\t * @method\n\t\t\t * @param {number} assetId Asset id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tgetProjectsForAsset(assetId, opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'getProjectsForAsset',\n\t\t\t\t\tassetId,\n\t\t\t\t\tthis.sorter.getSortDTO(),\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {function} parsers.fetchBeans - Parse fetch results\n\t * @property {function} parsers.fetchBeansForUser - Parse fetch results\n\t * @property {function} parsers.getProjectsForAsset - Parse fetch results\n\t */\n\tget parsers() {\n\t\treturn _.extend(super.parsers, {\n\t\t\t/**\n\t\t\t * A `pageListDTO` `read` for all projects (admin only)\n\t\t\t * @function\n\t\t\t * @param {array} data Projects data\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeans(data, opts) {\n\t\t\t\tthis.set(data, _.extend({merge: true}, opts));\n\t\t\t\t!opts.silent && this.trigger('sync', this, data, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * A `pageListDTO` `read` for all projects pertaining to a specific user\n\t\t\t * @function\n\t\t\t * @param {array} data Projects data\n\t\t\t * @param {number} userId User id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tfetchBeansForUser(data, userId, opts) {\n\t\t\t\tthis.set(data, _.extend({merge: true}, opts));\n\t\t\t\t!opts.silent && this.trigger('sync', this, data, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * A `read` for a particular asset\n\t\t\t * @function\n\t\t\t * @param {array} data Projects data\n\t\t\t * @param {number} assetId Asset id\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tgetProjectsForAsset(data, assetId, opts) {\n\t\t\t\tthis.set(data, opts);\n\t\t\t\t!opts.silent && this.trigger('sync', this, data, opts);\n\t\t\t},\n\t\t});\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\topts.resourceName = opts.resourceName || 'project';\n\t\topts.sortField = opts.sortField || 'creationDate';\n\n\t\tsuper(models, opts);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tthis,\n\t\t\t[\n\t\t\t\t'request:fetchBeans',\n\t\t\t\t'request:fetchBeansForUser',\n\t\t\t\t'request:getProjectsForAsset',\n\t\t\t].join(' '),\n\t\t\t(collection, xhr, opts) => {\n\t\t\t\tthis.trigger('request:read', this, xhr, opts);\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} projectIds Project ids\n\t * @param {array} assetIds Asset ids\n\t * @return {module:project/collections/projects} Projects\n\t */\n\taddAssets(projectIds, assetIds) {\n\t\tif (!projectIds || !projectIds.length) return new $.Deferred().resolve([]);\n\n\t\t// No sense in hitting the server over and over again if there is an error adding the assets to\n\t\t// any project\n\t\tconst firstId = projectIds[0];\n\t\tconst restIds = projectIds.slice(1) || [];\n\n\t\tconst projects = [];\n\n\t\tconst project = new Model({id: firstId});\n\t\tprojects.push(project);\n\n\t\treturn project.addAssetsToProject(assetIds).then(() => {\n\t\t\t// Now that that was successful, send to the rest\n\t\t\treturn Promise.all(\n\t\t\t\trestIds.map(id => {\n\t\t\t\t\tconst project = new Model({id: id});\n\t\t\t\t\tprojects.push(project);\n\t\t\t\t\treturn project.addAssetsToProject(assetIds);\n\t\t\t\t}),\n\t\t\t).then(() => {\n\t\t\t\treturn new this.constructor(projects);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} projects Project objects\n\t * @param {array} assetIds Asset ids\n\t * @param {object} opts Options\n\t */\n\tcreateNewProjects(projects, assetIds, opts = {}) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!projects || !projects.length) resolve([]);\n\n\t\t\tconst newProjects = [];\n\t\t\t// Save each group after the other has completed to avoid data locks on the server\n\t\t\tconst next = () => {\n\t\t\t\tif (!projects.length) return resolve(newProjects);\n\n\t\t\t\tconst project = new Model(projects.shift());\n\t\t\t\tproject.assetIds = assetIds;\n\t\t\t\tproject.parseAndSave(opts).then(() => {\n\t\t\t\t\tnewProjects.push(project);\n\t\t\t\t\tnext();\n\t\t\t\t}, reject);\n\t\t\t};\n\n\t\t\tnext();\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Projects';\n\t}\n}\n","/**\n * @class\n */\nimport Base from './asset';\n\n// Collections\nimport AssetsCollection from '../collections/assets';\nimport AssetAttributeDatumCollection from '../collections/assetAttributeDatum';\nimport AssetIndexCollection from '../collections/assetIndex';\nimport AssetMetadataCollection from '../collections/assetMetadata';\nimport AssetPermissionsCollection from '@netx/core-permissions/collections/assetPermissions';\nimport AssetUsageCollection from '../collections/assetUsage';\nimport AssetVersionsCollection from '../collections/assetVersions';\nimport AssetViewsCollection from '../collections/assetViews';\nimport AttributeHistoryCollection from '../collections/assetAttributeHistory';\nimport CategoriesCollection from '@netx/core-category/collections/categories';\nimport ProjectReviewsCollection from '@netx/core-project/collections/projectReviews';\nimport ProjectsCollection from '@netx/core-project/collections/projects';\n\nimport customConfig from '../config';\n\nexport default class CurrentAsset extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attr Model attributes\n\t * @param {object} opts Model options\n\t * @listens module:asset#asset:constituent:choose:succeeded\n\t * @listens module:asset#asset:task:complete\n\t * @listens module:asset#asset:reimport:succeeded\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * @memberof module:asset/models/currentAsset\n\t\t * @alias attributeDatum\n\t\t * @type {module:asset/collections/attributeDatum}\n\t\t */\n\t\tthis.assetAttributeDatum = new AssetAttributeDatumCollection([]);\n\t\tthis.addSubCollection(this.assetAttributeDatum);\n\n\t\tif (Netx.getPreference('metadata.history.enabled', true)) {\n\t\t\t/**\n\t\t\t * @memberof module:asset/models/currentAsset\n\t\t\t * @alias attributeHistory\n\t\t\t * @type {module:asset/collections/attributeHistory}\n\t\t\t */\n\t\t\tthis.attributeHistory = new AttributeHistoryCollection([]);\n\t\t}\n\n\t\t/**\n\t\t * @memberof module:asset/models/currentAsset\n\t\t * @alias categories\n\t\t * @type {module:category/collections/categories}\n\t\t */\n\t\tthis.categories = new CategoriesCollection([]);\n\n\t\t/**\n\t\t * @memberof module:asset/models/currentAsset\n\t\t * @alias indices\n\t\t * @type {module:asset/collections/assetIndex}\n\t\t */\n\t\tthis.indices = new AssetIndexCollection([]);\n\n\t\t/**\n\t\t * @memberof module:asset/models/currentAsset\n\t\t * @alias links\n\t\t * @type {module:asset/collections/assets}\n\t\t */\n\t\tthis.links = new AssetsCollection([], {\n\t\t\tchunkSize: customConfig.CHUNK_SIZE,\n\t\t\tpageSize: customConfig.CHUNK_SIZE,\n\t\t\tpagerRoutes: false,\n\t\t});\n\n\t\t/**\n\t\t * @memberof module:asset/models/currentAsset\n\t\t * @alias metadata\n\t\t * @type {module:asset/collections/assetMetadata}\n\t\t */\n\t\tthis.metadata = new AssetMetadataCollection([]);\n\n\t\t/**\n\t\t * @memberof module:asset/models/currentAsset\n\t\t * @alias permissions\n\t\t * @type {module:permissions/collections/assetPermissions}\n\t\t */\n\t\tthis.permissions = new AssetPermissionsCollection([], {target: this});\n\n\t\tif (Netx.getPreference('review.enabled', true)) {\n\t\t\t/**\n\t\t\t * @memberof module:asset/models/currentAsset\n\t\t\t * @alias projects\n\t\t\t * @type {module:project/collections/projects}\n\t\t\t */\n\t\t\tthis.projects = new ProjectsCollection();\n\n\t\t\t/**\n\t\t\t * @memberof module:asset/models/currentAsset\n\t\t\t * @alias reviews\n\t\t\t * @type {module:project/collections/projectReviews}\n\t\t\t */\n\t\t\tthis.reviews = new ProjectReviewsCollection();\n\t\t}\n\n\t\t/**\n\t\t * @memberof module:asset/models/currentAsset\n\t\t * @alias usage\n\t\t * @type {module:asset/collections/assetUsage}\n\t\t */\n\t\tthis.usage = new AssetUsageCollection([]);\n\n\t\t/**\n\t\t * @memberof module:asset/models/currentAsset\n\t\t * @alias versions\n\t\t * @type {module:asset/collections/assetVersions}\n\t\t */\n\t\tthis.versions = new AssetVersionsCollection([]);\n\n\t\t/**\n\t\t * @memberof module:asset/models/currentAsset\n\t\t * @alias views\n\t\t * @type {module:asset/collections/assetViews}\n\t\t */\n\t\tthis.views = new AssetViewsCollection([]);\n\n\t\t// Hey, listen!\n\t\tthis\n\t\t\t// Once attribute datum is saved - update our bean as well\n\t\t\t.listenTo(\n\t\t\t\tthis.assetAttributeDatum,\n\t\t\t\t'complete',\n\t\t\t\t(collection, data, opts) => {\n\t\t\t\t\tcollection.length &&\n\t\t\t\t\t\tcollection.at(0).attributeDatum.each((attrData) => {\n\t\t\t\t\t\t\tthis.setAttribute(attrData.id, attrData.getValue());\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t)\n\t\t\t// We keep a currently-selected view as a property of the assetViews collection;\n\t\t\t// whenever views are synced, check that is still legit; otherwise clear it.\n\t\t\t.listenTo(this.views, 'sync', (views) => {\n\t\t\t\tif (views !== this.views || !views.selectedView) return;\n\n\t\t\t\tconst selectedViewId = views.selectedView.get('viewid');\n\t\t\t\tif (!views.find((model) => model.get('viewId') == selectedViewId)) {\n\t\t\t\t\tviews.selectedView = undefined;\n\t\t\t\t}\n\t\t\t})\n\t\t\t// A bulk attribute edit on the cart occurred\n\t\t\t.listenTo(dispatcher, 'asset:attributes:bulk:edit:succeeded', (data) => {\n\t\t\t\tif (!this.get('inCurrentCart')) return;\n\n\t\t\t\tthis.fetch({duplicateQueryPolicy: 'merge'});\n\t\t\t})\n\t\t\t// Version actions rely heavily on the current asset\n\t\t\t// need to address in our actions refactor\n\t\t\t.listenTo(dispatcher, 'asset:checkout:success', (asset) => {\n\t\t\t\tif (asset.id !== this.id || !this.versions.syncedOnce) return;\n\t\t\t\tthis.fetchVersions();\n\t\t\t})\n\t\t\t.listenTo(dispatcher, 'asset:editor:edited', (assetId) => {\n\t\t\t\tif (this.id !== assetId) return;\n\t\t\t\tthis.fetch();\n\t\t\t})\n\t\t\t.listenTo(this, 'sync', () => {\n\t\t\t\tif (!this.versions.syncedOnce) return;\n\t\t\t\tthis.fetchVersions();\n\t\t\t})\n\t\t\t// Sine we get attributes permissions from the server, we must refetch attributes\n\t\t\t// when the readOnly state changes\n\t\t\t.listenTo(this, 'change:readOnly', () => {\n\t\t\t\t// TODO: we need to refetch in the context when the asset changes to readOnly\n\t\t\t\tif (!this.assetAttributeDatum.syncedOnce) return;\n\t\t\t\t// this.fetchAttributes();\n\t\t\t})\n\t\t\t// New constituent chosen\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'asset:constituent:choose:succeeded',\n\t\t\t\t(constituent, assetId) => {\n\t\t\t\t\tif (constituent.get('assetId') != this.id) return;\n\t\t\t\t\t// HACK around DAM-2347: the asset isn't getting updated fast enough to be useful (Solr delays?),\n\t\t\t\t\t// so fake a new timestamp instead.\n\t\t\t\t\tthis.fetch({duplicateQueryPolicy: 'merge'}).then(() => {\n\t\t\t\t\t\tthis.set('moddate', _.dateToAsset(new Date()));\n\t\t\t\t\t\t// refresh the preview image\n\t\t\t\t\t\tthis.trigger('previewChanged', this);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t)\n\t\t\t// Assets were resynced\n\t\t\t.listenTo(dispatcher, 'asset:resynced', (assetId) => {\n\t\t\t\tif (this.id !== assetId) return;\n\n\t\t\t\tthis.fetch({duplicateQueryPolicy: 'abort'});\n\t\t\t})\n\t\t\t// Tasks have completed on an asset\n\t\t\t.listenTo(dispatcher, 'asset:task:complete', (task) => {\n\t\t\t\tif (this.id !== task.id) return;\n\n\t\t\t\tthis.fetch({duplicateQueryPolicy: 'merge'});\n\t\t\t})\n\t\t\t// Permissions updated\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'permissions:asset:delete:success permissions:asset:edit:success',\n\t\t\t\tthis.permissionUpdated,\n\t\t\t)\n\t\t\t// Permissions updated\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'permissions:asset:delete:success permissions:asset:edit:success',\n\t\t\t\tthis.permissionUpdated,\n\t\t\t)\n\t\t\t// When we reactive an existing version\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'asset:versions:reactivate:success',\n\t\t\t\t(newVersion) => {\n\t\t\t\t\tconst oldVersion = this.versions.find(\n\t\t\t\t\t\t(version) =>\n\t\t\t\t\t\t\tversion.id !== newVersion.id && version.get('original') === 1,\n\t\t\t\t\t);\n\t\t\t\t\toldVersion && oldVersion.set('original', 0);\n\t\t\t\t\tnewVersion.set({original: 1});\n\t\t\t\t},\n\t\t\t)\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'cart:delink:succeeded cart:link:succeeded',\n\t\t\t\t(cart, assetIds) => {\n\t\t\t\t\tif (!assetIds.includes(this.id)) return;\n\t\t\t\t\tthis.fetch({duplicateQueryPolicy: 'abort'});\n\t\t\t\t},\n\t\t\t)\n\t\t\t// Asset progress reimporting\n\t\t\t.listenTo(dispatcher, 'upload:reimport:progress', (progressOb) => {\n\t\t\t\tif (progressOb.assetId === this.id) {\n\t\t\t\t\tthis.progress.set(progressOb);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'upload:asset:reimport:error',\n\t\t\t\t(err, uploadModel, asset) => {\n\t\t\t\t\tif (asset?.id === this.id) {\n\t\t\t\t\t\tthis.progress.reset();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t)\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'asset:category:moved',\n\t\t\t\t(assetId, fromCatId, toCatId) => {\n\t\t\t\t\tif (assetId !== this.id) return;\n\t\t\t\t\tthis.fetch({duplicateQueryPolicy: 'abort'}).then(() => {\n\t\t\t\t\t\tthis.fetchCategories();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchAttributeHistory(opts) {\n\t\tconst attributeHistory = this.attributeHistory;\n\n\t\tif (!attributeHistory) return;\n\n\t\tattributeHistory.assetId = this.id;\n\t\treturn attributeHistory.fetch(\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchCategories(opts) {\n\t\tconst categories = this.categories;\n\n\t\tconst newCatArr = this.get('categories');\n\t\tconst oldCatArr = categories.pluck(categories.model.prototype.idAttribute);\n\n\t\tif (\n\t\t\tcategories.assetId === this.id &&\n\t\t\t// See note in categories collection about the property `ids`\n\t\t\t!_.difference(newCatArr, oldCatArr).length &&\n\t\t\t// the above works for remove, below works for adding\n\t\t\t!_.difference(oldCatArr, newCatArr).length\n\t\t) {\n\t\t\treturn new $.Deferred().resolveWith(categories);\n\t\t}\n\n\t\tcategories.assetId = this.id;\n\t\treturn categories.getCategoriesById(\n\t\t\tthis.get('categories'),\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tasset: this,\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchIndices(opts) {\n\t\tconst indices = this.indices;\n\n\t\tindices.assetId = this.id;\n\t\treturn indices.fetch(\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchLinks(opts) {\n\t\tconst links = this.links;\n\n\t\tif (this.get('relatedAvailable') !== true) {\n\t\t\tlinks.reset();\n\t\t\treturn new $.Deferred().resolveWith(links);\n\t\t}\n\n\t\tif (links.selection.at(0).get('elementValue1') !== this.id) {\n\t\t\t// Reset current page\n\t\t\tlinks.curPage = 1;\n\t\t\t// linked assets are obtained with a selection/search parameter:\n\t\t\tlinks.selection.set([\n\t\t\t\t{\n\t\t\t\t\telementValue1: this.id, // find assets linked to this one.\n\t\t\t\t\telementType: 11, // search type == \"linked assets\"\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\treturn links.fetch(\n\t\t\t\t_.extend(\n\t\t\t\t\t{\n\t\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\t\treset: true,\n\t\t\t\t\t},\n\t\t\t\t\topts,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchMetadata(opts) {\n\t\tconst metadata = this.metadata;\n\n\t\tmetadata.assetId = this.id;\n\t\treturn metadata.fetch(\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchPermissions(opts) {\n\t\treturn this.permissions.fetch(\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchProjects(opts) {\n\t\tconst projects = this.projects;\n\t\tif (!projects) return;\n\n\t\treturn projects.getProjectsForAsset(\n\t\t\tthis.id,\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchReviews(opts) {\n\t\tconst reviews = this.reviews;\n\t\tif (!reviews) return;\n\n\t\treturn reviews.getReviewsForAsset(\n\t\t\tthis.id,\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchUsage(opts) {\n\t\tconst usage = this.usage;\n\n\t\tusage.assetId = this.id;\n\t\treturn usage.fetch(\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchVersions(opts) {\n\t\tconst versions = this.versions;\n\n\t\tif (!this.get('versionIds').length) {\n\t\t\tversions.reset();\n\t\t\treturn new $.Deferred().resolveWith(versions);\n\t\t}\n\n\t\tversions.assetId = this.id;\n\t\treturn versions.fetch(\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchViews(opts) {\n\t\tconst views = this.views;\n\t\tconst viewsCount = this.get('viewIds').length;\n\n\t\t// We used to check the length of views on the asset and if it was zero we did not bother fetching\n\t\t// which is great - except, there is no aborting any previous request that may still be lingering\n\t\t// I think the benefit of fetching irregardless of the size outweighs the cost the uneccessary fetch\n\t\tif (views.assetId === this.id && views.length === viewsCount) {\n\t\t\treturn new $.Deferred().resolveWith(views);\n\t\t}\n\n\t\tviews.assetId = this.id;\n\t\treturn views.fetch(\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\treset: true,\n\t\t\t\t},\n\t\t\t\topts,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {module:permissions/models/permission} permission Permission\n\t */\n\tpermissionUpdated(permission) {\n\t\tif (permission.get('targetId') !== this.id) return;\n\t\tthis.fetchPermissions();\n\t}\n\n\t/**\n\t * @method\n\t */\n\treset() {\n\t\treturn this.set({assetId: 0});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CurrentAsset';\n\t}\n}\n","/**\n * The asset cursor is a 2-asset collection which we use to page through a selection.\n * (We select one extra asset, for a total of two, in order to detect the end of the selection\n * before we hit it.) Asset cursor can be fetched by the pager event handlers\n * (which endeavor to shift the cursor left or right) or by asset:cursor:goto\n * (which endeavors to find a particular asset in the selection.)\n * @class\n */\nimport Base from './assets';\n\nimport SearchConstituentsCollection from '@netx/core-search/collections/searchConstituents';\n\nexport default class AssetCursor extends Base {\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetAssetObjects: 'Loading asset',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetAssetObjects: 'Loaded asset',\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * @memberOf Netx.Collections.AssetCursor\n\t\t * @alias currentAsset\n\t\t * @type {module:asset/models/asset}\n\t\t */\n\t\tthis.currentAsset = opts.currentAsset || Netx.asset.current;\n\n\t\t// Non-negotiable\n\t\tthis.chunkSize = this.pageSize = 1;\n\n\t\t/**\n\t\t * @memberOf Netx.Collections.AssetCursor\n\t\t * @alias cachedCollection\n\t\t * @type {Netx.Collections.Assets}\n\t\t */\n\t\tthis.cachedCollection = null;\n\t\topts.cachedCollection && this.cacheFetch(opts.cachedCollection);\n\n\t\t// Hey, listen!\n\t\tthis.stopListening(dispatcher, 'asset:editor:edited smartLabels:updated')\n\t\t\t// When we read, so does the current asset\n\t\t\t.listenTo(this, 'request:read', (collection, xhr, opts) => {\n\t\t\t\tthis.currentAsset.trigger('request:read', this.currentAsset, xhr, opts);\n\t\t\t})\n\t\t\t// When we sync, so does the current asset\n\t\t\t.listenTo(this, 'sync', (asset, response, opts) => {\n\t\t\t\tif (asset === this) {\n\t\t\t\t\tasset = asset.at(0);\n\t\t\t\t}\n\n\t\t\t\t// `this.goto` will set `expectedId` to make sure we don't go overboard if we can't find its asset.\n\t\t\t\tif (!asset || (this.expectedId !== asset.id && this.expectedId != null))\n\t\t\t\t\treturn;\n\n\t\t\t\tvar currentAsset = this.currentAsset;\n\n\t\t\t\t// update the current asset:\n\t\t\t\tcurrentAsset.set(asset.attributes);\n\n\t\t\t\t// record statistics on the DAM\n\t\t\t\tcurrentAsset.recordViewed();\n\t\t\t\tdispatcher.trigger('asset:current:updated');\n\n\t\t\t\t// Remove\n\t\t\t\tdelete this.expectedId;\n\n\t\t\t\t// We got the asset we expected and are updated\n\t\t\t\tthis.trigger('nx:asset:cursor:updated', this);\n\n\t\t\t\t// Do last. Otherwise the loading class does not go away when in this context\n\t\t\t\t// Notify listeners that the asset is in sync with the server version\n\t\t\t\tcurrentAsset.trigger('sync', currentAsset, response, opts);\n\t\t\t})\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t'cart:delete:succeeded',\n\t\t\t\t(currentCart, assetIds) => {\n\t\t\t\t\t// If deleted assets are in the cursor, refetch that.\n\t\t\t\t\tif (this.ids().some((id) => assetIds.includes(id))) {\n\t\t\t\t\t\tthis.fetch({duplicateQueryPolicy: 'abort'});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t}\n\n\t/** @override */\n\tsetStartPosition() {\n\t\tif (\n\t\t\tMath.abs(this.curPage - this.selection.startPosition) > 1 &&\n\t\t\tthis.pageSize === 1\n\t\t) {\n\t\t\tthis.curPage = this.selection.startPosition;\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.setStartPosition();\n\t}\n\n\t/** @override */\n\tuseFacetedSearch() {\n\t\t// Use the same facet options\n\t\treturn this.cachedCollection && this.cachedCollection.useFacetedSearch();\n\t}\n\n\t/**\n\t * @method\n\t * @param {Netx.Collections.Assets} collection Asset collection to cache\n\t */\n\tcacheFetch(collection) {\n\t\t// Reset so we do not get false cursor positives\n\t\tthis.reset([]);\n\t\tthis.curPage = 1;\n\n\t\t// We cannot support cursor on constituent collection (at least not currently)\n\t\tif (!collection || collection instanceof SearchConstituentsCollection) {\n\t\t\tthis.cachedCollection = null;\n\t\t\tthis.pager.clearPages();\n\t\t\treturn;\n\t\t}\n\n\t\tconst otherSelection = collection.selection;\n\t\t// Copy selection\n\t\t_.extend(\n\t\t\tthis.selection,\n\t\t\t_.pick(\n\t\t\t\totherSelection,\n\t\t\t\t'sortField',\n\t\t\t\t'sortOrder',\n\t\t\t\t'matchCriteria',\n\t\t\t\t'startPosition',\n\t\t\t),\n\t\t\t{\n\t\t\t\tmaxItems: this.chunkSize,\n\t\t\t\tsearchFacets: otherSelection.searchFacets,\n\t\t\t},\n\t\t);\n\t\tthis.selection.set(otherSelection.models);\n\n\t\t// Store the collection\n\t\tthis.cachedCollection = collection;\n\t\tthis.useFacetedSearch();\n\t}\n\n\t/**\n\t * @method\n\t * @param {number} assetId Asset id\n\t */\n\tgoto(assetId, forceSimple) {\n\t\tassetId = parseInt(assetId);\n\n\t\t// Already have the asset in the right spot for the cursor\n\t\tif (this.length && this.at(0).id == assetId) {\n\t\t\treturn new $.Deferred().resolve(this.models);\n\t\t}\n\n\t\tconst asset = this.cachedCollection && this.cachedCollection.get(assetId);\n\t\tconst idx = asset && this.cachedCollection.indexOf(asset);\n\n\t\tconst opts = {\n\t\t\tduplicateQueryPolicy: 'abort',\n\t\t};\n\n\t\t// Set start position\n\t\t// If we had an index in the cached collection, use that - otherwise, start at the beginning\n\t\tif (!_.isNull(idx) && idx >= 0) {\n\t\t\tthis.curPage = idx + 1;\n\t\t\tthis.selection.startPosition =\n\t\t\t\tthis.cachedCollection.selection.startPosition + idx;\n\t\t} else {\n\t\t\tthis.curPage = 1;\n\t\t\tthis.selection.startPosition = 1;\n\t\t}\n\n\t\tif (!this.cachedCollection || !this.cachedCollection.length) {\n\t\t\tforceSimple = true;\n\t\t}\n\n\t\tthis.expectedId = assetId;\n\t\tthis.setStartPosition();\n\t\treturn (\n\t\t\t(!forceSimple && this.fetch(opts)) ||\n\t\t\tthis.fetchSpecificAssets([assetId], opts)\n\t\t).then((assets) => {\n\t\t\treturn this;\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetCursor';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetRequest';\nimport PagerModel from '@netx/core-app/models/pager';\n\nexport default class AssetRequests extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetAssetRequests: 'Loading asset requests',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetAssetRequests: 'Loaded asset requests',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch all asset requests\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn ['getAssetRequests', this.pager.getPageDTO()];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {function} parsers.read - Parse the results of fetch\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} assetRequests Asset requests\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(assetRequests, opts) {\n\t\t\t\treturn _.compact(assetRequests);\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Paging model\n\t\t * @memberof Netx.Collections.AssetRequests\n\t\t * @alias pager\n\t\t * @type {Netx.Models.Pager}\n\t\t */\n\t\tthis.pager = new PagerModel(\n\t\t\t{pageSize: opts.pageSize || 20},\n\t\t\t{collection: this},\n\t\t);\n\n\t\t/** @type {string} */\n\t\tthis.routeContext = opts.routeContext || 'assets/requests';\n\n\t\t// Hey, listen!\n\t\t// An asset request has been created or modified\n\t\tthis.listenTo(dispatcher, 'asset:request:edit:success', (model, isNew) => {\n\t\t\t(isNew || !this.get(model.id)) && this.unshift(model);\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetRequests';\n\t}\n}\n","/**\n * AssetTaskList model\n * @class\n * @extends Netx.Model\n * @todo Document defaults, methods and parsers\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class AssetTaskList extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'assetId';\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {number} defaults.assetId - ID\n\t * @property {number} defaults.percentComplete - Percent complete\n\t * @property {array} defaults.tasks - Tasks queue\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t//assetId: 0,\n\t\t\tpercentComplete: 0,\n\t\t\ttasks: [],\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this model\n\t * @property {method} methods.read - Fetch task\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn ['getPendingTasks', [this.id], this.targetTask];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Parsers for this model\n\t * @property {method} parsers.read - Parse response of fetch\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {array} data Data\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(data, opts) {\n\t\t\t\treturn data[0];\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * Name of the task to request from server - null means \"all tasks\"\n\t\t * @memberof module:asset/models/assetTaskList\n\t\t * @alias targetTask\n\t\t * @type {string}\n\t\t */\n\t\tthis.targetTask = opts.targetTask || '';\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetTaskList';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetTaskList';\n\nimport appConfig from '@netx/core-app/config';\n\nimport * as onlineStatus from '@netx/core-components/hooks/useOnlineStatus';\n\nexport default class AssetTasks extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this model\n\t * @property {method} methods.read - Fetch tasks\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn ['getPendingTasks', this.ids(), this.targetTask];\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * null means \"all tasks\"\n\t\t * @type {string}\n\t\t */\n\t\tthis.targetTask = opts.targetTask || '';\n\n\t\tthis.trackTasks = this.trackTasks.bind(this);\n\t\tthis.triggerError = this.triggerError.bind(this);\n\t\tthis.onlineStatusChanged = this.onlineStatusChanged.bind(this);\n\n\t\tonlineStatus.on(this.onlineStatusChanged);\n\t}\n\n\tonlineStatusChanged(isOnline) {\n\t\tisOnline\n\t\t\t? this.ids().length && this.trackTasks()\n\t\t\t: this._polling && this.triggerError();\n\t}\n\n\tgarbageCollect() {\n\t\tonlineStatus.off(this.onlineStatusChanged);\n\t\tsuper.garbageCollect();\n\t}\n\n\t/**\n\t * @method\n\t */\n\ttrackTasks() {\n\t\tthis.pollUntil(\n\t\t\t(tasks) => {\n\t\t\t\t// Completed tasks\n\t\t\t\t_.each(this.getCompletedTasks(), _.bind(this.taskComplete, this));\n\n\t\t\t\t// Report percentages on all other tasks\n\t\t\t\tthis.each(_.bind(this.taskUpdated, this));\n\n\t\t\t\t// Keep going until collection is empty\n\t\t\t\treturn this.length === 0;\n\t\t\t},\n\t\t\tnull,\n\t\t\tnull,\n\t\t\tappConfig.POLL_INTERVAL || 1000,\n\t\t\t{remove: false},\n\t\t).then(this.triggerComplete, this.triggerError);\n\t}\n\n\t/**\n\t * @method\n\t * @return {array}\n\t */\n\tgetCompletedTasks() {\n\t\treturn this.filter(\n\t\t\t// as soon as ThumbnailTask isn't on the list...\n\t\t\t(task) =>\n\t\t\t\ttask.get('percentComplete') >= 100 &&\n\t\t\t\t!_.contains(task.get('tasks'), 'ThumbnailTask'),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {module:asset/models/assetTaskList}\n\t */\n\ttaskComplete(task) {\n\t\tthis.trigger('taskComplete', task);\n\t\tthis.remove(task);\n\t}\n\n\t/**\n\t * @method\n\t * @param {module:asset/models/assetTaskList}\n\t */\n\ttaskUpdated(task) {\n\t\tthis.trigger('taskStatus', task);\n\t}\n\n\t/**\n\t * @method\n\t */\n\ttriggerComplete() {\n\t\tthis.trigger('complete', this);\n\t}\n\n\t/**\n\t * @method\n\t */\n\ttriggerError() {\n\t\tthis._polling && this._polling.reject();\n\t\tthis._polling = false;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetTasks';\n\t}\n}\n","/**\n * This model defines the many-to-one mapping between a set of asset attribute templates and a single embedded metadata field.\n * Used by the embed-on-export feature of 8.11.\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport {map as syncMap} from '../properties/assetAttributesMetadata';\n\nexport default class MetadataMapLink extends Base {\n\t/**\n\t * The unique ID for this model:\n\t * In the meaning of our data this is \"schemaField\",\n\t * @type {string}\n\t */\n\tget idAttribute() {\n\t\treturn 'schemaField';\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {number} defaults.id - The server assigns this integer ID record to links.\n\t * @property {number} defaults.mappingId - ID of Map model containing this Link model. (The DAM needs this, but we can ignore it.)\n\t * @property {array} defaults.templateIds - Array of asset template IDs -- that is, the IDs of asset-flavored AttributeTemplates, as collected in Netx.asset.attributes.\n\t * @property {string} defaults.schemaField - An embedded metadata schema and field name, joined with a colon. ('xmp:Manager', 'exif:Artist', etc)\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\tid: 0,\n\t\t\tmappingId: 0, // ignored.\n\t\t\ttemplateIds: [], //\n\t\t\t// schemaField : \"\" // DO NOT default the idAttribute.\n\t\t\t// Client attributes\n\t\t\tschema: '',\n\t\t\tfield: '',\n\t\t};\n\t}\n\n\t/** @type {array} */\n\tget clientAttrs() {\n\t\treturn ['schema', 'field'];\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * Contains all avialable asset attribute templates\n\t\t * @memberOf Netx.Models.MetadataMapLink\n\t\t * @alias assetAttributes\n\t\t * @type {module:asset/collections/attributes}\n\t\t */\n\t\tthis.assetAttributes =\n\t\t\topts.assetAttributes || Netx.getAttributesByObjectType('asset');\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(this, 'change:schemaField', this.schemaUpdated);\n\n\t\t// Add some helpful client attributes\n\t\tthis.schemaUpdated();\n\t}\n\n\t/**\n\t * Get attribute templates for this map link\n\t * @method\n\t * @return {array}\n\t */\n\tgetAttributes() {\n\t\tconst assetAttributes = this.assetAttributes;\n\t\treturn _.compact(\n\t\t\t_.map(this.get('templateIds'), id => assetAttributes.get(id)),\n\t\t);\n\t}\n\t/**\n\t * When the `schemaField` updates, update our client attributes\n\t * @method\n\t */\n\tschemaUpdated() {\n\t\tconst schemaField = this.get('schemaField');\n\t\tconst splitSchema = schemaField && schemaField.split(':');\n\t\tconst pieces = (splitSchema && splitSchema.length) || 0;\n\n\t\tthis.set({\n\t\t\tschema: pieces ? syncMap[splitSchema[0]] : '',\n\t\t\tfield: pieces > 1 ? splitSchema[1] : '',\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'MetadataMapLink';\n\t}\n}\n","/**\n * Collection of MetadatMapLink objects.\n * Not used directly, but handy for the MetadataMap object.\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/metadataMapLink';\n\nexport default class MetadataMapLinks extends Base {\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'MetadataMapLinks';\n\t}\n}\n","/**\n * Each Metadata Map defines one scheme for how asset metadata can be converted to embedded metadata fields in downloaded files.\n * (The DAM calls this object a 'mapping' instead of a 'map' to avoid API naming conflicts with an older implementation.)\n *\n * @class\n * @extends Netx.Model\n *\n * @nxgen\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport AttributeModel from './attribute';\nimport MetadataMapLinksCollection from '../collections/metadataMapLinks';\n\nexport default class MetadataMap extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {boolean} defaults.isDefault - Is this the default map? (client- from system property share.metadata.defaultMap)\n\t * @property {number} defaults.id - Unique ID\n\t * @property {array} defaults.mapLinks - Raw MetadataMapLink objects (See API naming issues)\n\t * @property {string} defaults.name - Name of this map\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\tisDefault: false,\n\t\t\t// id: 0, // DO NOT default the idAttribute.\n\t\t\t// mappingLinks: [], // See API naming issues\n\t\t\tmapLinks: [],\n\t\t\tname: '',\n\t\t};\n\t}\n\n\t/** @property */\n\tget clientAttrs() {\n\t\treturn ['isDefault'];\n\t}\n\n\t/**\n\t * RPC methods:\n\t * @rpcs\n\t * @property {object} methods - The methods available on this model\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tcreate(opts) {\n\t\t\t\treturn ['setMetadataMapping', this.self()];\n\t\t\t},\n\t\t\t/** @method */\n\t\t\tread: ['getAllMetadataMappings'],\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tupdate(opts) {\n\t\t\t\treturn ['setMetadataMapping', this.self()];\n\t\t\t},\n\t\t\t/** @method */\n\t\t\tremove: ['deleteMetadataMapping', 'id'],\n\t\t\t/**\n\t\t\t * Tell the DAM this is the default map. (Admin only!)\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tsetDefaultMap(opts) {\n\t\t\t\treturn ['setProperty', 'share.metadata.defaultMap', this.id];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - The parsers available for our methods\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @param {number} id - Object ID (server returns this on success)\n\t\t\t * @param {object} opts Request options\n\t\t\t * @returns {object} parsed attributes object\n\t\t\t */\n\t\t\tcreate(id, opts) {\n\t\t\t\treturn {id: id};\n\t\t\t},\n\t\t\t/**\n\t\t\t * @param {array} allMaps The server's complete set of maps\n\t\t\t * @param {object} opts Request options\n\t\t\t * @returns {object} Just the map matching our ID\n\t\t\t */\n\t\t\tread(allMaps, opts) {\n\t\t\t\tconst me = _.findWhere(allMaps, {id: this.id});\n\t\t\t\tif (!me) {\n\t\t\t\t\tthrow new Error(\"Can't load metadata map with id: '\" + this.id + \"'\");\n\t\t\t\t}\n\t\t\t\treturn me;\n\t\t\t},\n\t\t\t/**\n\t\t\t * @param {number} id - Object ID (server returns this on success)\n\t\t\t * @param {object} opts Request options\n\t\t\t * @returns {object} parsed attributes object\n\t\t\t */\n\t\t\tupdate(id, opts) {\n\t\t\t\treturn {id: id};\n\t\t\t},\n\t\t\t/** @method */\n\t\t\tsetDefaultMap(result, opts) {\n\t\t\t\tthis.set({isDefault: true});\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * The DAM calls the mapLinks array \"mappingLinks\" due to annoying API namespace issues.\n\t * Translate .mappingLinks -> .mapLinks on fetch\n\t *\n\t * @param {object} data Raw model data (with .mappingLinks)\n\t * @returns {object} Parsed model data (with .mapLinks)\n\t */\n\tparse(data) {\n\t\tif (_.has(data, 'mappingLinks')) {\n\t\t\tdata.mapLinks = data.mappingLinks;\n\t\t\tdelete data.mappingLinks;\n\t\t}\n\t\treturn data;\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attr Model attributes\n\t * @param {object} opts Model options\n\t * @listens module:system#system:metadataMap:makeDefault:success\n\t * @listens module:system#system:metadataMap:clearDefault:success\n\t */\n\tconstructor(attr = {}, opts = {}) {\n\t\tsuper(attr, opts);\n\n\t\t// DEFAULT MAP handling:\n\t\t// If this model wasn't handed a value for the boolean, look it up (if possible)\n\t\tif (attr.isDefault == null) {\n\t\t\t// Check/cache our defaultness:\n\t\t\t// User prefs has the scoop.\n\t\t\t// Update our knowledge:\n\t\t\tthis.set({\n\t\t\t\tisDefault: Netx.getPreference('share.metadata.defaultMap') == this.id,\n\t\t\t});\n\t\t}\n\n\t\t// Now listen for any setting/clearing of the default map\n\t\t// (Would rather listen to a user prefs change event if we had those ...)\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'system:metadataMap:makeDefault:success',\n\t\t\t(model) => {\n\t\t\t\tthis.set({\n\t\t\t\t\tisDefault: model.id == this.id,\n\t\t\t\t});\n\t\t\t},\n\t\t).listenTo(\n\t\t\tdispatcher,\n\t\t\t'system:metadataMap:clearDefault:success',\n\t\t\t(model) => {\n\t\t\t\tthis.set({\n\t\t\t\t\tisDefault: false,\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * The DAM calls the mapLinks array \"mappingLinks\" due to annoying API namespace issues.\n\t * Translate .mapLinks -> .mappingLinks on save\n\t * @override\n\t * @returns {object} attributes translated.\n\t */\n\tself() {\n\t\tconst self = super.self();\n\t\tself.mappingLinks = self.mapLinks;\n\t\tdelete self.mapLinks;\n\t\treturn self;\n\t}\n\n\t/**\n\t * Instead of manipulating the array of raw objects in this model's .mapLinks attribute,\n\t * views/controllers/etc should use this method to get our current internal mapLinks collection,\n\t * and work with it directly (without affecting anything on the model until a save).\n\t * @method\n\t * @return {Netx.Collections.MetadataMapLinks}\n\t */\n\tgetMapLinks() {\n\t\treturn new MetadataMapLinksCollection(this.get('mapLinks'));\n\t}\n\n\t/**\n\t * Return IDs of all the attr templates mapped by this map.\n\t *\n\t * @method\n\t * @returns {array} template IDs of all attributes in this map\n\t */\n\tmappedAttributeIds() {\n\t\treturn (\n\t\t\tthis.getMapLinks()\n\t\t\t\t.chain()\n\t\t\t\t// DEVNOTE: again, I expect chain() to return a Collection that supports pluck() like Collections do ... but no.\n\t\t\t\t.pluck('attributes')\n\t\t\t\t.pluck('templateIds')\n\t\t\t\t.flatten()\n\t\t\t\t.uniq()\n\t\t\t\t.value()\n\t\t);\n\t}\n\n\t/**\n\t * Does this map contain a link for a given attribute?\n\t * @method\n\t * @param {number|Netx.Models.Attribute} templateId Attribute template (model or ID)\n\t * @returns {array} Array of mapped schema+field strings, or undefined if no match.\n\t */\n\tmapsAttribute(templateId) {\n\t\tif (templateId instanceof AttributeModel) {\n\t\t\t// dereference\n\t\t\ttemplateId = templateId.id;\n\t\t}\n\n\t\tconst toSchemaField = this.getMapLinks()\n\t\t\t.chain()\n\t\t\t.filter((mapLink) => _.contains(mapLink.get('templateIds'), templateId))\n\t\t\t.map((mapLink) => mapLink.get('schemaField'))\n\t\t\t.value();\n\n\t\treturn toSchemaField.length ? toSchemaField : undefined;\n\t}\n\n\t/**\n\t * Does this map contain a link for a given schema & option?\n\t * @method\n\t * @param {string} schemaField Schema+field string\n\t * @returns {array} Array of matthing attr template IDs, or undefined if no match\n\t */\n\tmapsMetadata(schemaField) {\n\t\tconst attrs = this.getMapLinks()\n\t\t\t.chain()\n\t\t\t// DEVNOTE: i would love for Collection.where() to return a new Collection,\n\t\t\t// a subset of just those models where the given key/keys have the specified values:\n\t\t\t//\n\t\t\t//.where({schemaField: schemaField})\n\t\t\t//\n\t\t\t// ... but no. Collection.chain() passes Collection.model down the chain, not itself.\n\t\t\t// So instead we use filter:\n\t\t\t.filter((mapLink) => mapLink.get('schemaField') == schemaField) // returns a plain array containing models\n\t\t\t.invoke('get', 'templateIds') // convert to an array of arrays of IDs\n\t\t\t.flatten() // convert to single array of IDs\n\t\t\t.uniq() // remove any duplicate IDs\n\t\t\t.value();\n\n\t\treturn attrs.length ? attrs : undefined;\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} data Data\n\t * @param {object} opts Options\n\t */\n\tparseAndSave(data, opts) {\n\t\t// Exisiting map links\n\t\tconst mapLinks = this.getMapLinks();\n\t\t// The updated map links we will be setting\n\t\tconst newMapLinks = new MetadataMapLinksCollection([]);\n\n\t\t// First gather and combine any duplicate schema fields\n\t\t// TODO: One day we might want to make a bettuer user experience and point thisout while the user is editing, but right now that is just too much work\n\t\tconst schemaFields = {};\n\t\t_.each(data.mapLinks, (mapLink, k) => {\n\t\t\tconst schemaField = mapLink.schemaField;\n\t\t\tif (schemaFields[schemaField] == null) {\n\t\t\t\tschemaFields[schemaField] = [];\n\t\t\t}\n\n\t\t\t// Concat attribute template ids\n\t\t\tschemaFields[schemaField] = schemaFields[schemaField].concat(\n\t\t\t\tdata.templateIds[schemaField],\n\t\t\t);\n\t\t});\n\n\t\t// By Andrew's request: To avoid unnecessary object churn on the server,\n\t\t// try to recycle these mapLink objects -- or at least their server-unique IDs.\n\t\t// Loop over schema fields where `schemaField` is the attribute template ids and `k` is the schema field name\n\t\tlet existing;\n\t\t_.each(schemaFields, (schemaField, k) => {\n\t\t\t// Check if already a map link\n\t\t\tif ((existing = mapLinks.get(k))) {\n\t\t\t\treturn newMapLinks.add(\n\t\t\t\t\t_.extend({}, existing.attributes, {\n\t\t\t\t\t\ttemplateIds: schemaField,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// New map link\n\t\t\tnewMapLinks.add({\n\t\t\t\tschemaField: k,\n\t\t\t\ttemplateIds: schemaField,\n\t\t\t\t// Also by Andrew's request: always set these IDs. (Use zeroes if undefined.)\n\t\t\t\tid: 0,\n\t\t\t\tmappingId: 0,\n\t\t\t});\n\t\t});\n\n\t\t// Set new mapping\n\t\treturn this.save(\n\t\t\t{\n\t\t\t\tmapLinks: newMapLinks.map((m) => m.attributes),\n\t\t\t\tname: data.name,\n\t\t\t},\n\t\t\t_.extend({merge: true, wait: true}, opts),\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'MetadataMap';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/metadataMap';\n\nexport default class MetadataMaps extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetMetadataMapJson: 'Loading metadata maps',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetMetadataMapJson: 'Loaded metadata maps',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch metadata maps\n\t *\n\t * @property {method} methods.clearDefaultMap - Clear default map\n\t * @property {method} methods.getSchemas - Fetch schemas\n\t * @property {method} methods.setDefaultMap - Set default map\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @return All metadataMapping objects\n\t\t\t */\n\t\t\tread: ['getAllMetadataMappings'],\n\n\t\t\t/**\n\t\t\t * Erase the default metadata map for embed-on-download\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tclearDefaultMap(opts) {\n\t\t\t\treturn ['removeProperty', 'share.metadata.defaultMap'];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @return Complete set of embeddable schemas, with options for each\n\t\t\t */\n\t\t\tgetSchemas: ['getMetadataMapJson'],\n\t\t\t/**\n\t\t\t * Set the property that holds the default map.\n\t\t\t * @method\n\t\t\t * @param {number|Netx.Models.MetadataMap} map Map to make the default, or id of same\n\t\t\t * @param {object} opts Request options\n\t\t\t * @return {array} API method definitions\n\t\t\t */\n\t\t\tsetDefaultMap(map, opts) {\n\t\t\t\tif (map instanceof Model) {\n\t\t\t\t\tmap = map.id;\n\t\t\t\t} else if (_.isNumeric(map)) {\n\t\t\t\t\t// map already = a map id\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'invalid map argument';\n\t\t\t\t}\n\n\t\t\t\treturn ['setProperty', 'share.metadata.defaultMap', map];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {function} parsers.getSchemas - Parse fetch of schemas\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * Convert the server's representation of embeddable metadata schemas and their options\n\t\t\t * into flat filtered/unfiltered arrays of schema+field objects and schema labels,\n\t\t\t * because that's what the UI needs.\n\t\t\t * @function\n\t\t\t * @param {array} schemas - An array of schema objects, sorted by schema & option, in this format:\n\t\t\t *\n\t\t\t * \t[ { // Format of a single schema object:\n\t\t\t * \t\tlabel: \"Dublin Core\", // Label for the schema\n\t\t\t * \t\toptions: [ { // Format of a ingle schema+field object:\n\t\t\t * \t\t\tlabel: \"Dublin Core contributor\", // Label for the schema+field the schema label, a space, and then another string.\n\t\t\t * \t\t\tvalue: \"dc:contributor\", // unique ID,\n\t\t\t * \t\t\tdirection: \"import\"|\"export\"|\"both\" // Can be extracted at import?/Can be embedded during download?\n\t\t\t * \t\t},{\n\t\t\t * // ... More schema+field objects, one per schema+field\n\t\t\t * \t\t}]\n\t\t\t * \t}, {\n\t\t\t * // ... More schema objects, one per schema.\n\t\t\t * \t}]\n\t\t\t *\n\t\t\t */\n\t\t\t// TODO: There ought to be a \"global\" home for this schema set, outside of other models.\n\t\t\t// Right now there's one in Netx.asset.attributes.metadata, but it's not filtered.\n\t\t\t// Since the data's read-only, it could live in Netx.properties.\n\t\t\t// There is some related stuff in asset/properties/assetAttributesMetadata (sic) but it's incomplete & a little awkward.\n\t\t\t// I know there's a cleanup of attributes coming soon; hold off until then.\n\t\t\t//\n\t\t\t// We need to marry the stuff in Netx.asset.attributes.metadata - I think that is still the only place that holds the options?\n\t\t\t// Idk - I looked through these objects and couldn't find what I was looking for so just populated like I did in assetAttributeEditeView. -jse-\n\t\t\t//\n\t\t\t//\n\t\t\t// TODO: revisit while doing Embed UI form. Maybe this is overkill. Maybe i'll need this in Models & Collections.\n\t\t\t// So far, this appears to be overkill and not as useful as the one set up in asset attributes :/\n\t\t\tgetSchemas(schemas, opts) {\n\t\t\t\tschemas = _.sortBy(schemas, 'label');\n\n\t\t\t\t// Lists of schema fields, filtered by direction type.\n\t\t\t\tthis.schemaFields = {\n\t\t\t\t\tall: [],\n\t\t\t\t\t// export: [], // created below ...\n\t\t\t\t\t// import: []. // created below ...\n\t\t\t\t\t// both: [] // created below ...\n\t\t\t\t};\n\n\t\t\t\t// Lists of schema labels, filtered by direction type.\n\t\t\t\tthis.schemaLabels = {\n\t\t\t\t\tall: [],\n\t\t\t\t\t// export: [], // created below ...\n\t\t\t\t\t// import: []. // created below ...\n\t\t\t\t\t// both: [] // created below ...\n\t\t\t\t};\n\n\t\t\t\t// Lists of schema keys (the part of the value before the colon) filtered by direction type.\n\t\t\t\tthis.schemaKeys = {\n\t\t\t\t\tall: [],\n\t\t\t\t\t// export: [], // created below ...\n\t\t\t\t\t// import: []. // created below ...\n\t\t\t\t\t// both: [] // created below ...\n\t\t\t\t};\n\n\t\t\t\t// Add other useful data to the schema field objects,\n\t\t\t\t// and put a flat list of them in this.schemaFields.all\n\t\t\t\t_.each(schemas, schema => {\n\t\t\t\t\tconst rex = new RegExp('^' + schema.label + ' ');\n\t\t\t\t\t_.each(schema.options, schemaField => {\n\t\t\t\t\t\tschemaField = _.extend({}, schemaField, {\n\t\t\t\t\t\t\tschemaLabel: schema.label,\n\t\t\t\t\t\t\t// Remove the initial Schema label from the schema+field label, to get a label for just the Option.\n\t\t\t\t\t\t\tfieldLabel: schemaField.label.replace(rex, ''),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.schemaFields.all.push(schemaField);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\t// Server already sorts the options (but case-insensitive might be better?)\n\t\t\t\t// this.schemaFields.all = _.sortBy(this.schemaFields.all, 'fieldLabel');\n\n\t\t\t\t// Filter sets:\n\t\t\t\tthis.schemaFields.both = _.where(this.schemaFields.all, {\n\t\t\t\t\tdirection: 'both',\n\t\t\t\t});\n\n\t\t\t\t_.each(['export', 'import'], direction => {\n\t\t\t\t\tthis.schemaFields[direction] = _.chain(this.schemaFields.all)\n\t\t\t\t\t\t.where({direction: direction})\n\t\t\t\t\t\t.concat(this.schemaFields.both)\n\t\t\t\t\t\t.sortBy('label')\n\t\t\t\t\t\t.value();\n\t\t\t\t\tthis.schemaLabels[direction] = _.chain(this.schemaFields[direction])\n\t\t\t\t\t\t.pluck('schemaLabel')\n\t\t\t\t\t\t.uniq()\n\t\t\t\t\t\t.value();\n\t\t\t\t\tthis.schemaKeys[direction] = _.chain(this.schemaFields[direction])\n\t\t\t\t\t\t.pluck('value')\n\t\t\t\t\t\t.map(v => v.split(':')[0])\n\t\t\t\t\t\t.uniq()\n\t\t\t\t\t\t.value();\n\t\t\t\t});\n\n\t\t\t\tthis.schemaLabels.both = _.chain(this.schemaFields.both)\n\t\t\t\t\t.pluck('schemaLabel')\n\t\t\t\t\t.uniq()\n\t\t\t\t\t.value();\n\t\t\t\tthis.schemaLabels.all = _.pluck(schemas, 'label');\n\n\t\t\t\tthis.schemaKeys.both = _.chain(this.schemaFields.both)\n\t\t\t\t\t.pluck('value')\n\t\t\t\t\t.map(v => v.split(':')[0])\n\t\t\t\t\t.uniq()\n\t\t\t\t\t.value();\n\t\t\t\tthis.schemaKeys.all = _.chain(\n\t\t\t\t\tthis.schemaKeys.import\n\t\t\t\t\t\t.concat(this.schemaKeys.export)\n\t\t\t\t\t\t.concat(this.schemaKeys.both),\n\t\t\t\t)\n\t\t\t\t\t.uniq()\n\t\t\t\t\t.sort()\n\t\t\t\t\t.value();\n\n\t\t\t\t// this.schemaLabels.export and this.schemaFields.export are used by the Embed On Export form ...\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\n\t\t// Hey, listen!\n\t\tthis.on('destroy', (model, collection, opts) => {\n\t\t\tif (this !== collection) return; // shouldn't happen anyway.\n\n\t\t\t// If the default map is destroyed, clear the defaults.\n\t\t\tif (model.get('isDefault')) {\n\t\t\t\tthis.clearDefaultMap(opts);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'MetadataMaps';\n\t}\n}\n","/**\n * MiniAsset Model.\n *\n * This model is the client-side reflection of the DAM's \"AssetListBean\" object -- a stripped-down representation\n * of an asset, suitable for viewing in lists. This model contains a subset of the information in module:asset/models/asset,\n * plus a smattering of other info.\n *\n * @class\n * @deprecated\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport AssetModel from './asset';\n\nexport default class MiniAsset extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'assetId';\n\t}\n\n\tget defaults() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * Properties of a MiniAsset:\n\t\t\t * ==========================\n\t\t\t */\n\t\t\t/** unique ID for the asset -- same as asset.assetId */\n\t\t\t//assetId:0,\n\t\t\t/** if asset is checked-out, this contains the userid of user who checked-out; 0 otherwise */\n\t\t\tcheckout: 0,\n\t\t\t/** does the asset have constituents? */\n\t\t\tconstituentAvailable: false,\n\t\t\t/** same as asset.file */\n\t\t\tfileName: '',\n\t\t\t/** does the (video) asset have an flv preview -- same as asset.flvAvailable */\n\t\t\tflvAvailable: false,\n\t\t\t/** what icon should represent the format of this asset? */\n\t\t\tformatIcon: 'image',\n\t\t\t/** Is the asset a member of the current cart selection? */\n\t\t\tinCurrentCart: false,\n\t\t\t/** The contents of these ten labels are configurable in the DAM. */\n\t\t\tlabel1: '',\n\t\t\tlabel2: '',\n\t\t\tlabel3: '',\n\t\t\tlabel4: '',\n\t\t\tlabel5: '',\n\t\t\tlabel6: '',\n\t\t\tlabel7: '',\n\t\t\tlabel8: '',\n\t\t\tlabel9: '',\n\t\t\tlabel10: '',\n\t\t\t/** same as asset.previewURL */\n\t\t\tpreview: '',\n\t\t\t/** same as asset.previewHeight */\n\t\t\tpreviewHeight: 0,\n\t\t\t/** same as asset.previewWidth */\n\t\t\tpreviewWidth: 0,\n\t\t\t/** same as asset.rating */\n\t\t\trating: 0,\n\t\t\t/** same as asset.readOnly */\n\t\t\treadOnly: 0,\n\t\t\t/** same as asset.status */\n\t\t\tstatus: 0,\n\t\t\t/** same as asset.thumbURL */\n\t\t\tthumb: '',\n\t\t\t//\n\t\t\t// not documented publicly because I'm not sure what they are -- and they're not documented in AssetListBean.java, tsk tsk ...\n\t\t\t//\n\t\t\t/* same as asset.expirationDate? */\n\t\t\texpire: 0,\n\t\t\t/* ??? */\n\t\t\tapproval: 0,\n\t\t\t/**\n\t\t\t * Deprecated fields: do not use\n\t\t\t * -----------------------------\n\t\t\t */\n\t\t\trelatedAssets: 0,\n\t\t};\n\t}\n\n\t/**\n\t * The following RPC methods cause the DAM to operate on the asset described in the model.\n\t * All manipulation takes place in the DAM; the browser does not directly manipulate image\n\t * data, files or the database.\n\t */\n\t/** @rpc */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * fetch(): load the miniAsset described by 'assetId' from the DAM\n\t\t\t * api method: getAssetListBeans\n\t\t\t * @method fetch\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn ['getAssetListBeans', [this.id]];\n\t\t\t},\n\t\t\t/**\n\t\t\t * destroy(): delete this asset from the DAM.\n\t\t\t * api method: deleteAsset\n\t\t\t * @method destroy\n\t\t\t */\n\t\t\tremove: ['deleteAsset', 'assetId', 'deleteWait'],\n\t\t\t//\n\t\t\t// TODO: we need to make a decision here.\n\t\t\t//\n\t\t\t// If we want all of the API methods that can operate on an asset ID\n\t\t\t// available on both asset and miniAsset, we should get miniAsset inheriting from asset.\n\t\t\t// That could be nice, and this file would be smaller, although the miniAsset itself would get heavier.\n\t\t\t// In which case, we would only define the methods here that need to be overridden, like 'read',\n\t\t\t// and probably undefine a few that make no sense without the full asset.\n\t\t\t//\n\t\t\t// On the other hand, if we want to say \"all you can do with a miniAsset is read it\", then we should have\n\t\t\t// some method that converts a mini to a real Asset, so that you one then call its methods. In which case,\n\t\t\t// we would probably still only define 'read' here.\n\t\t\t//\n\t\t\t// Either way, I don't know why we have the 'resync' method defined in miniAsset.js . Use the Asset one.\n\t\t\t//\n\t\t\tresync(opts) {\n\t\t\t\treturn ['resyncAssets', [this.id]];\n\t\t\t}, //rpc needs an *array* of ids (single in this case)\n\t\t};\n\t}\n\n\tget parsers() {\n\t\treturn {\n\t\t\t// unwrap our data from its array\n\t\t\tread(data, opts) {\n\t\t\t\treturn data[0];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @method\n\t * @param {object} attr Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attr, opts = {}) {\n\t\tsuper(attr, opts);\n\n\t\t/**\n\t\t * Seperate from the miniAsset model's attributes (which describe DAM data) are the following model properties\n\t\t * which inform the various RPC methods of this model.\n\t\t *\n\t\t * Should deleteAssets block until the DAM is done deleting?\n\t\t * @memberof module:asset/models/miniAsset\n\t\t * @alias deleteWait\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.deleteWait = opts.deleteWait !== true;\n\n\t\t// Hey, listen!\n\t\tthis\n\t\t\t// If we are added to the cart, we know we're in it\n\t\t\t.listenTo(dispatcher, 'cart:added', ids => {\n\t\t\t\tif (ids.indexOf(this.id) < 0) return;\n\n\t\t\t\tif (this.has('inCurrentCart')) {\n\t\t\t\t\tthis.set('inCurrentCart', true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.inCurrentCart = true;\n\t\t\t\tthis.trigger('change');\n\t\t\t})\n\t\t\t// If we are removed, we know we're not in it\n\t\t\t.listenTo(dispatcher, 'cart:removed', ids => {\n\t\t\t\tif (ids.indexOf(this.id) < 0) return;\n\n\t\t\t\tif (this.has('inCurrentCart')) {\n\t\t\t\t\tthis.set('inCurrentCart', false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.inCurrentCart = false;\n\t\t\t\tthis.trigger('change');\n\t\t\t})\n\t\t\t// If the cart is cleared, we know we're not in it.\n\t\t\t.listenTo(dispatcher, 'cart:cleared', () => {\n\t\t\t\tif (this.has('inCurrentCart')) {\n\t\t\t\t\tthis.set('inCurrentCart', false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.inCurrentCart = false;\n\t\t\t\tthis.trigger('change');\n\t\t\t})\n\t\t\t// TODO: this wont work\n\t\t\t// when this asset has completed import tasks on the server, re-fetch.\n\t\t\t.listenTo(dispatcher, 'asset:task:complete:' + this.id, task => {\n\t\t\t\tthis.fetch();\n\t\t\t});\n\t}\n\n\t/**\n\t * utility method to get a label for a miniAsset:\n\t */\n\tgetLabel() {\n\t\t// The miniAsset doesn't contain the name, unless 'name ' is one of the ten configrable labels.\n\t\tconst nameMaybe =\n\t\t\t(Netx.getPreference('attributeDisplay') || []).indexOf('name') + 1;\n\t\tif (nameMaybe) {\n\t\t\treturn this.attributes['label' + nameMaybe];\n\t\t}\n\t\treturn this.get('fileName');\n\t}\n\n\t/**\n\t * utility method for checking selection (inherited from Asset)\n\t */\n\tisSelected() {\n\t\treturn AssetModel.prototype.isSelected.apply(this, arguments);\n\t}\n\n\t/**\n\t * convert to assetSet (inherited from Asset)\n\t */\n\ttoAssetSet() {\n\t\treturn AssetModel.prototype.toAssetSet.apply(this, arguments);\n\t}\n\n\t/**\n\t * Factory method: Given an Asset, return a new MiniAsset.\n\t * @param {module:asset/models/asset} asset\n\t * @method\n\t * @static\n\t */\n\tstatic Shrink(asset) {\n\t\tconst attrs = asset.attributes;\n\t\treturn new this.constructor({\n\t\t\tassetId: asset.id,\n\t\t\tfileName: attrs.file,\n\t\t\tpreview: attrs.previewUrl,\n\t\t\tpreviewHeight: attrs.previewHeight,\n\t\t\tpreviewWidth: attrs.previewWidth,\n\t\t\tthumb: attrs.thumbUrl,\n\t\t\treadOnly: attrs.readOnly,\n\t\t\tstatus: attrs.status,\n\t\t\trating: attrs.rating,\n\t\t\t// expire : attrs.expirationDate // same thing?\n\t\t\tconstituentAvailable: attrs.constituentIds.length > 0,\n\t\t\tlabel1: attrs.file,\n\t\t\tlabel2: 'uploading ' + attrs.file,\n\t\t\t// TODO: Research if there's anything else we can translate here; curse the decision for these two objects to be so totally different from one another ...\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'MiniAsset';\n\t}\n}\n","/**\n * @class\n * @deprecated\n */\nimport Base from './assets';\nimport Model from '../models/miniAsset';\n\nimport customConfig from '../config';\n\nexport default class MiniAssets extends Base {\n\tget fetchSpecificMethod() {\n\t\treturn 'getAssetListBeans';\n\t}\n\n\t/** @type {object} */\n\tget methods() {\n\t\treturn {\n\t\t\tread(opts) {\n\t\t\t\tthis.setStartPosition();\n\n\t\t\t\tconst search = this.selection.createSearchObject();\n\n\t\t\t\t// Configure paging:\n\t\t\t\t// if chunk-fetch is requested, use chunk logic to determine the start & length.\n\t\t\t\tif (opts.chunk) {\n\t\t\t\t\tthis._startPosition = opts.refetch\n\t\t\t\t\t\t? this.selection.startPosition\n\t\t\t\t\t\t: this.selection.startPosition + this.length;\n\t\t\t\t\tthis._maxItems = opts.refetch\n\t\t\t\t\t\t? this.length + this.chunkSize\n\t\t\t\t\t\t: this.selection.maxItems;\n\t\t\t\t}\n\t\t\t\t// Otherwise use the standard values.\n\t\t\t\telse {\n\t\t\t\t\tthis._startPosition = this.selection.startPosition;\n\t\t\t\t\tthis._maxItems = this.selection.maxItems;\n\t\t\t\t}\n\n\t\t\t\t// Default\n\t\t\t\treturn [\n\t\t\t\t\t'searchAssetListObjects',\n\t\t\t\t\tsearch.sortField,\n\t\t\t\t\tsearch.sortOrder,\n\t\t\t\t\tsearch.matchCriteria,\n\t\t\t\t\tsearch.elementTypes,\n\t\t\t\t\tsearch.elementSubType1s,\n\t\t\t\t\tsearch.elementSubType2s,\n\t\t\t\t\tsearch.elementValue1s,\n\t\t\t\t\tsearch.elementValue2s,\n\t\t\t\t\tsearch.elementValue3s,\n\t\t\t\t\tsearch.saveSearch,\n\t\t\t\t\tsearch.notifyType,\n\t\t\t\t\tsearch.ignoreStat,\n\t\t\t\t\tthis._startPosition,\n\t\t\t\t\tthis._maxItems,\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {array} assets Assets\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(assets, opts) {\n\t\t\t\t// DAM-15036 - Omit any assets without valid assetIds\n\t\t\t\tassets = _.filter(assets, a => {\n\t\t\t\t\tif (!a.assetId) {\n\t\t\t\t\t\tconsole.log('server returned a bogus asset');\n\t\t\t\t\t}\n\t\t\t\t\treturn a.assetId;\n\t\t\t\t});\n\n\t\t\t\t// Check length of results; did we reach the end yet?\n\t\t\t\tif (assets.length > this.chunkSize) {\n\t\t\t\t\tassets.pop();\n\t\t\t\t\tthis.lastChunk = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.lastChunk = true;\n\t\t\t\t}\n\n\t\t\t\t// Don't remove existing assets if we are doing a chunk fetch.\n\t\t\t\t// (This options object will be passed to set.)\n\t\t\t\topts.remove = !opts.chunk;\n\n\t\t\t\tthis.fetchAssetCount();\n\n\t\t\t\treturn assets;\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * @type {number}\n\t\t */\n\t\tthis.chunkSize = opts.chunkSize || customConfig.CHUNK_SIZE;\n\t\t/**\n\t\t * @type {number}\n\t\t */\n\t\tthis.pageSize = opts.pageSize || customConfig.PAGE_SIZE;\n\n\t\t// re-fetch when the attribute display context is updated\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'user:updatePrefs:savedDisplayContext',\n\t\t\tthis.fetch,\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'MiniAssets';\n\t}\n}\n","/**\n * @class\n * @todo Documents defaults\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class PendingAsset extends Base {\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'assetId';\n\t}\n\n\t/** @type {object} */\n\tget defaults() {\n\t\treturn {\n\t\t\t// assetId: undefined,\n\t\t\tcategoryIds: [],\n\t\t\tdirection: undefined, // 'coming' or 'going'\n\t\t\tstate: undefined, // 'uploading', 'importing', 'indexing', etc\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'PendingAsset';\n\t}\n}\n","/**\n * the Pending Assets collection maintans a list of assets that are in a state of flux,\n * entering or leaving a category due to import, deletion or recategorization. We need\n * to do this parly because our main selection mechanism, searchAssetListObjects(), goes through\n * an indexed search layer that takes a moment to re-index after a change. This collection\n * maintains state about any changes that we have performed that the DAM is not yet finished with.\n * @class\n * @TODO This collection needs a lot of attention but right now it works\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/pendingAsset';\n\nexport default class PendingAssets extends Base {\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Pending Assets collections react to various pre-existing system events that indicate\n\t\t * an asset is about to be added to, or removed from, a category.\n\t\t *\n\t\t * It creates an 'coming' record when a file import begins,\n\t\t */\n\t\tthis.listenTo(dispatcher, 'upload:import:imported', this.assetImporting);\n\t\t/**\n\t\t * and both 'coming' and 'going' records when assets are recategorized.\n\t\t */\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'asset:category:added',\n\t\t\tthis.assetEnteringCategory,\n\t\t);\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'asset:category:removed',\n\t\t\tthis.assetLeavingCategory,\n\t\t);\n\n\t\t/**\n\t\t * Asset deletion is almost instant, but this could be extended to that as well.\n\t\t */\n\t}\n\n\tassetImporting(plupload, file, asset) {\n\t\tconst categoryId = asset.get('categoryid');\n\n\t\tvar p = new Model({\n\t\t\tassetId: asset.id,\n\t\t\tcategoryIds: [categoryId],\n\t\t\tdirection: 'coming',\n\t\t\tstate: 'uploading',\n\t\t});\n\n\t\tvar events = {\n\t\t\tdone: 'asset:task:complete:',\n\t\t\tcancelled: 'asset:pending:import:cancelled:',\n\t\t};\n\n\t\tthis.add(p);\n\n\t\t/**\n\t\t * When an uploading asset finishes uploading, the pending list record state is switched from 'uploading' to 'pending'\n\t\t */\n\t\tdispatcher.once(\n\t\t\tevents.uploaded + p.id,\n\t\t\tfunction () {\n\t\t\t\tp.set({state: 'pending'});\n\t\t\t},\n\t\t\tp,\n\t\t);\n\n\t\t/**\n\t\t * When a 'tasks:done' event for an asset arrives, that asset is removed from the Pending list.\n\t\t */\n\t\tvar setupDoneListener = function () {\n\t\t\tdispatcher.once(\n\t\t\t\tevents.done + p.id,\n\t\t\t\tfunction () {\n\t\t\t\t\tif (p.collection) {\n\t\t\t\t\t\tp.collection.remove(p);\n\t\t\t\t\t}\n\t\t\t\t\tdispatcher.trigger('asset:pending:task:complete:' + p.id);\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'category:asset:pending:task:complete',\n\t\t\t\t\t\tcategoryId,\n\t\t\t\t\t\tp.id,\n\t\t\t\t\t);\n\t\t\t\t\t// kill the cancel listener.\n\t\t\t\t\tdispatcher.off(events.cancelled + p.id, undefined, p);\n\t\t\t\t},\n\t\t\t\tp,\n\t\t\t);\n\t\t};\n\n\t\tsetupDoneListener();\n\n\t\t/**\n\t\t * In the case of import cancellation, that asset is also removed from the list.\n\t\t */\n\t\tdispatcher.once(\n\t\t\tevents.cancelled + p.id,\n\t\t\tfunction (model, newId) {\n\t\t\t\t// DAM-7713:\n\t\t\t\t// If there was a new ID issued, we want to track tasks on that ID,\n\t\t\t\t// instead of on the model's current ID.\n\t\t\t\t// (The model ought to update itself momentarily; this event is triggered right before that happens.)\n\t\t\t\tif (model && model.id !== newId) {\n\t\t\t\t\tvar oldId = model.id;\n\t\t\t\t\tp.set({\n\t\t\t\t\t\tassetId: newId,\n\t\t\t\t\t});\n\t\t\t\t\t// DEVNOTE: the decision to embed the asset id in the event name makes this part hella awkward.\n\t\t\t\t\t// It's nice elsewhere: in the case of asset models, every asset can listen for only its ID\n\t\t\t\t\t// (n performance), rather than all assets listening for all IDs (n^2), and we have a lot of asset models.\n\t\t\t\t\t// But in this context, it'd be better to have permanent listeners to events that don't have IDs in their names,\n\t\t\t\t\t// that don't need to be turned on and off all the time.\n\t\t\t\t\t//\n\t\t\t\t\t// I know that in some places we trigger two different events in order to have it both ways. That also feels yucky.\n\t\t\t\t\t//\n\t\t\t\t\t// Perhaps a single \"all\" listener could be in charge of spotting the form without the ID,\n\t\t\t\t\t// translating it to the form with the ID, and re-triggering,\n\t\t\t\t\t// for every event its useful to do that with.\n\t\t\t\t\t//\n\t\t\t\t\t// Until then, this sort of cruft is necessary:\n\t\t\t\t\tdispatcher.off(events.done + oldId); // that ID is dead, nobody should listen.\n\t\t\t\t\tsetupDoneListener();\n\t\t\t\t} else {\n\t\t\t\t\t// Some other cancellation ... just leave it alone\n\t\t\t\t\tif (p.collection) {\n\t\t\t\t\t\tp.collection.remove(p);\n\t\t\t\t\t}\n\t\t\t\t\t// Kill all listeners\n\t\t\t\t\tdispatcher.off(events.uploaded + p.id, undefined, p);\n\t\t\t\t\tdispatcher.off(events.done + p.id, undefined, p);\n\t\t\t\t}\n\t\t\t\t// TODO: all listeners off\n\t\t\t},\n\t\t\tp,\n\t\t);\n\n\t\tdispatcher.trigger(\n\t\t\t'asset:pending:import:start',\n\t\t\tplupload,\n\t\t\tfile,\n\t\t\tasset,\n\t\t\tcategoryId,\n\t\t);\n\t}\n\n\tassetEnteringCategory(assetId, categoryId, asset) {\n\t\tvar p = new Model({\n\t\t\tassetId: parseInt(assetId),\n\t\t\tcategoryIds: [parseInt(categoryId)],\n\t\t\tdirection: 'coming',\n\t\t\tstate: 'pending',\n\t\t});\n\n\t\tthis.add(p);\n\n\t\tdispatcher.once(\n\t\t\t'asset:task:complete:' + assetId,\n\t\t\tfunction (task) {\n\t\t\t\tif (p.collection) {\n\t\t\t\t\tp.collection.remove(p);\n\t\t\t\t}\n\t\t\t\tdispatcher.trigger('asset:pending:task:complete:' + assetId);\n\t\t\t},\n\t\t\tp,\n\t\t);\n\n\t\tdispatcher.trigger('asset:pending:category:coming', assetId, categoryId, p);\n\t}\n\n\tassetLeavingCategory(assetId, categoryId, asset) {\n\t\tvar p = new Model({\n\t\t\tassetId: parseInt(assetId),\n\t\t\tcategoryIds: [parseInt(categoryId)],\n\t\t\tdirection: 'going',\n\t\t\tstate: 'pending',\n\t\t});\n\n\t\tthis.add(p);\n\n\t\tdispatcher.once(\n\t\t\t'asset:task:complete:' + assetId,\n\t\t\tfunction (task) {\n\t\t\t\tif (p.collection) {\n\t\t\t\t\tp.collection.remove(p);\n\t\t\t\t}\n\t\t\t\tdispatcher.trigger('asset:pending:task:complete:' + assetId);\n\t\t\t},\n\t\t\tp,\n\t\t);\n\n\t\tdispatcher.trigger('asset:pending:category:going', assetId, categoryId, p);\n\t}\n\n\t/**\n\t * The methods findByAsset, filterByAsset, findByCategory and filterByCategory\n\t * take the appropriate ID as an argument, and return pendingAsset objects if they exist in the collection.\n\t * The find* methods return undefined if nothing is found; the filter* methods\n\t * return an empty array.\n\t */\n\n\t// TODO: every render of every assetListItemView now calls findByAsset, so\n\t// maybe measure its performance, possibly reorg the object to get better access.\n\n\tfindByAsset(assetId) {\n\t\treturn this.find(function (p) {\n\t\t\treturn parseInt(assetId) == parseInt(p.get('assetId'));\n\t\t});\n\t}\n\n\tfilterByAsset(assetId) {\n\t\treturn this.filter(function (p) {\n\t\t\treturn parseInt(assetId) == parseInt(p.get('assetId'));\n\t\t});\n\t}\n\n\tfindByCategory(catId) {\n\t\treturn this.find(function (p) {\n\t\t\treturn (\n\t\t\t\t_.indexOf(p.get('categoryIds'), parseInt(catId)) > -1 || // check for 37\n\t\t\t\t_.indexOf(p.get('categoryIds'), catId + '') > -1 // check for \"37\"\n\t\t\t);\n\t\t}); // TODO: refactor as array\n\t}\n\n\tfilterByCategory(catId) {\n\t\treturn this.filter(function (p) {\n\t\t\treturn (\n\t\t\t\t_.indexOf(p.get('categoryIds'), parseInt(catId)) > -1 || // check for 37\n\t\t\t\t_.indexOf(p.get('categoryIds'), catId + '') > -1 // check for \"37\"\n\t\t\t);\n\t\t}); // TODO: refactor as array\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'PendingAssets';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetVersionReactivate.html';\n\nimport Form from '@netx/core/functionality/form';\n\nclass AssetVersionReactivate extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.eventStr = opts.eventStr || 'asset:versions:reactivate';\n\t\t(opts.headerTitle = opts.headerTitle || i18n.t('i18n.reactivateVersion')),\n\t\t\t(opts.hideOnSubmit = opts.hideOnSubmit !== false);\n\t\topts.removeOnHide = opts.removeOnHide !== false;\n\t\topts.requiresChanges = opts.requiresChanges === true;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetVersionReactivate';\n\t}\n}\n\nForm(AssetVersionReactivate);\n\nexport default AssetVersionReactivate;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\n\nimport Form from '@netx/core/functionality/form';\n\nexport default class AssetConstituentDownloadView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.download');\n\t\topts.hideOnSubmit = opts.hideOnSubmit !== false;\n\t\topts.removeOnHide = opts.removeOnHide !== false;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetConstituentDownloadView';\n\t}\n}\n\n// Functionality\nForm(AssetConstituentDownloadView);\n","/**\n * @class\n */\nimport Base from './assetConstituentDownloadView';\nimport Template from '../templates/assetConstituentDownloadView_clip.html';\n\nexport default class AssetConstituentDownloadView_Clip extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.eventStr = opts.eventStr || 'asset:constituent:clip:download';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.downloadClip');\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t\tthis.presets = opts.presets;\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additional template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tpresets: this.presets,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetConstituentDownloadView_Clip';\n\t}\n}\n","/**\n * AssetDetailView\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetDetailView.html';\nimport AssetLinksViewTemplate from '../templates/assetLinksView.html';\n\nimport PagerView from '@netx/core-app/views/pagerView';\n\nimport AssetListView from './assetListView';\nimport AssetAttributesView from './assetAttributesView';\nimport AssetPreviewView from './assetPreviewView';\n\nimport AssetDetailPagerViewTemplate from '../templates/assetDetailPagerView.html';\nimport AssetDetailPreviewViewTemplate from '../templates/assetDetailPreviewView.html';\nimport AssetAttributeSetsSelection from '../collections/assetAttributeSetsSelection';\n\nimport MaterialMenus from '@netx/core/functionality/materialMenus';\n\nimport {faBolt, faLongArrowAltLeft} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaBolt,\n\tfaLongArrowAltLeft,\n});\n\nconst isListViewHash = (hash) => {\n\treturn (\n\t\thash.match(/(search\\/|cart\\/|cart-assets\\/|category\\/|page\\/)/) != null\n\t);\n};\n\nimport customConfig from '../config';\n\nexport default class AssetDetailView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'click .nx-select-all': 'selectAll',\n\t\t\t\tclick: 'detailClick',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.id = opts.id || 'asset-details';\n\t\topts.loadingClassObjects = opts.loadingClassObjects || [\n\t\t\t'collection',\n\t\t\t'model',\n\t\t];\n\t\topts.renderAllChildren = opts.renderAllChildren !== false;\n\t\topts.template = opts.template || Template;\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\n\t\t// Debounced methods\n\t\tthis.assetIdChanged = _.debounce(this.assetIdChanged, 50);\n\n\t\t/**\n\t\t * Asset cursor\n\t\t * @memberOf Netx.Views.AssetDetailView\n\t\t * @alias assetCursor\n\t\t * @type {Netx.Collections.Assets}\n\t\t */\n\t\tthis.assetCursor = opts.assetCursor || Netx.asset.cursor;\n\n\t\t/**\n\t\t * @property {object} details\t\t\t\t\t\t- Holds list of detail view options\n\t\t * @property {object} details.thing\t\t\t\t- Holds view options\n\t\t * @property {string} details.thing.detail\t\t\t- If provided instead of 'viewClass', we attemtpt to deduce the detail view's class from this string.\n\t\t * @property {class} details.thing.viewClass\t\t- View's class\n\t\t * @property {string} details.thing.viewInstance\t- Existing instance of a view\n\t\t * @property {object} details.thing.viewOptions\t- Any options you can pass to instances of Netx.View\n\t\t */\n\t\tthis.details = opts.details || {};\n\n\t\t// preview view\n\t\tthis.previewView = this.addSubView(\n\t\t\tnew AssetPreviewView({\n\t\t\t\ttemplateName: AssetDetailPreviewViewTemplate,\n\t\t\t\tmodel: this.model,\n\t\t\t\tcollection: this.assetCursor,\n\t\t\t\tpaging: false,\n\t\t\t}),\n\t\t);\n\t\t// list view\n\t\tthis.listView = this.addSubView(\n\t\t\tnew AssetListView({\n\t\t\t\tcollection: this.model.links,\n\t\t\t\ttemplate: AssetLinksViewTemplate,\n\t\t\t}),\n\t\t);\n\t\t// attributes view\n\t\tthis.attributesView = this.addSubView(\n\t\t\tnew AssetAttributesView({\n\t\t\t\tmodel: this.model,\n\t\t\t\t// Will automatically default to all\n\t\t\t\tcollection: new AssetAttributeSetsSelection(),\n\t\t\t\ttruncateValuesAt: Infinity,\n\t\t\t}),\n\t\t);\n\n\t\tthis.pagerView = this.addSubView(\n\t\t\tnew PagerView({\n\t\t\t\ttemplate: AssetDetailPagerViewTemplate,\n\t\t\t\tcollection: this.assetCursor,\n\t\t\t\tmodel: this.assetCursor.pager,\n\t\t\t}),\n\t\t);\n\n\t\t// Does the device allow touch events\n\t\tthis.hasTouch = $('html').hasClass('touch') || opts.hasTouch === true;\n\t\t// a boolean flag to only page once while swiping on mobile\n\t\tthis.isPanning = false;\n\n\t\t// this first time in, find the last list view from the router\n\t\tthis.contextHash = _.find(Netx.router.history, (hash) => {\n\t\t\treturn isListViewHash(hash);\n\t\t});\n\n\t\tif (this.contextHash) {\n\t\t\tthis.contextHash = `#${this.contextHash}`;\n\t\t}\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(dispatcher, 'routed', this.pauseAV)\n\t\t\t.listenTo(dispatcher, 'videojs:useractive', (e) => {\n\t\t\t\tthis.$el.removeClass('user-inactive');\n\t\t\t})\n\t\t\t.listenTo(dispatcher, 'videojs:userinactive', (e, isPlaying) => {\n\t\t\t\tif (isPlaying) {\n\t\t\t\t\tthis.$el.addClass('user-inactive');\n\t\t\t\t}\n\t\t\t})\n\t\t\t// THEM-283\n\t\t\t.listenTo(dispatcher, 'cart:added cart:removed', () => {\n\t\t\t\t// close dropdown\n\t\t\t\tthis.$el.find('[data-toggle=\"dropdown\"]').click();\n\t\t\t})\n\t\t\t// THEM-632 - listen for future hash changes\n\t\t\t.listenTo(dispatcher, 'hash:changed', (hash, lastHash) => {\n\t\t\t\tif (isListViewHash(hash)) {\n\t\t\t\t\tthis.contextHash = hash;\n\t\t\t\t}\n\n\t\t\t\tif (this.toListLink && this.contextHash) {\n\t\t\t\t\tthis.toListLink.attr('href', this.contextHash);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/** @override */\n\tafterHidden(view) {\n\t\tthis.previewView.previewView.hide();\n\n\t\tsuper.afterHidden(view);\n\t}\n\n\t/** @override */\n\tbindEvents() {\n\t\tsuper.bindEvents();\n\n\t\tif (!this.hasTouch) return this;\n\n\t\tif (!this.hammer) {\n\t\t\tthis.hammer = new Hammer(this.el);\n\t\t}\n\t\tthis.hammer.on('pan', this.hammerPan.bind(this));\n\n\t\treturn this;\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'change:name', () => {\n\t\t\tthis.$el.find('[name=\"name\"]').html(_.escape(this.model.get('name')));\n\t\t}).listenTo(this.model, 'change:assetId', this.assetIdChanged);\n\t}\n\n\tassetIdChanged() {\n\t\tif (this.model.id) {\n\t\t\tif (this.model.get('relatedAvailable')) {\n\t\t\t\tdispatcher.trigger('asset:detail:links');\n\t\t\t\tthis.$listView && this.$listView.show();\n\t\t\t} else {\n\t\t\t\tthis.$listView && this.$listView.hide();\n\t\t\t}\n\n\t\t\tthis.$detailCrumb.toggle(\n\t\t\t\tthis.contextHash != null && this.contextHash.length > 0,\n\t\t\t);\n\t\t\tthis.isPanning = false;\n\t\t}\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// before links view is appended with its pager\n\t\tthis.$pagerView = this.$('[data-nx-pager]');\n\t\t// this.pagerView && this.$pager.length && this.pagerView.setElement( this.$pager ).render().show();\n\t\tthis.$pagerView.append(this.pagerView.render().$el);\n\n\t\t// cache\n\t\tthis.toListLink = this.$el.find('#detailcrumb a');\n\t\tthis.$detailCrumb = this.$el.find('#detailcrumb');\n\n\t\tthis.$previewView = this.$('.nx-preview-view');\n\t\tthis.$listView = this.$('.nx-list-view');\n\t\tthis.$attributesView = this.$('.nx-attributes-view');\n\n\t\t// add all subViews\n\t\tthis.$previewView.append(this.previewView.render().$el);\n\t\tthis.$listView.append(this.listView.render().$el);\n\t\tthis.$attributesView.append(this.attributesView.render().$el);\n\n\t\t// Initialize these plugins when shown\n\t\tthis.whenShown.then(() => {\n\t\t\tthis.previewView.show();\n\t\t\tthis.attributesView.show();\n\t\t});\n\n\t\tif (this.model.get('relatedAvailable')) {\n\t\t\tdispatcher.trigger('asset:detail:links');\n\t\t\tthis.$listView.show();\n\t\t} else {\n\t\t\tthis.$listView.hide();\n\t\t}\n\n\t\tif (this.toListLink && this.contextHash) {\n\t\t\tthis.toListLink.attr('href', this.contextHash);\n\t\t}\n\n\t\tthis.showLoaded();\n\t}\n\n\t/**\n\t * Listens for the dispatchers 'routed' event and performs custom actions\n\t * @method\n\t */\n\tpauseAV() {\n\t\tthis.videojs && this.videojs.pause();\n\n\t\tthis.$('.audio-preview').removeClass('playing');\n\t}\n\n\t/** @method */\n\tremoveVideoPreview() {\n\t\tif (!this.videojs) return;\n\n\t\tthis.videojs.pause();\n\t\t// TODO: This is a hack to solve this problem\n\t\t// http://stackoverflow.com/questions/25493887/videojs-return-vdata-error-when-dispose-is-call\n\t\t_.defer(() => {\n\t\t\tif (!this.videojs) return;\n\t\t\tthis.videojs.dispose();\n\t\t\tdelete this.videojs;\n\t\t});\n\t}\n\n\t/**\n\t * un-hide and update the progress bar we use for misc quick tasks\n\t * @method\n\t */\n\tshowProgressBar(uploader, file) {\n\t\tconst prog = this.$('.progress');\n\t\tprog.removeClass('hide').find('.bar').css('width', `${file.percent}%`);\n\t}\n\n\t/**\n\t * Listens to {@link module:asset#asset:detail:exit|asset:detail:exit} and stops the player if it exists\n\t * @method\n\t */\n\tstopPlayer() {\n\t\tconst $videoJs = this.$('.video-js');\n\t\tif (!$videoJs.length || !$videoJs[0].player) return;\n\n\t\t$videoJs[0].player.pause();\n\t}\n\n\t/** @method */\n\trenderPreview() {\n\t\t// the small thumbnail in this view\n\t\t// this.$('.thumbnail img').attr('src', this.model.get('previewUrl') + this.model.cacheBuster() );\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `click` event\n\t * @fires module:netx#videojs:useractive\n\t */\n\tdetailClick(e) {\n\t\tdispatcher.trigger('videojs:useractive', e);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `pan` event\n\t */\n\thammerPan(e) {\n\t\t// Check that the device allows touch events\n\t\tif (!this.hasTouch || this.isPanning) return;\n\n\t\tconst collection = this.collection;\n\t\tconst gesture = e.gesture || e;\n\t\tconst additionalEvent = gesture.additionalEvent;\n\n\t\tif (\n\t\t\tMath.abs(gesture.deltaX) <= 150 ||\n\t\t\t(additionalEvent !== 'panright' && additionalEvent !== 'panleft')\n\t\t)\n\t\t\treturn;\n\n\t\tconst angle = gesture.angle;\n\t\tif (\n\t\t\tadditionalEvent === 'panright' &&\n\t\t\tcollection.curPage > 1 &&\n\t\t\tangle > -15 &&\n\t\t\tangle < 15\n\t\t) {\n\t\t\tthis.undelegateEvents();\n\t\t\tthis.isPanning = true;\n\t\t\tdispatcher.trigger('app:pager:prevPage', collection.pager, collection);\n\t\t} else if (\n\t\t\tadditionalEvent === 'panleft' &&\n\t\t\tcollection.curPage < collection.pager.get('itemTotal') &&\n\t\t\t(angle < -165 || angle > 165)\n\t\t) {\n\t\t\tthis.undelegateEvents();\n\t\t\tthis.isPanning = true;\n\t\t\tdispatcher.trigger('app:pager:nextPage', collection.pager, collection);\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `click` event\n\t * @fires module:cart#cart:addAll\n\t */\n\tselectAll(e) {\n\t\tdispatcher.trigger('cart:addAll', this.listView.collection);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetDetailView';\n\t}\n}\n\nMaterialMenus(AssetDetailView);\n","export default {\n\t/**\n\t * show asset details for an ID\n\t * @route\n\t * @param {number|string} id Asset id\n\t * @fires module:asset#asset:routed\n\t */\n\t'asset/:id'(id) {\n\t\tdispatcher.trigger('asset:routed', id);\n\t},\n\n\t/**\n\t * Trigger sharing interface for an asset:\n\t * @route\n\t * @param {number|string} id Asset id\n\t * @fires module:share#share:asset\n\t */\n\t'asset/:id/share'(id) {\n\t\t// used by various download options\n\t\t// TODO: move to share:menu (tokens)\n\t\t//dispatcher.trigger('share:asset', id );\n\t\tdispatcher.trigger('asset:share:menu', id);\n\t},\n\n\t/**\n\t * Trigger asset zoom:\n\t * @route\n\t * @param {number|string} id Asset id\n\t * @fires module:asset#asset:zoom:routed\n\t */\n\t'asset/:id/zoom'(id) {\n\t\tdispatcher.trigger('asset:zoom:routed', id);\n\t},\n\n\t/**\n\t * Trigger document viewer\n\t * @route\n\t * @param {number|string} id Asset id\n\t * @fires module:asset#asset:docview\n\t */\n\t'asset/:id/viewer/document'(id) {\n\t\tdispatcher.trigger('asset:docview', id);\n\t},\n\n\t/**\n\t * Trigger document viewer\n\t * @route\n\t * @param {number|string} id Asset id\n\t * @fires module:asset#asset:docview\n\t */\n\t'asset/:id/document'(id) {\n\t\tdispatcher.trigger('asset:docview', id);\n\t},\n\n\t/**\n\t * @route\n\t * @param {string} page Page number\n\t * @fires module:asset#asset:expirations:routed\n\t */\n\t'assets/expiring/page/:page'(page) {\n\t\tdispatcher.trigger('asset:expirations:routed', parseInt(page));\n\t},\n\t'assets/expiring'() {\n\t\tdispatcher.trigger('asset:expirations:routed');\n\t},\n\n\t/**\n\t * Redirect to block access to download path assets/pdf\n\t * @route\n\t */\n\t'assets/pdf'() {\n\t\t// used by various download options\n\t\tNetx.router.reroute('', true);\n\t},\n\n\t/**\n\t * Redirect to block access to download path assets/repurposed\n\t * @route\n\t */\n\t'assets/repurposed'() {\n\t\t// used by various download options\n\t\tNetx.router.reroute('', true);\n\t},\n\n\t/**\n\t * Redirect to block access to download path asset/id/pdf\n\t * @route\n\t * @param {number|string} id Asset id\n\t */\n\t'asset/:id/pdf'(id) {\n\t\t// used by pdf download (maybe someday?)\n\t\tNetx.router.reroute('asset/' + id, true);\n\t},\n\n\t/**\n\t * Repurpose audio asset\n\t * @route\n\t * @fires module:asset#asset:audioEditor:routed\n\t */\n\t'asset/:id/audioeditor'(id) {\n\t\tdispatcher.trigger('asset:audioEditor:routed', id);\n\t},\n\n\t/**\n\t * Repurpose image asset\n\t * @route\n\t * @fires module:asset#asset:imageEditor:routed\n\t */\n\t'asset/:id/imageeditor'(id) {\n\t\tdispatcher.trigger('asset:imageEditor:routed', id);\n\t},\n\n\t/**\n\t * Edit/add video clip for asset\n\t * @route\n\t * @fires module:asset#asset:constituent:clip:edit\n\t */\n\t'asset/:id/clips/edit(/:clip)'(id, clip) {\n\t\tdispatcher.trigger('asset:constituent:clip:edit', id, clip);\n\t},\n\n\t/**\n\t * Show a particular tab of asset details\n\t * @route\n\t * @param {number|string} id Asset id\n\t * @param {string} tab Name of tab that corresponds to type of asset information\n\t * @fires module:asset#asset:routed\n\t */\n\t'asset/:id/:tab'(id, tab) {\n\t\tdispatcher.trigger('asset:routed', id, tab);\n\t},\n\n\t/**\n\t * Load a viewer (with optional type) for an asset\n\t * @route\n\t * @param {number|string} id Asset id\n\t * @param {string} viewerType Type of viewer you want to use\n\t * @fires module:asset#asset:routed\n\t */\n\t'asset/:id/viewer/:viewerType'(id, viewerType) {\n\t\tif (viewerType === 'document') {\n\t\t\tdispatcher.trigger('asset:docview', id);\n\t\t} else {\n\t\t\tdispatcher.trigger('asset:routed', id, viewerType);\n\t\t}\n\t},\n\n\t/**\n\t * @route\n\t * @fires module:asset#asset:tagPanel:grid\n\t */\n\t'assets/grideditor'() {\n\t\tdispatcher.trigger('asset:tagPanel:grid:routed');\n\t},\n\n\t/**\n\t * Show popular assets\n\t * @route\n\t * @fires module:asset#asset:misc\n\t */\n\t'assets/popular'() {\n\t\tdispatcher.trigger('asset:misc', 'assets/popular');\n\t},\n\n\t/**\n\t * Asset requests\n\t * @route\n\t * @fires module:asset#asset:requests:routed\n\t */\n\t'assets/requests(/page/:page)'(page) {\n\t\tdispatcher.trigger('asset:requests:routed');\n\t},\n};\n","import routes from '@netx/core-asset/routes';\n\n_.extend(routes, {\n\t/**\n\t * @route\n\t * @fires {@link module:asset#asset:quickzoom:routed}\n\t */\n\t'asset/:id/zoom/quickzoom'(id) {\n\t\tdispatcher.trigger('asset:quickzoom:routed', id);\n\t},\n});\n\nexport default routes;\n","/**\n * This model describes one preset process for DAM-side asset repurposing\n * @class\n * @todo Document defaults, methods, parsers, and members (like what are otherIds, assetIds and downloadOverride used for? - stating their type without a description is useless in documentation)\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class AssetProcess extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'id';\n\t}\n\n\t/** @type {object} */\n\tget defaults() {\n\t\treturn {\n\t\t\t//id: 0,\n\t\t\tlabel: '',\n\t\t\tvalue: '',\n\t\t};\n\t}\n\n\t/** @rpc */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @method */\n\t\t\texecute: [\n\t\t\t\t'repurposeAssetsWithPresetProcess',\n\t\t\t\t'assetIds',\n\t\t\t\t'otherIds',\n\t\t\t\t'id',\n\t\t\t\t'downloadOverride',\n\t\t\t],\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {boolean} result Result\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\texecute(result, opts) {\n\t\t\t\t// this is one of those true or false methods ...\n\t\t\t\tif (result == false) {\n\t\t\t\t\t// TODO: move away from this throwing-excetion-in-parser pattern. Return false or something.\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'repurposeAssetsWithPresetProcess returned failure as success',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * @memberof module:asset/models/assetProcess\n\t\t * @alias assetIds\n\t\t * @type {array}\n\t\t */\n\t\tthis.assetIds = [];\n\n\t\t/**\n\t\t * @memberof module:asset/models/assetProcess\n\t\t * @alias downloadOverride\n\t\t * @type {string}\n\t\t */\n\t\tthis.downloadOverride = '';\n\n\t\t/**\n\t\t * @memberof module:asset/models/assetProcess\n\t\t * @alias assetIds\n\t\t * @type {array}\n\t\t */\n\t\tthis.otherIds = [];\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetProcess';\n\t}\n}\n","/**\n * AssetImageProcesses -- a list of DAM-defined processes that can be run on an image asset.\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetProcess';\n\nexport default class AssetImageProcesses extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetProcesses: 'Loading image presets',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetProcesses: 'Loading image presets',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch processes (presets)\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @todo Rename the call 'getProcesses' to 'getImagePresets'\n\t\t\t */\n\t\t\tread: ['getProcesses'],\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetImageProcesses';\n\t}\n}\n","/**\n * AssetVideoProcesses -- a list of DAM-defined processes that can be run on an video asset.\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/assetProcess';\n\nexport default class AssetVideoProcesses extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch video preset processes\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @todo Rename the call 'getProcesses' to 'getImagePresets'\n\t\t\t * We need to be able to support batch audio and thus need video presets - not supported in flex at all\n\t\t\t */\n\t\t\tread: ['getVideoPresets'],\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetVideoProcesses';\n\t}\n}\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport _ from 'underscore';\n\nimport type {Asset} from '@netx/core-asset/types';\nimport {isMobile} from '@netx/core/utils';\nimport AssetImagePresetsCollection from '@netx/core-asset/collections/assetImagePresets';\nimport AssetVideoPresetsCollection from '@netx/core-asset/collections/assetVideoPresets';\nimport AssetModel from '@netx/core-asset/models/asset';\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\nimport {getGeneralAssetFileType} from '@netx/core-asset/utils';\nimport cartSingleton from '@netx/core-cart/collections/singleton/cart';\nimport {REPURPOSE_EVENT, REPURPOSE_BASE_EVENT} from './actions';\n\ndispatcher.once(`${REPURPOSE_BASE_EVENT}:init`, () => {\n\tconst presets = ((Netx.asset = Netx.asset || {}).presets = {\n\t\taudio: null,\n\t\tdocument: null,\n\t\timage: new AssetImagePresetsCollection([]),\n\t\tvideo: new AssetVideoPresetsCollection([]),\n\t});\n\n\t// fetch the DAM-wide list of asset repurposing processes\n\tconst bootstrap = [presets.image.fetch(), presets.video.fetch()];\n\n\tdispatcher.on(\n\t\t`${REPURPOSE_BASE_EVENT}:batch:show`,\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetBatchRepurpose\" */ '@netx/core-asset/views/assetBatchRepurposeView'\n\t\t\t).then((View) => {\n\t\t\t\tNetx.app.modalViews.add({\n\t\t\t\t\tviewClass: View.default as any,\n\t\t\t\t\tshowAction: ['asset:repurpose:batch:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\tdispatcher.on(REPURPOSE_EVENT.REPURPOSE_ASSET, (asset: Asset) => {\n\t\tconst assetModel = new AssetModel(asset);\n\n\t\tconst manualUserLevel =\n\t\t\tNetx.getPreference('sys.minUserLevelForManualRepurpose') || 0;\n\t\tconst canManuallyRepurpose = Netx.getUserLevel() >= manualUserLevel;\n\n\t\tconst repurposableTypes = ['video', 'audio', 'image'];\n\t\tconst type = getGeneralAssetFileType(asset.fileFormatFamily, true);\n\n\t\tif (type == null || !repurposableTypes.includes(type)) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t`${REPURPOSE_BASE_EVENT}:error`,\n\t\t\t\tnew Error(i18n.t('i18n.repurposeInvalidAssetType')),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (canManuallyRepurpose) {\n\t\t\tswitch (type) {\n\t\t\t\tcase 'audio':\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t`${REPURPOSE_BASE_EVENT}:audio`,\n\t\t\t\t\t\tnew AssetModel(asset),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'image':\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t`${REPURPOSE_BASE_EVENT}:image`,\n\t\t\t\t\t\tnew AssetModel(asset),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If we have gotten her then we are just doing a general repurpose\n\t\t// Emulate inpection object (cartAssets collection)\n\t\t(assetModel as any).inspection = {\n\t\t\t[`${type}AssetIds`]: asset.assetId,\n\t\t\t[`${type}Count`]: 1,\n\t\t};\n\n\t\tconst options: {\n\t\t\tmodel: AssetModel;\n\t\t\tmanualProcesses?: any[];\n\t\t\tpresets: typeof presets;\n\t\t} = {\n\t\t\tmodel: assetModel,\n\t\t\tpresets,\n\t\t};\n\n\t\t// Get manual processes\n\t\tassetModel.getProcessListForUser({duplicateQueryPolicy: 'abort'}).then(\n\t\t\tfunction (processes) {\n\t\t\t\tlet assetSet;\n\t\t\t\t// Success\n\t\t\t\tif (processes === null || (!processes.length && type != 'audio')) {\n\t\t\t\t\t// Creating an assetSet consiting just of the asset since share:assetSet:menu requires an assetSet\n\t\t\t\t\t// This used to display the assetRepurposeView but we are moving away from that and using the download and share workflows for all presetProcess repurposes\n\t\t\t\t\tassetSet = new AssetSetModel({\n\t\t\t\t\t\ttype: assetSetTypes.asset,\n\t\t\t\t\t\tids: [asset.assetId],\n\t\t\t\t\t});\n\t\t\t\t\tdispatcher.trigger('share:assetSet:menu', assetSet, undefined, {\n\t\t\t\t\t\tcontext: 'presetProcess',\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// set processes - regardless\n\t\t\t\toptions.manualProcesses = processes;\n\n\t\t\t\t// make view\n\t\t\t\tassetSet = new AssetSetModel({\n\t\t\t\t\ttype: assetSetTypes.asset,\n\t\t\t\t\tids: [asset.assetId],\n\t\t\t\t});\n\n\t\t\t\tdispatcher.trigger('share:assetSet:menu', assetSet, undefined, {\n\t\t\t\t\tcontext: 'presetProcess',\n\t\t\t\t});\n\t\t\t},\n\t\t\t(err) => dispatcher.trigger(`${REPURPOSE_BASE_EVENT}:error`, err),\n\t\t);\n\t});\n\n\tdispatcher.on(REPURPOSE_EVENT.REPURPOSE_SELECTION, async () => {\n\t\tconst manualUserLevel =\n\t\t\tNetx.getPreference('sys.minUserLevelForManualRepurpose') || 0;\n\t\tconst canManuallyRepurpose = Netx.getUserLevel() >= manualUserLevel;\n\n\t\t// @ts-ignore\n\t\tawait cartSingleton.inspect();\n\n\t\t// If only one type of item in this collection, we can skip the Batch part & go straight to asset:repurpose:selected.\n\t\t// TODO: make an 'assetInspection' model, with methods for this stuff ...\n\t\tconst counts = _.pick(\n\t\t\tcartSingleton.inspection,\n\t\t\t(v, k) => k.match(/Count$/) && v > 0,\n\t\t);\n\t\tconst countKeys = _.keys(counts);\n\t\tconst countKeysLength = countKeys.length;\n\n\t\tif (countKeysLength === 0) {\n\t\t\treturn dispatcher.trigger(\n\t\t\t\t'cart:repurpose:error',\n\t\t\t\tnew Error(i18n.t('i18n.noneOfTheAssetsInYourCartCanBeRepurposed')),\n\t\t\t\ti18n.t('i18n.error'),\n\t\t\t);\n\t\t}\n\n\t\tif (countKeysLength === 1) {\n\t\t\tconst type = countKeys[0]?.match(/(^.*)Count$/)?.[1];\n\t\t\t// now type should be 'image', 'video', 'audio' or 'otherAsset'\n\t\t\tif (_.contains(['image', 'video', 'audio'], type)) {\n\t\t\t\tcartSingleton.length === 1\n\t\t\t\t\t? dispatcher.trigger(\n\t\t\t\t\t\t\tREPURPOSE_EVENT.REPURPOSE_ASSET,\n\t\t\t\t\t\t\tcartSingleton.at(0).attributes,\n\t\t\t\t\t\t\ttype,\n\t\t\t\t\t )\n\t\t\t\t\t: dispatcher.trigger(\n\t\t\t\t\t\t\t'share:assetSet:menu',\n\t\t\t\t\t\t\tnew AssetSetModel({\n\t\t\t\t\t\t\t\ttype: assetSetTypes.cart,\n\t\t\t\t\t\t\t\tids: [0],\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcontext: 'presetProcess',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (cartSingleton.inspection.otherAssetCount > 0) {\n\t\t\tconst assetCount = cartSingleton.assetCount?.() || 0;\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t('i18n.assetsNotAvailableForRepurposing', {\n\t\t\t\t\ttotal: assetCount,\n\t\t\t\t\tbadCount: cartSingleton.inspection.otherAssetCount,\n\t\t\t\t\tcount: assetCount - cartSingleton.inspection.otherAssetCount,\n\t\t\t\t}),\n\t\t\t\tyesLabel: i18n.t('i18n.continue'),\n\t\t\t\tnoLabel: i18n.t('i18n.cancel'),\n\t\t\t\teventStr: REPURPOSE_EVENT.REPURPOSE_SELECTION,\n\t\t\t\targs: [],\n\t\t\t});\n\t\t} else {\n\t\t\tdispatcher.trigger(`${REPURPOSE_EVENT.REPURPOSE_SELECTION}:confirmed`);\n\t\t}\n\t});\n\n\tdispatcher.on(`${REPURPOSE_EVENT.REPURPOSE_SELECTION}:confirmed`, () => {\n\t\tdispatcher.trigger(`${REPURPOSE_BASE_EVENT}:batch:show`, {\n\t\t\tpresets,\n\t\t\tcollection: cartSingleton,\n\t\t});\n\t});\n\n\tdispatcher.on(\n\t\t`${REPURPOSE_EVENT.REPURPOSE_SELECTION}:type`,\n\t\t(collection: typeof cartSingleton, type) => {\n\t\t\tconst manualUserLevel =\n\t\t\t\tNetx.getPreference('sys.minUserLevelForManualRepurpose') || 0;\n\t\t\tconst canManuallyRepurpose = Netx.getUserLevel() >= manualUserLevel;\n\n\t\t\t// our currently supported asset types\n\t\t\tconst supported = ['audio', 'image', 'video'];\n\t\t\t// // check support for supplied asset type\n\t\t\tif (!supported.includes(type)) {\n\t\t\t\tconsole.warn(type, 'repurpose not currently supported');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// asset ids concerned\n\t\t\tconst ids = collection.inspection[type + 'AssetIds'];\n\n\t\t\t// only one item to repurpose\n\t\t\tif (ids.length < 2 && canManuallyRepurpose) {\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase 'image':\n\t\t\t\t\tcase 'audio':\n\t\t\t\t\t\tcollection\n\t\t\t\t\t\t\t.get(ids[0])\n\t\t\t\t\t\t\t.getProcessListForUser()\n\t\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\t\t(processes) => {\n\t\t\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t\t\ttype === 'image'\n\t\t\t\t\t\t\t\t\t\t\t? REPURPOSE_EVENT.REPURPOSE_IMAGE\n\t\t\t\t\t\t\t\t\t\t\t: REPURPOSE_EVENT.REPURPOSE_AUDIO,\n\t\t\t\t\t\t\t\t\t\tcollection.get(ids[0]),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t(err) =>\n\t\t\t\t\t\t\t\t\tdispatcher.trigger(`${REPURPOSE_BASE_EVENT}:error`, err),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'video':\n\t\t\t\t\t\t// creating an assetSet consiting just of the video so that the correct download options will be displayed.\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'share:assetSet:menu',\n\t\t\t\t\t\t\tnew AssetSetModel({\n\t\t\t\t\t\t\t\ttype: assetSetTypes.asset,\n\t\t\t\t\t\t\t\tids: collection.inspection.videoAssetIds,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcontext: 'presetProcess',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch (type) {\n\t\t\t\t// no presets supported for audio YET\n\t\t\t\tcase 'audio':\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'app:alert',\n\t\t\t\t\t\ti18n.t('i18n.batchAudioReurposeUnavailable'),\n\t\t\t\t\t\ti18n.t('i18n.info'),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'image':\n\t\t\t\tcase 'video':\n\t\t\t\t\t// must have image presets\n\t\t\t\t\tif (type === 'image' && !presets.image.length) {\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t`${REPURPOSE_BASE_EVENT}:error`,\n\t\t\t\t\t\t\ti18n.t('i18n.batchImageRepurposeNoPresets'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// must have video presets\n\t\t\t\t\tif (type === 'video' && !presets.video.length) {\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t`${REPURPOSE_BASE_EVENT}:error`,\n\t\t\t\t\t\t\ti18n.t('i18n.batchVideoRepurposeNoPresets'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// creating an assetSet consiting just of the images or videos so that the correct download options will be displayed.\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:assetSet:menu',\n\t\t\t\t\t\tnew AssetSetModel({\n\t\t\t\t\t\t\ttype: assetSetTypes.assetSet,\n\t\t\t\t\t\t\tids: collection.inspection[`${type}AssetIds`],\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontext: 'presetProcess',\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t);\n\n\tdispatcher.on(REPURPOSE_EVENT.REPURPOSE_AUDIO, (assetModel: AssetModel) => {\n\t\tconst manualUserLevel =\n\t\t\tNetx.getPreference('sys.minUserLevelForManualRepurpose') || 0;\n\t\t// DAM-13617, DAM-15373\n\t\tconst canManuallyRepurpose =\n\t\t\t!isMobile() && Netx.getUserLevel() >= manualUserLevel;\n\n\t\tif (!canManuallyRepurpose) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t`${REPURPOSE_BASE_EVENT}:error`,\n\t\t\t\tnew Error(i18n.t('i18n.manualRepurposeNotAvailable')),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// load module\n\t\tdispatcher.trigger('netx:load:module:audioeditor', {\n\t\t\terror(err) {\n\t\t\t\t// TODO: deal with error\n\t\t\t\tconsole.warn(err);\n\t\t\t},\n\t\t\tinitialized() {\n\t\t\t\t// TODO: fix to have route in audio editor\n\t\t\t\tdispatcher.trigger('audioEditor:repurpose', assetModel);\n\t\t\t},\n\t\t});\n\t});\n\n\tdispatcher.on(REPURPOSE_EVENT.REPURPOSE_IMAGE, (assetModel: AssetModel) => {\n\t\tconst manualUserLevel =\n\t\t\tNetx.getPreference('sys.minUserLevelForManualRepurpose') || 0;\n\t\t// DAM-13617, DAM-15373\n\t\tconst canManuallyRepurpose =\n\t\t\t!isMobile() && Netx.getUserLevel() >= manualUserLevel;\n\n\t\tif (!canManuallyRepurpose) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t`${REPURPOSE_BASE_EVENT}:error`,\n\t\t\t\tnew Error(i18n.t('i18n.manualRepurposeNotAvailable')),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Load module\n\t\tdispatcher.trigger('netx:load:module:imageeditor', {\n\t\t\terror: (err) => {\n\t\t\t\t// TODO: deal with error\n\t\t\t\tconsole.warn(err);\n\t\t\t},\n\t\t\tinitialized: function () {\n\t\t\t\tdispatcher.trigger('imageEditor:repurpose', assetModel);\n\t\t\t},\n\t\t});\n\t});\n\n\tdispatcher.on(`${REPURPOSE_BASE_EVENT}:confirmed`, (data, thing) => {\n\t\tconst preset = data.preset.attributes;\n\t\t// Unfortunately, video preset processes are stored in XML and do not have an ID\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:repurpose:preset',\n\t\t\tthing.toAssetSet(),\n\t\t\tdata.type === 'video' ? preset.name : preset.id,\n\t\t\tdata.type,\n\t\t);\n\t\tdispatcher.trigger(\n\t\t\t`${REPURPOSE_BASE_EVENT}:success`,\n\t\t\tthing,\n\t\t\tpreset,\n\t\t\tdata.type,\n\t\t);\n\t});\n\n\tdispatcher.on(\n\t\t`${REPURPOSE_BASE_EVENT}:error`,\n\t\t(error) => dispatcher.trigger('app:alert', error, i18n.t('i18n.error')),\n\t\twindow,\n\t);\n\n\tdispatcher.on(\n\t\t`${REPURPOSE_BASE_EVENT}:success`,\n\t\tfunction () {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\ttitle: i18n.t('i18n.assetUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.repurposeSuccessful'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\tPromise.all(bootstrap).then(() => {\n\t\tdispatcher.trigger(`${REPURPOSE_BASE_EVENT}:extend`);\n\t\tdispatcher.trigger(`${REPURPOSE_BASE_EVENT}:initialized`);\n\t});\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${REPURPOSE_BASE_EVENT}:initialized`, () => resolve());\n\t\t\tdispatcher.trigger(`${REPURPOSE_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport AssetModel from '@netx/core-asset/models/asset';\nimport type {Asset} from '@netx/core-asset/types';\nimport _ from 'underscore';\n\nimport {CUSTOM_THUMBNAIL_EVENT, CUSTOM_THUMBNAIL_BASE_EVENT} from './actions';\n\ndispatcher.once(`${CUSTOM_THUMBNAIL_BASE_EVENT}:init`, () => {\n\tdispatcher.on(CUSTOM_THUMBNAIL_EVENT.SELECT, (asset: Asset) =>\n\t\tdispatcher.trigger(\n\t\t\t'upload:asset:customThumbnail:select',\n\t\t\tnew AssetModel(asset),\n\t\t),\n\t);\n\n\tdispatcher.trigger(`${CUSTOM_THUMBNAIL_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${CUSTOM_THUMBNAIL_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${CUSTOM_THUMBNAIL_BASE_EVENT}:initialized`, () =>\n\t\t\t\tresolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${CUSTOM_THUMBNAIL_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","// This is basically a react confirm wrapper that can work as a drop in replacement for our current\n// confirmation system\n\nimport Base from '@netx/core/lib/netx-react-view';\nimport {i18n} from '@netx/core/i18n';\nimport {dispatcher} from '@netx/core/bootstrap';\n\nimport {ConfirmationDialog} from '@netx/core-components/Confirmation/ConfirmationDialog';\nimport {withTheme} from '@netx/core-components/Theme';\nconst ThemedComponent = withTheme(ConfirmationDialog);\n\nexport type ConfrimViewProps = {\n\teventStr: string;\n\targs?: any[];\n\tmessage?: string;\n\tcancelLabel?: string;\n\ttitle?: string;\n\tconfirmLabel?: string;\n};\n\nexport class ConfirmView extends Base {\n\targs: any[];\n\tcancelLabel?: string;\n\tconfirmLabel?: string;\n\topen: boolean;\n\teventStr: string;\n\tmessage: string;\n\ttitle: string;\n\n\tconstructor(opts: ConfrimViewProps) {\n\t\tsuper(opts);\n\n\t\tthis.open = true;\n\t\tthis.eventStr = opts.eventStr;\n\t\tthis.message =\n\t\t\topts.message != null ? opts.message : i18n.t('i18n.areYouSure');\n\t\tthis.title = opts.title != null ? opts.title : i18n.t('i18n.confirm');\n\t\tthis.cancelLabel = opts.cancelLabel;\n\t\tthis.confirmLabel = opts.confirmLabel;\n\t\tthis.args = opts.args || [];\n\t}\n\n\trender() {\n\t\treturn super.render(ThemedComponent, {\n\t\t\tdescription: this.message,\n\t\t\ttitle: this.title,\n\t\t\topen: this.open,\n\t\t\tonSubmit: this.onConfirm.bind(this),\n\t\t\tcancelLabel: this.cancelLabel,\n\t\t\tconfirmLabel: this.confirmLabel,\n\t\t\tonClose: () => {\n\t\t\t\tthis.open = false;\n\t\t\t\tthis.render();\n\t\t\t\tthis.onCancel();\n\t\t\t},\n\t\t\tTransitionProps: {\n\t\t\t\tonExited: this.remove.bind(this),\n\t\t\t},\n\t\t});\n\t}\n\n\tonCancel() {\n\t\tthis.open = false;\n\t\tthis.render();\n\t\tdispatcher.trigger.apply(\n\t\t\tdispatcher,\n\t\t\t[`${this.eventStr}:cancelled`].concat(this.args),\n\t\t);\n\t}\n\n\tonConfirm() {\n\t\tthis.open = false;\n\t\tthis.render();\n\n\t\tdispatcher.trigger.apply(\n\t\t\tdispatcher,\n\t\t\t[`${this.eventStr}:confirmed`].concat(this.args),\n\t\t);\n\t}\n}\n\nexport default ConfirmView;\n","import {dispatcher} from '@netx/core/bootstrap';\nimport {expireAsset} from './api';\n\nimport type {AssetId} from '@netx/core-asset/types';\nimport {RpcError} from '@netx/core/typings';\n\nimport ConfirmView from '@netx/core-app/services/confirmation/views/confirm';\nimport {\n\tASSET_EXPIRATION_CONFIRMATIONS,\n\tASSET_EXPIRATION_SUBMIT_LABELS,\n} from './locales';\nimport {userInputToExpirationTime} from './utils';\n\nimport {ASSET_EXPIRATION_EVENT, BASE_EVENT} from './actions';\n\ndispatcher.once(`${BASE_EVENT}:init`, () => {\n\tdispatcher.on(\n\t\tASSET_EXPIRATION_EVENT.EXPIRE,\n\t\tasync (id: AssetId, expirationDate: string) => {\n\t\t\tawait expireAsset({\n\t\t\t\tid,\n\t\t\t\texpirationDate: userInputToExpirationTime(expirationDate),\n\t\t\t});\n\t\t\tdispatcher.trigger(\n\t\t\t\t`${ASSET_EXPIRATION_EVENT.EXPIRE}:success`,\n\t\t\t\tid,\n\t\t\t\texpirationDate,\n\t\t\t);\n\t\t},\n\t);\n\n\tdispatcher.on(ASSET_EXPIRATION_EVENT.UNEXPIRE, (id: AssetId) => {\n\t\tnew ConfirmView({\n\t\t\teventStr: ASSET_EXPIRATION_EVENT.UNEXPIRE,\n\t\t\targs: [id],\n\t\t\tmessage: ASSET_EXPIRATION_CONFIRMATIONS.UNEXPIRE,\n\t\t\tconfirmLabel: ASSET_EXPIRATION_SUBMIT_LABELS.UNEXPIRE,\n\t\t}).render();\n\t});\n\n\tdispatcher.on(\n\t\t`${ASSET_EXPIRATION_EVENT.UNEXPIRE}:confirmed`,\n\t\tasync (id: AssetId) => {\n\t\t\tawait expireAsset({id, expirationDate: 0});\n\t\t\tdispatcher.trigger(`${ASSET_EXPIRATION_EVENT.UNEXPIRE}:success`, id, 0);\n\t\t},\n\t);\n\n\tdispatcher.trigger(`${BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${BASE_EVENT}:initialized`, () => resolve());\n\t\t\tdispatcher.trigger(`${BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import Base from '@netx/core/lib/netx-view';\n\nimport Netx from '@netx/core/bootstrap';\nimport type {SearchRuleConditions} from '@netx/core-search-rules';\nimport type {AssetGalleryContainerRef} from '@netx/core-asset-gallery/containers';\nimport {AssetGalleryPref} from '../constants';\nimport '../css/asset-gallery.less';\n\nconst defaults = {\n\tattributeSetSelectionDefault: ['all'],\n\tsortFieldPrefKey: AssetGalleryPref.SortField,\n\tsortOrderPrefKey: AssetGalleryPref.SortOrder,\n};\n\nexport type AssetGalleryViewOpts = {\n\tconditions: SearchRuleConditions;\n\tpage?: number;\n};\n\nexport class AssetGalleryView extends Base {\n\tconditions: SearchRuleConditions;\n\tpage: number;\n\tgalleryRef?: AssetGalleryContainerRef;\n\n\tconstructor(opts: AssetGalleryViewOpts) {\n\t\tsuper({\n\t\t\t...opts,\n\t\t\tremoveOnHide: false,\n\t\t\tremoveOnSimpleHide: false,\n\t\t\tid: 'react-gallery',\n\t\t});\n\n\t\tthis.conditions = opts.conditions;\n\t\tthis.page = opts.page || 1;\n\n\t\t// race condition: sometimes the `GalleryHack` is ready when we are\n\t\t// and sometimes it is not\n\t\tlet hackReady = (Netx as any).GalleryHack?.renderedOnce === true;\n\t\t// set flag that we wanted to render but the `GalleryHack` was not ready\n\t\tlet renderRequested = false;\n\n\t\t// Listen for the custom event\n\t\tdispatcher.once('gallery:hack:ready', () => {\n\t\t\thackReady = true;\n\t\t\tif (!renderRequested) return;\n\t\t\trenderRequested = false;\n\t\t\tthis.hackRender();\n\t\t});\n\n\t\tthis.listenTo(\n\t\t\tthis.viewSpec,\n\t\t\t'change:viewOptions:conditions',\n\t\t\t(model, conditions: SearchRuleConditions) => {\n\t\t\t\tthis.conditions = conditions;\n\t\t\t\t// if we haven't rendered once, do not call the hack\n\t\t\t\t// the hack will be called when this view renders\n\t\t\t\tif (!this.renderedOnce) return;\n\t\t\t\thackReady && this.hackRender();\n\t\t\t},\n\t\t);\n\n\t\tthis.listenTo(\n\t\t\tthis.viewSpec,\n\t\t\t'change:viewOptions:page',\n\t\t\t(model, page: number) => {\n\t\t\t\tthis.page = page;\n\t\t\t\tif (!hackReady) return;\n\t\t\t\tthis.galleryRef?.current?.setPage(page);\n\t\t\t},\n\t\t);\n\n\t\tthis.rendered.then(() => {\n\t\t\thackReady ? this.hackRender() : (renderRequested = true);\n\t\t});\n\t}\n\n\thackRender() {\n\t\tthis.galleryRef = (Netx as any).GalleryHack?.showAssets({\n\t\t\t...defaults,\n\t\t\tconditions: this.conditions,\n\t\t\tpage: this.page,\n\t\t});\n\t}\n\n\tremove() {\n\t\tdelete this.galleryRef;\n\t\t(Netx as any).GalleryHack?.hideAssets();\n\t\treturn super.remove();\n\t}\n\n\t/**\n\t * @static\n\t * @type {string}\n\t */\n\tstatic get __name__() {\n\t\treturn 'AssetGalleryView';\n\t}\n}\n\nexport default AssetGalleryView;\n","import {faInboxIn} from '@fortawesome/pro-solid-svg-icons';\n\nexport const ASSET_GALLERY_ACTION_ICON = {\n\tADD_TO_CART: faInboxIn,\n};\n\nexport const ASSET_GALLERY_DISPATCHER_BASE_EVENT = `asset:gallery`;\n\nexport const ASSET_GALLERY_DISPATCHER_EVENT = <const>{\n\tSHOW: `${ASSET_GALLERY_DISPATCHER_BASE_EVENT}:show`,\n\tADD_TO_CART: `${ASSET_GALLERY_DISPATCHER_BASE_EVENT}:addToCart`,\n\tSHOW_DETAIL: `${ASSET_GALLERY_DISPATCHER_BASE_EVENT}:show:detail`,\n};\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport {AssetGalleryView} from './views';\nimport type {Asset} from '@netx/core-asset/types';\nimport AssetsCollection from '@netx/core-asset/collections/assets';\n\nimport {convertRulesToCollection} from '@netx/core-search-rules/utils/convertRulesToCollection';\nimport type {SearchRuleConditions} from '@netx/core-search-rules/types';\nimport {SearchFacetFilterMode} from '@netx/core-search-facets/constants';\nimport type {SearchFacetSelection} from '@netx/core-search-facets/types';\nimport {\n\tASSET_GALLERY_DISPATCHER_BASE_EVENT,\n\tASSET_GALLERY_DISPATCHER_EVENT,\n} from './actions';\n\ndispatcher.once(`${ASSET_GALLERY_DISPATCHER_BASE_EVENT}:init`, () => {\n\tdispatcher.on(\n\t\tASSET_GALLERY_DISPATCHER_EVENT.SHOW,\n\t\t(viewOptions: {conditions: SearchRuleConditions; page?: number}) => {\n\t\t\tNetx.app.appViews.add({\n\t\t\t\tviewClass: AssetGalleryView as any,\n\t\t\t\tshowActions: ['asset:gallery:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t);\n\n\tdispatcher.on(\n\t\tASSET_GALLERY_DISPATCHER_EVENT.ADD_TO_CART,\n\t\t(\n\t\t\tconditions: SearchRuleConditions,\n\t\t\tselectedFacets: SearchFacetSelection[],\n\t\t\tfacetFilterMode: SearchFacetFilterMode,\n\t\t) => {\n\t\t\tconst selection = convertRulesToCollection(conditions);\n\t\t\tlet _selectedFacets = selectedFacets;\n\t\t\t// TODO: clean this shit up\n\t\t\t(selection as any).searchFacets = {\n\t\t\t\tfilterMode: facetFilterMode,\n\t\t\t\tselectedValues: () => _selectedFacets,\n\t\t\t\tturnOff: () => (_selectedFacets = []),\n\t\t\t\tturnOn: () => (_selectedFacets = selectedFacets),\n\t\t\t\ttrigger: () => {},\n\t\t\t\tlistenTo: () => {},\n\t\t\t\ton: () => {},\n\t\t\t\toff: () => {},\n\t\t\t\tstopListening: () => {},\n\t\t\t\tset: () => {},\n\t\t\t\treset: () => {},\n\t\t\t};\n\t\t\tdispatcher.trigger('cart:addAll', selection);\n\t\t},\n\t);\n\n\tdispatcher.on(\n\t\tASSET_GALLERY_DISPATCHER_EVENT.SHOW_DETAIL,\n\t\t(\n\t\t\tasset: Asset,\n\t\t\tassets: Asset[],\n\t\t\tconditions: SearchRuleConditions,\n\t\t\tselectedFacets: SearchFacetSelection[],\n\t\t\tfacetFilterMode: SearchFacetFilterMode,\n\t\t\tpage: number,\n\t\t) => {\n\t\t\tconst {router} = Netx;\n\t\t\tconst {cursor, current} = Netx.asset;\n\n\t\t\t// This is basically all the logic from theme detail mixed in with caching the search to the cursor\n\t\t\tconst tab = Netx.getPreference('asset.detail.tabPreference');\n\t\t\tconst currentId = cursor.length ? current.id : 0;\n\t\t\tconst selection = convertRulesToCollection(conditions);\n\n\t\t\tlet _selectedFacets = selectedFacets;\n\t\t\t// TODO: clean this shit up\n\t\t\t(selection as any).searchFacets = {\n\t\t\t\tfilterMode: facetFilterMode,\n\t\t\t\tselectedValues: () => _selectedFacets,\n\t\t\t\tturnOff: () => (_selectedFacets = []),\n\t\t\t\tturnOn: () => (_selectedFacets = selectedFacets),\n\t\t\t\ttrigger: () => {},\n\t\t\t\tlistenTo: () => {},\n\t\t\t\ton: () => {},\n\t\t\t\toff: () => {},\n\t\t\t\tstopListening: () => {},\n\t\t\t\tset: () => {},\n\t\t\t\treset: () => {},\n\t\t\t};\n\n\t\t\tconst assetsCollection = new AssetsCollection(\n\t\t\t\tassets.slice(0, 200).filter((asset) => asset != null),\n\t\t\t\t{\n\t\t\t\t\tselection,\n\t\t\t\t\tuseFacetedSearch: true,\n\t\t\t\t},\n\t\t\t);\n\t\t\t// assetsCollection.useFacetedSearch(true);\n\t\t\tassetsCollection.curPage = page;\n\t\t\tassetsCollection.setStartPosition();\n\t\t\tcursor.cacheFetch(assetsCollection);\n\n\t\t\trouter.navigate(`asset/${asset.assetId}`, false);\n\t\t\trouter.history.unshift(`asset/${asset.assetId}`);\n\n\t\t\tdispatcher.trigger('asset:detail:show', {\n\t\t\t\tmodel: current,\n\t\t\t\tcollection: cursor,\n\t\t\t\ttab: tab,\n\t\t\t\trouteMatch: new RegExp(/^asset\\/(\\S+)/),\n\t\t\t});\n\n\t\t\t// Better test: Have we just routed to this asset from elsewhere?\n\t\t\t// (TODO: make this test a method on Netx.Router, and backport to core.\n\t\t\tif (\n\t\t\t\t// if current asset doesn't match, or\n\t\t\t\tasset.assetId != currentId ||\n\t\t\t\t// if we just loaded the app, or\n\t\t\t\t!router.history[0] ||\n\t\t\t\t// if we're routing from anywhere but this asset\n\t\t\t\t(!router.history[0].match(\n\t\t\t\t\tnew RegExp('^asset/' + asset.assetId + '$'),\n\t\t\t\t) &&\n\t\t\t\t\t!router.history[0].match(new RegExp('^asset/' + asset.assetId + '/')))\n\t\t\t) {\n\t\t\t\tdispatcher.once('asset:cursor:goto:at', function () {\n\t\t\t\t\t// load all asset data when current asset updates\n\t\t\t\t\ttab && dispatcher.trigger('asset:detail:' + tab);\n\t\t\t\t});\n\t\t\t\t// update current asset\n\t\t\t\tdispatcher.trigger('asset:cursor:goto', asset.assetId);\n\t\t\t} else {\n\t\t\t\t// load all asset data for this asset.\n\t\t\t\ttab && dispatcher.trigger('asset:detail:' + tab);\n\t\t\t}\n\t\t},\n\t);\n\n\tdispatcher.trigger(`${ASSET_GALLERY_DISPATCHER_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${ASSET_GALLERY_DISPATCHER_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(\n\t\t\t\t`${ASSET_GALLERY_DISPATCHER_BASE_EVENT}:initialized`,\n\t\t\t\t() => resolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${ASSET_GALLERY_DISPATCHER_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport AssetModel from '@netx/core-asset/models/asset';\nimport type {Asset} from '@netx/core-asset/types';\nimport {ASSET_PROJECT_EVENT, ASSET_PROJECT_BASE_EVENT} from './actions';\n\ndispatcher.once(`${ASSET_PROJECT_BASE_EVENT}:init`, () => {\n\tdispatcher.on(ASSET_PROJECT_EVENT.PROJECT, (asset: Asset) => {\n\t\tdispatcher.trigger('project:asset', new AssetModel(asset));\n\t});\n\n\tdispatcher.on(ASSET_PROJECT_EVENT.ADD_TO_PROJECT, (asset: Asset) => {\n\t\tdispatcher.trigger('project:add:asset', new AssetModel(asset));\n\t});\n\n\tdispatcher.on(ASSET_PROJECT_EVENT.CREATE_PROJECT, (asset: Asset) => {\n\t\tdispatcher.trigger('project:new:from:asset', new AssetModel(asset));\n\t});\n\n\tdispatcher.trigger(`${ASSET_PROJECT_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${ASSET_PROJECT_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${ASSET_PROJECT_BASE_EVENT}:initialized`, () =>\n\t\t\t\tresolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${ASSET_PROJECT_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport BatchJobModel from '@netx/core-app/models/batchJob';\nimport AssetModel from '@netx/core-asset/models/asset';\nimport type {Asset} from '@netx/core-asset/types';\nimport {ASSET_RESYNC_EVENT, ASSET_RESYNC_BASE_EVENT} from './actions';\n\ndispatcher.once(`${ASSET_RESYNC_BASE_EVENT}:init`, () => {\n\tdispatcher.on(ASSET_RESYNC_EVENT.RESYNC, (asset: Asset) => {\n\t\tconst model = new AssetModel(asset);\n\t\tmodel\n\t\t\t.resync()\n\t\t\t.then((batchJob) => {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t`${ASSET_RESYNC_BASE_EVENT}:success`,\n\t\t\t\t\tmodel,\n\t\t\t\t\tbatchJob,\n\t\t\t\t);\n\n\t\t\t\tbatchJob.completed.then(\n\t\t\t\t\t(batchJob) => {\n\t\t\t\t\t\tdispatcher.trigger(`${ASSET_RESYNC_BASE_EVENT}:complete`, model);\n\t\t\t\t\t\tdispatcher.trigger('asset:resynced', model.id);\n\t\t\t\t\t},\n\t\t\t\t\t(err, batchJob) =>\n\t\t\t\t\t\tdispatcher.trigger(`${ASSET_RESYNC_BASE_EVENT}:error`, err, model),\n\t\t\t\t);\n\t\t\t})\n\t\t\t.catch((ex) =>\n\t\t\t\tdispatcher.trigger(`${ASSET_RESYNC_BASE_EVENT}:error`, ex, model),\n\t\t\t);\n\t});\n\n\tdispatcher.on(\n\t\t`${ASSET_RESYNC_EVENT.RESYNC}:complete`,\n\t\t(assetModel: AssetModel) => {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [assetModel.id],\n\t\t\t\ttitle: i18n.t('i18n.assetUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.resyncedAsset', {id: assetModel.id}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t);\n\n\tdispatcher.on(\n\t\t`${ASSET_RESYNC_EVENT.RESYNC}:error`,\n\t\t(error: Error, assetModel: AssetModel) =>\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error')),\n\t);\n\n\tdispatcher.on(\n\t\t`${ASSET_RESYNC_EVENT.RESYNC}:success`,\n\t\t(assetModel: AssetModel, batchJob: BatchJobModel) => {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [assetModel.id],\n\t\t\t\ttitle: i18n.t('i18n.assetUpdating'),\n\t\t\t\tdescription: i18n.t('i18n.resyncingAsset', {id: assetModel.id}),\n\t\t\t\ttype: 'info',\n\t\t\t\tprogressTask: {\n\t\t\t\t\tuuid: batchJob.id,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t);\n\n\tdispatcher.trigger(`${ASSET_RESYNC_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${ASSET_RESYNC_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${ASSET_RESYNC_BASE_EVENT}:initialized`, () =>\n\t\t\t\tresolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${ASSET_RESYNC_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport BatchJobModel from '@netx/core-app/models/batchJob';\nimport AssetModel from '@netx/core-asset/models/asset';\nimport type {Asset} from '@netx/core-asset/types';\nimport {ASSET_DELETE_EVENT, ASSET_DELETE_BASE_EVENT} from './actions';\nimport {ASSET_DELETE_CONFIRMATIONS} from './locales';\n\nimport ConfirmView from '@netx/core-app/services/confirmation/views/confirm';\n\ndispatcher.once(`${ASSET_DELETE_BASE_EVENT}:init`, () => {\n\tdispatcher.on(ASSET_DELETE_EVENT.DELETE, (asset: Asset) => {\n\t\tnew ConfirmView({\n\t\t\teventStr: ASSET_DELETE_EVENT.DELETE,\n\t\t\targs: [asset],\n\t\t\tmessage: ASSET_DELETE_CONFIRMATIONS.DELETE,\n\t\t\tconfirmLabel: i18n.t('i18n.delete'),\n\t\t}).render();\n\t});\n\n\tdispatcher.on(`${ASSET_DELETE_EVENT.DELETE}:confirmed`, (asset: Asset) => {\n\t\tconst assetModel = new AssetModel(asset);\n\t\tassetModel\n\t\t\t.destroy({wait: true})\n\t\t\t.then(() => {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'asset:deleted',\n\t\t\t\t\tassetModel.id,\n\t\t\t\t\tassetModel.attributes,\n\t\t\t\t);\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t`asset:deleted:${assetModel.id}`,\n\t\t\t\t\tassetModel.attributes,\n\t\t\t\t);\n\t\t\t\tdispatcher.trigger(ASSET_DELETE_EVENT.SUCCESS, assetModel);\n\t\t\t})\n\t\t\t.catch((ex) =>\n\t\t\t\tdispatcher.trigger(ASSET_DELETE_EVENT.ERROR, ex, assetModel),\n\t\t\t);\n\t});\n\n\tdispatcher.on(\n\t\tASSET_DELETE_EVENT.ERROR,\n\t\t(error: Error, assetModel: AssetModel) =>\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error')),\n\t);\n\n\tdispatcher.on(\n\t\tASSET_DELETE_EVENT.SUCCESS,\n\t\t(assetModel: AssetModel, batchJob: BatchJobModel) => {\n\t\t\t// Re-fetch current cart if the asset was in it\n\t\t\t// TODO: the cart can listen for this...\n\t\t\tassetModel.get('inCurrentCart') && (Netx as any).cart.current.fetch();\n\n\t\t\t// TODO: eventually, asset detail can listen for this\n\t\t\t// DAM-15713 - on an asset that does not exist\n\t\t\tif (window.location.hash.match(`#asset/${assetModel.id}`)) {\n\t\t\t\tNetx.router.exitRoute(new RegExp(`asset\\/${assetModel.id}.*`));\n\t\t\t}\n\t\t},\n\t);\n\n\tdispatcher.trigger(`${ASSET_DELETE_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${ASSET_DELETE_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${ASSET_DELETE_BASE_EVENT}:initialized`, () =>\n\t\t\t\tresolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${ASSET_DELETE_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","/**\n * The asset module maintains various views, models & collections of assets for use throughout DAM apps.\n * Required by almost everything.\n *\n * @module asset\n */\n\n// Models\nimport CoreModel from '@netx/core/lib/netx-model';\nimport AssetModel from './models/asset';\nimport AssetRequestModel from '@netx/core-asset/models/assetRequest';\nimport AssetSetModel from './models/assetSet';\nimport AssetViewModel from './models/assetView';\nimport CurrentAssetModel from './models/currentAsset';\nimport DownloadOptionModel from '@netx/core-share/models/downloadOption';\n\n// Singletons\nimport {\n\tattributes as attributesSingleton,\n\tassetAttributes as assetAttributesSingleton,\n\tclipAttributes as clipAttributesSingleton,\n} from './collections/singleton/attributes';\n\nimport {attributeSets as attributeSetsSingleton} from './collections/singleton/attributeSets';\n\n// Collections\nimport AssetAttributeSetsSelectionCollection from './collections/assetAttributeSetsSelection';\nimport AssetCursorCollection from './collections/assetCursor';\nimport AssetRequestsCollection from '@netx/core-asset/collections/assetRequests';\nimport AssetTasksCollection from './collections/assetTasks';\nimport DownloadOptionsCollection from '@netx/core-share/collections/downloadOptions';\nimport MetadataMapsCollection from './collections/metadataMaps';\nimport MiniAssetsCollection from './collections/miniAssets';\nimport PendingAssetsCollection from './collections/pendingAssets';\n\n// Views\nimport AssetVersionReactivateView from './views/assetVersionReactivate';\nimport AssetConstituentDownloadView_Clip from './views/assetConstituentDownloadView_clip';\nimport AssetDetailView from './views/assetDetailView';\n\nimport AssetConstituentClipModel from './models/assetConstituent_clip';\n\nimport NxVideo from '@netx/core/lib/netx-video';\n\nimport {types as assetSetTypes} from './properties/assetSets';\nimport {checkinErrors} from '@netx/core-upload/properties/errors';\n\n// Asset config `Netx.asset.options`\nimport customConfig from './config';\n\nimport routes from './routes';\n\nimport {things as assetThings} from './properties/asset';\nimport {types as downloadOptionTypes} from '@netx/core-share/properties/downloadOptions';\n\nimport AssetRepurposeController from '@netx/core-asset-repurpose/controller';\nimport AssetCustomThumbnailController from '@netx/core-asset-custom-thumbnail/controller';\nimport {convertToRules} from '@netx/core-search-rules/utils/convertToRules';\nimport {createExpirationRule} from '@netx/core-search-rules/rules/expiration/expirationRule';\n\nimport {openDownloadLink} from '@netx/core/utils';\n\nimport {\n\tassetHasClips,\n\tassetHasConstituents_clips,\n\tassetHasConstituents_keyframes,\n\tassetHasConstituents_layers,\n\tassetHasConstituents_pages,\n\tassetHasDetail,\n\tassetHasLinks,\n\tassetHasMetadata,\n\tassetHasPreview,\n\tassetHasProjects,\n\tassetHasReviews,\n\tassetHasVersions,\n\tassetHasViews,\n} from './enablers';\nimport {checksumEnabled} from '@netx/core-asset/enablers';\nimport {systemAttributes} from '@netx/core-asset/properties/attributes';\n\nimport AssetExpirationController from '@netx/core-asset-expiration/controller';\nimport AssetGalleryController from '@netx/core-asset-gallery/controller';\nimport AssetProjectController from '@netx/core-asset-project/controller';\nimport AssetResyncController from './services/resync/controller';\nimport AssetDeleteController from './services/delete/controller';\nimport {PDF_VIEWER_EVENT} from '@netx/core-pdf-viewer/actions';\n\nconst AssetDetailEnablers = {\n\tassetHasClips,\n\tassetHasConstituents_clips,\n\tassetHasConstituents_keyframes,\n\tassetHasConstituents_layers,\n\tassetHasConstituents_pages,\n\tassetHasDetail,\n\tassetHasLinks,\n\tassetHasMetadata,\n\tassetHasPreview,\n\tassetHasProjects,\n\tassetHasReviews,\n\tassetHasVersions,\n\tassetHasViews,\n};\n\n// SHAREABLE TYPES\n/////////////////////////\n// Define shareable types introduced by this module.\n\n_.extend(Netx.ShareableTypes, {\n\tassets: {\n\t\tlabel: i18n.t('i18n.assets'),\n\t},\n\t'assets PDF': {\n\t\tlabel: i18n.t('i18n.assetContactSheet'),\n\t},\n\t'assets repurposed': {\n\t\tlabel: i18n.t('i18n.repurposedAssets'),\n\t},\n});\n\n// MODULE INITIALIZATION\n/////////////////////////\n// All collection and model instances and event listeners\n// are created when the module is initialized.\n\n/**\n * Init handler\n * @event module:asset#asset:init\n * @param {object} options Normally undefined, but a manual init trigger may override properties of Netx.custom.asset here.\n * @fires module:asset#asset:extend\n * @fires module:asset#asset:initialized\n * @listens Netx.asset.cursor#sync\n */\ndispatcher.once('asset:init', function (options) {\n\t// Check for module options\n\toptions = _.extend({}, customConfig, options);\n\n\t/**\n\t * @property {object} Netx.asset - Used to store custom module options\n\t * @property {Netx.Collections.AssetAttributes} Netx.asset.attributes - The set of metadata objects defined for all assets in the DAM\n\t * @property {array} Netx.asset.bootstrap - Array of promises\n\t * @property {module:asset/models/asset} Netx.asset.current - The asset loaded by the #asset/id route and reflected by assetDetailView\n\t * @property {Netx.Collection.Assets} Netx.asset.cursor - A one-element wide Collection of Assets used to page through the contents of a MiniAssets collection\n\t * @property {number} Netx.asset.cursor.pageSize - Default page size\n\t * @property {number} Netx.asset.cursor.chunkSize - Default chunk size\n\t * @property {Netx.Collections.MiniAssets} Netx.asset.misc - Stores various asset lists not gathered by fetch -- popular assets, recent uploads, etc\n\t * @property {Netx.Collections.PendingAssets} Netx.asset.pending - The set of assets in flux\n\t * @property {object} Netx.asset.presets - The set of asset repurposing presets defined in the DAM\n\t */\n\tvar NS = (Netx.asset = {});\n\tNS.options = options;\n\n\tvar fsViews = Netx.app.fsViews,\n\t\tappViews = Netx.app.appViews,\n\t\tmodalViews = Netx.app.modalViews;\n\n\t// Helper functions\n\t_.extend(Netx, {\n\t\t/**\n\t\t * @function\n\t\t * @param {number} id Template id\n\t\t * @param {string} name Template name (we need to get everything over to id)\n\t\t * @return {module:asset/models/attribute} Attribute template\n\t\t */\n\t\tgetAttribute: function (id, name) {\n\t\t\tif (name != null) {\n\t\t\t\treturn NS.attributes.findWhere({name: name});\n\t\t\t}\n\t\t\treturn NS.attributes.get(parseInt(id));\n\t\t},\n\t\t/**\n\t\t * @function\n\t\t * @param {string} name Template name (we need to get everything over to id)\n\t\t * @return {number} Attribute template id\n\t\t */\n\t\tgetAttributeId: function (name) {\n\t\t\tvar attrModel = this.getAttribute(null, name);\n\t\t\treturn attrModel && attrModel.id;\n\t\t},\n\t\t/**\n\t\t * @function\n\t\t * @param {string} type Object type (asset/clip)\n\t\t * @return {module:asset/collections/attributes} Attributes collection\n\t\t */\n\t\tgetAttributes: function () {\n\t\t\treturn NS.attributes;\n\t\t},\n\t\t/**\n\t\t * @function\n\t\t * @param {string} type Object type (asset/clip)\n\t\t * @return {module:asset/collections/attributes} Attributes collection\n\t\t */\n\t\tgetAttributesByObjectType: function (type) {\n\t\t\tvar existing = NS[type + 'Attributes'];\n\t\t\treturn existing ? existing : NS.attributes.filterByObjectType(type);\n\t\t},\n\t});\n\n\t// PUBLIC MODELS & COLLECTIONS\n\t/////////////////////////\n\t// Object initializations, etc, go here.\n\n\t// The set of asset metadata objects defined for all assets in the DAM\n\t// Until we can get away from this global namespace\n\t// doing this will maintain the behavior in the rest of the app while allowing\n\t// us to slowly switch over to importing the singleton instead\n\tNS.attributes = attributesSingleton;\n\tNS.assetAttributes = assetAttributesSingleton;\n\tNS.clipAttributes = clipAttributesSingleton;\n\n\t// The asset loaded by the #asset/id route and reflected by assetDetailView\n\t// Note: this will be the extra responder you always see when running 'asset:testing'\n\tNS.current = new CurrentAssetModel(null, {assetAttributes: NS.attributes});\n\t// Because so much listens to this - a destroy on it is catastrophic\n\tNS.current.destroy = function () {\n\t\tvar asset = new AssetModel({assetId: this.id});\n\t\treturn asset.destroy().then(\n\t\t\t_.bind(function () {\n\t\t\t\tNS.cursor.remove(this.id);\n\t\t\t\tthis.trigger('deleted');\n\t\t\t}, this),\n\t\t);\n\t};\n\n\t// A one-element wide Collection of Assets used to page through the contents of a MiniAssets collection\n\tNS.cursor = new AssetCursorCollection([], {pagerRoutes: false});\n\n\t// The set of all MetadataMaps (mappings from asset attributes to embedded metadata fields) defined in the DAM\n\tNS.metadataMaps = new MetadataMapsCollection();\n\t// Stores various asset lists not gathered by fetch -- popular assets, recent uploads, etc\n\tNS.misc = new MiniAssetsCollection([]);\n\t// The set of assets in flux\n\tNS.pending = new PendingAssetsCollection([]);\n\n\tNS.tasks = new AssetTasksCollection([])\n\t\t.on('taskComplete', (task) => {\n\t\t\tdispatcher.trigger('asset:task:complete:' + task.id, task);\n\t\t\tdispatcher.trigger('asset:task:complete', task);\n\t\t})\n\t\t// A single asset task has updated\n\t\t.on('taskStatus', (task) => {\n\t\t\tdispatcher.trigger('asset:task:status', task);\n\t\t\tdispatcher.trigger('asset:task:' + task.id + ':status', task);\n\t\t})\n\t\t// All asset tasks have completed\n\t\t.on('complete', (tasks) => {\n\t\t\tdispatcher.trigger('asset:tasks:complete', tasks);\n\t\t});\n\n\t// Bootstrapping: collect information from the DAM before we finish initializing\n\t// Collect promises in this array\n\tNS.bootstrap = [\n\t\tAssetResyncController.initialize(),\n\t\tAssetGalleryController.initialize(),\n\t\tAssetDeleteController.initialize(),\n\t\tNetx.getUserLevel() > 0 ? AssetExpirationController.initialize() : true,\n\t\tNetx.getUserLevel() > 0 ? AssetRepurposeController.initialize() : true,\n\t\tNetx.getUserLevel() > 0\n\t\t\t? AssetCustomThumbnailController.initialize()\n\t\t\t: true,\n\t\tNetx.getPreference('review.enabled', true)\n\t\t\t? AssetProjectController.initialize()\n\t\t\t: true,\n\t];\n\n\tif (checksumEnabled()) {\n\t\tsystemAttributes.push({\n\t\t\tcode: 'checksum',\n\t\t\tkey: 'checksum',\n\t\t\tid: -117,\n\t\t\tname: i18n.t('i18n.checksum'),\n\t\t});\n\t}\n\n\t// Until we can get away from this global namespace\n\t// doing this will maintain the behavior in the rest of the app while allowing\n\t// us to slowly switch over to importing the singleton instead\n\tNS.attributeSets = attributeSetsSingleton;\n\t// Sets are becoming necessary for load time things\n\tNS.bootstrap.push(\n\t\tnew Promise((resolve) => {\n\t\t\tattributeSetsSingleton.once('sync', resolve);\n\t\t}),\n\t);\n\n\t// Create a AssetAttributeSetsSelection for each of our layout types\n\tNS.listTypeAttributeSetsSelections = {};\n\t_.each(\n\t\toptions.LIST_TYPE,\n\t\tfunction (listType) {\n\t\t\t// Selected attribute set when in this gallery mode\n\t\t\tthis[listType] = new AssetAttributeSetsSelectionCollection([], {\n\t\t\t\tassetAttributes: NS.assetAttributes,\n\t\t\t\tattributeSets: NS.attributeSets,\n\t\t\t\tuserPrefKey: 'attribute.attributeSets.selected.gallery.' + listType,\n\t\t\t});\n\t\t},\n\t\tNS.listTypeAttributeSetsSelections,\n\t);\n\n\tNS.video = new NxVideo();\n\n\t// Keep variables like `d` contained\n\t// Otherwise we risk polution in the event listeners below\n\t+(function () {\n\t\t// Try to fetch the DAM-wide list of asset attributes\n\t\tvar d = new $.Deferred();\n\t\tNS.bootstrap.push(d.promise());\n\t\tNS.attributes.fetch().then(\n\t\t\tfunction (attrs) {\n\t\t\t\t// got it.\n\t\t\t\td.resolve(attrs);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// If we have a token, it's okay for this to fail.\n\t\t\t\tNetx.getToken() ? d.resolve() : d.reject(err);\n\t\t\t},\n\t\t);\n\t})();\n\n\tif (Netx.getUserLevel() > 0) {\n\t\tif (\n\t\t\tNetx.getPreference('share.metadata.enabled', true) &&\n\t\t\tNetx.getPreference('share.metadata.userLevel') <= Netx.getUserLevel()\n\t\t) {\n\t\t\t// Fetch the metadata map list for use in downloads\n\t\t\tNS.bootstrap.push(NS.metadataMaps.fetch());\n\t\t}\n\t}\n\n\t// Asset attributes\n\t// @fires asset:attributes:fetched\n\tNS.attributes.on('sync', function (collection) {\n\t\tif (collection !== this) return;\n\n\t\tdispatcher.trigger('asset:attributes:fetched', this);\n\t});\n\n\t//=================================\n\t//\tEVENT LISTENERS\n\t//=================================\n\n\t/**\n\t * @event module:asset#asset:misc:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:misc:show',\n\t\tfunction (viewOptions) {\n\t\t\tPromise.all([\n\t\t\t\timport(\n\t\t\t\t\t/* webpackChunkName: \"view-assetListView\" */ './views/assetListView'\n\t\t\t\t),\n\t\t\t\timport(\n\t\t\t\t\t/* webpackChunkName: \"view-assetListView\" */ './views/assetListViewTypeManager'\n\t\t\t\t),\n\t\t\t]).then((imported) => {\n\t\t\t\tconst [AssetListView, AssetListViewTypeManagerView] = imported;\n\t\t\t\t// TODO: make own view if we intend to keep\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: NS.options.LIST_TYPES_ENABLED\n\t\t\t\t\t\t? AssetListViewTypeManagerView\n\t\t\t\t\t\t: AssetListView,\n\t\t\t\t\tshowActions: ['asset:misc:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Handler for \"misc\" routes (uploads/recent and assets/popular) which gather\n\t * assets via nonstandard rpc methods.\n\t * @event module:asset#asset:misc\n\t * @param {string} type The specific misc route\n\t * @fires module:asset#asset:misc:show\n\t */\n\tdispatcher.on('asset:misc', function (type) {\n\t\tvar title = i18n.t('i18n.misc');\n\t\tswitch (type) {\n\t\t\tcase 'uploads/recent':\n\t\t\t\tNS.misc.getRecentlyUploadedAssets();\n\t\t\t\ttitle = i18n.t('i18n.recentUploads');\n\t\t\t\tbreak;\n\t\t\tcase 'assets/popular':\n\t\t\t\tNS.misc.getMostViewedAssets();\n\t\t\t\ttitle = i18n.t('i18n.popularAssets');\n\t\t\t\tbreak;\n\t\t}\n\t\t// Show\n\t\tdispatcher.trigger('asset:misc:show', {\n\t\t\tid: 'asset-misc',\n\t\t\tclassName: 'asset-list-wrapper grid scrollable',\n\t\t\tcollection: NS.misc,\n\t\t\tautoSort: false,\n\t\t\theaderTitle: title,\n\t\t});\n\t});\n\n\t/**\n\t * Route to asset\n\t * @event module:asset#asset:route\n\t * @param {number|string|module:asset/models/asset} id An asset id or asset model\n\t */\n\tdispatcher.on('asset:route', function (id, newWindow = false) {\n\t\tif (id instanceof CoreModel) {\n\t\t\tid = id.id;\n\t\t}\n\t\tif (_.isUndefined(NS.pending.get(id))) {\n\t\t\tif (newWindow) {\n\t\t\t\twindow.open(`${Netx.URL.base}#asset/${id}`, '_blank');\n\t\t\t} else {\n\t\t\t\tNetx.router.navigate(`asset/${id}`, true);\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * @event module:asset#asset:detail:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:detail:show',\n\t\tfunction (viewOptions) {\n\t\t\tappViews.add({\n\t\t\t\tviewClass: AssetDetailView,\n\t\t\t\tshowActions: ['asset:detail:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Handles /asset/id routes, optionally with /tab\n\t * @event module:asset#asset:routed\n\t * @param {number|string} id Asset id\n\t * @param {string} tab Tab name\n\t * @fires module:asset#asset:cursor:goto\n\t * @fires module:asset#asset:detail:(tab)\n\t * @fires module:asset#asset:detail:show\n\t * @listens module:asset#asset:current:goto:at\n\t */\n\tdispatcher.on('asset:routed', function (id, tab) {\n\t\t// Show\n\t\tdispatcher.trigger('asset:detail:show', {\n\t\t\tmodel: NS.current,\n\t\t\tcollection: NS.cursor,\n\t\t\ttab: tab,\n\t\t\trouteMatch: new RegExp(/^asset\\/(\\d+)/),\n\t\t});\n\n\t\tvar currentId = NS.cursor.length ? NS.current.id : 0;\n\t\tif (id != currentId) {\n\t\t\tif (tab) {\n\t\t\t\tdispatcher.once('asset:current:goto:at', function () {\n\t\t\t\t\t// trigger additional activities when main fetch finishes\n\t\t\t\t\tdispatcher.trigger('asset:detail:tab:' + tab, id);\n\t\t\t\t});\n\t\t\t}\n\t\t\tdispatcher.trigger('asset:cursor:goto', id);\n\t\t} else {\n\t\t\tif (tab) {\n\t\t\t\t// additional activities\n\t\t\t\tdispatcher.trigger('asset:detail:tab:' + tab, id);\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * Handle a change in sort order for an assetListView (by re-fetching).\n\t * @event module:asset#asset:sort\n\t * @param {Netx.Collections.Assets} collection Asset collection\n\t */\n\tdispatcher.on('asset:sort', function (collection) {\n\t\tcollection.fetch({reset: true});\n\t});\n\n\t/**\n\t * Helper for routing to audioEditor from asset route\n\t * @event module:asset#asset:audioEditor:routed\n\t * @fires module:audioEditor#audioEditor:routed\n\t */\n\tdispatcher.on('asset:audioEditor:routed', function (id) {\n\t\t// Load module\n\t\tdispatcher.trigger('netx:load:module:audioeditor', {\n\t\t\terror: function (err) {\n\t\t\t\t// Deal with error\n\t\t\t\tconsole.warn(err);\n\t\t\t},\n\t\t\tinitialized: function () {\n\t\t\t\tdispatcher.trigger('audioEditor:routed', id);\n\t\t\t},\n\t\t});\n\t});\n\n\t/**\n\t * Helper for routing to imageEditor from asset route\n\t * @event module:asset#asset:imageEditor:routed\n\t * @fires module:imageEditor#imageEditor:routed\n\t */\n\tdispatcher.on('asset:imageEditor:routed', function (id) {\n\t\t// Load module\n\t\tdispatcher.trigger('netx:load:module:imageeditor', {\n\t\t\terror: function (err) {\n\t\t\t\t// Deal with error\n\t\t\t\tconsole.warn(err);\n\t\t\t},\n\t\t\tinitialized: function () {\n\t\t\t\tdispatcher.trigger('imageEditor:routed', id);\n\t\t\t},\n\t\t});\n\t});\n\n\t//============================================\n\t//\tAsset attribute history\n\t//============================================\n\tif (Netx.getPreference('metadata.history.enabled', true)) {\n\t\t/**\n\t\t * @event module:asset#asset:attributeHistory:search\n\t\t * @param {module:asset/collections/assetAttributeHistory} collection Collection\n\t\t * @param {string} str Search string\n\t\t * @fires module:asset#asset:attributeHistory:search:error\n\t\t * @fires module:asset#asset:attributeHistory:search:success\n\t\t */\n\t\tdispatcher.on('asset:attributeHistory:search', function (collection, str) {\n\t\t\tcollection.search(str).then(\n\t\t\t\tfunction () {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:attributeHistory:search:success',\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\tstr,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tfunction (error) {\n\t\t\t\t\tdispatcher.trigger('asset:attributeHistory:search:error', error);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t\t/**\n\t\t * @event module:asset#asset:attributeHistory:search:error\n\t\t * @param {string} error Error string\n\t\t * @fires module:app#app:alert\n\t\t */\n\t\tdispatcher.on('asset:attributeHistory:search:error', function (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t});\n\n\t\t/**\n\t\t * @event module:asset#asset:attributeHistory:search:clear\n\t\t * @param {module:asset/collections/assetAttributeHistory} collection Collection\n\t\t * @fires module:asset#asset:attributeHistory:search:clear:error\n\t\t * @fires module:asset#asset:attributeHistory:search:clear:success\n\t\t */\n\t\tdispatcher.on('asset:attributeHistory:search:clear', function (collection) {\n\t\t\tcollection.clearSearch().then(\n\t\t\t\tfunction () {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:attributeHistory:search:clear:success',\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tfunction (error) {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:attributeHistory:search:clear:error',\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t\t/**\n\t\t * @event module:asset#asset:attributeHistory:search:clear:error\n\t\t * @param {string} error Error string\n\t\t * @fires module:app#app:alert\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'asset:attributeHistory:search:clear:error',\n\t\t\tfunction (error) {\n\t\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t\t},\n\t\t);\n\t\t/**\n\t\t * @event module:asset#asset:attributeHistory:export\n\t\t * @param {object} view attribute history view\n\t\t * @param {object} event jquery\n\t\t * @fires module:share#share:download\n\t\t */\n\t\tdispatcher.on('asset:attributeHistory:export', function (view, event) {\n\t\t\t// \"set\" the asset\n\t\t\tvar assetSet = new AssetSetModel({\n\t\t\t\ttype: assetSetTypes.asset,\n\t\t\t\tids: [view.model.id],\n\t\t\t});\n\t\t\t// make historical download option\n\t\t\tvar downloadOptions = new DownloadOptionsCollection([\n\t\t\t\t{\n\t\t\t\t\ttype: downloadOptionTypes.historical,\n\t\t\t\t},\n\t\t\t]);\n\t\t\t// trigger share\n\t\t\tdispatcher.trigger('share:download', assetSet, downloadOptions, {});\n\t\t});\n\t}\n\t//============================================\n\t//\t!Asset attribute history\n\t//============================================\n\n\t//============================================\n\t//\tAsset attributes\n\t//============================================\n\t/**\n\t * @event module:asset#asset:attributes:submit:confirmed\n\t * @param {object} values Asset attribute data\n\t * @param {Netx.Collections.AssetAttributeSetsSelection} collection Selected attribute sets\n\t * @param {Netx.Collections.AssetAttributeDatum} assetAttributeDatum Asset attribute datum\n\t * @fires module:asset#asset:attributes:submit:error\n\t * @fires module:asset#asset:attributes:submit:success\n\t */\n\tdispatcher.on(\n\t\t'asset:attributes:submit:confirmed',\n\t\tfunction (values, collection, assetAttributeDatum) {\n\t\t\tassetAttributeDatum.parseAndSave(values).then(\n\t\t\t\tfunction (obj) {\n\t\t\t\t\tobj.completed.then(\n\t\t\t\t\t\t(rtn) => {\n\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t'asset:attributes:submit:success',\n\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\tassetAttributeDatum,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(err) => {\n\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t'asset:attributes:submit:error',\n\t\t\t\t\t\t\t\terr,\n\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\tassetAttributeDatum,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:attributes:submit:error',\n\t\t\t\t\t\terr,\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\tassetAttributeDatum,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t);\n\n\t/**\n\t * @event module:asset#asset:attributes:submit:success\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'asset:attributes:submit:success',\n\t\tfunction (assetAttributeSetsSelection, assetAttributeDatum) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tdescription: i18n.t('i18n.attributesUpdated'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t//============================================\n\t//\t!Asset attributes\n\t//============================================\n\n\t//============================================\n\t//\tAsset attribute sets\n\t//============================================\n\t/**\n\t * @event module:asset#asset:attributeSet:select:detail\n\t * @param {Netx.Collections.AssetAttributeSetsSelection} attributeSetsSelection Attribute sets selection\n\t * @param {array} selectedIds Generic selected attribute set ids\n\t * @fires module:asset#asset:attributeSet:select:detail:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:attributeSet:select:detail',\n\t\tfunction (attributeSetSelection, selectedIds) {\n\t\t\t// Can override and offer a confirm dialog etc.\n\t\t\tdispatcher.trigger(\n\t\t\t\t'asset:attributeSet:select:detail:confirmed',\n\t\t\t\tattributeSetSelection,\n\t\t\t\tselectedIds,\n\t\t\t);\n\t\t},\n\t);\n\t/**\n\t * @event module:asset#asset:attributeSet:select:detail:confirmed\n\t * @param {Netx.Collections.AssetAttributeSetsSelection} attributeSetsSelection Attribute sets selection\n\t * @param {array} selectedIds Generic selected attribute set ids\n\t */\n\tdispatcher.on(\n\t\t'asset:attributeSet:select:detail:confirmed',\n\t\tfunction (attributeSetSelection, selectedIds) {\n\t\t\tattributeSetSelection.setSelected(selectedIds);\n\t\t},\n\t);\n\t/**\n\t * @event module:asset#asset:attributeSet:select:gallery\n\t * @param {Netx.Collections.AssetAttributeSetsSelection} attributeSetsSelection Attribute sets selection\n\t * @param {string} selectedIds Generic selected attribute set id\n\t * @fires module:asset#asset:attributeSet:select:gallery:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:attributeSet:select:gallery',\n\t\tfunction (attributeSetSelection, selectedId) {\n\t\t\t// Can override and offer a confirm dialog etc.\n\t\t\tdispatcher.trigger(\n\t\t\t\t'asset:attributeSet:select:gallery:confirmed',\n\t\t\t\tattributeSetSelection,\n\t\t\t\tselectedId,\n\t\t\t);\n\t\t},\n\t);\n\t/**\n\t * @event module:asset#asset:attributeSet:select:gallery:confirmed\n\t * @param {Netx.Collections.AssetAttributeSetsSelection} attributeSetsSelection Attribute sets selection\n\t * @param {string} selectedIds Generic selected attribute set id\n\t */\n\tdispatcher.on(\n\t\t'asset:attributeSet:select:gallery:confirmed',\n\t\tfunction (attributeSetSelection, selectedId) {\n\t\t\tattributeSetSelection.setSelected(selectedId);\n\t\t},\n\t);\n\n\t/**\n\t * @event module:asset#asset:attributeSet:select:upload\n\t * @param {Netx.Collections.AssetAttributeSetsSelection} attributeSetsSelection Attribute sets selection\n\t * @param {array} selectedIds Generic selected attribute set ids\n\t * @fires module:asset#asset:attributeSet:select:upload:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:attributeSet:select:upload',\n\t\tfunction (attributeSetSelection, selectedIds) {\n\t\t\t// Can override and offer a confirm dialog etc.\n\t\t\tdispatcher.trigger(\n\t\t\t\t'asset:attributeSet:select:detail:confirmed',\n\t\t\t\tattributeSetSelection,\n\t\t\t\tselectedIds,\n\t\t\t);\n\t\t},\n\t);\n\t/**\n\t * @event module:asset#asset:attributeSet:select:upload:confirmed\n\t * @param {Netx.Collections.AssetAttributeSetsSelection} attributeSetsSelection Attribute sets selection\n\t * @param {array} selectedIds Generic selected attribute set ids\n\t */\n\tdispatcher.on(\n\t\t'asset:attributeSet:select:upload:confirmed',\n\t\tfunction (attributeSetSelection, selectedIds) {\n\t\t\tattributeSetSelection.setSelected(selectedIds);\n\t\t},\n\t);\n\n\t//============================================\n\t//\t!Asset attribute sets\n\t//============================================\n\n\t//============================================\n\t//\tAsset categories\n\t//============================================\n\n\t/**\n\t * Get category objects for given asset and store in provided collection\n\t * Useful for things like AssetEditCategoryView\n\t * @event module:asset#asset:category:add:confirmed\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {Netx.Collections.Categories} collection Categories collection\n\t * @fires module:asset#asset:categories:get:error\n\t * @fires module:asset#asset:categories:get:success\n\t */\n\tdispatcher.on('asset:categories:get', function (model, collection) {\n\t\tcollection.getCategoriesById(model.get('categories')).then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\t_.each(collection.models, function (m) {\n\t\t\t\t\tm.set({asset: model}, {silent: true});\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('asset:categories:get:success', model, collection);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'asset:categories:get:error',\n\t\t\t\t\terr,\n\t\t\t\t\tmodel,\n\t\t\t\t\tcollection,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:add:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:category:add:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetCategoryEdit\" */ './views/assetCategoryEditView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:category:add:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:category:add\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:category:add:show\n\t * @see module:asset#asset:category:add:confirmed\n\t */\n\tdispatcher.on('asset:category:add', function (model) {\n\t\tvar tree = Netx.category.selectTree;\n\t\ttree.fetch().then(function () {\n\t\t\ttree.disabledCategories = model.get('categories');\n\t\t\ttree.selectedCategory = null;\n\n\t\t\tdispatcher.trigger('asset:category:add:show', {\n\t\t\t\ttree: tree,\n\t\t\t\tmodel: model,\n\t\t\t\teventStr: 'asset:category:add',\n\t\t\t});\n\t\t});\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:add:confirmed\n\t * @param {object} values Asset/Category data\n\t * @param {module:asset/models/asset} model Asset model\n\t */\n\tdispatcher.on('asset:category:add:confirmed', function (values, asset) {\n\t\tvalues = values || {};\n\n\t\tvar catId = parseInt(values.categoryId);\n\n\t\tconst model = asset instanceof AssetModel ? asset : new AssetModel(asset);\n\n\t\tmodel.linkCategory = catId;\n\t\tmodel.addCategory().then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tmodel.fetch({duplicateQueryPolicy: 'merge'}).then(function () {\n\t\t\t\t\t// Is current asset, we have a little more work to do before calling this a success\n\t\t\t\t\t$.when(\n\t\t\t\t\t\tmodel.id === NS.current.id ? NS.current.fetchCategories() : true,\n\t\t\t\t\t).then(function () {\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'asset:category:add:success',\n\t\t\t\t\t\t\tmodel.attributes,\n\t\t\t\t\t\t\tcatId,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'asset:category:add:error',\n\t\t\t\t\terr,\n\t\t\t\t\tmodel.attributes,\n\t\t\t\t\tcatId,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:add:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {number} catId Category id\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('asset:category:add:error', function (error, model, catId) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:add:success\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {number} catId Category id\n\t */\n\tdispatcher.on('asset:category:add:success', function (model, catId) {\n\t\t//\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:category:edit:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetCategoryEdit\" */ './views/assetCategoryEditView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:category:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:category:edit\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {Netx.Models.Category} category Catgegory model\n\t * @fires module:asset#asset:category:edit:show\n\t * @see module:asset#asset:category:edit:confirmed\n\t */\n\tdispatcher.on('asset:category:edit', function (model, category) {\n\t\tvar tree = Netx.category.selectTree;\n\t\ttree.fetch().then(function () {\n\t\t\ttree.disabledCategories = _.without(model.get('categories'), category.id);\n\t\t\ttree.selectedCategory = null;\n\t\t\t//tree.selectedCategory = category.id;\n\t\t\tdispatcher.trigger('asset:category:edit:show', {\n\t\t\t\tmodel: model,\n\t\t\t\ttree: tree,\n\t\t\t\tfromCategory: category,\n\t\t\t});\n\t\t});\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:edit:confirmed\n\t * @param {object} values Category data\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:category:add:confirmed\n\t * @fires module:asset#asset:category:move\n\t */\n\tdispatcher.on('asset:category:edit:confirmed', function (values, asset) {\n\t\t// Vars\n\t\tvar fromCat, toCat;\n\n\t\tasset = asset instanceof AssetModel ? asset.attributes : asset;\n\n\t\tfromCat = parseInt(values.fromCategory);\n\t\ttoCat = parseInt(values.categoryId);\n\n\t\tif (!_.isNumeric(fromCat)) {\n\t\t\tthrow new Error([\"bad category id '\", fromCat, \"'\"].join(''));\n\t\t}\n\t\tif (!_.isNumeric(toCat)) {\n\t\t\tthrow new Error([\"bad category id '\", toCat, \"'\"].join(''));\n\t\t}\n\n\t\t// If we started with category 0, this is an add request\n\t\tif (!fromCat) {\n\t\t\tdispatcher.once('asset:category:add:success', function () {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'asset:category:edit:success',\n\t\t\t\t\tasset,\n\t\t\t\t\tfromCat,\n\t\t\t\t\ttoCat,\n\t\t\t\t);\n\t\t\t});\n\t\t\tdispatcher.trigger('asset:category:add:confirmed', asset, toCat);\n\t\t} else if (fromCat != toCat) {\n\t\t\tdispatcher.once('asset:category:move:success', function () {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'asset:category:edit:success',\n\t\t\t\t\tasset,\n\t\t\t\t\tfromCat,\n\t\t\t\t\ttoCat,\n\t\t\t\t);\n\t\t\t});\n\t\t\tdispatcher.trigger('asset:category:move', asset, fromCat, toCat);\n\t\t}\n\t});\n\n\t/**\n\t * move an asset from one category to another\n\t * @event module:asset#asset:category:move\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {number} fromId From category\n\t * @param {number} toId To category\n\t */\n\tdispatcher.on('asset:category:move', function (asset, fromId, toId) {\n\t\tconst model = asset instanceof AssetModel ? asset : new AssetModel(asset);\n\t\tmodel.moveCategory(parseInt(fromId), parseInt(toId)).then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tmodel.fetch({duplicateQueryPolicy: 'merge'}).then(function () {\n\t\t\t\t\t// Is current asset, we have a little more work to do before calling this a success\n\t\t\t\t\t$.when(\n\t\t\t\t\t\tmodel.id === NS.current.id ? NS.current.fetchCategories() : true,\n\t\t\t\t\t).then(function () {\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'asset:category:move:success',\n\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\tfromId,\n\t\t\t\t\t\t\ttoId,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('asset:category:move:error', err);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:move:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('asset:category:move:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:move:success\n\t * @param {module:asset/models/asset} model Asset model\n\t */\n\tdispatcher.on('asset:category:move:success', function (model) {\n\t\t//\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:remove\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {number|string} catId Category id\n\t * @fires module:app#app:confirm\n\t * @fires moduls:asset#asset:category:remove:confirmed\n\t */\n\tdispatcher.on('asset:category:remove', function (model, catId) {\n\t\t// TODO: check that an asset and catId were provided\n\t\tdispatcher.trigger('app:confirm', {\n\t\t\tmessage: i18n.t('i18n.confirmRemovalFromCategory'),\n\t\t\teventStr: 'asset:category:remove',\n\t\t\targs: [model, parseInt(catId)],\n\t\t});\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:remove:confirmed\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {number|string} catId Category id\n\t * @fires module:app#app:confirm\n\t */\n\tdispatcher.on('asset:category:remove:confirmed', function (asset, catId) {\n\t\tcatId = parseInt(catId);\n\n\t\tconst model = asset instanceof AssetModel ? asset : new AssetModel(asset);\n\n\t\t// Invalid or missing asset model\n\t\tif (!model || !(model instanceof AssetModel)) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'asset:category:remove:error',\n\t\t\t\tnew Error(i18n.t('i18n.assetWasNotProvided')),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\t// Invalid or missing category id\n\t\telse if (isNaN(catId)) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'asset:category:remove:error',\n\t\t\t\tnew Error(i18n.t('i18n.validCategoryIdWasNotProvided')),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tmodel.linkCategory = catId;\n\t\tmodel.removeCategory().then(\n\t\t\tfunction () {\n\t\t\t\t// Fetch model to sync data\n\t\t\t\tmodel.fetch({duplicateQueryPolicy: 'merge'}).then(function () {\n\t\t\t\t\t// Is current asset, we have a little more work to do before calling this a success\n\t\t\t\t\t$.when(\n\t\t\t\t\t\tmodel.id === NS.current.id ? NS.current.fetchCategories() : true,\n\t\t\t\t\t).then(function () {\n\t\t\t\t\t\t// Fire success\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'asset:category:remove:success',\n\t\t\t\t\t\t\tmodel.attributes,\n\t\t\t\t\t\t\tcatId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatcher.trigger('asset:category:removed', model.id, catId);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'asset:category:remove:error',\n\t\t\t\t\terr,\n\t\t\t\t\tmodel.attributes,\n\t\t\t\t\tcatId,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:remove:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {number|string} catId Category id\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('asset:category:remove:error', function (error, asset, catId) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\n\t/**\n\t * @event module:asset#asset:category:remove:success\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {number|string} catId Category id\n\t */\n\tdispatcher.on('asset:category:remove:success', function (asset, catId) {\n\t\t//\n\t});\n\t//============================================\n\t//\t!Asset categories\n\t//============================================\n\n\t//============================================\n\t//\tAsset checkin\n\t//============================================\n\tif (NS.options.CHECKIN_ENABLE) {\n\t\t/**\n\t\t * @event module:asset#asset:checkin\n\t\t * @param {module:asset/models/asset} model Asset model\n\t\t * @fires module:asset#asset:checkin:show\n\t\t */\n\t\tdispatcher.on('asset:checkin', function (model) {\n\t\t\tdispatcher.trigger('upload:asset:checkin', model);\n\t\t});\n\t} // if CHECKIN_ENABLE\n\t//============================================\n\t//\t!Asset checkin\n\t//============================================\n\n\t//============================================\n\t//\tAsset checkout\n\t//============================================\n\t/**\n\t * The asset:checkout handler takes either an asset or an ID as an argument; if neither is provided,\n\t * it operates on Netx.asset.current . Triggers the checkout() method on the asset, then a download\n\t * if DOWNLOAD_ON_CHECKOUT is true.\n\t * @event module:asset#asset:checkout\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:asset#asset:checkout:error\n\t * @fires module:asset#asset:checkout:success\n\t */\n\tdispatcher.on('asset:checkout', function (asset) {\n\t\tif (!asset) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'asset:checkout:error',\n\t\t\t\tnew Error('Asset was not provided for `asset:checkout`'),\n\t\t\t);\n\t\t}\n\n\t\tasset.checkout().then(\n\t\t\t(batchJob) => {\n\t\t\t\tif (!batchJob) throw new Error('batch job not returned');\n\t\t\t\treturn batchJob.completed.then(() => {\n\t\t\t\t\tif (NS.options.DOWNLOAD_ON_CHECKOUT) {\n\t\t\t\t\t\topenDownloadLink(\n\t\t\t\t\t\t\t`${Netx.URL.assetEndpoint}/${asset.id}/original/attachment`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tdispatcher.trigger('asset:checkout:success', asset);\n\t\t\t\t\tdispatcher.trigger('asset:checkedOut', asset.id);\n\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('asset:checkout:error', err, asset);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:checkout:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'asset:checkout:error',\n\t\tfunction (error, asset) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:checkout:success\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'asset:checkout:success',\n\t\tfunction (asset) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [asset.id],\n\t\t\t\ttitle: i18n.t('i18n.assetUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.checkedOutAsset'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Cancel checkout\n\t * @event module:asset#asset:checkout:cancel\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:app#app:confirm\n\t */\n\tdispatcher.on('asset:checkout:cancel', function (asset) {\n\t\tdispatcher.trigger('app:confirm', {\n\t\t\tmessage: i18n.t('i18n.confirmCheckoutCancel'),\n\t\t\teventStr: 'asset:checkout:cancel',\n\t\t\targs: [asset],\n\t\t});\n\t});\n\t/**\n\t * Cancel checkout confirmed\n\t * @event module:asset#asset:checkout:cancel:confirmed\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:asset#asset:checkout:cancel:success\n\t */\n\tdispatcher.on('asset:checkout:cancel:confirmed', function (asset) {\n\t\tasset\n\t\t\t.cancelCheckout()\n\t\t\t.then((batchJob) => {\n\t\t\t\tif (!batchJob) throw new Error('batch job not returned');\n\t\t\t\treturn batchJob.completed.then(() => {\n\t\t\t\t\tdispatcher.trigger('asset:checkout:cancel:success', asset);\n\t\t\t\t\tdispatcher.trigger('asset:checkout:cancelled', asset.id);\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tdispatcher.trigger('asset:checkout:cancel:error', asset);\n\t\t\t});\n\t});\n\t/**\n\t * @event module:asset#asset:checkout:cancel:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'asset:checkout:cancel:error',\n\t\tfunction (error, asset) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Asset checkout\n\t//============================================\n\n\t//============================================\n\t//\tAsset constituents\n\t//============================================\n\t/**\n\t * Action handler: select a constituent as the new asset thumbnail\n\t * @event module:asset#asset:constituent:choose\n\t * @param {module:asset/models/assetConstituent} model AssetConstituent model\n\t * @fires module:asset#asset:constituent:choose:error\n\t * @fires module:asset#asset:constituent:choose:success\n\t */\n\tdispatcher.on('asset:constituent:choose', function (model) {\n\t\tmodel.setDisplay().then(\n\t\t\tfunction (uuid) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'asset:constituent:choose:success',\n\t\t\t\t\tmodel,\n\t\t\t\t\tNS.current.id,\n\t\t\t\t);\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'app:pollBatchJob',\n\t\t\t\t\tuuid,\n\t\t\t\t\t'asset:constituent:choose',\n\t\t\t\t\tfalse,\n\t\t\t\t\t[model, NS.current.id],\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('asset:constituent:choose:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:asset#asset:constituent:choose:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/assetConstitutent} model AssetConstitutent model\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:choose:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * UI actions for constituent chosen\n\t * @event module:asset#asset:constituent:choose:success\n\t * @param {module:asset/models/assetConstituent} constituent AssetConstitutent model\n\t * @param {number} assetId Asset id\n\t * @fires module:notification#notification\n\t * @see module:asset#asset:constituent:choose\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:choose:success',\n\t\tfunction (constituent, assetId) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [assetId],\n\t\t\t\ttitle: i18n.t('i18n.assetUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.constituentChosen'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Refetch the thumbnail once the asset constituent job has succeeded\n\t * @event module:asset#asset:constituent:choose:succeeded\n\t * @param {module:asset/models/assetConstituent} constituent AssetConstituent model\n\t * @param {number} assetId Asset ID\n\t * @see Netx.Views.AssetDetailView\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:choose:succeeded',\n\t\tfunction (constituent, assetId) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Delete asset video clip constituent\n\t * @event module:asset#asset:constituent:clip:delete\n\t * @param {module:asset/models/assetConsitutent_clip} clip Constituent (clip)\n\t * @fires module:app#app:confirm:delete\n\t * @see module:asset#asset:constituent:clip:delete:confirmed\n\t */\n\tdispatcher.on('asset:constituent:clip:delete', function (clip) {\n\t\t// Must be producer at least\n\t\tif (Netx.getUserLevel() < 4) return;\n\n\t\tif (!clip) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'asset:constituent:clip:delete:error',\n\t\t\t\tnew Error(i18n.t('i18n.invalidConstituentClip')),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\tmessage: i18n.t('i18n.confirmConsitutentClipDelete'),\n\t\t\teventStr: 'asset:constituent:clip:delete',\n\t\t\targs: [clip],\n\t\t});\n\t});\n\n\t/**\n\t * Delete asset video clip constituent\n\t * @event module:asset#asset:constituent:clip:delete:confirmed\n\t * @param {module:asset/models/assetConsitutent_clip} clip Constituent (clip) model\n\t * @fires module:asset#asset:constituent:clip:delete:error\n\t * @fires module:asset#asset:constituent:clip:delete:success\n\t * @see module:asset#asset:constituent:clip:delete\n\t */\n\tdispatcher.on('asset:constituent:clip:delete:confirmed', function (clip) {\n\t\t// Must be producer at least\n\t\tif (Netx.getUserLevel() < 4) return;\n\n\t\tclip.destroy({wait: true}).then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('asset:constituent:clip:delete:success', clip);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('asset:constituent:clip:delete:error', err, clip);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:asset#asset:constituent:clip:delete:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/assetConstitutent_clip} clip Consitutent (clip) model\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:clip:delete:error',\n\t\tfunction (error, clip) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:constituent:clip:delete:success\n\t * @param {module:asset/models/assetConstitutent_clip} clip Consitutent (clip) model\n\t * @fires module:notification#notification\n\t * @see module:asset#asset:constituent:clip:delete\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:clip:delete:success',\n\t\tfunction (clip) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [clip.get('assetId')],\n\t\t\t\ttitle: i18n.t('i18n.constituentClipsUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.constituentClipDeleted'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:constituent:clip:download:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:clip:download:show',\n\t\tfunction (viewOptions) {\n\t\t\tmodalViews.add({\n\t\t\t\tviewClass: AssetConstituentDownloadView_Clip,\n\t\t\t\tshowActions: ['asset:constituent:clip:download:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:constituent:clip:download\n\t * @param {module:asset/models/assetConstitutent_clip} clip Consitutent (clip) model\n\t * @fires module:asset#asset:constituent:clip:download:show\n\t * @fires module:asset#asset:constituent:clip:download:error\n\t * @see module:asset#asset:constituent:clip:download:confirmed\n\t */\n\tdispatcher.on('asset:constituent:clip:download', function (clip) {\n\t\tvar assetSet = new AssetSetModel({\n\t\t\ttype: assetSetTypes.asset,\n\t\t\tids: [clip.get('assetId')],\n\t\t});\n\n\t\tassetSet.getDownloadOptions().then(\n\t\t\tfunction (opts) {\n\t\t\t\tif (opts.length) {\n\t\t\t\t\tdispatcher.trigger('asset:constituent:clip:download:show', {\n\t\t\t\t\t\tmodel: clip,\n\t\t\t\t\t\tpresets: NS.presets.video ? NS.presets.video.models : [],\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:constituent:clip:download:error',\n\t\t\t\t\t\tnew Error(i18n.t('i18n.constituentClipNoDownloadOptionsAvailable')),\n\t\t\t\t\t\tclip,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('asset:constituent:clip:download:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:constituent:clip:download:confirmed\n\t * @param {object} data Form data\n\t * @param {module:asset/models/assetConstitutent_clip} clip Consitutent (clip) model\n\t * @fires module:asset#asset:constituent:clip:download:error\n\t * @fires module:asset#asset:constituent:clip:download:success\n\t * @fires module:share#share:assetSet:menu\n\t * @see module:asset#asset:constituent:clip:download\n\t * @todo This is out of line with all other downloads since this is not an asset - this is a contituent of an asset\n\t * Need to get the server to respect the idea of types other than an asset so that we can run this all through the\n\t * standard share workflow. What I have done here is rewrite how share:assetSet:repurpose:manual works\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:clip:download:confirmed',\n\t\tfunction (data, clip) {\n\t\t\t// Vars\n\t\t\tvar processIdx = parseInt(data.process),\n\t\t\t\tprocess = NS.presets.video.at(processIdx);\n\n\t\t\tif (process) {\n\t\t\t\t// Send off to share module\n\t\t\t\t// dispatcher.trigger('share:assetSet:repurpose:manual', clip.toAssetSet(), clip.getManualRepurposeOptions( process ), 'video' );\n\t\t\t\tvar assetSet = clip.toAssetSet();\n\t\t\t\tassetSet.getDownloadOptions().then(function (downloadOptions) {\n\t\t\t\t\t// Find the manual repurpose option\n\t\t\t\t\tvar manualOpt = downloadOptions.findWhere({type: 'manualRepurpose'});\n\t\t\t\t\tlet originalOpt = downloadOptions.findWhere({type: 'original'});\n\n\t\t\t\t\t// If not there, try and do it with the asset if original is available\n\t\t\t\t\t// This is happening with non image related assets\n\t\t\t\t\tif (!manualOpt) {\n\t\t\t\t\t\tif (originalOpt) {\n\t\t\t\t\t\t\tmanualOpt = new DownloadOptionModel({\n\t\t\t\t\t\t\t\tattributeIds: [],\n\t\t\t\t\t\t\t\tfamily: 'video',\n\t\t\t\t\t\t\t\tid: 0,\n\t\t\t\t\t\t\t\tname: '',\n\t\t\t\t\t\t\t\trequiresApproval: originalOpt.requiresApproval,\n\t\t\t\t\t\t\t\trequiresJustification: originalOpt.requiresJustification,\n\t\t\t\t\t\t\t\ttype: 'manualRepurpose',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tdownloadOptions.add(manualOpt);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need to have this option to go forward\n\t\t\t\t\tif (!manualOpt) {\n\t\t\t\t\t\treturn dispatcher.trigger(\n\t\t\t\t\t\t\t'asset:constituent:clip:download:error',\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\ti18n.t('i18n.constituentClipNoDownloadOptionsAvailable'),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdownloadOptions,\n\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove all other options but manual\n\t\t\t\t\tdownloadOptions.reset([manualOpt]);\n\n\t\t\t\t\t// Set the manual operations\n\t\t\t\t\tmanualOpt.set('options', clip.getManualRepurposeOptions(process));\n\n\t\t\t\t\t// Punt to the share workflow.\n\t\t\t\t\tdispatcher.trigger('share:assetSet:menu', assetSet);\n\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:constituent:clip:download:success',\n\t\t\t\t\t\tclip,\n\t\t\t\t\t\tprocess,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'asset:constituent:clip:download:error',\n\t\t\t\t\tnew Error(i18n.t('i18n.invalidProcess')),\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t);\n\t/**\n\t * @event module:asset#asset:constituent:clip:download:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/assetConstitutent_clip} clip Consitutent (clip) model\n\t * @fires module:app#app:alert\n\t * @see module:asset#asset:constituent:clip:download:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:clip:download:error',\n\t\tfunction (error, clip) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:constituent:clip:download:success\n\t * @param {module:asset/models/assetConstitutent_clip} clip Consitutent (clip) model\n\t * @param {module:asset/models/assetProcess} process The process chosen for clip\n\t * @see module:asset#asset:constituent:clip:download:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:clip:download:success',\n\t\tfunction (clip, process) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Edit asset video clips\n\t * @event module:asset#asset:constituent:clip:edit\n\t * @param {number} assetId Asset id\n\t * @param {number} clipId Asset clip id\n\t * @fires module:asset#asset:constituent:clip:edit:error\n\t * @fires module:videoEditor#videoEditor:clips:routed\n\t * @see module:asset#asset:constituent:clip:edit:confirmed\n\t */\n\tdispatcher.on('asset:constituent:clip:edit', function (assetId, clipId) {\n\t\t// Must be producer at least\n\t\tif (Netx.getUserLevel() < 4) return;\n\n\t\tdispatcher.trigger('netx:load:module:videoeditor', {\n\t\t\terror: function (err) {\n\t\t\t\tdispatcher.trigger('asset:constituent:clip:edit:error', err, clipId);\n\t\t\t},\n\t\t\tinitialized: function () {\n\t\t\t\t// TODO: fix to have route in video editor\n\t\t\t\tdispatcher.trigger('videoEditor:clips:routed', assetId, clipId);\n\t\t\t},\n\t\t});\n\t});\n\n\t/**\n\t * @event module:asset#asset:constituent:clip:edit:confirmed\n\t * @param {module:asset/models/asset} asset Asset model\n\t * @param {module:asset/models/assetConstitutent_clip} clip Consitutent (clip)\n\t * @param {object} data Constituent data\n\t * @fires module:asset#asset:constituent:clip:edit:error\n\t * @fires module:asset#asset:constituent:clip:edit:success\n\t * @see module:asset#asset:constituent:clip:edit\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:clip:edit:confirmed',\n\t\tfunction (asset, clip, data) {\n\t\t\t// Must be producer at least\n\t\t\tif (Netx.getUserLevel() < 4) return;\n\n\t\t\t// Vars\n\t\t\tvar attrIds = [],\n\t\t\t\tattrNames = [],\n\t\t\t\tattrValues = [],\n\t\t\t\tclipAttributes = Netx.getAttributesByObjectType('clip'),\n\t\t\t\tisNew = false;\n\n\t\t\t// New constituent (clip)\n\t\t\tif (!clip) {\n\t\t\t\tisNew = true;\n\t\t\t\tclip = new AssetConstituentClipModel({\n\t\t\t\t\tassetId: asset.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Set data\n\t\t\tclip.set({\n\t\t\t\tattributes: data.attributes,\n\t\t\t\tstartTime: data.range.start,\n\t\t\t\tendTime: data.range.end,\n\t\t\t\ttitle: data.title,\n\t\t\t});\n\n\t\t\t// Save clip\n\t\t\tclip.save().then(\n\t\t\t\tfunction () {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:constituent:clip:edit:success',\n\t\t\t\t\t\tasset,\n\t\t\t\t\t\tclip,\n\t\t\t\t\t\tisNew,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('asset:constituent:clip:edit:error', err);\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t);\n\n\t/**\n\t * @event module:asset#asset:constituent:clip:edit:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:asset#asset:constituent:clip:edit:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:clip:edit:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:constituent:clip:edit:success\n\t * @param {module:asset/models/asset} asset Asset\n\t * @param {module:asset/models/assetConstituent_clip} clip Constituent\n\t * @param {boolean} isNew New clip\n\t * @fires module:notification#notification\n\t * @see module:asset#asset:constituent:clip:edit:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:constituent:clip:edit:success',\n\t\tfunction (asset, clip, isNew) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [asset.id],\n\t\t\t\ttitle: i18n.t('i18n.constituentClips'),\n\t\t\t\tdescription: isNew\n\t\t\t\t\t? i18n.t('i18n.constituentClipCreated')\n\t\t\t\t\t: i18n.t('i18n.constituentClipsUpdated'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Create new asset video clips\n\t * @event module:asset#asset:constituent:clip:new\n\t * @param {number} assetId Asset id\n\t * @param {number} clipId Asset clip id\n\t * @fires module:asset#asset:constituent:clip:edit\n\t */\n\tdispatcher.on('asset:constituent:clip:new', function (assetId) {\n\t\t// Must be producer at least\n\t\tif (Netx.getUserLevel() < 4) return;\n\t\t// Maybe one day we will want or need to do something special for new clip requests\n\t\t// For now it is just the same as hitting asset:constituent:clip:edit except without a clipId\n\t\tdispatcher.trigger('asset:constituent:clip:edit', assetId);\n\t});\n\n\t//============================================\n\t//\tAsset constituents\n\t//============================================\n\n\t//============================================\n\t//\tAsset cursor\n\t//============================================\n\tNS.cursor.on('nx:asset:cursor:updated', function (cursor, response, opts) {\n\t\tvar asset = cursor.at(0);\n\t\t// If we're routed to an assetDetail tab, and the current asset has changed,\n\t\t// route to the analogous tab for that asset.\n\t\t//\n\t\t// This is a slick piece of code however it causes problems when the\n\t\t// next/prev asset doesn't have whatever \"bits\" have been maintained\n\t\t// Commenting until we have a better solution\n\t\t// 2014.03.17 ~sak~\n\t\t//\n\t\t// assetDetailView deals with that pretty well, I think; also, this is already uncommented ... -m- 3/3/2015\n\t\t//\n\t\tvar hash = window.location.hash,\n\t\t\tbits = hash.match(/#asset\\/\\d+(\\/.*)/);\n\t\tif (bits) {\n\t\t\t// keep whatever trailing bit is currently on the route\n\t\t\t// NOTE: routing to the current route is a no-op.\n\t\t\tNetx.router.navigate('asset/' + asset.id + bits[1], {trigger: true});\n\t\t}\n\t\t// DAM-5858\n\t\t// this originally was just an else - but if you had opened the asset detail prior and did a faceted search (anything that causes a sync on cursor)\n\t\t// we were forcing a route to the asset even though no one wanted to go there in the least -jse- 2015/03/07\n\t\telse if (hash.includes('#asset/')) {\n\t\t\tvar curId = hash.split('#asset/')[1];\n\t\t\tif (asset.id !== Number(curId)) {\n\t\t\t\tNetx.router.navigate('asset/' + asset.id, {trigger: true});\n\t\t\t}\n\t\t}\n\t});\n\t/*\n\t * When a miniAssetList fetches and it has a view that is visible, that view will trigger this event,\n\t * to say that the next time we enter asset detail view, this is the collection we want to page through.\n\t * @event module:asset#asset:cursor:cacheFetch\n\t * @param {Netx.Collections.Assets} collection Assets collection\n\t */\n\tdispatcher.on('asset:cursor:cacheFetch', function (collection) {\n\t\t// Netx.asset.lastFetch = collection;\n\t\tNS.cursor.cacheFetch(collection);\n\t});\n\n\t/**\n\t * make sure that cursor[0] == a specific asset ID,\n\t * while trying to be smart about which selection it was found in.\n\t * @event module:asset#asset:cursor:goto\n\t * @param {number|string} id Asset id\n\t * @param {boolean} forceSimple Simple goto\n\t * @fires module:app#app:alert\n\t * @fires module:asset#asset:cursor:goto\n\t * @fires module:asset#asset:cursor:goto:at\n\t */\n\tdispatcher.on('asset:cursor:goto', function (id, forceSimple) {\n\t\tconst cursor = NS.cursor;\n\t\tcursor.goto(id, forceSimple).then(\n\t\t\tfunction () {\n\t\t\t\t// If we got no assets back, the asset may have just been deleted, or else something else has gone weird.\n\t\t\t\t// Let's not get into an endless loop over it.\n\t\t\t\tif (cursor.length === 0) {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'app:alert',\n\t\t\t\t\t\t'asset #' + id + ' not found',\n\t\t\t\t\t\t'Warning',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Occasionally, due to a changing set of assets on the cursor, the lastFetch\n\t\t\t\t// will not get the correct ID. Check for that here, and fall back if necessary.\n\t\t\t\telse if (cursor.at(0).id != id) {\n\t\t\t\t\tif (!forceSimple) {\n\t\t\t\t\t\t// try again with simple search\n\t\t\t\t\t\tdispatcher.trigger('asset:cursor:goto', id, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('DAM couldnt find asset ' + id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Otherwise, cursor has arrived at the correct asset.\n\t\t\t\telse {\n\t\t\t\t\tdispatcher.trigger('asset:cursor:goto:at', id);\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('asset:cursor:goto:at', id);\n\t\t\t},\n\t\t);\n\t});\n\t//============================================\n\t//\t!Asset cursor\n\t//============================================\n\n\t//============================================\n\t//\tAsset custom thumbnail\n\t//============================================\n\t/**\n\t * @event module:asset#asset:customThumbnail:select\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:upload#upload:asset:customThumbnail:select\n\t */\n\tdispatcher.on('asset:customThumbnail:select', function (model) {\n\t\tdispatcher.trigger('upload:asset:customThumbnail:select', model);\n\t});\n\t//============================================\n\t//\tAsset custom thumbnail\n\t//============================================\n\n\t//============================================\n\t//\tAsset detail\n\t//============================================\n\t//\n\t// create actions and events for the tabs in the asset detail view, having the appropriate user levels:\n\t//\n\t+(function () {\n\t\t// Possible outcomes\n\t\t// asset:detail:show:attributeHistory\n\t\t// asset:detail:show:attributes\n\t\t// asset:detail:show:categories\n\t\t// asset:detail:show:detail\n\t\t// asset:detail:show:fileinfo\n\t\t// asset:detail:show:index\n\t\t// asset:detail:show:metadata\n\t\t// asset:detail:show:links\n\t\t// asset:detail:show:clips\n\t\t// asset:detail:show:constituents_keyframes\n\t\t// asset:detail:show:constituents_layers\n\t\t// asset:detail:show:constituents_pages\n\t\t// asset:detail:show:overview\n\t\t// asset:detail:show:permissions\n\t\t// asset:detail:show:preview\n\t\t// asset:detail:show:publicLinks\n\t\t// asset:detail:show:uasge\n\t\t// asset:detail:show:versions\n\t\t// asset:detail:show:views\n\t\t// asset:detail:show:projects\n\t\t// asset:detail:show:reviews\n\t\t// asset:detail:show:smartLabels\n\t\tvar newActions = [];\n\t\t_.each(assetThings, function (thing, tab, all) {\n\t\t\tif (_.isObject(thing)) {\n\t\t\t\tconst _thing = all[tab];\n\t\t\t\tconst namespace = `asset:detail:show:${tab}`;\n\n\t\t\t\tlet enableTest = [];\n\n\t\t\t\tconst _enableTest = _thing.enableTest;\n\t\t\t\tif (_enableTest) {\n\t\t\t\t\tif (_.isArray(_enableTest)) {\n\t\t\t\t\t\tenableTest = enableTest.concat(_enableTest);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tenableTest.push(_enableTest);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Register action\n\t\t\t\tconst action = {\n\t\t\t\t\tevent: namespace,\n\t\t\t\t\tlabel: _thing.label || 'undefined',\n\t\t\t\t\ttestOnSync: NS.current,\n\t\t\t\t\tuserLevel: _thing.userLevel || 1,\n\t\t\t\t\twrapper(view) {\n\t\t\t\t\t\treturn [NS.current];\n\t\t\t\t\t},\n\t\t\t\t\tenableTest: enableTest,\n\t\t\t\t\troute(model) {\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tNS.options.ROUTE || 'asset',\n\t\t\t\t\t\t\t'/',\n\t\t\t\t\t\t\tNS.current.id,\n\t\t\t\t\t\t\t'/',\n\t\t\t\t\t\t\ttab,\n\t\t\t\t\t\t].join('');\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tif (_thing.matrix) {\n\t\t\t\t\taction.matrix = _thing.matrix;\n\t\t\t\t}\n\t\t\t\tnewActions.push(action);\n\t\t\t}\n\t\t});\n\t\tNetx.Actions.Register(newActions);\n\n\t\t// Enablers for these tabs follow a standard pattern: asset:detail:thing.enableTest == Netx.Enablers.assetHasThing;\n\t\t// We need to intersect since these tabs are customizable in config\n\t\tvar intersect = _.intersection(NS.options.DETAIL_TABS, [\n\t\t\t'views',\n\t\t\t'links',\n\t\t\t'metadata',\n\t\t\t'projects',\n\t\t\t'reviews',\n\t\t\t'clips',\n\t\t\t'constituents_keyframes',\n\t\t\t'constituents_layers',\n\t\t\t'constituents_pages',\n\t\t\t'versions',\n\t\t]);\n\t\t_(intersect).each(function (thing) {\n\t\t\t// What is the point of defining showEmpty in asset detail view if Netx.views.assetDetailView does not exist at this point - and we should not ever have to touch a view like that\n\t\t\t// This is dirty but neccessary for now- can not go digging this all up in a release branch.\n\t\t\tvar showEmpty = false,\n\t\t\t\tucThing = _.ucfirst(thing);\n\n\t\t\tswitch (thing) {\n\t\t\t\tcase 'views':\n\t\t\t\t\tshowEmpty = true;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (!showEmpty) {\n\t\t\t\tNetx.Actions.Find(`asset:detail:show:${thing}`).enableTest.push(\n\t\t\t\t\tAssetDetailEnablers[`assetHas${ucThing}`],\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t})();\n\n\tif (Netx.getPreference('metadata.history.enabled', true)) {\n\t\t/**\n\t\t * @event module:asset#asset:detail:attributeHistory\n\t\t */\n\t\tdispatcher.on('asset:detail:attributeHistory', function () {\n\t\t\tNS.current.fetchAttributeHistory();\n\t\t});\n\t}\n\n\tif (Netx.getPreference('review.enabled', true)) {\n\t\t/**\n\t\t * @event module:asset#asset:detail:show:projects\n\t\t */\n\t\tdispatcher.on('asset:detail:projects', function () {\n\t\t\tNS.current.fetchProjects();\n\t\t});\n\t\t/**\n\t\t * @event module:asset#asset:detail:show:reviews\n\t\t */\n\t\tdispatcher.on('asset:detail:reviews', function () {\n\t\t\tNS.current.fetchReviews();\n\t\t});\n\t}\n\n\t/**\n\t * Calls getForAssets() once the attribute view is shown\n\t * @event module:asset#asset:detail:attributes\n\t */\n\tdispatcher.on('asset:detail:attributes', function () {\n\t\t// Do anything that may be necessary when we show the attributes for the current asset\n\t});\n\n\t/**\n\t * When the permissions pane shows, fetch the current asset's permissions\n\t * @event module:asset#asset:detail:permissions\n\t */\n\tdispatcher.on('asset:detail:permissions', function () {\n\t\tNS.current.fetchPermissions();\n\t});\n\n\t/**\n\t * Load asset versions when the versions tab is shown\n\t * @event module:asset#asset:detail:versions\n\t */\n\tdispatcher.on('asset:detail:versions', function () {\n\t\tNS.current.fetchVersions();\n\t});\n\n\t/**\n\t * showing and managing the usage\n\t * @event module:asset#asset:detail:usage\n\t */\n\tdispatcher.on('asset:detail:usage', function () {\n\t\tNS.current.fetchUsage();\n\t});\n\n\t/**\n\t * showing and managing the index\n\t * @event module:asset#asset:detail:index\n\t */\n\tdispatcher.on('asset:detail:index', function () {\n\t\tNS.current.fetchIndices();\n\t});\n\n\t/**\n\t * showing metadata\n\t * @event module:asset#asset:detail:metadata\n\t */\n\tdispatcher.on('asset:detail:metadata', function () {\n\t\tNS.current.fetchMetadata();\n\t});\n\n\t/**\n\t * When the asset views tab is shown, load views from the server\n\t * @event module:asset#asset:detail:views\n\t */\n\tdispatcher.on('asset:detail:views', function () {\n\t\tNS.current.fetchViews();\n\t});\n\n\t/**\n\t * Fetch every asset detail object for the current asset,\n\t * by triggering the specific events for each section as required.\n\t * @event module:asset#asset:detail:all\n\t */\n\tdispatcher.on('asset:detail:all', function () {\n\t\t// (The enable test is the canonical way to check if this asset has this data.)\n\t\t_.each(NS.options.DETAIL_TABS, function (tab) {\n\t\t\tvar tabTest = Netx.Enablers['assetHas' + _.ucfirst(tab)];\n\t\t\t// if the test doesn't exist,\n\t\t\t// or if it passes,\n\t\t\t// (or if it's 'versions' which expects to be called every time -- TODO: refactor that)\n\t\t\t// trigger an event.\n\t\t\t// TODO: fix - there is not a `Netx.views.assetDetailView`\n\t\t\tif (\n\t\t\t\ttab == 'versions' ||\n\t\t\t\t!_.isFunction(tabTest) ||\n\t\t\t\ttabTest(Netx.views.assetDetailView)\n\t\t\t) {\n\t\t\t\t_.defer(function () {\n\t\t\t\t\t// use _.defer to spread these out a little bit.\n\t\t\t\t\tdispatcher.trigger('asset:detail:' + tab);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\n\t/**\n\t * Fetching asset categories, when the categories tab is clicked, fetch the categories\n\t * @event module:asset#asset:detail:categories\n\t */\n\tdispatcher.on('asset:detail:categories', function () {\n\t\tNS.current.fetchCategories();\n\t});\n\n\t// Rather than creating a loop and pointing these all to asset:detail:constituents - I have found it best to just break them out now\n\t// because clips are a different kind of constituent than we have had before and with the new attribute setup it is likely different types\n\t// of constituents may need different treatment in the future\n\t/**\n\t * Fetching asset constituents, when the constituents tab is clicked, fetch the constituents\n\t * @event module:asset#asset:detail:constituents\n\t * @see module:asset#asset:detail:clips\n\t * @see module:asset#asset:detail:constituents_keyframes\n\t * @see module:asset#asset:detail:constituents_layers\n\t * @see module:asset#asset:detail:constituents_pages\n\t */\n\tdispatcher.on('asset:detail:constituents', function () {\n\t\tNS.current.fetchConstituents();\n\t});\n\n\t/**\n\t * @event module:asset#asset:detail:clips\n\t * @fires module:asset#asset:detail:constituents\n\t */\n\tdispatcher.on('asset:detail:clips', function () {\n\t\tdispatcher.trigger('asset:detail:constituents');\n\t});\n\n\t/**\n\t * @event module:asset#asset:detail:constituents_keyframes\n\t * @fires module:asset#asset:detail:constituents\n\t */\n\tdispatcher.on('asset:detail:constituents_keyframes', function () {\n\t\tdispatcher.trigger('asset:detail:constituents');\n\t});\n\n\t/**\n\t * @event module:asset#asset:detail:constituents_layers\n\t * @fires module:asset#asset:detail:constituents\n\t */\n\tdispatcher.on('asset:detail:constituents_layers', function () {\n\t\tdispatcher.trigger('asset:detail:constituents');\n\t});\n\n\t/**\n\t * @event module:asset#asset:detail:constituents_pages\n\t * @fires module:asset#asset:detail:constituents\n\t */\n\tdispatcher.on('asset:detail:constituents_pages', function () {\n\t\tdispatcher.trigger('asset:detail:constituents');\n\t});\n\n\t/**\n\t * fetch the asset links (collection of assets linked to a given asset) when links tab is shown\n\t * @event module:asset#asset:detail:links\n\t */\n\tdispatcher.on('asset:detail:links', function () {\n\t\tNS.current.fetchLinks();\n\t});\n\n\t/**\n\t * @event module:asset#asset:detail:links:toggleHidden\n\t * @param {Netx.Model.AssetModel} assetModel Asset model for the linked asset we are modifying\n\t * @param {boolean} hidden True if linked asset should be hidden from search, false otherwise\n\t * @fires module:asset#asset:detail:links:toggleHidden:success\n\t * @fires module:asset#asset:detail:links:toggleHidden:error\n\t */\n\tdispatcher.on(\n\t\t'asset:detail:links:toggleHidden',\n\t\tfunction (assetModel, hidden) {\n\t\t\t// hidden must be 0 or 1 not true/false\n\t\t\thidden = hidden ? 1 : 0;\n\t\t\t//save\n\t\t\tassetModel.save({hidden: hidden}).then(\n\t\t\t\tfunction () {\n\t\t\t\t\tdispatcher.trigger('asset:detail:links:toggleHidden:success');\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('asset:detail:links:toggleHidden:error', err);\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t);\n\t/**\n\t * @event module:asset#asset:detail:links:toggleHidden:success\n\t * @fires module:app#notification\n\t */\n\tdispatcher.on('asset:detail:links:toggleHidden:success', function () {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'asset',\n\t\t\ttitle: i18n.t('i18n.relationshipUpdated'),\n\t\t\tdescription: i18n.t('i18n.relationshipVisibiltySet'),\n\t\t\ttype: 'success',\n\t\t});\n\t});\n\t/**\n\t * @event module:asset#asset:detail:links:toggleHidden:error\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('asset:detail:links:toggleHidden:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\n\t/**\n\t * Fetching asset public links, when the public links tab is clicked, fetch the public links if they have not been already\n\t * @event module:asset#asset:detail:publicLinks\n\t */\n\tdispatcher.on('asset:detail:overview', function () {\n\t\tdispatcher.trigger('asset:detail:categories');\n\t\tdispatcher.trigger('asset:detail:links');\n\t\tdispatcher.trigger('asset:detail:views');\n\t\tdispatcher.trigger('asset:detail:versions');\n\t});\n\t//============================================\n\t//\t!Asset detail\n\t//============================================\n\n\t//============================================\n\t//\tAsset docview\n\t//============================================\n\n\t/**\n\t * Show the document viewer on an asset\n\t * @event module:asset#asset:docview\n\t * @param {number|string} id Asset id\n\t * @param {boolean} inMotion Whether or not we were already getting the cursor\n\t * @fires module:asset#asset:docview\n\t * @fires module:asset#asset:cursor:goto\n\t * @fires module:asset#asset:docview:open\n\t */\n\tdispatcher.on('asset:docview', function (id, inMotion) {\n\t\t// Do we have the asset loaded?\n\t\tif (NS.current.id != id) {\n\t\t\tif (!inMotion) {\n\t\t\t\t// Load it\n\t\t\t\tdispatcher.trigger('asset:cursor:goto', id, false);\n\t\t\t}\n\t\t\t_.defer(function () {\n\t\t\t\t// Keep checking\n\t\t\t\tdispatcher.trigger('asset:docview', id, true);\n\t\t\t});\n\t\t\treturn;\n\t\t} else {\n\t\t\tdispatcher.trigger('asset:docview:open');\n\t\t}\n\t});\n\n\t/**\n\t * Show document viewer (assetDocumentView)\n\t * @event module:asset#asset:docview:open\n\t * @fires module:netx#netx:load:module:doc\n\t * @fires module:doc#doc:open\n\t */\n\tdispatcher.on('asset:docview:open', function () {\n\t\t// TODO: change this route to /#doc/<assetId> and let the document module take it from there\n\t\tdispatcher.trigger('netx:load:module:doc', {\n\t\t\terror: function (err) {\n\t\t\t\t// Deal with error\n\t\t\t\tconsole.warn(err);\n\t\t\t},\n\t\t\tinitialized: function () {\n\t\t\t\tdispatcher.trigger(PDF_VIEWER_EVENT.VIEW, {assetId: NS.current.id});\n\t\t\t},\n\t\t});\n\t});\n\t/**\n\t * launch pdf in new browser tab\n\t * @event module:asset#asset:docview:browser\n\t * @param {object} model - currentAsset model\n\t * @param {object} view - the view\n\t * @param {object} event - the ui event\n\t */\n\tdispatcher.on('asset:docview:browser', function (model, view, event) {\n\t\tconst pdfUrl = `${Netx.URL.asset}/${model.id}/original/${model.get(\n\t\t\t'file',\n\t\t)}`;\n\t\twindow.open(pdfUrl, '_blank');\n\t});\n\t//============================================\n\t//\t!Asset docview\n\t//============================================\n\n\t//============================================\n\t//\tAsset expiration\n\t//============================================\n\t/**\n\t * @event module:asset#asset:expirations:routed\n\t * @param {number|string} page Page number\n\t * @fires module:asset#asset:expirations\n\t */\n\tdispatcher.on('asset:expirations:routed', function (page) {\n\t\tdispatcher.trigger('asset:expirations', page || 1);\n\t});\n\t/**\n\t * @event module:asset#asset:expirations\n\t * @param {number|string} page Page number\n\t * @fires module:asset#asset:expirations:gallery:show\n\t */\n\tdispatcher.on('asset:expirations', function (page) {\n\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\tconditions: convertToRules(createExpirationRule()),\n\t\t\tpage: parseInt(page) || 1,\n\t\t});\n\t});\n\n\t/**\n\t * @event module:asset#asset:manage:expire:show\n\t * @param {object} viewOptions View options\n\t * @fires moudle:app#app:showOptions\n\t */\n\tdispatcher.on('asset:manage:expire:show', function (viewOptions) {\n\t\tdispatcher.trigger('app:showOptions', viewOptions);\n\t});\n\t/**\n\t * @event module:asset#asset:manage:expire\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:manage:expire:show\n\t * @fires module:asset#asset:expire\n\t * @see module:asset#asset:expire\n\t * @see module:asset#asset:unexpire\n\t */\n\tdispatcher.on('asset:manage:expire', function (model) {\n\t\t// No sense in giving 1 option - just pass along\n\t\tif (model.get('expirationDate') === 0) {\n\t\t\tdispatcher.trigger('asset:expire', model);\n\t\t\treturn;\n\t\t}\n\t\t// Show\n\t\tdispatcher.trigger('asset:manage:expire:show', {\n\t\t\tmenu: Netx.Menus.assetExpirationActions,\n\t\t\tdata: {model: model},\n\t\t});\n\t});\n\t/**\n\t * @event module:asset#asset:expire:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:expire:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetSetExpiration\" */ './views/assetSetExpirationView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:expire:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:expire\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:expire:show\n\t * @see module:asset#asset:expire:confirmed\n\t */\n\tdispatcher.on('asset:expire', function (model) {\n\t\tdispatcher.trigger('asset:expire:show', {\n\t\t\tmodel: model,\n\t\t});\n\t});\n\t/**\n\t * @event module:asset#asset:expire:confirmed\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:expire:error\n\t * @fires module:asset#asset:expire:success\n\t * @see module:asset#asset:expire\n\t */\n\tdispatcher.on('asset:expire:confirmed', function (data, model) {\n\t\tif (!data || !data.expirationDate) {\n\t\t\treturn dispatcher.trigger(\n\t\t\t\t'asset:expire:error',\n\t\t\t\ti18n.t('i18n.noExpirationDateProvided'),\n\t\t\t\tmodel,\n\t\t\t);\n\t\t}\n\n\t\tmodel.expire(data.expirationDate).then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('asset:expire:success', model, data.expirationDate);\n\t\t\t\tdispatcher.trigger('asset:expiration:set:' + model.id);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('asset:expire:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:expire:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:app#app:alert\n\t * @see module:asset#asset:expire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:expire:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:expire:success\n\t * @param {module:asset/models/asset} model Asset model\n\t * @param {string} date Date string\n\t * @fires module:notification#notification\n\t * @see module:asset#asset:expire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:expire:success',\n\t\tfunction (model, date) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [model.id],\n\t\t\t\ttitle: i18n.t('i18n.assetUpdated'),\n\t\t\t\ttype: 'success',\n\t\t\t\tdescription: i18n.t('i18n.expirationSetFor', {date: date}),\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:unexpire\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:app#app:confirm\n\t * @see module:asset#asset:unexpire:confirmed\n\t */\n\tdispatcher.on('asset:unexpire', function (model) {\n\t\tdispatcher.trigger('app:confirm', {\n\t\t\tmessage: i18n.t('i18n.unexpireConfirm'),\n\t\t\ttitle: i18n.t('i18n.unexpireAsset'),\n\t\t\targs: [model],\n\t\t\teventStr: 'asset:unexpire',\n\t\t});\n\t});\n\t/**\n\t * @event module:asset#asset:unexpire:confirmed\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:unexpire:error\n\t * @fires module:asset#asset:unexpire:success\n\t * @see module:asset#asset:unexpire\n\t */\n\tdispatcher.on('asset:unexpire:confirmed', function (model) {\n\t\tmodel.unexpire().then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('asset:unexpire:success', model);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('asset:unexpire:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:unexpire:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:app#app:alert\n\t * @see module:asset#asset:unexpire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:unexpire:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:unexpire:success\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:notification#notification\n\t * @see module:asset#asset:unexpire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:unexpire:success',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [model.id],\n\t\t\t\ttitle: i18n.t('i18n.assetUpdated'),\n\t\t\t\ttype: 'success',\n\t\t\t\tdescription: i18n.t('i18n.unexpired'),\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Asset expiration\n\t//============================================\n\n\t//============================================\n\t//\tAsset info\n\t//============================================\n\t/**\n\t * @event module:asset#asset:info:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:info:edit:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetFileInfo\" */ './views/assetFileInfoView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:info:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:info:edit\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:info:edit:show\n\t * @see module:asset#asset:info:edit:confirmed\n\t */\n\tdispatcher.on('asset:info:edit', function (model) {\n\t\tdispatcher.trigger('asset:info:edit:show', {\n\t\t\tmodel: model,\n\t\t});\n\t});\n\t/**\n\t * @event module:asset#asset:info:edit:confirmed\n\t * @param {object} values Asset info data\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:info:edit:error\n\t * @fires module:asset#asset:info:edit:success\n\t */\n\tdispatcher.on('asset:info:edit:confirmed', function (values, model) {\n\t\tvalues.readOnly = values.readOnly ? 1 : 0;\n\t\tvalues.visible = values.visible ? 1 : 0;\n\t\tmodel.set(values);\n\t\tmodel.save().then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('asset:info:edit:success', model);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('asset:info:edit:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:info:edit:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:app#app:alert\n\t * @see module:asset#asset:info:edit:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:info:edit:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:info:edit:success\n\t * @param {module:asset/models/asset} model Asset model\n\t * @see module:asset#asset:info:edit:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:info:edit:success',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\ttitle: i18n.t('i18n.assetUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.assetUpdated'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Asset info\n\t//============================================\n\n\t//============================================\n\t//\tAsset lock/unlock (read-only)\n\t//============================================\n\t/**\n\t * @event module:asset#asset:lock\n\t * @param {Netx.Model.AssetModel} model Asset model\n\t * @fires module:asset#asset:lock:error\n\t * @fires module:asset#asset:lock:success\n\t */\n\tdispatcher.on('asset:lock', function (model) {\n\t\tmodel.lock().then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('asset:lock:success', model);\n\t\t\t\tdispatcher.trigger('asset:locked', model.id);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('asset:lock:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:lock:error\n\t * @param {string} error Error string\n\t * @param {Netx.Model.AssetModel} model Asset model\n\t * @fires module:app#app:alert\n\t * @see module:asset#asset:lock\n\t */\n\tdispatcher.on(\n\t\t'asset:lock:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:lock:success\n\t * @param {Netx.Model.AssetModel} model Asset model\n\t * @see module:asset#asset:lock\n\t */\n\tdispatcher.on(\n\t\t'asset:lock:success',\n\t\tfunction (model) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:unlock\n\t * @param {Netx.Model.AssetModel} model Asset model\n\t * @fires module:asset#asset:unlock:error\n\t * @fires module:asset#asset:unlock:success\n\t */\n\tdispatcher.on('asset:unlock', function (model) {\n\t\tmodel.unlock().then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('asset:unlock:success', model);\n\t\t\t\tdispatcher.trigger('asset:unlocked', model.id);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('asset:unlock:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:unlock:error\n\t * @param {string} error Error string\n\t * @param {Netx.Model.AssetModel} model Asset model\n\t * @fires module:app#app:alert\n\t * @see module:asset#asset:unlock\n\t */\n\tdispatcher.on(\n\t\t'asset:unlock:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:unlock:success\n\t * @param {Netx.Model.AssetModel} model Asset model\n\t * @see module:asset#asset:unlock\n\t */\n\tdispatcher.on(\n\t\t'asset:unlock:success',\n\t\tfunction (model) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Asset lock/unlock (read-only)\n\t//============================================\n\n\t//============================================\n\t//\tAsset pager\n\t//============================================\n\n\t/**\n\t * Rewind to the first page of a selection\n\t * @event module:asset#asset:pager:firstPage\n\t * @param {Netx.Collections.Assets} collection Asset collection\n\t */\n\tdispatcher.on('asset:pager:firstPage', function (collection) {\n\t\tcollection.getFirstPage();\n\t});\n\n\t/**\n\t * Forward to the last page of a selection\n\t * @event module:asset#asset:pager:lastPage\n\t * @param {Netx.Collections.Assets} collection Asset collection\n\t */\n\tdispatcher.on('asset:pager:lastPage', function (collection) {\n\t\tcollection.getLastPage();\n\t});\n\n\t/**\n\t * Fetch the next page of a selection\n\t * @event module:asset#asset:pager:nextPage\n\t * @param {Netx.Collections.Assets} collection Asset collection\n\t */\n\tdispatcher.on('asset:pager:nextPage', function (collection) {\n\t\tcollection.getNextPage();\n\t});\n\n\t/**\n\t * Fetch the previous page of a selection\n\t * @event module:asset#asset:pager:prevPage\n\t * @param {Netx.Collections.Assets} collection Asset collection\n\t */\n\tdispatcher.on('asset:pager:prevPage', function (collection) {\n\t\tcollection.getPrevPage();\n\t});\n\n\t/**\n\t * Goto a specific page of a selection\n\t * @event module:asset#asset:pager:gotoPage\n\t * @param {Netx.Collections.Assets} collection Asset collection\n\t */\n\tdispatcher.on('asset:pager:gotoPage', function (collection, page) {\n\t\tcollection.gotoPage(page);\n\t});\n\t//============================================\n\t//\t!Asset pager\n\t//============================================\n\n\t//============================================\n\t//\tAsset reimport\n\t//============================================\n\tif (NS.options.REIMPORT_ENABLE) {\n\t\t/**\n\t\t * Action handler: trigger a file uploader for asset re-import\n\t\t * @event module:asset#asset:reimport\n\t\t * @param {module:asset/models/asset} assetModel Asset model\n\t\t * @fires module:upload#upload:asset:reimport\n\t\t */\n\t\tdispatcher.on('asset:reimport', function (assetModel) {\n\t\t\tdispatcher.trigger('upload:asset:reimport', assetModel);\n\t\t});\n\t}\n\t//============================================\n\t//\t!Asset reimport\n\t//============================================\n\n\t//============================================\n\t//\tCategory asset requests\n\t//============================================\n\t/**\n\t * @event module:asset#asset:requests:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:requests:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetRequestForms\" */ './views/assetRequestFormsView'\n\t\t\t).then((View) => {\n\t\t\t\tappViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:requests:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:requests:routed\n\t * @fires module:asset#asset:requests\n\t */\n\tdispatcher.on('asset:requests:routed', function () {\n\t\tdispatcher.trigger('asset:requests');\n\t});\n\t/**\n\t * @event module:asset#asset:requests\n\t * @fires module:asset#asset:requests:show\n\t */\n\tdispatcher.on('asset:requests', function () {\n\t\tNS.assetRequests = NS.assetRequests || new AssetRequestsCollection([]);\n\t\t// Fetch asset requests\n\t\tNS.assetRequests.fetch();\n\t\t// Show the view\n\t\tdispatcher.trigger('asset:requests:show', {\n\t\t\tcollection: NS.assetRequests,\n\t\t});\n\t});\n\t/**\n\t * @event module:asset#asset:request:delete\n\t * @param {module:asset/models/assetRequest} model AssetRequest model\n\t * @fires module:app#app:confirm:delete\n\t * @see module:asset#asset:request:delete:confirmed\n\t */\n\tdispatcher.on('asset:request:delete', function (model) {\n\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\tmessage: i18n.t('i18n.uploadRequestConfirmDelete'),\n\t\t\teventStr: 'asset:request:delete',\n\t\t\targs: [model],\n\t\t});\n\t});\n\t/**\n\t * @event module:asset#asset:request:delete:confirmed\n\t * @param {module:asset/models/assetRequest} model AssetRequest model\n\t * @fires module:asset#asset:request:delete:error\n\t * @fires module:asset#asset:request:delete:success\n\t */\n\tdispatcher.on('asset:request:delete:confirmed', function (model) {\n\t\tmodel.destroy({wait: true}).then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('asset:request:delete:success', model);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('asset:request:delete:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:request:delete:error\n\t * @param {string} error Error\n\t * @see module:asset#asset:request:delete:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:request:delete:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:request:delete:success\n\t * @param {module:asset/models/assetRequest} model AssetRequest model\n\t * @fires module:notification#notification\n\t * @see module:asset#asset:request:delete:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:request:delete:success',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'share',\n\t\t\t\ttitle: i18n.t('i18n.uploadRequestsUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.uploadRequestDeleted'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:request:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:request:edit:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetRequestForm\" */ './views/assetRequestFormView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:request:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:request:edit\n\t * @param {module:asset/models/assetRequest} model Asset Request model\n\t * @fires module:asset#asset:request:edit:show\n\t * @see module:asset#asset:request:edit:confirmed\n\t */\n\tdispatcher.on('asset:request:edit', function (model) {\n\t\t// Show edit view\n\t\tdispatcher.trigger('asset:request:edit:show', {\n\t\t\tmodel: model,\n\t\t});\n\t});\n\t/**\n\t * @event module:asset#asset:request:edit:confirmed\n\t * @param {object} data AssetRequest data\n\t * @param {module:asset/models/assetRequest} model AssetRequest model\n\t * @fires asset:request:edit:error\n\t * @fires asset:request:edit:success\n\t * @see module:asset#asset:request:edit\n\t */\n\tdispatcher.on('asset:request:edit:confirmed', function (data, model) {\n\t\tconst isNew = model.isNew();\n\t\t// Parse and save data\n\t\tmodel.parseAndSave(data).then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('asset:request:edit:success', model, isNew);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('asset:request:edit:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:request:edit:error\n\t * @param {string} error Error\n\t * @fires module:app#app:alert\n\t * @see module:asset#asset:request:edit:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:request:edit:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:request:edit:error\n\t * @param {module:asset/models/assetRequest} model AssetRequest model\n\t * @param {boolean} isNew Whether model is new or not\n\t * @fires module:asset#asset:request:added:show\n\t * @fires module:notification#notification\n\t * @see module:asset#asset:request:edit:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:request:edit:success',\n\t\tfunction (model, isNew) {\n\t\t\t// DAM-9933 - show\n\t\t\t// Notify\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\ttitle: i18n.t('i18n.uploadRequestsUpdated'),\n\t\t\t\tdescription: isNew\n\t\t\t\t\t? i18n.t('i18n.uploadRequestCreated')\n\t\t\t\t\t: i18n.t('i18n.uploadRequestEdited'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\t// Show\n\t\t\tisNew &&\n\t\t\t\tdispatcher.trigger('asset:request:added:show', {\n\t\t\t\t\tmodel: model,\n\t\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:request:added:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:request:added:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetRequestAdded\" */ './views/assetRequestAddedView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowOptions: ['asset:request:added:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:request:new\n\t * @fires module:asset#asset:request:edit\n\t */\n\tdispatcher.on('asset:request:new', function () {\n\t\tdispatcher.trigger('asset:request:edit', new AssetRequestModel());\n\t});\n\t/**\n\t * @event module:asset#asset:request:clipboard:success\n\t * @fires module:notification#asset:request:clipboard:success\n\t */\n\tdispatcher.on('asset:request:clipboard:success', function (model) {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'asset',\n\t\t\tids: [model.id],\n\t\t\ttitle: i18n.t('i18n.uploadRequest'),\n\t\t\tdescription: i18n.t(\n\t\t\t\t'i18n.uploadRequestUrlSuccessfullyCopiedToClipboard',\n\t\t\t\t{\n\t\t\t\t\tdefaultValue:\n\t\t\t\t\t\t'Upload request URL successfully copied to clipboard. \"__link__\"',\n\t\t\t\t\tlink: model.get('url'),\n\t\t\t\t},\n\t\t\t),\n\t\t\ttype: 'success',\n\t\t});\n\t});\n\t//============================================\n\t//\t!Category asset requests\n\t//============================================\n\n\t//============================================\n\t//\tAsset selection\n\t//============================================\n\t/**\n\t * @event module:asset#asset:selected\n\t * when an asset is selected for a portal logo, watermark or favicon\n\t * the model needs to be fetched\n\t */\n\tdispatcher.on('asset:selected', function (opts) {\n\t\tconst doFetch = opts.fetch;\n\t\tconst newId = opts.newId;\n\t\tlet assetModel = opts.assetModel;\n\n\t\tif (\n\t\t\tnewId &&\n\t\t\tassetModel &&\n\t\t\t(assetModel.id !== newId || assetModel.get('previewUrl').length === 0)\n\t\t) {\n\t\t\tassetModel.set({assetId: newId});\n\n\t\t\t// portal assets still need to be fetched here\n\t\t\tif (doFetch) {\n\t\t\t\tassetModel.fetch().then(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tdispatcher.trigger('asset:selected:success', assetModel, newId);\n\t\t\t\t\t},\n\t\t\t\t\t(error) => {\n\t\t\t\t\t\tdispatcher.trigger('asset:selected:error', error);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t} else if (assetModel.id === newId) {\n\t\t\t\t// assetId was successfuly set\n\t\t\t\tdispatcher.trigger('asset:selected:success', assetModel, newId);\n\t\t\t} else {\n\t\t\t\tdispatcher.trigger('asset:selected:error', assetModel, newId);\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * @event module:asset#asset:selected:error\n\t * @param {string} error Error\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'asset:selected:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#system:portal:new:success\n\t * @param {module:asset/models/assetSelect} model Asset select\n\t */\n\tdispatcher.on(\n\t\t'asset:selected:success',\n\t\tfunction (model, id) {\n\t\t\t// do nothing\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Asset selection\n\t//============================================\n\n\t//============================================\n\t//\tAsset sharing\n\t//============================================\n\t/**\n\t * Route handler for asset-sharing route:\n\t * Convert an ID to an asset, and punt to the sharing module.\n\t * @event module:asset#asset:share:menu\n\t * @param {number} id Asset id\n\t */\n\tdispatcher.on('asset:share:menu', function (id) {\n\t\tid = parseInt(id);\n\t\tAssetModel.Load(id).then(\n\t\t\tfunction (asset) {\n\t\t\t\tdispatcher.trigger('share:menu', asset);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// does the asset exist, even?\n\t\t\t\tconsole.log(err);\n\t\t\t},\n\t\t);\n\t});\n\t//============================================\n\t//\t!Asset sharing\n\t//============================================\n\n\t//============================================\n\t//\tAsset submit\n\t//============================================\n\t/**\n\t * Asset form submission handler: pack the asset & sync with the server\n\t * @event module:asset#asset:submit:confirmed\n\t * @param {object} values Asset data\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:submit:save\n\t */\n\tdispatcher.on('asset:submit:confirmed', function (values, model) {\n\t\t// Server wants integers and not booleans\n\t\tvalues.readOnly = values.readOnly ? 1 : 0;\n\t\tvalues.visible = values.visible ? 1 : 0;\n\n\t\tmodel.set(values);\n\t\tdispatcher.trigger('asset:submit:save', model);\n\t});\n\t/**\n\t * @event module:asset#asset:submit:save\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:submit:save:error\n\t * @fires module:asset#asset:submit:save:success\n\t */\n\tdispatcher.on('asset:submit:save', function (model) {\n\t\t// now sync the asset\n\t\tif (NS.options.FETCH_ON_SAVE) {\n\t\t\tmodel.save(model.attributes, {silent: true}).then(\n\t\t\t\tfunction (response) {\n\t\t\t\t\t// Success\n\t\t\t\t\tmodel.fetch().then(\n\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\t// Success\n\t\t\t\t\t\t\tdispatcher.trigger('asset:submit:success', model);\n\t\t\t\t\t\t\tdispatcher.trigger('asset:submit:save:success', model);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfunction (err) {\n\t\t\t\t\t\t\t// Error\n\t\t\t\t\t\t\tdispatcher.trigger('asset:submit:error', err);\n\t\t\t\t\t\t\tdispatcher.trigger('asset:submit:save:error', err);\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\t// Error\n\t\t\t\t\tdispatcher.trigger('asset:submit:error', err);\n\t\t\t\t\tdispatcher.trigger('asset:submit:save:error', err);\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\tmodel.save().then(\n\t\t\t\tfunction () {\n\t\t\t\t\t// Success\n\t\t\t\t\tdispatcher.trigger('asset:submit:success', model);\n\t\t\t\t\tdispatcher.trigger('asset:submit:save:success', model);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\t// Error\n\t\t\t\t\tdispatcher.trigger('asset:submit:error', err);\n\t\t\t\t\tdispatcher.trigger('asset:submit:save:error', err);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t});\n\t/**\n\t * @event module:asset#asset:submit:save:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('asset:submit:save:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\t/**\n\t * @event module:asset#asset:submit:save:success\n\t * @param {module:asset/models/asset} model Asset model\n\t */\n\tdispatcher.on('asset:submit:save:success', function (model) {\n\t\t//\n\t});\n\t//============================================\n\t//\t!Asset submit\n\t//============================================\n\n\t//============================================\n\t//\tAsset tag panel\n\t//============================================\n\t/**\n\t * @event module:asset#asset:tagPanel:grid:show:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:tagPanel:grid:show',\n\t\tfunction (viewOptions = {}) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-tagPanelGrid\" */ './views/tagPanelGridView'\n\t\t\t).then((View) => {\n\t\t\t\tfsViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:tagPanel:grid:show'],\n\t\t\t\t\tviewOptions: {\n\t\t\t\t\t\tisRouted: true,\n\t\t\t\t\t\trouteMatch: /assets\\/grideditor/,\n\t\t\t\t\t\t...viewOptions,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\tdispatcher.on('asset:tagPanel:grid:routed', () => {\n\t\tdispatcher.trigger('asset:tagPanel:grid:show');\n\t});\n\n\t/**\n\t * @event module:asset#asset:tagPanel:grid:clone:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:tagPanel:grid:clone:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-tagPanelGridClone\" */ './views/tagPanelGridCloneView'\n\t\t\t).then((View) => {\n\t\t\t\tfsViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:tagPanel:grid:clone:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:tagPanel:grid:clone\n\t * @fires module:asset#asset:tagPanel:grid:clone:show\n\t */\n\tdispatcher.on('asset:tagPanel:grid:clone', function (data) {\n\t\tdispatcher.trigger('asset:tagPanel:grid:clone:show', data);\n\t});\n\n\t/**\n\t * @event module:asset#asset:tagPanel:grid:preview\n\t * @param {number} assetId Asset id\n\t */\n\tdispatcher.on('asset:tagPanel:grid:preview', function (assetId) {\n\t\tconst model = new AssetModel({assetId: assetId});\n\t\tmodel.fetch();\n\n\t\timport(\n\t\t\t/* webpackChunkName: \"view-assetPreview\" */ './components/AssetPreview/views/asset-preview-dialog'\n\t\t).then((View) => {\n\t\t\t// New asset preview view\n\t\t\tnew View.default({\n\t\t\t\tmodel,\n\t\t\t}).render();\n\t\t});\n\t});\n\t//============================================\n\t//\t!Asset tag panel\n\t//============================================\n\n\t//============================================\n\t//\tAsset tasks\n\t//============================================\n\t/**\n\t * @event module:asset#asset:tasks:poll\n\t * @param {Netx.Collections.AssetTasks} tasks Asset tasks collection\n\t * @fires module:asset#asset:tasks:poll\n\t */\n\tdispatcher.on('asset:tasks:poll', function (tasks) {\n\t\tNS.tasks.trackTasks();\n\t});\n\n\t/**\n\t * Task Polling:\n\t * Set up & begin polling of DAM tasks on assets\n\t * @event module:asset#asset:tasks:track\n\t * @param {array} assets An array of asset models or asset ids\n\t * @fires module:asset#asset:tasks:poll\n\t * @fires module:asset#asset:tasks:complete\n\t * @fires module:asset#asset:tasks:status\n\t */\n\tdispatcher.on('asset:tasks:track', function (assets) {\n\t\tconst tasks = NS.tasks;\n\t\tassets = _.tidyAssetList(assets);\n\t\t_.each(assets, function (assetId) {\n\t\t\t!tasks.get(assetId) && tasks.add({assetId: assetId});\n\t\t});\n\n\t\tdispatcher.trigger('asset:tasks:poll', tasks);\n\t});\n\t//============================================\n\t//\t!Asset tasks\n\t//============================================\n\n\t//============================================\n\t//\tAsset card thumbnail resizing\n\t//============================================\n\t/**\n\t * Save thumbSize to user prefs\n\t * @event asset:thumb:resize\n\t * @param {number} size Desired size\n\t * @fires module:asset#asset:thumb:set\n\t * @fires module:user#user:prefs:set\n\t */\n\tdispatcher.on('asset:thumb:resize', function (size) {\n\t\tdispatcher.trigger('user:prefs:set', 'assetList.thumbSize', parseInt(size));\n\t\t// TODO: I would argue that we should follow the pattern of error/success\n\t\t// `asset:thumb:resize:success`\n\t\t// Rather than this event that kind of sounds like an asset thumb should be being set when this is called (data wise)\n\t\t// and, at least I would expect, that sopme data should be being passed to it.\n\t\tdispatcher.trigger('asset:thumb:set');\n\t});\n\t//============================================\n\t//\tEnd asset card thumbnail resizing\n\t//============================================\n\n\t//============================================\n\t//\tAsset versions\n\t//============================================\n\n\t/**\n\t * Delete an asset version\n\t * @event module:asset#asset:versions:delete\n\t * @param {module:asset/models/assetVersion} model AssetVersion model\n\t * @fires module:app#app:confirm:delete\n\t * @see module:asset#asset:versions:delete:confirmed\n\t */\n\tdispatcher.on('asset:versions:delete', function (model) {\n\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\tmessage: i18n.t('i18n.deleteVersionConfirm'),\n\t\t\teventStr: 'asset:versions:delete',\n\t\t\targs: [model],\n\t\t});\n\t});\n\n\t/**\n\t * Confirmed deletion of asset version\n\t * @event module:asset#asset:versions:delete:confirmed\n\t * @param {module:asset/models/assetVersion} model AssetVersion model\n\t * @fires module:asset#asset:versions:delete:error\n\t * @fires module:asset#asset:versions:delete:success\n\t */\n\tdispatcher.on('asset:versions:delete:confirmed', function (model) {\n\t\tmodel.destroy({wait: true}).then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('asset:versions:delete:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('asset:versions:delete:error', err);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:asset#asset:version:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:asset#asset:versions:delete:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:versions:delete:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:version:success\n\t * @fires module:notification#notification\n\t * @see module:asset#asset:versions:delete:confirmed\n\t */\n\tdispatcher.on(\n\t\t'asset:versions:delete:success',\n\t\tfunction () {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\ttitle: i18n.t('i18n.assetUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.versionDeleted'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Download an asset version\n\t * @event module:asset#asset:version:download\n\t * @param {module:asset/models/assetVersion} model AssetVersion model\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on('asset:version:download', function (versionModel) {\n\t\t// punt to the share controller\n\t\tdispatcher.trigger('share:assetSet:version', versionModel);\n\t});\n\n\t/**\n\t * @event module:asset#asset:versions:reactivate:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on('asset:versions:reactivate:show', function (viewOptions) {\n\t\tNetx.app.modalViews.add({\n\t\t\tviewClass: AssetVersionReactivateView,\n\t\t\tshowActions: ['asset:versions:reactivate:show'],\n\t\t\tviewOptions: viewOptions,\n\t\t});\n\t});\n\t/**\n\t * Reactivate an asset version\n\t * @event module:asset#asset:versions:reactivate\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:asset#asset:versions:reactivate:show\n\t */\n\tdispatcher.on('asset:versions:reactivate', function (model) {\n\t\tdispatcher.trigger('asset:versions:reactivate:show', {\n\t\t\tmodel: model,\n\t\t});\n\t});\n\n\t/**\n\t * Confirmed reactivation of an asset version\n\t * @event module:asset#asset:versions:reactivate:confirmed\n\t * @param {object} values Reactivation data\n\t * @param {module:asset/models/assetVersion} newVersion AssetVersion model\n\t * @fires module:asset#asset:versions:reactivate:error\n\t * @fires module:asset#asset:versions:reactivate:success\n\t * @see module:asset#asset:versions:reactivate:succeeded\n\t */\n\tdispatcher.on(\n\t\t'asset:versions:reactivate:confirmed',\n\t\tfunction (values, newVersion) {\n\t\t\t//hijack this memoText with value (will get reset when fetch() happens post-reactivate)\n\t\t\tnewVersion.set('memoText', values.memoText);\n\t\t\tnewVersion.reactivateAssetVersion().then(\n\t\t\t\tfunction (uuid) {\n\t\t\t\t\t// The form submission was a success\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:versions:reactivate:success',\n\t\t\t\t\t\tnewVersion,\n\t\t\t\t\t\tuuid,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'asset:versions:reactivate:error',\n\t\t\t\t\t\terr,\n\t\t\t\t\t\tnewVersion,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t);\n\n\t/**\n\t * @event module:asset#asset:versions:reactivate:success\n\t * @param {string} error Error string\n\t * @param {module:asset/models/assetVersion} newVersion Version activated\n\t * @fores module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'asset:versions:reactivate:error',\n\t\tfunction (error, newVersion) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'app:alert',\n\t\t\t\tcheckinErrors[error.code] ||\n\t\t\t\t\tcheckinErrors['default'] ||\n\t\t\t\t\terror.message ||\n\t\t\t\t\terror,\n\t\t\t\ti18n.t('i18n.error'),\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Request to activate version was accepted\n\t * @event module:asset#asset:versions:reactivate:success\n\t * @param {module:asset/models/assetVersion} newVersion Version activated\n\t * @param {string} uuid UUID\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'asset:versions:reactivate:success',\n\t\tfunction (newVersion, uuid) {\n\t\t\t// Notify\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: newVersion.get('assetId'),\n\t\t\t\ttitle: i18n.t('i18n.assetUpdating'),\n\t\t\t\tdescription: i18n.t('i18n.reactivatingVersion'),\n\t\t\t\ttype: 'info',\n\t\t\t\tprogressTask: {\n\t\t\t\t\targs: [newVersion],\n\t\t\t\t\teventStr: 'asset:versions:reactivate',\n\t\t\t\t\tuuid: uuid,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Version has been reactivated\n\t * @event module:asset#asset:versions:reactivate:succeeded\n\t * @param {module:asset/models/assetVersion} newVersion Version activated\n\t */\n\tdispatcher.on('asset:versions:reactivate:succeeded', function (newVersion) {\n\t\t// Refetch current asset\n\t\tNS.current.fetch().then(function () {\n\t\t\tthis.fetchVersions();\n\t\t});\n\t});\n\n\t//============================================\n\t//\t!Asset versions\n\t//============================================\n\n\t//============================================\n\t//\tAsset views\n\t//============================================\n\n\t/**\n\t * View add\n\t * @event module:asset#asset:views:add\n\t * @fires module:upload#upload:asset:view\n\t */\n\tdispatcher.on('asset:views:add', function () {\n\t\tdispatcher.trigger(\n\t\t\t'upload:asset:view',\n\t\t\tnew AssetViewModel({\n\t\t\t\timageId: NS.current.id,\n\t\t\t}),\n\t\t);\n\t});\n\t/**\n\t * Delete asset view\n\t * @event module:asset#asset:views:delete\n\t * @param {module:asset/models/assetView} assetView AssetView model\n\t * @fires module:asset#app:confirm:delete\n\t * @see module:asset#asset:views:delete:confirmed\n\t */\n\tdispatcher.on('asset:views:delete', function (assetView) {\n\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\tmessage: i18n.t('i18n.deleteViewConfirm', {\n\t\t\t\tassetId: assetView.get('imageId'),\n\t\t\t}),\n\t\t\teventStr: 'asset:views:delete',\n\t\t\targs: [assetView],\n\t\t});\n\t});\n\t/**\n\t * View deletion confirmation\n\t * @event module:asset#asset:views:delete:confirmed\n\t * @param {module:asset/models/assetView} assetView AssetView model\n\t * @fires module:asset#asset:views:delete:error\n\t * @fires module:asset#asset:views:delete:success\n\t */\n\tdispatcher.on('asset:views:delete:confirmed', function (assetView) {\n\t\tassetView.destroy({wait: true}).then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\t// refresh the views list\n\t\t\t\tNS.views.assetId = NS.current.id;\n\t\t\t\tNS.views.fetch();\n\t\t\t\tdispatcher.trigger('asset:views:delete:success', NS.current.id);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('asset:views:delete:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:views:delete:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'asset:views:delete:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:asset#asset:views:delete:success\n\t * @param {number} assetId Asset id\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'asset:views:delete:success',\n\t\tfunction (assetId) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [assetId],\n\t\t\t\ttitle: i18n.t('i18n.assetUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.assetViewsSuccessfullyDeleted'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Download the currently selected view\n\t * @event module:asset#asset:views:download\n\t */\n\tdispatcher.on('asset:views:download', function (assetView) {\n\t\tconst link = `${Netx.URL.assetEndpoint}/${assetView.get('imageId')}/view/${\n\t\t\tassetView.id\n\t\t}/view_${assetView.id}.${assetView.get('fileTypeLabel')}?attachment=true`;\n\t\topenDownloadLink(link);\n\t});\n\t/**\n\t * View edit\n\t * @event module:asset#asset:views:edit\n\t * @param {module:asset/models/assetView} assetView AssetView model\n\t * @fires module:upload#upload:asset:view\n\t */\n\tdispatcher.on('asset:views:edit', function (assetView) {\n\t\tdispatcher.trigger('upload:asset:view', assetView);\n\t});\n\t//============================================\n\t//\t!Asset views\n\t//============================================\n\n\t//============================================\n\t//\tAsset zoom\n\t//============================================\n\t/**\n\t * @event module:asset#asset:zoom:routed\n\t * @param {number|string} id Asset id\n\t * @fires module:asset#asset:zoom\n\t */\n\tdispatcher.on('asset:zoom:routed', function (id) {\n\t\tif (id == NS.current.id) {\n\t\t\tdispatcher.trigger('asset:zoom', NS.current);\n\t\t} else {\n\t\t\tAssetModel.Load(id).then(\n\t\t\t\tfunction (asset) {\n\t\t\t\t\t// Success\n\t\t\t\t\tdispatcher.trigger('asset:zoom', asset);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\t// Error\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t});\n\n\t/**\n\t * Handle a request to display a zoom interface for an asset.\n\t * There are two possible engines for this, so in this handler we\n\t * pick an engine and hand off to one of two engine-specific handlers.\n\t *\n\t * @event module:asset#asset:zoom\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:app#asset:zoom:zoomify\n\t * @fires module:app#asset:zoom:mediarich\n\t */\n\tdispatcher.on('asset:zoom', function (model) {\n\t\t// Which zoom engine to use: MediaRich (aka Equilibrium), or Zoomify?\n\t\tif (\n\t\t\tNetx.getPreference('equilibrium.enabled', true) &&\n\t\t\tNetx.getPreference('equilibrium.zoomEnabled', true)\n\t\t) {\n\t\t\tdispatcher.trigger('asset:zoom:mediarich', model);\n\t\t} else {\n\t\t\tdispatcher.trigger('asset:zoom:zoomify', model);\n\t\t}\n\t});\n\n\t/**\n\t * Handle a zoom request via the Mediarich (aka Equilibrium) engine,\n\t * a Flash app in a seperate window.\n\t * @event module:asset#asset:zoom:mediarich\n\t * @param {module:asset/models/asset} model Asset model\n\t */\n\tdispatcher.on(\n\t\t'asset:zoom:mediarich',\n\t\tfunction (model) {\n\t\t\t// Could take a moment ...\n\t\t\tdispatcher.trigger('app:progress', {\n\t\t\t\tmodel: model,\n\t\t\t\teventStr: 'asset:zoom:mediarich:cache',\n\t\t\t\theaderTitle: i18n.t('i18n.zooming', {defaultValue: 'Zooming ...'}),\n\t\t\t\tmessage: '',\n\t\t\t});\n\n\t\t\tmodel.cacheInMediaRich().then(\n\t\t\t\tfunction () {\n\t\t\t\t\t// Close progress window\n\t\t\t\t\tdispatcher.trigger('asset:zoom:mediarich:cache:success');\n\t\t\t\t\t// Open a view in the fullscreeny appView instance Netx.App.fsViews\n\t\t\t\t\tdispatcher.trigger('asset:zoom:mediarich:show', {\n\t\t\t\t\t\tmodel: model,\n\t\t\t\t\t\trouteMatch: new RegExp(/^asset\\/(\\d+)\\/zoom/),\n\t\t\t\t\t\tisRouted: true,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('asset:zoom:medarich:cache:error', err);\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:zoom:mediarich:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:zoom:mediarich:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetMRZoom\" */ './views/assetMRZoomView'\n\t\t\t).then((View) => {\n\t\t\t\tfsViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:zoom:mediarich:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:zoom:zoomify:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'asset:zoom:zoomify:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-assetZoomify\" */ './views/assetZoomifyView'\n\t\t\t).then((View) => {\n\t\t\t\tfsViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['asset:zoom:zoomify:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Trigger tiling of an asset, and launch the tiled image viewer\n\t * @event module:asset#asset:zoom:zoomify\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:app#app:pollBatchJob\n\t * @fires module:asset#asset:zoom:zoomify:show\n\t * @fires module:asset#asset:zoom:zoomify:error\n\t * @fires module:asset#asset:zoom:zoomify:success\n\t */\n\tdispatcher.on(\n\t\t'asset:zoom:zoomify',\n\t\tfunction (model) {\n\t\t\t// Show\n\t\t\tdispatcher.trigger('asset:zoom:zoomify:show', {\n\t\t\t\tmodel: model,\n\t\t\t\trouteMatch: new RegExp(/^asset\\/(\\d+)\\/zoom/),\n\t\t\t\tisRouted: true,\n\t\t\t});\n\n\t\t\t// ask the server to tile the image\n\t\t\tmodel.makeZoomTiles().then(\n\t\t\t\tfunction (m) {\n\t\t\t\t\t// Success\n\t\t\t\t\tif (m.exists) {\n\t\t\t\t\t\t// tiles are ready\n\t\t\t\t\t\t// HACK: if we're a modal, we might still be showing (fading in with CSS animations.)\n\t\t\t\t\t\t// Or we might not. There's an event 'shown' we can listen for on the view, but no\n\t\t\t\t\t\t// really clean way to know if it's showing yet or not, or already done showing. So i'm inserting a delay here.\n\t\t\t\t\t\t_.delay(function () {\n\t\t\t\t\t\t\tdispatcher.trigger('asset:zoom:zoomify:success', m);\n\t\t\t\t\t\t}, 300); // this 300ms value copied from bootstrap.modal code, where it's hardcoded.\n\t\t\t\t\t} else if (m.progressUUID) {\n\t\t\t\t\t\t// waiting for tiles to finish\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'app:pollBatchJob',\n\t\t\t\t\t\t\tm.progressUUID,\n\t\t\t\t\t\t\t'asset:zoom:zoomify',\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'asset:zoom:zoomify:error',\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t'Zoom unavailable and an invalid progress uuid was returned',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('asset:zoom:zoomify:error', err, model);\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:zoom:zoomify:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'asset:zoom:zoomify:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#asset:zoom:zoomify:success\n\t * @param {module:asset/models/asset} model Asset model\n\t */\n\tdispatcher.on(\n\t\t'asset:zoom:zoomify:success',\n\t\tfunction (model) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * UI hander: where to go when the zoom window closes?\n\t * @param module:asset/models/asset model Asset model\n\t */\n\tdispatcher.on(\n\t\t'asset:zoom:zoomify:closed',\n\t\tfunction () {\n\t\t\t// // How did we get here?\n\t\t\t// // If we loaded directly on a zoom,\n\t\t\t// if (Netx.router.history.length == 1 && Netx.router.history[0].match(/zoom$/)) {\n\t\t\t// \t// Can't close the window for security reasons:\n\t\t\t// \t// http://stackoverflow.com/questions/19761241/window-close-and-self-close-do-not-close-the-window-in-chrome\n\t\t\t// \t//\n\t\t\t// \t// Instead, just go home:\n\t\t\t// \tNetx.router.navigate(Netx.custom.HOME_ROUTE || '#', {triger: true}); // for 8.4\n\t\t\t// \t// Netx.router.home(); // easier in 8.5 .\n\t\t\t// \t// Actually, Netx.router.back() would call .home() in this case, so this handler could be a one-liner. TODO: test that.\n\t\t\t// } else {\n\t\t\t// \tNetx.router.back();\n\t\t\t// }\n\t\t},\n\t\twindow,\n\t);\n\n\t//============================================\n\t//\t!Asset zoom\n\t//============================================\n\n\t//=================================\n\t//\t!EVENT LISTENERS\n\t//=================================\n\n\t// END OF INIT:\n\t/////////////////////////\n\t// After the module has run through its init routine,\n\t// stop listening for subsequent init events which would\n\t// cause duplicate listeners and instances to be created.\n\t$.when.apply(this, NS.bootstrap).then(function () {\n\t\tdelete NS.bootstrap;\n\t\tdispatcher.trigger('asset:extend', NS);\n\t\tdispatcher.trigger('asset:initialized', NS);\n\t});\n});\n\nexport default {\n\tinitialize(opts) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdispatcher.once('asset:initialized', () => {\n\t\t\t\tresolve(routes);\n\t\t\t});\n\t\t\tdispatcher.trigger('asset:init');\n\t\t});\n\t},\n};\n","/**\n * Quickzoom view\n * @class\n */\n\nimport Base from '@netx/core/lib/netx-view';\nimport ABCustomization from '@netx/core-ad-builder/models/ABCustomization';\n\nimport Template from '../templates/assetQuickzoomView.html';\n\nimport {isMobile} from '@netx/core/lib/underscore-netx';\n\nimport {\n\tfaExpandArrows,\n\tfaStop,\n\tfaTimesCircle,\n} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaExpandArrows,\n\tfaStop,\n\tfaTimesCircle,\n});\n\nexport default class AssetQuickzoomView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = {\n\t\t\t'click [data-nx-control=\"zoom-in\"]': 'zoomIn',\n\t\t\t'click [data-nx-control=\"zoom-out\"]': 'zoomOut',\n\t\t\t'click [data-nx-control=\"zoom-reset\"]': 'zoomToWindow',\n\t\t\t'dblclick img.zoom': 'zoomIn',\n\t\t\tcontextmenu: 'onRightClick',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.template = opts.template || Template;\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\n\t\tthis.minSize = opts.minSize || 100;\n\t\tthis.maxSize = opts.maxSize || 1000;\n\t\tthis.stepSize = opts.stepSize || 100;\n\t}\n\n\t/** @override */\n\tbindEvents() {\n\t\tsuper.bindEvents();\n\n\t\tif (isMobile()) {\n\t\t\tif (!this.hammer) {\n\t\t\t\tthis.hammer = new Hammer(this.el);\n\t\t\t}\n\t\t\tthis.hammer.set({domEvents: true});\n\t\t\tthis.hammer.on('panstart', this.hammerPanstart.bind(this));\n\t\t\tthis.hammer.on('pan', this.hammerPan.bind(this));\n\t\t}\n\t\t// this.hammer.get('pinch').set({ enable: true, threshold: 0 });\n\t\t// this.hammer.on('pinchstart', this.hammerPinchstart.bind(this));\n\t\t// this.hammer.on('pinch', this.hammerPinch.bind(this));\n\t\t// this.hammer.on('pinchmove', this.hammerPinch.bind(this));\n\n\t\treturn this;\n\t}\n\n\t// pinch isn't working yet\n\n\t// hammerPinchstart(e) {\n\t// \tconsole.log('hammerPinchstart e: %o', e);\n\t// }\n\t// hammerPinch(e) {\n\t// \tconsole.log('hammerPinch e: %o', e);\n\t// }\n\n\t/** @method */\n\tonRightClick(e) {\n\t\te.preventDefault();\n\t\treturn false;\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\t\t// this model could be an asset model, or a template customization model\n\t\tconst isAsset = model.get('blocks') == null;\n\t\tconst isTemplate = model.get('abTitle') != null;\n\t\tconst cacheBuster = Netx.asset.current.cacheBuster();\n\n\t\tObject.assign(this.templateVars, {\n\t\t\tzoomUrl:\n\t\t\t\tisAsset || isTemplate\n\t\t\t\t\t? `/file/asset/${model.id}/zoom${cacheBuster}`\n\t\t\t\t\t: `${model.get('zoomUrl')}${cacheBuster}`,\n\t\t\tisAsset: isAsset,\n\t\t\tisTemplate: isTemplate,\n\t\t\tzoomEnabled: Netx.getPreference('zoom.tiles.enabled', true),\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$zoomIn = this.$('.zoomIn');\n\t\tthis.$zoomOut = this.$('.zoomOut');\n\n\t\t// wait till image is loaded to get image dimensions\n\t\tthis.$el.addClass('loading');\n\t\tconst $img = this.$('img.zoom');\n\t\t$img.on('load', (e) => {\n\t\t\tconst img = $img[0];\n\t\t\tthis.$zoomImg = $img.parent();\n\t\t\tthis.zoomImgScale = img.width / img.height;\n\t\t\tthis.originalWidth = img.width;\n\t\t\tthis.originalHeight = img.height;\n\n\t\t\tthis.zoomToWindow();\n\t\t});\n\t}\n\n\t/**\n\t * Set the image dimensions\n\t * @method\n\t * @param {Int} width Integer dimension to set on the img tag\n\t * @param {Int} height Integer dimension to set on the img tag\n\t */\n\tsetImgDimensions(width, height) {\n\t\tthis.$zoomImg.css({\n\t\t\twidth: `${width}px`,\n\t\t\theight: `${height}px`,\n\t\t});\n\t}\n\n\t/** @method */\n\tzoomToWindow() {\n\t\tconst curWidth = this.$zoomImg.width();\n\t\tconst curHeight = this.$zoomImg.height();\n\n\t\tif (this.zoomImgScale > 1) {\n\t\t\t// landscape\n\t\t\tthis.targetWidth =\n\t\t\t\tthis.originalWidth > window.innerWidth\n\t\t\t\t\t? window.innerWidth\n\t\t\t\t\t: this.originalWidth;\n\t\t\tthis.targetHeight = Math.round(this.targetWidth / this.zoomImgScale);\n\t\t\tthis.setImgDimensions(this.targetWidth, this.targetHeight);\n\t\t} else {\n\t\t\t// portrait\n\t\t\tthis.targetHeight =\n\t\t\t\tthis.originalHeight > window.innerHeight\n\t\t\t\t\t? window.innerHeight\n\t\t\t\t\t: this.originalHeight;\n\t\t\tthis.targetWidth = Math.round(this.targetHeight * this.zoomImgScale);\n\t\t\tthis.setImgDimensions(this.targetWidth, this.targetHeight);\n\t\t}\n\t\tthis.centerZoomImage();\n\t\tthis.zoomEnable();\n\t}\n\n\t/** @method */\n\tcenterZoomImage() {\n\t\t// set image to fit screen and center\n\t\t// drag uses absolute positioning so no flexbox\n\t\tthis.$zoomImg.css({\n\t\t\ttop: Math.round(window.innerHeight - this.targetHeight) / 2 + 'px',\n\t\t\tleft: Math.round(window.innerWidth - this.targetWidth) / 2 + 'px',\n\t\t});\n\n\t\tthis.$el.removeClass('loading');\n\t}\n\n\t/**\n\t * the + button was clicked, zoom in\n\t * @method\n\t * @param {obejct} e - jquery event\n\t */\n\tzoomIn(e) {\n\t\tconst curWidth = this.$zoomImg.width();\n\t\tconst curHeight = this.$zoomImg.height();\n\n\t\tif (\n\t\t\tcurHeight <= this.maxSize - this.stepSize &&\n\t\t\tcurWidth <= this.maxSize - this.stepSize\n\t\t) {\n\t\t\tif (this.zoomImgScale > 1) {\n\t\t\t\tthis.targetWidth = curWidth + this.stepSize;\n\t\t\t\tthis.targetHeight = Math.round(this.targetWidth / this.zoomImgScale);\n\t\t\t\tthis.setImgDimensions(this.targetWidth, this.targetHeight);\n\t\t\t} else {\n\t\t\t\tthis.targetHeight = curHeight + this.stepSize;\n\t\t\t\tthis.targetWidth = Math.round(this.targetHeight * this.zoomImgScale);\n\t\t\t\tthis.setImgDimensions(this.targetWidth, this.targetHeight);\n\t\t\t}\n\t\t\tthis.centerZoomImage();\n\t\t}\n\t\tthis.zoomEnable();\n\t}\n\n\t/**\n\t * the - button was clicked, zoom out\n\t * @method\n\t * @param {obejct} e - jquery event\n\t */\n\tzoomOut(e) {\n\t\tconst curWidth = this.$zoomImg.width();\n\t\tconst curHeight = this.$zoomImg.height();\n\n\t\tif (curHeight > this.minSize && curWidth > this.minSize) {\n\t\t\tif (this.zoomImgScale > 1) {\n\t\t\t\tthis.targetWidth = curWidth - this.stepSize;\n\t\t\t\tthis.targetHeight = Math.round(this.targetWidth / this.zoomImgScale);\n\t\t\t\tthis.setImgDimensions(this.targetWidth, this.targetHeight);\n\t\t\t} else {\n\t\t\t\tthis.targetHeight = curHeight - this.stepSize;\n\t\t\t\tthis.targetWidth = Math.round(this.targetHeight * this.zoomImgScale);\n\t\t\t\tthis.setImgDimensions(this.targetWidth, this.targetHeight);\n\t\t\t}\n\t\t\tthis.centerZoomImage();\n\t\t}\n\n\t\tthis.zoomEnable();\n\t}\n\n\t/**\n\t * enable / disable zoom in/out buttons\n\t * @method\n\t * @param {obejct} e - jquery event\n\t */\n\tzoomEnable() {\n\t\tconst curWidth = this.targetWidth;\n\t\tconst curHeight = this.targetHeight;\n\t\t// console.log('curWidth: %o curHeight: %o', curWidth, curHeight);\n\n\t\tthis.$zoomIn.enableIf(\n\t\t\t!(\n\t\t\t\tcurWidth > this.maxSize - this.stepSize ||\n\t\t\t\tcurHeight > this.maxSize - this.stepSize\n\t\t\t),\n\t\t);\n\t\tthis.$zoomOut.enableIf(\n\t\t\t!(\n\t\t\t\tcurWidth < this.minSize + this.stepSize ||\n\t\t\t\tcurHeight < this.minSize + this.stepSize\n\t\t\t),\n\t\t);\n\t}\n\n\tcancel(e) {\n\t\t// console.log('cancel');\n\t\tthis.hide(true);\n\t\tdispatcher.trigger('asset:quickzoom:close');\n\t}\n\n\t/** @method */\n\thammerPan(e) {\n\t\tif (!e.originalEvent) return;\n\t\tconst gesture = e.originalEvent.gesture;\n\n\t\tthis.$zoomImg.css({\n\t\t\ttop: this.dragTopStart + gesture.deltaY,\n\t\t\tleft: this.dragLeftStart + gesture.deltaX,\n\t\t});\n\t}\n\n\t/** @method */\n\thammerPanstart(e, b, c) {\n\t\t// console.log('e: %o', e);\n\t\tconst position = this.$zoomImg.position();\n\t\tthis.dragLeftStart = position.left;\n\t\tthis.dragTopStart = position.top;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetQuickzoomView';\n\t}\n}\n","export {default} from '@netx/core-asset/controller';\n\n// import AssetDetailView from './views/assetDetailView';\nimport AssetQuickzoomView from './views/assetQuickzoomView';\nimport AssetZoomifyView from './views/assetZoomifyView';\nimport AssetModel from './models/asset';\n\n//=================================\n//\tProperties\n//=================================\nimport {things as assetThings} from './properties/asset';\nassetThings.links.label = i18n.t('i18n.relationships');\n//=================================\n//\t!Properties\n//=================================\n\n/**\n * Asset Module Extensions\n * @event module:asset#asset:extend\n */\ndispatcher.once('asset:extend', function (NS) {\n\t// Use faceted search\n\t// Filter mode is driven by the property `search.facet.filterMode` - default is quite literally \"DEFAULT\"\n\t// See Netx.Collections.SearchFacets\n\t// NS.expiring.useFacetedSearch(true);\n\n\t//=================================\n\t//\tEVENT LISTENERS\n\t//=================================\n\n\tdispatcher.off('asset:routed');\n\tdispatcher.on('asset:routed', function (id, tab) {\n\t\t// fetch, even if we were just here, DAM-19393\n\t\t// like theme does\n\t\tdispatcher.trigger('asset:cursor:goto', id);\n\n\t\t// THEM-1460\n\t\t$('#wrapper').scrollTop(0);\n\n\t\t// Show\n\t\tdispatcher.trigger('asset:detail:show', {\n\t\t\tmodel: NS.current,\n\t\t\tcollection: NS.cursor,\n\t\t\tdetailTab: tab,\n\t\t\trouteMatch: new RegExp(/^asset\\/(\\d+)/),\n\t\t});\n\t});\n\n\t/**\n\t * @event module:asset#asset:quickzoom:routed\n\t * @param {number|string} id Asset id\n\t * @fires module:asset#asset:zoom\n\t */\n\tdispatcher.on('asset:quickzoom:routed', function (id) {\n\t\tif (id == Netx.asset.current.id) {\n\t\t\tdispatcher.trigger('asset:quickzoom', Netx.asset.current);\n\t\t} else {\n\t\t\tAssetModel.Load(id).then(\n\t\t\t\tfunction (asset) {\n\t\t\t\t\t// Success\n\t\t\t\t\tdispatcher.trigger('asset:quickzoom', asset);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\t// Error\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t});\n\n\t/**\n\t * @event module:asset#asset:quickzoom\n\t * show em 2000px worth of asset\n\t */\n\tdispatcher.on('asset:quickzoom', function (model) {\n\t\t$('body').addClass('asset-zoom-quickzoom-page');\n\t\t// Show\n\t\tdispatcher.trigger('asset:quickzoom:show', {\n\t\t\tmodel: model,\n\t\t\tid: 'asset-quickzoom',\n\t\t\t// routeMatch: new RegExp(/^asset\\/(\\d+)\\/quickzoom/),\n\t\t\t// isRouted: true,\n\t\t});\n\t});\n\tdispatcher.on(\n\t\t'asset:quickzoom:show',\n\t\tfunction (viewOptions) {\n\t\t\tNetx.app.fsViews.add({\n\t\t\t\tviewClass: AssetQuickzoomView,\n\t\t\t\tshowActions: ['asset:quickzoom:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\tdispatcher.on('asset:quickzoom:close', function () {\n\t\t$('body').removeClass('asset-zoom-quickzoom-page');\n\t});\n\t/**\n\t * @event module:asset#asset:zoom:zoomify:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.off('asset:zoom:zoomify:show');\n\tdispatcher.on(\n\t\t'asset:zoom:zoomify:show',\n\t\tfunction (viewOptions) {\n\t\t\t// hack - AssetZoomifyView closes itself if quickzoom is in the room\n\t\t\tNetx.app.fsViews.pop();\n\n\t\t\tNetx.app.fsViews.add({\n\t\t\t\tviewClass: AssetZoomifyView,\n\t\t\t\tshowActions: ['asset:zoom:zoomify:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t//=================================\n\t//\t!EVENT LISTENERS\n\t//=================================\n}); // asset:extend\n","/**\n * Asset module\n */\n\nimport actions from './actions';\nimport menus from './menus';\nimport controller from './controller';\nimport Permissions from '@netx/core-permissions';\n\n// Call on this function to load everything needed for the module prior to initialization\nfunction loadDependencies() {\n\treturn new Promise((resolve, reject) => {\n\t\tdispatcher.trigger('netx:load:module', Permissions, {\n\t\t\terror: reject,\n\t\t\tinitialized: resolve,\n\t\t});\n\t});\n}\n\n/**\n * @property {object} exports - Our module exports\n * @property {string} exports.namespace - Module namespace\n * @property {function} exports.initialize - Module initializer\n */\nexport default {\n\tnamespace: 'asset',\n\tinitialize() {\n\t\treturn loadDependencies().then(() => {\n\t\t\t// Register actions\n\t\t\tNetx.Actions.Register(actions);\n\t\t\t// Extend menus\n\t\t\tNetx.addMenus(menus);\n\n\t\t\treturn controller.initialize();\n\t\t});\n\t},\n};\n","/**\n * @function\n * @param {module:core/lib/netx-view} view Instance of `netx-view`\n * @return {boolean} Can delete permission\n */\nexport const canDeletePermission = view => {\n\t// do not allow removal of last delete permission\n\treturn (\n\t\tpermissionsEnabled(view) &&\n\t\t(view.model.get('mode') !== 'delete' ||\n\t\t\tview.collection.where({mode: 'delete'}).length > 1)\n\t);\n};\n\n/**\n * @function\n * @param {module:core/lib/netx-view} view Instance of `netx-view`\n * @return {boolean} Permissions enabled\n */\nexport const permissionsEnabled = view => {\n\treturn view.model.permissionsEnabled();\n};\n","import {canDeletePermission, permissionsEnabled} from './enablers';\n\nexport default [\n\t/**\n\t * Delete permission\n\t * @action\n\t */\n\t{\n\t\tevent: 'permissions:permission:delete',\n\t\tlabel: i18n.t('i18n.deletePermission'),\n\t\tenableTest: canDeletePermission,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Edit permission\n\t * @action\n\t */\n\t{\n\t\tevent: 'permissions:edit',\n\t\tlabel: i18n.t('i18n.participants'),\n\t\tenableTest: permissionsEnabled,\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * New permission\n\t * @action\n\t */\n\t{\n\t\tevent: 'permissions:permission:new',\n\t\tlabel: i18n.t('i18n.addPermission'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, view.model];\n\t\t},\n\t},\n\n\t////////////////////////////\n\t// ASSETS\n\t////////////////////////////\n\t/**\n\t * Edit asset permission\n\t * @action\n\t */\n\t{\n\t\tevent: 'permissions:asset:edit',\n\t\tlabel: i18n.t('i18n.edit'),\n\t\tmatrix: 'modify',\n\t\tuserLevel: 8,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Delete asset permission\n\t * @action\n\t */\n\t{\n\t\tevent: 'permissions:asset:delete',\n\t\tlabel: i18n.t('i18n.delete'),\n\t\tmatrix: 'modify',\n\t\tuserLevel: 8,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * Delete selected asset permissions\n\t * @action\n\t */\n\t{\n\t\tevent: 'permissions:asset:delete:selected',\n\t\tlabel: i18n.t('i18n.deletePermissions'),\n\t\tmatrix: 'modify',\n\t\tuserLevel: 8,\n\t\twrapper(view, e) {\n\t\t\treturn view.selected ? [view.selected()] : [[view.model.id]];\n\t\t},\n\t},\n\t/**\n\t * New asset permission\n\t * @action\n\t */\n\t{\n\t\tevent: 'permissions:asset:new',\n\t\tlabel: i18n.t('i18n.newPermission'),\n\t\tmatrix: 'modify',\n\t\tuserLevel: 8,\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, view.model];\n\t\t},\n\t},\n\t////////////////////////////\n\t// !ASSETS\n\t////////////////////////////\n\n\t////////////////////////////\n\t// PARTICIPANTS\n\t////////////////////////////\n\t/** @action */\n\t{\n\t\tevent: 'permissions:participant:delete',\n\t\tlabel: i18n.t('i18n.delete'),\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t// DAM-15650\n\t// There is currently no reason to offer this directly at the moment\n\t// all editing is handled inline and an additional interface offers a simple dropdown\n\t// /** @action */\n\t// {\n\t// \tevent: 'permissions:participant:edit',\n\t// \tlabel: i18n.t('i18n.edit'),\n\t// \twrapper(view) {\n\t// \t\treturn [view.model, view.model.collection];\n\t// \t},\n\t// },\n\t/** @action */\n\t{\n\t\tevent: 'permissions:participants:new',\n\t\tlabel: i18n.t('i18n.new'),\n\t\twrapper(view) {\n\t\t\treturn [view.collection];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'permissions:participants',\n\t\tlabel: i18n.t('i18n.participants'),\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t////////////////////////////\n\t// !PARTICIPANTS\n\t////////////////////////////\n];\n","import actions from '@netx/core-permissions/actions';\n\nimport {extendActions} from '@netx/core/lib/underscore-netx';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {\n\tfaPencilAlt,\n\tfaTrashAlt,\n\tfaUsersCog,\n} from '@fortawesome/pro-solid-svg-icons';\n\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaPencilAlt: icon(faPencilAlt, iconOpts).html,\n\tfaTrashAlt: icon(faTrashAlt, iconOpts).html,\n\tfaUsersCog: icon(faUsersCog, iconOpts).html,\n};\n\nlet newActions = extendActions(actions, [\n\t{\n\t\tevent: 'permissions:edit',\n\t\ticon: icons.faUsersCog,\n\t},\n\t{\n\t\tevent: 'permissions:participant:delete',\n\t\ticon: icons.faTrashAlt,\n\t},\n\t{\n\t\tevent: 'permissions:participant:edit',\n\t\ticon: icons.faPencilAlt,\n\t},\n\t{\n\t\tevent: 'permissions:participants',\n\t\ticon: icons.faPencilAlt,\n\t},\n]);\n\nexport default newActions;\n","import Menu from '@netx/core/lib/netx-menu';\n\nexport default {};\n","/**\n * Create/modify an asset permission record\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetPermissionEditView.html';\n\nimport Form from '@netx/core/functionality/form';\n\nimport Select2 from '@netx/core/functionality/select2';\n\nimport properties from '../properties/assetPermissions';\n\nexport default class AssetPermissionEditView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.eventStr = opts.eventStr || 'permissions:asset:edit';\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'change [name=\"principal\"]': 'principalChanged',\n\t\t\t\t'change [name=\"target\"]': 'targetChanged',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.hideOnSubmit = opts.hideOnSubmit !== false;\n\t\topts.id = opts.id || 'asset-permission-edit';\n\t\topts.removeOnHide = opts.removeOnHide !== false;\n\t\topts.requiresChanges = opts.requiresChanges === true;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * @memberof Netx.Views.AssetPermissionEditView\n\t\t * @alias target\n\t\t * @type {module:asset/models/asset|module:category/models/category}\n\t\t */\n\t\tthis.target = opts.target;\n\n\t\tthis.headerTitle = this.model.isNew()\n\t\t\t? i18n.t('i18n.addPermission')\n\t\t\t: i18n.t('i18n.editPermission');\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'change', this.debouncedRender);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tthis.headerTitle = this.model.isNew()\n\t\t\t? i18n.t('i18n.addPermission')\n\t\t\t: i18n.t('i18n.editPermission');\n\n\t\tif (this.model.isNew() && this.target) {\n\t\t\tthis.requiresChanges = false;\n\t\t}\n\n\t\t// Additonal template vars\n\t\t_.extend(\n\t\t\tthis.templateVars,\n\t\t\t{\n\t\t\t\tenhancedAcls: Netx.getPreference('image.aclEnhanced', true),\n\t\t\t\tprincipalLabel: this.model.principalLabel(),\n\t\t\t\ttargetLabel: this.model.targetLabel(),\n\t\t\t},\n\t\t\t_.pick(\n\t\t\t\tproperties,\n\t\t\t\t'permissionIds',\n\t\t\t\t'permissionTypes',\n\t\t\t\t'principalIds',\n\t\t\t\t'principalTypes',\n\t\t\t\t'targetIds',\n\t\t\t\t'targetTypes',\n\t\t\t\t'typeIds',\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * @override\n\t * @return {object}\n\t */\n\tformValues() {\n\t\tconst principalIds = properties.principalIds;\n\t\tconst targetIds = properties.targetIds;\n\t\tconst values = super.formValues();\n\n\t\t// Set the true principal id\n\t\tswitch (parseInt(values.principal)) {\n\t\t\tcase principalIds.USER:\n\t\t\t\tvalues.principalId = values.principalUserId;\n\t\t\t\tbreak;\n\t\t\tcase principalIds.GROUP:\n\t\t\t\tvalues.principalId = values.principalGroupId;\n\t\t\t\tbreak;\n\t\t}\n\t\t// Set the true target id\n\t\tswitch (parseInt(values.target)) {\n\t\t\tcase targetIds.asset:\n\t\t\t\tvalues.targetId = values.targetAssetId;\n\t\t\t\tbreak;\n\t\t\tcase targetIds.category:\n\t\t\t\tvalues.targetId = values.targetCategoryId;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Remove bogus fields\n\t\treturn _.omit(\n\t\t\tvalues,\n\t\t\t'principalGroupId',\n\t\t\t'principalUserId',\n\t\t\t'targetAssetId',\n\t\t\t'targetCategoryId',\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\tthis.targetChanged();\n\t\tthis.principalChanged();\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Change event\n\t */\n\tprincipalChanged() {\n\t\tconst inputs = this.inputs;\n\t\tconst principalIds = properties.principalIds;\n\t\tconst value = parseInt(inputs.$principal.val());\n\n\t\tthis.hideField(inputs.$principalUserId, inputs.$principalGroupId);\n\n\t\tswitch (value) {\n\t\t\tcase principalIds.GROUP:\n\t\t\t\tthis.showField(inputs.$principalGroupId);\n\t\t\t\tbreak;\n\t\t\tcase principalIds.USER:\n\t\t\t\tthis.showField(inputs.$principalUserId);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Change event\n\t */\n\ttargetChanged(e) {\n\t\tconst inputs = this.inputs;\n\t\tconst targetIds = properties.targetIds;\n\t\tconst value = parseInt(inputs.$target.val());\n\n\t\t// If a target was provided, remove all target options\n\t\tif (this.target) {\n\t\t\tthis.hideField(\n\t\t\t\tinputs.$target,\n\t\t\t\tinputs.$targetAssetId,\n\t\t\t\tinputs.$targetCategoryId,\n\t\t\t);\n\t\t\t// Recursive is only for categories\n\t\t\tif (value != targetIds.category) {\n\t\t\t\tthis.hideField(inputs.$recursive);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.hideField(\n\t\t\tinputs.$recursive,\n\t\t\tinputs.$targetAssetId,\n\t\t\tinputs.$targetCategoryId,\n\t\t);\n\n\t\tswitch (value) {\n\t\t\tcase targetIds.category:\n\t\t\t\tthis.hideField(inputs.$targetAssetId);\n\t\t\t\tthis.showField(inputs.$targetCategoryId, inputs.$recursive);\n\t\t\t\tbreak;\n\t\t\tcase targetIds.asset:\n\t\t\t\tthis.hideField(inputs.$targetCategoryId, inputs.$recursive);\n\t\t\t\tthis.showField(inputs.$targetAssetId);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetPermissionEditView';\n\t}\n}\n\n// Functionality\nForm(AssetPermissionEditView);\nSelect2(AssetPermissionEditView);\n","export default {};\n","export default {};\n","/**\n * Permissions module\n *\n * @module permissions\n */\n\n// Models\nimport AssetModel from '@netx/core-asset/models/asset';\nimport CategoryModel from '@netx/core-category/models/category';\nimport ParticipantModel from './models/participant';\nimport AssetPermissionModel from './models/assetPermission';\nimport PermissionModel from './models/permission';\n\n// Views\nimport AssetPermissionEditView from './views/assetPermissionEditView';\n\nimport customConfig from './config';\nimport {targetIds as permissionTargetIds} from './properties/assetPermissions';\n\nimport routes from './routes';\n\n// MODULE INITIALIZATION\n// =====================\n// All collection and model instances and event listeners\n// are created when the module is initialized.\n\n/**\n * Init handler\n * @event {@link module:permissions#permissions:init|permissions:init}\n * @param {object} options Normally undefined, but a manual init trigger may override properties of Netx.custom.permissions here.\n */\ndispatcher.once('permissions:init', function(options) {\n\tvar NS = (Netx.permissions = {});\n\t// Check for module options\n\tNS.options = options = _.extend({}, customConfig, options);\n\n\tvar fsViews = Netx.app.fsViews,\n\t\tappViews = Netx.app.appViews,\n\t\tmodalViews = Netx.app.modalViews;\n\n\t// PUBLIC MODELS & COLLECTIONS\n\t// ===========================\n\t// Object initializations, etc, go here.\n\n\t// No public models and collections for permissions at this time\n\n\t// BEGIN DISPATCHER EVENT LISTENERS\n\t// ================================\n\t// All other module event listeners are added here, inside the init handler.\n\n\t/**\n\t * @event module:permissions#permissions:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'permissions:edit:show',\n\t\tfunction(viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-permissionsEdit\" */ './views/permissionsEditView'\n\t\t\t).then(View => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['permissions:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:edit\n\t * @param {Netx.Model} resource Resource model (attribute, savedCart etc)\n\t * @fires module:permissions#permissions:edit:show\n\t */\n\tdispatcher.on('permissions:edit', function(resource) {\n\t\tresource &&\n\t\t\tresource.getPermissions().then(function() {\n\t\t\t\tdispatcher.trigger('permissions:edit:show', {\n\t\t\t\t\tmodel: resource,\n\t\t\t\t\tcollection: resource.permissions,\n\t\t\t\t});\n\t\t\t});\n\t});\n\n\t/**\n\t * @event module:permissions#permissions:permission:new\n\t * @param {Netx.Collections.Permissions} permissions Permissions collection\n\t * @param {Netx.Model} resource Resource model (attribute, savedCart etc)\n\t */\n\tdispatcher.on('permissions:permission:new', function(permissions, resource) {\n\t\tpermissions && resource && permissions.addPermission();\n\t});\n\n\t/**\n\t * @event module:permissions#permissions:permission:delete\n\t * @param {object} viewOptions View options\n\t * @fires module:permissions#permissions:permission:delete:confirmed\n\t */\n\tdispatcher.on('permissions:permission:delete', function(permission) {\n\t\tdispatcher.trigger('permissions:permission:delete:confirmed', permission);\n\t});\n\t/**\n\t * @event module:permissions#permissions:permission:delete:confirmed\n\t * @param {object} viewOptions View options\n\t * @fires module:permissions#permissions:permission:delete:error\n\t * @fires module:permissions#permissions:permission:delete:success\n\t */\n\tdispatcher.on('permissions:permission:delete:confirmed', function(\n\t\tpermission,\n\t) {\n\t\tif (permission.isNew()) {\n\t\t\tpermission.collection.remove(permission);\n\t\t\tdispatcher.trigger('permissions:permission:delete:success', permission);\n\t\t} else {\n\t\t\tpermission.destroy({wait: true}).then(\n\t\t\t\tfunction() {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'permissions:permission:delete:success',\n\t\t\t\t\t\tpermission,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tfunction(err) {\n\t\t\t\t\tdispatcher.trigger('permissions:permission:delete:error', err);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t});\n\t/**\n\t * @event module:permissions#permissions:permission:delete:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'permissions:permission:delete:error',\n\t\tfunction(error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:permission:delete:success\n\t * @param {Netx.Models.Permission} permission Permission model\n\t */\n\tdispatcher.on(\n\t\t'permissions:permission:delete:success',\n\t\tfunction(permission) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:permissions#permissions:permission:edit:cancel\n\t * @param {Netx.Models.Permission} permission Permission model\n\t * @fires module:permission#permissions:permission:edit:cancel:confirmed\n\t */\n\tdispatcher.on('permissions:permission:edit:cancel', function(permission) {\n\t\tdispatcher.trigger(\n\t\t\t'permissions:permission:edit:cancel:confirmed',\n\t\t\tpermission,\n\t\t);\n\t});\n\t/**\n\t * @event module:permissions#permissions:permission:edit:cancel:confirmed\n\t * @param {Netx.Models.Permission} permission Permission model\n\t */\n\tdispatcher.on('permissions:permission:edit:cancel:confirmed', function(\n\t\tpermission,\n\t) {\n\t\tif (!permission || !permission.isNew()) return;\n\n\t\tpermission.collection && permission.collection.remove(permission);\n\t});\n\n\t////////////////////////////////////\n\t// Asset permission\n\t////////////////////////////////////\n\t/**\n\t * @event module:permissions#ermissions:asset:delete\n\t * @param {module:permission/models/assetPermission} permission Asset permission\n\t * @fires module:app#app:confirm:delete\n\t */\n\tdispatcher.on('permissions:asset:delete', function(permission, e) {\n\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\tmessage: i18n.t('i18n.confirmDeletePermissionRecord'),\n\t\t\teventStr: 'permissions:asset:delete',\n\t\t\targs: [permission],\n\t\t});\n\t});\n\t/**\n\t * @event module:permissions#permissions:asset:delete:confirmed\n\t * @param {module:permissions/models/assetPermission} permission Asset permission\n\t * @fires module:permissions#permissions:asset:delete:error\n\t * @fires module:permissions#permissions:asset:delete:success\n\t */\n\tdispatcher.on('permissions:asset:delete:confirmed', function(permission) {\n\t\tpermission.destroy({wait: true}).then(\n\t\t\tfunction() {\n\t\t\t\tdispatcher.trigger('permissions:asset:delete:success', permission);\n\t\t\t},\n\t\t\tfunction(err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('permissions:asset:delete:success', err, permission);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:permissions#permissions:asset:delete:error\n\t * @param {string} error Error string\n\t * @param {module:permissions/models/assetPermission} permission Asset permission\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'permissions:asset:delete:error',\n\t\tfunction(error, permission) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:asset:delete:success\n\t * @param {module:permissions/models/assetPermission} permission Asset permission\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'permissions:asset:delete:success',\n\t\tfunction(permission) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [permission.get('targetId')],\n\t\t\t\ttitle: i18n.t('i18n.permissionsUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.permissionDeleted'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:permissions#permissions:asset:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'permissions:asset:edit:show',\n\t\tfunction(viewOptions) {\n\t\t\tmodalViews.add({\n\t\t\t\tviewClass: AssetPermissionEditView,\n\t\t\t\tshowActions: ['permissions:asset:edit:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:asset:edit\n\t * @param {module:permissions/models/assetPermission|number} permission Asset permission or id\n\t * @fires module:permissions#permissions:asset:edit:show\n\t * @see module:permissions#permissions:asset:edit:confirmed\n\t * @todo I am so ugly\n\t */\n\tdispatcher.on('permissions:asset:edit', function(permission) {\n\t\tvar promise;\n\n\t\tif (_.isNumber(permission)) {\n\t\t\tpermission = new PermissionModel({entryId: parseInt(permission)});\n\t\t\tpromise = permission.fetch();\n\t\t}\n\n\t\t$.when(promise || true).then(function() {\n\t\t\t// Try and get a target if enough information is available\n\t\t\tvar target = parseInt(permission.get('target')),\n\t\t\t\ttargetId = parseInt(permission.get('targetId'));\n\n\t\t\tif (targetId) {\n\t\t\t\tvar permissionTarget;\n\t\t\t\tswitch (target) {\n\t\t\t\t\tcase permissionTargetIds.asset:\n\t\t\t\t\t\tpermissionTarget = new AssetModel({assetId: targetId});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase permissionTargetIds.category:\n\t\t\t\t\t\tpermissionTarget = new CategoryModel({categoryid: targetId});\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpromise = permissionTarget.fetch();\n\t\t\t}\n\n\t\t\t$.when(promise || true).then(function() {\n\t\t\t\tdispatcher.trigger('permissions:asset:edit:show', {\n\t\t\t\t\tmodel: permission,\n\t\t\t\t\ttarget: permissionTarget,\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\t/**\n\t * @event module:permissions#permissions:asset:edit:confirmed\n\t * @param {object} values Asset permission data\n\t * @param {module:permissions/models/assetPermission} permission Asset permission\n\t * @fires module:permissions#permissions:asset:edit:error\n\t * @fires module:permissions#permissions:asset:edit:success\n\t */\n\tdispatcher.on('permissions:asset:edit:confirmed', function(\n\t\tvalues,\n\t\tpermission,\n\t) {\n\t\tvar isNew = permission.isNew();\n\t\t// Set and save\n\t\tpermission.parseAndSave(values).then(\n\t\t\tfunction() {\n\t\t\t\tpermission.fetch();\n\t\t\t\tdispatcher.trigger('permissions:asset:edit:success', permission, isNew);\n\t\t\t},\n\t\t\tfunction(err) {\n\t\t\t\tdispatcher.trigger('permissions:asset:edit:error', err, permission);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:permissions#permissions:asset:edit:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'permissions:asset:edit:error',\n\t\tfunction(error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:asset:edit:success\n\t * @param {module:permissions/models/assetPermission} permission Asset permission\n\t * @param {boolean} isNew New permission\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'permissions:asset:edit:success',\n\t\tfunction(permission, isNew) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'asset',\n\t\t\t\tids: [permission.get('targetId')],\n\t\t\t\ttitle: i18n.t('i18n.permissionUpdated'),\n\t\t\t\ttype: 'success',\n\t\t\t\tdescription: isNew\n\t\t\t\t\t? i18n.t('i18n.permissionCreatedSuccessfully')\n\t\t\t\t\t: i18n.t('i18n.permissionUpdatedSuccessfully'),\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:asset:new\n\t * @param {module:permissions/collections/assetPermissions} permissions Asset permissions\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:permissions#permissions:asset:edit\n\t */\n\tdispatcher.on('permissions:asset:new', function(permissions, asset) {\n\t\tdispatcher.trigger(\n\t\t\t'permissions:asset:edit',\n\t\t\tnew AssetPermissionModel({\n\t\t\t\ttarget: permissionTargetIds.asset,\n\t\t\t\ttargetId: asset && asset.id,\n\t\t\t\ttargetLabel: asset && asset.get('name'),\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * @event module:permissions#permissions:asset:reorder\n\t * @param {module:permissions/collections/assetPermissions} permissions Permissions\n\t * @param {module:permissions/models/assetPermission} permission Permission to reposition\n\t * @param {number} position Position\n\t * @fires module:permissions#permissions:asset:reorder:error\n\t * @fires module:permissions#permissions:asset:reorder:success\n\t */\n\tdispatcher.on('permissions:asset:reorder', function(\n\t\tpermissions,\n\t\tpermission,\n\t\tposition,\n\t) {\n\t\tpermissions.setPosition(permission, position).then(\n\t\t\tfunction() {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:asset:reorder:success',\n\t\t\t\t\tpermissions,\n\t\t\t\t\tpermission,\n\t\t\t\t\tposition,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction(error) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:asset:reorder:error',\n\t\t\t\t\terror,\n\t\t\t\t\tpermissions,\n\t\t\t\t\tpermission,\n\t\t\t\t\tposition,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:permissions#permissions:asset:reorder:error\n\t * @param {string} error Error\n\t * @param {module:permissions/collections/assetPermissions} permissions Permissions\n\t * @param {module:permissions/models/assetPermission} permission Permission to reposition\n\t * @param {number} position Position\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'permissions:asset:reorder:error',\n\t\tfunction(error, permissions, permission, position) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t////////////////////////////////////\n\t// !Asset permission\n\t////////////////////////////////////\n\n\t////////////////////////////////////\n\t// Participants\n\t////////////////////////////////////\n\t/**\n\t * @event module:permissions#permissions:participant:delete\n\t * @param {module:permissions/models/participant} participant Participant\n\t * @fires module:permissions#permissions:participant:delete:confirmed\n\t */\n\tdispatcher.on('permissions:participant:delete', function(participant) {\n\t\t// DAM-13666 - auto confirm\n\t\t// dispatcher.trigger('app:confirm:delete', {\n\t\t// \tmessage : i18n.t('i18n.confirmParticipantDelete'),\n\t\t// \teventStr : 'permissions:participant:delete',\n\t\t// \targs : [ participant ]\n\t\t// } );\n\t\tdispatcher.trigger('permissions:participant:delete:confirmed', participant);\n\t});\n\t/**\n\t * @event module:permissions#permissions:participant:delete:confirmed\n\t * @param {module:permissions/models/participant} participant Participant\n\t * @fires module:permissions#permissions:participant:delete:error\n\t * @fires module:permissions#permissions:participant:delete:success\n\t */\n\tdispatcher.on('permissions:participant:delete:confirmed', function(\n\t\tparticipant,\n\t) {\n\t\tparticipant.destroy({wait: true}).then(\n\t\t\tfunction() {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:participant:delete:success',\n\t\t\t\t\tparticipant,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction(err) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:participant:delete:error',\n\t\t\t\t\terr,\n\t\t\t\t\tparticipant,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:permissions#permissions:participant:delete:error\n\t * @param {string} error Error\n\t * @param {module:permissions/models/participant} participant Participant\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'permissions:participant:delete:error',\n\t\tfunction(error, participant) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:participant:delete:success\n\t * @param {module:permissions/models/participant} participant Participant\n\t */\n\tdispatcher.on(\n\t\t'permissions:participant:delete:success',\n\t\tfunction(participant) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:permissions#permissions:participant:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'permissions:participant:edit:show',\n\t\tfunction(viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-participantEdit\" */ './views/participantEditView'\n\t\t\t).then(View => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['permissions:participant:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:participant:edit\n\t * @param {module:permissions/models/participant} participant Participant\n\t * @param {module:permissions/collections/participants} participants Participants\n\t * @fires module:permissions#permissions:participant:edit:show\n\t */\n\tdispatcher.on('permissions:participant:edit', function(\n\t\tparticipant,\n\t\tparticipants,\n\t) {\n\t\tdispatcher.trigger('permissions:participant:edit:show', {\n\t\t\tmodel: participant,\n\t\t\tcollection: participants,\n\t\t});\n\t});\n\t/**\n\t * @event module:permissions#permissions:participant:edit:confirmed\n\t * @param {object} data Participant data\n\t * @param {module:permissions/models/participant} participant Participant\n\t * @fires module:permissions#permissions:participant:edit:error\n\t * @fires module:permissions#permissions:participant:edit:success\n\t */\n\tdispatcher.on('permissions:participant:edit:confirmed', function(\n\t\tdata,\n\t\tparticipant,\n\t) {\n\t\tvar isNew = participant.isNew();\n\n\t\tparticipant.parseAndSave(data).then(\n\t\t\tfunction() {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:participant:edit:success',\n\t\t\t\t\tparticipant,\n\t\t\t\t\tisNew,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction(err) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:participant:edit:error',\n\t\t\t\t\terr,\n\t\t\t\t\tparticipant,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:permissions#permissions:participant:edit:error\n\t * @param {string} error Error\n\t * @param {module:permissions/models/participant} participant Participant\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'permissions:participant:edit:error',\n\t\tfunction(error, participant) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:participant:edit:success\n\t * @param {module:permissions/models/participant} participant Participant\n\t * @param {boolean} isNew Is new\n\t */\n\tdispatcher.on(\n\t\t'permissions:participant:edit:success',\n\t\tfunction(participant, isNew) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:permissions#permissions:participant:add\n\t * @param {module:permissions/collections/participants} participants Participants\n\t * @param {object} data Participant data\n\t * @fires module:permissions#permissions:participant:add:error\n\t * @fires module:permissions#permissions:participant:add:success\n\t * @fires module:permissions#permissions:participant:edit:confirmed\n\t */\n\tdispatcher.on('permissions:participant:add', function(participants, data) {\n\t\tvar participant = participants.getParticipant(data.type, data.id);\n\t\tif (participant) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'permissions:participant:edit:confirmed',\n\t\t\t\tdata,\n\t\t\t\tparticipant,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tparticipants.addParticipant(data).then(\n\t\t\tfunction(participant) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:participant:add:success',\n\t\t\t\t\tparticipants,\n\t\t\t\t\tparticipant,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction(err) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:participant:add:error',\n\t\t\t\t\terr,\n\t\t\t\t\tparticipants,\n\t\t\t\t\tdata,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:permissions#permissions:participant:add:error\n\t * @param {string} error Error\n\t * @param {module:permissions/collections/participants} participants Participants\n\t * @param {object} data Participant data\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'permissions:participant:add:error',\n\t\tfunction(error, participants, data) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:participant:add:error\n\t * @param {module:permissions/collections/participants} participants Participants\n\t * @param {module:permissions/models/participant} participant Participant\n\t */\n\tdispatcher.on(\n\t\t'permissions:participant:add:error',\n\t\tfunction(error, participants, participant) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:participants:toggle\n\t * @param {module:permissions/collections/participants} participants Participants\n\t * @param {object} data Participant data\n\t */\n\tdispatcher.on('permissions:participants:toggle', function(\n\t\tparticipants,\n\t\tdata,\n\t) {\n\t\tvar participant = participants.getParticipant(data.type, data.id);\n\t\tparticipant\n\t\t\t? dispatcher.trigger('permissions:participant:delete', participant)\n\t\t\t: dispatcher.trigger('permissions:participant:add', participants, data);\n\t});\n\n\t/**\n\t * @event module:permissions#permissions:participants:\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'permissions:participants:show',\n\t\tfunction(viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-participants\" */ './views/participantsView'\n\t\t\t).then(View => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['permissions:participants:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:permissions#permissions:participants\n\t * @param {module:share/models/sharedResource} sharedResource Shared resource\n\t * @fires module:permissions#permissions:participants:show\n\t */\n\tdispatcher.on('permissions:participants', function(sharedResource) {\n\t\tsharedResource.getParticipants().then(\n\t\t\tfunction() {},\n\t\t\tfunction(err) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:participants:error',\n\t\t\t\t\terr,\n\t\t\t\t\tsharedResource,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t\tdispatcher.trigger('permissions:participants:show', {\n\t\t\tcollection: sharedResource.participants,\n\t\t\tmodel: sharedResource,\n\t\t});\n\t});\n\t/**\n\t * @event module:permissions#permissions:participants:error\n\t * @param {string} error Error\n\t * @param {module:share/models/sharedResource} sharedResource Shared resource\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('permissions:participants:error', function(\n\t\terror,\n\t\tsharedResource,\n\t) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\n\t/**\n\t * @event module:permissions#permissions:participants:finished\n\t * @param {module:permissions/collections/participants} participants Participants\n\t * @param {module:share/models/sharedResource} sharedResource Shared resource\n\t * @param {object} data Data\n\t */\n\tdispatcher.on('permissions:participants:finished', function(\n\t\tparticipants,\n\t\tsharedResource,\n\t\tdata,\n\t) {\n\t\tdata = data || {};\n\t\tif (data.sendMessage) {\n\t\t\tsharedResource.sendMessage(data.message, data.userSelector);\n\t\t}\n\n\t\tif (_.isFunction(participants.save)) {\n\t\t\tparticipants.save();\n\t\t}\n\t});\n\t////////////////////////////////////\n\t// !Participants\n\t////////////////////////////////////\n\n\t// END DISPATCHER EVENT LISTENERS\n\n\t// LAST STEPS:\n\t// non-core extensions may listen on this event to hook into the init process:\n\tdispatcher.trigger('permissions:extend', NS);\n\t// Tell the module loader we're initialized.\n\tdispatcher.trigger('permissions:initialized', NS);\n});\n\nexport default {\n\tinitialize(opts) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdispatcher.once('permissions:initialized', () => {\n\t\t\t\tresolve(routes);\n\t\t\t});\n\t\t\tdispatcher.trigger('permissions:init');\n\t\t});\n\t},\n};\n","/**\n * Permissions module\n */\n\nimport actions from './actions';\nimport menus from './menus';\nimport controller from './controller';\n\n/**\n * @property {object} exports - Our module exports\n * @property {string} exports.namespace - Module namespace\n * @property {function} exports.initialize - Module initializer\n */\nexport default {\n\tnamespace: 'permissions',\n\tinitialize() {\n\t\t// Register actions\n\t\tNetx.Actions.Register(actions);\n\t\t// Extend menus\n\t\tNetx.addMenus(menus);\n\n\t\treturn controller.initialize();\n\t},\n};\n","export const ACTIONS = {\n\tSET_SELECTED_SET_ID: 'SET_SELECTED_SET_ID' as const,\n\tSET_SELECTED_ATTRIBUTE_IDS: 'SET_SELECTED_ATTRIBUTE_IDS' as const,\n\tSET_LOADING: 'SET_LOADING' as const,\n} as const;\n\nexport const CUSTOM_SET = 'custom' as const;\n","import {ACTIONS, CUSTOM_SET} from './constants';\n\nexport type Action =\n\t| {type: typeof ACTIONS.SET_LOADING; loading: boolean}\n\t| {type: typeof ACTIONS.SET_SELECTED_ATTRIBUTE_IDS; attributeIds: number[]}\n\t| {type: typeof ACTIONS.SET_SELECTED_SET_ID; setId: string};\n\nexport interface State {\n\tloading: boolean;\n\tselectedAttributeIds: number[];\n\tselectedSetId: string;\n\tshowInput: boolean;\n\tuncontrolled: boolean;\n}\n\nexport const initialState: State = {\n\tloading: false,\n\tselectedAttributeIds: [],\n\tselectedSetId: '',\n\tshowInput: true,\n\tuncontrolled: true,\n};\n\nexport const reducer: React.Reducer<State, Action> = (\n\tstate = initialState,\n\taction,\n) => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.SET_LOADING:\n\t\t\treturn {...state, loading: action.loading};\n\n\t\tcase ACTIONS.SET_SELECTED_ATTRIBUTE_IDS:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tselectedAttributeIds: action.attributeIds,\n\t\t\t};\n\n\t\tcase ACTIONS.SET_SELECTED_SET_ID: {\n\t\t\tconst uncontrolled = action.setId === '' || action.setId === CUSTOM_SET;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tselectedSetId: action.setId,\n\t\t\t\tshowInput: uncontrolled,\n\t\t\t\tuncontrolled,\n\t\t\t};\n\t\t}\n\t}\n\treturn state;\n};\n","import React, {useMemo} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\nimport type {Optional} from '@netx/core/typings';\n\nimport SelectField, {\n\tSelectFieldProps,\n} from '@netx/core-components/Form/SelectField';\n\nimport {AttributeAttributes} from '@netx/core-asset/models/attribute';\nimport {getAttributeLabelFromId} from '@netx/core-asset/components/Attributes/Attribute/utils';\n\ntype Option = {\n\tvalue: any;\n\tid: number;\n};\nexport type AttributeDropdownProps = Omit<\n\tOptional<\n\t\tSelectFieldProps<Option, false, true, false>,\n\t\t'labelKey' | 'options'\n\t>,\n\t'name'\n> & {\n\tattributes: AttributeAttributes[];\n\tname?: string;\n\tselected?: number[];\n};\n\nconst AttributeDropdown = React.forwardRef<\n\tHTMLInputElement,\n\tAttributeDropdownProps\n>(({attributes, selected, ...props}, ref) => {\n\tconst options = useMemo(() => {\n\t\treturn attributes\n\t\t\t.filter(({attributeid}) => !(selected || []).includes(attributeid))\n\t\t\t.map(({attributeid}) => ({\n\t\t\t\tvalue: getAttributeLabelFromId(attributeid),\n\t\t\t\tid: attributeid,\n\t\t\t}));\n\t}, [attributes, selected]);\n\n\treturn (\n\t\t<SelectField<Option, false, true, false>\n\t\t\tname=\"attribute-select\"\n\t\t\t{...props}\n\t\t\tinputProps={{\n\t\t\t\t'aria-label': 'attribute select field',\n\t\t\t\tplaceholder: i18n.t('i18n.pleaseSelect'),\n\t\t\t\t...props.inputProps,\n\t\t\t}}\n\t\t\tlabelKey=\"value\"\n\t\t\toptions={options}\n\t\t\tAutocompleteProps={{\n\t\t\t\topenOnFocus: false,\n\t\t\t\tdisableClearable: true,\n\t\t\t\tisOptionEqualToValue: (option, value) => option.id === value.id,\n\t\t\t\t...props.AutocompleteProps,\n\t\t\t}}\n\t\t\tInputProps={{\n\t\t\t\t...props.InputProps,\n\t\t\t\tinputRef: ref,\n\t\t\t}}\n\t\t/>\n\t);\n});\n\nexport default AttributeDropdown;\n","import React, {useCallback, useMemo} from 'react';\n\nimport {compareProps} from '@netx/core-components/util';\nimport {\n\tItemManagerSortableItem,\n\tItemManagerSortableItemProps,\n} from '@netx/core-components/ItemManager';\n\nimport {AttributeDropdown} from '..';\n\nimport {AttributeAttributes} from '@netx/core-asset/models/attribute';\nimport {getAttributeLabelFromId} from '@netx/core-asset/components/Attributes/Attribute/utils';\n\nexport interface ItemProps extends ItemManagerSortableItemProps {\n\tattributes: AttributeAttributes[];\n\tonChange?: (value: any) => void;\n\tselectFirstAvailableAttribute?: boolean;\n\tselectedAttributeIds: number[];\n}\n\nconst Item: React.FC<ItemProps> = React.memo(\n\t({\n\t\tattributes,\n\t\tonChange,\n\t\tselectFirstAvailableAttribute,\n\t\tselectedAttributeIds,\n\t\t...props\n\t}) => {\n\t\tconst options = useMemo(() => {\n\t\t\treturn attributes\n\t\t\t\t.filter(({attributeid}) => !selectedAttributeIds.includes(attributeid))\n\t\t\t\t.map(({attributeid}) => ({\n\t\t\t\t\tvalue: getAttributeLabelFromId(attributeid),\n\t\t\t\t\tid: attributeid,\n\t\t\t\t}));\n\t\t}, [attributes, selectedAttributeIds]);\n\n\t\tconst handleChange = useCallback((value) => onChange && onChange(value), [\n\t\t\tonChange,\n\t\t]);\n\n\t\treturn (\n\t\t\t<ItemManagerSortableItem dense {...props}>\n\t\t\t\t{({values, errors, form, id}) => {\n\t\t\t\t\tid = id.toString();\n\t\t\t\t\tconst affix = `[${id}]`;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<AttributeDropdown\n\t\t\t\t\t\t\tattributes={attributes}\n\t\t\t\t\t\t\tform={form}\n\t\t\t\t\t\t\terror={errors.attribute}\n\t\t\t\t\t\t\tname={`attribute${affix}`}\n\t\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\t\tselected={selectedAttributeIds}\n\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\tvalues.attribute ||\n\t\t\t\t\t\t\t\t(selectFirstAvailableAttribute && options[0]) ||\n\t\t\t\t\t\t\t\tvalues.attribute\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\t\t\topenOnFocus: false,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t</ItemManagerSortableItem>\n\t\t);\n\t},\n\tcompareProps(),\n);\n\nexport default Item;\n","import React, {\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseReducer,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport equal from 'fast-deep-equal';\n\nimport {i18n} from '@netx/core/i18n';\nimport {reducer, initialState} from '../../store';\nimport {ACTIONS, CUSTOM_SET} from '../../constants';\nimport {AttributeDropdown, Item} from '..';\n\nimport {getAttributeLabelFromId} from '@netx/core-asset/components/Attributes/Attribute/utils';\nimport {isSystemAttribute} from '@netx/core-attribute/utils';\nimport {AttributeAttributes} from '@netx/core-asset/models/attribute';\nimport {useAttributeSetSelectionProvider} from '@netx/core-attribute-set-selection/context';\nimport SetSelector from '@netx/core-attribute-set-selection/components/SetSelector';\n\nimport {\n\tuseMemoCompare,\n\tuseUpdateEffect,\n\tuseWhenChangedEffect,\n} from '@netx/core-components/hooks';\nimport {\n\tuseItemManagerActions,\n\tuseItemManagerStore,\n\tItemManager,\n} from '@netx/core-components/ItemManager';\nimport ActionButton from '@netx/core-components/ActionButton';\nimport CountChip from '@netx/core-components/CountChip';\nimport Fallback from '@netx/core-components/Drawer/Fallback';\nimport type {FormValues} from '@netx/core-components/Form';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\nimport {\n\tfaList as ListIcon,\n\tfaPlus as PlusIcon,\n} from '@fortawesome/pro-solid-svg-icons';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\talignItems: 'baseline',\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t\tminHeight: 0,\n\t\t\tpadding: theme.spacing(1, 0),\n\t\t\twidth: '100%',\n\t\t},\n\t\theader: {\n\t\t\talignItems: 'center',\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '0 0 auto',\n\t\t\tjustifyContent: 'space-between',\n\t\t\tminHeight: 48,\n\t\t\tpadding: theme.spacing(0.75, 2, 0, 2),\n\t\t\twidth: '100%',\n\t\t\t'& $chip': {\n\t\t\t\tflex: '0 0 auto',\n\t\t\t\tmarginLeft: theme.spacing(2),\n\t\t\t},\n\t\t\t[theme.breakpoints.down('xs')]: {\n\t\t\t\tflexDirection: 'column',\n\t\t\t\t'& $addButton, & $chip': {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t},\n\t\t\t\t'& $addButton': {\n\t\t\t\t\tminHeight: 40,\n\t\t\t\t},\n\t\t\t\t'& $chip': {\n\t\t\t\t\tmarginLeft: 0,\n\t\t\t\t\tmarginTop: theme.spacing(2),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\taddButton: {},\n\t\tchip: {},\n\t\tselectorWrapper: {\n\t\t\twidth: '100%',\n\t\t\tpadding: theme.spacing(1, 0),\n\t\t},\n\t});\n\nconst getAttributeFormValuesFromIds = (\n\tattributeIds: number[],\n\tattributes: AttributeAttributes[],\n) => {\n\tconst formValues: FormValues[] = [];\n\tattributeIds.forEach((id) => {\n\t\tconst attr = attributes.find(({attributeid}) => attributeid === id);\n\t\tif (!attr) return;\n\t\tformValues.push({\n\t\t\tattribute: {\n\t\t\t\tvalue: getAttributeLabelFromId(id),\n\t\t\t\tid,\n\t\t\t},\n\t\t});\n\t});\n\treturn formValues;\n};\n\nexport interface SelectorProps {\n\tattributes: AttributeAttributes[];\n\thideSystemAttributes?: boolean;\n\tmax?: number;\n\tonChange?: (selected: number[]) => void;\n\tscrollNewItemsIntoView?: boolean;\n\tselected?: number[];\n\twithSetSelection?: boolean;\n}\n\nconst Selector: React.FC<WithStyles<typeof styles> & SelectorProps> = ({\n\tclasses,\n\tattributes,\n\thideSystemAttributes,\n\tmax = Infinity,\n\tonChange,\n\tscrollNewItemsIntoView,\n\tselected,\n\twithSetSelection,\n}) => {\n\tconst [state, dispatch] = useReducer(reducer, {\n\t\t...initialState,\n\t\tloading: true,\n\t\tselectedAttributeIds: selected || ([] as number[]),\n\t\tshowInput: !withSetSelection,\n\t});\n\n\tconst itemManagerActions = useItemManagerActions();\n\tconst itemManagerStore = useItemManagerStore();\n\tconst attributeSetSelectionProvider = useAttributeSetSelectionProvider();\n\n\tconst [inputValue, setInputValue] = useState('');\n\n\tconst dropdownRef = useRef<HTMLInputElement>(null);\n\tconst isLoading =\n\t\tstate.loading || !!attributeSetSelectionProvider.state.loading.length;\n\n\t// Enforce a loading a state at mount to avoid the component from looking\n\t// frozen/out of state when mounting with larger selection\n\tuseEffect(() => {\n\t\tsetTimeout(() => dispatch({type: ACTIONS.SET_LOADING, loading: false}), 50);\n\t}, []);\n\n\tuseUpdateEffect(() => {\n\t\tif (!state.uncontrolled) return;\n\t\tattributeSetSelectionProvider.actions.setSelected([CUSTOM_SET]);\n\t}, [state.uncontrolled]);\n\n\tconst withSetSelectionRef = useRef(withSetSelection);\n\twithSetSelectionRef.current = withSetSelection;\n\tuseEffect(() => {\n\t\tif (!withSetSelectionRef.current) return;\n\t\tdispatch({\n\t\t\ttype: ACTIONS.SET_SELECTED_SET_ID,\n\t\t\tsetId: attributeSetSelectionProvider.state.selected[0],\n\t\t});\n\t}, [attributeSetSelectionProvider.state.selected]);\n\n\tconst triggerDefaultSet = useCallback(\n\t\t() => dispatch({type: ACTIONS.SET_SELECTED_SET_ID, setId: CUSTOM_SET}),\n\t\t[],\n\t);\n\n\tconst triggerFocus = useCallback(() => {\n\t\t// Defer so it can focus on re-render\n\t\tsetTimeout(() => {\n\t\t\tdropdownRef.current?.focus();\n\t\t}, 0);\n\t}, []);\n\n\t// Need to keep track of items so that other items can filter out already\n\t// selected attributes\n\tconst items = useMemo(() => {\n\t\treturn itemManagerStore.getItems();\n\t}, [\n\t\tuseMemoCompare(itemManagerStore.state.items, equal),\n\t\tuseMemoCompare(itemManagerStore.form.values, equal),\n\t]);\n\n\t// When passed in `max` or the `attributes` length changes, set our max items\n\tuseWhenChangedEffect(\n\t\t[max, attributes.length],\n\t\tuseCallback(([max, attributesLength]) => {\n\t\t\titemManagerActions.setMaxItems(Math.min(max, attributesLength));\n\t\t}, []),\n\t\t{executeAtMount: true},\n\t);\n\n\t// When passed in `selected` attribute ids change, reflect this in our items\n\tuseWhenChangedEffect(\n\t\tselected,\n\t\tuseCallback(\n\t\t\t(selected) => {\n\t\t\t\titemManagerStore.resetItems(\n\t\t\t\t\tgetAttributeFormValuesFromIds(selected || [], attributes),\n\t\t\t\t);\n\t\t\t},\n\t\t\t[itemManagerStore.resetItems, attributes],\n\t\t),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\t// When max items changes, reflect this in our items\n\t// We only run this logic when an uncontrolled state is in play as we want to fill items\n\t// to their max if a selected set can do so\n\t// Example: the passed in `max` changes from 3 to 5 - pupoluate those remaining two\n\t// possible items with the next items in the set\n\t// Example: the passed in `max` changes from 5 to 3 - populate with only the first\n\t// 3 attributes in that set\n\tuseWhenChangedEffect(\n\t\titemManagerStore.state.maxItems,\n\t\tuseCallback(\n\t\t\t(maxItems) => {\n\t\t\t\tif (state.uncontrolled) return;\n\t\t\t\tconst unique = new Set(\n\t\t\t\t\tstate.selectedAttributeIds.concat(\n\t\t\t\t\t\tattributeSetSelectionProvider.state.attributeTemplateIds,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\titemManagerStore.resetItems(\n\t\t\t\t\tgetAttributeFormValuesFromIds(\n\t\t\t\t\t\t[...unique].slice(0, maxItems),\n\t\t\t\t\t\tattributes,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t\t[\n\t\t\t\titemManagerStore.resetItems,\n\t\t\t\tattributeSetSelectionProvider.state.attributeTemplateIds,\n\t\t\t\tstate.selectedAttributeIds,\n\t\t\t\tstate.uncontrolled,\n\t\t\t\tattributes,\n\t\t\t],\n\t\t),\n\t);\n\n\t// When attributes from the set are changed, re-populate from currently set attribute ids\n\tuseWhenChangedEffect(\n\t\tattributeSetSelectionProvider.state.attributeTemplateIds,\n\t\tuseCallback(\n\t\t\t(attributeTemplateIds) => {\n\t\t\t\tif (state.uncontrolled) return;\n\t\t\t\titemManagerStore.resetItems(\n\t\t\t\t\tgetAttributeFormValuesFromIds(attributeTemplateIds, attributes),\n\t\t\t\t);\n\t\t\t},\n\t\t\t[itemManagerStore.resetItems, state.uncontrolled, attributes],\n\t\t),\n\t);\n\n\t// When attributes from the outside are changed, re-populate from currently selected ids\n\tuseWhenChangedEffect(\n\t\tattributes,\n\t\tuseCallback(\n\t\t\t(attributes) => {\n\t\t\t\titemManagerStore.resetItems(\n\t\t\t\t\tgetAttributeFormValuesFromIds(state.selectedAttributeIds, attributes),\n\t\t\t\t);\n\t\t\t},\n\t\t\t[itemManagerStore.resetItems, state.selectedAttributeIds],\n\t\t),\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\t// After mounted we want to listen to `items` change and reflect the attribute\n\t// ids selected (including their order)\n\tuseUpdateEffect(() => {\n\t\tdispatch({\n\t\t\ttype: ACTIONS.SET_SELECTED_ATTRIBUTE_IDS,\n\t\t\tattributeIds: items\n\t\t\t\t.map(({attribute}) => attribute.id)\n\t\t\t\t.filter(\n\t\t\t\t\t(id) =>\n\t\t\t\t\t\tid != null && (!hideSystemAttributes || !isSystemAttribute(id)),\n\t\t\t\t),\n\t\t});\n\t}, [useMemoCompare(items, equal), hideSystemAttributes]);\n\n\t// When attribute ids selected changes, let the curious know\n\tuseWhenChangedEffect(\n\t\tstate.selectedAttributeIds,\n\t\tuseCallback(\n\t\t\t(selectedAttributeIds) => {\n\t\t\t\tif (!onChange) return;\n\t\t\t\tonChange(\n\t\t\t\t\tselectedAttributeIds.filter(\n\t\t\t\t\t\t(id) =>\n\t\t\t\t\t\t\tid != null && (!hideSystemAttributes || !isSystemAttribute(id)),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t\t[onChange, hideSystemAttributes],\n\t\t),\n\t);\n\n\t// When we click the add button we want to just switch over to the custom set\n\t// which will present the user with an attribute dropdown (in place of the add\n\t// button)\n\tconst handleAddClick = useCallback(() => {\n\t\ttriggerDefaultSet();\n\t\ttriggerFocus();\n\t}, [triggerFocus, triggerDefaultSet]);\n\n\t// When we change the selection of the main attribute dropdown, ensure we are\n\t// now a custom set, reset the main attribute dropdown input, and add the\n\t// attribute to our items\n\tconst handleAttributeSelectChange = useCallback(\n\t\t(value) => {\n\t\t\ttriggerDefaultSet();\n\t\t\tsetInputValue('');\n\t\t\titemManagerStore.addItem({attribute: value});\n\t\t\ttriggerFocus();\n\t\t},\n\t\t[itemManagerStore.addItem, triggerDefaultSet, triggerFocus],\n\t);\n\n\t// When we click to clear, ensure we are now a custom set, and reset the items\n\tconst handleClear = useCallback(() => {\n\t\ttriggerDefaultSet();\n\t\titemManagerActions.reset();\n\t}, [itemManagerActions.reset, triggerDefaultSet]);\n\n\t// Keep track of the main attribute dropdown value since we will be resetting it\n\t// when an attribute is selected\n\tconst handleInputChange = useCallback(\n\t\t(event, value: string) => setInputValue(value),\n\t\t[],\n\t);\n\n\t// Track selected set\n\t// const handleSetChange = useCallback(\n\t// \t([selected]) =>\n\t// \t\tdispatch({type: ACTIONS.SET_SELECTED_SET_ID, setId: selected}),\n\t// \t[],\n\t// );\n\n\t// We do not want to respond to all changes in the contexts we are utilizing\n\tconst Header = useMemo(() => {\n\t\tconst {hasMaxItems} = itemManagerStore.state;\n\t\tconst {selectedAttributeIds} = state;\n\t\treturn (\n\t\t\t<div className={`${classes.header} selector-header`}>\n\t\t\t\t{!hasMaxItems && state.showInput ? (\n\t\t\t\t\t<AttributeDropdown\n\t\t\t\t\t\tattributes={attributes.filter(\n\t\t\t\t\t\t\t(attr) =>\n\t\t\t\t\t\t\t\t!hideSystemAttributes || !isSystemAttribute(attr.attributeid),\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tlabel={i18n.t('i18n.addAttribute')}\n\t\t\t\t\t\tonChange={handleAttributeSelectChange}\n\t\t\t\t\t\tref={dropdownRef}\n\t\t\t\t\t\tselected={selectedAttributeIds}\n\t\t\t\t\t\tvalue={null as any}\n\t\t\t\t\t\tAutocompleteProps={{\n\t\t\t\t\t\t\tinputValue,\n\t\t\t\t\t\t\tonInputChange: handleInputChange,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<ActionButton\n\t\t\t\t\t\tclassName={classes.addButton}\n\t\t\t\t\t\tdisabled={isLoading || hasMaxItems}\n\t\t\t\t\t\ticon={PlusIcon}\n\t\t\t\t\t\tlabel={i18n.t('i18n.addAttribute')}\n\t\t\t\t\t\tonClick={handleAddClick}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<CountChip\n\t\t\t\t\tclassName={classes.chip}\n\t\t\t\t\tcount={selectedAttributeIds.length}\n\t\t\t\t\tloading={isLoading}\n\t\t\t\t\tonClear={handleClear}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}, [\n\t\titemManagerStore.state.hasMaxItems,\n\t\tstate.selectedAttributeIds,\n\t\tstate.showInput,\n\t\tattributes,\n\t\tclasses,\n\t\thandleAddClick,\n\t\thandleInputChange,\n\t\thideSystemAttributes,\n\t\tinputValue,\n\t\tisLoading,\n\t]);\n\n\tconst Items = useMemo(() => {\n\t\treturn (\n\t\t\t<ItemManager\n\t\t\t\tdisabled={isLoading}\n\t\t\t\tloading={isLoading}\n\t\t\t\tfallback={\n\t\t\t\t\twithSetSelection && (\n\t\t\t\t\t\t<Fallback\n\t\t\t\t\t\t\ttitle={i18n.t('i18n.emptyAttributesList')}\n\t\t\t\t\t\t\ticon={ListIcon}\n\t\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tonRemoveClick={triggerDefaultSet}\n\t\t\t\tscrollNewItemsIntoView={scrollNewItemsIntoView}\n\t\t\t\tItemComponent={Item}\n\t\t\t\tItemComponentProps={{\n\t\t\t\t\tselectedAttributeIds: state.selectedAttributeIds,\n\t\t\t\t\tattributes: attributes.filter(\n\t\t\t\t\t\t(attr) =>\n\t\t\t\t\t\t\t!hideSystemAttributes || !isSystemAttribute(attr.attributeid),\n\t\t\t\t\t),\n\t\t\t\t\tonChange: triggerDefaultSet,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}, [\n\t\tstate.selectedAttributeIds,\n\t\tattributes,\n\t\tclasses,\n\t\thideSystemAttributes,\n\t\tisLoading,\n\t\tscrollNewItemsIntoView,\n\t\ttriggerDefaultSet,\n\t]);\n\n\tconst Sets = useMemo(() => {\n\t\tif (!withSetSelection) return;\n\t\t// const {selectedSetId} = state;\n\t\treturn (\n\t\t\t<div className={classes.selectorWrapper}>\n\t\t\t\t<SetSelector allowCustom variant=\"standard\" />\n\t\t\t</div>\n\t\t);\n\t}, [classes, withSetSelection]);\n\n\treturn (\n\t\t<div className={classes.root}>\n\t\t\t{Sets}\n\t\t\t{Header}\n\t\t\t{Items}\n\t\t</div>\n\t);\n};\n\nexport default withStyles(styles)(Selector);\n","import React from 'react';\n\nimport {AttributeSetSelectionProvider} from '@netx/core-attribute-set-selection';\nimport {AttributeSetProvider} from '@netx/core-attribute-set';\nimport {AttributeProvider} from '@netx/core-attribute';\nimport Selector, {SelectorProps} from '../../components/Selector';\n\nexport type SelectorContainerProps = SelectorProps;\n\nexport default function (props: SelectorContainerProps) {\n\treturn (\n\t\t<AttributeProvider>\n\t\t\t<AttributeSetProvider>\n\t\t\t\t<AttributeSetSelectionProvider\n\t\t\t\t\thideSystemAttributes={props.hideSystemAttributes}\n\t\t\t\t>\n\t\t\t\t\t<Selector {...props} />\n\t\t\t\t</AttributeSetSelectionProvider>\n\t\t\t</AttributeSetProvider>\n\t\t</AttributeProvider>\n\t);\n}\n","/**\n * UI for selecting attributes\n * @class\n */\nimport Base from '@netx/core/lib/netx-react-view';\n\nimport '../css/attribute-selection.less';\n\nimport Component from '@netx/core-asset/components/Attributes/Selector';\nimport {withTheme} from '@netx/core-components/Theme';\nimport {withConfirmation} from '@netx/core-components/Confirmation';\n\nconst ThemedComponent = withTheme(withConfirmation(Component));\nexport default class AssetAttributeSelectView extends Base {\n\tconstructor(opts = {}) {\n\t\topts.className = 'nx-attribute-selection-wrapper';\n\t\tsuper(opts);\n\n\t\tthis.selection = opts.childCollection;\n\t\tthis.onChange = opts.onChange;\n\t\tthis.withSetSelection = opts.withSetSelection === true;\n\t\tthis.max = opts.max;\n\t\tthis.scrollNewItemsIntoView = opts.scrollNewItemsIntoView !== false;\n\t\tthis.hideSystemAttributes = opts.hideSystemAttributes === true;\n\n\t\tthis.selectedIds = this.selection.map((model) => model.id);\n\t\tthis.newSelectedIds = [...this.selectedIds];\n\n\t\tthis.listenTo(this.collection, 'add remove sync', this.render).listenTo(\n\t\t\tthis.selection,\n\t\t\t'add remove sync',\n\t\t\tthis.render,\n\t\t);\n\t}\n\n\tgetSelected() {\n\t\treturn this.newSelectedIds;\n\t}\n\n\thandleChange(selectedIds) {\n\t\tconst equal =\n\t\t\tthis.selection.map((model) => model.id).join() === selectedIds.join();\n\t\tthis.newSelectedIds = selectedIds;\n\t\tthis.onChange && this.onChange(selectedIds, !equal);\n\t}\n\n\trender() {\n\t\treturn super.render(ThemedComponent, {\n\t\t\tattributes: this.collection.map((model) => ({...model.attributes})),\n\t\t\thideSystemAttributes: this.hideSystemAttributes,\n\t\t\tmax: this.max,\n\t\t\tonChange: this.handleChange.bind(this),\n\t\t\tselected: this.selection.map((model) => model.id),\n\t\t\tscrollNewItemsIntoView: this.scrollNewItemsIntoView,\n\t\t\twithSetSelection: this.withSetSelection,\n\t\t});\n\t}\n\n\tupdateMax(max = Infinity) {\n\t\tthis.max = max;\n\t\tthis.render();\n\t}\n\n\tstatic get __name__() {\n\t\treturn 'AssetAttributesSelectReactView';\n\t}\n}\n","import React from 'react';\nimport SelectorContainer, {SelectorContainerProps} from './containers/Selector';\nexport type {SelectorContainerProps} from './containers/Selector';\n\nimport {ItemManagerServiceProvider} from '@netx/core-components/ItemManager';\n\nexport default (props: SelectorContainerProps) => {\n\treturn (\n\t\t<ItemManagerServiceProvider>\n\t\t\t<SelectorContainer {...props} />\n\t\t</ItemManagerServiceProvider>\n\t);\n};\n","import Base from '@netx/core/lib/netx-model';\n\nimport Netx from '@netx/core/bootstrap';\n\nexport default class AccessToken extends Base {\n\tget rpc() {\n\t\treturn true;\n\t}\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\tget defaults() {\n\t\treturn {\n\t\t\tid: 0,\n\t\t\tname: '',\n\t\t\tfileName: '',\n\t\t\tcreationDate: '',\n\t\t\timportDate: '',\n\t\t\tmodDate: '',\n\t\t\tfileSize: 0,\n\t\t\tduration: 0,\n\t\t\tfileWidth: 0,\n\t\t\tfileHeight: 0,\n\t\t\tthumb: '',\n\t\t\tpreview: '',\n\t\t\tpreviewWidth: 0,\n\t\t\tpreviewHeight: 0,\n\t\t\tfileTypeLabel: '',\n\t\t\tfileFormatFamily: [],\n\t\t\tattributes: [],\n\t\t\tpageCount: 0,\n\t\t\tviewNames: [],\n\n\t\t\tstatus: 1,\n\t\t\tzoomAvailable: true,\n\t\t};\n\t}\n\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t// Fake - who cares\n\t\tthis.progress = new Base();\n\t\tthis.addSubModel(this.progress);\n\n\t\tthis.set('audioUrl', this.hasAudio());\n\t\tthis.set('videoUrl', this.hasVideo());\n\t\tthis.set('zoomUrl', this.hasZoom());\n\t}\n\n\tcanZoom() {\n\t\treturn false;\n\t}\n\n\tgetAttribute() {\n\t\treturn '';\n\t}\n\n\tgetTokenString() {\n\t\tconst tokenModel = Netx.share?.token;\n\t\treturn tokenModel ? tokenModel.getTokenString() : '';\n\t}\n\n\tgetWaveformJSON() {\n\t\treturn $.getJSON(\n\t\t\t`/file/asset/${this.id}/view/previewWaveformJSON${this.getTokenString()}`,\n\t\t).then((json) => {\n\t\t\treturn json.data;\n\t\t});\n\t}\n\n\thasAudio() {\n\t\tconst id = this.id;\n\t\tif (!this.get('fileFormatFamily').includes('audio')) return false;\n\n\t\tlet url = false;\n\t\tconst tokenStr = this.getTokenString();\n\t\t// Check in view names\n\t\tif (this.get('viewNames').includes('previewMp3')) {\n\t\t\turl = `/file/asset/${id}/view/previewMp3/a_${id}.mp3${tokenStr}`;\n\t\t}\n\t\t// Check in file type label\n\t\telse if (this.get('fileTypeLabel') === 'mp3') {\n\t\t\turl = `/file/asset/${id}/original/a_${id}.mp3${tokenStr}`;\n\t\t}\n\n\t\treturn url;\n\t}\n\n\thasMultimedia() {\n\t\treturn (\n\t\t\tthis.get('fileFormatFamily').includes('audio') ||\n\t\t\tthis.get('fileFormatFamily').includes('video')\n\t\t);\n\t}\n\n\thasVideo() {\n\t\tconst id = this.id;\n\t\tconst tokenStr = this.getTokenString();\n\n\t\tif (!this.get('fileFormatFamily').includes('video')) return false;\n\n\t\tlet url = false;\n\t\tif (this.get('viewNames').includes('previewH264')) {\n\t\t\turl = `/file/asset/${id}/view/previewH264/v_${id}.mp4${tokenStr}`;\n\t\t}\n\t\t// Check in file type label\n\t\telse if (this.get('fileTypeLabel') === 'mp4') {\n\t\t\turl = `/file/asset/${id}/original/v_${id}.mp4${tokenStr}`;\n\t\t}\n\n\t\treturn url;\n\t}\n\n\thasZoom() {\n\t\tconst id = this.id;\n\t\tconst fileTypeLabel = this.get('fileTypeLabel');\n\t\tconst tokenStr = this.getTokenString();\n\t\treturn `/file/asset/${id}/zoom/${id}.${fileTypeLabel}${tokenStr}`;\n\t}\n\n\tisDocument() {\n\t\treturn (\n\t\t\tthis.get('pageCount') > 0 &&\n\t\t\t(this.isPDF() || this.get('fileFormatFamily').includes('document'))\n\t\t);\n\t}\n\n\tisImage() {\n\t\treturn this.get('fileFormatFamily').includes('image');\n\t}\n\n\tisPDF() {\n\t\treturn (\n\t\t\tthis.get('viewNames').includes('previewPDF') ||\n\t\t\tthis.get('fileTypeLabel') === 'pdf'\n\t\t);\n\t}\n\n\tstatic get __name__() {\n\t\treturn 'AccessTokenAsset';\n\t}\n}\n","import Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/accessTokenAsset';\n\nimport Netx from '@netx/core/bootstrap';\n\nimport PagerModel from '@netx/core-app/models/pager';\n\nexport default class AccessTokenAssets extends Base {\n\tget rpc() {\n\t\treturn true;\n\t}\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetTokenAssetData: 'Loading assets',\n\t\t};\n\t}\n\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetTokenAssetData: 'Loaded assets',\n\t\t};\n\t}\n\n\tget methods() {\n\t\treturn {\n\t\t\tread(opts) {\n\t\t\t\treturn [\n\t\t\t\t\t'getTokenAssetData',\n\t\t\t\t\tthis.token.get('token'),\n\t\t\t\t\tthis.token.get('password'),\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\tget parsers() {\n\t\treturn {\n\t\t\tread(data, opts) {\n\t\t\t\tconst tokenStr = this.token.getTokenString();\n\t\t\t\treturn data.map((d) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...d,\n\t\t\t\t\t\tthumb: `${d.thumb}${tokenStr}`,\n\t\t\t\t\t\tpreview: `${d.preview}${tokenStr}`,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor(models, opts = {}) {\n\t\topts.model = Model;\n\t\tsuper(models, opts);\n\n\t\tthis.token = opts.token;\n\n\t\tthis.pager = new PagerModel(\n\t\t\t{...opts.pager, pageSize: 25, routesToPage: false},\n\t\t\t{collection: this},\n\t\t);\n\t\tthis.addSubModel(this.pager);\n\t}\n\n\tstatic get __name__() {\n\t\treturn 'AccessTokenAssets';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\nimport _ from 'underscore';\n\nimport Netx from '@netx/core/bootstrap';\n\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\nimport AccessTokenAssets from '../collections/accessTokenAssets';\n\nimport {\n\taccessTypes,\n\texpirationTypes,\n\tsecurityTypes,\n} from '../properties/accessToken';\nimport {types as downloadOptionTypes} from '../properties/downloadOptions';\nimport {TOKEN_PASSWORD_PLACEHOLDER, TOKEN_TYPES} from '../constants';\n\nexport default class AccessToken extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'token';\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetTokenInfo: 'Loading shared link',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetTokenInfo: 'Loaded shared link',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} defaults - AccessToken defaults\n\t * @property {number} defaults.accessId - Default AccessToken access id\n\t * @property {string} defaults.accessType - Default AccessToken access type (\"asset\" or ?)\n\t * @property {number} defaults.count - Default AccessToken asset count\n\t * @property {string} defaults.createDate - Default AccessToken creation date string\n\t * @property {string} defaults.duration - Default duration string\n\t * @property {string} defaults.expirationType - share/properties/accessToken#expirationTypes (indefinite, accesses, date)\n\t * @property {timestamp} defaults.expirationDate - Default AccessToken expiration date\n\t * @property {object} defaults.justifyDetails - Default AccessToken justify details (the justification submitted with the request -- JSON)\n\t * @property {number} defaults.justifyId - Default AccessToken justify id (group id) (DAM ID for justification record associated with this request)\n\t * @property {boolean} defaults.includeSubFolders - Default AccessToken includeSubFolders flag (whether token recurses into its target folders children)\n\t * @property {Netx.Collections.DownloadOptions} defaults.options - Default AccessToken array of downloadOption objects\n\t * @property {string} defaults.password - Default AccessToken password\n\t * @property {number} defaults.requestorId - Default AccessToken requestor id (person requesting these assets -- userId)\n\t * @property {string} defaults.requestorLabel - Default AccessToken requestor label (name and email of requstor; set by server)\n\t * @property {number} defaults.secondsToLive - Default AccessToken seconds to live\n\t * @property {string} defaults.securityType - share/properties/accessToken#securityTypes (none, password, referrer, ipAddr)\n\t * @property {array} defaults.sources - Asset sets (when creating token from asset sets- must never be more than one assetSet)\n\t * @property {number} defaults.timesUsed - Default AccessToken times used\n\t * @property {string} defaults.title - Default AccessToken title\n\t * @property {string} defaults.token - Default AccessToken token\n\t * @property {number} defaults.totalUses - Default AccessToken total uses\n\t * @property {string} defaults.type - Default AccessToken type -- someday, this will always be \"assetSet\"\n\t * @property {string} defaults.typeLabel - Default AccessToken type label (set by server)\n\t * @property {number} defaults.userId - Default AccessToken user id (owner of this token)\n\t * @property {string} defaults.userLabel - Default AccessToken user label (name & email of owner; set by server)\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\taccessId: 0,\n\t\t\taccessType: '',\n\t\t\tcount: 0,\n\t\t\tcreateDate: '',\n\t\t\texpirationType: 'indefinite',\n\t\t\tjustifyDetails: [],\n\t\t\tjustifyId: 0,\n\t\t\tincludeSubFolders: false,\n\t\t\toptions: [],\n\t\t\tpassword: '',\n\t\t\trequestorId: 0,\n\t\t\trequestorLabel: '',\n\t\t\tsecondsToLive: 0,\n\t\t\tsecurityType: 'none',\n\t\t\tsources: [],\n\t\t\ttimesUsed: 0,\n\t\t\ttitle: '',\n\t\t\t// token : \"\",\n\t\t\ttotalUses: 0,\n\t\t\ttype: TOKEN_TYPES.DOWNLOAD,\n\t\t\ttypeLabel: '',\n\t\t\tuserId: 0,\n\t\t\tuserLabel: '',\n\n\t\t\t// Client attributes\n\t\t\tduration: '',\n\t\t\t// TODO: This should be returned from the server\n\t\t\t// We can deduce the `secondsToLive` just fine on the client with that - the server should be figuring that part\n\t\t\t// out\n\t\t\texpirationDate: null,\n\t\t};\n\t}\n\n\t/** @type {array} */\n\tget clientAttrs() {\n\t\treturn ['assets', 'count', 'createDate', 'duration', 'expirationDate'];\n\t}\n\n\t/**\n\t * @property {object} methods\n\t * @property {array|function} methods.create - Create new token\n\t * @property {array|function} methods.read - Fetch token\n\t * @property {array|function} methods.update - Update existing token\n\t * @property {array|function} methods.remove - Delete (destroy) token\n\t *\n\t * @property {array|function} methods.addAssets - Add assets to token\n\t * @property {array|function} methods.approve - Approve pending token\n\t * @property {array|function} methods.downloadForToken - Download option type(s) for token (metadata/contactSheet/etc)\n\t * @property {array|function} methods.fetchInfo - Stripped down version of fetch that only gets enough data about the token to accomplish a download\n\t * @property {array|function} methods.getAssets - Get assets for token (but not the token)\n\t * @property {array|function} methods.getToken - Get token (but not its assets)\n\t * @property {array|function} methods.getTokenInfo - Get stripped down version of token (but not its assets)\n\t * @property {array|function} methods.mail - Send a token in an email\n\t * @property {array|function} methods.reject - Reject pending token\n\t * @property {array|function} methods.removeAssets - Remove assets from token\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * Add assets to a token\n\t\t\t * @method\n\t\t\t * @param {array|module:asset/models/asset} assets Either an array of module:asset/models/asset or a single module:asset/models/asset\n\t\t\t * @param {object} opts Sync options.\n\t\t\t */\n\t\t\taddAssets: function (assets, opts) {\n\t\t\t\tif (!_.isArray(assets)) assets = [assets];\n\n\t\t\t\treturn ['addAssetsToToken', this.id, _.pluck(assets, 'id')];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Approve a pending token\n\t\t\t * @method\n\t\t\t * @param {string} note Message to requesting user\n\t\t\t * @param {object} opts\n\t\t\t */\n\t\t\tapprove: function (note, opts) {\n\t\t\t\tnote = note || '';\n\t\t\t\treturn ['decidePendingToken', this.id, true, note];\n\t\t\t},\n\t\t\t/**\n\t\t\t * Create a new token on the server.\n\t\t\t * @method\n\t\t\t */\n\t\t\tcreate(opts) {\n\t\t\t\treturn ['setToken', this.self()];\n\t\t\t},\n\t\t\t/** @todo document */\n\n\t\t\t/**\n\t\t\t * @param {string} token Token string\n\t\t\t * @param {options} options Downlaod options\n\t\t\t */\n\t\t\tdownloadForToken: function (types, opts) {\n\t\t\t\ttypes = types\n\t\t\t\t\t? this.get('options').filter((option) => types.includes(option.type))\n\t\t\t\t\t: this.get('options');\n\n\t\t\t\treturn ['downloadForToken', this.id, this.get('password'), types];\n\t\t\t},\n\t\t\t/**\n\t\t\t * fetchInfo() is a stripped-down version of fetch() that gets only enough data\n\t\t\t * about the token to accomplish a download. (The specific attributes it fetches\n\t\t\t * are 'title', 'token', 'type', 'justification', 'securityType' and 'options'.)\n\t\t\t * @method\n\t\t\t * @param {object} opts Options\n\t\t\t */\n\t\t\tfetchInfo(opts) {\n\t\t\t\treturn this.getTokenInfo(opts).then((token) => {\n\t\t\t\t\t// We can't fetch the assets if a password is required\n\t\t\t\t\t// and has not been provided yet\n\t\t\t\t\treturn token.securityType === securityTypes.password &&\n\t\t\t\t\t\t!this.get('password')\n\t\t\t\t\t\t? token\n\t\t\t\t\t\t: this.getAssets(opts).then(() => token);\n\t\t\t\t});\n\t\t\t},\n\t\t\t/**\n\t\t\t * Get stripped-down version of token\n\t\t\t * @method\n\t\t\t */\n\t\t\tgetTokenInfo: ['getTokenInfo', 'token'],\n\t\t\t/**\n\t\t\t * Fetch this token's assets from the server\n\t\t\t * (this.fetch() combines this.getToken() and this.getAssets() to get the token and its assets in one call.)\n\t\t\t * @method\n\t\t\t * @param {object} opts Options\n\t\t\t */\n\t\t\tgetAssets(opts) {\n\t\t\t\t// Do not fetch if we\n\t\t\t\tif (\n\t\t\t\t\tthis.get('type') === TOKEN_TYPES.DOWNLOAD &&\n\t\t\t\t\t!this.hasDownloadableOptions()\n\t\t\t\t)\n\t\t\t\t\treturn new $.Deferred().resolve();\n\t\t\t\treturn this.assets.fetch(opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Fetch this token from the server.\n\t\t\t * (this.fetch() combines this.getToken() and this.getAssets() to get the token and its assets in one call.)\n\t\t\t * @method\n\t\t\t */\n\t\t\tgetToken: ['getToken', 'token'],\n\t\t\t/**\n\t\t\t * Send an email message containing a link to this token.\n\t\t\t * @method\n\t\t\t * @param {object} emailOpts Email options (as sent by email form) -- .emailTo (address/addresses) is required, .emailNotes (message) is optional\n\t\t\t * @param {object} syncOpts Sync options\n\t\t\t */\n\t\t\tmail: function (emailOpts, syncOpts) {\n\t\t\t\temailOpts = emailOpts || {};\n\n\t\t\t\tvar notes = emailOpts.emailNotes || '';\n\n\t\t\t\t// Assert we have a to: address\n\t\t\t\tvar to = emailOpts.emailTo;\n\t\t\t\tif (!to) {\n\t\t\t\t\tthrow new Error(\"Can't send email to null address\");\n\t\t\t\t}\n\n\t\t\t\tif (!_.isArray(to)) {\n\t\t\t\t\t// Divide multiple addrs & make this an array.\n\t\t\t\t\t// DEVNOTE: the API requires this I guess, but really it's the MTA's job to un-splice commas.\n\t\t\t\t\t// (Because valid addrs can contain comments, which can contain commas.)\n\t\t\t\t\t// http://stackoverflow.com/questions/566396/validate-multiple-emails-comma-separated-with-javascript\n\t\t\t\t\t// (Or if you haven't eaten recently: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html)\n\t\t\t\t\t//\n\t\t\t\t\t// TODO: Use a nice custom form field for entering emails,\n\t\t\t\t\t// one that keeps them split up & gives us an array of them here\n\t\t\t\t\t// instead of joining them with commas.\n\t\t\t\t\tto = to.split(',');\n\t\t\t\t}\n\n\t\t\t\t// Convert that array into the API's desired user-selecting object, which looks like this:\n\t\t\t\t// {\n\t\t\t\t// userIds: [ // array of uids (isNumeric) ],\n\t\t\t\t// groupId: [ // array of gids (isNumeric) ],\n\t\t\t\t// emails: [ // array of addresses (isString) ]\n\t\t\t\t// }\n\t\t\t\tto = {\n\t\t\t\t\tuserIds: [],\n\t\t\t\t\tgroupIds: [],\n\t\t\t\t\temails: to,\n\t\t\t\t};\n\n\t\t\t\t// Send the message:\n\t\t\t\treturn ['shareTokenWithRecipients', this.id, to, notes];\n\t\t\t},\n\t\t\t/**\n\t\t\t * @method fetch\n\t\t\t * @override\n\t\t\t * @param {object} opts Fetch options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn this.getToken(opts).then((token) => {\n\t\t\t\t\treturn token.securityType === securityTypes.password\n\t\t\t\t\t\t? token\n\t\t\t\t\t\t: this.getAssets(opts).then(() => token);\n\t\t\t\t});\n\t\t\t},\n\t\t\t/**\n\t\t\t * Reject a pending token\n\t\t\t * @method\n\t\t\t * @param {string} note Message to requesting user regarding the rejection\n\t\t\t * @param {object} opts\n\t\t\t */\n\t\t\treject: function (note, opts) {\n\t\t\t\treturn ['decidePendingToken', this.id, false, note];\n\t\t\t},\n\t\t\t/** @method destroy */\n\t\t\tremove: ['deleteToken', 'token'],\n\t\t\t/**\n\t\t\t * Remove assets from the token's set.\n\t\t\t * @method\n\t\t\t * @param {array|module:asset/models/asset} assets Either an array of module:asset/models/asset or a single module:asset/models/asset\n\t\t\t * @param {object} opts\n\t\t\t */\n\t\t\tremoveAssets: function (assets, opts) {\n\t\t\t\tif (!_.isArray(assets)) {\n\t\t\t\t\tassets = [assets];\n\t\t\t\t}\n\t\t\t\treturn ['removeAssetsFromToken', this.id, _.pluck(assets, 'id')];\n\t\t\t},\n\t\t\t/** @method save */\n\t\t\tupdate(opts = {}) {\n\t\t\t\t// Check if the password still matches the placeholder\n\t\t\t\t// if so, remove it from what we send to the server\n\t\t\t\tconst data = this.self();\n\t\t\t\tif (\n\t\t\t\t\tdata.password === TOKEN_PASSWORD_PLACEHOLDER ||\n\t\t\t\t\tdata.password === '' ||\n\t\t\t\t\tdata.password == null\n\t\t\t\t) {\n\t\t\t\t\tdelete data.password;\n\t\t\t\t}\n\t\t\t\treturn ['setToken', data];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Model parsers\n\t * @property {function} parsers.getToken - Parse full token\n\t * @property {function} parsers.getTokenInfo - Parse stripped down token\n\t * @property {function} parsers.addAssets - Parse the result of adding assets\n\t * @property {function} parsers.getAssets - Parse the result of get assets\n\t * @property {function} parsers.removeAssets - Parse the result of removing assets\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {?} result Result\n\t\t\t * @param {array} assets Assets\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\taddAssets: function (result, assets, opts) {\n\t\t\t\tif (!_.isArray(assets)) assets = [assets];\n\t\t\t\tthis.assets.add(assets, opts);\n\n\t\t\t\t// Update count\n\t\t\t\tvar count = this.get('count');\n\t\t\t\tthis.set('count', (count || 0) + assets.length, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Full token bean\n\t\t\t * @function\n\t\t\t * @param {object} token Token\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tgetToken: function (token, opts) {\n\t\t\t\t// DAM-19005\n\t\t\t\tconst {justifyDetails} = token;\n\t\t\t\tif (Array.isArray(justifyDetails)) {\n\t\t\t\t\ttoken.justifyDetails = justifyDetails.map((detail) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...detail,\n\t\t\t\t\t\t\tlabel: (detail.label || '').replace(/'/g, \"'\"),\n\t\t\t\t\t\t\tvalue: (detail.value || '').replace(/'/g, \"'\"),\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.set(token, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Stripped-down version of our token bean for downloading\n\t\t\t * @function\n\t\t\t * @param {object} token Token\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tgetTokenInfo: function (token, opts) {\n\t\t\t\tthis.set(token, opts);\n\t\t\t},\n\t\t\t/**\n\t\t\t * @function\n\t\t\t * @param {?} result Result\n\t\t\t * @param {array} assets Assets\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tremoveAssets: function (result, assets, opts) {\n\t\t\t\tif (!_.isArray(assets)) assets = [assets];\n\t\t\t\tthis.assets.remove(assets, opts);\n\n\t\t\t\t// Update count\n\t\t\t\tvar count = this.get('count');\n\t\t\t\tthis.set('count', Math.max((count || 0) - assets.length, 0), opts);\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @method */\n\tparse(data) {\n\t\treturn _.isString(data) ? {token: data} : data;\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\tthis.assets = new AccessTokenAssets([], {token: this});\n\n\t\t/**\n\t\t * The asset set to be used for the access token source\n\t\t * @memberOf Netx.Models.AccessToken\n\t\t * @alias assetSet\n\t\t * @type {module:asset/models/assetSet}\n\t\t */\n\t\tthis.assetSet = opts.assetSet || new AssetSetModel();\n\n\t\tif (opts.assetSet) {\n\t\t\t// Initialize our token from the contents of an asset set:\n\t\t\tthis.toSources();\n\t\t}\n\n\t\t// Default secondsToLive:\n\t\t// If the expiration wasn't set at create-time, set it to the server's default or 30 days.\n\t\t// DAM-13580: The \"create embed code\" action sets secondToLive to 0 AND expirationType to 'indefinite', account for that here\n\t\tif (\n\t\t\t(this.get('secondsToLive') === 0 &&\n\t\t\t\tthis.get('expirationType') !== 'indefinite') ||\n\t\t\tisNaN(this.get('secondsToLive'))\n\t\t) {\n\t\t\tthis.set({\n\t\t\t\tsecondsToLive:\n\t\t\t\t\tparseInt(Netx.getPreference('share.token.secondsToLive.default')) ||\n\t\t\t\t\t30 * 24 * 60 * 60,\n\t\t\t});\n\t\t}\n\n\t\t// Het, listen!\n\t\tthis.listenTo(this, 'request:fetchInfo', function (model, xhr, opts) {\n\t\t\tthis.trigger('request:read', model, xhr, opts);\n\t\t}).listenTo(this, 'complete:fetchInfo', function (model, xhr, opts) {\n\t\t\t!opts.silent && this.trigger('sync', model, model.attributes, opts);\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean} Has downloadable options\n\t */\n\thasDownloadableOptions() {\n\t\tconst downloadableTypes = [\n\t\t\t'assetView',\n\t\t\t'manualRepurpose',\n\t\t\t'original',\n\t\t\t'presetProcess',\n\t\t\t'templateCustomization',\n\t\t];\n\t\treturn this.get('options').some(\n\t\t\t(option) =>\n\t\t\t\tdownloadableTypes.includes(option.type) ||\n\t\t\t\t(option.type === 'proxy' && ['preview', 'thumb'].includes(option.name)),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} type Option type\n\t * @return {boolean} Has option\n\t */\n\thasOption(type) {\n\t\treturn this.get('options').some((option) => option.type === type);\n\t}\n\n\t/**\n\t * @override\n\t * @return {object}\n\t */\n\tself() {\n\t\t// While creating/editing a token we should only be touching the assetSet model set on the token\n\t\t// Now we need to set the sources before we save\n\t\tthis.toSources();\n\t\t//options are stored on the assetset until it is time to save the token\n\t\tthis.set({options: this.assetSet.downloadOptions});\n\n\t\tvar me = super.self();\n\t\t// See `assetSet` model - not sure if the UI broken this (and we were once calling self on the `assetSet`)\n\t\t// or the server broke it (due to potentially recognzing `assetSet` as `asset` at one point)\n\t\tme.sources = me.sources.map((source) => ({\n\t\t\t...source,\n\t\t\ttype: source.type === 'assetSet' ? 'asset' : source.type,\n\t\t}));\n\n\t\treturn me;\n\t}\n\n\t/**\n\t * Manage\n\t * Also, has a holdover to get us closer to what we need while awaiting the DAM to provide it for us\n\t * @override\n\t * @param {object|string} key Either the key or an object of key values\n\t * @param {mixed} value Either a value or, if the key is an object, it is the options object\n\t * @param {object} opts If key is not an object this the options object, otherwise `null`\n\t */\n\tset(key, value, opts) {\n\t\t// Vars\n\t\tvar attrs = {},\n\t\t\t_opts = opts || {},\n\t\t\tsecs;\n\n\t\t// If the key is an object then we have only two args and the second one is the opts\n\t\tif (_.isObject(key)) {\n\t\t\t_opts = value || {};\n\t\t\tattrs = key;\n\t\t} else {\n\t\t\tattrs[key] = value;\n\t\t}\n\t\t// TODO: https://jira.netx.net/browse/DAM-8714\n\t\t// We get back from the server `secondsToLive` and no actual real date to work with\n\t\t// The incremental issue was a failure somewhere else - but understandably so - in order to pull this off without the hacks here we\n\t\t// would need to be doing a bunch of repetative math with `createDate`, `secondsToLive`, and `_.now()`.\n\t\t// For now - it just makes much more sense to estabslish the expiration date/time right here and now\n\t\t// This all goes back to - data should be handled in the model/collection - a view/template/controller should not have to know these oddities.\n\t\tif (attrs.createDate && _.isString(attrs.createDate)) {\n\t\t\t// Compensate for the time difference between client and UTC or server\n\t\t\tvar offset = new Date().getTimezoneOffset() * 60 * 1000;\n\t\t\tif (offset) {\n\t\t\t\t// DAM-10215 - replacing ' ' with 'T', needs to be RFC2822 or ISO 8601 date string format\n\t\t\t\tattrs.createDate = new Date(\n\t\t\t\t\tnew Date(attrs.createDate.replace(' ', 'T')).getTime() - offset,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tvar expirationType = this.get('expirationType') || attrs.expirationType;\n\t\t// Take seconds to live and find an actual `expirationDate` as of this moment\n\t\tif (attrs.secondsToLive) {\n\t\t\tvar createDate = this.get('createDate') || attrs.createDate || new Date();\n\t\t\tif (expirationType === expirationTypes.date) {\n\t\t\t\tsecs = attrs.secondsToLive;\n\t\t\t\tattrs.expirationDate = secs\n\t\t\t\t\t? new Date(createDate.getTime() + secs * 1000)\n\t\t\t\t\t: null;\n\t\t\t} else {\n\t\t\t\tattrs.expirationDate = null;\n\t\t\t}\n\t\t}\n\t\t// We make two different calls for info about this token - lets just act as if and not use two differnt approaches from the outside\n\t\telse if (attrs.expireDate) {\n\t\t\texpirationType = attrs.expirationType = 'date';\n\t\t\tattrs.expirationDate = _.dateToLocalTimezone(new Date(attrs.expireDate));\n\t\t}\n\t\t// Update our clientside `duration` alongside other pertinent attributes changes\n\t\t// This is the kind of logic that should be taken out of views\n\t\tif (\n\t\t\tattrs.createDate ||\n\t\t\tattrs.totalUses ||\n\t\t\tattrs.expirationType ||\n\t\t\tattrs.secondsToLive\n\t\t) {\n\t\t\tswitch (expirationType) {\n\t\t\t\tcase 'accesses': // access count\n\t\t\t\t\tattrs.duration = i18n.t('i18n.useCountN', {\n\t\t\t\t\t\tcount: this.get('totalUses'),\n\t\t\t\t\t\tdefaultValue: 'Use count: __count__',\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date': // expiration date\n\t\t\t\t\tvar expirationDate =\n\t\t\t\t\t\tattrs.expirationDate || this.get('expirationDate');\n\t\t\t\t\t// Set seconds\n\t\t\t\t\tsecs = expirationDate && expirationDate.getTime() / 1000;\n\t\t\t\t\t// Calculate days\n\t\t\t\t\tvar days = secs && Math.floor(secs / 60 / 60 / 24);\n\t\t\t\t\tif (days) {\n\t\t\t\t\t\t// display a date.\n\t\t\t\t\t\tattrs.duration =\n\t\t\t\t\t\t\ti18n.t('i18n.expires', {defaultValue: 'Expires'}) +\n\t\t\t\t\t\t\t': ' +\n\t\t\t\t\t\t\texpirationDate;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// display h/m/s remaining\n\t\t\t\t\t\tvar hours = Math.floor(secs / 60 / 60);\n\t\t\t\t\t\tsecs -= hours * 60 * 60;\n\t\t\t\t\t\tvar minutes = Math.floor(secs / 60);\n\t\t\t\t\t\tsecs -= Math.floor(minutes * 60);\n\n\t\t\t\t\t\tattrs.duration = i18n.t('i18n.expiresInHoursMinutesSeconds', {\n\t\t\t\t\t\t\thours: hours,\n\t\t\t\t\t\t\tminutes: minutes,\n\t\t\t\t\t\t\tseconds: secs,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'indefinite': // permanent\n\t\t\t\t\tattrs.duration = i18n.t('i18n.permanent', {\n\t\t\t\t\t\tdefaultValue: 'Permanent',\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn super.set(attrs, _opts);\n\t}\n\n\t/**\n\t * Handle the weird math between creationDate and secondsToLive ...\n\t * Set the date (as seconds or a date Object) and return the date (as a Date object)\n\t * @method\n\t * @param {date|string} expDate Exiration date\n\t * @return {date}\n\t */\n\texpirationDate(expDate) {\n\t\tif (\n\t\t\t!this.get('expirationDate') &&\n\t\t\t!expDate &&\n\t\t\t(!this.get('secondsToLive') || isNaN(this.get('secondsToLive')))\n\t\t) {\n\t\t\t// If secondsToLive is undefined & we're not defining it, return undef.\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse\n\t\tvar createDate = this.get('createDate') || new Date();\n\t\tif (!(createDate instanceof Date)) {\n\t\t\t// DAM-7772 Use _.dateFromAsset when parsing a yyyy-mm-dd hh:mm:ss.s date\n\t\t\tcreateDate = new Date(_.dateFromAsset(this.get('createDate')));\n\t\t}\n\t\tif (isNaN(createDate.getTime())) {\n\t\t\t// Date objects handle errors weirdly.\n\t\t\tthrow new Error(createDate);\n\t\t}\n\n\t\tif (expDate) {\n\t\t\tif (!(expDate instanceof Date)) {\n\t\t\t\texpDate = new Date(expDate);\n\t\t\t}\n\t\t\tif (!isNaN(expDate.getTime())) {\n\t\t\t\tthis.set({\n\t\t\t\t\tsecondsToLive: Math.round(\n\t\t\t\t\t\t(expDate.getTime() - createDate.getTime()) / 1000,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn expDate && !isNaN(expDate.getTime())\n\t\t\t? expDate\n\t\t\t: this.get('expirationDate');\n\t}\n\n\t/**\n\t * @method\n\t * @return {array} Templates\n\t */\n\tgetTemplates() {\n\t\tvar type = downloadOptionTypes.templateCustomization;\n\t\treturn _.filter(this.get('options') || [], function (opt) {\n\t\t\treturn opt.type == type;\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @return Token (and password if applicable) query string\n\t */\n\tgetTokenString() {\n\t\tconst password = this.get('password');\n\t\tlet tokenStr = `?token=${this.id}`;\n\t\tif (password !== '' && password != null) {\n\t\t\ttokenStr += `&pw=${encodeURIComponent(password)}`;\n\t\t}\n\n\t\treturn tokenStr;\n\t}\n\n\t/**\n\t * Return a base URL containing a route to access this token in some way.\n\t * For token approval there are 'edit', 'approve' and 'reject' links.\n\t * For token access there is a direct 'download' link or a general purpose 'access' link.\n\t *\n\t * @param {string} type 'download', 'access', 'edit', 'approve', 'reject'\n\t * @method\n\t */\n\tlinkUrl(type) {\n\t\t// TODO: should we be using this in our bootstrap file when creating the `Netx.URL`s?\n\t\tconst baseUrl = Netx.getPublicProperty('sys.docroot_url');\n\t\tconst path = window.location.pathname;\n\n\t\t// I have no idea why we would be passing in type when it's already on the model but leaving it just in case\n\t\tswitch (type || this.get('type')) {\n\t\t\tcase 'access': // TODO: update when access UI is available.\n\t\t\tcase 'download':\n\t\t\t\treturn `${baseUrl}${path}#share/request/${this.get('token')}`;\n\t\t\tcase 'embed':\n\t\t\t\treturn [\n\t\t\t\t\t'<img src="',\n\t\t\t\t\tbaseUrl,\n\t\t\t\t\t'/file/asset/',\n\t\t\t\t\tthis.get('accessId'),\n\t\t\t\t\t'/original?token=',\n\t\t\t\t\tthis.get('token'),\n\t\t\t\t\t'">',\n\t\t\t\t].join('');\n\t\t\tdefault:\n\t\t\t\treturn this.linkUrl('download');\n\t\t}\n\t}\n\n\t/**\n\t * Takes soruce data set on token model and turns it into an assetSet Model\n\t * @method\n\t */\n\ttoAssetSet() {\n\t\t//if accesstype is assetSet then assetSet type is asset\n\t\t//else assetSet type === accessType\n\t}\n\n\t/**\n\t * Uses the assetSet on the model to populate accessType, accessId and sources\n\t * There is some disparity between how assetSets work and tokens work and this is all straightned out here.\n\t * @param {module:asset/models/assetSet} assetSet If defined it will be used to set the sources otherwise this.assetSet will be used\n\t * @method\n\t */\n\ttoSources() {\n\t\tconst assetSet = this.assetSet;\n\t\tvar source;\n\n\t\t// This was a token info call and we have no asset set\n\t\tif (this.get('token') && this.get('accessId') === 0) return;\n\n\t\t// Currently we don't allow the user to change the type or sources when type is assetSet\n\t\tif (this.get('accessType') === 'assetSet') {\n\t\t\tthis.set({title: assetSet.get('label')});\n\t\t} else if (['cart', 'assetSet'].indexOf(assetSet.get('type')) > -1) {\n\t\t\tthis.set({\n\t\t\t\taccessType: accessTypes.assetSet,\n\t\t\t\ttitle: assetSet.get('label'),\n\t\t\t});\n\n\t\t\t// We don't want to set the whole assetSet model as sources, just the relevant attributes, otherwise sometimes sources is a model and sometimes it's a simple object\n\t\t\tsource = assetSet.pick('type', 'ids', 'recursive');\n\t\t\t// This really should never be 'assetSet', it should always be 'asset' but this was here so I assume it's here for a reason\n\t\t\tif (source === 'assetSet') {\n\t\t\t\tsource.type = 'asset';\n\t\t\t}\n\t\t\tthis.set({sources: [source]});\n\t\t} else {\n\t\t\tthis.set({\n\t\t\t\taccessType: assetSet.get('type'),\n\t\t\t\ttitle: assetSet.get('label'),\n\t\t\t\taccessId: assetSet.get('ids')[0],\n\t\t\t});\n\t\t}\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AccessToken';\n\t}\n}\n","/**\n * Displays a single card asset view\n * @class\n */\nimport Base from './assetListItemView';\nimport Template from '../templates/assetListItemView_card.html';\n\nimport AssetAttributesCardTemplate from '../templates/assetAttributesView_card.html';\nimport AssetAttributesView from './assetAttributesView';\n\nexport default class AssetListItemView_Card extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * Attribute sets selection\n\t\t * @memberOf Netx.Views.AssetListItemView_card\n\t\t * @alias attributeSetsSelection\n\t\t * @type {Netx.Collections.AssetAttributeSetSelection}\n\t\t */\n\t\tthis.attributeSetsSelection =\n\t\t\topts.attributeSetsSelection ||\n\t\t\tNetx.asset.listTypeAttributeSetsSelections.card;\n\n\t\t/**\n\t\t * Our attributes view\n\t\t * @memberOf Netx.Views.AssetListItemView_card\n\t\t * @alias assetAttributesView\n\t\t * @type {Netx.Views.AssetAttributesView}\n\t\t */\n\t\tthis.assetAttributesView = this.addSubView(\n\t\t\tnew AssetAttributesView({\n\t\t\t\ttemplate: AssetAttributesCardTemplate,\n\t\t\t\tmodel: this.model,\n\t\t\t\tcollection: this.attributeSetsSelection,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$attributesView = this.$('.nx-asset-attributes');\n\n\t\t// Render append and show the attributes view\n\t\tthis.$attributesView.append(this.assetAttributesView.render().$el);\n\t\tthis.assetAttributesView.show();\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetListItemView_Card';\n\t}\n}\n","/**\n * @class\n */\nimport Base from './assetListView';\nimport Template from '../templates/assetListView_card.html';\n\nimport ChildView from './assetListItemView_card';\n\nexport default class AssetListView_Card extends Base {\n\t/**\n\t * @override\n\t * @param {object} opts View options\n\t * @listens module:user#user:curatorMode:selected\n\t */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.className = opts.className || 'assets card';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * @memberOf Netx.Views.AssetListView\n\t\t * @alias attributeSetsSelection\n\t\t * @type {Netx.Collection.AssetAttributeSetsSelction}\n\t\t */\n\t\tthis.attributeSetsSelection =\n\t\t\topts.attributeSetsSelection ||\n\t\t\tNetx.asset.listTypeAttributeSetsSelections.card;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetListView_Card';\n\t}\n}\n","/**\n * This is our theme asset list view manager\n * Call upon this view for an asset list and it will figure out the layout mode\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetListViewManager.html';\n\nimport CardView from './assetListView_card';\n\nconst AssetListViews = {\n\tcard: CardView,\n};\n\nimport customConfig from '../config';\n\nexport default class AssetListViewTypeManager extends Base {\n\t/**\n\t * @override\n\t * @param {object} opts View options\n\t * @listens module:user#user:sort:type\n\t */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'asset-list-wrapper';\n\t\t// No RPC loading indicators for us\n\t\topts.loadingMethods = opts.loadingMethods || [];\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * @memberOf Netx.Views.AssetListViewTypeManager\n\t\t * @alias userPrefKeys\n\t\t * @type {object}\n\t\t */\n\t\tthis.userPrefKeys = _.extend(\n\t\t\t{\n\t\t\t\tlayoutType: 'asset.list.type',\n\t\t\t},\n\t\t\topts.userPrefKeys,\n\t\t);\n\n\t\t/**\n\t\t * @memberOf Netx.Views.AssetListView\n\t\t * @alias subViewOptions\n\t\t * @type {object}\n\t\t */\n\t\tthis.subViewOptions = _.extend(\n\t\t\t{\n\t\t\t\tcollection: this.collection,\n\t\t\t},\n\t\t\topts.subViewOptions,\n\t\t);\n\n\t\t/**\n\t\t * @memberOf Netx.Views.AssetListView\n\t\t * @alias currentLayoutType\n\t\t * @type {string}\n\t\t */\n\t\tthis.currentLayoutType =\n\t\t\tNetx.getPreference(this.userPrefKeys.layoutType) || 'list';\n\n\t\t// Hey, listen!\n\t\t// Respond to user preference changes for how we are styled:\n\t\tthis.listenTo(dispatcher, 'user:sort:type', (type) => {\n\t\t\tthis.$el.removeClass(customConfig.LIST_TYPE.join(' ')).addClass(type);\n\n\t\t\tconst typeChanged = this.currentLayoutType !== type;\n\n\t\t\tthis.currentLayoutType = type;\n\n\t\t\tif (!typeChanged) return;\n\t\t\tthis.removeAssetListView();\n\t\t\tthis.isShown && this.injectAssetListView();\n\t\t});\n\n\t\t// Reset horizontal scroll when first syncing, but not subsequent chunks\n\t\tthis.listenTo(\n\t\t\tthis.collection,\n\t\t\t'request:read',\n\t\t\t(collection, assetArr, syncObj) => {\n\t\t\t\tif (!syncObj.chunk) {\n\t\t\t\t\tthis.resetHorizontalScroll();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\t// Cleanup\n\t\tthis.removeAssetListView();\n\n\t\tsuper.preRender();\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$assetListView = this.$('.nx-asset-list');\n\n\t\t// When we are shown\n\t\tthis.whenShown.then(() => {\n\t\t\tthis.injectAssetListView();\n\t\t\t// Inject pager\n\t\t\tthis.addPagerView();\n\n\t\t\t// Cache parent after injection\n\t\t\tthis.$galleryView = this.$el.closest('.gallery-view');\n\t\t});\n\t}\n\n\t/** @override */\n\tafterShown(view) {\n\t\tsuper.afterShown(view);\n\n\t\tthis.renderedOnce && !this.assetListView && this.injectAssetListView();\n\t}\n\n\t/** @method */\n\tremoveAssetListView() {\n\t\tif (!this.assetListView) return;\n\t\tthis.assetListView.remove();\n\t\tdelete this.assetListView;\n\n\t\tthis.resetHorizontalScroll();\n\t}\n\n\t/** @method */\n\tinjectAssetListView() {\n\t\tthis.$el.addClass('preparing-layout');\n\t\t// Possible outcomes\n\t\t// Netx.Views.AssetListView_card\n\t\tthis.rendered.then(() => {\n\t\t\tif (!this.assetListView) {\n\t\t\t\tthis.assetListView = this.addSubView(\n\t\t\t\t\tnew AssetListViews[this.currentLayoutType](\n\t\t\t\t\t\t_.clone(this.subViewOptions),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.$assetListView.append(this.assetListView.$el);\n\t\t\t\tthis.assetListView.render().show();\n\t\t\t}\n\t\t\tthis.assetListView.rendered.then(() => {\n\t\t\t\tthis.$el.removeClass('preparing-layout');\n\t\t\t});\n\n\t\t\t// DAM-16273 scroll to left when switching attribute sets\n\t\t\tthis.assetListView.on('rendered', () => {\n\t\t\t\tthis.resetHorizontalScroll();\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * DAM-15990 - Horizontal scroll needs to be reset when switching list types and when\n\t * changing categories / searches / carts\n\t */\n\tresetHorizontalScroll() {\n\t\t// DAM-16121 scrolling fails unless it's shown already\n\t\tthis.assetListView &&\n\t\t\tthis.assetListView.whenShown.then(() => {\n\t\t\t\tthis.$galleryView && this.$galleryView.scrollLeft(0);\n\t\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetListViewTypeManager';\n\t}\n}\n","import AppViewModel from '@netx/core-app/models/appView';\nimport {getViewCollection, getViewModel} from '@netx/core/lib/utils';\nimport {isMobile} from '@netx/core/lib/underscore-netx';\n\nimport {assetExpirationEnabled} from '@netx/core-asset/enablers';\n\n// This is an asyncronous enabler; it returns true for now, but adjusts after sync\nexport const assetInCart = v => {\n\tconst model = getViewModel(v);\n\tif (!model) return true;\n\n\t// miniAssets have a boolean attribute for this.\n\tif (model.has('inCurrentCart')) {\n\t\treturn model.get('inCurrentCart');\n\t}\n\n\t// assets cache their state knowlege here.\n\tif (_.isBoolean(model.inCurrentCart)) {\n\t\treturn model.inCurrentCart;\n\t}\n\n\t// Netx.cart.current is not guaranteed to have all the cart contents, but it may have this one.\n\t// const currentCart = Netx.getCurrentCart();\n\t// if (currentCart.get(model.id)) {\n\t// \treturn true;\n\t// }\n\n\t// We still know nothing; we have to ask the DAM.\n\t// if (typeof model.assetInCurrentCart === 'function') {\n\t// \treturn true; // for now ... but we should know more at sync.\n\t// } else {\n\t// \treturn true; // for collection views, don't get fancy.\n\t// }\n\n\treturn true;\n};\n\nexport const assetNotInCart = v => {\n\tconst model = getViewModel(v);\n\t// Support appViewModel - things like tabs and crumbs utilize the actual appViewModel - but when the event comes from one\n\t// we are actually wanting to know about the related view's model\n\tconst view = model && model.isAppView ? model.get('view') : v;\n\treturn !assetInCart(view);\n};\n\nexport const assetsAreSelected = v => {\n\tconst currentCart = Netx.getCurrentCart();\n\treturn currentCart && currentCart.assetCount();\n};\n\n/**\n * Can we manage archives\n * @method\n * @returns {boolean}\n */\nexport const canManageArchive = v => {\n\treturn Netx.getPreference('glacier.archiveEnabled', true);\n};\n\nexport const canManageAssetExpiration = v => {\n\tif (!assetExpirationEnabled(v)) {\n\t\treturn false;\n\t}\n\n\tconst model = getViewModel(v);\n\t// Must have at least 1 item\n\treturn model && model.get('contentCount') > 0;\n};\n\nexport const canAddAssetsToCart = v => {\n\tconst currentCart = Netx.getCurrentCart();\n\t// Not in current collection and has selection\n\treturn (\n\t\twindow.location.hash !== '#cart' && currentCart && currentCart.assetCount()\n\t);\n};\n\nexport const canRemoveAssetFromSavedCart = v => {\n\tif (!window.location.hash.includes('cart-assets')) return false;\n\n\tconst savedCart = Netx.cart.gallery.savedCart;\n\treturn savedCart && savedCart.allows('write');\n};\n\nexport const canRemoveSelectedAssetsFromSavedCart = v => {\n\tconst savedCartId = Netx.cart.gallery.id;\n\tif (!savedCartId || !window.location.hash.includes('cart-assets'))\n\t\treturn false;\n\n\t// Find the cart model\n\tconst cart = Netx.getSavedCart(savedCartId);\n\t// We must have write permission\n\treturn cart && cart.canEdit();\n};\n\n/**\n * Can user remove a cart permission\n * @param {Backbone.View} v Backbone view\n * @return {boolean}\n */\nexport const canRemoveCartPermission = v => {\n\treturn v.model && v.model.allows('manage');\n};\n\n/**\n * @function\n * @return {boolean}\n */\nexport const canRepurpose = v => {\n\tconst collection = getViewCollection(v);\n\tif (!collection) return;\n\n\t// DAM-13617, DAM-15373\n\treturn collection.assetCount() > 0 && !isMobile();\n};\n\n/**\n * Create TMS object\n * @method\n */\nexport const cartCanCreateTMSObject = v => {\n\treturn (\n\t\tNetx.getPreference('tms.webserviceEndpoint') != null &&\n\t\tNetx.getPreference('tms.actionMessage') != null\n\t);\n};\n\n/*\n * Unfortunately, this property only exists on MaxiAssets (assetBeans); MiniAssets (assetListBeans) don't have it.\n * So this enabler is not as useful as it could be ...\n */\nexport const collectionCanRepurpose = v => {\n\tconst collection = getViewCollection(v);\n\tif (!collection) return;\n\n\treturn collection.models.some(\n\t\tmodel => model.get('repurposeAvailability') > 0,\n\t);\n};\n\n/**\n * The current cart is not empty\n */\nexport const currentCartNotEmpty = v => {\n\tconst currentCart = Netx.getCurrentCart();\n\treturn currentCart && currentCart.assetCount();\n};\n","export * from '@netx/core-cart/enablers';\nimport {getViewModel} from '@netx/core/lib/utils';\n/**\n * @function\n * @param {module:core/lib/netx-view} view View\n * @return {boolean}\n */\nexport const canAddAssetsToCart = (view) => {\n\t// Not in current collection and has selection\n\treturn (\n\t\twindow.location.hash !== '#cart' &&\n\t\tNetx.cart.current &&\n\t\tNetx.cart.current.length\n\t);\n};\n\n/**\n * @function\n * @param {module:core/lib/netx-view} view View\n * @return {boolean}\n */\nexport const canRemoveAssetFromSavedCart = (view) => {\n\tif (!window.location.hash.includes('cart-assets')) return false;\n\n\tconst savedCart = Netx.cart.gallery.savedCart;\n\treturn savedCart && savedCart.allows('write');\n};\n\nexport const assetInCart = (v) => {\n\tconst model = getViewModel(v);\n\tif (!model) return true;\n\n\tif (_.isPublicUser()) {\n\t\treturn Netx.cart && Netx.cart.current.isInCart(v.model.id);\n\t}\n\n\t// miniAssets have a boolean attribute for this.\n\tif (model.has('inCurrentCart')) {\n\t\treturn model.get('inCurrentCart');\n\t}\n\n\t// assets cache their state knowlege here.\n\tif (_.isBoolean(model.inCurrentCart)) {\n\t\treturn model.inCurrentCart;\n\t}\n\n\treturn true;\n};\n\nexport const assetNotInCart = (v) => {\n\tconst model = getViewModel(v);\n\n\tif (_.isPublicUser()) {\n\t\treturn Netx.cart && !Netx.cart.current.isInCart(v.model.id);\n\t}\n\n\t// Support appViewModel - things like tabs and crumbs utilize the actual appViewModel - but when the event comes from one\n\t// we are actually wanting to know about the related view's model\n\tconst view = model && model.isAppView ? model.get('view') : v;\n\treturn !assetInCart(view);\n};\n","/**\n * @class\n */\nimport Base from '../models/attribute';\n\nexport default class AssetRequestAtribute extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * The unique ID for this model\n\t * @type {string}\n\t */\n\tget idAttribute() {\n\t\treturn 'attributeid';\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t...super.defaults,\n\t\t\tattributeid: null,\n\t\t\tcaption: '',\n\t\t\t// Our base sets this to 0 be default\n\t\t\t// we will set this as needed when re-ordering\n\t\t\tindex: null,\n\t\t\tlabel: '',\n\t\t\tname: '',\n\t\t\tplaceholder: '',\n\t\t\trequired: false,\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetRequestAttribute';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '../collections/attributes';\nimport Model from '../models/assetRequestAttribute';\n\nexport default class AssetRequestAttributes extends Base {\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t// We want to maintain the order we send and receive these in\n\t\tthis.comparator = null;\n\t}\n\n\t/**\n\t * Retrive model values as a parallel array\n\t * @method\n\t * @return {object} Parallel arrays\n\t */\n\tgetParallelArrays() {\n\t\treturn {\n\t\t\tattributeCaptions: this.pluck('caption'),\n\t\t\tattributeLabels: this.pluck('label'),\n\t\t\tattributeNames: this.pluck('name'),\n\t\t\tattributePlaceholders: this.pluck('placeholder'),\n\t\t\tattributeRequired: this.pluck('required'),\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetRequestAttributes';\n\t}\n}\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports,require(\"react\")):\"function\"==typeof define&&define.amd?define([\"exports\",\"react\"],t):t((e=e||self).ReactTable={},e.React)}(this,(function(e,t){\"use strict\";function n(e,t,n,o,r,i,u){try{var l=e[i](u),s=l.value}catch(e){return void n(e)}l.done?t(s):Promise.resolve(s).then(o,r)}function o(e){return function(){var t=this,o=arguments;return new Promise((function(r,i){var u=e.apply(t,o);function l(e){n(u,r,i,l,s,\"next\",e)}function s(e){n(u,r,i,l,s,\"throw\",e)}l(void 0)}))}}function r(){return(r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}function i(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function u(e){var t=function(e,t){if(\"object\"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||\"default\");if(\"object\"!=typeof o)return o;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return(\"string\"===t?String:Number)(e)}(e,\"string\");return\"symbol\"==typeof t?t:String(t)}t=t&&Object.prototype.hasOwnProperty.call(t,\"default\")?t.default:t;var l={init:\"init\"},s=function(e){var t=e.value;return void 0===t?\"\":t},a=function(){return t.createElement(t.Fragment,null,\" \")},c={Cell:s,width:150,minWidth:0,maxWidth:Number.MAX_SAFE_INTEGER};function d(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.reduce((function(e,t){var n=t.style,o=t.className;return e=r({},e,{},i(t,[\"style\",\"className\"])),n&&(e.style=e.style?r({},e.style||{},{},n||{}):n),o&&(e.className=e.className?e.className+\" \"+o:o),\"\"===e.className&&delete e.className,e}),{})}var f=function(e,t){return void 0===t&&(t={}),function(n){return void 0===n&&(n={}),[].concat(e,[n]).reduce((function(e,o){return function e(t,n,o){return\"function\"==typeof n?e({},n(t,o)):Array.isArray(n)?d.apply(void 0,[t].concat(n)):d(t,n)}(e,o,r({},t,{userProps:n}))}),{})}},p=function(e,t,n,o){return void 0===n&&(n={}),e.reduce((function(e,t){return t(e,n)}),t)},g=function(e,t,n){return void 0===n&&(n={}),e.forEach((function(e){e(t,n)}))};function v(e,t,n,o){e.findIndex((function(e){return e.pluginName===n}));t.forEach((function(t){e.findIndex((function(e){return e.pluginName===t}))}))}function m(e,t){return\"function\"==typeof e?e(t):e}function h(e){var n=t.useRef();return n.current=e,t.useCallback((function(){return n.current}),[])}var y=\"undefined\"!=typeof document?t.useLayoutEffect:t.useEffect;function w(e,n){var o=t.useRef(!1);y((function(){o.current&&e(),o.current=!0}),n)}function R(e,t,n){return void 0===n&&(n={}),function(o,i){void 0===i&&(i={});var u=\"string\"==typeof o?t[o]:o;if(void 0===u)throw console.info(t),new Error(\"Renderer Error ☝️\");return b(u,r({},e,{column:t},n,{},i))}}function b(e,n){return function(e){return\"function\"==typeof e&&((t=Object.getPrototypeOf(e)).prototype&&t.prototype.isReactComponent);var t}(o=e)||\"function\"==typeof o||function(e){return\"object\"==typeof e&&\"symbol\"==typeof e.$$typeof&&[\"react.memo\",\"react.forward_ref\"].includes(e.$$typeof.description)}(o)?t.createElement(e,n):e;var o}function S(e,t,n){return void 0===n&&(n=0),e.map((function(e){return x(e=r({},e,{parent:t,depth:n})),e.columns&&(e.columns=S(e.columns,e,n+1)),e}))}function C(e){return G(e,\"columns\")}function x(e){var t=e.id,n=e.accessor,o=e.Header;if(\"string\"==typeof n){t=t||n;var r=n.split(\".\");n=function(e){return function(e,t,n){if(!t)return e;var o,r=\"function\"==typeof t?t:JSON.stringify(t),i=E.get(r)||function(){var e=function(e){return function e(t,n){void 0===n&&(n=[]);if(Array.isArray(t))for(var o=0;o<t.length;o+=1)e(t[o],n);else n.push(t);return n}(e).map((function(e){return String(e).replace(\".\",\"_\")})).join(\".\").replace(W,\".\").replace(O,\"\").split(\".\")}(t);return E.set(r,e),e}();try{o=i.reduce((function(e,t){return e[t]}),e)}catch(e){}return void 0!==o?o:n}(e,r)}}if(!t&&\"string\"==typeof o&&o&&(t=o),!t&&e.columns)throw console.error(e),new Error('A column ID (or unique \"Header\" value) is required!');if(!t)throw console.error(e),new Error(\"A column ID (or string accessor) is required!\");return Object.assign(e,{id:t,accessor:n}),e}function P(e,t){if(!t)throw new Error;return Object.assign(e,r({Header:a,Footer:a},c,{},t,{},e)),Object.assign(e,{originalWidth:e.width}),e}function B(e,t,n){void 0===n&&(n=function(){return{}});for(var o=[],i=e,u=0,l=function(){return u++},s=function(){var e={headers:[]},u=[],s=i.some((function(e){return e.parent}));i.forEach((function(o){var i,a=[].concat(u).reverse()[0];if(s){if(o.parent)i=r({},o.parent,{originalId:o.parent.id,id:o.parent.id+\"_\"+l(),headers:[o]},n(o));else i=P(r({originalId:o.id+\"_placeholder\",id:o.id+\"_placeholder_\"+l(),placeholderOf:o,headers:[o]},n(o)),t);a&&a.originalId===i.originalId?a.headers.push(o):u.push(i)}e.headers.push(o)})),o.push(e),i=u};i.length;)s();return o.reverse()}var E=new Map;function I(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var o=0;o<t.length;o+=1)if(void 0!==t[o])return t[o]}function F(e){if(\"function\"==typeof e)return e}function G(e,t){var n=[];return function e(o){o.forEach((function(o){o[t]?e(o[t]):n.push(o)}))}(e),n}function A(e,t){var n=t.manualExpandedKey,o=t.expanded,r=t.expandSubRows,i=void 0===r||r,u=[];return e.forEach((function(e){return function e(t,r){void 0===r&&(r=!0),t.isExpanded=t.original&&t.original[n]||o[t.id],t.canExpand=t.subRows&&!!t.subRows.length,r&&u.push(t),t.subRows&&t.subRows.length&&t.isExpanded&&t.subRows.forEach((function(t){return e(t,i)}))}(e)})),u}function k(e,t,n){return F(e)||t[e]||n[e]||n.text}function H(e,t,n){return e?e(t,n):void 0===t}function T(){throw new Error(\"React-Table: You have not called prepareRow(row) one or more rows you are attempting to render.\")}var z=null;var W=/\\[/g,O=/\\]/g;var M=function(e){return r({role:\"table\"},e)},j=function(e){return r({role:\"rowgroup\"},e)},N=function(e,t){var n=t.column;return r({key:\"header_\"+n.id,colSpan:n.totalVisibleHeaderCount,role:\"columnheader\"},e)},L=function(e,t){var n=t.column;return r({key:\"footer_\"+n.id,colSpan:n.totalVisibleHeaderCount},e)},D=function(e,t){return r({key:\"headerGroup_\"+t.index,role:\"row\"},e)},V=function(e,t){return r({key:\"footerGroup_\"+t.index},e)},_=function(e,t){return r({key:\"row_\"+t.row.id,role:\"row\"},e)},X=function(e,t){var n=t.cell;return r({key:\"cell_\"+n.row.id+\"_\"+n.column.id,role:\"cell\"},e)};function q(){return{useOptions:[],stateReducers:[],useControlledState:[],columns:[],columnsDeps:[],allColumns:[],allColumnsDeps:[],accessValue:[],materializedColumns:[],materializedColumnsDeps:[],useInstanceAfterData:[],visibleColumns:[],visibleColumnsDeps:[],headerGroups:[],headerGroupsDeps:[],useInstanceBeforeDimensions:[],useInstance:[],prepareRow:[],getTableProps:[M],getTableBodyProps:[j],getHeaderGroupProps:[D],getFooterGroupProps:[V],getHeaderProps:[N],getFooterProps:[L],getRowProps:[_],getCellProps:[X],useFinalInstance:[]}}l.resetHiddenColumns=\"resetHiddenColumns\",l.toggleHideColumn=\"toggleHideColumn\",l.setHiddenColumns=\"setHiddenColumns\",l.toggleHideAllColumns=\"toggleHideAllColumns\";var K=function(e){e.getToggleHiddenProps=[U],e.getToggleHideAllColumnsProps=[$],e.stateReducers.push(J),e.useInstanceBeforeDimensions.push(Y),e.headerGroupsDeps.push((function(e,t){var n=t.instance;return[].concat(e,[n.state.hiddenColumns])})),e.useInstance.push(Q)};K.pluginName=\"useColumnVisibility\";var U=function(e,t){var n=t.column;return[e,{onChange:function(e){n.toggleHidden(!e.target.checked)},style:{cursor:\"pointer\"},checked:n.isVisible,title:\"Toggle Column Visible\"}]},$=function(e,t){var n=t.instance;return[e,{onChange:function(e){n.toggleHideAllColumns(!e.target.checked)},style:{cursor:\"pointer\"},checked:!n.allColumnsHidden&&!n.state.hiddenColumns.length,title:\"Toggle All Columns Hidden\",indeterminate:!n.allColumnsHidden&&n.state.hiddenColumns.length}]};function J(e,t,n,o){if(t.type===l.init)return r({hiddenColumns:[]},e);if(t.type===l.resetHiddenColumns)return r({},e,{hiddenColumns:o.initialState.hiddenColumns||[]});if(t.type===l.toggleHideColumn){var i=(void 0!==t.value?t.value:!e.hiddenColumns.includes(t.columnId))?[].concat(e.hiddenColumns,[t.columnId]):e.hiddenColumns.filter((function(e){return e!==t.columnId}));return r({},e,{hiddenColumns:i})}return t.type===l.setHiddenColumns?r({},e,{hiddenColumns:m(t.value,e.hiddenColumns)}):t.type===l.toggleHideAllColumns?r({},e,{hiddenColumns:(void 0!==t.value?t.value:!e.hiddenColumns.length)?o.allColumns.map((function(e){return e.id})):[]}):void 0}function Y(e){var n=e.headers,o=e.state.hiddenColumns;t.useRef(!1).current;var r=0;n.forEach((function(e){return r+=function e(t,n){t.isVisible=n&&!o.includes(t.id);var r=0;return t.headers&&t.headers.length?t.headers.forEach((function(n){return r+=e(n,t.isVisible)})):r=t.isVisible?1:0,t.totalVisibleHeaderCount=r,r}(e,!0)}))}function Q(e){var n=e.columns,o=e.flatHeaders,r=e.dispatch,i=e.allColumns,u=e.getHooks,s=e.state.hiddenColumns,a=e.autoResetHiddenColumns,c=void 0===a||a,d=h(e),p=i.length===s.length,g=t.useCallback((function(e,t){return r({type:l.toggleHideColumn,columnId:e,value:t})}),[r]),v=t.useCallback((function(e){return r({type:l.setHiddenColumns,value:e})}),[r]),m=t.useCallback((function(e){return r({type:l.toggleHideAllColumns,value:e})}),[r]),y=f(u().getToggleHideAllColumnsProps,{instance:d()});o.forEach((function(e){e.toggleHidden=function(t){r({type:l.toggleHideColumn,columnId:e.id,value:t})},e.getToggleHiddenProps=f(u().getToggleHiddenProps,{instance:d(),column:e})}));var R=h(c);w((function(){R()&&r({type:l.resetHiddenColumns})}),[r,n]),Object.assign(e,{allColumnsHidden:p,toggleHideColumn:g,setHiddenColumns:v,toggleHideAllColumns:m,getToggleHideAllColumnsProps:y})}var Z={},ee={},te=function(e,t,n){return e},ne=function(e,t){return e.subRows||[]},oe=function(e,t,n){return\"\"+(n?[n.id,t].join(\".\"):t)},re=function(e){return e};function ie(e){var t=e.initialState,n=void 0===t?Z:t,o=e.defaultColumn,u=void 0===o?ee:o,l=e.getSubRows,s=void 0===l?ne:l,a=e.getRowId,c=void 0===a?oe:a,d=e.stateReducer,f=void 0===d?te:d,p=e.useControlledState,g=void 0===p?re:p;return r({},i(e,[\"initialState\",\"defaultColumn\",\"getSubRows\",\"getRowId\",\"stateReducer\",\"useControlledState\"]),{initialState:n,defaultColumn:u,getSubRows:s,getRowId:c,stateReducer:f,useControlledState:g})}function ue(e,t){void 0===t&&(t=0);var n=0,o=0,r=0,i=0;return e.forEach((function(e){var u=e.headers;if(e.totalLeft=t,u&&u.length){var l=ue(u,t),s=l[0],a=l[1],c=l[2],d=l[3];e.totalMinWidth=s,e.totalWidth=a,e.totalMaxWidth=c,e.totalFlexWidth=d}else e.totalMinWidth=e.minWidth,e.totalWidth=Math.min(Math.max(e.minWidth,e.width),e.maxWidth),e.totalMaxWidth=e.maxWidth,e.totalFlexWidth=e.canResize?e.totalWidth:0;e.isVisible&&(t+=e.totalWidth,n+=e.totalMinWidth,o+=e.totalWidth,r+=e.totalMaxWidth,i+=e.totalFlexWidth)})),[n,o,r,i]}function le(e){var t=e.data,n=e.rows,o=e.flatRows,r=e.rowsById,i=e.column,u=e.getRowId,l=e.getSubRows,s=e.accessValueHooks,a=e.getInstance;t.forEach((function(e,c){return function e(n,c,d,f,g){void 0===d&&(d=0);var v=n,m=u(n,c,f),h=r[m];if(h)h.subRows&&h.originalSubRows.forEach((function(t,n){return e(t,n,d+1,h)}));else if((h={id:m,original:v,index:c,depth:d,cells:[{}]}).cells.map=T,h.cells.filter=T,h.cells.forEach=T,h.cells[0].getCellProps=T,h.values={},g.push(h),o.push(h),r[m]=h,h.originalSubRows=l(n,c),h.originalSubRows){var y=[];h.originalSubRows.forEach((function(t,n){return e(t,n,d+1,h,y)})),h.subRows=y}i.accessor&&(h.values[i.id]=i.accessor(n,c,h,g,t)),h.values[i.id]=p(s,h.values[i.id],{row:h,column:i,instance:a()})}(e,c,0,void 0,n)}))}l.resetExpanded=\"resetExpanded\",l.toggleRowExpanded=\"toggleRowExpanded\",l.toggleAllRowsExpanded=\"toggleAllRowsExpanded\";var se=function(e){e.getToggleAllRowsExpandedProps=[ae],e.getToggleRowExpandedProps=[ce],e.stateReducers.push(de),e.useInstance.push(fe),e.prepareRow.push(pe)};se.pluginName=\"useExpanded\";var ae=function(e,t){var n=t.instance;return[e,{onClick:function(e){n.toggleAllRowsExpanded()},style:{cursor:\"pointer\"},title:\"Toggle All Rows Expanded\"}]},ce=function(e,t){var n=t.row;return[e,{onClick:function(){n.toggleRowExpanded()},style:{cursor:\"pointer\"},title:\"Toggle Row Expanded\"}]};function de(e,t,n,o){if(t.type===l.init)return r({expanded:{}},e);if(t.type===l.resetExpanded)return r({},e,{expanded:o.initialState.expanded||{}});if(t.type===l.toggleAllRowsExpanded){var s=t.value,a=o.isAllRowsExpanded,c=o.rowsById;if(void 0!==s?s:!a){var d={};return Object.keys(c).forEach((function(e){d[e]=!0})),r({},e,{expanded:d})}return r({},e,{expanded:{}})}if(t.type===l.toggleRowExpanded){var f,p=t.id,g=t.value,v=e.expanded[p],m=void 0!==g?g:!v;if(!v&&m)return r({},e,{expanded:r({},e.expanded,(f={},f[p]=!0,f))});if(v&&!m){var h=e.expanded;h[p];return r({},e,{expanded:i(h,[p].map(u))})}return e}}function fe(e){var n=e.data,o=e.rows,r=e.rowsById,i=e.manualExpandedKey,u=void 0===i?\"expanded\":i,s=e.paginateExpandedRows,a=void 0===s||s,c=e.expandSubRows,d=void 0===c||c,p=e.autoResetExpanded,g=void 0===p||p,m=e.getHooks,y=e.plugins,R=e.state.expanded,b=e.dispatch;v(y,[\"useSortBy\",\"useGroupBy\",\"usePivotColumns\",\"useGlobalFilter\"],\"useExpanded\");var S=h(g),C=Boolean(Object.keys(r).length&&Object.keys(R).length);C&&Object.keys(r).some((function(e){return!R[e]}))&&(C=!1),w((function(){S()&&b({type:l.resetExpanded})}),[b,n]);var x=t.useCallback((function(e,t){b({type:l.toggleRowExpanded,id:e,value:t})}),[b]),P=t.useCallback((function(e){return b({type:l.toggleAllRowsExpanded,value:e})}),[b]),B=t.useMemo((function(){return a?A(o,{manualExpandedKey:u,expanded:R,expandSubRows:d}):o}),[a,o,u,R,d]),E=t.useMemo((function(){return function(e){var t=0;return Object.keys(e).forEach((function(e){var n=e.split(\".\");t=Math.max(t,n.length)})),t}(R)}),[R]),I=h(e),F=f(m().getToggleAllRowsExpandedProps,{instance:I()});Object.assign(e,{preExpandedRows:o,expandedRows:B,rows:B,expandedDepth:E,isAllRowsExpanded:C,toggleRowExpanded:x,toggleAllRowsExpanded:P,getToggleAllRowsExpandedProps:F})}function pe(e,t){var n=t.instance.getHooks,o=t.instance;e.toggleRowExpanded=function(t){return o.toggleRowExpanded(e.id,t)},e.getToggleRowExpandedProps=f(n().getToggleRowExpandedProps,{instance:o,row:e})}var ge=function(e,t,n){return e=e.filter((function(e){return t.some((function(t){var o=e.values[t];return String(o).toLowerCase().includes(String(n).toLowerCase())}))}))};ge.autoRemove=function(e){return!e};var ve=function(e,t,n){return e.filter((function(e){return t.some((function(t){var o=e.values[t];return void 0===o||String(o).toLowerCase()===String(n).toLowerCase()}))}))};ve.autoRemove=function(e){return!e};var me=function(e,t,n){return e.filter((function(e){return t.some((function(t){var o=e.values[t];return void 0===o||String(o)===String(n)}))}))};me.autoRemove=function(e){return!e};var he=function(e,t,n){return e.filter((function(e){return t.some((function(t){return e.values[t].includes(n)}))}))};he.autoRemove=function(e){return!e||!e.length};var ye=function(e,t,n){return e.filter((function(e){return t.some((function(t){var o=e.values[t];return o&&o.length&&n.every((function(e){return o.includes(e)}))}))}))};ye.autoRemove=function(e){return!e||!e.length};var we=function(e,t,n){return e.filter((function(e){return t.some((function(t){var o=e.values[t];return o&&o.length&&n.some((function(e){return o.includes(e)}))}))}))};we.autoRemove=function(e){return!e||!e.length};var Re=function(e,t,n){return e.filter((function(e){return t.some((function(t){var o=e.values[t];return n.includes(o)}))}))};Re.autoRemove=function(e){return!e||!e.length};var be=function(e,t,n){return e.filter((function(e){return t.some((function(t){return e.values[t]===n}))}))};be.autoRemove=function(e){return void 0===e};var Se=function(e,t,n){return e.filter((function(e){return t.some((function(t){return e.values[t]==n}))}))};Se.autoRemove=function(e){return null==e};var Ce=function(e,t,n){var o=n||[],r=o[0],i=o[1];if((r=\"number\"==typeof r?r:-1/0)>(i=\"number\"==typeof i?i:1/0)){var u=r;r=i,i=u}return e.filter((function(e){return t.some((function(t){var n=e.values[t];return n>=r&&n<=i}))}))};Ce.autoRemove=function(e){return!e||\"number\"!=typeof e[0]&&\"number\"!=typeof e[1]};var xe=Object.freeze({__proto__:null,text:ge,exactText:ve,exactTextCase:me,includes:he,includesAll:ye,includesSome:we,includesValue:Re,exact:be,equals:Se,between:Ce});l.resetFilters=\"resetFilters\",l.setFilter=\"setFilter\",l.setAllFilters=\"setAllFilters\";var Pe=function(e){e.stateReducers.push(Be),e.useInstance.push(Ee)};function Be(e,t,n,o){if(t.type===l.init)return r({filters:[]},e);if(t.type===l.resetFilters)return r({},e,{filters:o.initialState.filters||[]});if(t.type===l.setFilter){var i=t.columnId,u=t.filterValue,s=o.allColumns,a=o.filterTypes,c=s.find((function(e){return e.id===i}));if(!c)throw new Error(\"React-Table: Could not find a column with id: \"+i);var d=k(c.filter,a||{},xe),f=e.filters.find((function(e){return e.id===i})),p=m(u,f&&f.value);return H(d.autoRemove,p,c)?r({},e,{filters:e.filters.filter((function(e){return e.id!==i}))}):r({},e,f?{filters:e.filters.map((function(e){return e.id===i?{id:i,value:p}:e}))}:{filters:[].concat(e.filters,[{id:i,value:p}])})}if(t.type===l.setAllFilters){var g=t.filters,v=o.allColumns,h=o.filterTypes;return r({},e,{filters:m(g,e.filters).filter((function(e){var t=v.find((function(t){return t.id===e.id}));return!H(k(t.filter,h||{},xe).autoRemove,e.value,t)}))})}}function Ee(e){var n=e.data,o=e.rows,r=e.flatRows,i=e.rowsById,u=e.allColumns,s=e.filterTypes,a=e.manualFilters,c=e.defaultCanFilter,d=void 0!==c&&c,f=e.disableFilters,p=e.state.filters,g=e.dispatch,v=e.autoResetFilters,m=void 0===v||v,y=t.useCallback((function(e,t){g({type:l.setFilter,columnId:e,filterValue:t})}),[g]),R=t.useCallback((function(e){g({type:l.setAllFilters,filters:e})}),[g]);u.forEach((function(e){var t=e.id,n=e.accessor,o=e.defaultCanFilter,r=e.disableFilters;e.canFilter=n?I(!0!==r&&void 0,!0!==f&&void 0,!0):I(o,d,!1),e.setFilter=function(t){return y(e.id,t)};var i=p.find((function(e){return e.id===t}));e.filterValue=i&&i.value}));var b=t.useMemo((function(){if(a||!p.length)return[o,r,i];var e=[],t={};return[function n(o,r){void 0===r&&(r=0);var i=o;return(i=p.reduce((function(e,t){var n=t.id,o=t.value,i=u.find((function(e){return e.id===n}));if(!i)return e;0===r&&(i.preFilteredRows=e);var l=k(i.filter,s||{},xe);return l?(i.filteredRows=l(e,[n],o),i.filteredRows):(console.warn(\"Could not find a valid 'column.filter' for column with the ID: \"+i.id+\".\"),e)}),o)).forEach((function(o){e.push(o),t[o.id]=o,o.subRows&&(o.subRows=o.subRows&&o.subRows.length>0?n(o.subRows,r+1):o.subRows)})),i}(o),e,t]}),[a,p,o,r,i,u,s]),S=b[0],C=b[1],x=b[2];t.useMemo((function(){u.filter((function(e){return!p.find((function(t){return t.id===e.id}))})).forEach((function(e){e.preFilteredRows=S,e.filteredRows=S}))}),[S,p,u]);var P=h(m);w((function(){P()&&g({type:l.resetFilters})}),[g,a?null:n]),Object.assign(e,{preFilteredRows:o,preFilteredFlatRows:r,preFilteredRowsById:i,filteredRows:S,filteredFlatRows:C,filteredRowsById:x,rows:S,flatRows:C,rowsById:x,setFilter:y,setAllFilters:R})}Pe.pluginName=\"useFilters\",l.resetGlobalFilter=\"resetGlobalFilter\",l.setGlobalFilter=\"setGlobalFilter\";var Ie=function(e){e.stateReducers.push(Fe),e.useInstance.push(Ge)};function Fe(e,t,n,o){if(t.type===l.resetGlobalFilter)return r({},e,{globalFilter:o.initialState.globalFilter||void 0});if(t.type===l.setGlobalFilter){var u=t.filterValue,s=o.userFilterTypes,a=k(o.globalFilter,s||{},xe),c=m(u,e.globalFilter);if(H(a.autoRemove,c)){e.globalFilter;return i(e,[\"globalFilter\"])}return r({},e,{globalFilter:c})}}function Ge(e){var n=e.data,o=e.rows,r=e.flatRows,i=e.rowsById,u=e.allColumns,s=e.filterTypes,a=e.globalFilter,c=e.manualGlobalFilter,d=e.state.globalFilter,f=e.dispatch,p=e.autoResetGlobalFilter,g=void 0===p||p,v=e.disableGlobalFilter,m=t.useCallback((function(e){f({type:l.setGlobalFilter,filterValue:e})}),[f]),y=t.useMemo((function(){if(c||void 0===d)return[o,r,i];var e=[],t={},n=k(a,s||{},xe);if(!n)return console.warn(\"Could not find a valid 'globalFilter' option.\"),o;u.forEach((function(e){var t=e.disableGlobalFilter;e.canFilter=I(!0!==t&&void 0,!0!==v&&void 0,!0)}));var l=u.filter((function(e){return!0===e.canFilter}));return[function o(r){return(r=n(r,l.map((function(e){return e.id})),d)).forEach((function(n){e.push(n),t[n.id]=n,n.subRows=n.subRows&&n.subRows.length?o(n.subRows):n.subRows})),r}(o),e,t]}),[c,d,a,s,u,o,r,i,v]),R=y[0],b=y[1],S=y[2],C=h(g);w((function(){C()&&f({type:l.resetGlobalFilter})}),[f,c?null:n]),Object.assign(e,{preGlobalFilteredRows:o,preGlobalFilteredFlatRows:r,preGlobalFilteredRowsById:i,globalFilteredRows:R,globalFilteredFlatRows:b,globalFilteredRowsById:S,rows:R,flatRows:b,rowsById:S,setGlobalFilter:m,disableGlobalFilter:v})}function Ae(e,t){return t.reduce((function(e,t){return e+(\"number\"==typeof t?t:0)}),0)}Ie.pluginName=\"useGlobalFilter\";var ke=Object.freeze({__proto__:null,sum:Ae,min:function(e){var t=e[0]||0;return e.forEach((function(e){\"number\"==typeof e&&(t=Math.min(t,e))})),t},max:function(e){var t=e[0]||0;return e.forEach((function(e){\"number\"==typeof e&&(t=Math.max(t,e))})),t},minMax:function(e){var t=e[0]||0,n=e[0]||0;return e.forEach((function(e){\"number\"==typeof e&&(t=Math.min(t,e),n=Math.max(n,e))})),t+\"..\"+n},average:function(e){return Ae(0,e)/e.length},median:function(e){if(!e.length)return null;var t=Math.floor(e.length/2),n=[].concat(e).sort((function(e,t){return e-t}));return e.length%2!=0?n[t]:(n[t-1]+n[t])/2},unique:function(e){return Array.from(new Set(e).values())},uniqueCount:function(e){return new Set(e).size},count:function(e){return e.length}}),He=[],Te={};l.resetGroupBy=\"resetGroupBy\",l.setGroupBy=\"setGroupBy\",l.toggleGroupBy=\"toggleGroupBy\";var ze=function(e){e.getGroupByToggleProps=[We],e.stateReducers.push(Oe),e.visibleColumnsDeps.push((function(e,t){var n=t.instance;return[].concat(e,[n.state.groupBy])})),e.visibleColumns.push(Me),e.useInstance.push(Ne),e.prepareRow.push(Le)};ze.pluginName=\"useGroupBy\";var We=function(e,t){var n=t.header;return[e,{onClick:n.canGroupBy?function(e){e.persist(),n.toggleGroupBy()}:void 0,style:{cursor:n.canGroupBy?\"pointer\":void 0},title:\"Toggle GroupBy\"}]};function Oe(e,t,n,o){if(t.type===l.init)return r({groupBy:[]},e);if(t.type===l.resetGroupBy)return r({},e,{groupBy:o.initialState.groupBy||[]});if(t.type===l.setGroupBy)return r({},e,{groupBy:t.value});if(t.type===l.toggleGroupBy){var i=t.columnId,u=t.value,s=void 0!==u?u:!e.groupBy.includes(i);return r({},e,s?{groupBy:[].concat(e.groupBy,[i])}:{groupBy:e.groupBy.filter((function(e){return e!==i}))})}}function Me(e,t){var n=t.instance.state.groupBy,o=n.map((function(t){return e.find((function(e){return e.id===t}))})).filter(Boolean),r=e.filter((function(e){return!n.includes(e.id)}));return(e=[].concat(o,r)).forEach((function(e){e.isGrouped=n.includes(e.id),e.groupedIndex=n.indexOf(e.id)})),e}var je={};function Ne(e){var n=e.data,o=e.rows,r=e.flatRows,i=e.rowsById,u=e.allColumns,s=e.flatHeaders,a=e.groupByFn,c=void 0===a?De:a,d=e.manualGroupBy,p=e.aggregations,g=void 0===p?je:p,m=e.plugins,y=e.state.groupBy,R=e.dispatch,b=e.autoResetGroupBy,S=void 0===b||b,C=e.disableGroupBy,x=e.defaultCanGroupBy,P=e.getHooks;v(m,[\"useColumnOrder\",\"useFilters\"],\"useGroupBy\");var B=h(e);u.forEach((function(t){var n=t.accessor,o=t.defaultGroupBy,r=t.disableGroupBy;t.canGroupBy=n?I(t.canGroupBy,!0!==r&&void 0,!0!==C&&void 0,!0):I(t.canGroupBy,o,x,!1),t.canGroupBy&&(t.toggleGroupBy=function(){return e.toggleGroupBy(t.id)}),t.Aggregated=t.Aggregated||t.Cell}));var E=t.useCallback((function(e,t){R({type:l.toggleGroupBy,columnId:e,value:t})}),[R]),F=t.useCallback((function(e){R({type:l.setGroupBy,value:e})}),[R]);s.forEach((function(e){e.getGroupByToggleProps=f(P().getGroupByToggleProps,{instance:B(),header:e})}));var A=t.useMemo((function(){if(d||!y.length)return[o,r,i,He,Te,r,i];var e=y.filter((function(e){return u.find((function(t){return t.id===e}))})),t=[],n={},l=[],s={},a=[],f={},p=function o(r,i,d){if(void 0===i&&(i=0),i===e.length)return r;var p=e[i],v=c(r,p);return Object.entries(v).map((function(r,c){var v=r[0],m=r[1],h=p+\":\"+v,y=o(m,i+1,h=d?d+\">\"+h:h),w=i?G(m,\"leafRows\"):m,R=function(t,n,o){var r={};return u.forEach((function(i){if(e.includes(i.id))r[i.id]=n[0]?n[0].values[i.id]:null;else{var u=\"function\"==typeof i.aggregate?i.aggregate:g[i.aggregate]||ke[i.aggregate];if(u){var l=n.map((function(e){return e.values[i.id]})),s=t.map((function(e){var t=e.values[i.id];if(!o&&i.aggregateValue){var n=\"function\"==typeof i.aggregateValue?i.aggregateValue:g[i.aggregateValue]||ke[i.aggregateValue];if(!n)throw console.info({column:i}),new Error(\"React Table: Invalid column.aggregateValue option for column listed above\");t=n(t,e,i)}return t}));r[i.id]=u(s,l)}else{if(i.aggregate)throw console.info({column:i}),new Error(\"React Table: Invalid column.aggregate option for column listed above\");r[i.id]=null}}})),r}(w,m,i),b={id:h,isGrouped:!0,groupByID:p,groupByVal:v,values:R,subRows:y,leafRows:w,depth:i,index:c};return y.forEach((function(e){t.push(e),n[e.id]=e,e.isGrouped?(l.push(e),s[e.id]=e):(a.push(e),f[e.id]=e)})),b}))}(o);return p.forEach((function(e){t.push(e),n[e.id]=e,e.isGrouped?(l.push(e),s[e.id]=e):(a.push(e),f[e.id]=e)})),[p,t,n,l,s,a,f]}),[d,y,o,r,i,u,g,c]),k=A[0],H=A[1],T=A[2],z=A[3],W=A[4],O=A[5],M=A[6],j=h(S);w((function(){j()&&R({type:l.resetGroupBy})}),[R,d?null:n]),Object.assign(e,{preGroupedRows:o,preGroupedFlatRow:r,preGroupedRowsById:i,groupedRows:k,groupedFlatRows:H,groupedRowsById:T,onlyGroupedFlatRows:z,onlyGroupedRowsById:W,nonGroupedFlatRows:O,nonGroupedRowsById:M,rows:k,flatRows:H,rowsById:T,toggleGroupBy:E,setGroupBy:F})}function Le(e){e.allCells.forEach((function(t){var n;t.isGrouped=t.column.isGrouped&&t.column.id===e.groupByID,t.isPlaceholder=!t.isGrouped&&t.column.isGrouped,t.isAggregated=!t.isGrouped&&!t.isPlaceholder&&(null==(n=e.subRows)?void 0:n.length)}))}function De(e,t){return e.reduce((function(e,n,o){var r=\"\"+n.values[t];return e[r]=Array.isArray(e[r])?e[r]:[],e[r].push(n),e}),{})}var Ve=/([0-9]+)/gm;function _e(e,t){return e===t?0:e>t?1:-1}function Xe(e,t,n){return[e.values[n],t.values[n]]}function qe(e){return\"number\"==typeof e?isNaN(e)||e===1/0||e===-1/0?\"\":String(e):\"string\"==typeof e?e:\"\"}var Ke=Object.freeze({__proto__:null,alphanumeric:function(e,t,n){var o=Xe(e,t,n),r=o[0],i=o[1];for(r=qe(r),i=qe(i),r=r.split(Ve).filter(Boolean),i=i.split(Ve).filter(Boolean);r.length&&i.length;){var u=r.shift(),l=i.shift(),s=parseInt(u,10),a=parseInt(l,10),c=[s,a].sort();if(isNaN(c[0])){if(u>l)return 1;if(l>u)return-1}else{if(isNaN(c[1]))return isNaN(s)?-1:1;if(s>a)return 1;if(a>s)return-1}}return r.length-i.length},datetime:function(e,t,n){var o=Xe(e,t,n),r=o[0],i=o[1];return _e(r=r.getTime(),i=i.getTime())},basic:function(e,t,n){var o=Xe(e,t,n);return _e(o[0],o[1])},string:function(e,t,n){var o=Xe(e,t,n),r=o[0],i=o[1];for(r=r.split(\"\").filter(Boolean),i=i.split(\"\").filter(Boolean);r.length&&i.length;){var u=r.shift(),l=i.shift(),s=u.toLowerCase(),a=l.toLowerCase();if(s>a)return 1;if(a>s)return-1;if(u>l)return 1;if(l>u)return-1}return r.length-i.length},number:function(e,t,n){var o=Xe(e,t,n),r=o[0],i=o[1],u=/[^0-9.]/gi;return _e(r=Number(String(r).replace(u,\"\")),i=Number(String(i).replace(u,\"\")))}});l.resetSortBy=\"resetSortBy\",l.setSortBy=\"setSortBy\",l.toggleSortBy=\"toggleSortBy\",l.clearSortBy=\"clearSortBy\",c.sortType=\"alphanumeric\",c.sortDescFirst=!1;var Ue=function(e){e.getSortByToggleProps=[$e],e.stateReducers.push(Je),e.useInstance.push(Ye)};Ue.pluginName=\"useSortBy\";var $e=function(e,t){var n=t.instance,o=t.column,r=n.isMultiSortEvent,i=void 0===r?function(e){return e.shiftKey}:r;return[e,{onClick:o.canSort?function(e){e.persist(),o.toggleSortBy(void 0,!n.disableMultiSort&&i(e))}:void 0,style:{cursor:o.canSort?\"pointer\":void 0},title:o.canSort?\"Toggle SortBy\":void 0}]};function Je(e,t,n,o){if(t.type===l.init)return r({sortBy:[]},e);if(t.type===l.resetSortBy)return r({},e,{sortBy:o.initialState.sortBy||[]});if(t.type===l.clearSortBy)return r({},e,{sortBy:e.sortBy.filter((function(e){return e.id!==t.columnId}))});if(t.type===l.setSortBy)return r({},e,{sortBy:t.sortBy});if(t.type===l.toggleSortBy){var i,u=t.columnId,s=t.desc,a=t.multi,c=o.allColumns,d=o.disableMultiSort,f=o.disableSortRemove,p=o.disableMultiRemove,g=o.maxMultiSortColCount,v=void 0===g?Number.MAX_SAFE_INTEGER:g,m=e.sortBy,h=c.find((function(e){return e.id===u})).sortDescFirst,y=m.find((function(e){return e.id===u})),w=m.findIndex((function(e){return e.id===u})),R=null!=s,b=[];return\"toggle\"!==(i=!d&&a?y?\"toggle\":\"add\":w!==m.length-1||1!==m.length?\"replace\":y?\"toggle\":\"replace\")||f||R||a&&p||!(y&&y.desc&&!h||!y.desc&&h)||(i=\"remove\"),\"replace\"===i?b=[{id:u,desc:R?s:h}]:\"add\"===i?(b=[].concat(m,[{id:u,desc:R?s:h}])).splice(0,b.length-v):\"toggle\"===i?b=m.map((function(e){return e.id===u?r({},e,{desc:R?s:!y.desc}):e})):\"remove\"===i&&(b=m.filter((function(e){return e.id!==u}))),r({},e,{sortBy:b})}}function Ye(e){var n=e.data,o=e.rows,r=e.flatRows,i=e.allColumns,u=e.orderByFn,s=void 0===u?Qe:u,a=e.sortTypes,c=e.manualSortBy,d=e.defaultCanSort,p=e.disableSortBy,g=e.flatHeaders,m=e.state.sortBy,y=e.dispatch,R=e.plugins,b=e.getHooks,S=e.autoResetSortBy,C=void 0===S||S;v(R,[\"useFilters\",\"useGlobalFilter\",\"useGroupBy\",\"usePivotColumns\"],\"useSortBy\");var x=t.useCallback((function(e){y({type:l.setSortBy,sortBy:e})}),[y]),P=t.useCallback((function(e,t,n){y({type:l.toggleSortBy,columnId:e,desc:t,multi:n})}),[y]),B=h(e);g.forEach((function(e){var t=e.accessor,n=e.canSort,o=e.disableSortBy,r=e.id,i=t?I(!0!==o&&void 0,!0!==p&&void 0,!0):I(d,n,!1);e.canSort=i,e.canSort&&(e.toggleSortBy=function(t,n){return P(e.id,t,n)},e.clearSortBy=function(){y({type:l.clearSortBy,columnId:e.id})}),e.getSortByToggleProps=f(b().getSortByToggleProps,{instance:B(),column:e});var u=m.find((function(e){return e.id===r}));e.isSorted=!!u,e.sortedIndex=m.findIndex((function(e){return e.id===r})),e.isSortedDesc=e.isSorted?u.desc:void 0}));var E=t.useMemo((function(){if(c||!m.length)return[o,r];var e=[],t=m.filter((function(e){return i.find((function(t){return t.id===e.id}))}));return[function n(o){var r=s(o,t.map((function(e){var t=i.find((function(t){return t.id===e.id}));if(!t)throw new Error(\"React-Table: Could not find a column with id: \"+e.id+\" while sorting\");var n=t.sortType,o=F(n)||(a||{})[n]||Ke[n];if(!o)throw new Error(\"React-Table: Could not find a valid sortType of '\"+n+\"' for column '\"+e.id+\"'.\");return function(t,n){return o(t,n,e.id,e.desc)}})),t.map((function(e){var t=i.find((function(t){return t.id===e.id}));return t&&t.sortInverted?e.desc:!e.desc})));return r.forEach((function(t){e.push(t),t.subRows&&0!==t.subRows.length&&(t.subRows=n(t.subRows))})),r}(o),e]}),[c,m,o,r,i,s,a]),G=E[0],A=E[1],k=h(C);w((function(){k()&&y({type:l.resetSortBy})}),[c?null:n]),Object.assign(e,{preSortedRows:o,preSortedFlatRows:r,sortedRows:G,sortedFlatRows:A,rows:G,flatRows:A,setSortBy:x,toggleSortBy:P})}function Qe(e,t,n){return[].concat(e).sort((function(e,o){for(var r=0;r<t.length;r+=1){var i=t[r],u=!1===n[r]||\"desc\"===n[r],l=i(e,o);if(0!==l)return u?-l:l}return n[0]?e.index-o.index:o.index-e.index}))}l.resetPage=\"resetPage\",l.gotoPage=\"gotoPage\",l.setPageSize=\"setPageSize\";var Ze=function(e){e.stateReducers.push(et),e.useInstance.push(tt)};function et(e,t,n,o){if(t.type===l.init)return r({pageSize:10,pageIndex:0},e);if(t.type===l.resetPage)return r({},e,{pageIndex:o.initialState.pageIndex||0});if(t.type===l.gotoPage){var i=o.pageCount,u=o.page,s=m(t.pageIndex,e.pageIndex),a=!1;return s>e.pageIndex?a=-1===i?u.length>=e.pageSize:s<i:s<e.pageIndex&&(a=s>-1),a?r({},e,{pageIndex:s}):e}if(t.type===l.setPageSize){var c=t.pageSize,d=e.pageSize*e.pageIndex;return r({},e,{pageIndex:Math.floor(d/c),pageSize:c})}}function tt(e){var n=e.rows,o=e.autoResetPage,r=void 0===o||o,i=e.manualExpandedKey,u=void 0===i?\"expanded\":i,s=e.plugins,a=e.pageCount,c=e.paginateExpandedRows,d=void 0===c||c,f=e.expandSubRows,p=void 0===f||f,g=e.state,m=g.pageSize,y=g.pageIndex,R=g.expanded,b=g.globalFilter,S=g.filters,C=g.groupBy,x=g.sortBy,P=e.dispatch,B=e.data,E=e.manualPagination;v(s,[\"useGlobalFilter\",\"useFilters\",\"useGroupBy\",\"useSortBy\",\"useExpanded\"],\"usePagination\");var I=h(r);w((function(){I()&&P({type:l.resetPage})}),[P,E?null:B,b,S,C,x]);var F=E?a:Math.ceil(n.length/m),G=t.useMemo((function(){return F>0?[].concat(new Array(F)).fill(null).map((function(e,t){return t})):[]}),[F]),k=t.useMemo((function(){var e;if(E)e=n;else{var t=m*y,o=t+m;e=n.slice(t,o)}return d?e:A(e,{manualExpandedKey:u,expanded:R,expandSubRows:p})}),[p,R,u,E,y,m,d,n]),H=y>0,T=-1===F?k.length>=m:y<F-1,z=t.useCallback((function(e){P({type:l.gotoPage,pageIndex:e})}),[P]),W=t.useCallback((function(){return z((function(e){return e-1}))}),[z]),O=t.useCallback((function(){return z((function(e){return e+1}))}),[z]),M=t.useCallback((function(e){P({type:l.setPageSize,pageSize:e})}),[P]);Object.assign(e,{pageOptions:G,pageCount:F,page:k,canPreviousPage:H,canNextPage:T,gotoPage:z,previousPage:W,nextPage:O,setPageSize:M})}Ze.pluginName=\"usePagination\",l.resetPivot=\"resetPivot\",l.togglePivot=\"togglePivot\";var nt=function(e){e.getPivotToggleProps=[rt],e.stateReducers.push(it),e.useInstanceAfterData.push(ut),e.allColumns.push(lt),e.accessValue.push(st),e.materializedColumns.push(at),e.materializedColumnsDeps.push(ct),e.visibleColumns.push(dt),e.visibleColumnsDeps.push(ft),e.useInstance.push(pt),e.prepareRow.push(gt)};nt.pluginName=\"usePivotColumns\";var ot=[],rt=function(e,t){var n=t.header;return[e,{onClick:n.canPivot?function(e){e.persist(),n.togglePivot()}:void 0,style:{cursor:n.canPivot?\"pointer\":void 0},title:\"Toggle Pivot\"}]};function it(e,t,n,o){if(t.type===l.init)return r({pivotColumns:ot},e);if(t.type===l.resetPivot)return r({},e,{pivotColumns:o.initialState.pivotColumns||ot});if(t.type===l.togglePivot){var i=t.columnId,u=t.value,s=void 0!==u?u:!e.pivotColumns.includes(i);return r({},e,s?{pivotColumns:[].concat(e.pivotColumns,[i])}:{pivotColumns:e.pivotColumns.filter((function(e){return e!==i}))})}}function ut(e){e.allColumns.forEach((function(t){t.isPivotSource=e.state.pivotColumns.includes(t.id)}))}function lt(e,t){var n=t.instance;return e.forEach((function(e){e.isPivotSource=n.state.pivotColumns.includes(e.id),e.uniqueValues=new Set})),e}function st(e,t){var n=t.column;return n.uniqueValues&&void 0!==e&&n.uniqueValues.add(e),e}function at(e,t){var n=t.instance,o=n.allColumns,i=n.state;if(!i.pivotColumns.length||!i.groupBy||!i.groupBy.length)return e;var u=i.pivotColumns.map((function(e){return o.find((function(t){return t.id===e}))})).filter(Boolean),l=o.filter((function(e){return!e.isPivotSource&&!i.groupBy.includes(e.id)&&!i.pivotColumns.includes(e.id)})),s=C(function e(t,n,o){void 0===t&&(t=0),void 0===o&&(o=[]);var i=u[t];return i?Array.from(i.uniqueValues).sort().map((function(u){var l=r({},i,{Header:i.PivotHeader||\"string\"==typeof i.header?i.Header+\": \"+u:u,isPivotGroup:!0,parent:n,depth:t,id:n?n.id+\".\"+i.id+\".\"+u:i.id+\".\"+u,pivotValue:u});return l.columns=e(t+1,l,[].concat(o,[function(e){return e.values[i.id]===u}])),l})):l.map((function(e){return r({},e,{canPivot:!1,isPivoted:!0,parent:n,depth:t,id:\"\"+(n?n.id+\".\"+e.id:e.id),accessor:function(t,n,r){if(o.every((function(e){return e(r)})))return r.values[e.id]}})}))}());return[].concat(e,s)}function ct(e,t){var n=t.instance.state,o=n.pivotColumns,r=n.groupBy;return[].concat(e,[o,r])}function dt(e,t){var n=t.instance.state;return e=e.filter((function(e){return!e.isPivotSource})),n.pivotColumns.length&&n.groupBy&&n.groupBy.length&&(e=e.filter((function(e){return e.isGrouped||e.isPivoted}))),e}function ft(e,t){var n=t.instance;return[].concat(e,[n.state.pivotColumns,n.state.groupBy])}function pt(e){var t=e.columns,n=e.allColumns,o=e.flatHeaders,r=e.getHooks,i=e.plugins,u=e.dispatch,s=e.autoResetPivot,a=void 0===s||s,c=e.manaulPivot,d=e.disablePivot,p=e.defaultCanPivot;v(i,[\"useGroupBy\"],\"usePivotColumns\");var g=h(e);n.forEach((function(t){var n=t.accessor,o=t.defaultPivot,r=t.disablePivot;t.canPivot=n?I(t.canPivot,!0!==r&&void 0,!0!==d&&void 0,!0):I(t.canPivot,o,p,!1),t.canPivot&&(t.togglePivot=function(){return e.togglePivot(t.id)}),t.Aggregated=t.Aggregated||t.Cell}));o.forEach((function(e){e.getPivotToggleProps=f(r().getPivotToggleProps,{instance:g(),header:e})}));var m=h(a);w((function(){m()&&u({type:l.resetPivot})}),[u,c?null:t]),Object.assign(e,{togglePivot:function(e,t){u({type:l.togglePivot,columnId:e,value:t})}})}function gt(e){e.allCells.forEach((function(e){e.isPivoted=e.column.isPivoted}))}l.resetSelectedRows=\"resetSelectedRows\",l.toggleAllRowsSelected=\"toggleAllRowsSelected\",l.toggleRowSelected=\"toggleRowSelected\",l.toggleAllPageRowsSelected=\"toggleAllPageRowsSelected\";var vt=function(e){e.getToggleRowSelectedProps=[mt],e.getToggleAllRowsSelectedProps=[ht],e.getToggleAllPageRowsSelectedProps=[yt],e.stateReducers.push(wt),e.useInstance.push(Rt),e.prepareRow.push(bt)};vt.pluginName=\"useRowSelect\";var mt=function(e,t){var n=t.instance,o=t.row,r=n.manualRowSelectedKey,i=void 0===r?\"isSelected\":r;return[e,{onChange:function(e){o.toggleRowSelected(e.target.checked)},style:{cursor:\"pointer\"},checked:!(!o.original||!o.original[i])||o.isSelected,title:\"Toggle Row Selected\",indeterminate:o.isSomeSelected}]},ht=function(e,t){var n=t.instance;return[e,{onChange:function(e){n.toggleAllRowsSelected(e.target.checked)},style:{cursor:\"pointer\"},checked:n.isAllRowsSelected,title:\"Toggle All Rows Selected\",indeterminate:Boolean(!n.isAllRowsSelected&&Object.keys(n.state.selectedRowIds).length)}]},yt=function(e,t){var n=t.instance;return[e,{onChange:function(e){n.toggleAllPageRowsSelected(e.target.checked)},style:{cursor:\"pointer\"},checked:n.isAllPageRowsSelected,title:\"Toggle All Current Page Rows Selected\",indeterminate:Boolean(!n.isAllPageRowsSelected&&n.page.some((function(e){var t=e.id;return n.state.selectedRowIds[t]})))}]};function wt(e,t,n,o){if(t.type===l.init)return r({selectedRowIds:{}},e);if(t.type===l.resetSelectedRows)return r({},e,{selectedRowIds:o.initialState.selectedRowIds||{}});if(t.type===l.toggleAllRowsSelected){var i=t.value,u=o.isAllRowsSelected,s=o.rowsById,a=o.nonGroupedRowsById,c=void 0===a?s:a,d=void 0!==i?i:!u,f=Object.assign({},e.selectedRowIds);return d?Object.keys(c).forEach((function(e){f[e]=!0})):Object.keys(c).forEach((function(e){delete f[e]})),r({},e,{selectedRowIds:f})}if(t.type===l.toggleRowSelected){var p=t.id,g=t.value,v=o.rowsById,m=o.selectSubRows,h=void 0===m||m,y=o.getSubRows,w=e.selectedRowIds[p],R=void 0!==g?g:!w;if(w===R)return e;var b=r({},e.selectedRowIds);return function e(t){var n=v[t];if(n.isGrouped||(R?b[t]=!0:delete b[t]),h&&y(n))return y(n).forEach((function(t){return e(t.id)}))}(p),r({},e,{selectedRowIds:b})}if(t.type===l.toggleAllPageRowsSelected){var S=t.value,C=o.page,x=o.rowsById,P=o.selectSubRows,B=void 0===P||P,E=o.isAllPageRowsSelected,I=o.getSubRows,F=void 0!==S?S:!E,G=r({},e.selectedRowIds);return C.forEach((function(e){return function e(t){var n=x[t];if(n.isGrouped||(F?G[t]=!0:delete G[t]),B&&I(n))return I(n).forEach((function(t){return e(t.id)}))}(e.id)})),r({},e,{selectedRowIds:G})}return e}function Rt(e){var n=e.data,o=e.rows,r=e.getHooks,i=e.plugins,u=e.rowsById,s=e.nonGroupedRowsById,a=void 0===s?u:s,c=e.autoResetSelectedRows,d=void 0===c||c,p=e.state.selectedRowIds,g=e.selectSubRows,m=void 0===g||g,y=e.dispatch,R=e.page,b=e.getSubRows;v(i,[\"useFilters\",\"useGroupBy\",\"useSortBy\",\"useExpanded\",\"usePagination\"],\"useRowSelect\");var S=t.useMemo((function(){var e=[];return o.forEach((function(t){var n=m?function e(t,n,o){if(n[t.id])return!0;var r=o(t);if(r&&r.length){var i=!0,u=!1;return r.forEach((function(t){u&&!i||(e(t,n,o)?u=!0:i=!1)})),!!i||!!u&&null}return!1}(t,p,b):!!p[t.id];t.isSelected=!!n,t.isSomeSelected=null===n,n&&e.push(t)})),e}),[o,m,p,b]),C=Boolean(Object.keys(a).length&&Object.keys(p).length),x=C;C&&Object.keys(a).some((function(e){return!p[e]}))&&(C=!1),C||R&&R.length&&R.some((function(e){var t=e.id;return!p[t]}))&&(x=!1);var P=h(d);w((function(){P()&&y({type:l.resetSelectedRows})}),[y,n]);var B=t.useCallback((function(e){return y({type:l.toggleAllRowsSelected,value:e})}),[y]),E=t.useCallback((function(e){return y({type:l.toggleAllPageRowsSelected,value:e})}),[y]),I=t.useCallback((function(e,t){return y({type:l.toggleRowSelected,id:e,value:t})}),[y]),F=h(e),G=f(r().getToggleAllRowsSelectedProps,{instance:F()}),A=f(r().getToggleAllPageRowsSelectedProps,{instance:F()});Object.assign(e,{selectedFlatRows:S,isAllRowsSelected:C,isAllPageRowsSelected:x,toggleRowSelected:I,toggleAllRowsSelected:B,getToggleAllRowsSelectedProps:G,getToggleAllPageRowsSelectedProps:A,toggleAllPageRowsSelected:E})}function bt(e,t){var n=t.instance;e.toggleRowSelected=function(t){return n.toggleRowSelected(e.id,t)},e.getToggleRowSelectedProps=f(n.getHooks().getToggleRowSelectedProps,{instance:n,row:e})}var St=function(e){return{}},Ct=function(e){return{}};l.setRowState=\"setRowState\",l.setCellState=\"setCellState\",l.resetRowState=\"resetRowState\";var xt=function(e){e.stateReducers.push(Pt),e.useInstance.push(Bt),e.prepareRow.push(Et)};function Pt(e,t,n,o){var i=o.initialRowStateAccessor,u=void 0===i?St:i,s=o.initialCellStateAccessor,a=void 0===s?Ct:s,c=o.rowsById;if(t.type===l.init)return r({rowState:{}},e);if(t.type===l.resetRowState)return r({},e,{rowState:o.initialState.rowState||{}});if(t.type===l.setRowState){var d,f=t.rowId,p=t.value,g=void 0!==e.rowState[f]?e.rowState[f]:u(c[f]);return r({},e,{rowState:r({},e.rowState,(d={},d[f]=m(p,g),d))})}if(t.type===l.setCellState){var v,h,y,w,R,b=t.rowId,S=t.columnId,C=t.value,x=void 0!==e.rowState[b]?e.rowState[b]:u(c[b]),P=void 0!==(null==x?void 0:null==(v=x.cellState)?void 0:v[S])?x.cellState[S]:a(null==(h=c[b])?void 0:null==(y=h.cells)?void 0:y.find((function(e){return e.column.id===S})));return r({},e,{rowState:r({},e.rowState,(R={},R[b]=r({},x,{cellState:r({},x.cellState||{},(w={},w[S]=m(C,P),w))}),R))})}}function Bt(e){var n=e.autoResetRowState,o=void 0===n||n,r=e.data,i=e.dispatch,u=t.useCallback((function(e,t){return i({type:l.setRowState,rowId:e,value:t})}),[i]),s=t.useCallback((function(e,t,n){return i({type:l.setCellState,rowId:e,columnId:t,value:n})}),[i]),a=h(o);w((function(){a()&&i({type:l.resetRowState})}),[r]),Object.assign(e,{setRowState:u,setCellState:s})}function Et(e,t){var n=t.instance,o=n.initialRowStateAccessor,r=void 0===o?St:o,i=n.initialCellStateAccessor,u=void 0===i?Ct:i,l=n.state.rowState;e&&(e.state=void 0!==l[e.id]?l[e.id]:r(e),e.setState=function(t){return n.setRowState(e.id,t)},e.cells.forEach((function(t){e.state.cellState||(e.state.cellState={}),t.state=void 0!==e.state.cellState[t.column.id]?e.state.cellState[t.column.id]:u(t),t.setState=function(o){return n.setCellState(e.id,t.column.id,o)}})))}xt.pluginName=\"useRowState\",l.resetColumnOrder=\"resetColumnOrder\",l.setColumnOrder=\"setColumnOrder\";var It=function(e){e.stateReducers.push(Ft),e.visibleColumnsDeps.push((function(e,t){var n=t.instance;return[].concat(e,[n.state.columnOrder])})),e.visibleColumns.push(Gt),e.useInstance.push(At)};function Ft(e,t,n,o){return t.type===l.init?r({columnOrder:[]},e):t.type===l.resetColumnOrder?r({},e,{columnOrder:o.initialState.columnOrder||[]}):t.type===l.setColumnOrder?r({},e,{columnOrder:m(t.columnOrder,e.columnOrder)}):void 0}function Gt(e,t){var n=t.instance.state.columnOrder;if(!n||!n.length)return e;for(var o=[].concat(n),r=[].concat(e),i=[],u=function(){var e=o.shift(),t=r.findIndex((function(t){return t.id===e}));t>-1&&i.push(r.splice(t,1)[0])};r.length&&o.length;)u();return[].concat(i,r)}function At(e){var n=e.dispatch;e.setColumnOrder=t.useCallback((function(e){return n({type:l.setColumnOrder,columnOrder:e})}),[n])}It.pluginName=\"useColumnOrder\",c.canResize=!0,l.columnStartResizing=\"columnStartResizing\",l.columnResizing=\"columnResizing\",l.columnDoneResizing=\"columnDoneResizing\",l.resetResize=\"resetResize\";var kt=function(e){e.getResizerProps=[Ht],e.getHeaderProps.push({style:{position:\"relative\"}}),e.stateReducers.push(Tt),e.useInstance.push(Wt),e.useInstanceBeforeDimensions.push(zt)},Ht=function(e,t){var n=t.instance,o=t.header,r=n.dispatch,i=function(e,t){var n=!1;if(\"touchstart\"===e.type){if(e.touches&&e.touches.length>1)return;n=!0}var o=function(e){var t=[];return function e(n){n.columns&&n.columns.length&&n.columns.map(e);t.push(n)}(e),t}(t).map((function(e){return[e.id,e.totalWidth]})),i=n?Math.round(e.touches[0].clientX):e.clientX,u=function(e){r({type:l.columnResizing,clientX:e})},s=function(){return r({type:l.columnDoneResizing})},a={mouse:{moveEvent:\"mousemove\",moveHandler:function(e){return u(e.clientX)},upEvent:\"mouseup\",upHandler:function(e){document.removeEventListener(\"mousemove\",a.mouse.moveHandler),document.removeEventListener(\"mouseup\",a.mouse.upHandler),s()}},touch:{moveEvent:\"touchmove\",moveHandler:function(e){return e.cancelable&&(e.preventDefault(),e.stopPropagation()),u(e.touches[0].clientX),!1},upEvent:\"touchend\",upHandler:function(e){document.removeEventListener(a.touch.moveEvent,a.touch.moveHandler),document.removeEventListener(a.touch.upEvent,a.touch.moveHandler),s()}}},c=n?a.touch:a.mouse,d=!!function(){if(\"boolean\"==typeof z)return z;var e=!1;try{var t={get passive(){return e=!0,!1}};window.addEventListener(\"test\",null,t),window.removeEventListener(\"test\",null,t)}catch(t){e=!1}return z=e}()&&{passive:!1};document.addEventListener(c.moveEvent,c.moveHandler,d),document.addEventListener(c.upEvent,c.upHandler,d),r({type:l.columnStartResizing,columnId:t.id,columnWidth:t.totalWidth,headerIdWidths:o,clientX:i})};return[e,{onMouseDown:function(e){return e.persist()||i(e,o)},onTouchStart:function(e){return e.persist()||i(e,o)},style:{cursor:\"col-resize\"},draggable:!1,role:\"separator\"}]};function Tt(e,t){if(t.type===l.init)return r({columnResizing:{columnWidths:{}}},e);if(t.type===l.resetResize)return r({},e,{columnResizing:{columnWidths:{}}});if(t.type===l.columnStartResizing){var n=t.clientX,o=t.columnId,i=t.columnWidth,u=t.headerIdWidths;return r({},e,{columnResizing:r({},e.columnResizing,{startX:n,headerIdWidths:u,columnWidth:i,isResizingColumn:o})})}if(t.type===l.columnResizing){var s=t.clientX,a=e.columnResizing,c=a.startX,d=a.columnWidth,f=a.headerIdWidths,p=(s-c)/d,g={};return(void 0===f?[]:f).forEach((function(e){var t=e[0],n=e[1];g[t]=Math.max(n+n*p,0)})),r({},e,{columnResizing:r({},e.columnResizing,{columnWidths:r({},e.columnResizing.columnWidths,{},g)})})}return t.type===l.columnDoneResizing?r({},e,{columnResizing:r({},e.columnResizing,{startX:null,isResizingColumn:null})}):void 0}kt.pluginName=\"useResizeColumns\";var zt=function(e){var t=e.flatHeaders,n=e.disableResizing,o=e.getHooks,r=e.state.columnResizing,i=h(e);t.forEach((function(e){var t=I(!0!==e.disableResizing&&void 0,!0!==n&&void 0,!0);e.canResize=t,e.width=r.columnWidths[e.id]||e.originalWidth||e.width,e.isResizing=r.isResizingColumn===e.id,t&&(e.getResizerProps=f(o().getResizerProps,{instance:i(),header:e}))}))};function Wt(e){var n=e.plugins,o=e.dispatch,r=e.autoResetResize,i=void 0===r||r,u=e.columns;v(n,[\"useAbsoluteLayout\"],\"useResizeColumns\");var s=h(i);w((function(){s()&&o({type:l.resetResize})}),[u]);var a=t.useCallback((function(){return o({type:l.resetResize})}),[o]);Object.assign(e,{resetResizing:a})}var Ot={position:\"absolute\",top:0},Mt=function(e){e.getTableBodyProps.push(jt),e.getRowProps.push(jt),e.getHeaderGroupProps.push(jt),e.getFooterGroupProps.push(jt),e.getHeaderProps.push((function(e,t){var n=t.column;return[e,{style:r({},Ot,{left:n.totalLeft+\"px\",width:n.totalWidth+\"px\"})}]})),e.getCellProps.push((function(e,t){var n=t.cell;return[e,{style:r({},Ot,{left:n.column.totalLeft+\"px\",width:n.column.totalWidth+\"px\"})}]})),e.getFooterProps.push((function(e,t){var n=t.column;return[e,{style:r({},Ot,{left:n.totalLeft+\"px\",width:n.totalWidth+\"px\"})}]}))};Mt.pluginName=\"useAbsoluteLayout\";var jt=function(e,t){return[e,{style:{position:\"relative\",width:t.instance.totalColumnsWidth+\"px\"}}]},Nt={display:\"inline-block\",boxSizing:\"border-box\"},Lt=function(e,t){return[e,{style:{display:\"flex\",width:t.instance.totalColumnsWidth+\"px\"}}]},Dt=function(e){e.getRowProps.push(Lt),e.getHeaderGroupProps.push(Lt),e.getFooterGroupProps.push(Lt),e.getHeaderProps.push((function(e,t){var n=t.column;return[e,{style:r({},Nt,{width:n.totalWidth+\"px\"})}]})),e.getCellProps.push((function(e,t){var n=t.cell;return[e,{style:r({},Nt,{width:n.column.totalWidth+\"px\"})}]})),e.getFooterProps.push((function(e,t){var n=t.column;return[e,{style:r({},Nt,{width:n.totalWidth+\"px\"})}]}))};function Vt(e){e.getTableProps.push(_t),e.getRowProps.push(Xt),e.getHeaderGroupProps.push(Xt),e.getFooterGroupProps.push(Xt),e.getHeaderProps.push(qt),e.getCellProps.push(Kt),e.getFooterProps.push(Ut)}Dt.pluginName=\"useBlockLayout\",Vt.pluginName=\"useFlexLayout\";var _t=function(e,t){return[e,{style:{minWidth:t.instance.totalColumnsMinWidth+\"px\"}}]},Xt=function(e,t){return[e,{style:{display:\"flex\",flex:\"1 0 auto\",minWidth:t.instance.totalColumnsMinWidth+\"px\"}}]},qt=function(e,t){var n=t.column;return[e,{style:{boxSizing:\"border-box\",flex:n.totalFlexWidth?n.totalFlexWidth+\" 0 auto\":void 0,minWidth:n.totalMinWidth+\"px\",width:n.totalWidth+\"px\"}}]},Kt=function(e,t){var n=t.cell;return[e,{style:{boxSizing:\"border-box\",flex:n.column.totalFlexWidth+\" 0 auto\",minWidth:n.column.totalMinWidth+\"px\",width:n.column.totalWidth+\"px\"}}]},Ut=function(e,t){var n=t.column;return[e,{style:{boxSizing:\"border-box\",flex:n.totalFlexWidth?n.totalFlexWidth+\" 0 auto\":void 0,minWidth:n.totalMinWidth+\"px\",width:n.totalWidth+\"px\"}}]};function $t(e){e.stateReducers.push(Qt),e.getTableProps.push(Jt),e.getHeaderProps.push(Yt)}$t.pluginName=\"useGridLayout\";var Jt=function(e,t){return[e,{style:{display:\"grid\",gridTemplateColumns:t.instance.state.gridLayout.columnWidths.map((function(e){return e})).join(\" \")}}]},Yt=function(e,t){return[e,{id:\"header-cell-\"+t.column.id,style:{position:\"sticky\"}}]};function Qt(e,t,n,o){if(\"init\"===t.type)return r({gridLayout:{columnWidths:o.columns.map((function(){return\"auto\"}))}},e);if(\"columnStartResizing\"===t.type){var i=t.columnId,u=o.visibleColumns.findIndex((function(e){return e.id===i})),l=function(e){var t,n=null==(t=document.getElementById(\"header-cell-\"+e))?void 0:t.offsetWidth;if(void 0!==n)return n}(i);return void 0!==l?r({},e,{gridLayout:r({},e.gridLayout,{columnId:i,columnIndex:u,startingWidth:l})}):e}if(\"columnResizing\"===t.type){var s=e.gridLayout,a=s.columnIndex,c=s.startingWidth,d=s.columnWidths,f=c-(e.columnResizing.startX-t.clientX),p=[].concat(d);return p[a]=f+\"px\",r({},e,{gridLayout:r({},e.gridLayout,{columnWidths:p})})}}e._UNSTABLE_usePivotColumns=nt,e.actions=l,e.defaultColumn=c,e.defaultGroupByFn=De,e.defaultOrderByFn=Qe,e.defaultRenderer=s,e.emptyRenderer=a,e.ensurePluginOrder=v,e.flexRender=b,e.functionalUpdate=m,e.loopHooks=g,e.makePropGetter=f,e.makeRenderer=R,e.reduceHooks=p,e.safeUseLayoutEffect=y,e.useAbsoluteLayout=Mt,e.useAsyncDebounce=function(e,n){void 0===n&&(n=0);var r=t.useRef({}),i=h(e),u=h(n);return t.useCallback(function(){var e=o(regeneratorRuntime.mark((function e(){var t,n,l,s=arguments;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(t=s.length,n=new Array(t),l=0;l<t;l++)n[l]=s[l];return r.current.promise||(r.current.promise=new Promise((function(e,t){r.current.resolve=e,r.current.reject=t}))),r.current.timeout&&clearTimeout(r.current.timeout),r.current.timeout=setTimeout(o(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return delete r.current.timeout,e.prev=1,e.t0=r.current,e.next=5,i().apply(void 0,n);case 5:e.t1=e.sent,e.t0.resolve.call(e.t0,e.t1),e.next=12;break;case 9:e.prev=9,e.t2=e.catch(1),r.current.reject(e.t2);case 12:return e.prev=12,delete r.current.promise,e.finish(12);case 15:case\"end\":return e.stop()}}),e,null,[[1,9,12,15]])}))),u()),e.abrupt(\"return\",r.current.promise);case 5:case\"end\":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),[i,u])},e.useBlockLayout=Dt,e.useColumnOrder=It,e.useExpanded=se,e.useFilters=Pe,e.useFlexLayout=Vt,e.useGetLatest=h,e.useGlobalFilter=Ie,e.useGridLayout=$t,e.useGroupBy=ze,e.useMountedLayoutEffect=w,e.usePagination=Ze,e.useResizeColumns=kt,e.useRowSelect=vt,e.useRowState=xt,e.useSortBy=Ue,e.useTable=function(e){for(var n=arguments.length,o=new Array(n>1?n-1:0),i=1;i<n;i++)o[i-1]=arguments[i];e=ie(e),o=[K].concat(o);var u=t.useRef({}),s=h(u.current);Object.assign(s(),r({},e,{plugins:o,hooks:q()})),o.filter(Boolean).forEach((function(e){e(s().hooks)}));var a=h(s().hooks);s().getHooks=a,delete s().hooks,Object.assign(s(),p(a().useOptions,ie(e)));var c=s(),d=c.data,v=c.columns,m=c.initialState,y=c.defaultColumn,w=c.getSubRows,b=c.getRowId,E=c.stateReducer,I=c.useControlledState,F=h(E),G=t.useCallback((function(e,t){if(!t.type)throw console.info({action:t}),new Error(\"Unknown Action 👆\");return[].concat(a().stateReducers,Array.isArray(F())?F():[F()]).reduce((function(n,o){return o(n,t,e,s())||n}),e)}),[a,F,s]),A=t.useReducer(G,void 0,(function(){return G(m,{type:l.init})})),k=A[0],H=A[1],T=p([].concat(a().useControlledState,[I]),k,{instance:s()});Object.assign(s(),{state:T,dispatch:H});var z=t.useMemo((function(){return S(p(a().columns,v,{instance:s()}))}),[a,s,v].concat(p(a().columnsDeps,[],{instance:s()})));s().columns=z;var W=t.useMemo((function(){return p(a().allColumns,C(z),{instance:s()}).map(x)}),[z,a,s].concat(p(a().allColumnsDeps,[],{instance:s()})));s().allColumns=W;var O=t.useMemo((function(){for(var e=[],t=[],n={},o=[].concat(W);o.length;){var r=o.shift();le({data:d,rows:e,flatRows:t,rowsById:n,column:r,getRowId:b,getSubRows:w,accessValueHooks:a().accessValue,getInstance:s})}return[e,t,n]}),[W,d,b,w,a,s]),M=O[0],j=O[1],N=O[2];Object.assign(s(),{rows:M,initialRows:[].concat(M),flatRows:j,rowsById:N}),g(a().useInstanceAfterData,s());var L=t.useMemo((function(){return p(a().visibleColumns,W,{instance:s()}).map((function(e){return P(e,y)}))}),[a,W,s,y].concat(p(a().visibleColumnsDeps,[],{instance:s()})));W=t.useMemo((function(){var e=[].concat(L);return W.forEach((function(t){e.find((function(e){return e.id===t.id}))||e.push(t)})),e}),[W,L]),s().allColumns=W;var D=t.useMemo((function(){return p(a().headerGroups,B(L,y),s())}),[a,L,y,s].concat(p(a().headerGroupsDeps,[],{instance:s()})));s().headerGroups=D;var V=t.useMemo((function(){return D.length?D[0].headers:[]}),[D]);s().headers=V,s().flatHeaders=D.reduce((function(e,t){return[].concat(e,t.headers)}),[]),g(a().useInstanceBeforeDimensions,s());var _=L.filter((function(e){return e.isVisible})).map((function(e){return e.id})).sort().join(\"_\");L=t.useMemo((function(){return L.filter((function(e){return e.isVisible}))}),[L,_]),s().visibleColumns=L;var X=ue(V),U=X[0],$=X[1],J=X[2];return s().totalColumnsMinWidth=U,s().totalColumnsWidth=$,s().totalColumnsMaxWidth=J,g(a().useInstance,s()),[].concat(s().flatHeaders,s().allColumns).forEach((function(e){e.render=R(s(),e),e.getHeaderProps=f(a().getHeaderProps,{instance:s(),column:e}),e.getFooterProps=f(a().getFooterProps,{instance:s(),column:e})})),s().headerGroups=t.useMemo((function(){return D.filter((function(e,t){return e.headers=e.headers.filter((function(e){return e.headers?function e(t){return t.filter((function(t){return t.headers?e(t.headers):t.isVisible})).length}(e.headers):e.isVisible})),!!e.headers.length&&(e.getHeaderGroupProps=f(a().getHeaderGroupProps,{instance:s(),headerGroup:e,index:t}),e.getFooterGroupProps=f(a().getFooterGroupProps,{instance:s(),headerGroup:e,index:t}),!0)}))}),[D,s,a]),s().footerGroups=[].concat(s().headerGroups).reverse(),s().prepareRow=t.useCallback((function(e){e.getRowProps=f(a().getRowProps,{instance:s(),row:e}),e.allCells=W.map((function(t){var n=e.values[t.id],o={column:t,row:e,value:n};return o.getCellProps=f(a().getCellProps,{instance:s(),cell:o}),o.render=R(s(),t,{row:e,cell:o,value:n}),o})),e.cells=L.map((function(t){return e.allCells.find((function(e){return e.column.id===t.id}))})),g(a().prepareRow,e,{instance:s()})}),[a,s,W,L]),s().getTableProps=f(a().getTableProps,{instance:s()}),s().getTableBodyProps=f(a().getTableBodyProps,{instance:s()}),g(a().useFinalInstance,s()),s()},Object.defineProperty(e,\"__esModule\",{value:!0})}));\n//# sourceMappingURL=react-table.production.min.js.map\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-permissions/templates/assetPermissionEditView.html -->\\n<div class=\"container\">\\n\t<form id=\"asset-permission-edit-view\" role=\"form\" data-nx-validate-form>\\n\t\t\\n\t\t<header>\\n\t\t\t<h2 class=\"title\"><span class=\"text\">'+\n((__t=( headerTitle ))==null?'':__t)+\n'</span></h2>\\n\t\t</header>\\n\t\t\\n\t\t<div class=\"container-fluid\">\\n\t\t\t<input type=\"hidden\" name=\"type\" value=\"'+\n((__t=( typeIds.PERMIT ))==null?'':_.escape(__t))+\n'\">\\n\t\t\t\\n\t\t\t<div class=\"form-group\">\\n\t\t\t\t<label class=\"control-label\" for=\"permission-type\" data-i18n=\"system:i18n.type\">i18n.type</label>\\n\t\t\t\t';\n if ( enhancedAcls ) { \n__p+='\\n\t\t\t\t<select class=\"item selectpicker form-control\" id=\"permission-type\" name=\"permission\">\\n\t\t\t\t\t';\n _.each( permissionTypes, function( permissionType ) { \n__p+='\\n\t\t\t\t\t<option value='+\n((__t=( permissionType.value ))==null?'':__t)+\n' '+\n((__t=( ( permissionType.value == permission ? 'selected' : '' ) ))==null?'':__t)+\n'>'+\n((__t=( permissionType.label ))==null?'':__t)+\n'</option>\\n\t\t\t\t\t';\n } ); \n__p+='\\n\t\t\t\t</select>\\n\t\t\t\t';\n } else { \n__p+='\\n\t\t\t\t<input type=\\'hidden\\' name=\\'permission\\' value=\"'+\n((__t=( permissionIds.ALL ))==null?'':_.escape(__t))+\n'\">\\n\t\t\t\t<span type=\"text\" data-i18n=\"permissions:i18n.capitalPERMIT\">i18n.capitalPERMIT</span>\\n\t\t\t\t';\n } \n__p+='\\n\t\t\t</div>\\n\t\t\t\\n\t\t\t<div class=\"form-group required\">\\n\t\t\t\t<label class=\"control-label\" for=\"permission-principal\" data-i18n=\"system:i18n.principal\">i18n.principal</label>\\n\t\t\t\t<select class=\"item selectpicker form-control\" id=\"permission-principal\" name=\"principal\" required>\\n\t\t\t\t\t';\n _.each( principalTypes, function( principalType ) { \n__p+='\\n\t\t\t\t\t<option value='+\n((__t=( principalType.value ))==null?'':__t)+\n' '+\n((__t=( ( principalType.value == principal ? 'selected' : '' ) ))==null?'':__t)+\n'>'+\n((__t=( principalType.label ))==null?'':__t)+\n'</option>\\n\t\t\t\t\t';\n } ); \n__p+='\\n\t\t\t\t</select>\\n\t\t\t</div>\\n\\n\t\t\t<div class=\"form-group target-group required\">\\n\t\t\t\t<select id=\"permission-principal-label-group\" name=\"principalGroupId\" class=\"form-control\"\\n\t\t\t\t\tdata-autocomplete=\"group\"\\n\t\t\t\t\tdata-autocomplete-plugin=\"s2\"\\n\t\t\t\t\tdata-nx-autocomplete-container=\"body\"\\n\t\t\t\t\tdata-placeholder=\"'+\n((__t=( i18n.t('i18n.typeToAddGroup') ))==null?'':__t)+\n'\"\\n\t\t\t\t\trequired>\\n\t\t\t\t\t';\n if ( principal == principalIds.GROUP && principalId ) { \n__p+='\\n\t\t\t\t\t\t<option value=\"'+\n((__t=( principalId ))==null?'':__t)+\n'\">'+\n((__t=( principalLabel ))==null?'':__t)+\n'</option>\\n\t\t\t\t\t';\n } \n__p+='\\n\t\t\t\t\t</select>\\n\t\t\t</div>\\n\t\t\t<div class=\"form-group target-user required\">\\n\t\t\t\t<select id=\"permission-principal-label-user\" name=\"principalUserId\" class=\"form-control\"\\n\t\t\t\t\tdata-autocomplete=\"user\"\\n\t\t\t\t\tdata-autocomplete-plugin=\"s2\"\\n\t\t\t\t\tdata-nx-autocomplete-container=\"body\"\\n\t\t\t\t\tdata-placeholder=\"'+\n((__t=( i18n.t('i18n.typeToAddUser') ))==null?'':__t)+\n'\"\\n\t\t\t\t\trequired>\\n\t\t\t\t\t';\n if ( principal == principalIds.USER && principalId ) { \n__p+='\\n\t\t\t\t\t\t<option value=\"'+\n((__t=( principalId ))==null?'':__t)+\n'\">'+\n((__t=( principalLabel ))==null?'':__t)+\n'</option>\\n\t\t\t\t\t';\n } \n__p+='\\n\t\t\t\t\t</select>\\n\t\t\t</div>\\n\t\t\t\\n\t\t\t<div class=\"form-group\">\\n\t\t\t\t<label class=\"control-label\" for=\"permission-target\" data-i18n=\"system:i18n.target\">i18n.target</label>\\n\t\t\t\t<select class=\"item selectpicker form-control\" id=\"permission-target\" name=\"target\">\\n\t\t\t\t\t';\n _.each( targetTypes, function( targetType ) { \n__p+='\\n\t\t\t\t\t<option value='+\n((__t=( targetType.value ))==null?'':__t)+\n' '+\n((__t=( ( targetType.value == target ? 'selected' : '' ) ))==null?'':__t)+\n'>'+\n((__t=( targetType.label ))==null?'':__t)+\n'</option>\\n\t\t\t\t\t';\n } ); \n__p+='\\n\t\t\t\t</select>\\n\t\t\t</div>\\n\t\t\t<div class=\"form-group target-category required\">\\n\t\t\t\t<select id=\"permission-target-label-category\" name=\"targetCategoryId\" class=\"form-control\"\\n\t\t\t\t\tdata-autocomplete=\"category\"\\n\t\t\t\t\tdata-autocomplete-plugin=\"s2\"\\n\t\t\t\t\tdata-nx-autocomplete-container=\"body\"\\n\t\t\t\t\tdata-placeholder=\"'+\n((__t=( i18n.t('i18n.selectCategory') ))==null?'':__t)+\n'\"\\n\t\t\t\t\trequired>\\n\t\t\t\t\t';\n if ( target == targetIds.category && targetId ) { \n__p+='\\n\t\t\t\t\t\t<option value=\"'+\n((__t=( targetId ))==null?'':__t)+\n'\">'+\n((__t=( targetLabel ))==null?'':__t)+\n'</option>\\n\t\t\t\t\t';\n } \n__p+='\\n\t\t\t\t\t</select>\\n\t\t\t</div>\\n\t\t\t\\n\t\t\t<div class=\"form-group target-asset required\">\\n\t\t\t\t<select id=\"permission-target-label-asset\" name=\"targetAssetId\" class=\"form-control\"\\n\t\t\t\t\tdata-autocomplete=\"asset\"\\n\t\t\t\t\tdata-autocomplete-plugin=\"s2\"\\n\t\t\t\t\tdata-nx-autocomplete-container=\"body\"\\n\t\t\t\t\tdata-placeholder=\"'+\n((__t=( i18n.t('i18n.selectAsset') ))==null?'':__t)+\n'\"\\n\t\t\t\t\trequired>\\n\t\t\t\t\t';\n if ( target == targetIds.asset && targetId ) { \n__p+='\\n\t\t\t\t\t\t<option value=\"'+\n((__t=( targetId ))==null?'':__t)+\n'\">'+\n((__t=( targetLabel ))==null?'':__t)+\n'</option>\\n\t\t\t\t\t';\n } \n__p+='\\n\t\t\t\t\t</select>\\n\t\t\t</div>\\n\t\t\t\\n\t\t\t<div class=\"form-group recursive\">\\n\t\t\t\t<span class=\"checkbox inline\">\\n\t\t\t\t\t<input id=\\'permission-recursive\\' type=\"checkbox\" name=\"recursive\" value=\"1\" '+\n((__t=( recursive ? 'checked':'' ))==null?'':__t)+\n'>\\n\t\t\t\t\t<label for=\"permission-recursive\" data-i18n=\"permissions:i18n.recursive\">i18n.recursive</label>\\n\t\t\t\t</span>\\n\t\t\t</div>\\n\t\t</div>\\n\t\t\\n\t\t<footer>\\n\t\t\t<div class=\"actions\">\\n\t\t\t\t<aside>\\n\t\t\t\t\t<button type=\"button\" class=\"btn btn-default cancel nx-cancel\" data-nx-control=\"cancel\"><span class=\"text\" data-i18n=\"system:i18n.cancel\">i18n.cancel</span></button>\\n\t\t\t\t</aside>\\n\t\t\t\t<bside>\\n\t\t\t\t\t<button type=\"submit\" class=\"btn btn-save submit\" data-nx-control=\"save\"><span class=\"text\" data-i18n=\"system:i18n.save\">i18n.save</span></button>\\n\t\t\t\t</bside>\\n\t\t\t</div>\\n\t\t</footer>\\n\t\t\\n\t</form>\\n</div>\\n';\n}\nreturn __p;\n};\n","const NAME = 'materialList';\n\nimport {MDCList} from '@material/list';\nimport {MDCRipple} from '@material/ripple';\nimport {purgeEls} from '@netx/core/lib/utils';\n\nimport {\n\tarrowNavigationPatch,\n\tdisabledListItemCheckboxPatch,\n} from './patches/mdc-list';\n\n// This must happen on the prototype level due to the order of events\ndisabledListItemCheckboxPatch(MDCList);\n\nconst checkActive = (list) => {\n\tif (!list) return;\n\n\tconst hash = window.location.hash.replace('#');\n\tconst hashSplit = hash.split('/');\n\n\tconst idx = list.listElements.findIndex((el, i, all) => {\n\t\tlet href = el.getAttribute('href');\n\t\tif (!href) return el.classList.contains('active');\n\n\t\thref = href.replace('#');\n\n\t\t// If our item is a multipart href match the whole hash\n\t\tconst hrefSplit = href.split('/');\n\t\tif (hrefSplit.length) {\n\t\t\treturn href === hash;\n\t\t}\n\t\t// Otherwise match the first piece of the current hash\n\t\treturn hrefSplit[0] === hashSplit[0];\n\t});\n\n\tif (idx > -1) {\n\t\tlist.foundation_.setSelectedIndex(idx);\n\t}\n\treturn idx;\n};\n\nclass List {\n\t/**\n\t * @method\n\t * @param {HTMLElement} el The element we are applying the list to\n\t * @param {modules/@netx/core/lib/netx-view} view Intance of Netx view\n\t * @param {object} opts Plugin options\n\t */\n\tconstructor(el, view, opts = {}) {\n\t\tthis.el = el;\n\t\tthis.view = view;\n\n\t\tconst list = (this.list = new MDCList(el));\n\t\tarrowNavigationPatch(list);\n\n\t\tconst materialRipples = (this.materialRipples = list.listElements.map(\n\t\t\t(listItemEl) => new MDCRipple(listItemEl),\n\t\t));\n\n\t\t// list.singleSelection = true;\n\t\tlist.foundation_.setSingleSelection(true);\n\t\tlist.wrapFocus = true;\n\n\t\tel.addEventListener('click', (this.onClick = this.clicked.bind(this)));\n\t\tel.addEventListener(\n\t\t\t'MDCList:action',\n\t\t\t(this.onAction = this.itemSelected.bind(this)),\n\t\t);\n\n\t\tif (view.materialListItemSelected) {\n\t\t\tconst listElements = list.listElements;\n\t\t\tfor (let i = 0, c = listElements.length; i < c; i++) {\n\t\t\t\tif (view.materialListItemSelected(listElements[i])) {\n\t\t\t\t\tlist.foundation_.setSelectedIndex(i);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.checkActive();\n\t\t}\n\t}\n\n\t/** @method */\n\tcheckActive() {\n\t\tcheckActive(this.list);\n\t}\n\n\t/** @method */\n\tcleanUp() {\n\t\tconst list = this.list;\n\t\tif (!list) return;\n\n\t\t_.invoke(this.materialRipples, 'destroy');\n\t\tthis.materialRipples = [];\n\n\t\tlist.destroy();\n\t\tdelete this.list;\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `click` event\n\t */\n\tclicked(e) {\n\t\t// When we click on an action our event listeners in core fire\n\t\t// but mdc list items (which live in mdc menus) can be triggered\n\t\t// by `space`, `enter` and `click`\n\t\t// So, when a click occurs we do not want to fire the action off in\n\t\t// here as to not have it fire twice\n\t\t// When we rework our actions we should keep this in mind\n\t\tif (e.target.classList.contains('nx-action')) {\n\t\t\tthis._ignoreItemSelection = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._ignoreItemSelection = false;\n\t\t\t}, 20);\n\t\t}\n\t}\n\n\t/** @method */\n\tdestroy() {\n\t\tthis.cleanUp();\n\n\t\tconst el = this.el;\n\t\tel.removeEventListener('click', this.onClick);\n\t\tel.removeEventListener('MDCList:action', this.onAction);\n\n\t\tdelete this.el;\n\t\tdelete this.view;\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `MDCList:action` event\n\t */\n\titemSelected(e) {\n\t\t// Defer because our `click` event comes immediately after `MDCList:action`\n\t\t// we want to know if it was via a `click` or other (`space`, `enter`)\n\t\t_.defer(() => {\n\t\t\tif (!this._ignoreItemSelection) {\n\t\t\t\tconst item = this.list.listElements[e.detail.index];\n\t\t\t\tif (!item || !item.classList.contains('nx-action')) {\n\t\t\t\t\tif (this.view.onListItemSelect) {\n\t\t\t\t\t\tthis.view.onListItemSelect(item, this.list);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Pass along to our action event handler\n\t\t\t\tconst evt = new MouseEvent('click', {\n\t\t\t\t\tbubbles: false,\n\t\t\t\t\tcancelable: true,\n\t\t\t\t\tview: window,\n\t\t\t\t});\n\t\t\t\titem.dispatchEvent(evt);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Select all\n\t * Only applies to lists with checkboxes\n\t * @method\n\t */\n\tselectAll() {\n\t\tconst list = this.list;\n\t\tif (!list) return;\n\n\t\tconst adapter = list.foundation_.adapter_;\n\t\tlist.listElements.forEach((listElement, idx) => {\n\t\t\tif (!adapter.hasCheckboxAtIndex(idx)) return;\n\t\t\tadapter.setCheckedCheckboxOrRadioAtIndex(idx, true);\n\t\t});\n\t}\n}\n\nexport default function (target) {\n\tif (!target || target.hasFunctionality(NAME)) return target;\n\n\ttarget.addInitializer((instance, opts = {}) => {\n\t\topts = opts.materialList || {};\n\n\t\tlet materialLists = [];\n\n\t\tconst cleanUp = () => {\n\t\t\t_.invoke(materialLists, 'destroy');\n\t\t\tmaterialLists = [];\n\t\t};\n\n\t\tconst reset = _.debounce(() => {\n\t\t\tcleanUp();\n\t\t\tsetup();\n\t\t}, 25);\n\n\t\tconst setup = () => {\n\t\t\tconst el = instance.el;\n\t\t\tconst classList = el.classList;\n\t\t\tconst els =\n\t\t\t\tclassList.contains('mdc-list') || classList.contains('mdc-list-group')\n\t\t\t\t\t? [el]\n\t\t\t\t\t: purgeEls(\n\t\t\t\t\t\t\t[...el.querySelectorAll('.mdc-list-group, .mdc-list')],\n\t\t\t\t\t\t\tinstance.getExcludedViews(),\n\t\t\t\t\t );\n\n\t\t\tels.forEach((el) => {\n\t\t\t\tif (\n\t\t\t\t\t!el.classList.contains('mdc-list-group') &&\n\t\t\t\t\tel.closest('.mdc-list-group')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst list = new List(el, instance, opts);\n\t\t\t\tmaterialLists.push(list);\n\t\t\t});\n\t\t};\n\n\t\tinstance.getFocusedListItem = () => {\n\t\t\tlet focusedItem;\n\t\t\tmaterialLists.forEach((list) => {\n\t\t\t\tif (focusedItem) return;\n\t\t\t\tfocusedItem =\n\t\t\t\t\tlist.list.listElements[list.list.foundation_.focusedItemIndex_];\n\t\t\t});\n\t\t\treturn focusedItem;\n\t\t};\n\n\t\tinstance.getActiveList = () => {\n\t\t\tconst focusedList = materialLists.find((list) => {\n\t\t\t\treturn list.list.foundation_.focusedItemIndex_ > -1;\n\t\t\t});\n\t\t\tif (focusedList) {\n\t\t\t\treturn focusedList.list;\n\t\t\t}\n\t\t};\n\n\t\t// Hey, listen!\n\t\tinstance\n\t\t\t.listenTo(dispatcher, 'hash:changed', () => {\n\t\t\t\t_.invoke(materialLists, 'checkActive');\n\t\t\t})\n\t\t\t.on('materialList:checkActive', () => {\n\t\t\t\t_.invoke(materialLists, 'checkActive');\n\t\t\t})\n\t\t\t.on('materialList:selectAll', () => {\n\t\t\t\t_.invoke(materialLists, 'selectAll');\n\t\t\t})\n\t\t\t.on('preRenderHook', () => {\n\t\t\t\tif (opts.childViews) {\n\t\t\t\t\tinstance.stopListening('addedNewChildView', reset);\n\t\t\t\t}\n\t\t\t\tcleanUp();\n\t\t\t})\n\t\t\t.on('removeHook', cleanUp)\n\t\t\t.on('renderedHook', () => {\n\t\t\t\tsetup();\n\t\t\t\tif (opts.childViews) {\n\t\t\t\t\tinstance.on('addedNewChildView', (childView) => {\n\t\t\t\t\t\tchildView.rendered.then(reset);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t}, NAME);\n\n\treturn target;\n}\n","(function(){\n/*\n\n Copyright (c) 2020 The Polymer Project Authors. All rights reserved.\n This code may only be used under the BSD style license found at\n http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n Google as part of the polymer project is also subject to an additional IP\n rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';/*\n\n Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n This code may only be used under the BSD style license found at\n http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n Google as part of the polymer project is also subject to an additional IP\n rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nvar n=window.Document.prototype.createElement,p=window.Document.prototype.createElementNS,aa=window.Document.prototype.importNode,ba=window.Document.prototype.prepend,ca=window.Document.prototype.append,da=window.DocumentFragment.prototype.prepend,ea=window.DocumentFragment.prototype.append,q=window.Node.prototype.cloneNode,r=window.Node.prototype.appendChild,t=window.Node.prototype.insertBefore,u=window.Node.prototype.removeChild,v=window.Node.prototype.replaceChild,w=Object.getOwnPropertyDescriptor(window.Node.prototype,\n\"textContent\"),y=window.Element.prototype.attachShadow,z=Object.getOwnPropertyDescriptor(window.Element.prototype,\"innerHTML\"),A=window.Element.prototype.getAttribute,B=window.Element.prototype.setAttribute,C=window.Element.prototype.removeAttribute,D=window.Element.prototype.getAttributeNS,E=window.Element.prototype.setAttributeNS,F=window.Element.prototype.removeAttributeNS,G=window.Element.prototype.insertAdjacentElement,H=window.Element.prototype.insertAdjacentHTML,fa=window.Element.prototype.prepend,\nha=window.Element.prototype.append,ia=window.Element.prototype.before,ja=window.Element.prototype.after,ka=window.Element.prototype.replaceWith,la=window.Element.prototype.remove,ma=window.HTMLElement,I=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,\"innerHTML\"),na=window.HTMLElement.prototype.insertAdjacentElement,oa=window.HTMLElement.prototype.insertAdjacentHTML;var pa=new Set;\"annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph\".split(\" \").forEach(function(a){return pa.add(a)});function qa(a){var b=pa.has(a);a=/^[a-z][.0-9_a-z]*-[-.0-9_a-z]*$/.test(a);return!b&&a}var ra=document.contains?document.contains.bind(document):document.documentElement.contains.bind(document.documentElement);\nfunction J(a){var b=a.isConnected;if(void 0!==b)return b;if(ra(a))return!0;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}function K(a){var b=a.children;if(b)return Array.prototype.slice.call(b);b=[];for(a=a.firstChild;a;a=a.nextSibling)a.nodeType===Node.ELEMENT_NODE&&b.push(a);return b}\nfunction L(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}\nfunction M(a,b,c){for(var f=a;f;){if(f.nodeType===Node.ELEMENT_NODE){var d=f;b(d);var e=d.localName;if(\"link\"===e&&\"import\"===d.getAttribute(\"rel\")){f=d.import;void 0===c&&(c=new Set);if(f instanceof Node&&!c.has(f))for(c.add(f),f=f.firstChild;f;f=f.nextSibling)M(f,b,c);f=L(a,d);continue}else if(\"template\"===e){f=L(a,d);continue}if(d=d.__CE_shadowRoot)for(d=d.firstChild;d;d=d.nextSibling)M(d,b,c)}f=f.firstChild?f.firstChild:L(a,f)}};function N(){var a=!(null===O||void 0===O||!O.noDocumentConstructionObserver),b=!(null===O||void 0===O||!O.shadyDomFastWalk);this.h=[];this.a=[];this.f=!1;this.shadyDomFastWalk=b;this.C=!a}function P(a,b,c,f){var d=window.ShadyDom;if(a.shadyDomFastWalk&&d&&d.inUse){if(b.nodeType===Node.ELEMENT_NODE&&c(b),b.querySelectorAll)for(a=d.nativeMethods.querySelectorAll.call(b,\"*\"),b=0;b<a.length;b++)c(a[b])}else M(b,c,f)}function sa(a,b){a.f=!0;a.h.push(b)}function ta(a,b){a.f=!0;a.a.push(b)}\nfunction Q(a,b){a.f&&P(a,b,function(c){return R(a,c)})}function R(a,b){if(a.f&&!b.__CE_patched){b.__CE_patched=!0;for(var c=0;c<a.h.length;c++)a.h[c](b);for(c=0;c<a.a.length;c++)a.a[c](b)}}function S(a,b){var c=[];P(a,b,function(d){return c.push(d)});for(b=0;b<c.length;b++){var f=c[b];1===f.__CE_state?a.connectedCallback(f):T(a,f)}}function U(a,b){var c=[];P(a,b,function(d){return c.push(d)});for(b=0;b<c.length;b++){var f=c[b];1===f.__CE_state&&a.disconnectedCallback(f)}}\nfunction V(a,b,c){c=void 0===c?{}:c;var f=c.D,d=c.upgrade||function(g){return T(a,g)},e=[];P(a,b,function(g){a.f&&R(a,g);if(\"link\"===g.localName&&\"import\"===g.getAttribute(\"rel\")){var h=g.import;h instanceof Node&&(h.__CE_isImportDocument=!0,h.__CE_registry=document.__CE_registry);h&&\"complete\"===h.readyState?h.__CE_documentLoadHandled=!0:g.addEventListener(\"load\",function(){var k=g.import;if(!k.__CE_documentLoadHandled){k.__CE_documentLoadHandled=!0;var l=new Set;f&&(f.forEach(function(m){return l.add(m)}),\nl.delete(k));V(a,k,{D:l,upgrade:d})}})}else e.push(g)},f);for(b=0;b<e.length;b++)d(e[b])}\nfunction T(a,b){try{var c=b.ownerDocument,f=c.__CE_registry;var d=f&&(c.defaultView||c.__CE_isImportDocument)?W(f,b.localName):void 0;if(d&&void 0===b.__CE_state){d.constructionStack.push(b);try{try{if(new d.constructorFunction!==b)throw Error(\"The custom element constructor did not produce the element being upgraded.\");}finally{d.constructionStack.pop()}}catch(k){throw b.__CE_state=2,k;}b.__CE_state=1;b.__CE_definition=d;if(d.attributeChangedCallback&&b.hasAttributes()){var e=d.observedAttributes;\nfor(d=0;d<e.length;d++){var g=e[d],h=b.getAttribute(g);null!==h&&a.attributeChangedCallback(b,g,null,h,null)}}J(b)&&a.connectedCallback(b)}}catch(k){X(k)}}N.prototype.connectedCallback=function(a){var b=a.__CE_definition;if(b.connectedCallback)try{b.connectedCallback.call(a)}catch(c){X(c)}};N.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;if(b.disconnectedCallback)try{b.disconnectedCallback.call(a)}catch(c){X(c)}};\nN.prototype.attributeChangedCallback=function(a,b,c,f,d){var e=a.__CE_definition;if(e.attributeChangedCallback&&-1<e.observedAttributes.indexOf(b))try{e.attributeChangedCallback.call(a,b,c,f,d)}catch(g){X(g)}};\nfunction ua(a,b,c,f){var d=b.__CE_registry;if(d&&(null===f||\"http://www.w3.org/1999/xhtml\"===f)&&(d=W(d,c)))try{var e=new d.constructorFunction;if(void 0===e.__CE_state||void 0===e.__CE_definition)throw Error(\"Failed to construct '\"+c+\"': The returned value was not constructed with the HTMLElement constructor.\");if(\"http://www.w3.org/1999/xhtml\"!==e.namespaceURI)throw Error(\"Failed to construct '\"+c+\"': The constructed element's namespace must be the HTML namespace.\");if(e.hasAttributes())throw Error(\"Failed to construct '\"+\nc+\"': The constructed element must not have any attributes.\");if(null!==e.firstChild)throw Error(\"Failed to construct '\"+c+\"': The constructed element must not have any children.\");if(null!==e.parentNode)throw Error(\"Failed to construct '\"+c+\"': The constructed element must not have a parent node.\");if(e.ownerDocument!==b)throw Error(\"Failed to construct '\"+c+\"': The constructed element's owner document is incorrect.\");if(e.localName!==c)throw Error(\"Failed to construct '\"+c+\"': The constructed element's local name is incorrect.\");\nreturn e}catch(g){return X(g),b=null===f?n.call(b,c):p.call(b,f,c),Object.setPrototypeOf(b,HTMLUnknownElement.prototype),b.__CE_state=2,b.__CE_definition=void 0,R(a,b),b}b=null===f?n.call(b,c):p.call(b,f,c);R(a,b);return b}\nfunction X(a){var b=a.message,c=a.sourceURL||a.fileName||\"\",f=a.line||a.lineNumber||0,d=a.column||a.columnNumber||0,e=void 0;void 0===ErrorEvent.prototype.initErrorEvent?e=new ErrorEvent(\"error\",{cancelable:!0,message:b,filename:c,lineno:f,colno:d,error:a}):(e=document.createEvent(\"ErrorEvent\"),e.initErrorEvent(\"error\",!1,!0,b,c,f),e.preventDefault=function(){Object.defineProperty(this,\"defaultPrevented\",{configurable:!0,get:function(){return!0}})});void 0===e.error&&Object.defineProperty(e,\"error\",\n{configurable:!0,enumerable:!0,get:function(){return a}});window.dispatchEvent(e);e.defaultPrevented||console.error(a)};function va(){var a=this;this.a=void 0;this.w=new Promise(function(b){a.g=b})}va.prototype.resolve=function(a){if(this.a)throw Error(\"Already resolved.\");this.a=a;this.g(a)};function wa(a){var b=document;this.g=void 0;this.b=a;this.a=b;V(this.b,this.a);\"loading\"===this.a.readyState&&(this.g=new MutationObserver(this.A.bind(this)),this.g.observe(this.a,{childList:!0,subtree:!0}))}function xa(a){a.g&&a.g.disconnect()}wa.prototype.A=function(a){var b=this.a.readyState;\"interactive\"!==b&&\"complete\"!==b||xa(this);for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,f=0;f<c.length;f++)V(this.b,c[f])};function Y(a){this.j=new Map;this.l=new Map;this.u=new Map;this.o=!1;this.s=new Map;this.i=function(b){return b()};this.c=!1;this.m=[];this.b=a;this.v=a.C?new wa(a):void 0}Y.prototype.B=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError(\"Custom element constructor getters must be functions.\");ya(this,a);this.j.set(a,b);this.m.push(a);this.c||(this.c=!0,this.i(function(){return za(c)}))};\nY.prototype.define=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError(\"Custom element constructors must be functions.\");ya(this,a);Aa(this,a,b);this.m.push(a);this.c||(this.c=!0,this.i(function(){return za(c)}))};function ya(a,b){if(!qa(b))throw new SyntaxError(\"The element name '\"+b+\"' is not valid.\");if(W(a,b))throw Error(\"A custom element with name '\"+(b+\"' has already been defined.\"));if(a.o)throw Error(\"A custom element is already being defined.\");}\nfunction Aa(a,b,c){a.o=!0;var f;try{var d=c.prototype;if(!(d instanceof Object))throw new TypeError(\"The custom element constructor's prototype is not an object.\");var e=function(m){var x=d[m];if(void 0!==x&&!(x instanceof Function))throw Error(\"The '\"+m+\"' callback must be a function.\");return x};var g=e(\"connectedCallback\");var h=e(\"disconnectedCallback\");var k=e(\"adoptedCallback\");var l=(f=e(\"attributeChangedCallback\"))&&c.observedAttributes||[]}catch(m){throw m;}finally{a.o=!1}c={localName:b,\nconstructorFunction:c,connectedCallback:g,disconnectedCallback:h,adoptedCallback:k,attributeChangedCallback:f,observedAttributes:l,constructionStack:[]};a.l.set(b,c);a.u.set(c.constructorFunction,c);return c}Y.prototype.upgrade=function(a){V(this.b,a)};\nfunction za(a){if(!1!==a.c){a.c=!1;for(var b=[],c=a.m,f=new Map,d=0;d<c.length;d++)f.set(c[d],[]);V(a.b,document,{upgrade:function(k){if(void 0===k.__CE_state){var l=k.localName,m=f.get(l);m?m.push(k):a.l.has(l)&&b.push(k)}}});for(d=0;d<b.length;d++)T(a.b,b[d]);for(d=0;d<c.length;d++){for(var e=c[d],g=f.get(e),h=0;h<g.length;h++)T(a.b,g[h]);(e=a.s.get(e))&&e.resolve(void 0)}c.length=0}}Y.prototype.get=function(a){if(a=W(this,a))return a.constructorFunction};\nY.prototype.whenDefined=function(a){if(!qa(a))return Promise.reject(new SyntaxError(\"'\"+a+\"' is not a valid custom element name.\"));var b=this.s.get(a);if(b)return b.w;b=new va;this.s.set(a,b);var c=this.l.has(a)||this.j.has(a);a=-1===this.m.indexOf(a);c&&a&&b.resolve(void 0);return b.w};Y.prototype.polyfillWrapFlushCallback=function(a){this.v&&xa(this.v);var b=this.i;this.i=function(c){return a(function(){return b(c)})}};\nfunction W(a,b){var c=a.l.get(b);if(c)return c;if(c=a.j.get(b)){a.j.delete(b);try{return Aa(a,b,c())}catch(f){X(f)}}}window.CustomElementRegistry=Y;Y.prototype.define=Y.prototype.define;Y.prototype.upgrade=Y.prototype.upgrade;Y.prototype.get=Y.prototype.get;Y.prototype.whenDefined=Y.prototype.whenDefined;Y.prototype.polyfillDefineLazy=Y.prototype.B;Y.prototype.polyfillWrapFlushCallback=Y.prototype.polyfillWrapFlushCallback;function Z(a,b,c){function f(d){return function(e){for(var g=[],h=0;h<arguments.length;++h)g[h]=arguments[h];h=[];for(var k=[],l=0;l<g.length;l++){var m=g[l];m instanceof Element&&J(m)&&k.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)h.push(m);else h.push(m)}d.apply(this,g);for(g=0;g<k.length;g++)U(a,k[g]);if(J(this))for(g=0;g<h.length;g++)k=h[g],k instanceof Element&&S(a,k)}}void 0!==c.prepend&&(b.prepend=f(c.prepend));void 0!==c.append&&(b.append=f(c.append))};function Ba(a){Document.prototype.createElement=function(b){return ua(a,this,b,null)};Document.prototype.importNode=function(b,c){b=aa.call(this,b,!!c);this.__CE_registry?V(a,b):Q(a,b);return b};Document.prototype.createElementNS=function(b,c){return ua(a,this,c,b)};Z(a,Document.prototype,{prepend:ba,append:ca})};function Ca(a){function b(f){return function(d){for(var e=[],g=0;g<arguments.length;++g)e[g]=arguments[g];g=[];for(var h=[],k=0;k<e.length;k++){var l=e[k];l instanceof Element&&J(l)&&h.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)g.push(l);else g.push(l)}f.apply(this,e);for(e=0;e<h.length;e++)U(a,h[e]);if(J(this))for(e=0;e<g.length;e++)h=g[e],h instanceof Element&&S(a,h)}}var c=Element.prototype;void 0!==ia&&(c.before=b(ia));void 0!==ja&&(c.after=b(ja));void 0!==ka&&\n(c.replaceWith=function(f){for(var d=[],e=0;e<arguments.length;++e)d[e]=arguments[e];e=[];for(var g=[],h=0;h<d.length;h++){var k=d[h];k instanceof Element&&J(k)&&g.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)e.push(k);else e.push(k)}h=J(this);ka.apply(this,d);for(d=0;d<g.length;d++)U(a,g[d]);if(h)for(U(a,this),d=0;d<e.length;d++)g=e[d],g instanceof Element&&S(a,g)});void 0!==la&&(c.remove=function(){var f=J(this);la.call(this);f&&U(a,this)})};function Da(a){function b(d,e){Object.defineProperty(d,\"innerHTML\",{enumerable:e.enumerable,configurable:!0,get:e.get,set:function(g){var h=this,k=void 0;J(this)&&(k=[],P(a,this,function(x){x!==h&&k.push(x)}));e.set.call(this,g);if(k)for(var l=0;l<k.length;l++){var m=k[l];1===m.__CE_state&&a.disconnectedCallback(m)}this.ownerDocument.__CE_registry?V(a,this):Q(a,this);return g}})}function c(d,e){d.insertAdjacentElement=function(g,h){var k=J(h);g=e.call(this,g,h);k&&U(a,h);J(g)&&S(a,h);return g}}function f(d,\ne){function g(h,k){for(var l=[];h!==k;h=h.nextSibling)l.push(h);for(k=0;k<l.length;k++)V(a,l[k])}d.insertAdjacentHTML=function(h,k){h=h.toLowerCase();if(\"beforebegin\"===h){var l=this.previousSibling;e.call(this,h,k);g(l||this.parentNode.firstChild,this)}else if(\"afterbegin\"===h)l=this.firstChild,e.call(this,h,k),g(this.firstChild,l);else if(\"beforeend\"===h)l=this.lastChild,e.call(this,h,k),g(l||this.firstChild,null);else if(\"afterend\"===h)l=this.nextSibling,e.call(this,h,k),g(this.nextSibling,l);\nelse throw new SyntaxError(\"The value provided (\"+String(h)+\") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.\");}}y&&(Element.prototype.attachShadow=function(d){d=y.call(this,d);if(a.f&&!d.__CE_patched){d.__CE_patched=!0;for(var e=0;e<a.h.length;e++)a.h[e](d)}return this.__CE_shadowRoot=d});z&&z.get?b(Element.prototype,z):I&&I.get?b(HTMLElement.prototype,I):ta(a,function(d){b(d,{enumerable:!0,configurable:!0,get:function(){return q.call(this,!0).innerHTML},set:function(e){var g=\n\"template\"===this.localName,h=g?this.content:this,k=p.call(document,this.namespaceURI,this.localName);for(k.innerHTML=e;0<h.childNodes.length;)u.call(h,h.childNodes[0]);for(e=g?k.content:k;0<e.childNodes.length;)r.call(h,e.childNodes[0])}})});Element.prototype.setAttribute=function(d,e){if(1!==this.__CE_state)return B.call(this,d,e);var g=A.call(this,d);B.call(this,d,e);e=A.call(this,d);a.attributeChangedCallback(this,d,g,e,null)};Element.prototype.setAttributeNS=function(d,e,g){if(1!==this.__CE_state)return E.call(this,\nd,e,g);var h=D.call(this,d,e);E.call(this,d,e,g);g=D.call(this,d,e);a.attributeChangedCallback(this,e,h,g,d)};Element.prototype.removeAttribute=function(d){if(1!==this.__CE_state)return C.call(this,d);var e=A.call(this,d);C.call(this,d);null!==e&&a.attributeChangedCallback(this,d,e,null,null)};Element.prototype.removeAttributeNS=function(d,e){if(1!==this.__CE_state)return F.call(this,d,e);var g=D.call(this,d,e);F.call(this,d,e);var h=D.call(this,d,e);g!==h&&a.attributeChangedCallback(this,e,g,h,d)};\nna?c(HTMLElement.prototype,na):G&&c(Element.prototype,G);oa?f(HTMLElement.prototype,oa):H&&f(Element.prototype,H);Z(a,Element.prototype,{prepend:fa,append:ha});Ca(a)};var Ea={};function Fa(a){function b(){var c=this.constructor;var f=document.__CE_registry.u.get(c);if(!f)throw Error(\"Failed to construct a custom element: The constructor was not registered with `customElements`.\");var d=f.constructionStack;if(0===d.length)return d=n.call(document,f.localName),Object.setPrototypeOf(d,c.prototype),d.__CE_state=1,d.__CE_definition=f,R(a,d),d;var e=d.length-1,g=d[e];if(g===Ea)throw Error(\"Failed to construct '\"+f.localName+\"': This element was already constructed.\");d[e]=Ea;\nObject.setPrototypeOf(g,c.prototype);R(a,g);return g}b.prototype=ma.prototype;Object.defineProperty(HTMLElement.prototype,\"constructor\",{writable:!0,configurable:!0,enumerable:!1,value:b});window.HTMLElement=b};function Ga(a){function b(c,f){Object.defineProperty(c,\"textContent\",{enumerable:f.enumerable,configurable:!0,get:f.get,set:function(d){if(this.nodeType===Node.TEXT_NODE)f.set.call(this,d);else{var e=void 0;if(this.firstChild){var g=this.childNodes,h=g.length;if(0<h&&J(this)){e=Array(h);for(var k=0;k<h;k++)e[k]=g[k]}}f.set.call(this,d);if(e)for(d=0;d<e.length;d++)U(a,e[d])}}})}Node.prototype.insertBefore=function(c,f){if(c instanceof DocumentFragment){var d=K(c);c=t.call(this,c,f);if(J(this))for(f=\n0;f<d.length;f++)S(a,d[f]);return c}d=c instanceof Element&&J(c);f=t.call(this,c,f);d&&U(a,c);J(this)&&S(a,c);return f};Node.prototype.appendChild=function(c){if(c instanceof DocumentFragment){var f=K(c);c=r.call(this,c);if(J(this))for(var d=0;d<f.length;d++)S(a,f[d]);return c}f=c instanceof Element&&J(c);d=r.call(this,c);f&&U(a,c);J(this)&&S(a,c);return d};Node.prototype.cloneNode=function(c){c=q.call(this,!!c);this.ownerDocument.__CE_registry?V(a,c):Q(a,c);return c};Node.prototype.removeChild=function(c){var f=\nc instanceof Element&&J(c),d=u.call(this,c);f&&U(a,c);return d};Node.prototype.replaceChild=function(c,f){if(c instanceof DocumentFragment){var d=K(c);c=v.call(this,c,f);if(J(this))for(U(a,f),f=0;f<d.length;f++)S(a,d[f]);return c}d=c instanceof Element&&J(c);var e=v.call(this,c,f),g=J(this);g&&U(a,f);d&&U(a,c);g&&S(a,c);return e};w&&w.get?b(Node.prototype,w):sa(a,function(c){b(c,{enumerable:!0,configurable:!0,get:function(){for(var f=[],d=this.firstChild;d;d=d.nextSibling)d.nodeType!==Node.COMMENT_NODE&&\nf.push(d.textContent);return f.join(\"\")},set:function(f){for(;this.firstChild;)u.call(this,this.firstChild);null!=f&&\"\"!==f&&r.call(this,document.createTextNode(f))}})})};var O=window.customElements;function Ha(){var a=new N;Fa(a);Ba(a);Z(a,DocumentFragment.prototype,{prepend:da,append:ea});Ga(a);Da(a);a=new Y(a);document.__CE_registry=a;Object.defineProperty(window,\"customElements\",{configurable:!0,enumerable:!0,value:a})}O&&!O.forcePolyfill&&\"function\"==typeof O.define&&\"function\"==typeof O.get||Ha();window.__CE_installPolyfill=Ha;\n}).call(self);\n\n//# sourceMappingURL=custom-elements.min.js.map\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetListViewManager.html -->\\n<div class=\"container flex-column-grid\">\\n\t<div class=\"dropdown\">\\n\t\t<a data-toggle=\"dropdown\" href=\"#\"><!-- required --></a>\\n\t\t<ul class=\"dropdown-menu nx-action-context\" role=\"menu\" data-action-context=\"assetContextMenu\"></ul>\\n\t</div>\\n\t\\n\t<div class=\"asset-list hide-empty flex-row-grid-wrap nx-asset-list\"></div>\\n\t\\n\t<div class=\"empty-results hide-loading show-empty\">\\n\t\t<div class=\"inner\">\\n\t\t\t<div>\\n\t\t\t\t<p class=\"text\" data-i18n=\"asset:i18n.noAssetsFound\">i18n.noAssetsFound</p>\\n\t\t\t</div>\\n\t\t</div>\\n\t</div>\\n\t\\n\t<div class=\"pager hide-loading hide-empty\" data-nx-pager></div>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetListView_card.html -->\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetListItemView_card.html -->\\n<div class=\"container\">\\n\t<div class=\"thumbnail-container nx-thumbnail-container '+\n((__t=( _.overrideDefaultIcon( thumbModUrl ) ))==null?'':__t)+\n'\">\\n\t\t<div class=\"thumbnail thumbnail-'+\n((__t=( orientation ))==null?'':__t)+\n' nx-thumbnail\">\\n\t\t\t';\n if( imgSrc ) { \n__p+='\\n\t\t\t<img class=\"thumb nx-thumbnail-image\" src=\"'+\n((__t=( imgSrc ))==null?'':__t)+\n'\" alt=\"'+\n((__t=( file ))==null?'':__t)+\n'\">\\n\t\t\t';\n } \n__p+='\\n\t\t\t<div class=\"expiration-indicator\"></div>\\n\t\t\t<div class=\"info\">\\n\t\t\t\t';\n if( status === 5 ) { \n__p+='\\n\t\t\t\t<div class=\"checkout\" title=\"'+\n((__t=( i18n.t('i18n.checkedOut') ))==null?'':_.escape(__t))+\n'\">'+\n((__t=( icons.faSignOutAlt ))==null?'':__t)+\n'</div>\\n\t\t\t\t';\n } \n__p+='\\n\t\t\t\t';\n if( readOnly === 1 ) { \n__p+='\\n\t\t\t\t<div data-nx-control=\"read-only\" title=\"'+\n((__t=( i18n.t('i18n.readOnly') ))==null?'':_.escape(__t))+\n'\">'+\n((__t=( icons.faLock ))==null?'':__t)+\n'</div>\\n\t\t\t\t';\n } \n__p+='\\n\t\t\t</div>\\n\t\t\t<div class=\"expires-in\"><span>'+\n((__t=( expiring ))==null?'':__t)+\n'</span><a class=\"nx-action\" data-action=\"asset:unexpire\">'+\n((__t=( icons.faTimes ))==null?'':__t)+\n'</a></div>\\n\t\t\t<div class=\"actions va\">\\n\t\t\t\t<a class=\"action cart\" data-nx-control=\"toggle-cart\"><div class=\"inner\">'+\n((__t=( icons.faCheck ))==null?'':__t)+\n'</div></a>\\n\t\t\t\t<a class=\"action download nx-action\" data-action=\"share:asset:download\"><div class=\"inner\">'+\n((__t=( icons.faArrowDown ))==null?'':__t)+\n'</div></a>\\n\t\t\t</div>\\n\t\t</div>\\n\t\t<div class=\"progress\" style=\"display: none;\">\\n\t\t\t<div class=\"progress-bar\" role=\"progressbar\" aria-valuenow=\"'+\n((__t=( percent ))==null?'':_.escape(__t))+\n'\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: '+\n((__t=( percent ))==null?'':__t)+\n'%;\">\\n\t\t\t\t<span class=\"sr-only\"></span>\\n\t\t\t</div>\\n\t\t\t<span class=\"filename\">'+\n((__t=( file ))==null?'':__t)+\n'</span>\\n\t\t\t<span class=\"progress-message nx-progress-message\">'+\n((__t=( progressMessage ))==null?'':__t)+\n'</span>\\n\t\t</div>\\n\t</div>\\n\t\\n\t<div class=\"asset-attributes-wrapper\">\\n\t\t<div class=\"main-attributes nx-asset-attributes\"></div>\\n\t\t<div class=\"system-attributes\">\\n\t\t\t';\n if ( filetypelabel ) { \n__p+='\\n\t\t\t<div class=\"attribute\">\\n\t\t\t\t<span class=\"text\">'+\n((__t=( filetypelabel ))==null?'':__t)+\n'</span>\\n\t\t\t</div>\\n\t\t\t';\n } \n__p+='\\n\t\t\t';\n if( isPhoto && ( filewidth || fileheight ) ) { \n__p+='\\n\t\t\t<div class=\"attribute\">\\n\t\t\t\t<span class=\"text\">'+\n((__t=( filewidth ))==null?'':__t)+\n' x '+\n((__t=( fileheight ))==null?'':__t)+\n' px</span>\\n\t\t\t</div>\\n\t\t\t';\n } else if( isPDF ) { \n__p+='\\n\t\t\t<div class=\"attribute\">\\n\t\t\t\t<span class=\"text\">'+\n((__t=( constituentIds.length ))==null?'':__t)+\n' Pages</span>\\n\t\t\t</div>\\n\t\t\t';\n } else if( videoUrl ) { \n__p+='\\n\t\t\t<div class=\"attribute\">\\n\t\t\t\t<span class=\"text\">'+\n((__t=( _.millisecondsToTimeStr( duration ) ))==null?'':__t)+\n'</span>\\n\t\t\t</div>\\n\t\t\t';\n } else if( _.indexOf( viewNames, 'previewMp3' ) !== -1 ) { \n__p+='\\n\\n\t\t\t';\n } \n__p+='\\n\t\t\t<div class=\"attribute\">\\n\t\t\t\t<span class=\"text\">'+\n((__t=( _.bytes( fileSize2, true ) ))==null?'':__t)+\n'</span>\\n\t\t\t</div>\\n\t\t</div>\\n\t</div>\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetAttributesView.html -->\\n<div class=\"container\">\\n\t<div class=\"inner\">\\n\t\t';\n _.each( assetAttributes, function( attr, idx ) { \n__p+='\\n\t\t\t';\n if (!attr.empty) { \n__p+='\\n\t\t\t<div class=\"attribute\" data-id=\"'+\n((__t=( attr.id ))==null?'':__t)+\n'\">\\n\t\t\t\t<label class=\"attribute-name\">'+\n((__t=( attr.label ))==null?'':__t)+\n'</label>\\n\t\t\t\t<p class=\"text\">'+\n((__t=( attr.formattedValue ))==null?'':__t)+\n'</p>\\n\t\t\t</div>\\n\t\t\t';\n } \n__p+='\\n\t\t';\n } ); \n__p+='\\n\t</div>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchFacetsView.html -->\\n<div data-nx-control=\"facets\" role=\"navigation\" class=\"nx-facets vertical-facets\">\\n\t<div class=\"nx-childviews flex-column-grid facet-list\"></div>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchFacetView.html -->\\n<div class=\"form-group\" data-nx-search-facet-options></div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchFacetOptionsView.html -->\\n<div class=\"facet-options selectpicker form-control\" multiple=\"multiple\" data-selected-text-format=\"static\" title=\"'+\n((__t=( title ))==null?'':__t)+\n'\"></div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchFacetOptionView.html -->\\n<span class=\\'text\\'>'+\n((__t=( title ))==null?'':__t)+\n'</span> <span class=\\'badge\\'>'+\n((__t=( count ))==null?'':__t)+\n'</span>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchFacetOptionListView.html -->\\n<a \\n\ttabindex=\"-1\"\\n\tdata-nx-control=\"option\" \\n\tclass=\"primary-color-hover primary-active focus-item\"\\n>\\n\t<span class=\"flex-row-grid\">\\n\t\t<span class=\"show-active\">'+\n((__t=( icons.faTimes ))==null?'':__t)+\n'</span>\\n\t\t<span class=\\'text\\'>'+\n((__t=( title ))==null?'':__t)+\n'</span>\\n\t\t<span class=\"count\">'+\n((__t=( count ))==null?'':__t)+\n'</span>\\n\t</span>\\n</a>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchFacetOptionsListView.html -->\\n<button class=\"focus-item\" data-toggle>\\n\t<label>'+\n((__t=( title ))==null?'':__t)+\n'</label>\\n\t<span class=\"open-indicator tree-mode\">'+\n((__t=( icons.faCaretLeft ))==null?'':__t)+\n'</span>\\n</button>\\n<ul class=\"nx-childviews\"></ul>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchFacetsSelectedView.html -->\\n<div class=\"container\">\\n\t<!-- where child views will be inserted -->\\n\t<div class=\"nx-childviews flex-row-grid\"></div>\\n\t<!-- !where child views will be inserted -->\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchFacetSelectedView.html -->\\n<div class=\"container\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"'+\n((__t=( facetTitle ))==null?'':__t)+\n'\">\\n\t<span class=\"text primary-color\">'+\n((__t=( title ))==null?'':__t)+\n'</span>\\n\t<a data-action=\"search:facet:option:deselect\" class=\"primary-color nx-action\">'+\n((__t=( icons.faTimes ))==null?'':__t)+\n'</a>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchGalleryView.html -->\\n<div class=\"container\">\\n\t<header class=\"nx-header\" data-nx-control=\"header\"></header>\\n\t<div class=\"flex-row-grid\">\\n\t\t<div class=\"nx-facets vertical-facets\" data-nx-control=\"facets\"></div>\\n\t\t<div class=\"flex-column-grid search-assets-container\">\\n\t\t\t<div id=\"search-assets\" class=\"flex-item nx-assets\"></div>\\n\t\t</div>\\n\t</div>\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchConstituentsGalleryView.html -->\\n<div class=\"container\">\\n\t<header class=\"nx-header\" data-nx-control=\"header\"></header>\\n\t\\n\t<div data-nx-control=\"scrollable-content\">\\n\t\t<div class=\"constituent-list-wrapper nx-assets\"></div>\\n\t</div>\\n\t\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchConstituentsGalleryHeaderView.html -->\\n<div class=\"container\">\\n\t<header class=\"header\">\\n\t\t<div class=\"header-details clearfix\">\\n\t\t\t<div class=\"abbreviate pull-left breadcrumbs nx-breadcrumbs\">\\n\t\t\t\t<a href=\"#\">'+\n((__t=( icons.faHome ))==null?'':__t)+\n'</a> /<span class=\"crumb nx-title\">'+\n((__t=( headerTitle ))==null?'':__t)+\n'</span>\\n\t\t\t</div>\\n\t\t</div>\\n\t\t<div class=\"header-title\">\\n\t\t\t<h2 class=\"title\">\\n\t\t\t\t<span class=\"text nx-title\">'+\n((__t=( headerTitle ))==null?'':__t)+\n'</span>\\n\t\t\t\t<span class=\"sub\"><span class=\"asset-count nx-count\">0</span></span>\\n\t\t\t</h2>\\n\t\t</div>\\n\t</header>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetConstituentsView.html -->\\n<div class=\"container\">\\n\t\\n\t<header class=\"header\">\\n\t\t<h2 class=\"title\"><span class=\"text\">'+\n((__t=( headerTitle ))==null?'':__t)+\n'</span></h2>\\n\t</header>\\n\t\\n\t<div class=\"container-fluid\">\\n\t\t<div class=\"constituents layer nx-childviews\"></div>\\n\t</div>\\n\t\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetConstituentView.html -->\\n<div class=\"nx-action\" data-action=\"asset:constituent:choose\">\\n\t<img class=\"thumb\" src=\"'+\n((__t=( thumbnailUrl ))==null?'':_.escape(__t))+\n'\">\\n\t';\n\n\t// this i18n value is handled in the initialize method of assetConstituentView.js\n\t\n__p+='\\n\t<input class=\"selected-constituent\" type=\"radio\" name=\"constituent-select\" value=\"true\" '+\n((__t=( selected ? 'checked' : '' ))==null?'':__t)+\n'>\\n\t<span class=\"abbreviate data title\">'+\n((__t=( title ))==null?'':__t)+\n'</span>\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchConstituentsListView_clips.html -->\\n<div class=\"container flex-column-grid\">\\n\t\\n\t<div class=\"constituents hide-loading hide-empty flex-row-grid-wrap curator-mode-1\">\\n\t\t<div class=\"flex-row-grid-wrap nx-childviews\"></div>\\n\t</div>\\n\t\\n\t<div class=\"empty-results hide-loading show-empty\">\\n\t\t<div class=\"inner\">\\n\t\t\t<p class=\"text\" data-i18n=\"asset:i18n.noAssetConstituentClipsFound\">i18n.noAssetConstituentClipsFound</p>\\n\t\t</div>\\n\t</div>\\n\t<div class=\"pager hide-loading hide-empty\"></div>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetConstituentView_clip.html -->\\n<div class=\"wrapper\">\\n\t<div class=\"action select-keyframe nx-action\" data-action=\"asset:constituent:choose\"></div>\\n\t<div class=\"actions va\">\\n\t\t<a class=\"action download nx-action\" data-action=\"asset:constituent:clip:download\"><div class=\"inner\">'+\n((__t=( icons.faArrowDown ))==null?'':__t)+\n'</div></a>\\n\t\t<a class=\"action edit nx-action\" data-action=\"asset:constituent:clip:edit\"><div class=\"inner\">'+\n((__t=( icons.faPencilAlt ))==null?'':__t)+\n'</div></a>\\n\t\t<a class=\"action delete nx-action\" data-action=\"asset:constituent:clip:delete\"><div class=\"inner\">'+\n((__t=( icons.faTrashAlt ))==null?'':__t)+\n'</div></a>\\n\t</div>\\n\t<div class=\"thumbnail va\">\\n\t\t';\n if( keyframeReady ) { \n__p+='\\n\t\t\t<img src=\"'+\n((__t=( thumbModUrl ))==null?'':_.escape(__t))+\n'\" alt=\"'+\n((__t=( title ))==null?'':__t)+\n'\">\\n\t\t';\n } \n__p+='\\n\t\t<div class=\"progress progress-striped\" style=\"display: none;\">\\n\t\t\t<div class=\"progress-bar\" role=\"progressbar\" aria-valuenow=\"'+\n((__t=( percent ))==null?'':_.escape(__t))+\n'\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: '+\n((__t=( percent ))==null?'':__t)+\n'%;\">\\n\t\t\t\t<span class=\"sr-only\"></span>\\n\t\t\t</div>\\n\t\t\t<span class=\"progress-message nx-progress-message\">'+\n((__t=( progressMessage ))==null?'':__t)+\n'</span>\\n\t\t</div>\\n\t</div>\\n</div>\\n<div class=\"flex-column-grid flex-item details\">\\n\t<div class=\"flex-item\">\\n\t\t<span class=\"title flex-item-fluid\"><span class=\"text\">'+\n((__t=( title ))==null?'':__t)+\n'</span></span>\\n\t</div>\\n\t<div class=\"duration\">\\n\t\t<span class=\"text\">'+\n((__t=( duration.pretty ))==null?'':__t)+\n'</span>\\n\t</div>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchConstituentsListItemView_clip.html -->\\n<div class=\"container\">\\n\t<div class=\"thumbnail-container\">\\n\t\t<div class=\"thumbnail va\">\\n\t\t\t<img class=\"thumb\" src=\"'+\n((__t=( thumbUrl ))==null?'':_.escape(__t))+\n'\">\\n\t\t\t<div class=\"actions\">\\n\t\t\t\t<!-- <a class=\"action edit nx-action\" data-action=\"asset:constituent:clip:edit\"><div class=\"inner\">'+\n((__t=( icons.faPencilAlt ))==null?'':__t)+\n'</div></a> -->\\n\t\t\t\t<a class=\"action download nx-action\" data-action=\"asset:constituent:clip:download\"><div class=\"inner\">'+\n((__t=( icons.faArrowDown ))==null?'':__t)+\n'</div></a>\\n\t\t\t</div>\\n\t\t</div>\\n\t</div>\\n\t<div class=\"asset-attributes-wrapper\">\\n\t\t<div class=\"main-attributes nx-asset-attributes\">\\n\t\t\t<div class=\"asset-attributes\">\\n\t\t\t\t<span class=\"text\" title=\"'+\n((__t=( title ))==null?'':_.escape(__t))+\n'\">'+\n((__t=( title ))==null?'':_.escape(__t))+\n'</span>\\n\t\t\t</div>\\n\t\t</div>\\n\t\t<div class=\"system-attributes\">\\n\t\t\t<!-- <div class=\"attribute start-time hide-list hide-grid\"><span class=\"text\">'+\n((__t=( prettyRange.startTime ))==null?'':__t)+\n'</span></div>\\n\t\t\t<div class=\"attribute end-time hide-list hide-grid\"><span class=\"text\">'+\n((__t=( prettyRange.endTime ))==null?'':__t)+\n'</span></div> -->\\n\t\t\t<div class=\"attribute duration hide-list hide-grid\"><span class=\"text\">'+\n((__t=( duration.pretty ))==null?'':__t)+\n'</span></div>\\n\t\t</div>\\n\t</div>\\n</div>';\n}\nreturn __p;\n};\n","export * from './keywordRule';\nexport {default} from './keywordRule';\n\nexport * from './components';\nexport * from './constants';\nexport * from './defaults';\nexport * from './locales';\nexport * from './model';\nexport * from './types';\nexport * from './utils';\nexport * from './validate';\n","export * from './metadataRule';\nexport {default} from './metadataRule';\n\nexport * from './components';\nexport * from './constants';\nexport * from './defaults';\nexport * from './locales';\nexport * from './model';\nexport * from './types';\nexport * from './utils';\nexport * from './validate';\n","import {arrayToCsv} from '@netx/core/utils';\nimport {dateSubTypes1_default} from '@netx/core-search/properties/search';\nimport {\n\tDEFAULT_SEARCH_SORT_FIELD,\n\tDEFAULT_SEARCH_SORT_ORDER,\n\tSALO_STRING_MAP,\n} from '../constants';\nimport {SearchType} from '../rules/constants';\nimport {CheckoutType} from '../rules/checkouts/constants';\nimport {DateType, DateSubType} from '../rules/date/constants';\nimport {metadataNameHackOut} from '../rules/metadata/utils';\nimport type {SearchCriteria, SmallSALO} from '../types';\n\n/**\n * Handles quirks in how data was presented to the user vs sent to the server\\\n * This is to support old advanced search urls that may have been bookmarked\n * @note this is no longer used by the advanced search editor\n * @param searchCriteria\n * @returns\n */\nexport const correctSearchCriteriaQuirks = (searchCriteria: SearchCriteria) => {\n\t// quirks from our editor\n\t// TODO: this should be unnecessary once we can tackle that guy\n\tsearchCriteria.elementTypes.forEach((elementType, index) => {\n\t\tswitch (elementType) {\n\t\t\tcase SearchType.METADATA: {\n\t\t\t\tsearchCriteria.elementValue2s[index] = metadataNameHackOut(\n\t\t\t\t\tsearchCriteria.elementValue2s[index].toString(),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SearchType.DATE: {\n\t\t\t\t// DAM-16349 - in-between date search rules needs adjusting (and refactoring)\n\t\t\t\t// so it does not need the below date hacking\n\t\t\t\t// (even grosser) Do not apply this hack if it was a system defined date\n\t\t\t\tif (\n\t\t\t\t\tsearchCriteria.elementSubType2s[index] === DateSubType.IN_BETWEEN &&\n\t\t\t\t\t// Not user defined date attributes\n\t\t\t\t\t[\n\t\t\t\t\t\tDateType.CREATION_DATE,\n\t\t\t\t\t\tDateType.IMPORT_DATE,\n\t\t\t\t\t\tDateType.LAST_MODIFIED,\n\t\t\t\t\t].includes(searchCriteria.elementSubType1s[index])\n\t\t\t\t) {\n\t\t\t\t\t// assume already corrected\n\t\t\t\t\tif (searchCriteria.elementValue3s[index] === '') break;\n\t\t\t\t\t// toDate goes in value2 (editor puts it in value3)\n\t\t\t\t\tsearchCriteria.elementValue2s[index] =\n\t\t\t\t\t\tsearchCriteria.elementValue3s[index];\n\t\t\t\t\t// empty out what the editor was claiming to be value3 (which is only used for user defined attributes)\n\t\t\t\t\tsearchCriteria.elementValue3s[index] = '';\n\t\t\t\t}\n\t\t\t\t// DEVNOTE: obscure corner case bug here.\n\t\t\t\t// .. then it's an attribute Date search.\n\t\t\t\t// In the UI, Date attributes automagically show up on the 'date' search type UI, and have subtype ids other than the standard set of them.\n\t\t\t\t// But these searches are encoded differently.\n\t\t\t\t// In order for this search to work, elementSubType1 can not reference the option in the dropdown but needs to use the value of 2 to signify that we want to use a\n\t\t\t\t// date attribute - and the value we have chosen via elementSubType1 becomes the value for elementValue3\n\t\t\t\t// Therefore: change elementSubType1 to 2 and elementValue3 to the name of the attr, which is the elementSubType1 value\n\t\t\t\t// This will not run if already corrected since the elementSubType1s _should_ no longer match a system defined attribute\n\t\t\t\t// TODO:\n\t\t\t\telse if (\n\t\t\t\t\t!dateSubTypes1_default.find(\n\t\t\t\t\t\t(item) => item.val === searchCriteria.elementSubType1s[index],\n\t\t\t\t\t) &&\n\t\t\t\t\tsearchCriteria.elementSubType1s[index] !==\n\t\t\t\t\t\tDateType.USER_DEFINED_ATTRIBUTE\n\t\t\t\t) {\n\t\t\t\t\t// value2 is actually the value of the attribute\n\t\t\t\t\tsearchCriteria.elementValue2s[index] =\n\t\t\t\t\t\tsearchCriteria.elementValue3s[index];\n\t\t\t\t\t// subType1 is actually our attribute name\n\t\t\t\t\tsearchCriteria.elementValue3s[index] =\n\t\t\t\t\t\tsearchCriteria.elementSubType1s[index];\n\t\t\t\t\t// tell it that it is a custom type\n\t\t\t\t\tsearchCriteria.elementSubType1s[index] =\n\t\t\t\t\t\tDateType.USER_DEFINED_ATTRIBUTE;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SearchType.CHECKOUTS: {\n\t\t\t\t// if all is selected, java seems to want user id to be 0\n\t\t\t\tif (searchCriteria.elementSubType1s[index] === CheckoutType.ALL) {\n\t\t\t\t\t// TODO: does it want zero here to say no user - or is it wanting us to signify\n\t\t\t\t\t// CheckoutSubType1.ALL again explicitly\n\t\t\t\t\t// I know it really does not make a difference right now... but would be good to\n\t\t\t\t\t// tie it to a enum if it is...\n\t\t\t\t\tsearchCriteria.elementValue1s[index] = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn searchCriteria;\n};\n\n/**\n * Helper for converting condensed search criteria to full search criteria object\n * @param smallSALO\n * @returns Search criteria\n */\nexport const getSearchCriteriaFromSmallSALO = (smallSALO: SmallSALO) => {\n\tconst searchCriteria = Object.entries(SALO_STRING_MAP).reduce<SearchCriteria>(\n\t\t(accum, [key, realName]) => {\n\t\t\tlet value = smallSALO[key as keyof typeof SALO_STRING_MAP];\n\t\t\tif (value == null) return accum;\n\t\t\tswitch (realName) {\n\t\t\t\tcase 'elementValue1s':\n\t\t\t\tcase 'elementValue2s':\n\t\t\t\tcase 'elementValue3s':\n\t\t\t\t\t// TODO: is this actually neccessary - we should not have arrays for values\n\t\t\t\t\t// given how we break everything up before submitting search rules\n\t\t\t\t\tvalue = (value as Array<string | number>).map((val) =>\n\t\t\t\t\t\tArray.isArray(val) ? arrayToCsv(val) : val,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\taccum[realName] = value as unknown as never;\n\t\t\treturn accum;\n\t\t},\n\t\t{\n\t\t\tsortField: DEFAULT_SEARCH_SORT_FIELD,\n\t\t\tsortOrder: DEFAULT_SEARCH_SORT_ORDER,\n\t\t\tmatchCriteria: 0,\n\t\t\telementTypes: [],\n\t\t\telementSubType1s: [],\n\t\t\telementSubType2s: [],\n\t\t\telementValue1s: [],\n\t\t\telementValue2s: [],\n\t\t\telementValue3s: [],\n\t\t},\n\t);\n\n\treturn correctSearchCriteriaQuirks(searchCriteria);\n};\n\nexport default getSearchCriteriaFromSmallSALO;\n","export * from './cartRule';\nexport {default} from './cartRule';\n\nexport * from './components';\nexport * from './constants';\nexport * from './defaults';\nexport * from './model';\nexport * from './types';\nexport * from './utils';\n","export * from './actions';\nexport * from './enablers';\nexport * from './hooks';\nexport * from './locales';\nexport * from './types';\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-search/templates/searchGalleryHeaderView.html -->\\n<header class=\"nx-header\">\\n\t<div class=\"list-actions-bar flex-row-grid flex-align-center flex-justify-space\">\\n\t\t<div class=\"flex-row-grid flex-align-center\">\\n\t\t\t<button data-nx-control=\"filters\" title=\"'+\n((__t=( i18n.t('i18n.filters') ))==null?'':__t)+\n'\" class=\"primary-color-hover\">'+\n((__t=( icons.faSlidersH ))==null?'':__t)+\n'</button>\\n\t\t\t<span class=\"asset-count nx-count\" data-count=\"0\">0</span>\\n\t\t\t<span class=\"gallery-title\">\\n\t\t\t\t<span class=\"text\">Search: </span><span class=\"text nx-searchterm\">'+\n((__t=( headerTitle ))==null?'':__t)+\n'</span>\\n\t\t\t</span>\\n\t\t\t<button class=\"checkbox inline selectAll nx-select-all\">\\n\t\t\t\t<label for=\"folderAddAll-'+\n((__t=( this.cid ))==null?'':__t)+\n'\"><span class=\"text\"> <span class=\"title primary-color-hover\" data-i18n=\"i18n.selectAll\">i18n.selectAll</span></span></label>\\n\t\t\t</button>\\n\t\t</div>\\n\t\t<div class=\"controls nx-sort flex-row-grid flex-align-center flex-justify-end\"></div>\\n\t</div>\\n</header>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetConstituentDownloadView_clip.html -->\\n<div class=\"container\">\\n\t<form id=\"asset-constituent-download-view-clip-form\" role=\"form\">\\n\t\t<header>\\n\t\t\t<h2 class=\"title\"><span class=\"text\">'+\n((__t=( headerTitle ))==null?'':__t)+\n'</span></h2>\\n\t\t</header>\\n\t\t\\n\t\t<div class=\"container-fluid\">\\n\t\t\t\\n\t\t\t<div class=\"thumbnail va\">\\n\t\t\t\t<img src=\"'+\n((__t=( previewUrl ))==null?'':_.escape(__t))+\n'?t='+\n((__t=( new Date().getTime() ))==null?'':__t)+\n'\">\\n\t\t\t</div>\\n\t\t\t\\n\t\t\t<div class=\"form-group required\">\\n\t\t\t\t<label class=\"control-label\"><span data-i18n=\"i18n.videoFormat\">i18n.videoFormat</span></label>\\n\t\t\t\t<select class=\"selectpicker form-control\" autofocus required name=\"process\">\\n\t\t\t\t\t<option value=\"-1\" data-i18n=\"i18n.pleaseSelect\">i18n.pleaseSelect</option>\\n\t\t\t\t\t';\n _.each( presets, function( p, idx ) { \n__p+='\\n\t\t\t\t\t<option value=\"'+\n((__t=( idx ))==null?'':_.escape(__t))+\n'\">'+\n((__t=( p.get('label') || p.get('name') ))==null?'':__t)+\n'</option>\\n\t\t\t\t\t';\n } ); \n__p+='\\n\t\t\t\t</select>\\n\t\t\t</div>\\n\t\t\t\\n\t\t</div>\\n\t\t\\n\t\t<footer>\\n\t\t\t<div class=\"actions\">\\n\t\t\t\t<aside>\\n\t\t\t\t\t<button type=\"button\" class=\"btn btn-default cancel nx-cancel\" data-nx-control=\"cancel\"><span class=\"text\" data-i18n=\"i18n.cancel\">i18n.cancel</span></button>\\n\t\t\t\t</aside>\\n\t\t\t\t<bside>\\n\t\t\t\t\t<button type=\"submit\" class=\"btn btn-save submit\" data-nx-control=\"save\"><span class=\"text\" data-i18n=\"i18n.download\">i18n.download</span></button>\\n\t\t\t\t</bside>\\n\t\t\t</div>\\n\t\t</footer>\\n\t</form>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetDetailView.html -->\\n<div class=\"container no_recurse flex-column-grid\">\\n\t<div class=\"loader va\">\\n\t\t<div class=\"clearfix\">\\n\t\t\t<svg class=\"spinner\" width=\"65px\" height=\"65px\" viewBox=\"0 0 66 66\" xmlns=\"http://www.w3.org/2000/svg\">\\n\t\t\t\t<circle class=\"path\" fill=\"none\" stroke-width=\"6\" stroke-linecap=\"round\" cx=\"33\" cy=\"33\" r=\"30\"></circle>\\n\t\t\t</svg>\\n\t\t</div>\\n\t</div>\\n\t<header class=\"flex-column-grid\">\\n\\n\t\t<div id=\"detailcrumb\" class=\"crummy abbreviate pull-left\">\\n\t\t\t<a href=\"\" data-nx-control=\"back\" class=\"text-color\">\\n\t\t\t\t'+\n((__t=( icons.faLongArrowAltLeft ))==null?'':__t)+\n'\\n\t\t\t\t<span data-i18n=\"i18n.returnToList\">i18n.returnToList</span>\\n\t\t\t</a>\\n\t\t</div>\\n\\n\t\t<div class=\"sub-header flex-row-grid\">\\n\t\t\t<h4 name=\"name\" class=\"pull-left\">'+\n((__t=( name ))==null?'':_.escape(__t))+\n'</h4>\\n\\n\t\t\t<div class=\"actions pull-right desktop-only\">\\n\t\t\t\t<div class=\"action-list dropdown mdc-menu-surface--anchor\">\\n\t\t\t\t\t<button title=\"'+\n((__t=( i18n.t('i18n.actions') ))==null?'':__t)+\n'\" class=\"dropdown-toggle title btn btn-primary primary-background menu-button skip-to-here\">'+\n((__t=( icons.faBolt ))==null?'':__t)+\n'<span data-i18n=\"asset:i18n.actions\"></span> <b class=\"caret\"></b></button>\\n\t\t\t\t\t<div id=\"asset-detail-actions\" class=\"mdc-menu mdc-menu--hoist mdc-menu-surface dropdown-menu nx-action-context\" data-action-context=\"assetDetail\" data-nx-template=\"menuView-context\"></div>\\n\t\t\t\t</div>\\n\t\t\t</div>\\n\\n\t\t</div>\\n\t</div>\\n\\n\t<!-- <div class=\\'sub-header clearfix\\'>\\n\\n\t</div> -->\\n\\n\t<div class=\"flex-row-grid detail-body\">\\n\t\t<div data-nx-pager class=\"pager hide-loading\"></div>\\n\t\t<div id=\"asset-preview\" class=\"nx-preview-view\"></div>\\n\t\t<div id=\"asset-info\">\\n\t\t\t<div id=\"asset-fileinfo\" class=\"asset-fileinfo asset-detail nx-file-info-view\"></div>\\n\t\t\t<div id=\"asset-attributes\" class=\"asset-attributes asset-detail nx-attributes-view\"></div>\\n\t\t</div>\\n\t</div>\\n\\n\t<div id=\"asset-list\" class=\"subview assets-view asset-links nx-assets nx-list-view\"></div>\\n\t<div id=\"template-customizations\" class=\"subview template-customizations\"></div>\\n\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetLinksView.html -->\\n\\n<header>\\n\t<div class=\"header-title\">\\n\t\t<div class=\"flex-row-grid\">\\n\t\t\t<span data-i18n=\"i18n.related\">i18n.related</span>\\n\t\t\t<hr />\\n\t\t\t<button class=\"checkbox inline selectAll nx-select-all\" title=\"'+\n((__t=( i18n.t('i18n.selectAll') ))==null?'':__t)+\n'\">\\n\t\t\t\t<label for=\"folderAddAll-'+\n((__t=( this.cid ))==null?'':__t)+\n'\"><span class=\"text\"> <span class=\"title primary-color-hover\" data-i18n=\"i18n.selectAll\">i18n.selectAll</span></span></label>\\n\t\t\t</button>\\n\t\t</div>\\n\t</div>\\n</header>\\n<div class=\"flex-row-grid\">\\n\t<div class=\"container no_recurse\">\\n\t\t<div class=\"assets hide-loading hide-empty\" data-layer data-nx-thumbsize=\"'+\n((__t=( Netx.user.prefs.getPreference('assetList.thumbSize') ))==null?'':__t)+\n'\">\\n\t\t\t<div class=\"nx-asset-list nx-childviews flex-row-grid-wrap\"></div>\\n\t\t</div>\\n\t\t<div id=\"listViewLoader-'+\n((__t=( this.cid ))==null?'':__t)+\n'\" class=\"list-loader nx-autotemplate\" data-nx-template=\"loader\"></div>\\n\t\t<div data-nx-pager class=\"hide-loading hide-empty pager\"></div>\\n\t\t<div class=\"empty-results show-empty hide-loading\">\\n\t\t\t<span class=\"text\">\\n\t\t\t\t<p>No results found.</p>\\n\t\t\t</span>\\n\t\t</div>\\n\t</div>\\n\\n<div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetDetailPreviewView.html -->\\n<!-- this is where the proper preview view will be injected -->\\n<div class=\"preview-wrapper nx-preview-wrapper va\">\\n\t<!-- pager -->\\n<!-- \t<div class=\"asset-detail-preview-pager pager nx-pager\" data-nx-pager></div> -->\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetQuickzoomView.html -->\\n<div class=\"zoom-container\">\\n\t<img class=\"zoom\" src=\"'+\n((__t=( zoomUrl ))==null?'':__t)+\n'\" />\\n</div>\\n<div id=\"'+\n((__t=( this.cid ))==null?'':__t)+\n'\" class=\"list-loader va nx-autotemplate\" data-nx-template=\"loader\"></div>\\n<div class=\"zoom-controls top-left\">\\n\t<button class=\"btn zoomIn\" data-nx-control=\"zoom-in\" title=\"Zoom in\">+</button>\\n\t<button class=\"btn zoomOut\" data-nx-control=\"zoom-out\" title=\"Zoom out\">-</button>\\n</div>\\n<div class=\"zoom-controls bottom'+\n((__t=( zoomEnabled ? ' with-tile': '' ))==null?'':__t)+\n'\">\\n\t<button class=\"btn btn-primary primary-background\" data-nx-control=\"zoom-reset\" title=\"Reset (0)\">'+\n((__t=( icons.faStop ))==null?'':__t)+\n'<span data-i18n=\"i18n.reset\">i18n.reset</span></button>\\n\t<button class=\"btn btn-primary primary-background\" data-nx-control=\"close\" title=\"Close (esc)\">'+\n((__t=( icons.faTimesCircle ))==null?'':__t)+\n'<span data-i18n=\"i18n.close\">i18n.close</span></button>\\n\t';\n if(isAsset && !isTemplate && zoomEnabled) { \n__p+='\\n\t<button class=\"btn btn-primary primary-background nx-action\" data-nx-action=\"asset:zoom:route\" title=\"Full zoom\">'+\n((__t=( icons.faExpandArrows ))==null?'':__t)+\n'<span data-i18n=\"i18n.fullZoom\">i18n.fullZoom</span></button>\\n\t';\n } \n__p+='\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetZoomifyView.html -->\\n<div class=\"container\">\\n\t<div id=\"'+\n((__t=( this.cid ))==null?'':__t)+\n'\" class=\"loading-spinner abs va nx-autotemplate\" data-nx-template=\"loader\"></div>\\n\t<div class=\"zoomWrapper container-fluid\">\\n\t\t<div id=\"zoom-canvas-'+\n((__t=( assetId ))==null?'':__t)+\n'\" class=\"abs\"></div>\\n\t\t<div class=\"controls\">\\n\t\t\t<!-- <button class=\"btn zoomIn\" title=\"Zoom In (+)\">'+\n((__t=( icons.faSearchPlus ))==null?'':__t)+\n'</button> -->\\n\t\t\t<!-- <button class=\"btn zoomOut\" title=\"Zoom Out (-)\">'+\n((__t=( icons.faSearchMinus ))==null?'':__t)+\n'</button> -->\\n\t\t\t<button class=\"btn btn-primary zoomReset primary-background\" title=\"Reset (0)\">'+\n((__t=( icons.faStop ))==null?'':__t)+\n'<span class=\"btn-text\" data-i18n=\"asset:i18n.reset\"></span></button>\\n\t\t\t';\n if (canClose) { \n__p+='\\n\t\t\t<button class=\"btn btn-primary zoomClose primary-background\" title=\"Close (esc)\">'+\n((__t=( icons.faTimesCircle ))==null?'':__t)+\n'<span class=\"btn-text\" data-i18n=\"asset:i18n.close\"></span></button>\\n\t\t\t';\n } \n__p+='\\n\t\t</div>\\n\t</div>\\n</div>\\n';\n}\nreturn __p;\n};\n","/*** IMPORTS FROM imports-loader ***/\n\nvar define = false; /* Disable AMD for misbehaving libraries */\n\n/*** IMPORTS FROM imports-loader ***/\n\nvar require = false; var exports = null;\n\n/*\n Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com\n (c) 2010-2013, Vladimir Agafonkin\n (c) 2010-2011, CloudMade\n*/\n(function (window, document, undefined) {\r\nvar oldL = window.L,\r\n L = {};\r\n\r\nL.version = '0.7.2';\r\n\r\n// define Leaflet for Node module pattern loaders, including Browserify\r\nif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\tmodule.exports = L;\r\n\r\n// define Leaflet as an AMD module\r\n} else if (typeof define === 'function' && define.amd) {\r\n\tdefine(L);\r\n}\r\n\r\n// define Leaflet as a global L variable, saving the original L to restore later if needed\r\n\r\nL.noConflict = function () {\r\n\twindow.L = oldL;\r\n\treturn this;\r\n};\r\n\r\nwindow.L = L;\r\n\n\n/*\r\n * L.Util contains various utility functions used throughout Leaflet code.\r\n */\r\n\r\nL.Util = {\r\n\textend: function (dest) { // (Object[, Object, ...]) ->\r\n\t\tvar sources = Array.prototype.slice.call(arguments, 1),\r\n\t\t i, j, len, src;\r\n\r\n\t\tfor (j = 0, len = sources.length; j < len; j++) {\r\n\t\t\tsrc = sources[j] || {};\r\n\t\t\tfor (i in src) {\r\n\t\t\t\tif (src.hasOwnProperty(i)) {\r\n\t\t\t\t\tdest[i] = src[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn dest;\r\n\t},\r\n\r\n\tbind: function (fn, obj) { // (Function, Object) -> Function\r\n\t\tvar args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null;\r\n\t\treturn function () {\r\n\t\t\treturn fn.apply(obj, args || arguments);\r\n\t\t};\r\n\t},\r\n\r\n\tstamp: (function () {\r\n\t\tvar lastId = 0,\r\n\t\t key = '_leaflet_id';\r\n\t\treturn function (obj) {\r\n\t\t\tobj[key] = obj[key] || ++lastId;\r\n\t\t\treturn obj[key];\r\n\t\t};\r\n\t}()),\r\n\r\n\tinvokeEach: function (obj, method, context) {\r\n\t\tvar i, args;\r\n\r\n\t\tif (typeof obj === 'object') {\r\n\t\t\targs = Array.prototype.slice.call(arguments, 3);\r\n\r\n\t\t\tfor (i in obj) {\r\n\t\t\t\tmethod.apply(context, [i, obj[i]].concat(args));\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\tlimitExecByInterval: function (fn, time, context) {\r\n\t\tvar lock, execOnUnlock;\r\n\r\n\t\treturn function wrapperFn() {\r\n\t\t\tvar args = arguments;\r\n\r\n\t\t\tif (lock) {\r\n\t\t\t\texecOnUnlock = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlock = true;\r\n\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tlock = false;\r\n\r\n\t\t\t\tif (execOnUnlock) {\r\n\t\t\t\t\twrapperFn.apply(context, args);\r\n\t\t\t\t\texecOnUnlock = false;\r\n\t\t\t\t}\r\n\t\t\t}, time);\r\n\r\n\t\t\tfn.apply(context, args);\r\n\t\t};\r\n\t},\r\n\r\n\tfalseFn: function () {\r\n\t\treturn false;\r\n\t},\r\n\r\n\tformatNum: function (num, digits) {\r\n\t\tvar pow = Math.pow(10, digits || 5);\r\n\t\treturn Math.round(num * pow) / pow;\r\n\t},\r\n\r\n\ttrim: function (str) {\r\n\t\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n\t},\r\n\r\n\tsplitWords: function (str) {\r\n\t\treturn L.Util.trim(str).split(/\\s+/);\r\n\t},\r\n\r\n\tsetOptions: function (obj, options) {\r\n\t\tobj.options = L.extend({}, obj.options, options);\r\n\t\treturn obj.options;\r\n\t},\r\n\r\n\tgetParamString: function (obj, existingUrl, uppercase) {\r\n\t\tvar params = [];\r\n\t\tfor (var i in obj) {\r\n\t\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n\t\t}\r\n\t\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n\t},\r\n\ttemplate: function (str, data) {\r\n\t\treturn str.replace(/\\{ *([\\w_]+) *\\}/g, function (str, key) {\r\n\t\t\tvar value = data[key];\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tthrow new Error('No value provided for variable ' + str);\r\n\t\t\t} else if (typeof value === 'function') {\r\n\t\t\t\tvalue = value(data);\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t});\r\n\t},\r\n\r\n\tisArray: Array.isArray || function (obj) {\r\n\t\treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n\t},\r\n\r\n\temptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='\r\n};\r\n\r\n(function () {\r\n\r\n\t// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\n\tfunction getPrefixed(name) {\r\n\t\tvar i, fn,\r\n\t\t prefixes = ['webkit', 'moz', 'o', 'ms'];\r\n\r\n\t\tfor (i = 0; i < prefixes.length && !fn; i++) {\r\n\t\t\tfn = window[prefixes[i] + name];\r\n\t\t}\r\n\r\n\t\treturn fn;\r\n\t}\r\n\r\n\tvar lastTime = 0;\r\n\r\n\tfunction timeoutDefer(fn) {\r\n\t\tvar time = +new Date(),\r\n\t\t timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n\t\tlastTime = time + timeToCall;\r\n\t\treturn window.setTimeout(fn, timeToCall);\r\n\t}\r\n\r\n\tvar requestFn = window.requestAnimationFrame ||\r\n\t getPrefixed('RequestAnimationFrame') || timeoutDefer;\r\n\r\n\tvar cancelFn = window.cancelAnimationFrame ||\r\n\t getPrefixed('CancelAnimationFrame') ||\r\n\t getPrefixed('CancelRequestAnimationFrame') ||\r\n\t function (id) { window.clearTimeout(id); };\r\n\r\n\r\n\tL.Util.requestAnimFrame = function (fn, context, immediate, element) {\r\n\t\tfn = L.bind(fn, context);\r\n\r\n\t\tif (immediate && requestFn === timeoutDefer) {\r\n\t\t\tfn();\r\n\t\t} else {\r\n\t\t\treturn requestFn.call(window, fn, element);\r\n\t\t}\r\n\t};\r\n\r\n\tL.Util.cancelAnimFrame = function (id) {\r\n\t\tif (id) {\r\n\t\t\tcancelFn.call(window, id);\r\n\t\t}\r\n\t};\r\n\r\n}());\r\n\r\n// shortcuts for most used utility functions\r\nL.extend = L.Util.extend;\r\nL.bind = L.Util.bind;\r\nL.stamp = L.Util.stamp;\r\nL.setOptions = L.Util.setOptions;\r\n\n\n/*\r\n * L.Class powers the OOP facilities of the library.\r\n * Thanks to John Resig and Dean Edwards for inspiration!\r\n */\r\n\r\nL.Class = function () {};\r\n\r\nL.Class.extend = function (props) {\r\n\r\n\t// extended class with the new prototype\r\n\tvar NewClass = function () {\r\n\r\n\t\t// call the constructor\r\n\t\tif (this.initialize) {\r\n\t\t\tthis.initialize.apply(this, arguments);\r\n\t\t}\r\n\r\n\t\t// call all constructor hooks\r\n\t\tif (this._initHooks) {\r\n\t\t\tthis.callInitHooks();\r\n\t\t}\r\n\t};\r\n\r\n\t// instantiate class without calling constructor\r\n\tvar F = function () {};\r\n\tF.prototype = this.prototype;\r\n\r\n\tvar proto = new F();\r\n\tproto.constructor = NewClass;\r\n\r\n\tNewClass.prototype = proto;\r\n\r\n\t//inherit parent's statics\r\n\tfor (var i in this) {\r\n\t\tif (this.hasOwnProperty(i) && i !== 'prototype') {\r\n\t\t\tNewClass[i] = this[i];\r\n\t\t}\r\n\t}\r\n\r\n\t// mix static properties into the class\r\n\tif (props.statics) {\r\n\t\tL.extend(NewClass, props.statics);\r\n\t\tdelete props.statics;\r\n\t}\r\n\r\n\t// mix includes into the prototype\r\n\tif (props.includes) {\r\n\t\tL.Util.extend.apply(null, [proto].concat(props.includes));\r\n\t\tdelete props.includes;\r\n\t}\r\n\r\n\t// merge options\r\n\tif (props.options && proto.options) {\r\n\t\tprops.options = L.extend({}, proto.options, props.options);\r\n\t}\r\n\r\n\t// mix given properties into the prototype\r\n\tL.extend(proto, props);\r\n\r\n\tproto._initHooks = [];\r\n\r\n\tvar parent = this;\r\n\t// jshint camelcase: false\r\n\tNewClass.__super__ = parent.prototype;\r\n\r\n\t// add method for calling all hooks\r\n\tproto.callInitHooks = function () {\r\n\r\n\t\tif (this._initHooksCalled) { return; }\r\n\r\n\t\tif (parent.prototype.callInitHooks) {\r\n\t\t\tparent.prototype.callInitHooks.call(this);\r\n\t\t}\r\n\r\n\t\tthis._initHooksCalled = true;\r\n\r\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n\t\t\tproto._initHooks[i].call(this);\r\n\t\t}\r\n\t};\r\n\r\n\treturn NewClass;\r\n};\r\n\r\n\r\n// method for adding properties to prototype\r\nL.Class.include = function (props) {\r\n\tL.extend(this.prototype, props);\r\n};\r\n\r\n// merge new default options to the Class\r\nL.Class.mergeOptions = function (options) {\r\n\tL.extend(this.prototype.options, options);\r\n};\r\n\r\n// add a constructor hook\r\nL.Class.addInitHook = function (fn) { // (Function) || (String, args...)\r\n\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\tvar init = typeof fn === 'function' ? fn : function () {\r\n\t\tthis[fn].apply(this, args);\r\n\t};\r\n\r\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n\tthis.prototype._initHooks.push(init);\r\n};\r\n\n\n/*\r\n * L.Mixin.Events is used to add custom events functionality to Leaflet classes.\r\n */\r\n\r\nvar eventsKey = '_leaflet_events';\r\n\r\nL.Mixin = {};\r\n\r\nL.Mixin.Events = {\r\n\r\n\taddEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object])\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar events = this[eventsKey] = this[eventsKey] || {},\r\n\t\t contextId = context && context !== this && L.stamp(context),\r\n\t\t i, len, event, type, indexKey, indexLenKey, typeIndex;\r\n\r\n\t\t// types can be a string of space-separated words\r\n\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\tfor (i = 0, len = types.length; i < len; i++) {\r\n\t\t\tevent = {\r\n\t\t\t\taction: fn,\r\n\t\t\t\tcontext: context || this\r\n\t\t\t};\r\n\t\t\ttype = types[i];\r\n\r\n\t\t\tif (contextId) {\r\n\t\t\t\t// store listeners of a particular context in a separate hash (if it has an id)\r\n\t\t\t\t// gives a major performance boost when removing thousands of map layers\r\n\r\n\t\t\t\tindexKey = type + '_idx';\r\n\t\t\t\tindexLenKey = indexKey + '_len';\r\n\r\n\t\t\t\ttypeIndex = events[indexKey] = events[indexKey] || {};\r\n\r\n\t\t\t\tif (!typeIndex[contextId]) {\r\n\t\t\t\t\ttypeIndex[contextId] = [];\r\n\r\n\t\t\t\t\t// keep track of the number of keys in the index to quickly check if it's empty\r\n\t\t\t\t\tevents[indexLenKey] = (events[indexLenKey] || 0) + 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttypeIndex[contextId].push(event);\r\n\r\n\r\n\t\t\t} else {\r\n\t\t\t\tevents[type] = events[type] || [];\r\n\t\t\t\tevents[type].push(event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasEventListeners: function (type) { // (String) -> Boolean\r\n\t\tvar events = this[eventsKey];\r\n\t\treturn !!events && ((type in events && events[type].length > 0) ||\r\n\t\t (type + '_idx' in events && events[type + '_idx_len'] > 0));\r\n\t},\r\n\r\n\tremoveEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object])\r\n\r\n\t\tif (!this[eventsKey]) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (!types) {\r\n\t\t\treturn this.clearAllEventListeners();\r\n\t\t}\r\n\r\n\t\tif (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar events = this[eventsKey],\r\n\t\t contextId = context && context !== this && L.stamp(context),\r\n\t\t i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed;\r\n\r\n\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\tfor (i = 0, len = types.length; i < len; i++) {\r\n\t\t\ttype = types[i];\r\n\t\t\tindexKey = type + '_idx';\r\n\t\t\tindexLenKey = indexKey + '_len';\r\n\r\n\t\t\ttypeIndex = events[indexKey];\r\n\r\n\t\t\tif (!fn) {\r\n\t\t\t\t// clear all listeners for a type if function isn't specified\r\n\t\t\t\tdelete events[type];\r\n\t\t\t\tdelete events[indexKey];\r\n\t\t\t\tdelete events[indexLenKey];\r\n\r\n\t\t\t} else {\r\n\t\t\t\tlisteners = contextId && typeIndex ? typeIndex[contextId] : events[type];\r\n\r\n\t\t\t\tif (listeners) {\r\n\t\t\t\t\tfor (j = listeners.length - 1; j >= 0; j--) {\r\n\t\t\t\t\t\tif ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) {\r\n\t\t\t\t\t\t\tremoved = listeners.splice(j, 1);\r\n\t\t\t\t\t\t\t// set the old action to a no-op, because it is possible\r\n\t\t\t\t\t\t\t// that the listener is being iterated over as part of a dispatch\r\n\t\t\t\t\t\t\tremoved[0].action = L.Util.falseFn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (context && typeIndex && (listeners.length === 0)) {\r\n\t\t\t\t\t\tdelete typeIndex[contextId];\r\n\t\t\t\t\t\tevents[indexLenKey]--;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclearAllEventListeners: function () {\r\n\t\tdelete this[eventsKey];\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfireEvent: function (type, data) { // (String[, Object])\r\n\t\tif (!this.hasEventListeners(type)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar event = L.Util.extend({}, data, { type: type, target: this });\r\n\r\n\t\tvar events = this[eventsKey],\r\n\t\t listeners, i, len, typeIndex, contextId;\r\n\r\n\t\tif (events[type]) {\r\n\t\t\t// make sure adding/removing listeners inside other listeners won't cause infinite loop\r\n\t\t\tlisteners = events[type].slice();\r\n\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// fire event for the context-indexed listeners as well\r\n\t\ttypeIndex = events[type + '_idx'];\r\n\r\n\t\tfor (contextId in typeIndex) {\r\n\t\t\tlisteners = typeIndex[contextId].slice();\r\n\r\n\t\t\tif (listeners) {\r\n\t\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddOneTimeEventListener: function (types, fn, context) {\r\n\r\n\t\tif (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar handler = L.bind(function () {\r\n\t\t\tthis\r\n\t\t\t .removeEventListener(types, fn, context)\r\n\t\t\t .removeEventListener(types, handler, context);\r\n\t\t}, this);\r\n\r\n\t\treturn this\r\n\t\t .addEventListener(types, fn, context)\r\n\t\t .addEventListener(types, handler, context);\r\n\t}\r\n};\r\n\r\nL.Mixin.Events.on = L.Mixin.Events.addEventListener;\r\nL.Mixin.Events.off = L.Mixin.Events.removeEventListener;\r\nL.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener;\r\nL.Mixin.Events.fire = L.Mixin.Events.fireEvent;\r\n\n\n/*\r\n * L.Browser handles different browser and feature detections for internal Leaflet use.\r\n */\r\n\r\n(function () {\r\n\r\n\tvar ie = 'ActiveXObject' in window,\r\n\t\tielt9 = ie && !document.addEventListener,\r\n\r\n\t // terrible browser detection to work around Safari / iOS / Android browser bugs\r\n\t ua = navigator.userAgent.toLowerCase(),\r\n\t webkit = ua.indexOf('webkit') !== -1,\r\n\t chrome = ua.indexOf('chrome') !== -1,\r\n\t phantomjs = ua.indexOf('phantom') !== -1,\r\n\t android = ua.indexOf('android') !== -1,\r\n\t android23 = ua.search('android [23]') !== -1,\r\n\t\tgecko = ua.indexOf('gecko') !== -1,\r\n\r\n\t mobile = typeof orientation !== undefined + '',\r\n\t msPointer = window.navigator && window.navigator.msPointerEnabled &&\r\n\t window.navigator.msMaxTouchPoints && !window.PointerEvent,\r\n\t\tpointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) ||\r\n\t\t\t\t msPointer,\r\n\t retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||\r\n\t ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&\r\n\t window.matchMedia('(min-resolution:144dpi)').matches),\r\n\r\n\t doc = document.documentElement,\r\n\t ie3d = ie && ('transition' in doc.style),\r\n\t webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,\r\n\t gecko3d = 'MozPerspective' in doc.style,\r\n\t opera3d = 'OTransition' in doc.style,\r\n\t any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs;\r\n\r\n\r\n\t// PhantomJS has 'ontouchstart' in document.documentElement, but doesn't actually support touch.\r\n\t// https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151\r\n\r\n\tvar touch = !window.L_NO_TOUCH && !phantomjs && (function () {\r\n\r\n\t\tvar startName = 'ontouchstart';\r\n\r\n\t\t// IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc.\r\n\t\tif (pointer || (startName in doc)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Firefox/Gecko\r\n\t\tvar div = document.createElement('div'),\r\n\t\t supported = false;\r\n\r\n\t\tif (!div.setAttribute) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tdiv.setAttribute(startName, 'return;');\r\n\r\n\t\tif (typeof div[startName] === 'function') {\r\n\t\t\tsupported = true;\r\n\t\t}\r\n\r\n\t\tdiv.removeAttribute(startName);\r\n\t\tdiv = null;\r\n\r\n\t\treturn supported;\r\n\t}());\r\n\r\n\r\n\tL.Browser = {\r\n\t\tie: ie,\r\n\t\tielt9: ielt9,\r\n\t\twebkit: webkit,\r\n\t\tgecko: gecko && !webkit && !window.opera && !ie,\r\n\r\n\t\tandroid: android,\r\n\t\tandroid23: android23,\r\n\r\n\t\tchrome: chrome,\r\n\r\n\t\tie3d: ie3d,\r\n\t\twebkit3d: webkit3d,\r\n\t\tgecko3d: gecko3d,\r\n\t\topera3d: opera3d,\r\n\t\tany3d: any3d,\r\n\r\n\t\tmobile: mobile,\r\n\t\tmobileWebkit: mobile && webkit,\r\n\t\tmobileWebkit3d: mobile && webkit3d,\r\n\t\tmobileOpera: mobile && window.opera,\r\n\r\n\t\ttouch: touch,\r\n\t\tmsPointer: msPointer,\r\n\t\tpointer: pointer,\r\n\r\n\t\tretina: retina\r\n\t};\r\n\r\n}());\r\n\n\n/*\r\n * L.Point represents a point with x and y coordinates.\r\n */\r\n\r\nL.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {\r\n\tthis.x = (round ? Math.round(x) : x);\r\n\tthis.y = (round ? Math.round(y) : y);\r\n};\r\n\r\nL.Point.prototype = {\r\n\r\n\tclone: function () {\r\n\t\treturn new L.Point(this.x, this.y);\r\n\t},\r\n\r\n\t// non-destructive, returns a new point\r\n\tadd: function (point) {\r\n\t\treturn this.clone()._add(L.point(point));\r\n\t},\r\n\r\n\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n\t_add: function (point) {\r\n\t\tthis.x += point.x;\r\n\t\tthis.y += point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsubtract: function (point) {\r\n\t\treturn this.clone()._subtract(L.point(point));\r\n\t},\r\n\r\n\t_subtract: function (point) {\r\n\t\tthis.x -= point.x;\r\n\t\tthis.y -= point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdivideBy: function (num) {\r\n\t\treturn this.clone()._divideBy(num);\r\n\t},\r\n\r\n\t_divideBy: function (num) {\r\n\t\tthis.x /= num;\r\n\t\tthis.y /= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tmultiplyBy: function (num) {\r\n\t\treturn this.clone()._multiplyBy(num);\r\n\t},\r\n\r\n\t_multiplyBy: function (num) {\r\n\t\tthis.x *= num;\r\n\t\tthis.y *= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tround: function () {\r\n\t\treturn this.clone()._round();\r\n\t},\r\n\r\n\t_round: function () {\r\n\t\tthis.x = Math.round(this.x);\r\n\t\tthis.y = Math.round(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfloor: function () {\r\n\t\treturn this.clone()._floor();\r\n\t},\r\n\r\n\t_floor: function () {\r\n\t\tthis.x = Math.floor(this.x);\r\n\t\tthis.y = Math.floor(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdistanceTo: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tvar x = point.x - this.x,\r\n\t\t y = point.y - this.y;\r\n\r\n\t\treturn Math.sqrt(x * x + y * y);\r\n\t},\r\n\r\n\tequals: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn point.x === this.x &&\r\n\t\t point.y === this.y;\r\n\t},\r\n\r\n\tcontains: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n\t\t Math.abs(point.y) <= Math.abs(this.y);\r\n\t},\r\n\r\n\ttoString: function () {\r\n\t\treturn 'Point(' +\r\n\t\t L.Util.formatNum(this.x) + ', ' +\r\n\t\t L.Util.formatNum(this.y) + ')';\r\n\t}\r\n};\r\n\r\nL.point = function (x, y, round) {\r\n\tif (x instanceof L.Point) {\r\n\t\treturn x;\r\n\t}\r\n\tif (L.Util.isArray(x)) {\r\n\t\treturn new L.Point(x[0], x[1]);\r\n\t}\r\n\tif (x === undefined || x === null) {\r\n\t\treturn x;\r\n\t}\r\n\treturn new L.Point(x, y, round);\r\n};\r\n\n\n/*\r\n * L.Bounds represents a rectangular area on the screen in pixel coordinates.\r\n */\r\n\r\nL.Bounds = function (a, b) { //(Point, Point) or Point[]\r\n\tif (!a) { return; }\r\n\r\n\tvar points = b ? [a, b] : a;\r\n\r\n\tfor (var i = 0, len = points.length; i < len; i++) {\r\n\t\tthis.extend(points[i]);\r\n\t}\r\n};\r\n\r\nL.Bounds.prototype = {\r\n\t// extend the bounds to contain the given point\r\n\textend: function (point) { // (Point)\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tif (!this.min && !this.max) {\r\n\t\t\tthis.min = point.clone();\r\n\t\t\tthis.max = point.clone();\r\n\t\t} else {\r\n\t\t\tthis.min.x = Math.min(point.x, this.min.x);\r\n\t\t\tthis.max.x = Math.max(point.x, this.max.x);\r\n\t\t\tthis.min.y = Math.min(point.y, this.min.y);\r\n\t\t\tthis.max.y = Math.max(point.y, this.max.y);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetCenter: function (round) { // (Boolean) -> Point\r\n\t\treturn new L.Point(\r\n\t\t (this.min.x + this.max.x) / 2,\r\n\t\t (this.min.y + this.max.y) / 2, round);\r\n\t},\r\n\r\n\tgetBottomLeft: function () { // -> Point\r\n\t\treturn new L.Point(this.min.x, this.max.y);\r\n\t},\r\n\r\n\tgetTopRight: function () { // -> Point\r\n\t\treturn new L.Point(this.max.x, this.min.y);\r\n\t},\r\n\r\n\tgetSize: function () {\r\n\t\treturn this.max.subtract(this.min);\r\n\t},\r\n\r\n\tcontains: function (obj) { // (Bounds) or (Point) -> Boolean\r\n\t\tvar min, max;\r\n\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.Point) {\r\n\t\t\tobj = L.point(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.bounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.Bounds) {\r\n\t\t\tmin = obj.min;\r\n\t\t\tmax = obj.max;\r\n\t\t} else {\r\n\t\t\tmin = max = obj;\r\n\t\t}\r\n\r\n\t\treturn (min.x >= this.min.x) &&\r\n\t\t (max.x <= this.max.x) &&\r\n\t\t (min.y >= this.min.y) &&\r\n\t\t (max.y <= this.max.y);\r\n\t},\r\n\r\n\tintersects: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t max = this.max,\r\n\t\t min2 = bounds.min,\r\n\t\t max2 = bounds.max,\r\n\t\t xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n\t\t yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n\t\treturn xIntersects && yIntersects;\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this.min && this.max);\r\n\t}\r\n};\r\n\r\nL.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])\r\n\tif (!a || a instanceof L.Bounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.Bounds(a, b);\r\n};\r\n\n\n/*\r\n * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix.\r\n */\r\n\r\nL.Transformation = function (a, b, c, d) {\r\n\tthis._a = a;\r\n\tthis._b = b;\r\n\tthis._c = c;\r\n\tthis._d = d;\r\n};\r\n\r\nL.Transformation.prototype = {\r\n\ttransform: function (point, scale) { // (Point, Number) -> Point\r\n\t\treturn this._transform(point.clone(), scale);\r\n\t},\r\n\r\n\t// destructive transform (faster)\r\n\t_transform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tpoint.x = scale * (this._a * point.x + this._b);\r\n\t\tpoint.y = scale * (this._c * point.y + this._d);\r\n\t\treturn point;\r\n\t},\r\n\r\n\tuntransform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\treturn new L.Point(\r\n\t\t (point.x / scale - this._b) / this._a,\r\n\t\t (point.y / scale - this._d) / this._c);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.DomUtil contains various utility functions for working with DOM.\r\n */\r\n\r\nL.DomUtil = {\r\n\tget: function (id) {\r\n\t\treturn (typeof id === 'string' ? document.getElementById(id) : id);\r\n\t},\r\n\r\n\tgetStyle: function (el, style) {\r\n\r\n\t\tvar value = el.style[style];\r\n\r\n\t\tif (!value && el.currentStyle) {\r\n\t\t\tvalue = el.currentStyle[style];\r\n\t\t}\r\n\r\n\t\tif ((!value || value === 'auto') && document.defaultView) {\r\n\t\t\tvar css = document.defaultView.getComputedStyle(el, null);\r\n\t\t\tvalue = css ? css[style] : null;\r\n\t\t}\r\n\r\n\t\treturn value === 'auto' ? null : value;\r\n\t},\r\n\r\n\tgetViewportOffset: function (element) {\r\n\r\n\t\tvar top = 0,\r\n\t\t left = 0,\r\n\t\t el = element,\r\n\t\t docBody = document.body,\r\n\t\t docEl = document.documentElement,\r\n\t\t pos;\r\n\r\n\t\tdo {\r\n\t\t\ttop += el.offsetTop || 0;\r\n\t\t\tleft += el.offsetLeft || 0;\r\n\r\n\t\t\t//add borders\r\n\t\t\ttop += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0;\r\n\t\t\tleft += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0;\r\n\r\n\t\t\tpos = L.DomUtil.getStyle(el, 'position');\r\n\r\n\t\t\tif (el.offsetParent === docBody && pos === 'absolute') { break; }\r\n\r\n\t\t\tif (pos === 'fixed') {\r\n\t\t\t\ttop += docBody.scrollTop || docEl.scrollTop || 0;\r\n\t\t\t\tleft += docBody.scrollLeft || docEl.scrollLeft || 0;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (pos === 'relative' && !el.offsetLeft) {\r\n\t\t\t\tvar width = L.DomUtil.getStyle(el, 'width'),\r\n\t\t\t\t maxWidth = L.DomUtil.getStyle(el, 'max-width'),\r\n\t\t\t\t r = el.getBoundingClientRect();\r\n\r\n\t\t\t\tif (width !== 'none' || maxWidth !== 'none') {\r\n\t\t\t\t\tleft += r.left + el.clientLeft;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//calculate full y offset since we're breaking out of the loop\r\n\t\t\t\ttop += r.top + (docBody.scrollTop || docEl.scrollTop || 0);\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tel = el.offsetParent;\r\n\r\n\t\t} while (el);\r\n\r\n\t\tel = element;\r\n\r\n\t\tdo {\r\n\t\t\tif (el === docBody) { break; }\r\n\r\n\t\t\ttop -= el.scrollTop || 0;\r\n\t\t\tleft -= el.scrollLeft || 0;\r\n\r\n\t\t\tel = el.parentNode;\r\n\t\t} while (el);\r\n\r\n\t\treturn new L.Point(left, top);\r\n\t},\r\n\r\n\tdocumentIsLtr: function () {\r\n\t\tif (!L.DomUtil._docIsLtrCached) {\r\n\t\t\tL.DomUtil._docIsLtrCached = true;\r\n\t\t\tL.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr';\r\n\t\t}\r\n\t\treturn L.DomUtil._docIsLtr;\r\n\t},\r\n\r\n\tcreate: function (tagName, className, container) {\r\n\r\n\t\tvar el = document.createElement(tagName);\r\n\t\tel.className = className;\r\n\r\n\t\tif (container) {\r\n\t\t\tcontainer.appendChild(el);\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t},\r\n\r\n\thasClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\treturn el.classList.contains(name);\r\n\t\t}\r\n\t\tvar className = L.DomUtil._getClass(el);\r\n\t\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\r\n\t},\r\n\r\n\taddClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tvar classes = L.Util.splitWords(name);\r\n\t\t\tfor (var i = 0, len = classes.length; i < len; i++) {\r\n\t\t\t\tel.classList.add(classes[i]);\r\n\t\t\t}\r\n\t\t} else if (!L.DomUtil.hasClass(el, name)) {\r\n\t\t\tvar className = L.DomUtil._getClass(el);\r\n\t\t\tL.DomUtil._setClass(el, (className ? className + ' ' : '') + name);\r\n\t\t}\r\n\t},\r\n\r\n\tremoveClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tel.classList.remove(name);\r\n\t\t} else {\r\n\t\t\tL.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\r\n\t\t}\r\n\t},\r\n\r\n\t_setClass: function (el, name) {\r\n\t\tif (el.className.baseVal === undefined) {\r\n\t\t\tel.className = name;\r\n\t\t} else {\r\n\t\t\t// in case of SVG element\r\n\t\t\tel.className.baseVal = name;\r\n\t\t}\r\n\t},\r\n\r\n\t_getClass: function (el) {\r\n\t\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\r\n\t},\r\n\r\n\tsetOpacity: function (el, value) {\r\n\r\n\t\tif ('opacity' in el.style) {\r\n\t\t\tel.style.opacity = value;\r\n\r\n\t\t} else if ('filter' in el.style) {\r\n\r\n\t\t\tvar filter = false,\r\n\t\t\t filterName = 'DXImageTransform.Microsoft.Alpha';\r\n\r\n\t\t\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\r\n\t\t\ttry {\r\n\t\t\t\tfilter = el.filters.item(filterName);\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// don't set opacity to 1 if we haven't already set an opacity,\r\n\t\t\t\t// it isn't needed and breaks transparent pngs.\r\n\t\t\t\tif (value === 1) { return; }\r\n\t\t\t}\r\n\r\n\t\t\tvalue = Math.round(value * 100);\r\n\r\n\t\t\tif (filter) {\r\n\t\t\t\tfilter.Enabled = (value !== 100);\r\n\t\t\t\tfilter.Opacity = value;\r\n\t\t\t} else {\r\n\t\t\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\ttestProp: function (props) {\r\n\r\n\t\tvar style = document.documentElement.style;\r\n\r\n\t\tfor (var i = 0; i < props.length; i++) {\r\n\t\t\tif (props[i] in style) {\r\n\t\t\t\treturn props[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\tgetTranslateString: function (point) {\r\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\r\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\r\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\r\n\r\n\t\tvar is3d = L.Browser.webkit3d,\r\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\r\n\t\t close = (is3d ? ',0' : '') + ')';\r\n\r\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\r\n\t},\r\n\r\n\tgetScaleString: function (scale, origin) {\r\n\r\n\t\tvar preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))),\r\n\t\t scaleStr = ' scale(' + scale + ') ';\r\n\r\n\t\treturn preTranslateStr + scaleStr;\r\n\t},\r\n\r\n\tsetPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean])\r\n\r\n\t\t// jshint camelcase: false\r\n\t\tel._leaflet_pos = point;\r\n\r\n\t\tif (!disable3D && L.Browser.any3d) {\r\n\t\t\tel.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point);\r\n\t\t} else {\r\n\t\t\tel.style.left = point.x + 'px';\r\n\t\t\tel.style.top = point.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\tgetPosition: function (el) {\r\n\t\t// this method is only used for elements previously positioned using setPosition,\r\n\t\t// so it's safe to cache the position for performance\r\n\r\n\t\t// jshint camelcase: false\r\n\t\treturn el._leaflet_pos;\r\n\t}\r\n};\r\n\r\n\r\n// prefix style property names\r\n\r\nL.DomUtil.TRANSFORM = L.DomUtil.testProp(\r\n ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\r\n\r\n// webkitTransition comes first because some browser versions that drop vendor prefix don't do\r\n// the same for the transitionend event, in particular the Android 4.1 stock browser\r\n\r\nL.DomUtil.TRANSITION = L.DomUtil.testProp(\r\n ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\r\n\r\nL.DomUtil.TRANSITION_END =\r\n L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ?\r\n L.DomUtil.TRANSITION + 'End' : 'transitionend';\r\n\r\n(function () {\r\n if ('onselectstart' in document) {\r\n L.extend(L.DomUtil, {\r\n disableTextSelection: function () {\r\n L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);\r\n },\r\n\r\n enableTextSelection: function () {\r\n L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);\r\n }\r\n });\r\n } else {\r\n var userSelectProperty = L.DomUtil.testProp(\r\n ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\r\n\r\n L.extend(L.DomUtil, {\r\n disableTextSelection: function () {\r\n if (userSelectProperty) {\r\n var style = document.documentElement.style;\r\n this._userSelect = style[userSelectProperty];\r\n style[userSelectProperty] = 'none';\r\n }\r\n },\r\n\r\n enableTextSelection: function () {\r\n if (userSelectProperty) {\r\n document.documentElement.style[userSelectProperty] = this._userSelect;\r\n delete this._userSelect;\r\n }\r\n }\r\n });\r\n }\r\n\r\n\tL.extend(L.DomUtil, {\r\n\t\tdisableImageDrag: function () {\r\n\t\t\tL.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t\t},\r\n\r\n\t\tenableImageDrag: function () {\r\n\t\t\tL.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t\t}\r\n\t});\r\n})();\r\n\n\n/*\r\n * L.LatLng represents a geographical point with latitude and longitude coordinates.\r\n */\r\n\r\nL.LatLng = function (lat, lng, alt) { // (Number, Number, Number)\r\n\tlat = parseFloat(lat);\r\n\tlng = parseFloat(lng);\r\n\r\n\tif (isNaN(lat) || isNaN(lng)) {\r\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n\t}\r\n\r\n\tthis.lat = lat;\r\n\tthis.lng = lng;\r\n\r\n\tif (alt !== undefined) {\r\n\t\tthis.alt = parseFloat(alt);\r\n\t}\r\n};\r\n\r\nL.extend(L.LatLng, {\r\n\tDEG_TO_RAD: Math.PI / 180,\r\n\tRAD_TO_DEG: 180 / Math.PI,\r\n\tMAX_MARGIN: 1.0E-9 // max margin of error for the \"equals\" check\r\n});\r\n\r\nL.LatLng.prototype = {\r\n\tequals: function (obj) { // (LatLng) -> Boolean\r\n\t\tif (!obj) { return false; }\r\n\r\n\t\tobj = L.latLng(obj);\r\n\r\n\t\tvar margin = Math.max(\r\n\t\t Math.abs(this.lat - obj.lat),\r\n\t\t Math.abs(this.lng - obj.lng));\r\n\r\n\t\treturn margin <= L.LatLng.MAX_MARGIN;\r\n\t},\r\n\r\n\ttoString: function (precision) { // (Number) -> String\r\n\t\treturn 'LatLng(' +\r\n\t\t L.Util.formatNum(this.lat, precision) + ', ' +\r\n\t\t L.Util.formatNum(this.lng, precision) + ')';\r\n\t},\r\n\r\n\t// Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula\r\n\t// TODO move to projection code, LatLng shouldn't know about Earth\r\n\tdistanceTo: function (other) { // (LatLng) -> Number\r\n\t\tother = L.latLng(other);\r\n\r\n\t\tvar R = 6378137, // earth radius in meters\r\n\t\t d2r = L.LatLng.DEG_TO_RAD,\r\n\t\t dLat = (other.lat - this.lat) * d2r,\r\n\t\t dLon = (other.lng - this.lng) * d2r,\r\n\t\t lat1 = this.lat * d2r,\r\n\t\t lat2 = other.lat * d2r,\r\n\t\t sin1 = Math.sin(dLat / 2),\r\n\t\t sin2 = Math.sin(dLon / 2);\r\n\r\n\t\tvar a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);\r\n\r\n\t\treturn R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n\t},\r\n\r\n\twrap: function (a, b) { // (Number, Number) -> LatLng\r\n\t\tvar lng = this.lng;\r\n\r\n\t\ta = a || -180;\r\n\t\tb = b || 180;\r\n\r\n\t\tlng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);\r\n\r\n\t\treturn new L.LatLng(this.lat, lng);\r\n\t}\r\n};\r\n\r\nL.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number)\r\n\tif (a instanceof L.LatLng) {\r\n\t\treturn a;\r\n\t}\r\n\tif (L.Util.isArray(a)) {\r\n\t\tif (typeof a[0] === 'number' || typeof a[0] === 'string') {\r\n\t\t\treturn new L.LatLng(a[0], a[1], a[2]);\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\tif (a === undefined || a === null) {\r\n\t\treturn a;\r\n\t}\r\n\tif (typeof a === 'object' && 'lat' in a) {\r\n\t\treturn new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\treturn new L.LatLng(a, b);\r\n};\r\n\r\n\n\n/*\r\n * L.LatLngBounds represents a rectangular area on the map in geographical coordinates.\r\n */\r\n\r\nL.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])\r\n\tif (!southWest) { return; }\r\n\r\n\tvar latlngs = northEast ? [southWest, northEast] : southWest;\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\tthis.extend(latlngs[i]);\r\n\t}\r\n};\r\n\r\nL.LatLngBounds.prototype = {\r\n\t// extend the bounds to contain the given point or bounds\r\n\textend: function (obj) { // (LatLng) or (LatLngBounds)\r\n\t\tif (!obj) { return this; }\r\n\r\n\t\tvar latLng = L.latLng(obj);\r\n\t\tif (latLng !== null) {\r\n\t\t\tobj = latLng;\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.LatLng) {\r\n\t\t\tif (!this._southWest && !this._northEast) {\r\n\t\t\t\tthis._southWest = new L.LatLng(obj.lat, obj.lng);\r\n\t\t\t\tthis._northEast = new L.LatLng(obj.lat, obj.lng);\r\n\t\t\t} else {\r\n\t\t\t\tthis._southWest.lat = Math.min(obj.lat, this._southWest.lat);\r\n\t\t\t\tthis._southWest.lng = Math.min(obj.lng, this._southWest.lng);\r\n\r\n\t\t\t\tthis._northEast.lat = Math.max(obj.lat, this._northEast.lat);\r\n\t\t\t\tthis._northEast.lng = Math.max(obj.lng, this._northEast.lng);\r\n\t\t\t}\r\n\t\t} else if (obj instanceof L.LatLngBounds) {\r\n\t\t\tthis.extend(obj._southWest);\r\n\t\t\tthis.extend(obj._northEast);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// extend the bounds by a percentage\r\n\tpad: function (bufferRatio) { // (Number) -> LatLngBounds\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n\t\t widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n\t\t new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n\t},\r\n\r\n\tgetCenter: function () { // -> LatLng\r\n\t\treturn new L.LatLng(\r\n\t\t (this._southWest.lat + this._northEast.lat) / 2,\r\n\t\t (this._southWest.lng + this._northEast.lng) / 2);\r\n\t},\r\n\r\n\tgetSouthWest: function () {\r\n\t\treturn this._southWest;\r\n\t},\r\n\r\n\tgetNorthEast: function () {\r\n\t\treturn this._northEast;\r\n\t},\r\n\r\n\tgetNorthWest: function () {\r\n\t\treturn new L.LatLng(this.getNorth(), this.getWest());\r\n\t},\r\n\r\n\tgetSouthEast: function () {\r\n\t\treturn new L.LatLng(this.getSouth(), this.getEast());\r\n\t},\r\n\r\n\tgetWest: function () {\r\n\t\treturn this._southWest.lng;\r\n\t},\r\n\r\n\tgetSouth: function () {\r\n\t\treturn this._southWest.lat;\r\n\t},\r\n\r\n\tgetEast: function () {\r\n\t\treturn this._northEast.lng;\r\n\t},\r\n\r\n\tgetNorth: function () {\r\n\t\treturn this._northEast.lat;\r\n\t},\r\n\r\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.LatLng) {\r\n\t\t\tobj = L.latLng(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj.getSouthWest();\r\n\t\t\tne2 = obj.getNorthEast();\r\n\t\t} else {\r\n\t\t\tsw2 = ne2 = obj;\r\n\t\t}\r\n\r\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n\t\t (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n\t},\r\n\r\n\tintersects: function (bounds) { // (LatLngBounds)\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2 = bounds.getSouthWest(),\r\n\t\t ne2 = bounds.getNorthEast(),\r\n\r\n\t\t latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n\t\t lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n\t\treturn latIntersects && lngIntersects;\r\n\t},\r\n\r\n\ttoBBoxString: function () {\r\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n\t},\r\n\r\n\tequals: function (bounds) { // (LatLngBounds)\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\treturn this._southWest.equals(bounds.getSouthWest()) &&\r\n\t\t this._northEast.equals(bounds.getNorthEast());\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this._southWest && this._northEast);\r\n\t}\r\n};\r\n\r\n//TODO International date line?\r\n\r\nL.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)\r\n\tif (!a || a instanceof L.LatLngBounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.LatLngBounds(a, b);\r\n};\r\n\n\n/*\r\n * L.Projection contains various geographical projections used by CRS classes.\r\n */\r\n\r\nL.Projection = {};\r\n\n\n/*\r\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default.\r\n */\r\n\r\nL.Projection.SphericalMercator = {\r\n\tMAX_LATITUDE: 85.0511287798,\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar d = L.LatLng.DEG_TO_RAD,\r\n\t\t max = this.MAX_LATITUDE,\r\n\t\t lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t x = latlng.lng * d,\r\n\t\t y = lat * d;\r\n\r\n\t\ty = Math.log(Math.tan((Math.PI / 4) + (y / 2)));\r\n\r\n\t\treturn new L.Point(x, y);\r\n\t},\r\n\r\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\r\n\t\tvar d = L.LatLng.RAD_TO_DEG,\r\n\t\t lng = point.x * d,\r\n\t\t lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;\r\n\r\n\t\treturn new L.LatLng(lat, lng);\r\n\t}\r\n};\r\n\n\n/*\r\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple.\r\n */\r\n\r\nL.Projection.LonLat = {\r\n\tproject: function (latlng) {\r\n\t\treturn new L.Point(latlng.lng, latlng.lat);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\treturn new L.LatLng(point.y, point.x);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet.\r\n */\r\n\r\nL.CRS = {\r\n\tlatLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t scale = this.scale(zoom);\r\n\r\n\t\treturn this.transformation._transform(projectedPoint, scale);\r\n\t},\r\n\r\n\tpointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng\r\n\t\tvar scale = this.scale(zoom),\r\n\t\t untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n\t\treturn this.projection.unproject(untransformedPoint);\r\n\t},\r\n\r\n\tproject: function (latlng) {\r\n\t\treturn this.projection.project(latlng);\r\n\t},\r\n\r\n\tscale: function (zoom) {\r\n\t\treturn 256 * Math.pow(2, zoom);\r\n\t},\r\n\r\n\tgetSize: function (zoom) {\r\n\t\tvar s = this.scale(zoom);\r\n\t\treturn L.point(s, s);\r\n\t}\r\n};\r\n\n\n/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps.\n */\n\nL.CRS.Simple = L.extend({}, L.CRS, {\n\tprojection: L.Projection.LonLat,\n\ttransformation: new L.Transformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t}\n});\n\n\n/*\r\n * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping\r\n * and is used by Leaflet by default.\r\n */\r\n\r\nL.CRS.EPSG3857 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:3857',\r\n\r\n\tprojection: L.Projection.SphericalMercator,\r\n\ttransformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5),\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t earthRadius = 6378137;\r\n\t\treturn projectedPoint.multiplyBy(earthRadius);\r\n\t}\r\n});\r\n\r\nL.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {\r\n\tcode: 'EPSG:900913'\r\n});\r\n\n\n/*\r\n * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\r\n */\r\n\r\nL.CRS.EPSG4326 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:4326',\r\n\r\n\tprojection: L.Projection.LonLat,\r\n\ttransformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5)\r\n});\r\n\n\n/*\r\n * L.Map is the central class of the API - it is used to create a map.\r\n */\r\n\r\nL.Map = L.Class.extend({\r\n\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tcrs: L.CRS.EPSG3857,\r\n\r\n\t\t/*\r\n\t\tcenter: LatLng,\r\n\t\tzoom: Number,\r\n\t\tlayers: Array,\r\n\t\t*/\r\n\r\n\t\tfadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,\r\n\t\ttrackResize: true,\r\n\t\tmarkerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d\r\n\t},\r\n\r\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\r\n\t\tthis._initContainer(id);\r\n\t\tthis._initLayout();\r\n\r\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\r\n\t\tthis._onResize = L.bind(this._onResize, this);\r\n\r\n\t\tthis._initEvents();\r\n\r\n\t\tif (options.maxBounds) {\r\n\t\t\tthis.setMaxBounds(options.maxBounds);\r\n\t\t}\r\n\r\n\t\tif (options.center && options.zoom !== undefined) {\r\n\t\t\tthis.setView(L.latLng(options.center), options.zoom, {reset: true});\r\n\t\t}\r\n\r\n\t\tthis._handlers = [];\r\n\r\n\t\tthis._layers = {};\r\n\t\tthis._zoomBoundLayers = {};\r\n\t\tthis._tileLayersNum = 0;\r\n\r\n\t\tthis.callInitHooks();\r\n\r\n\t\tthis._addLayers(options.layers);\r\n\t},\r\n\r\n\r\n\t// public methods that modify map state\r\n\r\n\t// replaced by animation-powered implementation in Map.PanAnimation.js\r\n\tsetView: function (center, zoom) {\r\n\t\tzoom = zoom === undefined ? this.getZoom() : zoom;\r\n\t\tthis._resetView(L.latLng(center), this._limitZoom(zoom));\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetZoom: function (zoom, options) {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthis._zoom = this._limitZoom(zoom);\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\r\n\t},\r\n\r\n\tzoomIn: function (delta, options) {\r\n\t\treturn this.setZoom(this._zoom + (delta || 1), options);\r\n\t},\r\n\r\n\tzoomOut: function (delta, options) {\r\n\t\treturn this.setZoom(this._zoom - (delta || 1), options);\r\n\t},\r\n\r\n\tsetZoomAround: function (latlng, zoom, options) {\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t viewHalf = this.getSize().divideBy(2),\r\n\t\t containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),\r\n\r\n\t\t centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\r\n\t\t newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\r\n\r\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\r\n\t},\r\n\r\n\tfitBounds: function (bounds, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);\r\n\r\n\t\tvar paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),\r\n\r\n\t\t zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)),\r\n\t\t paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\r\n\r\n\t\t swPoint = this.project(bounds.getSouthWest(), zoom),\r\n\t\t nePoint = this.project(bounds.getNorthEast(), zoom),\r\n\t\t center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\r\n\r\n\t\tzoom = options && options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom;\r\n\r\n\t\treturn this.setView(center, zoom, options);\r\n\t},\r\n\r\n\tfitWorld: function (options) {\r\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\r\n\t},\r\n\r\n\tpanTo: function (center, options) { // (LatLng)\r\n\t\treturn this.setView(center, this._zoom, {pan: options});\r\n\t},\r\n\r\n\tpanBy: function (offset) { // (Point)\r\n\t\t// replaced with animated panBy in Map.PanAnimation.js\r\n\t\tthis.fire('movestart');\r\n\r\n\t\tthis._rawPanBy(L.point(offset));\r\n\r\n\t\tthis.fire('move');\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\tsetMaxBounds: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tthis.options.maxBounds = bounds;\r\n\r\n\t\tif (!bounds) {\r\n\t\t\treturn this.off('moveend', this._panInsideMaxBounds, this);\r\n\t\t}\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._panInsideMaxBounds();\r\n\t\t}\r\n\r\n\t\treturn this.on('moveend', this._panInsideMaxBounds, this);\r\n\t},\r\n\r\n\tpanInsideBounds: function (bounds, options) {\r\n\t\tvar center = this.getCenter(),\r\n\t\t\tnewCenter = this._limitCenter(center, this._zoom, bounds);\r\n\r\n\t\tif (center.equals(newCenter)) { return this; }\r\n\r\n\t\treturn this.panTo(newCenter, options);\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\t// TODO method is too big, refactor\r\n\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tif (this._layers[id]) { return this; }\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\t// TODO getMaxZoom, getMinZoom in ILayer (instead of options)\r\n\t\tif (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) {\r\n\t\t\tthis._zoomBoundLayers[id] = layer;\r\n\t\t\tthis._updateZoomLevels();\r\n\t\t}\r\n\r\n\t\t// TODO looks ugly, refactor!!!\r\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\r\n\t\t\tthis._tileLayersNum++;\r\n\t\t\tthis._tileLayersToLoad++;\r\n\t\t\tlayer.on('load', this._onTileLayerLoad, this);\r\n\t\t}\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._layerAdd(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tif (!this._layers[id]) { return this; }\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tlayer.onRemove(this);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis.fire('layerremove', {layer: layer});\r\n\t\t}\r\n\r\n\t\tif (this._zoomBoundLayers[id]) {\r\n\t\t\tdelete this._zoomBoundLayers[id];\r\n\t\t\tthis._updateZoomLevels();\r\n\t\t}\r\n\r\n\t\t// TODO looks ugly, refactor\r\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\r\n\t\t\tthis._tileLayersNum--;\r\n\t\t\tthis._tileLayersToLoad--;\r\n\t\t\tlayer.off('load', this._onTileLayerLoad, this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasLayer: function (layer) {\r\n\t\tif (!layer) { return false; }\r\n\r\n\t\treturn (L.stamp(layer) in this._layers);\r\n\t},\r\n\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tinvalidateSize: function (options) {\r\n\t\tif (!this._loaded) { return this; }\r\n\r\n\t\toptions = L.extend({\r\n\t\t\tanimate: false,\r\n\t\t\tpan: true\r\n\t\t}, options === true ? {animate: true} : options);\r\n\r\n\t\tvar oldSize = this.getSize();\r\n\t\tthis._sizeChanged = true;\r\n\t\tthis._initialCenter = null;\r\n\r\n\t\tvar newSize = this.getSize(),\r\n\t\t oldCenter = oldSize.divideBy(2).round(),\r\n\t\t newCenter = newSize.divideBy(2).round(),\r\n\t\t offset = oldCenter.subtract(newCenter);\r\n\r\n\t\tif (!offset.x && !offset.y) { return this; }\r\n\r\n\t\tif (options.animate && options.pan) {\r\n\t\t\tthis.panBy(offset);\r\n\r\n\t\t} else {\r\n\t\t\tif (options.pan) {\r\n\t\t\t\tthis._rawPanBy(offset);\r\n\t\t\t}\r\n\r\n\t\t\tthis.fire('move');\r\n\r\n\t\t\tif (options.debounceMoveend) {\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\tthis._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);\r\n\t\t\t} else {\r\n\t\t\t\tthis.fire('moveend');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.fire('resize', {\r\n\t\t\toldSize: oldSize,\r\n\t\t\tnewSize: newSize\r\n\t\t});\r\n\t},\r\n\r\n\t// TODO handler.addTo\r\n\taddHandler: function (name, HandlerClass) {\r\n\t\tif (!HandlerClass) { return this; }\r\n\r\n\t\tvar handler = this[name] = new HandlerClass(this);\r\n\r\n\t\tthis._handlers.push(handler);\r\n\r\n\t\tif (this.options[name]) {\r\n\t\t\thandler.enable();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremove: function () {\r\n\t\tif (this._loaded) {\r\n\t\t\tthis.fire('unload');\r\n\t\t}\r\n\r\n\t\tthis._initEvents('off');\r\n\r\n\t\ttry {\r\n\t\t\t// throws error in IE6-8\r\n\t\t\tdelete this._container._leaflet;\r\n\t\t} catch (e) {\r\n\t\t\tthis._container._leaflet = undefined;\r\n\t\t}\r\n\r\n\t\tthis._clearPanes();\r\n\t\tif (this._clearControlPos) {\r\n\t\t\tthis._clearControlPos();\r\n\t\t}\r\n\r\n\t\tthis._clearHandlers();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t// public methods for getting map state\r\n\r\n\tgetCenter: function () { // (Boolean) -> LatLng\r\n\t\tthis._checkIfLoaded();\r\n\r\n\t\tif (this._initialCenter && !this._moved()) {\r\n\t\t\treturn this._initialCenter;\r\n\t\t}\r\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\tgetZoom: function () {\r\n\t\treturn this._zoom;\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar bounds = this.getPixelBounds(),\r\n\t\t sw = this.unproject(bounds.getBottomLeft()),\r\n\t\t ne = this.unproject(bounds.getTopRight());\r\n\r\n\t\treturn new L.LatLngBounds(sw, ne);\r\n\t},\r\n\r\n\tgetMinZoom: function () {\r\n\t\treturn this.options.minZoom === undefined ?\r\n\t\t\t(this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :\r\n\t\t\tthis.options.minZoom;\r\n\t},\r\n\r\n\tgetMaxZoom: function () {\r\n\t\treturn this.options.maxZoom === undefined ?\r\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\r\n\t\t\tthis.options.maxZoom;\r\n\t},\r\n\r\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar zoom = this.getMinZoom() - (inside ? 1 : 0),\r\n\t\t maxZoom = this.getMaxZoom(),\r\n\t\t size = this.getSize(),\r\n\r\n\t\t nw = bounds.getNorthWest(),\r\n\t\t se = bounds.getSouthEast(),\r\n\r\n\t\t zoomNotFound = true,\r\n\t\t boundsSize;\r\n\r\n\t\tpadding = L.point(padding || [0, 0]);\r\n\r\n\t\tdo {\r\n\t\t\tzoom++;\r\n\t\t\tboundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);\r\n\t\t\tzoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;\r\n\r\n\t\t} while (zoomNotFound && zoom <= maxZoom);\r\n\r\n\t\tif (zoomNotFound && inside) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn inside ? zoom : zoom - 1;\r\n\t},\r\n\r\n\tgetSize: function () {\r\n\t\tif (!this._size || this._sizeChanged) {\r\n\t\t\tthis._size = new L.Point(\r\n\t\t\t\tthis._container.clientWidth,\r\n\t\t\t\tthis._container.clientHeight);\r\n\r\n\t\t\tthis._sizeChanged = false;\r\n\t\t}\r\n\t\treturn this._size.clone();\r\n\t},\r\n\r\n\tgetPixelBounds: function () {\r\n\t\tvar topLeftPoint = this._getTopLeftPoint();\r\n\t\treturn new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\r\n\t},\r\n\r\n\tgetPixelOrigin: function () {\r\n\t\tthis._checkIfLoaded();\r\n\t\treturn this._initialTopLeftPoint;\r\n\t},\r\n\r\n\tgetPanes: function () {\r\n\t\treturn this._panes;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\r\n\t// TODO replace with universal implementation after refactoring projections\r\n\r\n\tgetZoomScale: function (toZoom) {\r\n\t\tvar crs = this.options.crs;\r\n\t\treturn crs.scale(toZoom) / crs.scale(this._zoom);\r\n\t},\r\n\r\n\tgetScaleZoom: function (scale) {\r\n\t\treturn this._zoom + (Math.log(scale) / Math.LN2);\r\n\t},\r\n\r\n\r\n\t// conversion methods\r\n\r\n\tproject: function (latlng, zoom) { // (LatLng[, Number]) -> Point\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.latLngToPoint(L.latLng(latlng), zoom);\r\n\t},\r\n\r\n\tunproject: function (point, zoom) { // (Point[, Number]) -> LatLng\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.pointToLatLng(L.point(point), zoom);\r\n\t},\r\n\r\n\tlayerPointToLatLng: function (point) { // (Point)\r\n\t\tvar projectedPoint = L.point(point).add(this.getPixelOrigin());\r\n\t\treturn this.unproject(projectedPoint);\r\n\t},\r\n\r\n\tlatLngToLayerPoint: function (latlng) { // (LatLng)\r\n\t\tvar projectedPoint = this.project(L.latLng(latlng))._round();\r\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\r\n\t},\r\n\r\n\tcontainerPointToLayerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\tlayerPointToContainerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).add(this._getMapPanePos());\r\n\t},\r\n\r\n\tcontainerPointToLatLng: function (point) {\r\n\t\tvar layerPoint = this.containerPointToLayerPoint(L.point(point));\r\n\t\treturn this.layerPointToLatLng(layerPoint);\r\n\t},\r\n\r\n\tlatLngToContainerPoint: function (latlng) {\r\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));\r\n\t},\r\n\r\n\tmouseEventToContainerPoint: function (e) { // (MouseEvent)\r\n\t\treturn L.DomEvent.getMousePosition(e, this._container);\r\n\t},\r\n\r\n\tmouseEventToLayerPoint: function (e) { // (MouseEvent)\r\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\r\n\t},\r\n\r\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\r\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\r\n\t},\r\n\r\n\r\n\t// map initialization methods\r\n\r\n\t_initContainer: function (id) {\r\n\t\tvar container = this._container = L.DomUtil.get(id);\r\n\r\n\t\tif (!container) {\r\n\t\t\tthrow new Error('Map container not found.');\r\n\t\t} else if (container._leaflet) {\r\n\t\t\tthrow new Error('Map container is already initialized.');\r\n\t\t}\r\n\r\n\t\tcontainer._leaflet = true;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar container = this._container;\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-container' +\r\n\t\t\t(L.Browser.touch ? ' leaflet-touch' : '') +\r\n\t\t\t(L.Browser.retina ? ' leaflet-retina' : '') +\r\n\t\t\t(L.Browser.ielt9 ? ' leaflet-oldie' : '') +\r\n\t\t\t(this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));\r\n\r\n\t\tvar position = L.DomUtil.getStyle(container, 'position');\r\n\r\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {\r\n\t\t\tcontainer.style.position = 'relative';\r\n\t\t}\r\n\r\n\t\tthis._initPanes();\r\n\r\n\t\tif (this._initControlPos) {\r\n\t\t\tthis._initControlPos();\r\n\t\t}\r\n\t},\r\n\r\n\t_initPanes: function () {\r\n\t\tvar panes = this._panes = {};\r\n\r\n\t\tthis._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container);\r\n\r\n\t\tthis._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane);\r\n\t\tpanes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane);\r\n\t\tpanes.shadowPane = this._createPane('leaflet-shadow-pane');\r\n\t\tpanes.overlayPane = this._createPane('leaflet-overlay-pane');\r\n\t\tpanes.markerPane = this._createPane('leaflet-marker-pane');\r\n\t\tpanes.popupPane = this._createPane('leaflet-popup-pane');\r\n\r\n\t\tvar zoomHide = ' leaflet-zoom-hide';\r\n\r\n\t\tif (!this.options.markerZoomAnimation) {\r\n\t\t\tL.DomUtil.addClass(panes.markerPane, zoomHide);\r\n\t\t\tL.DomUtil.addClass(panes.shadowPane, zoomHide);\r\n\t\t\tL.DomUtil.addClass(panes.popupPane, zoomHide);\r\n\t\t}\r\n\t},\r\n\r\n\t_createPane: function (className, container) {\r\n\t\treturn L.DomUtil.create('div', className, container || this._panes.objectsPane);\r\n\t},\r\n\r\n\t_clearPanes: function () {\r\n\t\tthis._container.removeChild(this._mapPane);\r\n\t},\r\n\r\n\t_addLayers: function (layers) {\r\n\t\tlayers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];\r\n\r\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\r\n\t\t\tthis.addLayer(layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// private methods that modify map state\r\n\r\n\t_resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {\r\n\r\n\t\tvar zoomChanged = (this._zoom !== zoom);\r\n\r\n\t\tif (!afterZoomAnim) {\r\n\t\t\tthis.fire('movestart');\r\n\r\n\t\t\tif (zoomChanged) {\r\n\t\t\t\tthis.fire('zoomstart');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._zoom = zoom;\r\n\t\tthis._initialCenter = center;\r\n\r\n\t\tthis._initialTopLeftPoint = this._getNewTopLeftPoint(center);\r\n\r\n\t\tif (!preserveMapOffset) {\r\n\t\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\t\t} else {\r\n\t\t\tthis._initialTopLeftPoint._add(this._getMapPanePos());\r\n\t\t}\r\n\r\n\t\tthis._tileLayersToLoad = this._tileLayersNum;\r\n\r\n\t\tvar loading = !this._loaded;\r\n\t\tthis._loaded = true;\r\n\r\n\t\tif (loading) {\r\n\t\t\tthis.fire('load');\r\n\t\t\tthis.eachLayer(this._layerAdd, this);\r\n\t\t}\r\n\r\n\t\tthis.fire('viewreset', {hard: !preserveMapOffset});\r\n\r\n\t\tthis.fire('move');\r\n\r\n\t\tif (zoomChanged || afterZoomAnim) {\r\n\t\t\tthis.fire('zoomend');\r\n\t\t}\r\n\r\n\t\tthis.fire('moveend', {hard: !preserveMapOffset});\r\n\t},\r\n\r\n\t_rawPanBy: function (offset) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\r\n\t},\r\n\r\n\t_getZoomSpan: function () {\r\n\t\treturn this.getMaxZoom() - this.getMinZoom();\r\n\t},\r\n\r\n\t_updateZoomLevels: function () {\r\n\t\tvar i,\r\n\t\t\tminZoom = Infinity,\r\n\t\t\tmaxZoom = -Infinity,\r\n\t\t\toldZoomSpan = this._getZoomSpan();\r\n\r\n\t\tfor (i in this._zoomBoundLayers) {\r\n\t\t\tvar layer = this._zoomBoundLayers[i];\r\n\t\t\tif (!isNaN(layer.options.minZoom)) {\r\n\t\t\t\tminZoom = Math.min(minZoom, layer.options.minZoom);\r\n\t\t\t}\r\n\t\t\tif (!isNaN(layer.options.maxZoom)) {\r\n\t\t\t\tmaxZoom = Math.max(maxZoom, layer.options.maxZoom);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (i === undefined) { // we have no tilelayers\r\n\t\t\tthis._layersMaxZoom = this._layersMinZoom = undefined;\r\n\t\t} else {\r\n\t\t\tthis._layersMaxZoom = maxZoom;\r\n\t\t\tthis._layersMinZoom = minZoom;\r\n\t\t}\r\n\r\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\r\n\t\t\tthis.fire('zoomlevelschange');\r\n\t\t}\r\n\t},\r\n\r\n\t_panInsideMaxBounds: function () {\r\n\t\tthis.panInsideBounds(this.options.maxBounds);\r\n\t},\r\n\r\n\t_checkIfLoaded: function () {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthrow new Error('Set map center and zoom first.');\r\n\t\t}\r\n\t},\r\n\r\n\t// map events\r\n\r\n\t_initEvents: function (onOff) {\r\n\t\tif (!L.DomEvent) { return; }\r\n\r\n\t\tonOff = onOff || 'on';\r\n\r\n\t\tL.DomEvent[onOff](this._container, 'click', this._onMouseClick, this);\r\n\r\n\t\tvar events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',\r\n\t\t 'mouseleave', 'mousemove', 'contextmenu'],\r\n\t\t i, len;\r\n\r\n\t\tfor (i = 0, len = events.length; i < len; i++) {\r\n\t\t\tL.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this);\r\n\t\t}\r\n\r\n\t\tif (this.options.trackResize) {\r\n\t\t\tL.DomEvent[onOff](window, 'resize', this._onResize, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_onResize: function () {\r\n\t\tL.Util.cancelAnimFrame(this._resizeRequest);\r\n\t\tthis._resizeRequest = L.Util.requestAnimFrame(\r\n\t\t function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tif (!this._loaded || (!e._simulated &&\r\n\t\t ((this.dragging && this.dragging.moved()) ||\r\n\t\t (this.boxZoom && this.boxZoom.moved()))) ||\r\n\t\t L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tthis.fire('preclick');\r\n\t\tthis._fireMouseEvent(e);\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (!this._loaded || L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tvar type = e.type;\r\n\r\n\t\ttype = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));\r\n\r\n\t\tif (!this.hasEventListeners(type)) { return; }\r\n\r\n\t\tif (type === 'contextmenu') {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\r\n\t\tvar containerPoint = this.mouseEventToContainerPoint(e),\r\n\t\t layerPoint = this.containerPointToLayerPoint(containerPoint),\r\n\t\t latlng = this.layerPointToLatLng(layerPoint);\r\n\r\n\t\tthis.fire(type, {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tlayerPoint: layerPoint,\r\n\t\t\tcontainerPoint: containerPoint,\r\n\t\t\toriginalEvent: e\r\n\t\t});\r\n\t},\r\n\r\n\t_onTileLayerLoad: function () {\r\n\t\tthis._tileLayersToLoad--;\r\n\t\tif (this._tileLayersNum && !this._tileLayersToLoad) {\r\n\t\t\tthis.fire('tilelayersload');\r\n\t\t}\r\n\t},\r\n\r\n\t_clearHandlers: function () {\r\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\r\n\t\t\tthis._handlers[i].disable();\r\n\t\t}\r\n\t},\r\n\r\n\twhenReady: function (callback, context) {\r\n\t\tif (this._loaded) {\r\n\t\t\tcallback.call(context || this, this);\r\n\t\t} else {\r\n\t\t\tthis.on('load', callback, context);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_layerAdd: function (layer) {\r\n\t\tlayer.onAdd(this);\r\n\t\tthis.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\r\n\t// private methods for getting map state\r\n\r\n\t_getMapPanePos: function () {\r\n\t\treturn L.DomUtil.getPosition(this._mapPane);\r\n\t},\r\n\r\n\t_moved: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\treturn pos && !pos.equals([0, 0]);\r\n\t},\r\n\r\n\t_getTopLeftPoint: function () {\r\n\t\treturn this.getPixelOrigin().subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t_getNewTopLeftPoint: function (center, zoom) {\r\n\t\tvar viewHalf = this.getSize()._divideBy(2);\r\n\t\t// TODO round on display, not calculation to increase precision?\r\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._round();\r\n\t},\r\n\r\n\t_latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {\r\n\t\tvar topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());\r\n\t\treturn this.project(latlng, newZoom)._subtract(topLeft);\r\n\t},\r\n\r\n\t// layer point of the current center\r\n\t_getCenterLayerPoint: function () {\r\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\r\n\t},\r\n\r\n\t// offset of the specified place to the current center in pixels\r\n\t_getCenterOffset: function (latlng) {\r\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// adjust center for view to get inside bounds\r\n\t_limitCenter: function (center, zoom, bounds) {\r\n\r\n\t\tif (!bounds) { return center; }\r\n\r\n\t\tvar centerPoint = this.project(center, zoom),\r\n\t\t viewHalf = this.getSize().divideBy(2),\r\n\t\t viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\r\n\t\t offset = this._getBoundsOffset(viewBounds, bounds, zoom);\r\n\r\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\r\n\t},\r\n\r\n\t// adjust offset for view to get inside bounds\r\n\t_limitOffset: function (offset, bounds) {\r\n\t\tif (!bounds) { return offset; }\r\n\r\n\t\tvar viewBounds = this.getPixelBounds(),\r\n\t\t newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\r\n\r\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\r\n\t},\r\n\r\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\r\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\r\n\t\tvar nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),\r\n\t\t seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),\r\n\r\n\t\t dx = this._rebound(nwOffset.x, -seOffset.x),\r\n\t\t dy = this._rebound(nwOffset.y, -seOffset.y);\r\n\r\n\t\treturn new L.Point(dx, dy);\r\n\t},\r\n\r\n\t_rebound: function (left, right) {\r\n\t\treturn left + right > 0 ?\r\n\t\t\tMath.round(left - right) / 2 :\r\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\r\n\t},\r\n\r\n\t_limitZoom: function (zoom) {\r\n\t\tvar min = this.getMinZoom(),\r\n\t\t max = this.getMaxZoom();\r\n\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t}\r\n});\r\n\r\nL.map = function (id, options) {\r\n\treturn new L.Map(id, options);\r\n};\r\n\n\n/*\r\n * Mercator projection that takes into account that the Earth is not a perfect sphere.\r\n * Less popular than spherical mercator; used by projections like EPSG:3395.\r\n */\r\n\r\nL.Projection.Mercator = {\r\n\tMAX_LATITUDE: 85.0840591556,\r\n\r\n\tR_MINOR: 6356752.314245179,\r\n\tR_MAJOR: 6378137,\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar d = L.LatLng.DEG_TO_RAD,\r\n\t\t max = this.MAX_LATITUDE,\r\n\t\t lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t r = this.R_MAJOR,\r\n\t\t r2 = this.R_MINOR,\r\n\t\t x = latlng.lng * d * r,\r\n\t\t y = lat * d,\r\n\t\t tmp = r2 / r,\r\n\t\t eccent = Math.sqrt(1.0 - tmp * tmp),\r\n\t\t con = eccent * Math.sin(y);\r\n\r\n\t\tcon = Math.pow((1 - con) / (1 + con), eccent * 0.5);\r\n\r\n\t\tvar ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;\r\n\t\ty = -r * Math.log(ts);\r\n\r\n\t\treturn new L.Point(x, y);\r\n\t},\r\n\r\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\r\n\t\tvar d = L.LatLng.RAD_TO_DEG,\r\n\t\t r = this.R_MAJOR,\r\n\t\t r2 = this.R_MINOR,\r\n\t\t lng = point.x * d / r,\r\n\t\t tmp = r2 / r,\r\n\t\t eccent = Math.sqrt(1 - (tmp * tmp)),\r\n\t\t ts = Math.exp(- point.y / r),\r\n\t\t phi = (Math.PI / 2) - 2 * Math.atan(ts),\r\n\t\t numIter = 15,\r\n\t\t tol = 1e-7,\r\n\t\t i = numIter,\r\n\t\t dphi = 0.1,\r\n\t\t con;\r\n\r\n\t\twhile ((Math.abs(dphi) > tol) && (--i > 0)) {\r\n\t\t\tcon = eccent * Math.sin(phi);\r\n\t\t\tdphi = (Math.PI / 2) - 2 * Math.atan(ts *\r\n\t\t\t Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;\r\n\t\t\tphi += dphi;\r\n\t\t}\r\n\r\n\t\treturn new L.LatLng(phi * d, lng);\r\n\t}\r\n};\r\n\n\n\r\nL.CRS.EPSG3395 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:3395',\r\n\r\n\tprojection: L.Projection.Mercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar m = L.Projection.Mercator,\r\n\t\t r = m.R_MAJOR,\r\n\t\t scale = 0.5 / (Math.PI * r);\r\n\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\n\n/*\r\n * L.TileLayer is used for standard xyz-numbered tile layers.\r\n */\r\n\r\nL.TileLayer = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tminZoom: 0,\r\n\t\tmaxZoom: 18,\r\n\t\ttileSize: 256,\r\n\t\tsubdomains: 'abc',\r\n\t\terrorTileUrl: '',\r\n\t\tattribution: '',\r\n\t\tzoomOffset: 0,\r\n\t\topacity: 1,\r\n\t\t/*\r\n\t\tmaxNativeZoom: null,\r\n\t\tzIndex: null,\r\n\t\ttms: false,\r\n\t\tcontinuousWorld: false,\r\n\t\tnoWrap: false,\r\n\t\tzoomReverse: false,\r\n\t\tdetectRetina: false,\r\n\t\treuseTiles: false,\r\n\t\tbounds: false,\r\n\t\t*/\r\n\t\tunloadInvisibleTiles: L.Browser.mobile,\r\n\t\tupdateWhenIdle: L.Browser.mobile\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\r\n\t\tif (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {\r\n\r\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\r\n\t\t\toptions.zoomOffset++;\r\n\r\n\t\t\tif (options.minZoom > 0) {\r\n\t\t\t\toptions.minZoom--;\r\n\t\t\t}\r\n\t\t\tthis.options.maxZoom--;\r\n\t\t}\r\n\r\n\t\tif (options.bounds) {\r\n\t\t\toptions.bounds = L.latLngBounds(options.bounds);\r\n\t\t}\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar subdomains = this.options.subdomains;\r\n\r\n\t\tif (typeof subdomains === 'string') {\r\n\t\t\tthis.options.subdomains = subdomains.split('');\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\t\tthis._animated = map._zoomAnimated;\r\n\r\n\t\t// create a container div for tiles\r\n\t\tthis._initContainer();\r\n\r\n\t\t// set up events\r\n\t\tmap.on({\r\n\t\t\t'viewreset': this._reset,\r\n\t\t\t'moveend': this._update\r\n\t\t}, this);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tmap.on({\r\n\t\t\t\t'zoomanim': this._animateZoom,\r\n\t\t\t\t'zoomend': this._endZoomAnim\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tif (!this.options.updateWhenIdle) {\r\n\t\t\tthis._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this);\r\n\t\t\tmap.on('move', this._limitedUpdate, this);\r\n\t\t}\r\n\r\n\t\tthis._reset();\r\n\t\tthis._update();\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis._container.parentNode.removeChild(this._container);\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this._reset,\r\n\t\t\t'moveend': this._update\r\n\t\t}, this);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tmap.off({\r\n\t\t\t\t'zoomanim': this._animateZoom,\r\n\t\t\t\t'zoomend': this._endZoomAnim\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tif (!this.options.updateWhenIdle) {\r\n\t\t\tmap.off('move', this._limitedUpdate, this);\r\n\t\t}\r\n\r\n\t\tthis._container = null;\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\tvar pane = this._map._panes.tilePane;\r\n\r\n\t\tif (this._container) {\r\n\t\t\tpane.appendChild(this._container);\r\n\t\t\tthis._setAutoZIndex(pane, Math.max);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar pane = this._map._panes.tilePane;\r\n\r\n\t\tif (this._container) {\r\n\t\t\tpane.insertBefore(this._container, pane.firstChild);\r\n\t\t\tthis._setAutoZIndex(pane, Math.min);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetAttribution: function () {\r\n\t\treturn this.options.attribution;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetZIndex: function (zIndex) {\r\n\t\tthis.options.zIndex = zIndex;\r\n\t\tthis._updateZIndex();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetUrl: function (url, noRedraw) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset({hard: true});\r\n\t\t\tthis._update();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateZIndex: function () {\r\n\t\tif (this._container && this.options.zIndex !== undefined) {\r\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\r\n\t\t}\r\n\t},\r\n\r\n\t_setAutoZIndex: function (pane, compare) {\r\n\r\n\t\tvar layers = pane.children,\r\n\t\t edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min\r\n\t\t zIndex, i, len;\r\n\r\n\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\r\n\t\t\tif (layers[i] !== this._container) {\r\n\t\t\t\tzIndex = parseInt(layers[i].style.zIndex, 10);\r\n\r\n\t\t\t\tif (!isNaN(zIndex)) {\r\n\t\t\t\t\tedgeZIndex = compare(edgeZIndex, zIndex);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.options.zIndex = this._container.style.zIndex =\r\n\t\t (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1);\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tvar i,\r\n\t\t tiles = this._tiles;\r\n\r\n\t\tif (L.Browser.ielt9) {\r\n\t\t\tfor (i in tiles) {\r\n\t\t\t\tL.DomUtil.setOpacity(tiles[i], this.options.opacity);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tL.DomUtil.setOpacity(this._container, this.options.opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_initContainer: function () {\r\n\t\tvar tilePane = this._map._panes.tilePane;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._container = L.DomUtil.create('div', 'leaflet-layer');\r\n\r\n\t\t\tthis._updateZIndex();\r\n\r\n\t\t\tif (this._animated) {\r\n\t\t\t\tvar className = 'leaflet-tile-container';\r\n\r\n\t\t\t\tthis._bgBuffer = L.DomUtil.create('div', className, this._container);\r\n\t\t\t\tthis._tileContainer = L.DomUtil.create('div', className, this._container);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tthis._tileContainer = this._container;\r\n\t\t\t}\r\n\r\n\t\t\ttilePane.appendChild(this._container);\r\n\r\n\t\t\tif (this.options.opacity < 1) {\r\n\t\t\t\tthis._updateOpacity();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_reset: function (e) {\r\n\t\tfor (var key in this._tiles) {\r\n\t\t\tthis.fire('tileunload', {tile: this._tiles[key]});\r\n\t\t}\r\n\r\n\t\tthis._tiles = {};\r\n\t\tthis._tilesToLoad = 0;\r\n\r\n\t\tif (this.options.reuseTiles) {\r\n\t\t\tthis._unusedTiles = [];\r\n\t\t}\r\n\r\n\t\tthis._tileContainer.innerHTML = '';\r\n\r\n\t\tif (this._animated && e && e.hard) {\r\n\t\t\tthis._clearBgBuffer();\r\n\t\t}\r\n\r\n\t\tthis._initContainer();\r\n\t},\r\n\r\n\t_getTileSize: function () {\r\n\t\tvar map = this._map,\r\n\t\t zoom = map.getZoom() + this.options.zoomOffset,\r\n\t\t zoomN = this.options.maxNativeZoom,\r\n\t\t tileSize = this.options.tileSize;\r\n\r\n\t\tif (zoomN && zoom > zoomN) {\r\n\t\t\ttileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize);\r\n\t\t}\r\n\r\n\t\treturn tileSize;\r\n\t},\r\n\r\n\t_update: function () {\r\n\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t bounds = map.getPixelBounds(),\r\n\t\t zoom = map.getZoom(),\r\n\t\t tileSize = this._getTileSize();\r\n\r\n\t\tif (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar tileBounds = L.bounds(\r\n\t\t bounds.min.divideBy(tileSize)._floor(),\r\n\t\t bounds.max.divideBy(tileSize)._floor());\r\n\r\n\t\tthis._addTilesFromCenterOut(tileBounds);\r\n\r\n\t\tif (this.options.unloadInvisibleTiles || this.options.reuseTiles) {\r\n\t\t\tthis._removeOtherTiles(tileBounds);\r\n\t\t}\r\n\t},\r\n\r\n\t_addTilesFromCenterOut: function (bounds) {\r\n\t\tvar queue = [],\r\n\t\t center = bounds.getCenter();\r\n\r\n\t\tvar j, i, point;\r\n\r\n\t\tfor (j = bounds.min.y; j <= bounds.max.y; j++) {\r\n\t\t\tfor (i = bounds.min.x; i <= bounds.max.x; i++) {\r\n\t\t\t\tpoint = new L.Point(i, j);\r\n\r\n\t\t\t\tif (this._tileShouldBeLoaded(point)) {\r\n\t\t\t\t\tqueue.push(point);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar tilesToLoad = queue.length;\r\n\r\n\t\tif (tilesToLoad === 0) { return; }\r\n\r\n\t\t// load tiles in order of their distance to center\r\n\t\tqueue.sort(function (a, b) {\r\n\t\t\treturn a.distanceTo(center) - b.distanceTo(center);\r\n\t\t});\r\n\r\n\t\tvar fragment = document.createDocumentFragment();\r\n\r\n\t\t// if its the first batch of tiles to load\r\n\t\tif (!this._tilesToLoad) {\r\n\t\t\tthis.fire('loading');\r\n\t\t}\r\n\r\n\t\tthis._tilesToLoad += tilesToLoad;\r\n\r\n\t\tfor (i = 0; i < tilesToLoad; i++) {\r\n\t\t\tthis._addTile(queue[i], fragment);\r\n\t\t}\r\n\r\n\t\tthis._tileContainer.appendChild(fragment);\r\n\t},\r\n\r\n\t_tileShouldBeLoaded: function (tilePoint) {\r\n\t\tif ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {\r\n\t\t\treturn false; // already loaded\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (!options.continuousWorld) {\r\n\t\t\tvar limit = this._getWrapTileNum();\r\n\r\n\t\t\t// don't load if exceeds world bounds\r\n\t\t\tif ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) ||\r\n\t\t\t\ttilePoint.y < 0 || tilePoint.y >= limit.y) { return false; }\r\n\t\t}\r\n\r\n\t\tif (options.bounds) {\r\n\t\t\tvar tileSize = options.tileSize,\r\n\t\t\t nwPoint = tilePoint.multiplyBy(tileSize),\r\n\t\t\t sePoint = nwPoint.add([tileSize, tileSize]),\r\n\t\t\t nw = this._map.unproject(nwPoint),\r\n\t\t\t se = this._map.unproject(sePoint);\r\n\r\n\t\t\t// TODO temporary hack, will be removed after refactoring projections\r\n\t\t\t// https://github.com/Leaflet/Leaflet/issues/1618\r\n\t\t\tif (!options.continuousWorld && !options.noWrap) {\r\n\t\t\t\tnw = nw.wrap();\r\n\t\t\t\tse = se.wrap();\r\n\t\t\t}\r\n\r\n\t\t\tif (!options.bounds.intersects([nw, se])) { return false; }\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_removeOtherTiles: function (bounds) {\r\n\t\tvar kArr, x, y, key;\r\n\r\n\t\tfor (key in this._tiles) {\r\n\t\t\tkArr = key.split(':');\r\n\t\t\tx = parseInt(kArr[0], 10);\r\n\t\t\ty = parseInt(kArr[1], 10);\r\n\r\n\t\t\t// remove tile if it's out of bounds\r\n\t\t\tif (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) {\r\n\t\t\t\tthis._removeTile(key);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_removeTile: function (key) {\r\n\t\tvar tile = this._tiles[key];\r\n\r\n\t\tthis.fire('tileunload', {tile: tile, url: tile.src});\r\n\r\n\t\tif (this.options.reuseTiles) {\r\n\t\t\tL.DomUtil.removeClass(tile, 'leaflet-tile-loaded');\r\n\t\t\tthis._unusedTiles.push(tile);\r\n\r\n\t\t} else if (tile.parentNode === this._tileContainer) {\r\n\t\t\tthis._tileContainer.removeChild(tile);\r\n\t\t}\r\n\r\n\t\t// for https://github.com/CloudMade/Leaflet/issues/137\r\n\t\tif (!L.Browser.android) {\r\n\t\t\ttile.onload = null;\r\n\t\t\ttile.src = L.Util.emptyImageUrl;\r\n\t\t}\r\n\r\n\t\tdelete this._tiles[key];\r\n\t},\r\n\r\n\t_addTile: function (tilePoint, container) {\r\n\t\tvar tilePos = this._getTilePos(tilePoint);\r\n\r\n\t\t// get unused tile - or create a new tile\r\n\t\tvar tile = this._getTile();\r\n\r\n\t\t/*\r\n\t\tChrome 20 layouts much faster with top/left (verify with timeline, frames)\r\n\t\tAndroid 4 browser has display issues with top/left and requires transform instead\r\n\t\t(other browsers don't currently care) - see debug/hacks/jitter.html for an example\r\n\t\t*/\r\n\t\tL.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);\r\n\r\n\t\tthis._tiles[tilePoint.x + ':' + tilePoint.y] = tile;\r\n\r\n\t\tthis._loadTile(tile, tilePoint);\r\n\r\n\t\tif (tile.parentNode !== this._tileContainer) {\r\n\t\t\tcontainer.appendChild(tile);\r\n\t\t}\r\n\t},\r\n\r\n\t_getZoomForUrl: function () {\r\n\r\n\t\tvar options = this.options,\r\n\t\t zoom = this._map.getZoom();\r\n\r\n\t\tif (options.zoomReverse) {\r\n\t\t\tzoom = options.maxZoom - zoom;\r\n\t\t}\r\n\r\n\t\tzoom += options.zoomOffset;\r\n\r\n\t\treturn options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom;\r\n\t},\r\n\r\n\t_getTilePos: function (tilePoint) {\r\n\t\tvar origin = this._map.getPixelOrigin(),\r\n\t\t tileSize = this._getTileSize();\r\n\r\n\t\treturn tilePoint.multiplyBy(tileSize).subtract(origin);\r\n\t},\r\n\r\n\t// image-specific code (override to implement e.g. Canvas or SVG tile layer)\r\n\r\n\tgetTileUrl: function (tilePoint) {\r\n\t\treturn L.Util.template(this._url, L.extend({\r\n\t\t\ts: this._getSubdomain(tilePoint),\r\n\t\t\tz: tilePoint.z,\r\n\t\t\tx: tilePoint.x,\r\n\t\t\ty: tilePoint.y\r\n\t\t}, this.options));\r\n\t},\r\n\r\n\t_getWrapTileNum: function () {\r\n\t\tvar crs = this._map.options.crs,\r\n\t\t size = crs.getSize(this._map.getZoom());\r\n\t\treturn size.divideBy(this._getTileSize())._floor();\r\n\t},\r\n\r\n\t_adjustTilePoint: function (tilePoint) {\r\n\r\n\t\tvar limit = this._getWrapTileNum();\r\n\r\n\t\t// wrap tile coordinates\r\n\t\tif (!this.options.continuousWorld && !this.options.noWrap) {\r\n\t\t\ttilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x;\r\n\t\t}\r\n\r\n\t\tif (this.options.tms) {\r\n\t\t\ttilePoint.y = limit.y - tilePoint.y - 1;\r\n\t\t}\r\n\r\n\t\ttilePoint.z = this._getZoomForUrl();\r\n\t},\r\n\r\n\t_getSubdomain: function (tilePoint) {\r\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\r\n\t\treturn this.options.subdomains[index];\r\n\t},\r\n\r\n\t_getTile: function () {\r\n\t\tif (this.options.reuseTiles && this._unusedTiles.length > 0) {\r\n\t\t\tvar tile = this._unusedTiles.pop();\r\n\t\t\tthis._resetTile(tile);\r\n\t\t\treturn tile;\r\n\t\t}\r\n\t\treturn this._createTile();\r\n\t},\r\n\r\n\t// Override if data stored on a tile needs to be cleaned up before reuse\r\n\t_resetTile: function (/*tile*/) {},\r\n\r\n\t_createTile: function () {\r\n\t\tvar tile = L.DomUtil.create('img', 'leaflet-tile');\r\n\t\ttile.style.width = tile.style.height = this._getTileSize() + 'px';\r\n\t\ttile.galleryimg = 'no';\r\n\r\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\r\n\r\n\t\tif (L.Browser.ielt9 && this.options.opacity !== undefined) {\r\n\t\t\tL.DomUtil.setOpacity(tile, this.options.opacity);\r\n\t\t}\r\n\t\t// without this hack, tiles disappear after zoom on Chrome for Android\r\n\t\t// https://github.com/Leaflet/Leaflet/issues/2078\r\n\t\tif (L.Browser.mobileWebkit3d) {\r\n\t\t\ttile.style.WebkitBackfaceVisibility = 'hidden';\r\n\t\t}\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t_loadTile: function (tile, tilePoint) {\r\n\t\ttile._layer = this;\r\n\t\ttile.onload = this._tileOnLoad;\r\n\t\ttile.onerror = this._tileOnError;\r\n\r\n\t\tthis._adjustTilePoint(tilePoint);\r\n\t\ttile.src = this.getTileUrl(tilePoint);\r\n\r\n\t\tthis.fire('tileloadstart', {\r\n\t\t\ttile: tile,\r\n\t\t\turl: tile.src\r\n\t\t});\r\n\t},\r\n\r\n\t_tileLoaded: function () {\r\n\t\tthis._tilesToLoad--;\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tL.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated');\r\n\t\t}\r\n\r\n\t\tif (!this._tilesToLoad) {\r\n\t\t\tthis.fire('load');\r\n\r\n\t\t\tif (this._animated) {\r\n\t\t\t\t// clear scaled tiles after all new tiles are loaded (for performance)\r\n\t\t\t\tclearTimeout(this._clearBgBufferTimer);\r\n\t\t\t\tthis._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_tileOnLoad: function () {\r\n\t\tvar layer = this._layer;\r\n\r\n\t\t//Only if we are loading an actual image\r\n\t\tif (this.src !== L.Util.emptyImageUrl) {\r\n\t\t\tL.DomUtil.addClass(this, 'leaflet-tile-loaded');\r\n\r\n\t\t\tlayer.fire('tileload', {\r\n\t\t\t\ttile: this,\r\n\t\t\t\turl: this.src\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tlayer._tileLoaded();\r\n\t},\r\n\r\n\t_tileOnError: function () {\r\n\t\tvar layer = this._layer;\r\n\r\n\t\tlayer.fire('tileerror', {\r\n\t\t\ttile: this,\r\n\t\t\turl: this.src\r\n\t\t});\r\n\r\n\t\tvar newUrl = layer.options.errorTileUrl;\r\n\t\tif (newUrl) {\r\n\t\t\tthis.src = newUrl;\r\n\t\t}\r\n\r\n\t\tlayer._tileLoaded();\r\n\t}\r\n});\r\n\r\nL.tileLayer = function (url, options) {\r\n\treturn new L.TileLayer(url, options);\r\n};\r\n\n\n/*\r\n * L.TileLayer.WMS is used for putting WMS tile layers on the map.\r\n */\r\n\r\nL.TileLayer.WMS = L.TileLayer.extend({\r\n\r\n\tdefaultWmsParams: {\r\n\t\tservice: 'WMS',\r\n\t\trequest: 'GetMap',\r\n\t\tversion: '1.1.1',\r\n\t\tlayers: '',\r\n\t\tstyles: '',\r\n\t\tformat: 'image/jpeg',\r\n\t\ttransparent: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) { // (String, Object)\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar wmsParams = L.extend({}, this.defaultWmsParams),\r\n\t\t tileSize = options.tileSize || this.options.tileSize;\r\n\r\n\t\tif (options.detectRetina && L.Browser.retina) {\r\n\t\t\twmsParams.width = wmsParams.height = tileSize * 2;\r\n\t\t} else {\r\n\t\t\twmsParams.width = wmsParams.height = tileSize;\r\n\t\t}\r\n\r\n\t\tfor (var i in options) {\r\n\t\t\t// all keys that are not TileLayer options go to WMS params\r\n\t\t\tif (!this.options.hasOwnProperty(i) && i !== 'crs') {\r\n\t\t\t\twmsParams[i] = options[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.wmsParams = wmsParams;\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\r\n\t\tthis._crs = this.options.crs || map.options.crs;\r\n\r\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\r\n\r\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\r\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\r\n\r\n\t\tL.TileLayer.prototype.onAdd.call(this, map);\r\n\t},\r\n\r\n\tgetTileUrl: function (tilePoint) { // (Point, Number) -> String\r\n\r\n\t\tvar map = this._map,\r\n\t\t tileSize = this.options.tileSize,\r\n\r\n\t\t nwPoint = tilePoint.multiplyBy(tileSize),\r\n\t\t sePoint = nwPoint.add([tileSize, tileSize]),\r\n\r\n\t\t nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),\r\n\t\t se = this._crs.project(map.unproject(sePoint, tilePoint.z)),\r\n\t\t bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?\r\n\t\t [se.y, nw.x, nw.y, se.x].join(',') :\r\n\t\t [nw.x, se.y, se.x, nw.y].join(','),\r\n\r\n\t\t url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});\r\n\r\n\t\treturn url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;\r\n\t},\r\n\r\n\tsetParams: function (params, noRedraw) {\r\n\r\n\t\tL.extend(this.wmsParams, params);\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nL.tileLayer.wms = function (url, options) {\r\n\treturn new L.TileLayer.WMS(url, options);\r\n};\r\n\n\n/*\r\n * L.TileLayer.Canvas is a class that you can use as a base for creating\r\n * dynamically drawn Canvas-based tile layers.\r\n */\r\n\r\nL.TileLayer.Canvas = L.TileLayer.extend({\r\n\toptions: {\r\n\t\tasync: false\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset({hard: true});\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tfor (var i in this._tiles) {\r\n\t\t\tthis._redrawTile(this._tiles[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_redrawTile: function (tile) {\r\n\t\tthis.drawTile(tile, tile._tilePoint, this._map._zoom);\r\n\t},\r\n\r\n\t_createTile: function () {\r\n\t\tvar tile = L.DomUtil.create('canvas', 'leaflet-tile');\r\n\t\ttile.width = tile.height = this.options.tileSize;\r\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t_loadTile: function (tile, tilePoint) {\r\n\t\ttile._layer = this;\r\n\t\ttile._tilePoint = tilePoint;\r\n\r\n\t\tthis._redrawTile(tile);\r\n\r\n\t\tif (!this.options.async) {\r\n\t\t\tthis.tileDrawn(tile);\r\n\t\t}\r\n\t},\r\n\r\n\tdrawTile: function (/*tile, tilePoint*/) {\r\n\t\t// override with rendering code\r\n\t},\r\n\r\n\ttileDrawn: function (tile) {\r\n\t\tthis._tileOnLoad.call(tile);\r\n\t}\r\n});\r\n\r\n\r\nL.tileLayer.canvas = function (options) {\r\n\treturn new L.TileLayer.Canvas(options);\r\n};\r\n\n\n/*\r\n * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds).\r\n */\r\n\r\nL.ImageOverlay = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\topacity: 1\r\n\t},\r\n\r\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\r\n\t\tthis._url = url;\r\n\t\tthis._bounds = L.latLngBounds(bounds);\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._image) {\r\n\t\t\tthis._initImage();\r\n\t\t}\r\n\r\n\t\tmap._panes.overlayPane.appendChild(this._image);\r\n\r\n\t\tmap.on('viewreset', this._reset, this);\r\n\r\n\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._reset();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.getPanes().overlayPane.removeChild(this._image);\r\n\r\n\t\tmap.off('viewreset', this._reset, this);\r\n\r\n\t\tif (map.options.zoomAnimation) {\r\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tthis._updateOpacity();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// TODO remove bringToFront/bringToBack duplication from TileLayer/Path\r\n\tbringToFront: function () {\r\n\t\tif (this._image) {\r\n\t\t\tthis._map._panes.overlayPane.appendChild(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar pane = this._map._panes.overlayPane;\r\n\t\tif (this._image) {\r\n\t\t\tpane.insertBefore(this._image, pane.firstChild);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetUrl: function (url) {\r\n\t\tthis._url = url;\r\n\t\tthis._image.src = this._url;\r\n\t},\r\n\r\n\tgetAttribution: function () {\r\n\t\treturn this.options.attribution;\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tthis._image = L.DomUtil.create('img', 'leaflet-image-layer');\r\n\r\n\t\tif (this._map.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-animated');\r\n\t\t} else {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-hide');\r\n\t\t}\r\n\r\n\t\tthis._updateOpacity();\r\n\r\n\t\t//TODO createImage util method to remove duplication\r\n\t\tL.extend(this._image, {\r\n\t\t\tgalleryimg: 'no',\r\n\t\t\tonselectstart: L.Util.falseFn,\r\n\t\t\tonmousemove: L.Util.falseFn,\r\n\t\t\tonload: L.bind(this._onImageLoad, this),\r\n\t\t\tsrc: this._url\r\n\t\t});\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar map = this._map,\r\n\t\t image = this._image,\r\n\t\t scale = map.getZoomScale(e.zoom),\r\n\t\t nw = this._bounds.getNorthWest(),\r\n\t\t se = this._bounds.getSouthEast(),\r\n\r\n\t\t topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),\r\n\t\t size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft),\r\n\t\t origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale)));\r\n\r\n\t\timage.style[L.DomUtil.TRANSFORM] =\r\n\t\t L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') ';\r\n\t},\r\n\r\n\t_reset: function () {\r\n\t\tvar image = this._image,\r\n\t\t topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\r\n\t\t size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft);\r\n\r\n\t\tL.DomUtil.setPosition(image, topLeft);\r\n\r\n\t\timage.style.width = size.x + 'px';\r\n\t\timage.style.height = size.y + 'px';\r\n\t},\r\n\r\n\t_onImageLoad: function () {\r\n\t\tthis.fire('load');\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._image, this.options.opacity);\r\n\t}\r\n});\r\n\r\nL.imageOverlay = function (url, bounds, options) {\r\n\treturn new L.ImageOverlay(url, bounds, options);\r\n};\r\n\n\n/*\r\n * L.Icon is an image-based icon class that you can use with L.Marker for custom markers.\r\n */\r\n\r\nL.Icon = L.Class.extend({\r\n\toptions: {\r\n\t\t/*\r\n\t\ticonUrl: (String) (required)\r\n\t\ticonRetinaUrl: (String) (optional, used for retina devices if detected)\r\n\t\ticonSize: (Point) (can be set through CSS)\r\n\t\ticonAnchor: (Point) (centered by default, can be set in CSS with negative margins)\r\n\t\tpopupAnchor: (Point) (if not specified, popup opens in the anchor point)\r\n\t\tshadowUrl: (String) (no shadow by default)\r\n\t\tshadowRetinaUrl: (String) (optional, used for retina devices if detected)\r\n\t\tshadowSize: (Point)\r\n\t\tshadowAnchor: (Point)\r\n\t\t*/\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tcreateIcon: function (oldIcon) {\r\n\t\treturn this._createIcon('icon', oldIcon);\r\n\t},\r\n\r\n\tcreateShadow: function (oldIcon) {\r\n\t\treturn this._createIcon('shadow', oldIcon);\r\n\t},\r\n\r\n\t_createIcon: function (name, oldIcon) {\r\n\t\tvar src = this._getIconUrl(name);\r\n\r\n\t\tif (!src) {\r\n\t\t\tif (name === 'icon') {\r\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar img;\r\n\t\tif (!oldIcon || oldIcon.tagName !== 'IMG') {\r\n\t\t\timg = this._createImg(src);\r\n\t\t} else {\r\n\t\t\timg = this._createImg(src, oldIcon);\r\n\t\t}\r\n\t\tthis._setIconStyles(img, name);\r\n\r\n\t\treturn img;\r\n\t},\r\n\r\n\t_setIconStyles: function (img, name) {\r\n\t\tvar options = this.options,\r\n\t\t size = L.point(options[name + 'Size']),\r\n\t\t anchor;\r\n\r\n\t\tif (name === 'shadow') {\r\n\t\t\tanchor = L.point(options.shadowAnchor || options.iconAnchor);\r\n\t\t} else {\r\n\t\t\tanchor = L.point(options.iconAnchor);\r\n\t\t}\r\n\r\n\t\tif (!anchor && size) {\r\n\t\t\tanchor = size.divideBy(2, true);\r\n\t\t}\r\n\r\n\t\timg.className = 'leaflet-marker-' + name + ' ' + options.className;\r\n\r\n\t\tif (anchor) {\r\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\r\n\t\t\timg.style.marginTop = (-anchor.y) + 'px';\r\n\t\t}\r\n\r\n\t\tif (size) {\r\n\t\t\timg.style.width = size.x + 'px';\r\n\t\t\timg.style.height = size.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t_createImg: function (src, el) {\r\n\t\tel = el || document.createElement('img');\r\n\t\tel.src = src;\r\n\t\treturn el;\r\n\t},\r\n\r\n\t_getIconUrl: function (name) {\r\n\t\tif (L.Browser.retina && this.options[name + 'RetinaUrl']) {\r\n\t\t\treturn this.options[name + 'RetinaUrl'];\r\n\t\t}\r\n\t\treturn this.options[name + 'Url'];\r\n\t}\r\n});\r\n\r\nL.icon = function (options) {\r\n\treturn new L.Icon(options);\r\n};\r\n\n\n/*\n * L.Icon.Default is the blue marker icon used by default in Leaflet.\n */\n\nL.Icon.Default = L.Icon.extend({\n\n\toptions: {\n\t\ticonSize: [25, 41],\n\t\ticonAnchor: [12, 41],\n\t\tpopupAnchor: [1, -34],\n\n\t\tshadowSize: [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tvar key = name + 'Url';\n\n\t\tif (this.options[key]) {\n\t\t\treturn this.options[key];\n\t\t}\n\n\t\tif (L.Browser.retina && name === 'icon') {\n\t\t\tname += '-2x';\n\t\t}\n\n\t\tvar path = L.Icon.Default.imagePath;\n\n\t\tif (!path) {\n\t\t\tthrow new Error('Couldn\\'t autodetect L.Icon.Default.imagePath, set it manually.');\n\t\t}\n\n\t\treturn path + '/marker-' + name + '.png';\n\t}\n});\n\nL.Icon.Default.imagePath = (function () {\n\tvar scripts = document.getElementsByTagName('script'),\n\t leafletRe = /[\\/^]leaflet[\\-\\._]?([\\w\\-\\._]*)\\.js\\??/;\n\n\tvar i, len, src, matches, path;\n\n\tfor (i = 0, len = scripts.length; i < len; i++) {\n\t\tsrc = scripts[i].src;\n\t\tmatches = src.match(leafletRe);\n\n\t\tif (matches) {\n\t\t\tpath = src.split(leafletRe)[0];\n\t\t\treturn (path ? path + '/' : '') + 'images';\n\t\t}\n\t}\n}());\n\n\n/*\r\n * L.Marker is used to display clickable/draggable icons on the map.\r\n */\r\n\r\nL.Marker = L.Class.extend({\r\n\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\ticon: new L.Icon.Default(),\r\n\t\ttitle: '',\r\n\t\talt: '',\r\n\t\tclickable: true,\r\n\t\tdraggable: false,\r\n\t\tkeyboard: true,\r\n\t\tzIndexOffset: 0,\r\n\t\topacity: 1,\r\n\t\triseOnHover: false,\r\n\t\triseOffset: 250\r\n\t},\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.setOptions(this, options);\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tmap.on('viewreset', this.update, this);\r\n\r\n\t\tthis._initIcon();\r\n\t\tthis.update();\r\n\t\tthis.fire('add');\r\n\r\n\t\tif (map.options.zoomAnimation && map.options.markerZoomAnimation) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (this.dragging) {\r\n\t\t\tthis.dragging.disable();\r\n\t\t}\r\n\r\n\t\tthis._removeIcon();\r\n\t\tthis._removeShadow();\r\n\r\n\t\tthis.fire('remove');\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this.update,\r\n\t\t\t'zoomanim': this._animateZoom\r\n\t\t}, this);\r\n\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\r\n\t\tthis.update();\r\n\r\n\t\treturn this.fire('move', { latlng: this._latlng });\r\n\t},\r\n\r\n\tsetZIndexOffset: function (offset) {\r\n\t\tthis.options.zIndexOffset = offset;\r\n\t\tthis.update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetIcon: function (icon) {\r\n\r\n\t\tthis.options.icon = icon;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._initIcon();\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\tif (this._popup) {\r\n\t\t\tthis.bindPopup(this._popup);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\t\tif (this._icon) {\r\n\t\t\tvar pos = this._map.latLngToLayerPoint(this._latlng).round();\r\n\t\t\tthis._setPos(pos);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initIcon: function () {\r\n\t\tvar options = this.options,\r\n\t\t map = this._map,\r\n\t\t animation = (map.options.zoomAnimation && map.options.markerZoomAnimation),\r\n\t\t classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide';\r\n\r\n\t\tvar icon = options.icon.createIcon(this._icon),\r\n\t\t\taddIcon = false;\r\n\r\n\t\t// if we're not reusing the icon, remove the old one and init new one\r\n\t\tif (icon !== this._icon) {\r\n\t\t\tif (this._icon) {\r\n\t\t\t\tthis._removeIcon();\r\n\t\t\t}\r\n\t\t\taddIcon = true;\r\n\r\n\t\t\tif (options.title) {\r\n\t\t\t\ticon.title = options.title;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (options.alt) {\r\n\t\t\t\ticon.alt = options.alt;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tL.DomUtil.addClass(icon, classToAdd);\r\n\r\n\t\tif (options.keyboard) {\r\n\t\t\ticon.tabIndex = '0';\r\n\t\t}\r\n\r\n\t\tthis._icon = icon;\r\n\r\n\t\tthis._initInteraction();\r\n\r\n\t\tif (options.riseOnHover) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.on(icon, 'mouseover', this._bringToFront, this)\r\n\t\t\t\t.on(icon, 'mouseout', this._resetZIndex, this);\r\n\t\t}\r\n\r\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\r\n\t\t\taddShadow = false;\r\n\r\n\t\tif (newShadow !== this._shadow) {\r\n\t\t\tthis._removeShadow();\r\n\t\t\taddShadow = true;\r\n\t\t}\r\n\r\n\t\tif (newShadow) {\r\n\t\t\tL.DomUtil.addClass(newShadow, classToAdd);\r\n\t\t}\r\n\t\tthis._shadow = newShadow;\r\n\r\n\r\n\t\tif (options.opacity < 1) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\r\n\t\tvar panes = this._map._panes;\r\n\r\n\t\tif (addIcon) {\r\n\t\t\tpanes.markerPane.appendChild(this._icon);\r\n\t\t}\r\n\r\n\t\tif (newShadow && addShadow) {\r\n\t\t\tpanes.shadowPane.appendChild(this._shadow);\r\n\t\t}\r\n\t},\r\n\r\n\t_removeIcon: function () {\r\n\t\tif (this.options.riseOnHover) {\r\n\t\t\tL.DomEvent\r\n\t\t\t .off(this._icon, 'mouseover', this._bringToFront)\r\n\t\t\t .off(this._icon, 'mouseout', this._resetZIndex);\r\n\t\t}\r\n\r\n\t\tthis._map._panes.markerPane.removeChild(this._icon);\r\n\r\n\t\tthis._icon = null;\r\n\t},\r\n\r\n\t_removeShadow: function () {\r\n\t\tif (this._shadow) {\r\n\t\t\tthis._map._panes.shadowPane.removeChild(this._shadow);\r\n\t\t}\r\n\t\tthis._shadow = null;\r\n\t},\r\n\r\n\t_setPos: function (pos) {\r\n\t\tL.DomUtil.setPosition(this._icon, pos);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setPosition(this._shadow, pos);\r\n\t\t}\r\n\r\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\r\n\r\n\t\tthis._resetZIndex();\r\n\t},\r\n\r\n\t_updateZIndex: function (offset) {\r\n\t\tthis._icon.style.zIndex = this._zIndex + offset;\r\n\t},\r\n\r\n\t_animateZoom: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\r\n\r\n\t\tthis._setPos(pos);\r\n\t},\r\n\r\n\t_initInteraction: function () {\r\n\r\n\t\tif (!this.options.clickable) { return; }\r\n\r\n\t\t// TODO refactor into something shared with Map/Path/etc. to DRY it up\r\n\r\n\t\tvar icon = this._icon,\r\n\t\t events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu'];\r\n\r\n\t\tL.DomUtil.addClass(icon, 'leaflet-clickable');\r\n\t\tL.DomEvent.on(icon, 'click', this._onMouseClick, this);\r\n\t\tL.DomEvent.on(icon, 'keypress', this._onKeyPress, this);\r\n\r\n\t\tfor (var i = 0; i < events.length; i++) {\r\n\t\t\tL.DomEvent.on(icon, events[i], this._fireMouseEvent, this);\r\n\t\t}\r\n\r\n\t\tif (L.Handler.MarkerDrag) {\r\n\t\t\tthis.dragging = new L.Handler.MarkerDrag(this);\r\n\r\n\t\t\tif (this.options.draggable) {\r\n\t\t\t\tthis.dragging.enable();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tvar wasDragged = this.dragging && this.dragging.moved();\r\n\r\n\t\tif (this.hasEventListeners(e.type) || wasDragged) {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t}\r\n\r\n\t\tif (wasDragged) { return; }\r\n\r\n\t\tif ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; }\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\toriginalEvent: e,\r\n\t\t\tlatlng: this._latlng\r\n\t\t});\r\n\t},\r\n\r\n\t_onKeyPress: function (e) {\r\n\t\tif (e.keyCode === 13) {\r\n\t\t\tthis.fire('click', {\r\n\t\t\t\toriginalEvent: e,\r\n\t\t\t\tlatlng: this._latlng\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\toriginalEvent: e,\r\n\t\t\tlatlng: this._latlng\r\n\t\t});\r\n\r\n\t\t// TODO proper custom event propagation\r\n\t\t// this line will always be called if marker is in a FeatureGroup\r\n\t\tif (e.type === 'contextmenu' && this.hasEventListeners(e.type)) {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t\tif (e.type !== 'mousedown') {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._icon, this.options.opacity);\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setOpacity(this._shadow, this.options.opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_bringToFront: function () {\r\n\t\tthis._updateZIndex(this.options.riseOffset);\r\n\t},\r\n\r\n\t_resetZIndex: function () {\r\n\t\tthis._updateZIndex(0);\r\n\t}\r\n});\r\n\r\nL.marker = function (latlng, options) {\r\n\treturn new L.Marker(latlng, options);\r\n};\r\n\n\n/*\n * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon)\n * to use with L.Marker.\n */\n\nL.DivIcon = L.Icon.extend({\n\toptions: {\n\t\ticonSize: [12, 12], // also can be set through CSS\n\t\t/*\n\t\ticonAnchor: (Point)\n\t\tpopupAnchor: (Point)\n\t\thtml: (String)\n\t\tbgPos: (Point)\n\t\t*/\n\t\tclassName: 'leaflet-div-icon',\n\t\thtml: false\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t options = this.options;\n\n\t\tif (options.html !== false) {\n\t\t\tdiv.innerHTML = options.html;\n\t\t} else {\n\t\t\tdiv.innerHTML = '';\n\t\t}\n\n\t\tif (options.bgPos) {\n\t\t\tdiv.style.backgroundPosition =\n\t\t\t (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';\n\t\t}\n\n\t\tthis._setIconStyles(div, 'icon');\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\nL.divIcon = function (options) {\n\treturn new L.DivIcon(options);\n};\n\n\n/*\r\n * L.Popup is used for displaying popups on the map.\r\n */\r\n\r\nL.Map.mergeOptions({\r\n\tclosePopupOnClick: true\r\n});\r\n\r\nL.Popup = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tminWidth: 50,\r\n\t\tmaxWidth: 300,\r\n\t\t// maxHeight: null,\r\n\t\tautoPan: true,\r\n\t\tcloseButton: true,\r\n\t\toffset: [0, 7],\r\n\t\tautoPanPadding: [5, 5],\r\n\t\t// autoPanPaddingTopLeft: null,\r\n\t\t// autoPanPaddingBottomRight: null,\r\n\t\tkeepInView: false,\r\n\t\tclassName: '',\r\n\t\tzoomAnimation: true\r\n\t},\r\n\r\n\tinitialize: function (options, source) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._source = source;\r\n\t\tthis._animated = L.Browser.any3d && this.options.zoomAnimation;\r\n\t\tthis._isOpen = false;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initLayout();\r\n\t\t}\r\n\r\n\t\tvar animFade = map.options.fadeAnimation;\r\n\r\n\t\tif (animFade) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\t\tmap._panes.popupPane.appendChild(this._container);\r\n\r\n\t\tmap.on(this._getEvents(), this);\r\n\r\n\t\tthis.update();\r\n\r\n\t\tif (animFade) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 1);\r\n\t\t}\r\n\r\n\t\tthis.fire('open');\r\n\r\n\t\tmap.fire('popupopen', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.fire('popupopen', {popup: this});\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\topenOn: function (map) {\r\n\t\tmap.openPopup(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap._panes.popupPane.removeChild(this._container);\r\n\r\n\t\tL.Util.falseFn(this._container.offsetWidth); // force reflow\r\n\r\n\t\tmap.off(this._getEvents(), this);\r\n\r\n\t\tif (map.options.fadeAnimation) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\r\n\t\tthis._map = null;\r\n\r\n\t\tthis.fire('close');\r\n\r\n\t\tmap.fire('popupclose', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.fire('popupclose', {popup: this});\r\n\t\t}\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tif (this._map) {\r\n\t\t\tthis._updatePosition();\r\n\t\t\tthis._adjustPan();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetContent: function () {\r\n\t\treturn this._content;\r\n\t},\r\n\r\n\tsetContent: function (content) {\r\n\t\tthis._content = content;\r\n\t\tthis.update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._container.style.visibility = 'hidden';\r\n\r\n\t\tthis._updateContent();\r\n\t\tthis._updateLayout();\r\n\t\tthis._updatePosition();\r\n\r\n\t\tthis._container.style.visibility = '';\r\n\r\n\t\tthis._adjustPan();\r\n\t},\r\n\r\n\t_getEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tviewreset: this._updatePosition\r\n\t\t};\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tevents.zoomanim = this._zoomAnimation;\r\n\t\t}\r\n\t\tif ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\r\n\t\t\tevents.preclick = this._close;\r\n\t\t}\r\n\t\tif (this.options.keepInView) {\r\n\t\t\tevents.moveend = this._adjustPan;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t_close: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.closePopup(this);\r\n\t\t}\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar prefix = 'leaflet-popup',\r\n\t\t\tcontainerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' +\r\n\t\t\t (this._animated ? 'animated' : 'hide'),\r\n\t\t\tcontainer = this._container = L.DomUtil.create('div', containerClass),\r\n\t\t\tcloseButton;\r\n\r\n\t\tif (this.options.closeButton) {\r\n\t\t\tcloseButton = this._closeButton =\r\n\t\t\t L.DomUtil.create('a', prefix + '-close-button', container);\r\n\t\t\tcloseButton.href = '#close';\r\n\t\t\tcloseButton.innerHTML = '×';\r\n\t\t\tL.DomEvent.disableClickPropagation(closeButton);\r\n\r\n\t\t\tL.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);\r\n\t\t}\r\n\r\n\t\tvar wrapper = this._wrapper =\r\n\t\t L.DomUtil.create('div', prefix + '-content-wrapper', container);\r\n\t\tL.DomEvent.disableClickPropagation(wrapper);\r\n\r\n\t\tthis._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);\r\n\r\n\t\tL.DomEvent.disableScrollPropagation(this._contentNode);\r\n\t\tL.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);\r\n\r\n\t\tthis._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);\r\n\t\tthis._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);\r\n\t},\r\n\r\n\t_updateContent: function () {\r\n\t\tif (!this._content) { return; }\r\n\r\n\t\tif (typeof this._content === 'string') {\r\n\t\t\tthis._contentNode.innerHTML = this._content;\r\n\t\t} else {\r\n\t\t\twhile (this._contentNode.hasChildNodes()) {\r\n\t\t\t\tthis._contentNode.removeChild(this._contentNode.firstChild);\r\n\t\t\t}\r\n\t\t\tthis._contentNode.appendChild(this._content);\r\n\t\t}\r\n\t\tthis.fire('contentupdate');\r\n\t},\r\n\r\n\t_updateLayout: function () {\r\n\t\tvar container = this._contentNode,\r\n\t\t style = container.style;\r\n\r\n\t\tstyle.width = '';\r\n\t\tstyle.whiteSpace = 'nowrap';\r\n\r\n\t\tvar width = container.offsetWidth;\r\n\t\twidth = Math.min(width, this.options.maxWidth);\r\n\t\twidth = Math.max(width, this.options.minWidth);\r\n\r\n\t\tstyle.width = (width + 1) + 'px';\r\n\t\tstyle.whiteSpace = '';\r\n\r\n\t\tstyle.height = '';\r\n\r\n\t\tvar height = container.offsetHeight,\r\n\t\t maxHeight = this.options.maxHeight,\r\n\t\t scrolledClass = 'leaflet-popup-scrolled';\r\n\r\n\t\tif (maxHeight && height > maxHeight) {\r\n\t\t\tstyle.height = maxHeight + 'px';\r\n\t\t\tL.DomUtil.addClass(container, scrolledClass);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(container, scrolledClass);\r\n\t\t}\r\n\r\n\t\tthis._containerWidth = this._container.offsetWidth;\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\r\n\t\t animated = this._animated,\r\n\t\t offset = L.point(this.options.offset);\r\n\r\n\t\tif (animated) {\r\n\t\t\tL.DomUtil.setPosition(this._container, pos);\r\n\t\t}\r\n\r\n\t\tthis._containerBottom = -offset.y - (animated ? 0 : pos.y);\r\n\t\tthis._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x);\r\n\r\n\t\t// bottom position the popup in case the height of the popup changes (images loading etc)\r\n\t\tthis._container.style.bottom = this._containerBottom + 'px';\r\n\t\tthis._container.style.left = this._containerLeft + 'px';\r\n\t},\r\n\r\n\t_zoomAnimation: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);\r\n\r\n\t\tL.DomUtil.setPosition(this._container, pos);\r\n\t},\r\n\r\n\t_adjustPan: function () {\r\n\t\tif (!this.options.autoPan) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t containerHeight = this._container.offsetHeight,\r\n\t\t containerWidth = this._containerWidth,\r\n\r\n\t\t layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tlayerPos._add(L.DomUtil.getPosition(this._container));\r\n\t\t}\r\n\r\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\r\n\t\t padding = L.point(this.options.autoPanPadding),\r\n\t\t paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),\r\n\t\t paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),\r\n\t\t size = map.getSize(),\r\n\t\t dx = 0,\r\n\t\t dy = 0;\r\n\r\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\r\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\r\n\t\t}\r\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\r\n\t\t\tdx = containerPos.x - paddingTL.x;\r\n\t\t}\r\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\r\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\r\n\t\t}\r\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\r\n\t\t\tdy = containerPos.y - paddingTL.y;\r\n\t\t}\r\n\r\n\t\tif (dx || dy) {\r\n\t\t\tmap\r\n\t\t\t .fire('autopanstart')\r\n\t\t\t .panBy([dx, dy]);\r\n\t\t}\r\n\t},\r\n\r\n\t_onCloseButtonClick: function (e) {\r\n\t\tthis._close();\r\n\t\tL.DomEvent.stop(e);\r\n\t}\r\n});\r\n\r\nL.popup = function (options, source) {\r\n\treturn new L.Popup(options, source);\r\n};\r\n\r\n\r\nL.Map.include({\r\n\topenPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object])\r\n\t\tthis.closePopup();\r\n\r\n\t\tif (!(popup instanceof L.Popup)) {\r\n\t\t\tvar content = popup;\r\n\r\n\t\t\tpopup = new L.Popup(options)\r\n\t\t\t .setLatLng(latlng)\r\n\t\t\t .setContent(content);\r\n\t\t}\r\n\t\tpopup._isOpen = true;\r\n\r\n\t\tthis._popup = popup;\r\n\t\treturn this.addLayer(popup);\r\n\t},\r\n\r\n\tclosePopup: function (popup) {\r\n\t\tif (!popup || popup === this._popup) {\r\n\t\t\tpopup = this._popup;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\tif (popup) {\r\n\t\t\tthis.removeLayer(popup);\r\n\t\t\tpopup._isOpen = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n/*\r\n * Popup extension to L.Marker, adding popup-related methods.\r\n */\r\n\r\nL.Marker.include({\r\n\topenPopup: function () {\r\n\t\tif (this._popup && this._map && !this._map.hasLayer(this._popup)) {\r\n\t\t\tthis._popup.setLatLng(this._latlng);\r\n\t\t\tthis._map.openPopup(this._popup);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\ttogglePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tif (this._popup._isOpen) {\r\n\t\t\t\tthis.closePopup();\r\n\t\t\t} else {\r\n\t\t\t\tthis.openPopup();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbindPopup: function (content, options) {\r\n\t\tvar anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]);\r\n\r\n\t\tanchor = anchor.add(L.Popup.prototype.options.offset);\r\n\r\n\t\tif (options && options.offset) {\r\n\t\t\tanchor = anchor.add(options.offset);\r\n\t\t}\r\n\r\n\t\toptions = L.extend({offset: anchor}, options);\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis\r\n\t\t\t .on('click', this.togglePopup, this)\r\n\t\t\t .on('remove', this.closePopup, this)\r\n\t\t\t .on('move', this._movePopup, this);\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tL.setOptions(content, options);\r\n\t\t\tthis._popup = content;\r\n\t\t} else {\r\n\t\t\tthis._popup = new L.Popup(options, this)\r\n\t\t\t\t.setContent(content);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetPopupContent: function (content) {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup = null;\r\n\t\t\tthis\r\n\t\t\t .off('click', this.togglePopup, this)\r\n\t\t\t .off('remove', this.closePopup, this)\r\n\t\t\t .off('move', this._movePopup, this);\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetPopup: function () {\r\n\t\treturn this._popup;\r\n\t},\r\n\r\n\t_movePopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.LayerGroup is a class to combine several layers into one so that\r\n * you can manipulate the group (e.g. add/remove it) as one layer.\r\n */\r\n\r\nL.LayerGroup = L.Class.extend({\r\n\tinitialize: function (layers) {\r\n\t\tthis._layers = {};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (layers) {\r\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\t\t\t\tthis.addLayer(layers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\tvar id = this.getLayerId(layer);\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.addLayer(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\r\n\r\n\t\tif (this._map && this._layers[id]) {\r\n\t\t\tthis._map.removeLayer(this._layers[id]);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasLayer: function (layer) {\r\n\t\tif (!layer) { return false; }\r\n\r\n\t\treturn (layer in this._layers || this.getLayerId(layer) in this._layers);\r\n\t},\r\n\r\n\tclearLayers: function () {\r\n\t\tthis.eachLayer(this.removeLayer, this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tinvoke: function (methodName) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\r\n\t\t i, layer;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tlayer = this._layers[i];\r\n\r\n\t\t\tif (layer[methodName]) {\r\n\t\t\t\tlayer[methodName].apply(layer, args);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\t\tthis.eachLayer(map.addLayer, map);\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis.eachLayer(map.removeLayer, map);\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetLayer: function (id) {\r\n\t\treturn this._layers[id];\r\n\t},\r\n\r\n\tgetLayers: function () {\r\n\t\tvar layers = [];\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tlayers.push(this._layers[i]);\r\n\t\t}\r\n\t\treturn layers;\r\n\t},\r\n\r\n\tsetZIndex: function (zIndex) {\r\n\t\treturn this.invoke('setZIndex', zIndex);\r\n\t},\r\n\r\n\tgetLayerId: function (layer) {\r\n\t\treturn L.stamp(layer);\r\n\t}\r\n});\r\n\r\nL.layerGroup = function (layers) {\r\n\treturn new L.LayerGroup(layers);\r\n};\r\n\n\n/*\r\n * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods\r\n * shared between a group of interactive layers (like vectors or markers).\r\n */\r\n\r\nL.FeatureGroup = L.LayerGroup.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\tstatics: {\r\n\t\tEVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose'\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\tif (this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ('on' in layer) {\r\n\t\t\tlayer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);\r\n\t\t}\r\n\r\n\t\tL.LayerGroup.prototype.addLayer.call(this, layer);\r\n\r\n\t\tif (this._popupContent && layer.bindPopup) {\r\n\t\t\tlayer.bindPopup(this._popupContent, this._popupOptions);\r\n\t\t}\r\n\r\n\t\treturn this.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tif (!this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif (layer in this._layers) {\r\n\t\t\tlayer = this._layers[layer];\r\n\t\t}\r\n\r\n\t\tlayer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this);\r\n\r\n\t\tL.LayerGroup.prototype.removeLayer.call(this, layer);\r\n\r\n\t\tif (this._popupContent) {\r\n\t\t\tthis.invoke('unbindPopup');\r\n\t\t}\r\n\r\n\t\treturn this.fire('layerremove', {layer: layer});\r\n\t},\r\n\r\n\tbindPopup: function (content, options) {\r\n\t\tthis._popupContent = content;\r\n\t\tthis._popupOptions = options;\r\n\t\treturn this.invoke('bindPopup', content, options);\r\n\t},\r\n\r\n\topenPopup: function (latlng) {\r\n\t\t// open popup on the first layer\r\n\t\tfor (var id in this._layers) {\r\n\t\t\tthis._layers[id].openPopup(latlng);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\treturn this.invoke('setStyle', style);\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\treturn this.invoke('bringToFront');\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\treturn this.invoke('bringToBack');\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar bounds = new L.LatLngBounds();\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tbounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());\r\n\t\t});\r\n\r\n\t\treturn bounds;\r\n\t},\r\n\r\n\t_propagateEvent: function (e) {\r\n\t\te = L.extend({\r\n\t\t\tlayer: e.target,\r\n\t\t\ttarget: this\r\n\t\t}, e);\r\n\t\tthis.fire(e.type, e);\r\n\t}\r\n});\r\n\r\nL.featureGroup = function (layers) {\r\n\treturn new L.FeatureGroup(layers);\r\n};\r\n\n\n/*\r\n * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc.\r\n */\r\n\r\nL.Path = L.Class.extend({\r\n\tincludes: [L.Mixin.Events],\r\n\r\n\tstatics: {\r\n\t\t// how much to extend the clip area around the map view\r\n\t\t// (relative to its size, e.g. 0.5 is half the screen in each direction)\r\n\t\t// set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is)\r\n\t\tCLIP_PADDING: (function () {\r\n\t\t\tvar max = L.Browser.mobile ? 1280 : 2000,\r\n\t\t\t target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2;\r\n\t\t\treturn Math.max(0, Math.min(0.5, target));\r\n\t\t})()\r\n\t},\r\n\r\n\toptions: {\r\n\t\tstroke: true,\r\n\t\tcolor: '#0033ff',\r\n\t\tdashArray: null,\r\n\t\tlineCap: null,\r\n\t\tlineJoin: null,\r\n\t\tweight: 5,\r\n\t\topacity: 0.5,\r\n\r\n\t\tfill: false,\r\n\t\tfillColor: null, //same as color by default\r\n\t\tfillOpacity: 0.2,\r\n\r\n\t\tclickable: true\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initElements();\r\n\t\t\tthis._initEvents();\r\n\t\t}\r\n\r\n\t\tthis.projectLatlngs();\r\n\t\tthis._updatePath();\r\n\r\n\t\tif (this._container) {\r\n\t\t\tthis._map._pathRoot.appendChild(this._container);\r\n\t\t}\r\n\r\n\t\tthis.fire('add');\r\n\r\n\t\tmap.on({\r\n\t\t\t'viewreset': this.projectLatlngs,\r\n\t\t\t'moveend': this._updatePath\r\n\t\t}, this);\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap._pathRoot.removeChild(this._container);\r\n\r\n\t\t// Need to fire remove event before we set _map to null as the event hooks might need the object\r\n\t\tthis.fire('remove');\r\n\t\tthis._map = null;\r\n\r\n\t\tif (L.Browser.vml) {\r\n\t\t\tthis._container = null;\r\n\t\t\tthis._stroke = null;\r\n\t\t\tthis._fill = null;\r\n\t\t}\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this.projectLatlngs,\r\n\t\t\t'moveend': this._updatePath\r\n\t\t}, this);\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\t// do all projection stuff here\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tL.setOptions(this, style);\r\n\r\n\t\tif (this._container) {\r\n\t\t\tthis._updateStyle();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis.projectLatlngs();\r\n\t\t\tthis._updatePath();\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nL.Map.include({\r\n\t_updatePathViewport: function () {\r\n\t\tvar p = L.Path.CLIP_PADDING,\r\n\t\t size = this.getSize(),\r\n\t\t panePos = L.DomUtil.getPosition(this._mapPane),\r\n\t\t min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()),\r\n\t\t max = min.add(size.multiplyBy(1 + p * 2)._round());\r\n\r\n\t\tthis._pathViewport = new L.Bounds(min, max);\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Path with SVG-specific rendering code.\r\n */\r\n\r\nL.Path.SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\nL.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect);\r\n\r\nL.Path = L.Path.extend({\r\n\tstatics: {\r\n\t\tSVG: L.Browser.svg\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\tvar root = this._map._pathRoot,\r\n\t\t path = this._container;\r\n\r\n\t\tif (path && root.lastChild !== path) {\r\n\t\t\troot.appendChild(path);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar root = this._map._pathRoot,\r\n\t\t path = this._container,\r\n\t\t first = root.firstChild;\r\n\r\n\t\tif (path && first !== path) {\r\n\t\t\troot.insertBefore(path, first);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\t// form path string here\r\n\t},\r\n\r\n\t_createElement: function (name) {\r\n\t\treturn document.createElementNS(L.Path.SVG_NS, name);\r\n\t},\r\n\r\n\t_initElements: function () {\r\n\t\tthis._map._initPathRoot();\r\n\t\tthis._initPath();\r\n\t\tthis._initStyle();\r\n\t},\r\n\r\n\t_initPath: function () {\r\n\t\tthis._container = this._createElement('g');\r\n\r\n\t\tthis._path = this._createElement('path');\r\n\r\n\t\tif (this.options.className) {\r\n\t\t\tL.DomUtil.addClass(this._path, this.options.className);\r\n\t\t}\r\n\r\n\t\tthis._container.appendChild(this._path);\r\n\t},\r\n\r\n\t_initStyle: function () {\r\n\t\tif (this.options.stroke) {\r\n\t\t\tthis._path.setAttribute('stroke-linejoin', 'round');\r\n\t\t\tthis._path.setAttribute('stroke-linecap', 'round');\r\n\t\t}\r\n\t\tif (this.options.fill) {\r\n\t\t\tthis._path.setAttribute('fill-rule', 'evenodd');\r\n\t\t}\r\n\t\tif (this.options.pointerEvents) {\r\n\t\t\tthis._path.setAttribute('pointer-events', this.options.pointerEvents);\r\n\t\t}\r\n\t\tif (!this.options.clickable && !this.options.pointerEvents) {\r\n\t\t\tthis._path.setAttribute('pointer-events', 'none');\r\n\t\t}\r\n\t\tthis._updateStyle();\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tif (this.options.stroke) {\r\n\t\t\tthis._path.setAttribute('stroke', this.options.color);\r\n\t\t\tthis._path.setAttribute('stroke-opacity', this.options.opacity);\r\n\t\t\tthis._path.setAttribute('stroke-width', this.options.weight);\r\n\t\t\tif (this.options.dashArray) {\r\n\t\t\t\tthis._path.setAttribute('stroke-dasharray', this.options.dashArray);\r\n\t\t\t} else {\r\n\t\t\t\tthis._path.removeAttribute('stroke-dasharray');\r\n\t\t\t}\r\n\t\t\tif (this.options.lineCap) {\r\n\t\t\t\tthis._path.setAttribute('stroke-linecap', this.options.lineCap);\r\n\t\t\t}\r\n\t\t\tif (this.options.lineJoin) {\r\n\t\t\t\tthis._path.setAttribute('stroke-linejoin', this.options.lineJoin);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis._path.setAttribute('stroke', 'none');\r\n\t\t}\r\n\t\tif (this.options.fill) {\r\n\t\t\tthis._path.setAttribute('fill', this.options.fillColor || this.options.color);\r\n\t\t\tthis._path.setAttribute('fill-opacity', this.options.fillOpacity);\r\n\t\t} else {\r\n\t\t\tthis._path.setAttribute('fill', 'none');\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tvar str = this.getPathString();\r\n\t\tif (!str) {\r\n\t\t\t// fix webkit empty string parsing bug\r\n\t\t\tstr = 'M0 0';\r\n\t\t}\r\n\t\tthis._path.setAttribute('d', str);\r\n\t},\r\n\r\n\t// TODO remove duplication with L.Map\r\n\t_initEvents: function () {\r\n\t\tif (this.options.clickable) {\r\n\t\t\tif (L.Browser.svg || !L.Browser.vml) {\r\n\t\t\t\tL.DomUtil.addClass(this._path, 'leaflet-clickable');\r\n\t\t\t}\r\n\r\n\t\t\tL.DomEvent.on(this._container, 'click', this._onMouseClick, this);\r\n\r\n\t\t\tvar events = ['dblclick', 'mousedown', 'mouseover',\r\n\t\t\t 'mouseout', 'mousemove', 'contextmenu'];\r\n\t\t\tfor (var i = 0; i < events.length; i++) {\r\n\t\t\t\tL.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tif (this._map.dragging && this._map.dragging.moved()) { return; }\r\n\r\n\t\tthis._fireMouseEvent(e);\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (!this.hasEventListeners(e.type)) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t containerPoint = map.mouseEventToContainerPoint(e),\r\n\t\t layerPoint = map.containerPointToLayerPoint(containerPoint),\r\n\t\t latlng = map.layerPointToLatLng(layerPoint);\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tlayerPoint: layerPoint,\r\n\t\t\tcontainerPoint: containerPoint,\r\n\t\t\toriginalEvent: e\r\n\t\t});\r\n\r\n\t\tif (e.type === 'contextmenu') {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t\tif (e.type !== 'mousemove') {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.include({\r\n\t_initPathRoot: function () {\r\n\t\tif (!this._pathRoot) {\r\n\t\t\tthis._pathRoot = L.Path.prototype._createElement('svg');\r\n\t\t\tthis._panes.overlayPane.appendChild(this._pathRoot);\r\n\r\n\t\t\tif (this.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated');\r\n\r\n\t\t\t\tthis.on({\r\n\t\t\t\t\t'zoomanim': this._animatePathZoom,\r\n\t\t\t\t\t'zoomend': this._endPathZoom\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide');\r\n\t\t\t}\r\n\r\n\t\t\tthis.on('moveend', this._updateSvgViewport);\r\n\t\t\tthis._updateSvgViewport();\r\n\t\t}\r\n\t},\r\n\r\n\t_animatePathZoom: function (e) {\r\n\t\tvar scale = this.getZoomScale(e.zoom),\r\n\t\t offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min);\r\n\r\n\t\tthis._pathRoot.style[L.DomUtil.TRANSFORM] =\r\n\t\t L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') ';\r\n\r\n\t\tthis._pathZooming = true;\r\n\t},\r\n\r\n\t_endPathZoom: function () {\r\n\t\tthis._pathZooming = false;\r\n\t},\r\n\r\n\t_updateSvgViewport: function () {\r\n\r\n\t\tif (this._pathZooming) {\r\n\t\t\t// Do not update SVGs while a zoom animation is going on otherwise the animation will break.\r\n\t\t\t// When the zoom animation ends we will be updated again anyway\r\n\t\t\t// This fixes the case where you do a momentum move and zoom while the move is still ongoing.\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._updatePathViewport();\r\n\r\n\t\tvar vp = this._pathViewport,\r\n\t\t min = vp.min,\r\n\t\t max = vp.max,\r\n\t\t width = max.x - min.x,\r\n\t\t height = max.y - min.y,\r\n\t\t root = this._pathRoot,\r\n\t\t pane = this._panes.overlayPane;\r\n\r\n\t\t// Hack to make flicker on drag end on mobile webkit less irritating\r\n\t\tif (L.Browser.mobileWebkit) {\r\n\t\t\tpane.removeChild(root);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.setPosition(root, min);\r\n\t\troot.setAttribute('width', width);\r\n\t\troot.setAttribute('height', height);\r\n\t\troot.setAttribute('viewBox', [min.x, min.y, width, height].join(' '));\r\n\r\n\t\tif (L.Browser.mobileWebkit) {\r\n\t\t\tpane.appendChild(root);\r\n\t\t}\r\n\t}\r\n});\r\n\n\n/*\r\n * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods.\r\n */\r\n\r\nL.Path.include({\r\n\r\n\tbindPopup: function (content, options) {\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tthis._popup = content;\r\n\t\t} else {\r\n\t\t\tif (!this._popup || options) {\r\n\t\t\t\tthis._popup = new L.Popup(options, this);\r\n\t\t\t}\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis\r\n\t\t\t .on('click', this._openPopup, this)\r\n\t\t\t .on('remove', this.closePopup, this);\r\n\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup = null;\r\n\t\t\tthis\r\n\t\t\t .off('click', this._openPopup)\r\n\t\t\t .off('remove', this.closePopup);\r\n\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\topenPopup: function (latlng) {\r\n\r\n\t\tif (this._popup) {\r\n\t\t\t// open the popup from one of the path's points if not specified\r\n\t\t\tlatlng = latlng || this._latlng ||\r\n\t\t\t this._latlngs[Math.floor(this._latlngs.length / 2)];\r\n\r\n\t\t\tthis._openPopup({latlng: latlng});\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_openPopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t\tthis._map.openPopup(this._popup);\r\n\t}\r\n});\r\n\n\n/*\r\n * Vector rendering for IE6-8 through VML.\r\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\r\n */\r\n\r\nL.Browser.vml = !L.Browser.svg && (function () {\r\n\ttry {\r\n\t\tvar div = document.createElement('div');\r\n\t\tdiv.innerHTML = '<v:shape adj=\"1\"/>';\r\n\r\n\t\tvar shape = div.firstChild;\r\n\t\tshape.style.behavior = 'url(#default#VML)';\r\n\r\n\t\treturn shape && (typeof shape.adj === 'object');\r\n\r\n\t} catch (e) {\r\n\t\treturn false;\r\n\t}\r\n}());\r\n\r\nL.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({\r\n\tstatics: {\r\n\t\tVML: true,\r\n\t\tCLIP_PADDING: 0.02\r\n\t},\r\n\r\n\t_createElement: (function () {\r\n\t\ttry {\r\n\t\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\r\n\t\t\treturn function (name) {\r\n\t\t\t\treturn document.createElement('<lvml:' + name + ' class=\"lvml\">');\r\n\t\t\t};\r\n\t\t} catch (e) {\r\n\t\t\treturn function (name) {\r\n\t\t\t\treturn document.createElement(\r\n\t\t\t\t '<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\r\n\t\t\t};\r\n\t\t}\r\n\t}()),\r\n\r\n\t_initPath: function () {\r\n\t\tvar container = this._container = this._createElement('shape');\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-vml-shape' +\r\n\t\t\t(this.options.className ? ' ' + this.options.className : ''));\r\n\r\n\t\tif (this.options.clickable) {\r\n\t\t\tL.DomUtil.addClass(container, 'leaflet-clickable');\r\n\t\t}\r\n\r\n\t\tcontainer.coordsize = '1 1';\r\n\r\n\t\tthis._path = this._createElement('path');\r\n\t\tcontainer.appendChild(this._path);\r\n\r\n\t\tthis._map._pathRoot.appendChild(container);\r\n\t},\r\n\r\n\t_initStyle: function () {\r\n\t\tthis._updateStyle();\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tvar stroke = this._stroke,\r\n\t\t fill = this._fill,\r\n\t\t options = this.options,\r\n\t\t container = this._container;\r\n\r\n\t\tcontainer.stroked = options.stroke;\r\n\t\tcontainer.filled = options.fill;\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tif (!stroke) {\r\n\t\t\t\tstroke = this._stroke = this._createElement('stroke');\r\n\t\t\t\tstroke.endcap = 'round';\r\n\t\t\t\tcontainer.appendChild(stroke);\r\n\t\t\t}\r\n\t\t\tstroke.weight = options.weight + 'px';\r\n\t\t\tstroke.color = options.color;\r\n\t\t\tstroke.opacity = options.opacity;\r\n\r\n\t\t\tif (options.dashArray) {\r\n\t\t\t\tstroke.dashStyle = L.Util.isArray(options.dashArray) ?\r\n\t\t\t\t options.dashArray.join(' ') :\r\n\t\t\t\t options.dashArray.replace(/( *, *)/g, ' ');\r\n\t\t\t} else {\r\n\t\t\t\tstroke.dashStyle = '';\r\n\t\t\t}\r\n\t\t\tif (options.lineCap) {\r\n\t\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\r\n\t\t\t}\r\n\t\t\tif (options.lineJoin) {\r\n\t\t\t\tstroke.joinstyle = options.lineJoin;\r\n\t\t\t}\r\n\r\n\t\t} else if (stroke) {\r\n\t\t\tcontainer.removeChild(stroke);\r\n\t\t\tthis._stroke = null;\r\n\t\t}\r\n\r\n\t\tif (options.fill) {\r\n\t\t\tif (!fill) {\r\n\t\t\t\tfill = this._fill = this._createElement('fill');\r\n\t\t\t\tcontainer.appendChild(fill);\r\n\t\t\t}\r\n\t\t\tfill.color = options.fillColor || options.color;\r\n\t\t\tfill.opacity = options.fillOpacity;\r\n\r\n\t\t} else if (fill) {\r\n\t\t\tcontainer.removeChild(fill);\r\n\t\t\tthis._fill = null;\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tvar style = this._container.style;\r\n\r\n\t\tstyle.display = 'none';\r\n\t\tthis._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug\r\n\t\tstyle.display = '';\r\n\t}\r\n});\r\n\r\nL.Map.include(L.Browser.svg || !L.Browser.vml ? {} : {\r\n\t_initPathRoot: function () {\r\n\t\tif (this._pathRoot) { return; }\r\n\r\n\t\tvar root = this._pathRoot = document.createElement('div');\r\n\t\troot.className = 'leaflet-vml-container';\r\n\t\tthis._panes.overlayPane.appendChild(root);\r\n\r\n\t\tthis.on('moveend', this._updatePathViewport);\r\n\t\tthis._updatePathViewport();\r\n\t}\r\n});\r\n\n\n/*\r\n * Vector rendering for all browsers that support canvas.\r\n */\r\n\r\nL.Browser.canvas = (function () {\r\n\treturn !!document.createElement('canvas').getContext;\r\n}());\r\n\r\nL.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({\r\n\tstatics: {\r\n\t\t//CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value\r\n\t\tCANVAS: true,\r\n\t\tSVG: false\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis.projectLatlngs();\r\n\t\t\tthis._requestUpdate();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tL.setOptions(this, style);\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateStyle();\r\n\t\t\tthis._requestUpdate();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t .off('viewreset', this.projectLatlngs, this)\r\n\t\t .off('moveend', this._updatePath, this);\r\n\r\n\t\tif (this.options.clickable) {\r\n\t\t\tthis._map.off('click', this._onClick, this);\r\n\t\t\tthis._map.off('mousemove', this._onMouseMove, this);\r\n\t\t}\r\n\r\n\t\tthis._requestUpdate();\r\n\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\t_requestUpdate: function () {\r\n\t\tif (this._map && !L.Path._updateRequest) {\r\n\t\t\tL.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMapMoveEnd: function () {\r\n\t\tL.Path._updateRequest = null;\r\n\t\tthis.fire('moveend');\r\n\t},\r\n\r\n\t_initElements: function () {\r\n\t\tthis._map._initPathRoot();\r\n\t\tthis._ctx = this._map._canvasCtx;\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tthis._ctx.lineWidth = options.weight;\r\n\t\t\tthis._ctx.strokeStyle = options.color;\r\n\t\t}\r\n\t\tif (options.fill) {\r\n\t\t\tthis._ctx.fillStyle = options.fillColor || options.color;\r\n\t\t}\r\n\t},\r\n\r\n\t_drawPath: function () {\r\n\t\tvar i, j, len, len2, point, drawMethod;\r\n\r\n\t\tthis._ctx.beginPath();\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tfor (j = 0, len2 = this._parts[i].length; j < len2; j++) {\r\n\t\t\t\tpoint = this._parts[i][j];\r\n\t\t\t\tdrawMethod = (j === 0 ? 'move' : 'line') + 'To';\r\n\r\n\t\t\t\tthis._ctx[drawMethod](point.x, point.y);\r\n\t\t\t}\r\n\t\t\t// TODO refactor ugly hack\r\n\t\t\tif (this instanceof L.Polygon) {\r\n\t\t\t\tthis._ctx.closePath();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_checkIfEmpty: function () {\r\n\t\treturn !this._parts.length;\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tif (this._checkIfEmpty()) { return; }\r\n\r\n\t\tvar ctx = this._ctx,\r\n\t\t options = this.options;\r\n\r\n\t\tthis._drawPath();\r\n\t\tctx.save();\r\n\t\tthis._updateStyle();\r\n\r\n\t\tif (options.fill) {\r\n\t\t\tctx.globalAlpha = options.fillOpacity;\r\n\t\t\tctx.fill();\r\n\t\t}\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tctx.globalAlpha = options.opacity;\r\n\t\t\tctx.stroke();\r\n\t\t}\r\n\r\n\t\tctx.restore();\r\n\r\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\r\n\t},\r\n\r\n\t_initEvents: function () {\r\n\t\tif (this.options.clickable) {\r\n\t\t\t// TODO dblclick\r\n\t\t\tthis._map.on('mousemove', this._onMouseMove, this);\r\n\t\t\tthis._map.on('click', this._onClick, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_onClick: function (e) {\r\n\t\tif (this._containsPoint(e.layerPoint)) {\r\n\t\t\tthis.fire('click', e);\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseMove: function (e) {\r\n\t\tif (!this._map || this._map._animatingZoom) { return; }\r\n\r\n\t\t// TODO don't do on each move\r\n\t\tif (this._containsPoint(e.layerPoint)) {\r\n\t\t\tthis._ctx.canvas.style.cursor = 'pointer';\r\n\t\t\tthis._mouseInside = true;\r\n\t\t\tthis.fire('mouseover', e);\r\n\r\n\t\t} else if (this._mouseInside) {\r\n\t\t\tthis._ctx.canvas.style.cursor = '';\r\n\t\t\tthis._mouseInside = false;\r\n\t\t\tthis.fire('mouseout', e);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {\r\n\t_initPathRoot: function () {\r\n\t\tvar root = this._pathRoot,\r\n\t\t ctx;\r\n\r\n\t\tif (!root) {\r\n\t\t\troot = this._pathRoot = document.createElement('canvas');\r\n\t\t\troot.style.position = 'absolute';\r\n\t\t\tctx = this._canvasCtx = root.getContext('2d');\r\n\r\n\t\t\tctx.lineCap = 'round';\r\n\t\t\tctx.lineJoin = 'round';\r\n\r\n\t\t\tthis._panes.overlayPane.appendChild(root);\r\n\r\n\t\t\tif (this.options.zoomAnimation) {\r\n\t\t\t\tthis._pathRoot.className = 'leaflet-zoom-animated';\r\n\t\t\t\tthis.on('zoomanim', this._animatePathZoom);\r\n\t\t\t\tthis.on('zoomend', this._endPathZoom);\r\n\t\t\t}\r\n\t\t\tthis.on('moveend', this._updateCanvasViewport);\r\n\t\t\tthis._updateCanvasViewport();\r\n\t\t}\r\n\t},\r\n\r\n\t_updateCanvasViewport: function () {\r\n\t\t// don't redraw while zooming. See _updateSvgViewport for more details\r\n\t\tif (this._pathZooming) { return; }\r\n\t\tthis._updatePathViewport();\r\n\r\n\t\tvar vp = this._pathViewport,\r\n\t\t min = vp.min,\r\n\t\t size = vp.max.subtract(min),\r\n\t\t root = this._pathRoot;\r\n\r\n\t\t//TODO check if this works properly on mobile webkit\r\n\t\tL.DomUtil.setPosition(root, min);\r\n\t\troot.width = size.x;\r\n\t\troot.height = size.y;\r\n\t\troot.getContext('2d').translate(-min.x, -min.y);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.LineUtil contains different utility functions for line segments\r\n * and polylines (clipping, simplification, distances, etc.)\r\n */\r\n\r\n/*jshint bitwise:false */ // allow bitwise operations for this file\r\n\r\nL.LineUtil = {\r\n\r\n\t// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\r\n\t// Improves rendering performance dramatically by lessening the number of points to draw.\r\n\r\n\tsimplify: function (/*Point[]*/ points, /*Number*/ tolerance) {\r\n\t\tif (!tolerance || !points.length) {\r\n\t\t\treturn points.slice();\r\n\t\t}\r\n\r\n\t\tvar sqTolerance = tolerance * tolerance;\r\n\r\n\t\t// stage 1: vertex reduction\r\n\t\tpoints = this._reducePoints(points, sqTolerance);\r\n\r\n\t\t// stage 2: Douglas-Peucker simplification\r\n\t\tpoints = this._simplifyDP(points, sqTolerance);\r\n\r\n\t\treturn points;\r\n\t},\r\n\r\n\t// distance from a point to a segment between two points\r\n\tpointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\r\n\t\treturn Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));\r\n\t},\r\n\r\n\tclosestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\r\n\t\treturn this._sqClosestPointOnSegment(p, p1, p2);\r\n\t},\r\n\r\n\t// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm\r\n\t_simplifyDP: function (points, sqTolerance) {\r\n\r\n\t\tvar len = points.length,\r\n\t\t ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\r\n\t\t markers = new ArrayConstructor(len);\r\n\r\n\t\tmarkers[0] = markers[len - 1] = 1;\r\n\r\n\t\tthis._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\r\n\r\n\t\tvar i,\r\n\t\t newPoints = [];\r\n\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tif (markers[i]) {\r\n\t\t\t\tnewPoints.push(points[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn newPoints;\r\n\t},\r\n\r\n\t_simplifyDPStep: function (points, markers, sqTolerance, first, last) {\r\n\r\n\t\tvar maxSqDist = 0,\r\n\t\t index, i, sqDist;\r\n\r\n\t\tfor (i = first + 1; i <= last - 1; i++) {\r\n\t\t\tsqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);\r\n\r\n\t\t\tif (sqDist > maxSqDist) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tmaxSqDist = sqDist;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (maxSqDist > sqTolerance) {\r\n\t\t\tmarkers[index] = 1;\r\n\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, first, index);\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, index, last);\r\n\t\t}\r\n\t},\r\n\r\n\t// reduce points that are too close to each other to a single point\r\n\t_reducePoints: function (points, sqTolerance) {\r\n\t\tvar reducedPoints = [points[0]];\r\n\r\n\t\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\r\n\t\t\tif (this._sqDist(points[i], points[prev]) > sqTolerance) {\r\n\t\t\t\treducedPoints.push(points[i]);\r\n\t\t\t\tprev = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (prev < len - 1) {\r\n\t\t\treducedPoints.push(points[len - 1]);\r\n\t\t}\r\n\t\treturn reducedPoints;\r\n\t},\r\n\r\n\t// Cohen-Sutherland line clipping algorithm.\r\n\t// Used to avoid rendering parts of a polyline that are not currently visible.\r\n\r\n\tclipSegment: function (a, b, bounds, useLastCode) {\r\n\t\tvar codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),\r\n\t\t codeB = this._getBitCode(b, bounds),\r\n\r\n\t\t codeOut, p, newCode;\r\n\r\n\t\t// save 2nd code to avoid calculating it on the next segment\r\n\t\tthis._lastCode = codeB;\r\n\r\n\t\twhile (true) {\r\n\t\t\t// if a,b is inside the clip window (trivial accept)\r\n\t\t\tif (!(codeA | codeB)) {\r\n\t\t\t\treturn [a, b];\r\n\t\t\t// if a,b is outside the clip window (trivial reject)\r\n\t\t\t} else if (codeA & codeB) {\r\n\t\t\t\treturn false;\r\n\t\t\t// other cases\r\n\t\t\t} else {\r\n\t\t\t\tcodeOut = codeA || codeB;\r\n\t\t\t\tp = this._getEdgeIntersection(a, b, codeOut, bounds);\r\n\t\t\t\tnewCode = this._getBitCode(p, bounds);\r\n\r\n\t\t\t\tif (codeOut === codeA) {\r\n\t\t\t\t\ta = p;\r\n\t\t\t\t\tcodeA = newCode;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tb = p;\r\n\t\t\t\t\tcodeB = newCode;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_getEdgeIntersection: function (a, b, code, bounds) {\r\n\t\tvar dx = b.x - a.x,\r\n\t\t dy = b.y - a.y,\r\n\t\t min = bounds.min,\r\n\t\t max = bounds.max;\r\n\r\n\t\tif (code & 8) { // top\r\n\t\t\treturn new L.Point(a.x + dx * (max.y - a.y) / dy, max.y);\r\n\t\t} else if (code & 4) { // bottom\r\n\t\t\treturn new L.Point(a.x + dx * (min.y - a.y) / dy, min.y);\r\n\t\t} else if (code & 2) { // right\r\n\t\t\treturn new L.Point(max.x, a.y + dy * (max.x - a.x) / dx);\r\n\t\t} else if (code & 1) { // left\r\n\t\t\treturn new L.Point(min.x, a.y + dy * (min.x - a.x) / dx);\r\n\t\t}\r\n\t},\r\n\r\n\t_getBitCode: function (/*Point*/ p, bounds) {\r\n\t\tvar code = 0;\r\n\r\n\t\tif (p.x < bounds.min.x) { // left\r\n\t\t\tcode |= 1;\r\n\t\t} else if (p.x > bounds.max.x) { // right\r\n\t\t\tcode |= 2;\r\n\t\t}\r\n\t\tif (p.y < bounds.min.y) { // bottom\r\n\t\t\tcode |= 4;\r\n\t\t} else if (p.y > bounds.max.y) { // top\r\n\t\t\tcode |= 8;\r\n\t\t}\r\n\r\n\t\treturn code;\r\n\t},\r\n\r\n\t// square distance (to avoid unnecessary Math.sqrt calls)\r\n\t_sqDist: function (p1, p2) {\r\n\t\tvar dx = p2.x - p1.x,\r\n\t\t dy = p2.y - p1.y;\r\n\t\treturn dx * dx + dy * dy;\r\n\t},\r\n\r\n\t// return closest point on segment or distance to that point\r\n\t_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {\r\n\t\tvar x = p1.x,\r\n\t\t y = p1.y,\r\n\t\t dx = p2.x - x,\r\n\t\t dy = p2.y - y,\r\n\t\t dot = dx * dx + dy * dy,\r\n\t\t t;\r\n\r\n\t\tif (dot > 0) {\r\n\t\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\r\n\r\n\t\t\tif (t > 1) {\r\n\t\t\t\tx = p2.x;\r\n\t\t\t\ty = p2.y;\r\n\t\t\t} else if (t > 0) {\r\n\t\t\t\tx += dx * t;\r\n\t\t\t\ty += dy * t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdx = p.x - x;\r\n\t\tdy = p.y - y;\r\n\r\n\t\treturn sqDist ? dx * dx + dy * dy : new L.Point(x, y);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.Polyline is used to display polylines on a map.\r\n */\r\n\r\nL.Polyline = L.Path.extend({\r\n\tinitialize: function (latlngs, options) {\r\n\t\tL.Path.prototype.initialize.call(this, options);\r\n\r\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\r\n\t},\r\n\r\n\toptions: {\r\n\t\t// how much to simplify the polyline on each zoom level\r\n\t\t// more = better performance and smoother look, less = more accurate\r\n\t\tsmoothFactor: 1.0,\r\n\t\tnoClip: false\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tthis._originalPoints = [];\r\n\r\n\t\tfor (var i = 0, len = this._latlngs.length; i < len; i++) {\r\n\t\t\tthis._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]);\r\n\t\t}\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\tfor (var i = 0, len = this._parts.length, str = ''; i < len; i++) {\r\n\t\t\tstr += this._getPathPartStr(this._parts[i]);\r\n\t\t}\r\n\t\treturn str;\r\n\t},\r\n\r\n\tgetLatLngs: function () {\r\n\t\treturn this._latlngs;\r\n\t},\r\n\r\n\tsetLatLngs: function (latlngs) {\r\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\taddLatLng: function (latlng) {\r\n\t\tthis._latlngs.push(L.latLng(latlng));\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tspliceLatLngs: function () { // (Number index, Number howMany)\r\n\t\tvar removed = [].splice.apply(this._latlngs, arguments);\r\n\t\tthis._convertLatLngs(this._latlngs, true);\r\n\t\tthis.redraw();\r\n\t\treturn removed;\r\n\t},\r\n\r\n\tclosestLayerPoint: function (p) {\r\n\t\tvar minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null;\r\n\r\n\t\tfor (var j = 0, jLen = parts.length; j < jLen; j++) {\r\n\t\t\tvar points = parts[j];\r\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\r\n\t\t\t\tp1 = points[i - 1];\r\n\t\t\t\tp2 = points[i];\r\n\t\t\t\tvar sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true);\r\n\t\t\t\tif (sqDist < minDistance) {\r\n\t\t\t\t\tminDistance = sqDist;\r\n\t\t\t\t\tminPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (minPoint) {\r\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\r\n\t\t}\r\n\t\treturn minPoint;\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\treturn new L.LatLngBounds(this.getLatLngs());\r\n\t},\r\n\r\n\t_convertLatLngs: function (latlngs, overwrite) {\r\n\t\tvar i, len, target = overwrite ? latlngs : [];\r\n\r\n\t\tfor (i = 0, len = latlngs.length; i < len; i++) {\r\n\t\t\tif (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttarget[i] = L.latLng(latlngs[i]);\r\n\t\t}\r\n\t\treturn target;\r\n\t},\r\n\r\n\t_initEvents: function () {\r\n\t\tL.Path.prototype._initEvents.call(this);\r\n\t},\r\n\r\n\t_getPathPartStr: function (points) {\r\n\t\tvar round = L.Path.VML;\r\n\r\n\t\tfor (var j = 0, len2 = points.length, str = '', p; j < len2; j++) {\r\n\t\t\tp = points[j];\r\n\t\t\tif (round) {\r\n\t\t\t\tp._round();\r\n\t\t\t}\r\n\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\r\n\t\t}\r\n\t\treturn str;\r\n\t},\r\n\r\n\t_clipPoints: function () {\r\n\t\tvar points = this._originalPoints,\r\n\t\t len = points.length,\r\n\t\t i, k, segment;\r\n\r\n\t\tif (this.options.noClip) {\r\n\t\t\tthis._parts = [points];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._parts = [];\r\n\r\n\t\tvar parts = this._parts,\r\n\t\t vp = this._map._pathViewport,\r\n\t\t lu = L.LineUtil;\r\n\r\n\t\tfor (i = 0, k = 0; i < len - 1; i++) {\r\n\t\t\tsegment = lu.clipSegment(points[i], points[i + 1], vp, i);\r\n\t\t\tif (!segment) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tparts[k] = parts[k] || [];\r\n\t\t\tparts[k].push(segment[0]);\r\n\r\n\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\r\n\t\t\tif ((segment[1] !== points[i + 1]) || (i === len - 2)) {\r\n\t\t\t\tparts[k].push(segment[1]);\r\n\t\t\t\tk++;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// simplify each clipped part of the polyline\r\n\t_simplifyPoints: function () {\r\n\t\tvar parts = this._parts,\r\n\t\t lu = L.LineUtil;\r\n\r\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\r\n\t\t\tparts[i] = lu.simplify(parts[i], this.options.smoothFactor);\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._clipPoints();\r\n\t\tthis._simplifyPoints();\r\n\r\n\t\tL.Path.prototype._updatePath.call(this);\r\n\t}\r\n});\r\n\r\nL.polyline = function (latlngs, options) {\r\n\treturn new L.Polyline(latlngs, options);\r\n};\r\n\n\n/*\r\n * L.PolyUtil contains utility functions for polygons (clipping, etc.).\r\n */\r\n\r\n/*jshint bitwise:false */ // allow bitwise operations here\r\n\r\nL.PolyUtil = {};\r\n\r\n/*\r\n * Sutherland-Hodgeman polygon clipping algorithm.\r\n * Used to avoid rendering parts of a polygon that are not currently visible.\r\n */\r\nL.PolyUtil.clipPolygon = function (points, bounds) {\r\n\tvar clippedPoints,\r\n\t edges = [1, 4, 2, 8],\r\n\t i, j, k,\r\n\t a, b,\r\n\t len, edge, p,\r\n\t lu = L.LineUtil;\r\n\r\n\tfor (i = 0, len = points.length; i < len; i++) {\r\n\t\tpoints[i]._code = lu._getBitCode(points[i], bounds);\r\n\t}\r\n\r\n\t// for each edge (left, bottom, right, top)\r\n\tfor (k = 0; k < 4; k++) {\r\n\t\tedge = edges[k];\r\n\t\tclippedPoints = [];\r\n\r\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\r\n\t\t\ta = points[i];\r\n\t\t\tb = points[j];\r\n\r\n\t\t\t// if a is inside the clip window\r\n\t\t\tif (!(a._code & edge)) {\r\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\r\n\t\t\t\tif (b._code & edge) {\r\n\t\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\r\n\t\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\t\tclippedPoints.push(p);\r\n\t\t\t\t}\r\n\t\t\t\tclippedPoints.push(a);\r\n\r\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\r\n\t\t\t} else if (!(b._code & edge)) {\r\n\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\r\n\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\tclippedPoints.push(p);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpoints = clippedPoints;\r\n\t}\r\n\r\n\treturn points;\r\n};\r\n\n\n/*\r\n * L.Polygon is used to display polygons on a map.\r\n */\r\n\r\nL.Polygon = L.Polyline.extend({\r\n\toptions: {\r\n\t\tfill: true\r\n\t},\r\n\r\n\tinitialize: function (latlngs, options) {\r\n\t\tL.Polyline.prototype.initialize.call(this, latlngs, options);\r\n\t\tthis._initWithHoles(latlngs);\r\n\t},\r\n\r\n\t_initWithHoles: function (latlngs) {\r\n\t\tvar i, len, hole;\r\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\r\n\t\t\tthis._latlngs = this._convertLatLngs(latlngs[0]);\r\n\t\t\tthis._holes = latlngs.slice(1);\r\n\r\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\t\thole = this._holes[i] = this._convertLatLngs(this._holes[i]);\r\n\t\t\t\tif (hole[0].equals(hole[hole.length - 1])) {\r\n\t\t\t\t\thole.pop();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// filter out last point if its equal to the first one\r\n\t\tlatlngs = this._latlngs;\r\n\r\n\t\tif (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) {\r\n\t\t\tlatlngs.pop();\r\n\t\t}\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tL.Polyline.prototype.projectLatlngs.call(this);\r\n\r\n\t\t// project polygon holes points\r\n\t\t// TODO move this logic to Polyline to get rid of duplication\r\n\t\tthis._holePoints = [];\r\n\r\n\t\tif (!this._holes) { return; }\r\n\r\n\t\tvar i, j, len, len2;\r\n\r\n\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\tthis._holePoints[i] = [];\r\n\r\n\t\t\tfor (j = 0, len2 = this._holes[i].length; j < len2; j++) {\r\n\t\t\t\tthis._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tsetLatLngs: function (latlngs) {\r\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\r\n\t\t\tthis._initWithHoles(latlngs);\r\n\t\t\treturn this.redraw();\r\n\t\t} else {\r\n\t\t\treturn L.Polyline.prototype.setLatLngs.call(this, latlngs);\r\n\t\t}\r\n\t},\r\n\r\n\t_clipPoints: function () {\r\n\t\tvar points = this._originalPoints,\r\n\t\t newParts = [];\r\n\r\n\t\tthis._parts = [points].concat(this._holePoints);\r\n\r\n\t\tif (this.options.noClip) { return; }\r\n\r\n\t\tfor (var i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tvar clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport);\r\n\t\t\tif (clipped.length) {\r\n\t\t\t\tnewParts.push(clipped);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._parts = newParts;\r\n\t},\r\n\r\n\t_getPathPartStr: function (points) {\r\n\t\tvar str = L.Polyline.prototype._getPathPartStr.call(this, points);\r\n\t\treturn str + (L.Browser.svg ? 'z' : 'x');\r\n\t}\r\n});\r\n\r\nL.polygon = function (latlngs, options) {\r\n\treturn new L.Polygon(latlngs, options);\r\n};\r\n\n\n/*\r\n * Contains L.MultiPolyline and L.MultiPolygon layers.\r\n */\r\n\r\n(function () {\r\n\tfunction createMulti(Klass) {\r\n\r\n\t\treturn L.FeatureGroup.extend({\r\n\r\n\t\t\tinitialize: function (latlngs, options) {\r\n\t\t\t\tthis._layers = {};\r\n\t\t\t\tthis._options = options;\r\n\t\t\t\tthis.setLatLngs(latlngs);\r\n\t\t\t},\r\n\r\n\t\t\tsetLatLngs: function (latlngs) {\r\n\t\t\t\tvar i = 0,\r\n\t\t\t\t len = latlngs.length;\r\n\r\n\t\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\t\tif (i < len) {\r\n\t\t\t\t\t\tlayer.setLatLngs(latlngs[i++]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.removeLayer(layer);\r\n\t\t\t\t\t}\r\n\t\t\t\t}, this);\r\n\r\n\t\t\t\twhile (i < len) {\r\n\t\t\t\t\tthis.addLayer(new Klass(latlngs[i++], this._options));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\tgetLatLngs: function () {\r\n\t\t\t\tvar latlngs = [];\r\n\r\n\t\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\t\tlatlngs.push(layer.getLatLngs());\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn latlngs;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tL.MultiPolyline = createMulti(L.Polyline);\r\n\tL.MultiPolygon = createMulti(L.Polygon);\r\n\r\n\tL.multiPolyline = function (latlngs, options) {\r\n\t\treturn new L.MultiPolyline(latlngs, options);\r\n\t};\r\n\r\n\tL.multiPolygon = function (latlngs, options) {\r\n\t\treturn new L.MultiPolygon(latlngs, options);\r\n\t};\r\n}());\r\n\n\n/*\r\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\r\n */\r\n\r\nL.Rectangle = L.Polygon.extend({\r\n\tinitialize: function (latLngBounds, options) {\r\n\t\tL.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\r\n\t},\r\n\r\n\tsetBounds: function (latLngBounds) {\r\n\t\tthis.setLatLngs(this._boundsToLatLngs(latLngBounds));\r\n\t},\r\n\r\n\t_boundsToLatLngs: function (latLngBounds) {\r\n\t\tlatLngBounds = L.latLngBounds(latLngBounds);\r\n\t\treturn [\r\n\t\t\tlatLngBounds.getSouthWest(),\r\n\t\t\tlatLngBounds.getNorthWest(),\r\n\t\t\tlatLngBounds.getNorthEast(),\r\n\t\t\tlatLngBounds.getSouthEast()\r\n\t\t];\r\n\t}\r\n});\r\n\r\nL.rectangle = function (latLngBounds, options) {\r\n\treturn new L.Rectangle(latLngBounds, options);\r\n};\r\n\n\n/*\r\n * L.Circle is a circle overlay (with a certain radius in meters).\r\n */\r\n\r\nL.Circle = L.Path.extend({\r\n\tinitialize: function (latlng, radius, options) {\r\n\t\tL.Path.prototype.initialize.call(this, options);\r\n\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tthis._mRadius = radius;\r\n\t},\r\n\r\n\toptions: {\r\n\t\tfill: true\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tsetRadius: function (radius) {\r\n\t\tthis._mRadius = radius;\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tvar lngRadius = this._getLngRadius(),\r\n\t\t latlng = this._latlng,\r\n\t\t pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]);\r\n\r\n\t\tthis._point = this._map.latLngToLayerPoint(latlng);\r\n\t\tthis._radius = Math.max(this._point.x - pointLeft.x, 1);\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar lngRadius = this._getLngRadius(),\r\n\t\t latRadius = (this._mRadius / 40075017) * 360,\r\n\t\t latlng = this._latlng;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t [latlng.lat - latRadius, latlng.lng - lngRadius],\r\n\t\t [latlng.lat + latRadius, latlng.lng + lngRadius]);\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\tvar p = this._point,\r\n\t\t r = this._radius;\r\n\r\n\t\tif (this._checkIfEmpty()) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tif (L.Browser.svg) {\r\n\t\t\treturn 'M' + p.x + ',' + (p.y - r) +\r\n\t\t\t 'A' + r + ',' + r + ',0,1,1,' +\r\n\t\t\t (p.x - 0.1) + ',' + (p.y - r) + ' z';\r\n\t\t} else {\r\n\t\t\tp._round();\r\n\t\t\tr = Math.round(r);\r\n\t\t\treturn 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360);\r\n\t\t}\r\n\t},\r\n\r\n\tgetRadius: function () {\r\n\t\treturn this._mRadius;\r\n\t},\r\n\r\n\t// TODO Earth hardcoded, move into projection code!\r\n\r\n\t_getLatRadius: function () {\r\n\t\treturn (this._mRadius / 40075017) * 360;\r\n\t},\r\n\r\n\t_getLngRadius: function () {\r\n\t\treturn this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat);\r\n\t},\r\n\r\n\t_checkIfEmpty: function () {\r\n\t\tif (!this._map) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tvar vp = this._map._pathViewport,\r\n\t\t r = this._radius,\r\n\t\t p = this._point;\r\n\r\n\t\treturn p.x - r > vp.max.x || p.y - r > vp.max.y ||\r\n\t\t p.x + r < vp.min.x || p.y + r < vp.min.y;\r\n\t}\r\n});\r\n\r\nL.circle = function (latlng, radius, options) {\r\n\treturn new L.Circle(latlng, radius, options);\r\n};\r\n\n\n/*\r\n * L.CircleMarker is a circle overlay with a permanent pixel radius.\r\n */\r\n\r\nL.CircleMarker = L.Circle.extend({\r\n\toptions: {\r\n\t\tradius: 10,\r\n\t\tweight: 2\r\n\t},\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.Circle.prototype.initialize.call(this, latlng, null, options);\r\n\t\tthis._radius = this.options.radius;\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\r\n\t},\r\n\r\n\t_updateStyle : function () {\r\n\t\tL.Circle.prototype._updateStyle.call(this);\r\n\t\tthis.setRadius(this.options.radius);\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tL.Circle.prototype.setLatLng.call(this, latlng);\r\n\t\tif (this._popup && this._popup._isOpen) {\r\n\t\t\tthis._popup.setLatLng(latlng);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetRadius: function (radius) {\r\n\t\tthis.options.radius = this._radius = radius;\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tgetRadius: function () {\r\n\t\treturn this._radius;\r\n\t}\r\n});\r\n\r\nL.circleMarker = function (latlng, options) {\r\n\treturn new L.CircleMarker(latlng, options);\r\n};\r\n\n\n/*\r\n * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines.\r\n */\r\n\r\nL.Polyline.include(!L.Path.CANVAS ? {} : {\r\n\t_containsPoint: function (p, closed) {\r\n\t\tvar i, j, k, len, len2, dist, part,\r\n\t\t w = this.options.weight / 2;\r\n\r\n\t\tif (L.Browser.touch) {\r\n\t\t\tw += 10; // polyline click tolerance on touch devices\r\n\t\t}\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tpart = this._parts[i];\r\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\r\n\t\t\t\tif (!closed && (j === 0)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]);\r\n\r\n\t\t\t\tif (dist <= w) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons.\r\n */\r\n\r\nL.Polygon.include(!L.Path.CANVAS ? {} : {\r\n\t_containsPoint: function (p) {\r\n\t\tvar inside = false,\r\n\t\t part, p1, p2,\r\n\t\t i, j, k,\r\n\t\t len, len2;\r\n\r\n\t\t// TODO optimization: check if within bounds first\r\n\r\n\t\tif (L.Polyline.prototype._containsPoint.call(this, p, true)) {\r\n\t\t\t// click on polygon border\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// ray casting algorithm for detecting if point is in polygon\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tpart = this._parts[i];\r\n\r\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\r\n\t\t\t\tp1 = part[j];\r\n\t\t\t\tp2 = part[k];\r\n\r\n\t\t\t\tif (((p1.y > p.y) !== (p2.y > p.y)) &&\r\n\t\t\t\t\t\t(p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\r\n\t\t\t\t\tinside = !inside;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn inside;\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Circle with Canvas-specific code.\r\n */\r\n\r\nL.Circle.include(!L.Path.CANVAS ? {} : {\r\n\t_drawPath: function () {\r\n\t\tvar p = this._point;\r\n\t\tthis._ctx.beginPath();\r\n\t\tthis._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false);\r\n\t},\r\n\r\n\t_containsPoint: function (p) {\r\n\t\tvar center = this._point,\r\n\t\t w2 = this.options.stroke ? this.options.weight / 2 : 0;\r\n\r\n\t\treturn (p.distanceTo(center) <= this._radius + w2);\r\n\t}\r\n});\r\n\n\n/*\n * CircleMarker canvas specific drawing parts.\n */\n\nL.CircleMarker.include(!L.Path.CANVAS ? {} : {\n\t_updateStyle: function () {\n\t\tL.Path.prototype._updateStyle.call(this);\n\t}\n});\n\n\n/*\r\n * L.GeoJSON turns any GeoJSON data into a Leaflet layer.\r\n */\r\n\r\nL.GeoJSON = L.FeatureGroup.extend({\r\n\r\n\tinitialize: function (geojson, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tif (geojson) {\r\n\t\t\tthis.addData(geojson);\r\n\t\t}\r\n\t},\r\n\r\n\taddData: function (geojson) {\r\n\t\tvar features = L.Util.isArray(geojson) ? geojson : geojson.features,\r\n\t\t i, len, feature;\r\n\r\n\t\tif (features) {\r\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\r\n\t\t\t\t// Only add this if geometry or geometries are set and not null\r\n\t\t\t\tfeature = features[i];\r\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\r\n\t\t\t\t\tthis.addData(features[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.filter && !options.filter(geojson)) { return; }\r\n\r\n\t\tvar layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options);\r\n\t\tlayer.feature = L.GeoJSON.asFeature(geojson);\r\n\r\n\t\tlayer.defaultOptions = layer.options;\r\n\t\tthis.resetStyle(layer);\r\n\r\n\t\tif (options.onEachFeature) {\r\n\t\t\toptions.onEachFeature(geojson, layer);\r\n\t\t}\r\n\r\n\t\treturn this.addLayer(layer);\r\n\t},\r\n\r\n\tresetStyle: function (layer) {\r\n\t\tvar style = this.options.style;\r\n\t\tif (style) {\r\n\t\t\t// reset any custom styles\r\n\t\t\tL.Util.extend(layer.options, layer.defaultOptions);\r\n\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_setLayerStyle: function (layer, style) {\r\n\t\tif (typeof style === 'function') {\r\n\t\t\tstyle = style(layer.feature);\r\n\t\t}\r\n\t\tif (layer.setStyle) {\r\n\t\t\tlayer.setStyle(style);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.extend(L.GeoJSON, {\r\n\tgeometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) {\r\n\t\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\r\n\t\t coords = geometry.coordinates,\r\n\t\t layers = [],\r\n\t\t latlng, latlngs, i, len;\r\n\r\n\t\tcoordsToLatLng = coordsToLatLng || this.coordsToLatLng;\r\n\r\n\t\tswitch (geometry.type) {\r\n\t\tcase 'Point':\r\n\t\t\tlatlng = coordsToLatLng(coords);\r\n\t\t\treturn pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);\r\n\r\n\t\tcase 'MultiPoint':\r\n\t\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\t\tlatlng = coordsToLatLng(coords[i]);\r\n\t\t\t\tlayers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tcase 'LineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng);\r\n\t\t\treturn new L.Polyline(latlngs, vectorOptions);\r\n\r\n\t\tcase 'Polygon':\r\n\t\t\tif (coords.length === 2 && !coords[1].length) {\r\n\t\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t\t}\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\r\n\t\t\treturn new L.Polygon(latlngs, vectorOptions);\r\n\r\n\t\tcase 'MultiLineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\r\n\t\t\treturn new L.MultiPolyline(latlngs, vectorOptions);\r\n\r\n\t\tcase 'MultiPolygon':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng);\r\n\t\t\treturn new L.MultiPolygon(latlngs, vectorOptions);\r\n\r\n\t\tcase 'GeometryCollection':\r\n\t\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\r\n\r\n\t\t\t\tlayers.push(this.geometryToLayer({\r\n\t\t\t\t\tgeometry: geometry.geometries[i],\r\n\t\t\t\t\ttype: 'Feature',\r\n\t\t\t\t\tproperties: geojson.properties\r\n\t\t\t\t}, pointToLayer, coordsToLatLng, vectorOptions));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tdefault:\r\n\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t}\r\n\t},\r\n\r\n\tcoordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng\r\n\t\treturn new L.LatLng(coords[1], coords[0], coords[2]);\r\n\t},\r\n\r\n\tcoordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array\r\n\t\tvar latlng, i, len,\r\n\t\t latlngs = [];\r\n\r\n\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\tlatlng = levelsDeep ?\r\n\t\t\t this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :\r\n\t\t\t (coordsToLatLng || this.coordsToLatLng)(coords[i]);\r\n\r\n\t\t\tlatlngs.push(latlng);\r\n\t\t}\r\n\r\n\t\treturn latlngs;\r\n\t},\r\n\r\n\tlatLngToCoords: function (latlng) {\r\n\t\tvar coords = [latlng.lng, latlng.lat];\r\n\r\n\t\tif (latlng.alt !== undefined) {\r\n\t\t\tcoords.push(latlng.alt);\r\n\t\t}\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tlatLngsToCoords: function (latLngs) {\r\n\t\tvar coords = [];\r\n\r\n\t\tfor (var i = 0, len = latLngs.length; i < len; i++) {\r\n\t\t\tcoords.push(L.GeoJSON.latLngToCoords(latLngs[i]));\r\n\t\t}\r\n\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tgetFeature: function (layer, newGeometry) {\r\n\t\treturn layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry);\r\n\t},\r\n\r\n\tasFeature: function (geoJSON) {\r\n\t\tif (geoJSON.type === 'Feature') {\r\n\t\t\treturn geoJSON;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'Feature',\r\n\t\t\tproperties: {},\r\n\t\t\tgeometry: geoJSON\r\n\t\t};\r\n\t}\r\n});\r\n\r\nvar PointToGeoJSON = {\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Point',\r\n\t\t\tcoordinates: L.GeoJSON.latLngToCoords(this.getLatLng())\r\n\t\t});\r\n\t}\r\n};\r\n\r\nL.Marker.include(PointToGeoJSON);\r\nL.Circle.include(PointToGeoJSON);\r\nL.CircleMarker.include(PointToGeoJSON);\r\n\r\nL.Polyline.include({\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'LineString',\r\n\t\t\tcoordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs())\r\n\t\t});\r\n\t}\r\n});\r\n\r\nL.Polygon.include({\r\n\ttoGeoJSON: function () {\r\n\t\tvar coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())],\r\n\t\t i, len, hole;\r\n\r\n\t\tcoords[0].push(coords[0][0]);\r\n\r\n\t\tif (this._holes) {\r\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\t\thole = L.GeoJSON.latLngsToCoords(this._holes[i]);\r\n\t\t\t\thole.push(hole[0]);\r\n\t\t\t\tcoords.push(hole);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Polygon',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t}\r\n});\r\n\r\n(function () {\r\n\tfunction multiToGeoJSON(type) {\r\n\t\treturn function () {\r\n\t\t\tvar coords = [];\r\n\r\n\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\tcoords.push(layer.toGeoJSON().geometry.coordinates);\r\n\t\t\t});\r\n\r\n\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\ttype: type,\r\n\t\t\t\tcoordinates: coords\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\tL.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')});\r\n\tL.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')});\r\n\r\n\tL.LayerGroup.include({\r\n\t\ttoGeoJSON: function () {\r\n\r\n\t\t\tvar geometry = this.feature && this.feature.geometry,\r\n\t\t\t\tjsons = [],\r\n\t\t\t\tjson;\r\n\r\n\t\t\tif (geometry && geometry.type === 'MultiPoint') {\r\n\t\t\t\treturn multiToGeoJSON('MultiPoint').call(this);\r\n\t\t\t}\r\n\r\n\t\t\tvar isGeometryCollection = geometry && geometry.type === 'GeometryCollection';\r\n\r\n\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\tif (layer.toGeoJSON) {\r\n\t\t\t\t\tjson = layer.toGeoJSON();\r\n\t\t\t\t\tjsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (isGeometryCollection) {\r\n\t\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\t\tgeometries: jsons,\r\n\t\t\t\t\ttype: 'GeometryCollection'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'FeatureCollection',\r\n\t\t\t\tfeatures: jsons\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n}());\r\n\r\nL.geoJson = function (geojson, options) {\r\n\treturn new L.GeoJSON(geojson, options);\r\n};\r\n\n\n/*\r\n * L.DomEvent contains functions for working with DOM events.\r\n */\r\n\r\nL.DomEvent = {\r\n\t/* inspired by John Resig, Dean Edwards and YUI addEvent implementations */\r\n\taddListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object])\r\n\r\n\t\tvar id = L.stamp(fn),\r\n\t\t key = '_leaflet_' + type + id,\r\n\t\t handler, originalHandler, newType;\r\n\r\n\t\tif (obj[key]) { return this; }\r\n\r\n\t\thandler = function (e) {\r\n\t\t\treturn fn.call(context || obj, e || L.DomEvent._getEvent());\r\n\t\t};\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\treturn this.addPointerListener(obj, type, handler, id);\r\n\t\t}\r\n\t\tif (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {\r\n\t\t\tthis.addDoubleTapListener(obj, handler, id);\r\n\t\t}\r\n\r\n\t\tif ('addEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.addEventListener('DOMMouseScroll', handler, false);\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\r\n\t\t\t\toriginalHandler = handler;\r\n\t\t\t\tnewType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');\r\n\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\tif (!L.DomEvent._checkMouse(obj, e)) { return; }\r\n\t\t\t\t\treturn originalHandler(e);\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.addEventListener(newType, handler, false);\r\n\r\n\t\t\t} else if (type === 'click' && L.Browser.android) {\r\n\t\t\t\toriginalHandler = handler;\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\treturn L.DomEvent._filterClick(e, originalHandler);\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t} else {\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('attachEvent' in obj) {\r\n\t\t\tobj.attachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[key] = handler;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveListener: function (obj, type, fn) { // (HTMLElement, String, Function)\r\n\r\n\t\tvar id = L.stamp(fn),\r\n\t\t key = '_leaflet_' + type + id,\r\n\t\t handler = obj[key];\r\n\r\n\t\tif (!handler) { return this; }\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.removePointerListener(obj, type, id);\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {\r\n\t\t\tthis.removeDoubleTapListener(obj, id);\r\n\r\n\t\t} else if ('removeEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.removeEventListener('DOMMouseScroll', handler, false);\r\n\t\t\t\tobj.removeEventListener(type, handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\t\t\t\tobj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);\r\n\t\t\t} else {\r\n\t\t\t\tobj.removeEventListener(type, handler, false);\r\n\t\t\t}\r\n\t\t} else if ('detachEvent' in obj) {\r\n\t\t\tobj.detachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[key] = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstopPropagation: function (e) {\r\n\r\n\t\tif (e.stopPropagation) {\r\n\t\t\te.stopPropagation();\r\n\t\t} else {\r\n\t\t\te.cancelBubble = true;\r\n\t\t}\r\n\t\tL.DomEvent._skipped(e);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdisableScrollPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\treturn L.DomEvent\r\n\t\t\t.on(el, 'mousewheel', stop)\r\n\t\t\t.on(el, 'MozMousePixelScroll', stop);\r\n\t},\r\n\r\n\tdisableClickPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.on(el, L.Draggable.START[i], stop);\r\n\t\t}\r\n\r\n\t\treturn L.DomEvent\r\n\t\t\t.on(el, 'click', L.DomEvent._fakeStop)\r\n\t\t\t.on(el, 'dblclick', stop);\r\n\t},\r\n\r\n\tpreventDefault: function (e) {\r\n\r\n\t\tif (e.preventDefault) {\r\n\t\t\te.preventDefault();\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstop: function (e) {\r\n\t\treturn L.DomEvent\r\n\t\t\t.preventDefault(e)\r\n\t\t\t.stopPropagation(e);\r\n\t},\r\n\r\n\tgetMousePosition: function (e, container) {\r\n\t\tif (!container) {\r\n\t\t\treturn new L.Point(e.clientX, e.clientY);\r\n\t\t}\r\n\r\n\t\tvar rect = container.getBoundingClientRect();\r\n\r\n\t\treturn new L.Point(\r\n\t\t\te.clientX - rect.left - container.clientLeft,\r\n\t\t\te.clientY - rect.top - container.clientTop);\r\n\t},\r\n\r\n\tgetWheelDelta: function (e) {\r\n\r\n\t\tvar delta = 0;\r\n\r\n\t\tif (e.wheelDelta) {\r\n\t\t\tdelta = e.wheelDelta / 120;\r\n\t\t}\r\n\t\tif (e.detail) {\r\n\t\t\tdelta = -e.detail / 3;\r\n\t\t}\r\n\t\treturn delta;\r\n\t},\r\n\r\n\t_skipEvents: {},\r\n\r\n\t_fakeStop: function (e) {\r\n\t\t// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)\r\n\t\tL.DomEvent._skipEvents[e.type] = true;\r\n\t},\r\n\r\n\t_skipped: function (e) {\r\n\t\tvar skipped = this._skipEvents[e.type];\r\n\t\t// reset when checking, as it's only used in map container and propagates outside of the map\r\n\t\tthis._skipEvents[e.type] = false;\r\n\t\treturn skipped;\r\n\t},\r\n\r\n\t// check if element really left/entered the event target (for mouseenter/mouseleave)\r\n\t_checkMouse: function (el, e) {\r\n\r\n\t\tvar related = e.relatedTarget;\r\n\r\n\t\tif (!related) { return true; }\r\n\r\n\t\ttry {\r\n\t\t\twhile (related && (related !== el)) {\r\n\t\t\t\trelated = related.parentNode;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn (related !== el);\r\n\t},\r\n\r\n\t_getEvent: function () { // evil magic for IE\r\n\t\t/*jshint noarg:false */\r\n\t\tvar e = window.event;\r\n\t\tif (!e) {\r\n\t\t\tvar caller = arguments.callee.caller;\r\n\t\t\twhile (caller) {\r\n\t\t\t\te = caller['arguments'][0];\r\n\t\t\t\tif (e && window.Event === e.constructor) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcaller = caller.caller;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn e;\r\n\t},\r\n\r\n\t// this is a horrible workaround for a bug in Android where a single touch triggers two click events\r\n\t_filterClick: function (e, handler) {\r\n\t\tvar timeStamp = (e.timeStamp || e.originalEvent.timeStamp),\r\n\t\t\telapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);\r\n\r\n\t\t// are they closer together than 1000ms yet more than 100ms?\r\n\t\t// Android typically triggers them ~300ms apart while multiple listeners\r\n\t\t// on the same event should be triggered far faster;\r\n\t\t// or check if click is simulated on the element, and if it is, reject any non-simulated events\r\n\r\n\t\tif ((elapsed && elapsed > 100 && elapsed < 1000) || (e.target._simulatedClick && !e._simulated)) {\r\n\t\t\tL.DomEvent.stop(e);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tL.DomEvent._lastClick = timeStamp;\r\n\r\n\t\treturn handler(e);\r\n\t}\r\n};\r\n\r\nL.DomEvent.on = L.DomEvent.addListener;\r\nL.DomEvent.off = L.DomEvent.removeListener;\r\n\n\n/*\r\n * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.\r\n */\r\n\r\nL.Draggable = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\tstatics: {\r\n\t\tSTART: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],\r\n\t\tEND: {\r\n\t\t\tmousedown: 'mouseup',\r\n\t\t\ttouchstart: 'touchend',\r\n\t\t\tpointerdown: 'touchend',\r\n\t\t\tMSPointerDown: 'touchend'\r\n\t\t},\r\n\t\tMOVE: {\r\n\t\t\tmousedown: 'mousemove',\r\n\t\t\ttouchstart: 'touchmove',\r\n\t\t\tpointerdown: 'touchmove',\r\n\t\t\tMSPointerDown: 'touchmove'\r\n\t\t}\r\n\t},\r\n\r\n\tinitialize: function (element, dragStartTarget) {\r\n\t\tthis._element = element;\r\n\t\tthis._dragStartTarget = dragStartTarget || element;\r\n\t},\r\n\r\n\tenable: function () {\r\n\t\tif (this._enabled) { return; }\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\r\n\t\t}\r\n\r\n\t\tthis._enabled = true;\r\n\t},\r\n\r\n\tdisable: function () {\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\r\n\t\t}\r\n\r\n\t\tthis._enabled = false;\r\n\t\tthis._moved = false;\r\n\t},\r\n\r\n\t_onDown: function (e) {\r\n\t\tthis._moved = false;\r\n\r\n\t\tif (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }\r\n\r\n\t\tL.DomEvent.stopPropagation(e);\r\n\r\n\t\tif (L.Draggable._disabled) { return; }\r\n\r\n\t\tL.DomUtil.disableImageDrag();\r\n\t\tL.DomUtil.disableTextSelection();\r\n\r\n\t\tif (this._moving) { return; }\r\n\r\n\t\tvar first = e.touches ? e.touches[0] : e;\r\n\r\n\t\tthis._startPoint = new L.Point(first.clientX, first.clientY);\r\n\t\tthis._startPos = this._newPos = L.DomUtil.getPosition(this._element);\r\n\r\n\t\tL.DomEvent\r\n\t\t .on(document, L.Draggable.MOVE[e.type], this._onMove, this)\r\n\t\t .on(document, L.Draggable.END[e.type], this._onUp, this);\r\n\t},\r\n\r\n\t_onMove: function (e) {\r\n\t\tif (e.touches && e.touches.length > 1) {\r\n\t\t\tthis._moved = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\r\n\t\t newPoint = new L.Point(first.clientX, first.clientY),\r\n\t\t offset = newPoint.subtract(this._startPoint);\r\n\r\n\t\tif (!offset.x && !offset.y) { return; }\r\n\r\n\t\tL.DomEvent.preventDefault(e);\r\n\r\n\t\tif (!this._moved) {\r\n\t\t\tthis.fire('dragstart');\r\n\r\n\t\t\tthis._moved = true;\r\n\t\t\tthis._startPos = L.DomUtil.getPosition(this._element).subtract(offset);\r\n\r\n\t\t\tL.DomUtil.addClass(document.body, 'leaflet-dragging');\r\n\t\t\tL.DomUtil.addClass((e.target || e.srcElement), 'leaflet-drag-target');\r\n\t\t}\r\n\r\n\t\tthis._newPos = this._startPos.add(offset);\r\n\t\tthis._moving = true;\r\n\r\n\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\t\tthis._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget);\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tthis.fire('predrag');\r\n\t\tL.DomUtil.setPosition(this._element, this._newPos);\r\n\t\tthis.fire('drag');\r\n\t},\r\n\r\n\t_onUp: function (e) {\r\n\t\tL.DomUtil.removeClass(document.body, 'leaflet-dragging');\r\n\t\tL.DomUtil.removeClass((e.target || e.srcElement), 'leaflet-drag-target');\r\n\r\n\t\tfor (var i in L.Draggable.MOVE) {\r\n\t\t\tL.DomEvent\r\n\t\t\t .off(document, L.Draggable.MOVE[i], this._onMove)\r\n\t\t\t .off(document, L.Draggable.END[i], this._onUp);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.enableImageDrag();\r\n\t\tL.DomUtil.enableTextSelection();\r\n\r\n\t\tif (this._moved && this._moving) {\r\n\t\t\t// ensure drag is not fired after dragend\r\n\t\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\r\n\t\t\tthis.fire('dragend', {\r\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._moving = false;\r\n\t}\r\n});\r\n\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\nL.Handler = L.Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\tenable: function () {\n\t\tif (this._enabled) { return; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t},\n\n\tdisable: function () {\n\t\tif (!this._enabled) { return; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t},\n\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n});\n\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdragging: true,\n\n\tinertia: !L.Browser.android23,\n\tinertiaDeceleration: 3400, // px/s^2\n\tinertiaMaxSpeed: Infinity, // px/s\n\tinertiaThreshold: L.Browser.touch ? 32 : 18, // ms\n\teaseLinearity: 0.25,\n\n\t// TODO refactor, move to CRS\n\tworldCopyJump: false\n});\n\nL.Map.Drag = L.Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new L.Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\t'dragstart': this._onDragStart,\n\t\t\t\t'drag': this._onDrag,\n\t\t\t\t'dragend': this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDrag, this);\n\t\t\t\tmap.on('viewreset', this._onViewReset, this);\n\n\t\t\t\tmap.whenReady(this._onViewReset, this);\n\t\t\t}\n\t\t}\n\t\tthis._draggable.enable();\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tmap\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function () {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t pos = this._lastPos = this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tif (time - this._times[0] > 200) {\n\t\t\t\tthis._positions.shift();\n\t\t\t\tthis._times.shift();\n\t\t\t}\n\t\t}\n\n\t\tthis._map\n\t\t .fire('move')\n\t\t .fire('drag');\n\t},\n\n\t_onViewReset: function () {\n\t\t// TODO fix hardcoded Earth values\n\t\tvar pxCenter = this._map.getSize()._divideBy(2),\n\t\t pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.project([0, 180]).x;\n\t},\n\n\t_onPreDrag: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t halfWidth = Math.round(worldWidth / 2),\n\t\t dx = this._initialWorldOffset,\n\t\t x = this._draggable._newPos.x,\n\t\t newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t options = map.options,\n\t\t delay = +new Date() - this._lastTime,\n\n\t\t noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0];\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t duration = (this._lastTime + delay - this._times[0]) / 1000,\n\t\t\t ease = options.easeLinearity,\n\n\t\t\t speedVector = direction.multiplyBy(ease / duration),\n\t\t\t speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x || !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tL.Util.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);\n\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdoubleClickZoom: true\n});\n\nL.Map.DoubleClickZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1);\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);\n\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\nL.Map.mergeOptions({\n\tscrollWheelZoom: true\n});\n\nL.Map.ScrollWheelZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\t\tL.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll);\n\t\tL.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = L.DomEvent.getWheelDelta(e);\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(40 - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(L.bind(this._performZoom, this), left);\n\n\t\tL.DomEvent.preventDefault(e);\n\t\tL.DomEvent.stopPropagation(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t delta = this._delta,\n\t\t zoom = map.getZoom();\n\n\t\tdelta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n\t\tdelta = Math.max(Math.min(delta, 4), -4);\n\t\tdelta = map._limitZoom(zoom + delta) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);\n\n\n/*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n */\r\n\r\nL.extend(L.DomEvent, {\r\n\r\n\t_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',\r\n\t_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',\r\n\r\n\t// inspired by Zepto touch code by Thomas Fuchs\r\n\taddDoubleTapListener: function (obj, handler, id) {\r\n\t\tvar last,\r\n\t\t doubleTap = false,\r\n\t\t delay = 250,\r\n\t\t touch,\r\n\t\t pre = '_leaflet_',\r\n\t\t touchstart = this._touchstart,\r\n\t\t touchend = this._touchend,\r\n\t\t trackedTouches = [];\r\n\r\n\t\tfunction onTouchStart(e) {\r\n\t\t\tvar count;\r\n\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\ttrackedTouches.push(e.pointerId);\r\n\t\t\t\tcount = trackedTouches.length;\r\n\t\t\t} else {\r\n\t\t\t\tcount = e.touches.length;\r\n\t\t\t}\r\n\t\t\tif (count > 1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar now = Date.now(),\r\n\t\t\t\tdelta = now - (last || now);\r\n\r\n\t\t\ttouch = e.touches ? e.touches[0] : e;\r\n\t\t\tdoubleTap = (delta > 0 && delta <= delay);\r\n\t\t\tlast = now;\r\n\t\t}\r\n\r\n\t\tfunction onTouchEnd(e) {\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\tvar idx = trackedTouches.indexOf(e.pointerId);\r\n\t\t\t\tif (idx === -1) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\ttrackedTouches.splice(idx, 1);\r\n\t\t\t}\r\n\r\n\t\t\tif (doubleTap) {\r\n\t\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\t\t// work around .type being readonly with MSPointer* events\r\n\t\t\t\t\tvar newTouch = { },\r\n\t\t\t\t\t\tprop;\r\n\r\n\t\t\t\t\t// jshint forin:false\r\n\t\t\t\t\tfor (var i in touch) {\r\n\t\t\t\t\t\tprop = touch[i];\r\n\t\t\t\t\t\tif (typeof prop === 'function') {\r\n\t\t\t\t\t\t\tnewTouch[i] = prop.bind(touch);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tnewTouch[i] = prop;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttouch = newTouch;\r\n\t\t\t\t}\r\n\t\t\t\ttouch.type = 'dblclick';\r\n\t\t\t\thandler(touch);\r\n\t\t\t\tlast = null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tobj[pre + touchstart + id] = onTouchStart;\r\n\t\tobj[pre + touchend + id] = onTouchEnd;\r\n\r\n\t\t// on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen\r\n\t\t// will not come through to us, so we will lose track of how many touches are ongoing\r\n\t\tvar endElement = L.Browser.pointer ? document.documentElement : obj;\r\n\r\n\t\tobj.addEventListener(touchstart, onTouchStart, false);\r\n\t\tendElement.addEventListener(touchend, onTouchEnd, false);\r\n\r\n\t\tif (L.Browser.pointer) {\r\n\t\t\tendElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveDoubleTapListener: function (obj, id) {\r\n\t\tvar pre = '_leaflet_';\r\n\r\n\t\tobj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);\r\n\t\t(L.Browser.pointer ? document.documentElement : obj).removeEventListener(\r\n\t\t this._touchend, obj[pre + this._touchend + id], false);\r\n\r\n\t\tif (L.Browser.pointer) {\r\n\t\t\tdocument.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],\r\n\t\t\t\tfalse);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nL.extend(L.DomEvent, {\n\n\t//static\n\tPOINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',\n\tPOINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',\n\tPOINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',\n\tPOINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',\n\n\t_pointers: [],\n\t_pointerDocumentListener: false,\n\n\t// Provides a touch events wrapper for (ms)pointer events.\n\t// Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019\n\t//ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\n\taddPointerListener: function (obj, type, handler, id) {\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\treturn this.addPointerListenerStart(obj, type, handler, id);\n\t\tcase 'touchend':\n\t\t\treturn this.addPointerListenerEnd(obj, type, handler, id);\n\t\tcase 'touchmove':\n\t\t\treturn this.addPointerListenerMove(obj, type, handler, id);\n\t\tdefault:\n\t\t\tthrow 'Unknown touch event type';\n\t\t}\n\t},\n\n\taddPointerListenerStart: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t pointers = this._pointers;\n\n\t\tvar cb = function (e) {\n\n\t\t\tL.DomEvent.preventDefault(e);\n\n\t\t\tvar alreadyInArray = false;\n\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\talreadyInArray = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!alreadyInArray) {\n\t\t\t\tpointers.push(e);\n\t\t\t}\n\n\t\t\te.touches = pointers.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchstart' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_DOWN, cb, false);\n\n\t\t// need to also listen for end events to keep the _pointers list accurate\n\t\t// this needs to be on the body and never go away\n\t\tif (!this._pointerDocumentListener) {\n\t\t\tvar internalCb = function (e) {\n\t\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\t\tpointers.splice(i, 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t//We listen on the documentElement as any drags that end by moving the touch off the screen get fired there\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_UP, internalCb, false);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);\n\n\t\t\tthis._pointerDocumentListener = true;\n\t\t}\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerMove: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t touches = this._pointers;\n\n\t\tfunction cb(e) {\n\n\t\t\t// don't fire touch moves when mouse isn't down\n\t\t\tif ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }\n\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches[i] = e;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t}\n\n\t\tobj[pre + 'touchmove' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_MOVE, cb, false);\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerEnd: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t touches = this._pointers;\n\n\t\tvar cb = function (e) {\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchend' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_UP, cb, false);\n\t\tobj.addEventListener(this.POINTER_CANCEL, cb, false);\n\n\t\treturn this;\n\t},\n\n\tremovePointerListener: function (obj, type, id) {\n\t\tvar pre = '_leaflet_',\n\t\t cb = obj[pre + type + id];\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\tobj.removeEventListener(this.POINTER_DOWN, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchmove':\n\t\t\tobj.removeEventListener(this.POINTER_MOVE, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchend':\n\t\t\tobj.removeEventListener(this.POINTER_UP, cb, false);\n\t\t\tobj.removeEventListener(this.POINTER_CANCEL, cb, false);\n\t\t\tbreak;\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\nL.Map.mergeOptions({\n\ttouchZoom: L.Browser.touch && !L.Browser.android23,\n\tbounceAtZoomLimits: true\n});\n\nL.Map.TouchZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToLayerPoint(e.touches[1]),\n\t\t viewCenter = map._getCenterLayerPoint();\n\n\t\tthis._startCenter = p1.add(p2)._divideBy(2);\n\t\tthis._startDist = p1.distanceTo(p2);\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tthis._centerOffset = viewCenter.subtract(this._startCenter);\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tL.DomEvent\n\t\t .on(document, 'touchmove', this._onTouchMove, this)\n\t\t .on(document, 'touchend', this._onTouchEnd, this);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToLayerPoint(e.touches[1]);\n\n\t\tthis._scale = p1.distanceTo(p2) / this._startDist;\n\t\tthis._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter);\n\n\t\tif (this._scale === 1) { return; }\n\n\t\tif (!map.options.bounceAtZoomLimits) {\n\t\t\tif ((map.getZoom() === map.getMinZoom() && this._scale < 1) ||\n\t\t\t (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; }\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tL.DomUtil.addClass(map._mapPane, 'leaflet-touching');\n\n\t\t\tmap\n\t\t\t .fire('movestart')\n\t\t\t .fire('zoomstart');\n\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\t\tthis._animRequest = L.Util.requestAnimFrame(\n\t\t this._updateOnMove, this, true, this._map._container);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_updateOnMove: function () {\n\t\tvar map = this._map,\n\t\t origin = this._getScaleOrigin(),\n\t\t center = map.layerPointToLatLng(origin),\n\t\t zoom = map.getScaleZoom(this._scale);\n\n\t\tmap._animateZoom(center, zoom, this._startCenter, this._scale, this._delta);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tvar map = this._map;\n\n\t\tthis._zooming = false;\n\t\tL.DomUtil.removeClass(map._mapPane, 'leaflet-touching');\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tL.DomEvent\n\t\t .off(document, 'touchmove', this._onTouchMove)\n\t\t .off(document, 'touchend', this._onTouchEnd);\n\n\t\tvar origin = this._getScaleOrigin(),\n\t\t center = map.layerPointToLatLng(origin),\n\n\t\t oldZoom = map.getZoom(),\n\t\t floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom,\n\t\t roundZoomDelta = (floatZoomDelta > 0 ?\n\t\t Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)),\n\n\t\t zoom = map._limitZoom(oldZoom + roundZoomDelta),\n\t\t scale = map.getZoomScale(zoom) / this._scale;\n\n\t\tmap._animateZoom(center, zoom, origin, scale);\n\t},\n\n\t_getScaleOrigin: function () {\n\t\tvar centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale);\n\t\treturn this._startCenter.add(centerOffset);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);\n\n\n/*\n * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.\n */\n\nL.Map.mergeOptions({\n\ttap: true,\n\ttapTolerance: 15\n});\n\nL.Map.Tap = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tif (!e.touches) { return; }\n\n\t\tL.DomEvent.preventDefault(e);\n\n\t\tthis._fireClick = true;\n\n\t\t// don't simulate click or track longpress if more than 1 touch\n\t\tif (e.touches.length > 1) {\n\t\t\tthis._fireClick = false;\n\t\t\tclearTimeout(this._holdTimeout);\n\t\t\treturn;\n\t\t}\n\n\t\tvar first = e.touches[0],\n\t\t el = first.target;\n\n\t\tthis._startPos = this._newPos = new L.Point(first.clientX, first.clientY);\n\n\t\t// if touching a link, highlight it\n\t\tif (el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\tL.DomUtil.addClass(el, 'leaflet-active');\n\t\t}\n\n\t\t// simulate long hold but setting a timeout\n\t\tthis._holdTimeout = setTimeout(L.bind(function () {\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._fireClick = false;\n\t\t\t\tthis._onUp();\n\t\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t\t}\n\t\t}, this), 1000);\n\n\t\tL.DomEvent\n\t\t\t.on(document, 'touchmove', this._onMove, this)\n\t\t\t.on(document, 'touchend', this._onUp, this);\n\t},\n\n\t_onUp: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\n\t\tL.DomEvent\n\t\t\t.off(document, 'touchmove', this._onMove, this)\n\t\t\t.off(document, 'touchend', this._onUp, this);\n\n\t\tif (this._fireClick && e && e.changedTouches) {\n\n\t\t\tvar first = e.changedTouches[0],\n\t\t\t el = first.target;\n\n\t\t\tif (el && el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\t\tL.DomUtil.removeClass(el, 'leaflet-active');\n\t\t\t}\n\n\t\t\t// simulate click if the touch didn't move too much\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._simulateEvent('click', first);\n\t\t\t}\n\t\t}\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new L.Point(first.clientX, first.clientY);\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = document.createEvent('MouseEvents');\n\n\t\tsimulatedEvent._simulated = true;\n\t\te.target._simulatedClick = true;\n\n\t\tsimulatedEvent.initMouseEvent(\n\t\t type, true, true, window, 1,\n\t\t e.screenX, e.screenY,\n\t\t e.clientX, e.clientY,\n\t\t false, false, false, false, 0, null);\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\nif (L.Browser.touch && !L.Browser.pointer) {\n\tL.Map.addInitHook('addHandler', 'tap', L.Map.Tap);\n}\n\n\n/*\n * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map\n * (zoom to a selected bounding box), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tboxZoom: true\n});\n\nL.Map.BoxZoom = L.Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t\tthis._moved = false;\n\t},\n\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._container, 'mousedown', this._onMouseDown);\n\t\tthis._moved = false;\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tthis._moved = false;\n\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\tL.DomUtil.disableTextSelection();\n\t\tL.DomUtil.disableImageDrag();\n\n\t\tthis._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n\t\tL.DomEvent\n\t\t .on(document, 'mousemove', this._onMouseMove, this)\n\t\t .on(document, 'mouseup', this._onMouseUp, this)\n\t\t .on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n\t\t\tL.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n\t\t\t//TODO refactor: move cursor to styles\n\t\t\tthis._container.style.cursor = 'crosshair';\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tvar startPoint = this._startLayerPoint,\n\t\t box = this._box,\n\n\t\t layerPoint = this._map.mouseEventToLayerPoint(e),\n\t\t offset = layerPoint.subtract(startPoint),\n\n\t\t newPos = new L.Point(\n\t\t Math.min(layerPoint.x, startPoint.x),\n\t\t Math.min(layerPoint.y, startPoint.y));\n\n\t\tL.DomUtil.setPosition(box, newPos);\n\n\t\tthis._moved = true;\n\n\t\t// TODO refactor: remove hardcoded 4 pixels\n\t\tbox.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n\t\tbox.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tthis._pane.removeChild(this._box);\n\t\t\tthis._container.style.cursor = '';\n\t\t}\n\n\t\tL.DomUtil.enableTextSelection();\n\t\tL.DomUtil.enableImageDrag();\n\n\t\tL.DomEvent\n\t\t .off(document, 'mousemove', this._onMouseMove)\n\t\t .off(document, 'mouseup', this._onMouseUp)\n\t\t .off(document, 'keydown', this._onKeyDown);\n\t},\n\n\t_onMouseUp: function (e) {\n\n\t\tthis._finish();\n\n\t\tvar map = this._map,\n\t\t layerPoint = map.mouseEventToLayerPoint(e);\n\n\t\tif (this._startLayerPoint.equals(layerPoint)) { return; }\n\n\t\tvar bounds = new L.LatLngBounds(\n\t\t map.layerPointToLatLng(this._startLayerPoint),\n\t\t map.layerPointToLatLng(layerPoint));\n\n\t\tmap.fitBounds(bounds);\n\n\t\tmap.fire('boxzoomend', {\n\t\t\tboxZoomBounds: bounds\n\t\t});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);\n\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tkeyboard: true,\n\tkeyboardPanOffset: 80,\n\tkeyboardZoomOffset: 1\n});\n\nL.Map.Keyboard = L.Handler.extend({\n\n\tkeyCodes: {\n\t\tleft: [37],\n\t\tright: [39],\n\t\tdown: [40],\n\t\tup: [38],\n\t\tzoomIn: [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanOffset(map.options.keyboardPanOffset);\n\t\tthis._setZoomOffset(map.options.keyboardZoomOffset);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex === -1) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\tL.DomEvent\n\t\t .on(container, 'focus', this._onFocus, this)\n\t\t .on(container, 'blur', this._onBlur, this)\n\t\t .on(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t .on('focus', this._addHooks, this)\n\t\t .on('blur', this._removeHooks, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\tvar container = this._map._container;\n\n\t\tL.DomEvent\n\t\t .off(container, 'focus', this._onFocus, this)\n\t\t .off(container, 'blur', this._onBlur, this)\n\t\t .off(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t .off('focus', this._addHooks, this)\n\t\t .off('blur', this._removeHooks, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t docEl = document.documentElement,\n\t\t top = body.scrollTop || docEl.scrollTop,\n\t\t left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanOffset: function (pan) {\n\t\tvar keys = this._panKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, pan];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * pan];\n\t\t}\n\t},\n\n\t_setZoomOffset: function (zoom) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoom;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoom;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\tL.DomEvent.on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\tL.DomEvent.off(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tvar key = e.keyCode,\n\t\t map = this._map;\n\n\t\tif (key in this._panKeys) {\n\n\t\t\tif (map._panAnim && map._panAnim._inProgress) { return; }\n\n\t\t\tmap.panBy(this._panKeys[key]);\n\n\t\t\tif (map.options.maxBounds) {\n\t\t\t\tmap.panInsideBounds(map.options.maxBounds);\n\t\t\t}\n\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + this._zoomKeys[key]);\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tL.DomEvent.stop(e);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);\n\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\nL.Handler.MarkerDrag = L.Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new L.Draggable(icon, icon);\n\t\t}\n\n\t\tthis._draggable\n\t\t\t.on('dragstart', this._onDragStart, this)\n\t\t\t.on('drag', this._onDrag, this)\n\t\t\t.on('dragend', this._onDragEnd, this);\n\t\tthis._draggable.enable();\n\t\tL.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable\n\t\t\t.off('dragstart', this._onDragStart, this)\n\t\t\t.off('drag', this._onDrag, this)\n\t\t\t.off('dragend', this._onDragEnd, this);\n\n\t\tthis._draggable.disable();\n\t\tL.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tthis._marker\n\t\t .closePopup()\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\t},\n\n\t_onDrag: function () {\n\t\tvar marker = this._marker,\n\t\t shadow = marker._shadow,\n\t\t iconPos = L.DomUtil.getPosition(marker._icon),\n\t\t latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tL.DomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\n\t\tmarker\n\t\t .fire('move', {latlng: latlng})\n\t\t .fire('drag');\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tthis._marker\n\t\t .fire('moveend')\n\t\t .fire('dragend', e);\n\t}\n});\n\n\n/*\r\n * L.Control is a base class for implementing map controls. Handles positioning.\r\n * All other controls extend from this class.\r\n */\r\n\r\nL.Control = L.Class.extend({\r\n\toptions: {\r\n\t\tposition: 'topright'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tgetPosition: function () {\r\n\t\treturn this.options.position;\r\n\t},\r\n\r\n\tsetPosition: function (position) {\r\n\t\tvar map = this._map;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.removeControl(this);\r\n\t\t}\r\n\r\n\t\tthis.options.position = position;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.addControl(this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tvar container = this._container = this.onAdd(map),\r\n\t\t pos = this.getPosition(),\r\n\t\t corner = map._controlCorners[pos];\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-control');\r\n\r\n\t\tif (pos.indexOf('bottom') !== -1) {\r\n\t\t\tcorner.insertBefore(container, corner.firstChild);\r\n\t\t} else {\r\n\t\t\tcorner.appendChild(container);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveFrom: function (map) {\r\n\t\tvar pos = this.getPosition(),\r\n\t\t corner = map._controlCorners[pos];\r\n\r\n\t\tcorner.removeChild(this._container);\r\n\t\tthis._map = null;\r\n\r\n\t\tif (this.onRemove) {\r\n\t\t\tthis.onRemove(map);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_refocusOnMap: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.getContainer().focus();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.control = function (options) {\r\n\treturn new L.Control(options);\r\n};\r\n\r\n\r\n// adds control-related methods to L.Map\r\n\r\nL.Map.include({\r\n\taddControl: function (control) {\r\n\t\tcontrol.addTo(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveControl: function (control) {\r\n\t\tcontrol.removeFrom(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initControlPos: function () {\r\n\t\tvar corners = this._controlCorners = {},\r\n\t\t l = 'leaflet-',\r\n\t\t container = this._controlContainer =\r\n\t\t L.DomUtil.create('div', l + 'control-container', this._container);\r\n\r\n\t\tfunction createCorner(vSide, hSide) {\r\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\r\n\r\n\t\t\tcorners[vSide + hSide] = L.DomUtil.create('div', className, container);\r\n\t\t}\r\n\r\n\t\tcreateCorner('top', 'left');\r\n\t\tcreateCorner('top', 'right');\r\n\t\tcreateCorner('bottom', 'left');\r\n\t\tcreateCorner('bottom', 'right');\r\n\t},\r\n\r\n\t_clearControlPos: function () {\r\n\t\tthis._container.removeChild(this._controlContainer);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.Control.Zoom is used for the default zoom buttons on the map.\r\n */\r\n\r\nL.Control.Zoom = L.Control.extend({\r\n\toptions: {\r\n\t\tposition: 'topleft',\r\n\t\tzoomInText: '+',\r\n\t\tzoomInTitle: 'Zoom in',\r\n\t\tzoomOutText: '-',\r\n\t\tzoomOutTitle: 'Zoom out'\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tvar zoomName = 'leaflet-control-zoom',\r\n\t\t container = L.DomUtil.create('div', zoomName + ' leaflet-bar');\r\n\r\n\t\tthis._map = map;\r\n\r\n\t\tthis._zoomInButton = this._createButton(\r\n\t\t this.options.zoomInText, this.options.zoomInTitle,\r\n\t\t zoomName + '-in', container, this._zoomIn, this);\r\n\t\tthis._zoomOutButton = this._createButton(\r\n\t\t this.options.zoomOutText, this.options.zoomOutTitle,\r\n\t\t zoomName + '-out', container, this._zoomOut, this);\r\n\r\n\t\tthis._updateDisabled();\r\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\t},\r\n\r\n\t_zoomIn: function (e) {\r\n\t\tthis._map.zoomIn(e.shiftKey ? 3 : 1);\r\n\t},\r\n\r\n\t_zoomOut: function (e) {\r\n\t\tthis._map.zoomOut(e.shiftKey ? 3 : 1);\r\n\t},\r\n\r\n\t_createButton: function (html, title, className, container, fn, context) {\r\n\t\tvar link = L.DomUtil.create('a', className, container);\r\n\t\tlink.innerHTML = html;\r\n\t\tlink.href = '#';\r\n\t\tlink.title = title;\r\n\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tL.DomEvent\r\n\t\t .on(link, 'click', stop)\r\n\t\t .on(link, 'mousedown', stop)\r\n\t\t .on(link, 'dblclick', stop)\r\n\t\t .on(link, 'click', L.DomEvent.preventDefault)\r\n\t\t .on(link, 'click', fn, context)\r\n\t\t .on(link, 'click', this._refocusOnMap, context);\r\n\r\n\t\treturn link;\r\n\t},\r\n\r\n\t_updateDisabled: function () {\r\n\t\tvar map = this._map,\r\n\t\t\tclassName = 'leaflet-disabled';\r\n\r\n\t\tL.DomUtil.removeClass(this._zoomInButton, className);\r\n\t\tL.DomUtil.removeClass(this._zoomOutButton, className);\r\n\r\n\t\tif (map._zoom === map.getMinZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomOutButton, className);\r\n\t\t}\r\n\t\tif (map._zoom === map.getMaxZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomInButton, className);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.mergeOptions({\r\n\tzoomControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.zoomControl) {\r\n\t\tthis.zoomControl = new L.Control.Zoom();\r\n\t\tthis.addControl(this.zoomControl);\r\n\t}\r\n});\r\n\r\nL.control.zoom = function (options) {\r\n\treturn new L.Control.Zoom(options);\r\n};\r\n\r\n\n\n/*\r\n * L.Control.Attribution is used for displaying attribution on the map (added by default).\r\n */\r\n\r\nL.Control.Attribution = L.Control.extend({\r\n\toptions: {\r\n\t\tposition: 'bottomright',\r\n\t\tprefix: '<a href=\"http://leafletjs.com\" title=\"A JS library for interactive maps\">Leaflet</a>'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._attributions = {};\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-control-attribution');\r\n\t\tL.DomEvent.disableClickPropagation(this._container);\r\n\r\n\t\tfor (var i in map._layers) {\r\n\t\t\tif (map._layers[i].getAttribution) {\r\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tmap\r\n\t\t .on('layeradd', this._onLayerAdd, this)\r\n\t\t .on('layerremove', this._onLayerRemove, this);\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t .off('layeradd', this._onLayerAdd)\r\n\t\t .off('layerremove', this._onLayerRemove);\r\n\r\n\t},\r\n\r\n\tsetPrefix: function (prefix) {\r\n\t\tthis.options.prefix = prefix;\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddAttribution: function (text) {\r\n\t\tif (!text) { return; }\r\n\r\n\t\tif (!this._attributions[text]) {\r\n\t\t\tthis._attributions[text] = 0;\r\n\t\t}\r\n\t\tthis._attributions[text]++;\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveAttribution: function (text) {\r\n\t\tif (!text) { return; }\r\n\r\n\t\tif (this._attributions[text]) {\r\n\t\t\tthis._attributions[text]--;\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar attribs = [];\r\n\r\n\t\tfor (var i in this._attributions) {\r\n\t\t\tif (this._attributions[i]) {\r\n\t\t\t\tattribs.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar prefixAndAttribs = [];\r\n\r\n\t\tif (this.options.prefix) {\r\n\t\t\tprefixAndAttribs.push(this.options.prefix);\r\n\t\t}\r\n\t\tif (attribs.length) {\r\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\r\n\t\t}\r\n\r\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' | ');\r\n\t},\r\n\r\n\t_onLayerAdd: function (e) {\r\n\t\tif (e.layer.getAttribution) {\r\n\t\t\tthis.addAttribution(e.layer.getAttribution());\r\n\t\t}\r\n\t},\r\n\r\n\t_onLayerRemove: function (e) {\r\n\t\tif (e.layer.getAttribution) {\r\n\t\t\tthis.removeAttribution(e.layer.getAttribution());\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.mergeOptions({\r\n\tattributionControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.attributionControl) {\r\n\t\tthis.attributionControl = (new L.Control.Attribution()).addTo(this);\r\n\t}\r\n});\r\n\r\nL.control.attribution = function (options) {\r\n\treturn new L.Control.Attribution(options);\r\n};\r\n\n\n/*\n * L.Control.Scale is used for displaying metric/imperial scale on the map.\n */\n\nL.Control.Scale = L.Control.extend({\n\toptions: {\n\t\tposition: 'bottomleft',\n\t\tmaxWidth: 100,\n\t\tmetric: true,\n\t\timperial: true,\n\t\tupdateWhenIdle: false\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\n\t\tvar className = 'leaflet-control-scale',\n\t\t container = L.DomUtil.create('div', className),\n\t\t options = this.options;\n\n\t\tthis._addScales(options, className, container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar bounds = this._map.getBounds(),\n\t\t centerLat = bounds.getCenter().lat,\n\t\t halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),\n\t\t dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,\n\n\t\t size = this._map.getSize(),\n\t\t options = this.options,\n\t\t maxMeters = 0;\n\n\t\tif (size.x > 0) {\n\t\t\tmaxMeters = dist * (options.maxWidth / size.x);\n\t\t}\n\n\t\tthis._updateScales(options, maxMeters);\n\t},\n\n\t_updateScales: function (options, maxMeters) {\n\t\tif (options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\n\t\tif (options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters);\n\n\t\tthis._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px';\n\t\tthis._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t scale = this._iScale,\n\t\t maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\n\t\t\tscale.style.width = this._getScaleWidth(miles / maxMiles) + 'px';\n\t\t\tscale.innerHTML = miles + ' mi';\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\n\t\t\tscale.style.width = this._getScaleWidth(feet / maxFeet) + 'px';\n\t\t\tscale.innerHTML = feet + ' ft';\n\t\t}\n\t},\n\n\t_getScaleWidth: function (ratio) {\n\t\treturn Math.round(this.options.maxWidth * ratio) - 10;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t d = num / pow10;\n\n\t\td = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\nL.control.scale = function (options) {\n\treturn new L.Control.Scale(options);\n};\n\n\n/*\r\n * L.Control.Layers is a control to allow users to switch between different layers on the map.\r\n */\r\n\r\nL.Control.Layers = L.Control.extend({\r\n\toptions: {\r\n\t\tcollapsed: true,\r\n\t\tposition: 'topright',\r\n\t\tautoZIndex: true\r\n\t},\r\n\r\n\tinitialize: function (baseLayers, overlays, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\t\tthis._lastZIndex = 0;\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tfor (var i in baseLayers) {\r\n\t\t\tthis._addLayer(baseLayers[i], i);\r\n\t\t}\r\n\r\n\t\tfor (i in overlays) {\r\n\t\t\tthis._addLayer(overlays[i], i, true);\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._initLayout();\r\n\t\tthis._update();\r\n\r\n\t\tmap\r\n\t\t .on('layeradd', this._onLayerChange, this)\r\n\t\t .on('layerremove', this._onLayerChange, this);\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t .off('layeradd', this._onLayerChange)\r\n\t\t .off('layerremove', this._onLayerChange);\r\n\t},\r\n\r\n\taddBaseLayer: function (layer, name) {\r\n\t\tthis._addLayer(layer, name);\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddOverlay: function (layer, name) {\r\n\t\tthis._addLayer(layer, name, true);\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = L.stamp(layer);\r\n\t\tdelete this._layers[id];\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar className = 'leaflet-control-layers',\r\n\t\t container = this._container = L.DomUtil.create('div', className);\r\n\r\n\t\t//Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released\r\n\t\tcontainer.setAttribute('aria-haspopup', true);\r\n\r\n\t\tif (!L.Browser.touch) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.disableClickPropagation(container)\r\n\t\t\t\t.disableScrollPropagation(container);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);\r\n\t\t}\r\n\r\n\t\tvar form = this._form = L.DomUtil.create('form', className + '-list');\r\n\r\n\t\tif (this.options.collapsed) {\r\n\t\t\tif (!L.Browser.android) {\r\n\t\t\t\tL.DomEvent\r\n\t\t\t\t .on(container, 'mouseover', this._expand, this)\r\n\t\t\t\t .on(container, 'mouseout', this._collapse, this);\r\n\t\t\t}\r\n\t\t\tvar link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);\r\n\t\t\tlink.href = '#';\r\n\t\t\tlink.title = 'Layers';\r\n\r\n\t\t\tif (L.Browser.touch) {\r\n\t\t\t\tL.DomEvent\r\n\t\t\t\t .on(link, 'click', L.DomEvent.stop)\r\n\t\t\t\t .on(link, 'click', this._expand, this);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tL.DomEvent.on(link, 'focus', this._expand, this);\r\n\t\t\t}\r\n\t\t\t//Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033\r\n\t\t\tL.DomEvent.on(form, 'click', function () {\r\n\t\t\t\tsetTimeout(L.bind(this._onInputClick, this), 0);\r\n\t\t\t}, this);\r\n\r\n\t\t\tthis._map.on('click', this._collapse, this);\r\n\t\t\t// TODO keyboard accessibility\r\n\t\t} else {\r\n\t\t\tthis._expand();\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList = L.DomUtil.create('div', className + '-base', form);\r\n\t\tthis._separator = L.DomUtil.create('div', className + '-separator', form);\r\n\t\tthis._overlaysList = L.DomUtil.create('div', className + '-overlays', form);\r\n\r\n\t\tcontainer.appendChild(form);\r\n\t},\r\n\r\n\t_addLayer: function (layer, name, overlay) {\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tthis._layers[id] = {\r\n\t\t\tlayer: layer,\r\n\t\t\tname: name,\r\n\t\t\toverlay: overlay\r\n\t\t};\r\n\r\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\r\n\t\t\tthis._lastZIndex++;\r\n\t\t\tlayer.setZIndex(this._lastZIndex);\r\n\t\t}\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._container) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList.innerHTML = '';\r\n\t\tthis._overlaysList.innerHTML = '';\r\n\r\n\t\tvar baseLayersPresent = false,\r\n\t\t overlaysPresent = false,\r\n\t\t i, obj;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tobj = this._layers[i];\r\n\t\t\tthis._addItem(obj);\r\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\r\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\r\n\t\t}\r\n\r\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\r\n\t},\r\n\r\n\t_onLayerChange: function (e) {\r\n\t\tvar obj = this._layers[L.stamp(e.layer)];\r\n\r\n\t\tif (!obj) { return; }\r\n\r\n\t\tif (!this._handlingClick) {\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tvar type = obj.overlay ?\r\n\t\t\t(e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') :\r\n\t\t\t(e.type === 'layeradd' ? 'baselayerchange' : null);\r\n\r\n\t\tif (type) {\r\n\t\t\tthis._map.fire(type, obj);\r\n\t\t}\r\n\t},\r\n\r\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)\r\n\t_createRadioElement: function (name, checked) {\r\n\r\n\t\tvar radioHtml = '<input type=\"radio\" class=\"leaflet-control-layers-selector\" name=\"' + name + '\"';\r\n\t\tif (checked) {\r\n\t\t\tradioHtml += ' checked=\"checked\"';\r\n\t\t}\r\n\t\tradioHtml += '/>';\r\n\r\n\t\tvar radioFragment = document.createElement('div');\r\n\t\tradioFragment.innerHTML = radioHtml;\r\n\r\n\t\treturn radioFragment.firstChild;\r\n\t},\r\n\r\n\t_addItem: function (obj) {\r\n\t\tvar label = document.createElement('label'),\r\n\t\t input,\r\n\t\t checked = this._map.hasLayer(obj.layer);\r\n\r\n\t\tif (obj.overlay) {\r\n\t\t\tinput = document.createElement('input');\r\n\t\t\tinput.type = 'checkbox';\r\n\t\t\tinput.className = 'leaflet-control-layers-selector';\r\n\t\t\tinput.defaultChecked = checked;\r\n\t\t} else {\r\n\t\t\tinput = this._createRadioElement('leaflet-base-layers', checked);\r\n\t\t}\r\n\r\n\t\tinput.layerId = L.stamp(obj.layer);\r\n\r\n\t\tL.DomEvent.on(input, 'click', this._onInputClick, this);\r\n\r\n\t\tvar name = document.createElement('span');\r\n\t\tname.innerHTML = ' ' + obj.name;\r\n\r\n\t\tlabel.appendChild(input);\r\n\t\tlabel.appendChild(name);\r\n\r\n\t\tvar container = obj.overlay ? this._overlaysList : this._baseLayersList;\r\n\t\tcontainer.appendChild(label);\r\n\r\n\t\treturn label;\r\n\t},\r\n\r\n\t_onInputClick: function () {\r\n\t\tvar i, input, obj,\r\n\t\t inputs = this._form.getElementsByTagName('input'),\r\n\t\t inputsLen = inputs.length;\r\n\r\n\t\tthis._handlingClick = true;\r\n\r\n\t\tfor (i = 0; i < inputsLen; i++) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tobj = this._layers[input.layerId];\r\n\r\n\t\t\tif (input.checked && !this._map.hasLayer(obj.layer)) {\r\n\t\t\t\tthis._map.addLayer(obj.layer);\r\n\r\n\t\t\t} else if (!input.checked && this._map.hasLayer(obj.layer)) {\r\n\t\t\t\tthis._map.removeLayer(obj.layer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tthis._refocusOnMap();\r\n\t},\r\n\r\n\t_expand: function () {\r\n\t\tL.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');\r\n\t},\r\n\r\n\t_collapse: function () {\r\n\t\tthis._container.className = this._container.className.replace(' leaflet-control-layers-expanded', '');\r\n\t}\r\n});\r\n\r\nL.control.layers = function (baseLayers, overlays, options) {\r\n\treturn new L.Control.Layers(baseLayers, overlays, options);\r\n};\r\n\n\n/*\n * L.PosAnimation is used by Leaflet internally for pan animations.\n */\n\nL.PosAnimation = L.Class.extend({\n\tincludes: L.Mixin.Events,\n\n\trun: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._newPos = newPos;\n\n\t\tthis.fire('start');\n\n\t\tel.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) +\n\t\t 's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)';\n\n\t\tL.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);\n\t\tL.DomUtil.setPosition(el, newPos);\n\n\t\t// toggle reflow, Chrome flickers for some reason if you don't do this\n\t\tL.Util.falseFn(el.offsetWidth);\n\n\t\t// there's no native way to track value updates of transitioned properties, so we imitate this\n\t\tthis._stepTimer = setInterval(L.bind(this._onStep, this), 50);\n\t},\n\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\t// if we just removed the transition property, the element would jump to its final position,\n\t\t// so we need to make it stay at the current position\n\n\t\tL.DomUtil.setPosition(this._el, this._getPos());\n\t\tthis._onTransitionEnd();\n\t\tL.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation\n\t},\n\n\t_onStep: function () {\n\t\tvar stepPos = this._getPos();\n\t\tif (!stepPos) {\n\t\t\tthis._onTransitionEnd();\n\t\t\treturn;\n\t\t}\n\t\t// jshint camelcase: false\n\t\t// make L.DomUtil.getPosition return intermediate position value during animation\n\t\tthis._el._leaflet_pos = stepPos;\n\n\t\tthis.fire('step');\n\t},\n\n\t// you can't easily get intermediate values of properties animated with CSS3 Transitions,\n\t// we need to parse computed style (in case of transform it returns matrix string)\n\n\t_transformRe: /([-+]?(?:\\d*\\.)?\\d+)\\D*, ([-+]?(?:\\d*\\.)?\\d+)\\D*\\)/,\n\n\t_getPos: function () {\n\t\tvar left, top, matches,\n\t\t el = this._el,\n\t\t style = window.getComputedStyle(el);\n\n\t\tif (L.Browser.any3d) {\n\t\t\tmatches = style[L.DomUtil.TRANSFORM].match(this._transformRe);\n\t\t\tif (!matches) { return; }\n\t\t\tleft = parseFloat(matches[1]);\n\t\t\ttop = parseFloat(matches[2]);\n\t\t} else {\n\t\t\tleft = parseFloat(style.left);\n\t\t\ttop = parseFloat(style.top);\n\t\t}\n\n\t\treturn new L.Point(left, top, true);\n\t},\n\n\t_onTransitionEnd: function () {\n\t\tL.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);\n\n\t\tif (!this._inProgress) { return; }\n\t\tthis._inProgress = false;\n\n\t\tthis._el.style[L.DomUtil.TRANSITION] = '';\n\n\t\t// jshint camelcase: false\n\t\t// make sure L.DomUtil.getPosition returns the final position value after animation\n\t\tthis._el._leaflet_pos = this._newPos;\n\n\t\tclearInterval(this._stepTimer);\n\n\t\tthis.fire('step').fire('end');\n\t}\n\n});\n\n\n/*\n * Extends L.Map to handle panning animations.\n */\n\nL.Map.include({\n\n\tsetView: function (center, zoom, options) {\n\n\t\tzoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);\n\t\tcenter = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);\n\t\toptions = options || {};\n\n\t\tif (this._panAnim) {\n\t\t\tthis._panAnim.stop();\n\t\t}\n\n\t\tif (this._loaded && !options.reset && options !== true) {\n\n\t\t\tif (options.animate !== undefined) {\n\t\t\t\toptions.zoom = L.extend({animate: options.animate}, options.zoom);\n\t\t\t\toptions.pan = L.extend({animate: options.animate}, options.pan);\n\t\t\t}\n\n\t\t\t// try animating pan or zoom\n\t\t\tvar animated = (this._zoom !== zoom) ?\n\t\t\t\tthis._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :\n\t\t\t\tthis._tryAnimatedPan(center, options.pan);\n\n\t\t\tif (animated) {\n\t\t\t\t// prevent resize handler call, the view will refresh after animation anyway\n\t\t\t\tclearTimeout(this._sizeTimer);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// animation didn't start, just reset the map view\n\t\tthis._resetView(center, zoom);\n\n\t\treturn this;\n\t},\n\n\tpanBy: function (offset, options) {\n\t\toffset = L.point(offset).round();\n\t\toptions = options || {};\n\n\t\tif (!offset.x && !offset.y) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!this._panAnim) {\n\t\t\tthis._panAnim = new L.PosAnimation();\n\n\t\t\tthis._panAnim.on({\n\t\t\t\t'step': this._onPanTransitionStep,\n\t\t\t\t'end': this._onPanTransitionEnd\n\t\t\t}, this);\n\t\t}\n\n\t\t// don't fire movestart if animating inertia\n\t\tif (!options.noMoveStart) {\n\t\t\tthis.fire('movestart');\n\t\t}\n\n\t\t// animate pan unless animate: false specified\n\t\tif (options.animate !== false) {\n\t\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');\n\n\t\t\tvar newPos = this._getMapPanePos().subtract(offset);\n\t\t\tthis._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);\n\t\t} else {\n\t\t\tthis._rawPanBy(offset);\n\t\t\tthis.fire('move').fire('moveend');\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_onPanTransitionStep: function () {\n\t\tthis.fire('move');\n\t},\n\n\t_onPanTransitionEnd: function () {\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');\n\t\tthis.fire('moveend');\n\t},\n\n\t_tryAnimatedPan: function (center, options) {\n\t\t// difference between the new and current centers in pixels\n\t\tvar offset = this._getCenterOffset(center)._floor();\n\n\t\t// don't animate too far unless animate: true specified in options\n\t\tif ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tthis.panBy(offset, options);\n\n\t\treturn true;\n\t}\n});\n\n\n/*\n * L.PosAnimation fallback implementation that powers Leaflet pan animations\n * in browsers that don't support CSS3 Transitions.\n */\n\nL.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({\n\n\trun: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._duration = duration || 0.25;\n\t\tthis._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);\n\n\t\tthis._startPos = L.DomUtil.getPosition(el);\n\t\tthis._offset = newPos.subtract(this._startPos);\n\t\tthis._startTime = +new Date();\n\n\t\tthis.fire('start');\n\n\t\tthis._animate();\n\t},\n\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\tthis._step();\n\t\tthis._complete();\n\t},\n\n\t_animate: function () {\n\t\t// animation loop\n\t\tthis._animId = L.Util.requestAnimFrame(this._animate, this);\n\t\tthis._step();\n\t},\n\n\t_step: function () {\n\t\tvar elapsed = (+new Date()) - this._startTime,\n\t\t duration = this._duration * 1000;\n\n\t\tif (elapsed < duration) {\n\t\t\tthis._runFrame(this._easeOut(elapsed / duration));\n\t\t} else {\n\t\t\tthis._runFrame(1);\n\t\t\tthis._complete();\n\t\t}\n\t},\n\n\t_runFrame: function (progress) {\n\t\tvar pos = this._startPos.add(this._offset.multiplyBy(progress));\n\t\tL.DomUtil.setPosition(this._el, pos);\n\n\t\tthis.fire('step');\n\t},\n\n\t_complete: function () {\n\t\tL.Util.cancelAnimFrame(this._animId);\n\n\t\tthis._inProgress = false;\n\t\tthis.fire('end');\n\t},\n\n\t_easeOut: function (t) {\n\t\treturn 1 - Math.pow(1 - t, this._easeOutPower);\n\t}\n});\n\n\n/*\n * Extends L.Map to handle zoom animations.\n */\n\nL.Map.mergeOptions({\n\tzoomAnimation: true,\n\tzoomAnimationThreshold: 4\n});\n\nif (L.DomUtil.TRANSITION) {\n\n\tL.Map.addInitHook(function () {\n\t\t// don't animate on browsers without hardware-accelerated transitions or old Android/Opera\n\t\tthis._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION &&\n\t\t\t\tL.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera;\n\n\t\t// zoom transitions run with the same duration for all layers, so if one of transitionend events\n\t\t// happens after starting zoom animation (propagating to the map pane), we know that it ended globally\n\t\tif (this._zoomAnimated) {\n\t\t\tL.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);\n\t\t}\n\t});\n}\n\nL.Map.include(!L.DomUtil.TRANSITION ? {} : {\n\n\t_catchTransitionEnd: function (e) {\n\t\tif (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {\n\t\t\tthis._onZoomTransitionEnd();\n\t\t}\n\t},\n\n\t_nothingToAnimate: function () {\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\n\t},\n\n\t_tryAnimatedZoom: function (center, zoom, options) {\n\n\t\tif (this._animatingZoom) { return true; }\n\n\t\toptions = options || {};\n\n\t\t// don't animate if disabled, not supported or zoom difference is too large\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\n\t\t Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\n\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\n\t\tvar scale = this.getZoomScale(zoom),\n\t\t offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale),\n\t\t\torigin = this._getCenterLayerPoint()._add(offset);\n\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tthis\n\t\t .fire('movestart')\n\t\t .fire('zoomstart');\n\n\t\tthis._animateZoom(center, zoom, origin, scale, null, true);\n\n\t\treturn true;\n\t},\n\n\t_animateZoom: function (center, zoom, origin, scale, delta, backwards) {\n\n\t\tthis._animatingZoom = true;\n\n\t\t// put transform transition on all layers with leaflet-zoom-animated class\n\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\t// remember what center/zoom to set after animation\n\t\tthis._animateToCenter = center;\n\t\tthis._animateToZoom = zoom;\n\n\t\t// disable any dragging during animation\n\t\tif (L.Draggable) {\n\t\t\tL.Draggable._disabled = true;\n\t\t}\n\n\t\tthis.fire('zoomanim', {\n\t\t\tcenter: center,\n\t\t\tzoom: zoom,\n\t\t\torigin: origin,\n\t\t\tscale: scale,\n\t\t\tdelta: delta,\n\t\t\tbackwards: backwards\n\t\t});\n\t},\n\n\t_onZoomTransitionEnd: function () {\n\n\t\tthis._animatingZoom = false;\n\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\tthis._resetView(this._animateToCenter, this._animateToZoom, true, true);\n\n\t\tif (L.Draggable) {\n\t\t\tL.Draggable._disabled = false;\n\t\t}\n\t}\n});\n\n\n/*\n\tZoom animation logic for L.TileLayer.\n*/\n\nL.TileLayer.include({\n\t_animateZoom: function (e) {\n\t\tif (!this._animating) {\n\t\t\tthis._animating = true;\n\t\t\tthis._prepareBgBuffer();\n\t\t}\n\n\t\tvar bg = this._bgBuffer,\n\t\t transform = L.DomUtil.TRANSFORM,\n\t\t initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform],\n\t\t scaleStr = L.DomUtil.getScaleString(e.scale, e.origin);\n\n\t\tbg.style[transform] = e.backwards ?\n\t\t\t\tscaleStr + ' ' + initialTransform :\n\t\t\t\tinitialTransform + ' ' + scaleStr;\n\t},\n\n\t_endZoomAnim: function () {\n\t\tvar front = this._tileContainer,\n\t\t bg = this._bgBuffer;\n\n\t\tfront.style.visibility = '';\n\t\tfront.parentNode.appendChild(front); // Bring to fore\n\n\t\t// force reflow\n\t\tL.Util.falseFn(bg.offsetWidth);\n\n\t\tthis._animating = false;\n\t},\n\n\t_clearBgBuffer: function () {\n\t\tvar map = this._map;\n\n\t\tif (map && !map._animatingZoom && !map.touchZoom._zooming) {\n\t\t\tthis._bgBuffer.innerHTML = '';\n\t\t\tthis._bgBuffer.style[L.DomUtil.TRANSFORM] = '';\n\t\t}\n\t},\n\n\t_prepareBgBuffer: function () {\n\n\t\tvar front = this._tileContainer,\n\t\t bg = this._bgBuffer;\n\n\t\t// if foreground layer doesn't have many tiles but bg layer does,\n\t\t// keep the existing bg layer and just zoom it some more\n\n\t\tvar bgLoaded = this._getLoadedTilesPercentage(bg),\n\t\t frontLoaded = this._getLoadedTilesPercentage(front);\n\n\t\tif (bg && bgLoaded > 0.5 && frontLoaded < 0.5) {\n\n\t\t\tfront.style.visibility = 'hidden';\n\t\t\tthis._stopLoadingImages(front);\n\t\t\treturn;\n\t\t}\n\n\t\t// prepare the buffer to become the front tile pane\n\t\tbg.style.visibility = 'hidden';\n\t\tbg.style[L.DomUtil.TRANSFORM] = '';\n\n\t\t// switch out the current layer to be the new bg layer (and vice-versa)\n\t\tthis._tileContainer = bg;\n\t\tbg = this._bgBuffer = front;\n\n\t\tthis._stopLoadingImages(bg);\n\n\t\t//prevent bg buffer from clearing right after zoom\n\t\tclearTimeout(this._clearBgBufferTimer);\n\t},\n\n\t_getLoadedTilesPercentage: function (container) {\n\t\tvar tiles = container.getElementsByTagName('img'),\n\t\t i, len, count = 0;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\tif (tiles[i].complete) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count / len;\n\t},\n\n\t// stops loading all tiles in the background layer\n\t_stopLoadingImages: function (container) {\n\t\tvar tiles = Array.prototype.slice.call(container.getElementsByTagName('img')),\n\t\t i, len, tile;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\ttile = tiles[i];\n\n\t\t\tif (!tile.complete) {\n\t\t\t\ttile.onload = L.Util.falseFn;\n\t\t\t\ttile.onerror = L.Util.falseFn;\n\t\t\t\ttile.src = L.Util.emptyImageUrl;\n\n\t\t\t\ttile.parentNode.removeChild(tile);\n\t\t\t}\n\t\t}\n\t}\n});\n\n\n/*\r\n * Provides L.Map with convenient shortcuts for using browser geolocation features.\r\n */\r\n\r\nL.Map.include({\r\n\t_defaultLocateOptions: {\r\n\t\twatch: false,\r\n\t\tsetView: false,\r\n\t\tmaxZoom: Infinity,\r\n\t\ttimeout: 10000,\r\n\t\tmaximumAge: 0,\r\n\t\tenableHighAccuracy: false\r\n\t},\r\n\r\n\tlocate: function (/*Object*/ options) {\r\n\r\n\t\toptions = this._locateOptions = L.extend(this._defaultLocateOptions, options);\r\n\r\n\t\tif (!navigator.geolocation) {\r\n\t\t\tthis._handleGeolocationError({\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'Geolocation not supported.'\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar onResponse = L.bind(this._handleGeolocationResponse, this),\r\n\t\t\tonError = L.bind(this._handleGeolocationError, this);\r\n\r\n\t\tif (options.watch) {\r\n\t\t\tthis._locationWatchId =\r\n\t\t\t navigator.geolocation.watchPosition(onResponse, onError, options);\r\n\t\t} else {\r\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstopLocate: function () {\r\n\t\tif (navigator.geolocation) {\r\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\r\n\t\t}\r\n\t\tif (this._locateOptions) {\r\n\t\t\tthis._locateOptions.setView = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_handleGeolocationError: function (error) {\r\n\t\tvar c = error.code,\r\n\t\t message = error.message ||\r\n\t\t (c === 1 ? 'permission denied' :\r\n\t\t (c === 2 ? 'position unavailable' : 'timeout'));\r\n\r\n\t\tif (this._locateOptions.setView && !this._loaded) {\r\n\t\t\tthis.fitWorld();\r\n\t\t}\r\n\r\n\t\tthis.fire('locationerror', {\r\n\t\t\tcode: c,\r\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\r\n\t\t});\r\n\t},\r\n\r\n\t_handleGeolocationResponse: function (pos) {\r\n\t\tvar lat = pos.coords.latitude,\r\n\t\t lng = pos.coords.longitude,\r\n\t\t latlng = new L.LatLng(lat, lng),\r\n\r\n\t\t latAccuracy = 180 * pos.coords.accuracy / 40075017,\r\n\t\t lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat),\r\n\r\n\t\t bounds = L.latLngBounds(\r\n\t\t [lat - latAccuracy, lng - lngAccuracy],\r\n\t\t [lat + latAccuracy, lng + lngAccuracy]),\r\n\r\n\t\t options = this._locateOptions;\r\n\r\n\t\tif (options.setView) {\r\n\t\t\tvar zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom);\r\n\t\t\tthis.setView(latlng, zoom);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tbounds: bounds,\r\n\t\t\ttimestamp: pos.timestamp\r\n\t\t};\r\n\r\n\t\tfor (var i in pos.coords) {\r\n\t\t\tif (typeof pos.coords[i] === 'number') {\r\n\t\t\t\tdata[i] = pos.coords[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.fire('locationfound', data);\r\n\t}\r\n});\r\n\n\n}(window, document));","/*\n * L.TileLayer.Zoomify display Zoomify tiles with Leaflet\n * https://github.com/turban/Leaflet.Zoomify\n */\n\nL.TileLayer.Zoomify = L.TileLayer.extend({\n\toptions: {\n\t\tcontinuousWorld: true,\n\t\ttolerance: 0.8\n\t},\n\n\tinitialize: function (url, options) {\n\t\toptions = L.setOptions(this, options);\n\t\tthis._url = url;\n\n \tvar imageSize = L.point(options.width, options.height),\n\t \ttileSize = options.tileSize;\n\n \tthis._imageSize = [imageSize];\n \tthis._gridSize = [this._getGridSize(imageSize)];\n\n while (parseInt(imageSize.x) > tileSize || parseInt(imageSize.y) > tileSize) {\n \timageSize = imageSize.divideBy(2).floor();\n \tthis._imageSize.push(imageSize);\n \tthis._gridSize.push(this._getGridSize(imageSize));\n }\n\n\t\tthis._imageSize.reverse();\n\t\tthis._gridSize.reverse();\n\n this.options.maxZoom = this._gridSize.length - 1;\n\t},\n\n\tonAdd: function (map) {\n\t\tL.TileLayer.prototype.onAdd.call(this, map);\n\n\t\tvar mapSize = map.getSize(),\n\t\t\tzoom = this._getBestFitZoom(mapSize),\n\t\t\timageSize = this._imageSize[zoom],\n\t\t\tcenter = map.options.crs.pointToLatLng(L.point(imageSize.x / 2, imageSize.y / 2), zoom);\n\n\t\tmap.setView(center, zoom, true);\n\t},\n\n\t_getGridSize: function (imageSize) {\n\t\tvar tileSize = this.options.tileSize;\n\t\treturn L.point(Math.ceil(imageSize.x / tileSize), Math.ceil(imageSize.y / tileSize));\n\t},\n\n\t_getBestFitZoom: function (mapSize) {\n\t\tvar tolerance = this.options.tolerance,\n\t\t\tzoom = this._imageSize.length - 1,\n\t\t\timageSize, zoom;\n\n\t\twhile (zoom) {\n\t\t\timageSize = this._imageSize[zoom];\n\t\t\tif (imageSize.x * tolerance < mapSize.x && imageSize.y * tolerance < mapSize.y) {\n\t\t\t\treturn zoom;\n\t\t\t}\t\t\t\n\t\t\tzoom--;\n\t\t}\n\n\t\treturn zoom;\n\t},\n\n\t_tileShouldBeLoaded: function (tilePoint) {\n\t\tvar gridSize = this._gridSize[this._map.getZoom()];\n\t\treturn (tilePoint.x >= 0 && tilePoint.x < gridSize.x && tilePoint.y >= 0 && tilePoint.y < gridSize.y);\n\t},\n\n\t_addTile: function (tilePoint, container) {\n\t\tvar tilePos = this._getTilePos(tilePoint),\n\t\t\ttile = this._getTile(),\n\t\t\tzoom = this._map.getZoom(),\n\t\t\timageSize = this._imageSize[zoom],\n\t\t\tgridSize = this._gridSize[zoom],\n\t\t\ttileSize = this.options.tileSize;\n\n\t\tif (tilePoint.x === gridSize.x - 1) {\n\t\t\ttile.style.width = imageSize.x - (tileSize * (gridSize.x - 1)) + 'px';\n\t\t} \n\n\t\tif (tilePoint.y === gridSize.y - 1) {\n\t\t\ttile.style.height = imageSize.y - (tileSize * (gridSize.y - 1)) + 'px';\t\t\t\n\t\t} \n\n\t\tL.DomUtil.setPosition(tile, tilePos, L.Browser.chrome || L.Browser.android23);\n\n\t\tthis._tiles[tilePoint.x + ':' + tilePoint.y] = tile;\n\t\tthis._loadTile(tile, tilePoint);\n\n\t\tif (tile.parentNode !== this._tileContainer) {\n\t\t\tcontainer.appendChild(tile);\n\t\t}\n\t},\n\n\tgetTileUrl: function (tilePoint) {\n\t\treturn this._url + '/TileGroup' + this._getTileGroup(tilePoint) + '/' + this._map.getZoom() + '-' + tilePoint.x + '-' + tilePoint.y + '.jpg';\n\t},\n\n\t_getTileGroup: function (tilePoint) {\n\t\tvar zoom = this._map.getZoom(),\n\t\t\tnum = 0,\n\t\t\tgridSize;\n\n\t\tfor (z = 0; z < zoom; z++) {\n\t\t\tgridSize = this._gridSize[z];\n\t\t\tnum += gridSize.x * gridSize.y; \n\t\t}\t\n\n\t\tnum += tilePoint.y * this._gridSize[zoom].x + tilePoint.x;\n \treturn Math.floor(num / 256);;\n\t}\n\n});\n\nL.tileLayer.zoomify = function (url, options) {\n\treturn new L.TileLayer.Zoomify(url, options);\n};\n","/**\n * Netx extensions to Leaflet (http://leafletjs.com/) with Zoomify extension (https://github.com/turban/Leaflet.Zoomify):\n * \n * We need a cache-buster on the <img> tags that refer to tiles, so that updates can flush the brower's tile cache without a reload.\n *\n * From within L.TileLayer.Zoomify, we have no reference to the asset in question in order to know if it needs flushing.\n * In theory assetZoomView has a reference to this instance via its L.Map instance, but it's not clear exactly where that lives.\n *\n * Currently, since we create a new instance with every zoom, we will get a new auto-generated cachebuster string every\n * time we zoom, which is all we need. If ever in the future we wish to re-use these instances, we'll need to call \n * .nxCacheBuster() on the instance whenever the tile cache should be invalidated (after checkin, reimport, resync or\n * any other operation that remakes an asset's zoom tiles.)\n */\n\n if (!L.Point.ceil) {\n\t/* \n\t * 20190402/DAM-15197/ecl\n\t * In initialize(), below, the original loop halved dimensions, rounding\n\t * DOWN. This causes all sorts of breakage because it miscalculates the\n\t * next zoom-level's dimension(s) as soon as it encounters an odd dimension.\n\t *\n\t * So we need to round up, not down.\n\t *\n\t * In Leaflet 1.4.0, Point.ceil() is defined, but it's not in Leaflet 0.7.7\n\t * (we're using * 0.7.2 as of today). So... let's monkey patch it!\n\t */\n\tL.Point.prototype.ceil = function () {\n\t\treturn this.clone()._ceil();\n\t};\n\tL.Point.prototype._ceil = function () {\n\t\tthis.x = Math.ceil(this.x);\n\t\tthis.y = Math.ceil(this.y);\n\t\treturn this;\n\t};\n}\n\n// localize titles\nObject.assign(L.Control.Zoom.prototype.options, {\n\tzoomInTitle: i18n.t('i18n.zoomIn'),\n\tzoomOutTitle: i18n.t('i18n.zoomOut'),\n});\n\n/**\n * \n *\n * @param {string} str cachebusting string; if not supplied, one will be generated based on the current time.\n * @returns {string} the new cache busting string\n */\nL.TileLayer.Zoomify.prototype.initialize = function(url, options){\n\toptions = L.setOptions(this, {\n\t\tzoomInTitle: i18n.t('i18n.zoomIn'),\n\t\tzoomOutTitle: i18n.t('i18n.zoomOut'),\n\t\t...options,\n\t});\n\tthis._url = url;\n\n\tvar imageSize = L.point(options.width, options.height),\n\t\ttileSize = options.tileSize;\n\n\tthis._imageSize = [imageSize];\n\tthis._gridSize = [this._getGridSize(imageSize)];\n\n\twhile (parseInt(imageSize.x) > tileSize || parseInt(imageSize.y) > tileSize) {\n\t\t// 20190402/DAM-15197/ecl - Don't drop tiles on the floor()!\n\t\timageSize = imageSize.divideBy(2).ceil();\n\t\tthis._imageSize.push(imageSize);\n\t\tthis._gridSize.push(this._getGridSize(imageSize));\n\t}\n\n\tthis._imageSize.reverse();\n\tthis._gridSize.reverse();\n\n\tthis.options.maxZoom = this._gridSize.length - 1;\n};\n/**\n * Update the cachebuster, to force cached tiles to be reloaded.\n *\n * @param {string} str cachebusting string; if not supplied, one will be generated based on the current time.\n * @returns {string} the new cache busting string\n */\nL.TileLayer.Zoomify.prototype._getTileGroup = function(tilePoint){\n\tvar zoom = this._map.getZoom(),\n\t\tnum = 0,\n\t\tgridSize;\n\n\tfor (var z = 0; z < zoom; z++) {\n\t\tgridSize = this._gridSize[z];\n\t\tnum += gridSize.x * gridSize.y; \n\t}\t\n\n\tnum += tilePoint.y * this._gridSize[zoom].x + tilePoint.x;\n \treturn Math.floor(num / 256);\n};\n\n/**\n * Add cachebuster to this method.\n * @returns {string} img src URL with cachebuster appended\n */\nL.TileLayer.Zoomify.prototype.getTileUrl = _.wrap(L.TileLayer.Zoomify.prototype.getTileUrl, function(getTileUrl){\n\tif (! this._nxCachebuster) {\n\t\tthis.nxSetCachebuster();\n\t}\n\treturn getTileUrl.apply(this, _.rest(arguments)) + '?rev=' + this._nxCachebuster;\n});\n\n/**\n * Update the cachebuster, to force cached tiles to be reloaded.\n *\n * @param {string} str cachebusting string; if not supplied, one will be generated based on the current time.\n * @returns {string} the new cache busting string\n */\nL.TileLayer.Zoomify.prototype.nxSetCachebuster = function(str){\n\tthis._nxCachebuster = str || new Date().valueOf().toString();\n\treturn this._nxCachebuster;\n};\n\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-category/templates/categoryGalleryView.html -->\\n<div class=\"flex-column-grid\">\\n\\n\t<div class=\"flex-row-grid\">\\n\\n\t\t<div id=\"flex-tree\" class=\"flex-column-grid container\">\\n\t\t\t<div class=\"desktop-only-flex flex-row-grid flex-justify-space flex-align-center\">\\n\t\t\t\t<div data-nx-control=\"breadcrumbs\" class=\"abbreviate crummy flex-row-grid nx-breadcrumbs flex-align-center\"></div>\\n\t\t\t\t<button data-nx-control=\"filters\" title=\"'+\n((__t=( i18n.t('i18n.filters') ))==null?'':__t)+\n'\" class=\"primary-color-hover\">'+\n((__t=( icons.faSlidersH ))==null?'':__t)+\n'</button>\\n\t\t\t</div>\\n\\n\t\t\t<div class=\"folders-facets-container flex-row-grid flex-justify-space\">\\n\t\t\t\t<div class=\"desktop-only\"><div id=\"category-tree\" class=\"item nx-tree\" data-nx-control=\"tree\"></div></div>\\n\\n\t\t\t\t<div class=\"nx-facets vertical-facets\" data-nx-control=\"facets\"></div>\\n\t\t\t</div>\\n\t\t</div>\\n\\n\t\t<div class=\"flex-column-grid container category-gallery-container\">\\n\\n\t\t\t<div id=\"category-list\" class=\"flex-column-grid nx-list\" data-nx-control=\"list\"></div>\\n\\n\t\t\t<header class=\"nx-header\" data-nx-control=\"header\"></header>\\n\\n\t\t\t<div id=\"category-assets\" class=\"flex-row-grid-wrap assets-list-wrapper nx-assets\"></div>\\n\t\t</div>\\n\\n\t</div>\\n\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-category/templates/categoryBreadCrumbView.html -->\\n';\n if(truncated) { \n__p+='\\n\\n<select class=\"nx-crumb-field selectpicker\">\\n\t<option class=\"crumb\" selected disabled hidden>...</option>\\n\t';\n _.each( crumbOverflow, function( crumb, idx, all ) { \n__p+='\\n\t<option value=\"'+\n((__t=( crumb.value ))==null?'':__t)+\n'\">'+\n((__t=( crumb.label ))==null?'':__t)+\n' /</option>\\n\t';\n } ); \n__p+='\\n\t<option value=\"'+\n((__t=( rootCat ))==null?'':__t)+\n'\"><span data-i18n=\"i18n.categories\">'+\n((__t=( i18n.t('i18n.categories') ))==null?'':_.escape(__t))+\n'</span> /</option>\\n</select>\\n\\n';\n } else { \n__p+='\\n<a data-i18n=\"category:i18n.categories\" href=\"#category/'+\n((__t=( rootCat ))==null?'':__t)+\n'\" class=\"crumb primary-color-hover\">Folders:</a>\\n';\n } \n__p+='\\n\\n<div class=\"expando-crumbs flex-row-grid\">\\n';\n\nif ( typeof breadcrumb !== \"undefined\" && breadcrumb.length){\n\t_.each(breadcrumb, function(crumb, i){\n\t\tif( _.isObject( crumb ) && window.location.hash == \"#category/\" + crumb.value ) {\n\n__p+='\\n\t\t\t<span class=\"separator\">/</span><span class=\"crumb'+\n((__t=( (breadcrumb.length === 1) ? ' single-crumb' : '' ))==null?'':__t)+\n'\" title=\"'+\n((__t=( crumb.label ))==null?'':__t)+\n'\">'+\n((__t=( crumb.label ))==null?'':__t)+\n'</span>\\n';\n\n\t\t} else {\n\n__p+='\\n\t\t';\n if( _.isObject( crumb ) ) { \n__p+='\\n\t\t\t<span class=\"separator\">/</span><a href=\"#category/'+\n((__t=( crumb.value ))==null?'':__t)+\n'\" class=\"crumb primary-color-hover\" title=\"'+\n((__t=( crumb.label ))==null?'':__t)+\n'\">'+\n((__t=( crumb.label ))==null?'':__t)+\n'</a>\\n\t\t';\n } else { \n__p+='\\n\t\t\t<span class=\"separator\">/</span><span class=\"text\" title=\"'+\n((__t=( crumb ))==null?'':__t)+\n'\">'+\n((__t=( crumb ))==null?'':__t)+\n'</span>\\n\t\t';\n } \n__p+='\\n';\n\n\t\t}\n\t});\n}\n\n__p+='\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-category/templates/categoryGalleryHeaderView.html -->\\n<header class=\"nx-header\">\\n\t<div class=\"list-actions-bar flex-row-grid flex-align-center flex-justify-space\">\\n\t\t<div class=\"flex-row-grid flex-align-center\">\\n\t\t\t<button \\n\t\t\t\tdata-nx-control=\"filters\" \\n\t\t\t\ttitle=\"'+\n((__t=( i18n.t('i18n.filters') ))==null?'':__t)+\n'\" \\n\t\t\t\tclass=\"mobile-only primary-color-hover\"\\n\t\t\t>\\n\t\t\t\t'+\n((__t=( icons.faSlidersH ))==null?'':__t)+\n'\\n\t\t\t</button>\\n\t\t\t<span class=\"asset-count nx-count\" data-count=\"0\">0</span>\\n\t\t\t<button class=\"checkbox inline selectAll nx-select-all\">\\n\t\t\t\t<label for=\"folderAddAll-'+\n((__t=( this.cid ))==null?'':__t)+\n'\"><span class=\"text\"> <span class=\"title primary-color-hover\" data-i18n=\"i18n.selectAll\">i18n.selectAll</span></span></label>\\n\t\t\t</button>\\n\t\t</div>\\n\t\t<div class=\"controls nx-sort flex-row-grid flex-align-center flex-justify-end\"></div>\\n\t</div>\\n</header>\\n';\n}\nreturn __p;\n};\n","//\n// Type data for the Feed model (aka CastBean)\n//\nlet X; // sugar for later\n\nexport let sourceTypes = {\n\tcategory: {\n\t\tid: 1,\n\t\tlabel: i18n.t('i18n.category'),\n\t\tautocomplete: 'category',\n\t},\n\tcart: {\n\t\tid: 2,\n\t\tlabel: i18n.t('i18n.savedCart'),\n\t\tautocomplete: 'cart',\n\t},\n\tsearch: {\n\t\tid: 3,\n\t\tlabel: i18n.t('i18n.savedSearch'),\n\t\tautocomplete: 'savedSearch',\n\t},\n\t// ,\n\t// DEVNOTE: the java server code also defines this type, but the Flex UI doesn't implement it & neither do we:\n\t// asset: {\n\t// \tid: 0,\n\t// \tlabel: i18n.t('i18n.asset')\n\t// },\n};\n\nexport let formatTypes = {\n\t// rss: 0, // vanilla rss. Not yet supported.\n\titunes: 1, // iTunes podcasts: the only one we support in X7 at the moment.\n\t// ,atom: 2, // probably obsolete. Not supported.\n\t// mrss: 3 // still used by MercyCorps. Not yet supported.\n};\n\n// Hierarchical iTunes Category tree.\n//\n// Canonical source: https://help.apple.com/itc/podcasts_connect/#/itc9267a2f12\n// This version translated from the YAML: https://gist.github.com/skattyadz/814315\n//\n// Each level is an object where the keys are hierarchy names, and the values are either\n// another object (containing sub-categories),\n// or undefined (no sub-categories defined).\n//\n// (X === undefined in this scope only.)\n//\nexport let iTunesCategories = {\n\tArts: {\n\t\tDesign: X,\n\t\t'Fashion & Beauty': X,\n\t\tFood: X,\n\t\tLiterature: X,\n\t\t'Performing Arts': X,\n\t\t'Spoken Word': X,\n\t\t'Visual Arts': X,\n\t},\n\n\tBusiness: {\n\t\t'Business News': X,\n\t\tCareers: X,\n\t\tInvesting: X,\n\t\t'Management & Marketing': X,\n\t\tShopping: X,\n\t},\n\n\tComedy: X,\n\n\tEducation: {\n\t\t'Educational Technology': X,\n\t\t'Higher Education': X,\n\t\t'K-12': X,\n\t\t'Language Courses': X,\n\t\tTraining: X,\n\t},\n\n\t'Games & Hobbies': {\n\t\tAutomotive: X,\n\t\tAviation: X,\n\t\tHobbies: X,\n\t\t'Other Games': X,\n\t\t'Video Games': X,\n\t},\n\n\t'Government & Organizations': {\n\t\tLocal: X,\n\t\tNational: X,\n\t\t'Non-Profit': X,\n\t\tRegional: X,\n\t},\n\n\tHealth: {\n\t\t'Alternative Health': X,\n\t\t'Fitness & Nutrition': X,\n\t\t'Self-Help': X,\n\t\tSexuality: X,\n\t\t'Kids & Family': X,\n\t},\n\n\tMusic: {\n\t\tAlternative: X,\n\t\tBlues: X,\n\t\tCountry: X,\n\t\t'Easy Listening': X,\n\t\tElectronic: {\n\t\t\t'Acid House': X,\n\t\t\tAmbient: X,\n\t\t\t'Big Beat': X,\n\t\t\tBreakbeat: X,\n\t\t\tDisco: X,\n\t\t\tDowntempo: X,\n\t\t\t\"Drum 'n' Bass\": X,\n\t\t\tGarage: X,\n\t\t\t'Hard House': X,\n\t\t\tHouse: X,\n\t\t\tIDM: X,\n\t\t\tJungle: X,\n\t\t\tProgressive: X,\n\t\t\tTechno: X,\n\t\t\tTrance: X,\n\t\t\tTribal: X,\n\t\t\t'Trip Hop': X,\n\t\t\t// TODO: File a bug with Apple to update this list, as it is missing Flubdub, Weak Sauce, Twerk, Snorklecore and many other important cultural milestones.\n\t\t\t// https://en.wikipedia.org/wiki/List_of_electronic_music_genres\n\t\t},\n\t\tFolk: X,\n\t\tFreeform: X,\n\t\t'Hip-Hop & Rap': X,\n\t\tInspirational: X,\n\t\tJazz: X,\n\t\tLatin: X,\n\t\tMetal: X,\n\t\t'New Age': X,\n\t\tOldies: X,\n\t\tPop: X,\n\t\t'R&B & Urban': X,\n\t\tReggae: X,\n\t\tRock: X,\n\t\t'Seasonal & Holiday': X,\n\t\tSoundtracks: X,\n\t\tWorld: X,\n\t},\n\t'News & Politics': {\n\t\t'Conservative (Right)': X,\n\t\t'Liberal (Left)': X,\n\t},\n\t'Religion & Spirituality': {\n\t\tBuddhism: X,\n\t\tChristianity: X,\n\t\tHinduism: X,\n\t\tIslam: X,\n\t\tJudaism: X,\n\t\tOther: X,\n\t\tSpirituality: X,\n\t},\n\t'Science & Medicine': {\n\t\tMedicine: X,\n\t\t'Natural Sciences': X,\n\t\t'Social Sciences': X,\n\t},\n\t'Society & Culture': {\n\t\t'Gay & Lesbian': X,\n\t\tHistory: X,\n\t\t'Personal Journals': X,\n\t\tPhilosophy: X,\n\t\t'Places & Travel': X,\n\t},\n\t'Sports & Recreation': {\n\t\tAmateur: X,\n\t\t'College & High School': X,\n\t\tOutdoor: X,\n\t\tProfessional: X,\n\t},\n\t'TV & Film': X,\n\tTechnology: {\n\t\tGadgets: X,\n\t\t'IT News': X,\n\t\tPodcasting: X,\n\t\t'Software How-To': X,\n\t},\n};\n\nexport default {sourceTypes, formatTypes, iTunesCategories};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/userShareView.html -->\\n<div class=\"container\">\\n\t<form id=\"user-share-view-form\" role=\"form\">\\n\t\t<div class=\"container-fluid\">\\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"'+\n((__t=( shareable.get('ids')[0] ))==null?'':_.escape(__t))+\n'\">\\n\t\t\t<input type=\"hidden\" name=\"shareTitle\" value=\"'+\n((__t=( Netx.ShareableTypes[shareable.get('type')].label ))==null?'':_.escape(__t))+\n'\">\\n\\n\t\t\t<div class=\"form-group\">\\n\t\t\t\t<label for=\"share-email\" data-i18n=\"share:i18n.shareWith\"></label>\\n\t\t\t\t<select id=\"share-email\" name=\"shareEmail\" data-placeholder=\"'+\n((__t=( i18n.t('share:i18n.userOrGroup', {defaultValue: 'User or group'} ) ))==null?'':_.escape(__t))+\n'\" data-autocomplete=\"user/group\"></select>\\n\t\t\t</div>\\n\t\t\t<div class=\"form-group\">\\n\t\t\t\t<label for=\"share-note\" data-i18n=\"share:i18n.notes\"></label>\\n\t\t\t\t<textarea id=\"share-note\" name=\"shareNote\" class=\"form-control\" placeholder=\"'+\n((__t=( i18n.t('share:i18n.notesPlaceholder', {defaultValue:'Enter notes here'}) ))==null?'':_.escape(__t))+\n'\"></textarea>\\n\t\t\t</div>\\n\t\t</div>\\n\t\t<footer>\\n\t\t\t<div class=\"actions\">\\n\t\t\t\t<aside>\\n\t\t\t\t\t<!-- <button type=\"button\" class=\"btn btn-default cancel nx-cancel\" data-nx-control=\"cancel\"><span class=\"text\" data-i18n=\"i18n.cancel\">i18n.cancel</span></button> -->\\n\t\t\t\t</aside>\\n\t\t\t\t<bside>\\n\t\t\t\t\t<button type=\"submit\" class=\"btn btn-save submit\" data-nx-control=\"save\"><span class=\"text\" data-i18n=\"i18n.send\">i18n.send</span></button>\\n\t\t\t\t</bside>\\n\t\t\t</div>\\n\t\t</footer>\\n\t</form>\\n</div>\\n';\n}\nreturn __p;\n};\n","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}\nmodule.exports = _toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar assertThisInitialized = require(\"./assertThisInitialized.js\");\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}\nmodule.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n return _getPrototypeOf(o);\n}\nmodule.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","/*!\n backgrid 0.3.8\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2017 Cloudflare, Inc. and contributors <jwong@cloudflare.com>\n Licensed under the MIT license.\n*/\n\n(function (root, factory) {\n\n if (typeof define === \"function\" && define.amd) {\n // AMD (+ global for extensions)\n define([\"underscore\", \"backbone\"], function (_, Backbone) {\n return (root.Backgrid = factory(_, Backbone));\n });\n } else if (typeof exports === \"object\") {\n // CommonJS\n module.exports = factory(require(\"underscore\"), require(\"backbone\"));\n } else {\n // Browser\n root.Backgrid = factory(root._, root.Backbone);\n }}(this, function (_, Backbone) {\n\n \"use strict\";\n\n/*\n backgrid\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc. and contributors\n Licensed under the MIT license.\n*/\n\n// Copyright 2009, 2010 Kristopher Michael Kowal\n// https://github.com/kriskowal/es5-shim\n// ES5 15.5.4.20\n// http://es5.github.com/#x15.5.4.20\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n // http://blog.stevenlevithan.com/archives/faster-trim-javascript\n // http://perfectionkills.com/whitespace-deviations/\n ws = \"[\" + ws + \"]\";\n var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n trimEndRegexp = new RegExp(ws + ws + \"*$\");\n String.prototype.trim = function trim() {\n if (this === undefined || this === null) {\n throw new TypeError(\"can't convert \" + this + \" to object\");\n }\n return String(this)\n .replace(trimBeginRegexp, \"\")\n .replace(trimEndRegexp, \"\");\n };\n}\n\nfunction lpad(str, length, padstr) {\n var paddingLen = length - (str + '').length;\n paddingLen = paddingLen < 0 ? 0 : paddingLen;\n var padding = '';\n for (var i = 0; i < paddingLen; i++) {\n padding = padding + padstr;\n }\n return padding + str;\n}\n\nvar $ = Backbone.$;\n\nvar Backgrid = {\n\n Extension: {},\n\n resolveNameToClass: function (name, suffix) {\n if (_.isString(name)) {\n var key = _.map(name.split('-'), function (e) {\n return e.slice(0, 1).toUpperCase() + e.slice(1);\n }).join('') + suffix;\n var klass = Backgrid[key] || Backgrid.Extension[key];\n if (_.isUndefined(klass)) {\n throw new ReferenceError(\"Class '\" + key + \"' not found\");\n }\n return klass;\n }\n\n return name;\n },\n\n callByNeed: function () {\n var value = arguments[0];\n if (!_.isFunction(value)) return value;\n\n var context = arguments[1];\n var args = [].slice.call(arguments, 2);\n return value.apply(context, !!(args + '') ? args : []);\n }\n\n};\n_.extend(Backgrid, Backbone.Events);\n\n/**\n Command translates a DOM Event into commands that Backgrid\n recognizes. Interested parties can listen on selected Backgrid events that\n come with an instance of this class and act on the commands.\n\n It is also possible to globally rebind the keyboard shortcuts by replacing\n the methods in this class' prototype.\n\n @class Backgrid.Command\n @constructor\n */\nvar Command = Backgrid.Command = function (evt) {\n _.extend(this, {\n altKey: !!evt.altKey,\n \"char\": evt[\"char\"],\n charCode: evt.charCode,\n ctrlKey: !!evt.ctrlKey,\n key: evt.key,\n keyCode: evt.keyCode,\n locale: evt.locale,\n location: evt.location,\n metaKey: !!evt.metaKey,\n repeat: !!evt.repeat,\n shiftKey: !!evt.shiftKey,\n which: evt.which\n });\n};\n_.extend(Command.prototype, {\n /**\n Up Arrow\n\n @member Backgrid.Command\n */\n moveUp: function () { return this.keyCode == 38; },\n /**\n Down Arrow\n\n @member Backgrid.Command\n */\n moveDown: function () { return this.keyCode === 40; },\n /**\n Shift Tab\n\n @member Backgrid.Command\n */\n moveLeft: function () { return this.shiftKey && this.keyCode === 9; },\n /**\n Tab\n\n @member Backgrid.Command\n */\n moveRight: function () { return !this.shiftKey && this.keyCode === 9; },\n /**\n Enter\n\n @member Backgrid.Command\n */\n save: function () { return this.keyCode === 13; },\n /**\n Esc\n\n @member Backgrid.Command\n */\n cancel: function () { return this.keyCode === 27; },\n /**\n None of the above.\n\n @member Backgrid.Command\n */\n passThru: function () {\n return !(this.moveUp() || this.moveDown() || this.moveLeft() ||\n this.moveRight() || this.save() || this.cancel());\n }\n});\n\n/*\n backgrid\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc. and contributors\n Licensed under the MIT license.\n*/\n\n/**\n Just a convenient class for interested parties to subclass.\n\n The default Cell classes don't require the formatter to be a subclass of\n Formatter as long as the fromRaw(rawData) and toRaw(formattedData) methods\n are defined.\n\n @abstract\n @class Backgrid.CellFormatter\n @constructor\n*/\nvar CellFormatter = Backgrid.CellFormatter = function () {};\n_.extend(CellFormatter.prototype, {\n\n /**\n Takes a raw value from a model and returns an optionally formatted string\n for display. The default implementation simply returns the supplied value\n as is without any type conversion.\n\n @member Backgrid.CellFormatter\n @param {*} rawData\n @param {Backbone.Model} model Used for more complicated formatting\n @return {*}\n */\n fromRaw: function (rawData, model) {\n return rawData;\n },\n\n /**\n Takes a formatted string, usually from user input, and returns a\n appropriately typed value for persistence in the model.\n\n If the user input is invalid or unable to be converted to a raw value\n suitable for persistence in the model, toRaw must return `undefined`.\n\n @member Backgrid.CellFormatter\n @param {string} formattedData\n @param {Backbone.Model} model Used for more complicated formatting\n @return {*|undefined}\n */\n toRaw: function (formattedData, model) {\n return formattedData;\n }\n\n});\n\n/**\n A floating point number formatter. Doesn't understand scientific notation at\n the moment.\n\n @class Backgrid.NumberFormatter\n @extends Backgrid.CellFormatter\n @constructor\n @throws {RangeError} If decimals < 0 or > 20.\n*/\nvar NumberFormatter = Backgrid.NumberFormatter = function (options) {\n _.extend(this, this.defaults, options || {});\n\n if (this.decimals < 0 || this.decimals > 20) {\n throw new RangeError(\"decimals must be between 0 and 20\");\n }\n};\nNumberFormatter.prototype = new CellFormatter();\n_.extend(NumberFormatter.prototype, {\n\n /**\n @member Backgrid.NumberFormatter\n @cfg {Object} options\n\n @cfg {number} [options.decimals=2] Number of decimals to display. Must be an integer.\n\n @cfg {string} [options.decimalSeparator='.'] The separator to use when\n displaying decimals.\n\n @cfg {string} [options.orderSeparator=','] The separator to use to\n separator thousands. May be an empty string.\n */\n defaults: {\n decimals: 2,\n decimalSeparator: '.',\n orderSeparator: ','\n },\n\n HUMANIZED_NUM_RE: /(\\d)(?=(?:\\d{3})+$)/g,\n\n /**\n Takes a floating point number and convert it to a formatted string where\n every thousand is separated by `orderSeparator`, with a `decimal` number of\n decimals separated by `decimalSeparator`. The number returned is rounded\n the usual way.\n\n @member Backgrid.NumberFormatter\n @param {number} number\n @param {Backbone.Model} model Used for more complicated formatting\n @return {string}\n */\n fromRaw: function (number, model) {\n if (_.isNull(number) || _.isUndefined(number)) return '';\n\n number = parseFloat(number).toFixed(~~this.decimals);\n\n var parts = number.split('.');\n var integerPart = parts[0];\n var decimalPart = parts[1] ? (this.decimalSeparator || '.') + parts[1] : '';\n\n return integerPart.replace(this.HUMANIZED_NUM_RE, '$1' + this.orderSeparator) + decimalPart;\n },\n\n /**\n Takes a string, possibly formatted with `orderSeparator` and/or\n `decimalSeparator`, and convert it back to a number.\n\n @member Backgrid.NumberFormatter\n @param {string} formattedData\n @param {Backbone.Model} model Used for more complicated formatting\n @return {number|undefined} Undefined if the string cannot be converted to\n a number.\n */\n toRaw: function (formattedData, model) {\n formattedData = formattedData.trim();\n\n if (formattedData === '') return null;\n\n var rawData = '';\n\n var thousands = formattedData.split(this.orderSeparator);\n for (var i = 0; i < thousands.length; i++) {\n rawData += thousands[i];\n }\n\n var decimalParts = rawData.split(this.decimalSeparator);\n rawData = '';\n for (var i = 0; i < decimalParts.length; i++) {\n rawData = rawData + decimalParts[i] + '.';\n }\n\n if (rawData[rawData.length - 1] === '.') {\n rawData = rawData.slice(0, rawData.length - 1);\n }\n\n var result = (rawData * 1).toFixed(~~this.decimals) * 1;\n if (_.isNumber(result) && !_.isNaN(result)) return result;\n }\n\n});\n\n/**\n A number formatter that converts a floating point number, optionally\n multiplied by a multiplier, to a percentage string and vice versa.\n\n @class Backgrid.PercentFormatter\n @extends Backgrid.NumberFormatter\n @constructor\n @throws {RangeError} If decimals < 0 or > 20.\n */\nvar PercentFormatter = Backgrid.PercentFormatter = function () {\n Backgrid.NumberFormatter.apply(this, arguments);\n};\n\nPercentFormatter.prototype = new Backgrid.NumberFormatter(),\n\n_.extend(PercentFormatter.prototype, {\n\n /**\n @member Backgrid.PercentFormatter\n @cfg {Object} options\n\n @cfg {number} [options.multiplier=1] The number used to multiply the model\n value for display.\n\n @cfg {string} [options.symbol='%'] The symbol to append to the percentage\n string.\n */\n defaults: _.extend({}, NumberFormatter.prototype.defaults, {\n multiplier: 1,\n symbol: \"%\"\n }),\n\n /**\n Takes a floating point number, where the number is first multiplied by\n `multiplier`, then converted to a formatted string like\n NumberFormatter#fromRaw, then finally append `symbol` to the end.\n\n @member Backgrid.PercentFormatter\n @param {number} rawValue\n @param {Backbone.Model} model Used for more complicated formatting\n @return {string}\n */\n fromRaw: function (number, model) {\n var args = [].slice.call(arguments, 1);\n args.unshift(number * this.multiplier);\n return (NumberFormatter.prototype.fromRaw.apply(this, args) || \"0\") + this.symbol;\n },\n\n /**\n Takes a string, possibly appended with `symbol` and/or `decimalSeparator`,\n and convert it back to a number for the model like NumberFormatter#toRaw,\n and then dividing it by `multiplier`.\n\n @member Backgrid.PercentFormatter\n @param {string} formattedData\n @param {Backbone.Model} model Used for more complicated formatting\n @return {number|undefined} Undefined if the string cannot be converted to\n a number.\n */\n toRaw: function (formattedValue, model) {\n var tokens = formattedValue.split(this.symbol);\n if (tokens && tokens[0] && tokens[1] === \"\" || tokens[1] == null) {\n var rawValue = NumberFormatter.prototype.toRaw.call(this, tokens[0]);\n if (_.isUndefined(rawValue)) return rawValue;\n return rawValue / this.multiplier;\n }\n }\n\n});\n\n/**\n Formatter to converts between various datetime formats.\n\n This class only understands ISO-8601 formatted datetime strings and UNIX\n offset (number of milliseconds since UNIX Epoch). See\n Backgrid.Extension.MomentFormatter if you need a much more flexible datetime\n formatter.\n\n @class Backgrid.DatetimeFormatter\n @extends Backgrid.CellFormatter\n @constructor\n @throws {Error} If both `includeDate` and `includeTime` are false.\n*/\nvar DatetimeFormatter = Backgrid.DatetimeFormatter = function (options) {\n _.extend(this, this.defaults, options || {});\n\n if (!this.includeDate && !this.includeTime) {\n throw new Error(\"Either includeDate or includeTime must be true\");\n }\n};\nDatetimeFormatter.prototype = new CellFormatter();\n_.extend(DatetimeFormatter.prototype, {\n\n /**\n @member Backgrid.DatetimeFormatter\n\n @cfg {Object} options\n\n @cfg {boolean} [options.includeDate=true] Whether the values include the\n date part.\n\n @cfg {boolean} [options.includeTime=true] Whether the values include the\n time part.\n\n @cfg {boolean} [options.includeMilli=false] If `includeTime` is true,\n whether to include the millisecond part, if it exists.\n */\n defaults: {\n includeDate: true,\n includeTime: true,\n includeMilli: false\n },\n\n DATE_RE: /^([+\\-]?\\d{4})-(\\d{2})-(\\d{2})$/,\n TIME_RE: /^(\\d{2}):(\\d{2}):(\\d{2})(\\.(\\d{3}))?$/,\n ISO_SPLITTER_RE: /T|Z| +/,\n\n _convert: function (data, validate) {\n if ((data + '').trim() === '') return null;\n\n var date, time = null;\n if (_.isNumber(data)) {\n var jsDate = new Date(data);\n date = lpad(jsDate.getUTCFullYear(), 4, 0) + '-' + lpad(jsDate.getUTCMonth() + 1, 2, 0) + '-' + lpad(jsDate.getUTCDate(), 2, 0);\n time = lpad(jsDate.getUTCHours(), 2, 0) + ':' + lpad(jsDate.getUTCMinutes(), 2, 0) + ':' + lpad(jsDate.getUTCSeconds(), 2, 0);\n }\n else {\n data = data.trim();\n var parts = data.split(this.ISO_SPLITTER_RE) || [];\n date = this.DATE_RE.test(parts[0]) ? parts[0] : '';\n time = date && parts[1] ? parts[1] : this.TIME_RE.test(parts[0]) ? parts[0] : '';\n }\n\n var YYYYMMDD = this.DATE_RE.exec(date) || [];\n var HHmmssSSS = this.TIME_RE.exec(time) || [];\n\n if (validate) {\n if (this.includeDate && _.isUndefined(YYYYMMDD[0])) return;\n if (this.includeTime && _.isUndefined(HHmmssSSS[0])) return;\n if (!this.includeDate && date) return;\n if (!this.includeTime && time) return;\n }\n\n var jsDate = new Date(Date.UTC(YYYYMMDD[1] * 1 || 0,\n YYYYMMDD[2] * 1 - 1 || 0,\n YYYYMMDD[3] * 1 || 0,\n HHmmssSSS[1] * 1 || null,\n HHmmssSSS[2] * 1 || null,\n HHmmssSSS[3] * 1 || null,\n HHmmssSSS[5] * 1 || null));\n\n var result = '';\n\n if (this.includeDate) {\n result = lpad(jsDate.getUTCFullYear(), 4, 0) + '-' + lpad(jsDate.getUTCMonth() + 1, 2, 0) + '-' + lpad(jsDate.getUTCDate(), 2, 0);\n }\n\n if (this.includeTime) {\n result = result + (this.includeDate ? 'T' : '') + lpad(jsDate.getUTCHours(), 2, 0) + ':' + lpad(jsDate.getUTCMinutes(), 2, 0) + ':' + lpad(jsDate.getUTCSeconds(), 2, 0);\n\n if (this.includeMilli) {\n result = result + '.' + lpad(jsDate.getUTCMilliseconds(), 3, 0);\n }\n }\n\n if (this.includeDate && this.includeTime) {\n result += \"Z\";\n }\n\n return result;\n },\n\n /**\n Converts an ISO-8601 formatted datetime string to a datetime string, date\n string or a time string. The timezone is ignored if supplied.\n\n @member Backgrid.DatetimeFormatter\n @param {string} rawData\n @param {Backbone.Model} model Used for more complicated formatting\n @return {string|null|undefined} ISO-8601 string in UTC. Null and undefined\n values are returned as is.\n */\n fromRaw: function (rawData, model) {\n if (_.isNull(rawData) || _.isUndefined(rawData)) return '';\n return this._convert(rawData);\n },\n\n /**\n Converts an ISO-8601 formatted datetime string to a datetime string, date\n string or a time string. The timezone is ignored if supplied. This method\n parses the input values exactly the same way as\n Backgrid.Extension.MomentFormatter#fromRaw(), in addition to doing some\n sanity checks.\n\n @member Backgrid.DatetimeFormatter\n @param {string} formattedData\n @param {Backbone.Model} model Used for more complicated formatting\n @return {string|undefined} ISO-8601 string in UTC. Undefined if a date is\n found when `includeDate` is false, or a time is found when `includeTime` is\n false, or if `includeDate` is true and a date is not found, or if\n `includeTime` is true and a time is not found.\n */\n toRaw: function (formattedData, model) {\n return this._convert(formattedData, true);\n }\n\n});\n\n/**\n Formatter to convert any value to string.\n\n @class Backgrid.StringFormatter\n @extends Backgrid.CellFormatter\n @constructor\n */\nvar StringFormatter = Backgrid.StringFormatter = function () {};\nStringFormatter.prototype = new CellFormatter();\n_.extend(StringFormatter.prototype, {\n /**\n Converts any value to a string using Ecmascript's implicit type\n conversion. If the given value is `null` or `undefined`, an empty string is\n returned instead.\n\n @member Backgrid.StringFormatter\n @param {*} rawValue\n @param {Backbone.Model} model Used for more complicated formatting\n @return {string}\n */\n fromRaw: function (rawValue, model) {\n if (_.isUndefined(rawValue) || _.isNull(rawValue)) return '';\n return rawValue + '';\n }\n});\n\n/**\n Simple email validation formatter.\n\n @class Backgrid.EmailFormatter\n @extends Backgrid.CellFormatter\n @constructor\n */\nvar EmailFormatter = Backgrid.EmailFormatter = function () {};\nEmailFormatter.prototype = new CellFormatter();\n_.extend(EmailFormatter.prototype, {\n /**\n Return the input if it is a string that contains an '@' character and if\n the strings before and after '@' are non-empty. If the input does not\n validate, `undefined` is returned.\n\n @member Backgrid.EmailFormatter\n @param {*} formattedData\n @param {Backbone.Model} model Used for more complicated formatting\n @return {string|undefined}\n */\n toRaw: function (formattedData, model) {\n var parts = formattedData.trim().split(\"@\");\n if (parts.length === 2 && _.all(parts)) {\n return formattedData;\n }\n }\n});\n\n/**\n Formatter for SelectCell.\n\n If the type of a model value is not a string, it is expected that a subclass\n of this formatter is provided to the SelectCell, with #toRaw overridden to\n convert the string value returned from the DOM back to whatever value is\n expected in the model.\n\n @class Backgrid.SelectFormatter\n @extends Backgrid.CellFormatter\n @constructor\n*/\nvar SelectFormatter = Backgrid.SelectFormatter = function () {};\nSelectFormatter.prototype = new CellFormatter();\n_.extend(SelectFormatter.prototype, {\n\n /**\n Normalizes raw scalar or array values to an array.\n\n @member Backgrid.SelectFormatter\n @param {*} rawValue\n @param {Backbone.Model} model Used for more complicated formatting\n @return {Array.<*>}\n */\n fromRaw: function (rawValue, model) {\n return _.isArray(rawValue) ? rawValue : rawValue != null ? [rawValue] : [];\n }\n});\n\n/*\n backgrid\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc. and contributors\n Licensed under the MIT license.\n*/\n\n/**\n Generic cell editor base class. Only defines an initializer for a number of\n required parameters.\n\n @abstract\n @class Backgrid.CellEditor\n @extends Backbone.View\n*/\nvar CellEditor = Backgrid.CellEditor = Backbone.View.extend({\n\n /**\n Initializer.\n\n @param {Object} options\n @param {Backgrid.CellFormatter} options.formatter\n @param {Backgrid.Column} options.column\n @param {Backbone.Model} options.model\n\n @throws {TypeError} If `formatter` is not a formatter instance, or when\n `model` or `column` are undefined.\n */\n initialize: function (options) {\n this.formatter = options.formatter;\n this.column = options.column;\n if (!(this.column instanceof Column)) {\n this.column = new Column(this.column);\n }\n\n this.listenTo(this.model, \"backgrid:editing\", this.postRender);\n },\n\n /**\n Post-rendering setup and initialization. Focuses the cell editor's `el` in\n this default implementation. **Should** be called by Cell classes after\n calling Backgrid.CellEditor#render.\n */\n postRender: function (model, column) {\n if (column == null || column.get(\"name\") == this.column.get(\"name\")) {\n this.$el.focus();\n }\n return this;\n }\n\n});\n\n/**\n InputCellEditor the cell editor type used by most core cell types. This cell\n editor renders a text input box as its editor. The input will render a\n placeholder if the value is empty on supported browsers.\n\n @class Backgrid.InputCellEditor\n @extends Backgrid.CellEditor\n*/\nvar InputCellEditor = Backgrid.InputCellEditor = CellEditor.extend({\n\n /** @property */\n tagName: \"input\",\n\n /** @property */\n attributes: {\n type: \"text\"\n },\n\n /** @property */\n events: {\n \"blur\": \"saveOrCancel\",\n \"keydown\": \"saveOrCancel\"\n },\n\n /**\n Initializer. Removes this `el` from the DOM when a `done` event is\n triggered.\n\n @param {Object} options\n @param {Backgrid.CellFormatter} options.formatter\n @param {Backgrid.Column} options.column\n @param {Backbone.Model} options.model\n @param {string} [options.placeholder]\n */\n initialize: function (options) {\n InputCellEditor.__super__.initialize.apply(this, arguments);\n\n if (options.placeholder) {\n this.$el.attr(\"placeholder\", options.placeholder);\n }\n },\n\n /**\n Renders a text input with the cell value formatted for display, if it\n exists.\n */\n render: function () {\n var model = this.model;\n this.$el.val(this.formatter.fromRaw(model.get(this.column.get(\"name\")), model));\n return this;\n },\n\n /**\n If the key pressed is `enter`, `tab`, `up`, or `down`, converts the value\n in the editor to a raw value for saving into the model using the formatter.\n\n If the key pressed is `esc` the changes are undone.\n\n If the editor goes out of focus (`blur`) but the value is invalid, the\n event is intercepted and cancelled so the cell remains in focus pending for\n further action. The changes are saved otherwise.\n\n Triggers a Backbone `backgrid:edited` event from the model when successful,\n and `backgrid:error` if the value cannot be converted. Classes listening to\n the `error` event, usually the Cell classes, should respond appropriately,\n usually by rendering some kind of error feedback.\n\n @param {Event} e\n */\n saveOrCancel: function (e) {\n\n var formatter = this.formatter;\n var model = this.model;\n var column = this.column;\n\n var command = new Command(e);\n var blurred = e.type === \"blur\";\n\n if (command.moveUp() || command.moveDown() || command.moveLeft() || command.moveRight() ||\n command.save() || blurred) {\n\n e.preventDefault();\n e.stopPropagation();\n\n var val = this.$el.val();\n var newValue = formatter.toRaw(val, model);\n if (_.isUndefined(newValue)) {\n model.trigger(\"backgrid:error\", model, column, val);\n }\n else {\n model.set(column.get(\"name\"), newValue);\n model.trigger(\"backgrid:edited\", model, column, command);\n }\n }\n // esc\n else if (command.cancel()) {\n // undo\n e.stopPropagation();\n model.trigger(\"backgrid:edited\", model, column, command);\n }\n },\n\n postRender: function (model, column) {\n if (column == null || column.get(\"name\") == this.column.get(\"name\")) {\n // move the cursor to the end on firefox if text is right aligned\n if (this.$el.css(\"text-align\") === \"right\") {\n var val = this.$el.val();\n this.$el.focus().val(null).val(val);\n }\n else this.$el.focus();\n }\n return this;\n }\n\n});\n\n/**\n The super-class for all Cell types. By default, this class renders a plain\n table cell with the model value converted to a string using the\n formatter. The table cell is clickable, upon which the cell will go into\n editor mode, which is rendered by a Backgrid.InputCellEditor instance by\n default. Upon encountering any formatting errors, this class will add an\n `error` CSS class to the table cell.\n\n @abstract\n @class Backgrid.Cell\n @extends Backbone.View\n*/\nvar Cell = Backgrid.Cell = Backbone.View.extend({\n\n /** @property */\n tagName: \"td\",\n\n /**\n @property {Backgrid.CellFormatter|Object|string} [formatter=CellFormatter]\n */\n formatter: CellFormatter,\n\n /**\n @property {Backgrid.CellEditor} [editor=Backgrid.InputCellEditor] The\n default editor for all cell instances of this class. This value must be a\n class, it will be automatically instantiated upon entering edit mode.\n\n See Backgrid.CellEditor\n */\n editor: InputCellEditor,\n\n /** @property */\n events: {\n \"click\": \"enterEditMode\"\n },\n\n /**\n Initializer.\n\n @param {Object} options\n @param {Backbone.Model} options.model\n @param {Backgrid.Column} options.column\n\n @throws {ReferenceError} If formatter is a string but a formatter class of\n said name cannot be found in the Backgrid module.\n */\n initialize: function (options) {\n this.column = options.column;\n if (!(this.column instanceof Column)) {\n this.column = new Column(this.column);\n }\n\n var column = this.column, model = this.model, $el = this.$el;\n\n var formatter = Backgrid.resolveNameToClass(column.get(\"formatter\") ||\n this.formatter, \"Formatter\");\n\n if (!_.isFunction(formatter.fromRaw) && !_.isFunction(formatter.toRaw)) {\n formatter = new formatter();\n }\n\n this.formatter = formatter;\n\n this.editor = Backgrid.resolveNameToClass(this.editor, \"CellEditor\");\n\n this.listenTo(model, \"change:\" + column.get(\"name\"), function () {\n if (!$el.hasClass(\"editor\")) this.render();\n });\n\n this.listenTo(model, \"backgrid:error\", this.renderError);\n\n this.listenTo(column, \"change:editable change:sortable change:renderable\",\n function (column) {\n var changed = column.changedAttributes();\n for (var key in changed) {\n if (changed.hasOwnProperty(key)) {\n $el.toggleClass(key, changed[key]);\n }\n }\n });\n\n this.updateStateClassesMaybe();\n },\n\n updateStateClassesMaybe: function () {\n var model = this.model;\n var column = this.column;\n var $el = this.$el;\n $el.toggleClass(\"editable\", Backgrid.callByNeed(column.editable(), column, model));\n $el.toggleClass(\"sortable\", Backgrid.callByNeed(column.sortable(), column, model));\n $el.toggleClass(\"renderable\", Backgrid.callByNeed(column.renderable(), column, model));\n },\n\n /**\n Render a text string in a table cell. The text is converted from the\n model's raw value for this cell's column.\n */\n render: function () {\n var $el = this.$el;\n $el.empty();\n var model = this.model;\n var columnName = this.column.get(\"name\");\n $el.text(this.formatter.fromRaw(model.get(columnName), model));\n $el.addClass(columnName);\n this.updateStateClassesMaybe();\n this.delegateEvents();\n return this;\n },\n\n /**\n If this column is editable, a new CellEditor instance is instantiated with\n its required parameters. An `editor` CSS class is added to the cell upon\n entering edit mode.\n\n This method triggers a Backbone `backgrid:edit` event from the model when\n the cell is entering edit mode and an editor instance has been constructed,\n but before it is rendered and inserted into the DOM. The cell and the\n constructed cell editor instance are sent as event parameters when this\n event is triggered.\n\n When this cell has finished switching to edit mode, a Backbone\n `backgrid:editing` event is triggered from the model. The cell and the\n constructed cell instance are also sent as parameters in the event.\n\n When the model triggers a `backgrid:error` event, it means the editor is\n unable to convert the current user input to an apprpriate value for the\n model's column, and an `error` CSS class is added to the cell accordingly.\n */\n enterEditMode: function () {\n var model = this.model;\n var column = this.column;\n\n var editable = Backgrid.callByNeed(column.editable(), column, model);\n if (editable) {\n\n this.currentEditor = new this.editor({\n column: this.column,\n model: this.model,\n formatter: this.formatter\n });\n\n model.trigger(\"backgrid:edit\", model, column, this, this.currentEditor);\n\n // Need to redundantly undelegate events for Firefox\n this.undelegateEvents();\n this.$el.empty();\n this.$el.append(this.currentEditor.$el);\n this.currentEditor.render();\n this.$el.addClass(\"editor\");\n\n model.trigger(\"backgrid:editing\", model, column, this, this.currentEditor);\n }\n },\n\n /**\n Put an `error` CSS class on the table cell.\n */\n renderError: function (model, column) {\n if (column == null || column.get(\"name\") == this.column.get(\"name\")) {\n this.$el.addClass(\"error\");\n }\n },\n\n /**\n Removes the editor and re-render in display mode.\n */\n exitEditMode: function () {\n this.$el.removeClass(\"error\");\n this.currentEditor.remove();\n this.stopListening(this.currentEditor);\n delete this.currentEditor;\n this.$el.removeClass(\"editor\");\n this.render();\n },\n\n /**\n Clean up this cell.\n\n @chainable\n */\n remove: function () {\n if (this.currentEditor) {\n this.currentEditor.remove.apply(this.currentEditor, arguments);\n delete this.currentEditor;\n }\n return Cell.__super__.remove.apply(this, arguments);\n }\n\n});\n\n/**\n StringCell displays HTML escaped strings and accepts anything typed in.\n\n @class Backgrid.StringCell\n @extends Backgrid.Cell\n*/\nvar StringCell = Backgrid.StringCell = Cell.extend({\n\n /** @property */\n className: \"string-cell\",\n\n formatter: StringFormatter\n\n});\n\n/**\n UriCell renders an HTML `<a>` anchor for the value and accepts URIs as user\n input values. No type conversion or URL validation is done by the formatter\n of this cell. Users who need URL validation are encourage to subclass UriCell\n to take advantage of the parsing capabilities of the HTMLAnchorElement\n available on HTML5-capable browsers or using a third-party library like\n [URI.js](https://github.com/medialize/URI.js).\n\n @class Backgrid.UriCell\n @extends Backgrid.Cell\n*/\nvar UriCell = Backgrid.UriCell = Cell.extend({\n\n /** @property */\n className: \"uri-cell\",\n\n /**\n @property {string} [title] The title attribute of the generated anchor. It\n uses the display value formatted by the `formatter.fromRaw` by default.\n */\n title: null,\n\n /**\n @property {string} [target=\"_blank\"] The target attribute of the generated\n anchor.\n */\n target: \"_blank\",\n\n initialize: function (options) {\n UriCell.__super__.initialize.apply(this, arguments);\n this.title = options.title || this.title;\n this.target = options.target || this.target;\n },\n\n render: function () {\n this.$el.empty();\n var rawValue = this.model.get(this.column.get(\"name\"));\n var formattedValue = this.formatter.fromRaw(rawValue, this.model);\n this.$el.append($(\"<a>\", {\n tabIndex: -1,\n href: rawValue,\n title: this.title || formattedValue,\n target: this.target\n }).text(formattedValue));\n this.delegateEvents();\n return this;\n }\n\n});\n\n/**\n Like Backgrid.UriCell, EmailCell renders an HTML `<a>` anchor for the\n value. The `href` in the anchor is prefixed with `mailto:`. EmailCell will\n complain if the user enters a string that doesn't contain the `@` sign.\n\n @class Backgrid.EmailCell\n @extends Backgrid.StringCell\n*/\nvar EmailCell = Backgrid.EmailCell = StringCell.extend({\n\n /** @property */\n className: \"email-cell\",\n\n formatter: EmailFormatter,\n\n render: function () {\n this.$el.empty();\n var model = this.model;\n var formattedValue = this.formatter.fromRaw(model.get(this.column.get(\"name\")), model);\n this.$el.append($(\"<a>\", {\n tabIndex: -1,\n href: \"mailto:\" + formattedValue,\n title: formattedValue\n }).text(formattedValue));\n this.delegateEvents();\n return this;\n }\n\n});\n\n/**\n NumberCell is a generic cell that renders all numbers. Numbers are formatted\n using a Backgrid.NumberFormatter.\n\n @class Backgrid.NumberCell\n @extends Backgrid.Cell\n*/\nvar NumberCell = Backgrid.NumberCell = Cell.extend({\n\n /** @property */\n className: \"number-cell\",\n\n /**\n @property {number} [decimals=2] Must be an integer.\n */\n decimals: NumberFormatter.prototype.defaults.decimals,\n\n /** @property {string} [decimalSeparator='.'] */\n decimalSeparator: NumberFormatter.prototype.defaults.decimalSeparator,\n\n /** @property {string} [orderSeparator=','] */\n orderSeparator: NumberFormatter.prototype.defaults.orderSeparator,\n\n /** @property {Backgrid.CellFormatter} [formatter=Backgrid.NumberFormatter] */\n formatter: NumberFormatter,\n\n /**\n Initializes this cell and the number formatter.\n\n @param {Object} options\n @param {Backbone.Model} options.model\n @param {Backgrid.Column} options.column\n */\n initialize: function (options) {\n NumberCell.__super__.initialize.apply(this, arguments);\n var formatter = this.formatter;\n formatter.decimals = this.decimals;\n formatter.decimalSeparator = this.decimalSeparator;\n formatter.orderSeparator = this.orderSeparator;\n }\n\n});\n\n/**\n An IntegerCell is just a Backgrid.NumberCell with 0 decimals. If a floating\n point number is supplied, the number is simply rounded the usual way when\n displayed.\n\n @class Backgrid.IntegerCell\n @extends Backgrid.NumberCell\n*/\nvar IntegerCell = Backgrid.IntegerCell = NumberCell.extend({\n\n /** @property */\n className: \"integer-cell\",\n\n /**\n @property {number} decimals Must be an integer.\n */\n decimals: 0\n});\n\n/**\n A PercentCell is another Backgrid.NumberCell that takes a floating number,\n optionally multiplied by a multiplier and display it as a percentage.\n\n @class Backgrid.PercentCell\n @extends Backgrid.NumberCell\n */\nvar PercentCell = Backgrid.PercentCell = NumberCell.extend({\n\n /** @property */\n className: \"percent-cell\",\n\n /** @property {number} [multiplier=1] */\n multiplier: PercentFormatter.prototype.defaults.multiplier,\n\n /** @property {string} [symbol='%'] */\n symbol: PercentFormatter.prototype.defaults.symbol,\n\n /** @property {Backgrid.CellFormatter} [formatter=Backgrid.PercentFormatter] */\n formatter: PercentFormatter,\n\n /**\n Initializes this cell and the percent formatter.\n\n @param {Object} options\n @param {Backbone.Model} options.model\n @param {Backgrid.Column} options.column\n */\n initialize: function () {\n PercentCell.__super__.initialize.apply(this, arguments);\n var formatter = this.formatter;\n formatter.multiplier = this.multiplier;\n formatter.symbol = this.symbol;\n }\n\n});\n\n/**\n DatetimeCell is a basic cell that accepts datetime string values in RFC-2822\n or W3C's subset of ISO-8601 and displays them in ISO-8601 format. For a much\n more sophisticated date time cell with better datetime formatting, take a\n look at the Backgrid.Extension.MomentCell extension.\n\n @class Backgrid.DatetimeCell\n @extends Backgrid.Cell\n\n See:\n\n - Backgrid.Extension.MomentCell\n - Backgrid.DatetimeFormatter\n*/\nvar DatetimeCell = Backgrid.DatetimeCell = Cell.extend({\n\n /** @property */\n className: \"datetime-cell\",\n\n /**\n @property {boolean} [includeDate=true]\n */\n includeDate: DatetimeFormatter.prototype.defaults.includeDate,\n\n /**\n @property {boolean} [includeTime=true]\n */\n includeTime: DatetimeFormatter.prototype.defaults.includeTime,\n\n /**\n @property {boolean} [includeMilli=false]\n */\n includeMilli: DatetimeFormatter.prototype.defaults.includeMilli,\n\n /** @property {Backgrid.CellFormatter} [formatter=Backgrid.DatetimeFormatter] */\n formatter: DatetimeFormatter,\n\n /**\n Initializes this cell and the datetime formatter.\n\n @param {Object} options\n @param {Backbone.Model} options.model\n @param {Backgrid.Column} options.column\n */\n initialize: function (options) {\n DatetimeCell.__super__.initialize.apply(this, arguments);\n var formatter = this.formatter;\n formatter.includeDate = this.includeDate;\n formatter.includeTime = this.includeTime;\n formatter.includeMilli = this.includeMilli;\n\n var placeholder = this.includeDate ? \"YYYY-MM-DD\" : \"\";\n placeholder += (this.includeDate && this.includeTime) ? \"T\" : \"\";\n placeholder += this.includeTime ? \"HH:mm:ss\" : \"\";\n placeholder += (this.includeTime && this.includeMilli) ? \".SSS\" : \"\";\n\n this.editor = this.editor.extend({\n attributes: _.extend({}, this.editor.prototype.attributes, this.editor.attributes, {\n placeholder: placeholder\n })\n });\n }\n\n});\n\n/**\n DateCell is a Backgrid.DatetimeCell without the time part.\n\n @class Backgrid.DateCell\n @extends Backgrid.DatetimeCell\n*/\nvar DateCell = Backgrid.DateCell = DatetimeCell.extend({\n\n /** @property */\n className: \"date-cell\",\n\n /** @property */\n includeTime: false\n\n});\n\n/**\n TimeCell is a Backgrid.DatetimeCell without the date part.\n\n @class Backgrid.TimeCell\n @extends Backgrid.DatetimeCell\n*/\nvar TimeCell = Backgrid.TimeCell = DatetimeCell.extend({\n\n /** @property */\n className: \"time-cell\",\n\n /** @property */\n includeDate: false\n\n});\n\n/**\n BooleanCellEditor renders a checkbox as its editor.\n\n @class Backgrid.BooleanCellEditor\n @extends Backgrid.CellEditor\n*/\nvar BooleanCellEditor = Backgrid.BooleanCellEditor = CellEditor.extend({\n\n /** @property */\n tagName: \"input\",\n\n /** @property */\n attributes: {\n tabIndex: -1,\n type: \"checkbox\"\n },\n\n /** @property */\n events: {\n \"mousedown\": function () {\n this.mouseDown = true;\n },\n \"blur\": \"enterOrExitEditMode\",\n \"mouseup\": function () {\n this.mouseDown = false;\n },\n \"change\": \"saveOrCancel\",\n \"keydown\": \"saveOrCancel\"\n },\n\n /**\n Renders a checkbox and check it if the model value of this column is true,\n uncheck otherwise.\n */\n render: function () {\n var model = this.model;\n var val = this.formatter.fromRaw(model.get(this.column.get(\"name\")), model);\n this.$el.prop(\"checked\", val);\n return this;\n },\n\n /**\n Event handler. Hack to deal with the case where `blur` is fired before\n `change` and `click` on a checkbox.\n */\n enterOrExitEditMode: function (e) {\n if (!this.mouseDown) {\n var model = this.model;\n model.trigger(\"backgrid:edited\", model, this.column, new Command(e));\n }\n },\n\n /**\n Event handler. Save the value into the model if the event is `change` or\n one of the keyboard navigation key presses. Exit edit mode without saving\n if `escape` was pressed.\n */\n saveOrCancel: function (e) {\n var model = this.model;\n var column = this.column;\n var formatter = this.formatter;\n var command = new Command(e);\n // skip ahead to `change` when space is pressed\n if (command.passThru() && e.type != \"change\") return true;\n if (command.cancel()) {\n e.stopPropagation();\n model.trigger(\"backgrid:edited\", model, column, command);\n }\n\n var $el = this.$el;\n if (command.save() || command.moveLeft() || command.moveRight() || command.moveUp() ||\n command.moveDown()) {\n e.preventDefault();\n e.stopPropagation();\n var val = formatter.toRaw($el.prop(\"checked\"), model);\n model.set(column.get(\"name\"), val);\n model.trigger(\"backgrid:edited\", model, column, command);\n }\n else if (e.type == \"change\") {\n var val = formatter.toRaw($el.prop(\"checked\"), model);\n model.set(column.get(\"name\"), val);\n $el.focus();\n }\n }\n\n});\n\n/**\n BooleanCell renders a checkbox both during display mode and edit mode. The\n checkbox is checked if the model value is true, unchecked otherwise.\n\n @class Backgrid.BooleanCell\n @extends Backgrid.Cell\n*/\nvar BooleanCell = Backgrid.BooleanCell = Cell.extend({\n\n /** @property */\n className: \"boolean-cell\",\n\n /** @property */\n editor: BooleanCellEditor,\n\n /** @property */\n events: {\n \"click\": \"enterEditMode\"\n },\n\n /**\n Renders a checkbox and check it if the model value of this column is true,\n uncheck otherwise.\n */\n render: function () {\n this.$el.empty();\n var model = this.model, column = this.column;\n var editable = Backgrid.callByNeed(column.editable(), column, model);\n this.$el.append($(\"<input>\", {\n tabIndex: -1,\n type: \"checkbox\",\n checked: this.formatter.fromRaw(model.get(column.get(\"name\")), model),\n disabled: !editable\n }));\n this.delegateEvents();\n return this;\n }\n\n});\n\n/**\n SelectCellEditor renders an HTML `<select>` fragment as the editor.\n\n @class Backgrid.SelectCellEditor\n @extends Backgrid.CellEditor\n*/\nvar SelectCellEditor = Backgrid.SelectCellEditor = CellEditor.extend({\n\n /** @property */\n tagName: \"select\",\n\n /** @property */\n events: {\n \"change\": \"save\",\n \"blur\": \"close\",\n \"keydown\": \"close\"\n },\n\n /** @property {function(Object, ?Object=): string} template */\n template: _.template(\n '<option value=\"<%- value %>\" <%= selected ? \\'selected=\"selected\"\\' : \"\" %>><%- text %></option>',\n null,\n {\n variable : null,\n evaluate : /<%([\\s\\S]+?)%>/g,\n interpolate : /<%=([\\s\\S]+?)%>/g,\n escape : /<%-([\\s\\S]+?)%>/g\n }),\n\n setOptionValues: function (optionValues) {\n this.optionValues = optionValues;\n this.optionValues = _.result(this, \"optionValues\");\n },\n\n setMultiple: function (multiple) {\n this.multiple = multiple;\n this.$el.prop(\"multiple\", multiple);\n },\n\n _renderOptions: function (nvps, selectedValues) {\n var options = '';\n for (var i = 0; i < nvps.length; i++) {\n options = options + this.template({\n text: nvps[i][0],\n value: nvps[i][1],\n selected: _.indexOf(selectedValues, nvps[i][1]) > -1\n });\n }\n return options;\n },\n\n /**\n Renders the options if `optionValues` is a list of name-value pairs. The\n options are contained inside option groups if `optionValues` is a list of\n object hashes. The name is rendered at the option text and the value is the\n option value. If `optionValues` is a function, it is called without a\n parameter.\n */\n render: function () {\n this.$el.empty();\n\n var optionValues = _.result(this, \"optionValues\");\n var model = this.model;\n var selectedValues = this.formatter.fromRaw(model.get(this.column.get(\"name\")), model);\n\n if (!_.isArray(optionValues)) throw new TypeError(\"optionValues must be an array\");\n\n var optionValue = null;\n var optionText = null;\n var optionValue = null;\n var optgroupName = null;\n var optgroup = null;\n\n for (var i = 0; i < optionValues.length; i++) {\n var optionValue = optionValues[i];\n\n if (_.isArray(optionValue)) {\n optionText = optionValue[0];\n optionValue = optionValue[1];\n\n this.$el.append(this.template({\n text: optionText,\n value: optionValue,\n selected: _.indexOf(selectedValues, optionValue) > -1\n }));\n }\n else if (_.isObject(optionValue)) {\n optgroupName = optionValue.name;\n optgroup = $(\"<optgroup></optgroup>\", { label: optgroupName });\n optgroup.append(this._renderOptions.call(this, optionValue.values, selectedValues));\n this.$el.append(optgroup);\n }\n else {\n throw new TypeError(\"optionValues elements must be a name-value pair or an object hash of { name: 'optgroup label', value: [option name-value pairs] }\");\n }\n }\n\n this.delegateEvents();\n\n return this;\n },\n\n /**\n Saves the value of the selected option to the model attribute.\n */\n save: function (e) {\n var model = this.model;\n var column = this.column;\n model.set(column.get(\"name\"), this.formatter.toRaw(this.$el.val(), model));\n },\n\n /**\n Triggers a `backgrid:edited` event from the model so the body can close\n this editor.\n */\n close: function (e) {\n var model = this.model;\n var column = this.column;\n var command = new Command(e);\n if (command.cancel()) {\n e.stopPropagation();\n model.trigger(\"backgrid:edited\", model, column, new Command(e));\n }\n else if (command.save() || command.moveLeft() || command.moveRight() ||\n command.moveUp() || command.moveDown() || e.type == \"blur\") {\n e.preventDefault();\n e.stopPropagation();\n this.save(e);\n model.trigger(\"backgrid:edited\", model, column, new Command(e));\n }\n }\n\n});\n\n/**\n SelectCell is also a different kind of cell in that upon going into edit mode\n the cell renders a list of options to pick from, as opposed to an input box.\n\n SelectCell cannot be referenced by its string name when used in a column\n definition because it requires an `optionValues` class attribute to be\n defined. `optionValues` can either be a list of name-value pairs, to be\n rendered as options, or a list of object hashes which consist of a key *name*\n which is the option group name, and a key *values* which is a list of\n name-value pairs to be rendered as options under that option group.\n\n In addition, `optionValues` can also be a parameter-less function that\n returns one of the above. If the options are static, it is recommended the\n returned values to be memoized. `_.memoize()` is a good function to help with\n that.\n\n During display mode, the default formatter will normalize the raw model value\n to an array of values whether the raw model value is a scalar or an\n array. Each value is compared with the `optionValues` values using\n Ecmascript's implicit type conversion rules. When exiting edit mode, no type\n conversion is performed when saving into the model. This behavior is not\n always desirable when the value type is anything other than string. To\n control type conversion on the client-side, you should subclass SelectCell to\n provide a custom formatter or provide the formatter to your column\n definition.\n\n See:\n [$.fn.val()](http://api.jquery.com/val/)\n\n @class Backgrid.SelectCell\n @extends Backgrid.Cell\n*/\nvar SelectCell = Backgrid.SelectCell = Cell.extend({\n\n /** @property */\n className: \"select-cell\",\n\n /** @property */\n editor: SelectCellEditor,\n\n /** @property */\n multiple: false,\n\n /** @property */\n formatter: SelectFormatter,\n\n /**\n @property {Array.<Array>|Array.<{name: string, values: Array.<Array>}>} optionValues\n */\n optionValues: undefined,\n\n /** @property */\n delimiter: ', ',\n\n /**\n Initializer.\n\n @param {Object} options\n @param {Backbone.Model} options.model\n @param {Backgrid.Column} options.column\n\n @throws {TypeError} If `optionsValues` is undefined.\n */\n initialize: function (options) {\n SelectCell.__super__.initialize.apply(this, arguments);\n this.listenTo(this.model, \"backgrid:edit\", function (model, column, cell, editor) {\n if (column.get(\"name\") == this.column.get(\"name\")) {\n editor.setOptionValues(this.optionValues);\n editor.setMultiple(this.multiple);\n }\n });\n },\n\n /**\n Renders the label using the raw value as key to look up from `optionValues`.\n\n @throws {TypeError} If `optionValues` is malformed.\n */\n render: function () {\n this.$el.empty();\n\n var optionValues = _.result(this, \"optionValues\");\n var model = this.model;\n var rawData = this.formatter.fromRaw(model.get(this.column.get(\"name\")), model);\n\n var selectedText = [];\n\n try {\n if (!_.isArray(optionValues) || _.isEmpty(optionValues)) throw new TypeError;\n\n for (var k = 0; k < rawData.length; k++) {\n var rawDatum = rawData[k];\n\n for (var i = 0; i < optionValues.length; i++) {\n var optionValue = optionValues[i];\n\n if (_.isArray(optionValue)) {\n var optionText = optionValue[0];\n var optionValue = optionValue[1];\n\n if (optionValue == rawDatum) selectedText.push(optionText);\n }\n else if (_.isObject(optionValue)) {\n var optionGroupValues = optionValue.values;\n\n for (var j = 0; j < optionGroupValues.length; j++) {\n var optionGroupValue = optionGroupValues[j];\n if (optionGroupValue[1] == rawDatum) {\n selectedText.push(optionGroupValue[0]);\n }\n }\n }\n else {\n throw new TypeError;\n }\n }\n }\n\n this.$el.append(selectedText.join(this.delimiter));\n }\n catch (ex) {\n if (ex instanceof TypeError) {\n throw new TypeError(\"'optionValues' must be of type {Array.<Array>|Array.<{name: string, values: Array.<Array>}>}\");\n }\n throw ex;\n }\n\n this.delegateEvents();\n\n return this;\n }\n\n});\n\n/*\n backgrid\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc. and contributors\n Licensed under the MIT license.\n*/\n\n/**\n A Column is a placeholder for column metadata.\n\n You usually don't need to create an instance of this class yourself as a\n collection of column instances will be created for you from a list of column\n attributes in the Backgrid.js view class constructors.\n\n @class Backgrid.Column\n @extends Backbone.Model\n*/\nvar Column = Backgrid.Column = Backbone.Model.extend({\n\n /**\n @cfg {Object} defaults Column defaults. To override any of these default\n values, you can either change the prototype directly to override\n Column.defaults globally or extend Column and supply the custom class to\n Backgrid.Grid:\n\n // Override Column defaults globally\n Column.prototype.defaults.sortable = false;\n\n // Override Column defaults locally\n var MyColumn = Column.extend({\n defaults: _.defaults({\n editable: false\n }, Column.prototype.defaults)\n });\n\n var grid = new Backgrid.Grid(columns: new Columns([{...}, {...}], {\n model: MyColumn\n }));\n\n @cfg {string} [defaults.name] The default name of the model attribute.\n\n @cfg {string} [defaults.label] The default label to show in the header.\n\n @cfg {string|Backgrid.Cell} [defaults.cell] The default cell type. If this\n is a string, the capitalized form will be used to look up a cell class in\n Backbone, i.e.: string => StringCell. If a Cell subclass is supplied, it is\n initialized with a hash of parameters. If a Cell instance is supplied, it\n is used directly.\n\n @cfg {string|Backgrid.HeaderCell} [defaults.headerCell] The default header\n cell type.\n\n @cfg {boolean|string|function(): boolean} [defaults.sortable=true] Whether\n this column is sortable. If the value is a string, a method will the same\n name will be looked up from the column instance to determine whether the\n column should be sortable. The method's signature must be `function\n (Backbone.Model): boolean`. The function's context is the column instance.\n\n @cfg {boolean|string|function(): boolean} [defaults.editable=true] Whether\n this column is editable. If the value is a string, a method will the same\n name will be looked up from the column instance to determine whether the\n column should be editable. The method's signature must be `function\n (Backbone.Model): boolean`. The function's context is the column instance.\n\n @cfg {boolean|string|function(): boolean} [defaults.renderable=true]\n Whether this column is renderable. If the value is a string, a method will\n the same name will be looked up from the column instance to determine\n whether the column should be renderable. The method's signature must be\n `function (Backbone.Model): boolean`. The function's context is the column\n instance.\n\n @cfg {Backgrid.CellFormatter | Object | string} [defaults.formatter] The\n formatter to use to convert between raw model values and user input.\n\n @cfg {\"toggle\"|\"cycle\"} [defaults.sortType=\"cycle\"] Whether sorting will\n toggle between ascending and descending order, or cycle between insertion\n order, ascending and descending order.\n\n @cfg {(function(Backbone.Model, string): *) | string} [defaults.sortValue]\n The function to use to extract a value from the model for comparison during\n sorting. If this value is a string, a method with the same name will be\n looked up from the column instance.\n\n @cfg {\"ascending\"|\"descending\"|null} [defaults.direction=null] The initial\n sorting direction for this column. The default is ordered by\n Backbone.Model.cid, which usually means the collection is ordered by\n insertion order.\n */\n defaults: {\n name: undefined,\n label: undefined,\n sortable: true,\n editable: true,\n renderable: true,\n formatter: undefined,\n sortType: \"cycle\",\n sortValue: undefined,\n direction: null,\n cell: undefined,\n headerCell: undefined\n },\n\n /**\n Initializes this Column instance.\n\n @param {Object} attrs\n\n @param {string} attrs.name The model attribute this column is responsible\n for.\n\n @param {string|Backgrid.Cell} attrs.cell The cell type to use to render\n this column.\n\n @param {string} [attrs.label]\n\n @param {string|Backgrid.HeaderCell} [attrs.headerCell]\n\n @param {boolean|string|function(): boolean} [attrs.sortable=true]\n\n @param {boolean|string|function(): boolean} [attrs.editable=true]\n\n @param {boolean|string|function(): boolean} [attrs.renderable=true]\n\n @param {Backgrid.CellFormatter | Object | string} [attrs.formatter]\n\n @param {\"toggle\"|\"cycle\"} [attrs.sortType=\"cycle\"]\n\n @param {(function(Backbone.Model, string): *) | string} [attrs.sortValue]\n\n @throws {TypeError} If attrs.cell or attrs.options are not supplied.\n\n @throws {ReferenceError} If formatter is a string but a formatter class of\n said name cannot be found in the Backgrid module.\n\n See:\n\n - Backgrid.Column.defaults\n - Backgrid.Cell\n - Backgrid.CellFormatter\n */\n initialize: function () {\n if (!this.has(\"label\")) {\n this.set({ label: this.get(\"name\") }, { silent: true });\n }\n\n var headerCell = Backgrid.resolveNameToClass(this.get(\"headerCell\"), \"HeaderCell\");\n\n var cell = Backgrid.resolveNameToClass(this.get(\"cell\"), \"Cell\");\n\n this.set({cell: cell, headerCell: headerCell}, { silent: true });\n },\n\n /**\n Returns an appropriate value extraction function from a model for sorting.\n\n If the column model contains an attribute `sortValue`, if it is a string, a\n method from the column instance identifified by the `sortValue` string is\n returned. If it is a function, it it returned as is. If `sortValue` isn't\n found from the column model's attributes, a default value extraction\n function is returned which will compare according to the natural order of\n the value's type.\n\n @return {function(Backbone.Model, string): *}\n */\n sortValue: function () {\n var sortValue = this.get(\"sortValue\");\n if (_.isString(sortValue)) return this[sortValue];\n else if (_.isFunction(sortValue)) return sortValue;\n\n return function (model, colName) {\n return model.get(colName);\n };\n }\n\n /**\n If you cannot always determine whether a column should be sortable before\n the grid get initialized, you can override this method.\n\n @member Backgrid.Column\n @protected\n @method sortable\n @return {function(Backbone.Model): boolean | boolean}\n */\n\n /**\n If you cannot always determine whether a column should be editable before\n the grid get initialized, you can override this method.\n\n @member Backgrid.Column\n @protected\n @method editable\n @return {function(Backbone.Model): boolean | boolean}\n */\n\n /**\n If you cannot always determine whether a column should be renderable before\n the grid get initialized, you can override this method.\n\n @member Backgrid.Column\n @protected\n @method renderable\n @return {function(Backbone.Model): boolean | boolean}\n */\n});\n\n_.each([\"sortable\", \"renderable\", \"editable\"], function (key) {\n Column.prototype[key] = function () {\n var value = this.get(key);\n if (_.isString(value)) return this[value];\n else if (_.isFunction(value)) return value;\n\n return !!value;\n };\n});\n\n/**\n A Backbone collection of Column instances.\n\n @class Backgrid.Columns\n @extends Backbone.Collection\n */\nvar Columns = Backgrid.Columns = Backbone.Collection.extend({\n\n /**\n @property {Backgrid.Column} model\n */\n model: Column\n});\n\n/*\n backgrid\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc. and contributors\n Licensed under the MIT license.\n*/\n\n/**\n Row is a simple container view that takes a model instance and a list of\n column metadata describing how each of the model's attribute is to be\n rendered, and apply the appropriate cell to each attribute.\n\n @class Backgrid.Row\n @extends Backbone.View\n*/\nvar Row = Backgrid.Row = Backbone.View.extend({\n\n /** @property */\n tagName: \"tr\",\n\n /**\n Initializes a row view instance.\n\n @param {Object} options\n @param {Backbone.Collection.<Backgrid.Column>|Array.<Backgrid.Column>|Array.<Object>} options.columns Column metadata.\n @param {Backbone.Model} options.model The model instance to render.\n\n @throws {TypeError} If options.columns or options.model is undefined.\n */\n initialize: function (options) {\n\n var columns = this.columns = options.columns;\n if (!(columns instanceof Backbone.Collection)) {\n columns = this.columns = new Columns(columns);\n }\n\n var cells = this.cells = [];\n for (var i = 0; i < columns.length; i++) {\n cells.push(this.makeCell(columns.at(i), options));\n }\n\n this.listenTo(columns, \"add\", function (column, columns) {\n var i = columns.indexOf(column);\n var cell = this.makeCell(column, options);\n cells.splice(i, 0, cell);\n\n var $el = this.$el;\n if (i === 0) {\n $el.prepend(cell.render().$el);\n }\n else if (i === columns.length - 1) {\n $el.append(cell.render().$el);\n }\n else {\n $el.children().eq(i).before(cell.render().$el);\n }\n });\n\n this.listenTo(columns, \"remove\", function (column, columns, opts) {\n cells[opts.index].remove();\n cells.splice(opts.index, 1);\n });\n },\n\n /**\n Factory method for making a cell. Used by #initialize internally. Override\n this to provide an appropriate cell instance for a custom Row subclass.\n\n @protected\n\n @param {Backgrid.Column} column\n @param {Object} options The options passed to #initialize.\n\n @return {Backgrid.Cell}\n */\n makeCell: function (column) {\n return new (column.get(\"cell\"))({\n column: column,\n model: this.model\n });\n },\n\n /**\n Renders a row of cells for this row's model.\n */\n render: function () {\n this.$el.empty();\n\n var fragment = document.createDocumentFragment();\n for (var i = 0; i < this.cells.length; i++) {\n fragment.appendChild(this.cells[i].render().el);\n }\n\n this.el.appendChild(fragment);\n\n this.delegateEvents();\n\n return this;\n },\n\n /**\n Clean up this row and its cells.\n\n @chainable\n */\n remove: function () {\n for (var i = 0; i < this.cells.length; i++) {\n var cell = this.cells[i];\n cell.remove.apply(cell, arguments);\n }\n return Backbone.View.prototype.remove.apply(this, arguments);\n }\n\n});\n\n/**\n EmptyRow is a simple container view that takes a list of column and render a\n row with a single column.\n\n @class Backgrid.EmptyRow\n @extends Backbone.View\n*/\nvar EmptyRow = Backgrid.EmptyRow = Backbone.View.extend({\n\n /** @property */\n tagName: \"tr\",\n\n /** @property {string|function(): string} */\n emptyText: null,\n\n /**\n Initializer.\n\n @param {Object} options\n @param {string|function(): string} options.emptyText\n @param {Backbone.Collection.<Backgrid.Column>|Array.<Backgrid.Column>|Array.<Object>} options.columns Column metadata.\n */\n initialize: function (options) {\n this.emptyText = options.emptyText;\n this.columns = options.columns;\n },\n\n /**\n Renders an empty row.\n */\n render: function () {\n this.$el.empty();\n\n var td = document.createElement(\"td\");\n td.setAttribute(\"colspan\", this.columns.length);\n var span = document.createElement(\"span\");\n span.innerHTML = _.result(this, \"emptyText\");\n td.appendChild(span);\n\n this.el.className = \"empty\";\n this.el.appendChild(td);\n\n return this;\n }\n});\n\n/*\n backgrid\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc. and contributors\n Licensed under the MIT license.\n*/\n\n/**\n HeaderCell is a special cell class that renders a column header cell. If the\n column is sortable, a sorter is also rendered and will trigger a table\n refresh after sorting.\n\n @class Backgrid.HeaderCell\n @extends Backbone.View\n */\nvar HeaderCell = Backgrid.HeaderCell = Backbone.View.extend({\n\n /** @property */\n tagName: \"th\",\n\n /** @property */\n events: {\n \"click button\": \"onClick\"\n },\n\n /**\n Initializer.\n\n @param {Object} options\n @param {Backgrid.Column|Object} options.column\n\n @throws {TypeError} If options.column or options.collection is undefined.\n */\n initialize: function (options) {\n this.column = options.column;\n if (!(this.column instanceof Column)) {\n this.column = new Column(this.column);\n }\n\n var column = this.column, collection = this.collection, $el = this.$el;\n\n this.listenTo(column, \"change:editable change:sortable change:renderable\",\n function (column) {\n var changed = column.changedAttributes();\n for (var key in changed) {\n if (changed.hasOwnProperty(key)) {\n $el.toggleClass(key, changed[key]);\n }\n }\n });\n this.listenTo(column, \"change:direction\", this.setCellDirection);\n this.listenTo(column, \"change:name change:label\", this.render);\n\n if (Backgrid.callByNeed(column.editable(), column, collection)) $el.addClass(\"editable\");\n if (Backgrid.callByNeed(column.sortable(), column, collection)) $el.addClass(\"sortable\");\n if (Backgrid.callByNeed(column.renderable(), column, collection)) $el.addClass(\"renderable\");\n\n this.listenTo(collection.fullCollection || collection, \"backgrid:sorted\", this.removeCellDirection);\n },\n\n /**\n Event handler for the collection's `backgrid:sorted` event. Removes\n all the CSS direction classes.\n */\n removeCellDirection: function () {\n this.$el.removeClass(\"ascending\").removeClass(\"descending\");\n this.column.set(\"direction\", null);\n },\n\n /**\n Event handler for the column's `change:direction` event. If this\n HeaderCell's column is being sorted on, it applies the direction given as a\n CSS class to the header cell. Removes all the CSS direction classes\n otherwise.\n */\n setCellDirection: function (column, direction) {\n this.$el.removeClass(\"ascending\").removeClass(\"descending\");\n if (column.cid == this.column.cid) this.$el.addClass(direction);\n },\n\n /**\n Event handler for the `click` event on the cell's anchor. If the column is\n sortable, clicking on the anchor will cycle through 3 sorting orderings -\n `ascending`, `descending`, and default.\n */\n onClick: function (e) {\n e.preventDefault();\n\n var column = this.column;\n var collection = this.collection;\n var event = \"backgrid:sort\";\n\n function cycleSort(header, col) {\n if (column.get(\"direction\") === \"ascending\") collection.trigger(event, col, \"descending\");\n else if (column.get(\"direction\") === \"descending\") collection.trigger(event, col, null);\n else collection.trigger(event, col, \"ascending\");\n }\n\n function toggleSort(header, col) {\n if (column.get(\"direction\") === \"ascending\") collection.trigger(event, col, \"descending\");\n else collection.trigger(event, col, \"ascending\");\n }\n\n var sortable = Backgrid.callByNeed(column.sortable(), column, this.collection);\n if (sortable) {\n var sortType = column.get(\"sortType\");\n if (sortType === \"toggle\") toggleSort(this, column);\n else cycleSort(this, column);\n }\n },\n\n /**\n Renders a header cell with a sorter, a label, and a class name for this\n column.\n */\n render: function () {\n this.$el.empty();\n var column = this.column;\n var sortable = Backgrid.callByNeed(column.sortable(), column, this.collection);\n var label;\n if(sortable){\n label = $(\"<button>\").text(column.get(\"label\")).append(\"<span class='sort-caret' aria-hidden='true'></span>\");\n } else {\n label = document.createTextNode(column.get(\"label\"));\n }\n\n this.$el.append(label);\n this.$el.addClass(column.get(\"name\"));\n this.$el.addClass(column.get(\"direction\"));\n this.delegateEvents();\n return this;\n }\n\n});\n\n/**\n HeaderRow is a controller for a row of header cells.\n\n @class Backgrid.HeaderRow\n @extends Backgrid.Row\n */\nvar HeaderRow = Backgrid.HeaderRow = Backgrid.Row.extend({\n\n /**\n Initializer.\n\n @param {Object} options\n @param {Backbone.Collection.<Backgrid.Column>|Array.<Backgrid.Column>|Array.<Object>} options.columns\n @param {Backgrid.HeaderCell} [options.headerCell] Customized default\n HeaderCell for all the columns. Supply a HeaderCell class or instance to a\n the `headerCell` key in a column definition for column-specific header\n rendering.\n\n @throws {TypeError} If options.columns or options.collection is undefined.\n */\n initialize: function () {\n Backgrid.Row.prototype.initialize.apply(this, arguments);\n },\n\n makeCell: function (column, options) {\n var headerCell = column.get(\"headerCell\") || options.headerCell || HeaderCell;\n headerCell = new headerCell({\n column: column,\n collection: this.collection\n });\n return headerCell;\n }\n\n});\n\n/**\n Header is a special structural view class that renders a table head with a\n single row of header cells.\n\n @class Backgrid.Header\n @extends Backbone.View\n */\nvar Header = Backgrid.Header = Backbone.View.extend({\n\n /** @property */\n tagName: \"thead\",\n\n /**\n Initializer. Initializes this table head view to contain a single header\n row view.\n\n @param {Object} options\n @param {Backbone.Collection.<Backgrid.Column>|Array.<Backgrid.Column>|Array.<Object>} options.columns Column metadata.\n @param {Backbone.Model} options.model The model instance to render.\n\n @throws {TypeError} If options.columns or options.model is undefined.\n */\n initialize: function (options) {\n this.columns = options.columns;\n if (!(this.columns instanceof Backbone.Collection)) {\n this.columns = new Columns(this.columns);\n }\n\n this.row = new Backgrid.HeaderRow({\n columns: this.columns,\n collection: this.collection\n });\n },\n\n /**\n Renders this table head with a single row of header cells.\n */\n render: function () {\n this.$el.append(this.row.render().$el);\n this.delegateEvents();\n return this;\n },\n\n /**\n Clean up this header and its row.\n\n @chainable\n */\n remove: function () {\n this.row.remove.apply(this.row, arguments);\n return Backbone.View.prototype.remove.apply(this, arguments);\n }\n\n});\n\n/*\n backgrid\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc. and contributors\n Licensed under the MIT license.\n*/\n\n/**\n Body is the table body which contains the rows inside a table. Body is\n responsible for refreshing the rows after sorting, insertion and removal.\n\n @class Backgrid.Body\n @extends Backbone.View\n*/\nvar Body = Backgrid.Body = Backbone.View.extend({\n\n /** @property */\n tagName: \"tbody\",\n\n /**\n Initializer.\n\n @param {Object} options\n @param {Backbone.Collection} options.collection\n @param {Backbone.Collection.<Backgrid.Column>|Array.<Backgrid.Column>|Array.<Object>} options.columns\n Column metadata.\n @param {Backgrid.Row} [options.row=Backgrid.Row] The Row class to use.\n @param {string|function(): string} [options.emptyText] The text to display in the empty row.\n\n @throws {TypeError} If options.columns or options.collection is undefined.\n\n See Backgrid.Row.\n */\n initialize: function (options) {\n\n this.columns = options.columns;\n if (!(this.columns instanceof Backbone.Collection)) {\n this.columns = new Columns(this.columns);\n }\n\n this.row = options.row || this.row || Row;\n this.rows = this.collection.map(function (model) {\n var row = new this.row({\n columns: this.columns,\n model: model\n });\n\n return row;\n }, this);\n\n this.emptyText = options.emptyText;\n this._unshiftEmptyRowMayBe();\n\n var collection = this.collection;\n this.listenTo(collection, \"add\", this.insertRow);\n this.listenTo(collection, \"remove\", this.removeRow);\n this.listenTo(collection, \"sort\", this.refresh);\n this.listenTo(collection, \"reset\", this.refresh);\n this.listenTo(collection, \"backgrid:sort\", this.sort);\n this.listenTo(collection, \"backgrid:edited\", this.moveToNextCell);\n\n this.listenTo(this.columns, \"add remove\", this.updateEmptyRow);\n },\n\n _unshiftEmptyRowMayBe: function () {\n if (this.rows.length === 0 && this.emptyText != null) {\n this.emptyRow = new EmptyRow({\n emptyText: this.emptyText,\n columns: this.columns\n });\n\n this.rows.unshift(this.emptyRow);\n return true\n }\n },\n\n /**\n This method can be called either directly or as a callback to a\n [Backbone.Collecton#add](http://backbonejs.org/#Collection-add) event.\n\n When called directly, it accepts a model or an array of models and an\n option hash just like\n [Backbone.Collection#add](http://backbonejs.org/#Collection-add) and\n delegates to it. Once the model is added, a new row is inserted into the\n body and automatically rendered.\n\n When called as a callback of an `add` event, splices a new row into the\n body and renders it.\n\n @param {Backbone.Model} model The model to render as a row.\n @param {Backbone.Collection} collection When called directly, this\n parameter is actually the options to\n [Backbone.Collection#add](http://backbonejs.org/#Collection-add).\n @param {Object} options When called directly, this must be null.\n\n See:\n\n - [Backbone.Collection#add](http://backbonejs.org/#Collection-add)\n */\n insertRow: function (model, collection, options) {\n\n if (this.rows[0] instanceof EmptyRow) this.rows.pop().remove();\n\n // insertRow() is called directly\n if (!(collection instanceof Backbone.Collection) && !options) {\n this.collection.add(model, (options = collection));\n return;\n }\n\n var row = new this.row({\n columns: this.columns,\n model: model\n });\n\n var index = collection.indexOf(model);\n this.rows.splice(index, 0, row);\n\n var $el = this.$el;\n var $children = $el.children();\n var $rowEl = row.render().$el;\n\n if (index >= $children.length) {\n $el.append($rowEl);\n }\n else {\n $children.eq(index).before($rowEl);\n }\n\n return this;\n },\n\n /**\n The method can be called either directly or as a callback to a\n [Backbone.Collection#remove](http://backbonejs.org/#Collection-remove)\n event.\n\n When called directly, it accepts a model or an array of models and an\n option hash just like\n [Backbone.Collection#remove](http://backbonejs.org/#Collection-remove) and\n delegates to it. Once the model is removed, a corresponding row is removed\n from the body.\n\n When called as a callback of a `remove` event, splices into the rows and\n removes the row responsible for rendering the model.\n\n @param {Backbone.Model} model The model to remove from the body.\n @param {Backbone.Collection} collection When called directly, this\n parameter is actually the options to\n [Backbone.Collection#remove](http://backbonejs.org/#Collection-remove).\n @param {Object} options When called directly, this must be null.\n\n See:\n\n - [Backbone.Collection#remove](http://backbonejs.org/#Collection-remove)\n */\n removeRow: function (model, collection, options) {\n\n // removeRow() is called directly\n if (!options) {\n this.collection.remove(model, (options = collection));\n if (this._unshiftEmptyRowMayBe()) {\n this.render();\n }\n return;\n }\n\n if (_.isUndefined(options.render) || options.render) {\n this.rows[options.index].remove();\n }\n\n this.rows.splice(options.index, 1);\n if (this._unshiftEmptyRowMayBe()) {\n this.render();\n }\n\n return this;\n },\n\n /**\n Rerender the EmptyRow which empties the DOM element, creates the td with the\n updated colspan, and appends it back into the DOM\n */\n\n updateEmptyRow: function () {\n if (this.emptyRow != null) {\n this.emptyRow.render();\n }\n },\n\n /**\n Reinitialize all the rows inside the body and re-render them. Triggers a\n Backbone `backgrid:refresh` event from the collection along with the body\n instance as its sole parameter when done.\n */\n refresh: function () {\n for (var i = 0; i < this.rows.length; i++) {\n this.rows[i].remove();\n }\n\n this.rows = this.collection.map(function (model) {\n var row = new this.row({\n columns: this.columns,\n model: model\n });\n\n return row;\n }, this);\n this._unshiftEmptyRowMayBe();\n\n this.render();\n\n this.collection.trigger(\"backgrid:refresh\", this);\n\n return this;\n },\n\n /**\n Renders all the rows inside this body. If the collection is empty and\n `options.emptyText` is defined and not null in the constructor, an empty\n row is rendered, otherwise no row is rendered.\n */\n render: function () {\n this.$el.empty();\n\n var fragment = document.createDocumentFragment();\n for (var i = 0; i < this.rows.length; i++) {\n var row = this.rows[i];\n fragment.appendChild(row.render().el);\n }\n\n this.el.appendChild(fragment);\n\n this.delegateEvents();\n\n return this;\n },\n\n /**\n Clean up this body and it's rows.\n\n @chainable\n */\n remove: function () {\n for (var i = 0; i < this.rows.length; i++) {\n var row = this.rows[i];\n row.remove.apply(row, arguments);\n }\n return Backbone.View.prototype.remove.apply(this, arguments);\n },\n\n /**\n If the underlying collection is a Backbone.PageableCollection in\n server-mode or infinite-mode, a page of models is fetched after sorting is\n done on the server.\n\n If the underlying collection is a Backbone.PageableCollection in\n client-mode, or any\n [Backbone.Collection](http://backbonejs.org/#Collection) instance, sorting\n is done on the client side. If the collection is an instance of a\n Backbone.PageableCollection, sorting will be done globally on all the pages\n and the current page will then be returned.\n\n Triggers a Backbone `backgrid:sorted` event from the collection when done\n with the column, direction and a reference to the collection.\n\n @param {Backgrid.Column|string} column\n @param {null|\"ascending\"|\"descending\"} direction\n\n See [Backbone.Collection#comparator](http://backbonejs.org/#Collection-comparator)\n */\n sort: function (column, direction) {\n\n if (!_.contains([\"ascending\", \"descending\", null], direction)) {\n throw new RangeError('direction must be one of \"ascending\", \"descending\" or `null`');\n }\n\n if (_.isString(column)) column = this.columns.findWhere({name: column});\n\n var collection = this.collection;\n\n var order;\n if (direction === \"ascending\") order = -1;\n else if (direction === \"descending\") order = 1;\n else order = null;\n\n var comparator = this.makeComparator(column.get(\"name\"), order,\n order ?\n column.sortValue() :\n function (model) {\n return model.cid.replace('c', '') * 1;\n });\n\n if (Backbone.PageableCollection &&\n collection instanceof Backbone.PageableCollection) {\n\n collection.setSorting(order && column.get(\"name\"), order,\n {sortValue: column.sortValue()});\n\n if (collection.fullCollection) {\n // If order is null, pageable will remove the comparator on both sides,\n // in this case the default insertion order comparator needs to be\n // attached to get back to the order before sorting.\n if (collection.fullCollection.comparator == null) {\n collection.fullCollection.comparator = comparator;\n }\n collection.fullCollection.sort();\n collection.trigger(\"backgrid:sorted\", column, direction, collection);\n column.set(\"direction\", direction);\n }\n else collection.fetch({reset: true, success: function () {\n collection.trigger(\"backgrid:sorted\", column, direction, collection);\n column.set(\"direction\", direction);\n }});\n }\n else {\n collection.comparator = comparator;\n collection.sort();\n collection.trigger(\"backgrid:sorted\", column, direction, collection);\n column.set(\"direction\", direction);\n }\n\n return this;\n },\n\n makeComparator: function (attr, order, func) {\n\n return function (left, right) {\n // extract the values from the models\n var l = func(left, attr), r = func(right, attr), t;\n\n // if descending order, swap left and right\n if (order === 1) t = l, l = r, r = t;\n\n // compare as usual\n if (l === r) return 0;\n else if (l < r) return -1;\n return 1;\n };\n },\n\n /**\n Moves focus to the next renderable and editable cell and return the\n currently editing cell to display mode.\n\n Triggers a `backgrid:next` event on the model with the indices of the row\n and column the user *intended* to move to, and whether the intended move\n was going to go out of bounds. Note that *out of bound* always means an\n attempt to go past the end of the last row.\n\n @param {Backbone.Model} model The originating model\n @param {Backgrid.Column} column The originating model column\n @param {Backgrid.Command} command The Command object constructed from a DOM\n event\n */\n moveToNextCell: function (model, column, command) {\n var i = this.collection.indexOf(model);\n var j = this.columns.indexOf(column);\n var cell, renderable, editable, m, n;\n\n // return if model being edited in a different grid\n if (j === -1) return this;\n\n this.rows[i].cells[j].exitEditMode();\n\n if (command.moveUp() || command.moveDown() || command.moveLeft() ||\n command.moveRight() || command.save()) {\n var l = this.columns.length;\n var maxOffset = l * this.collection.length;\n\n if (command.moveUp() || command.moveDown()) {\n m = i + (command.moveUp() ? -1 : 1);\n var row = this.rows[m];\n if (row) {\n cell = row.cells[j];\n if (Backgrid.callByNeed(cell.column.editable(), cell.column, model)) {\n cell.enterEditMode();\n model.trigger(\"backgrid:next\", m, j, false);\n }\n }\n else model.trigger(\"backgrid:next\", m, j, true);\n }\n else if (command.moveLeft() || command.moveRight()) {\n var right = command.moveRight();\n for (var offset = i * l + j + (right ? 1 : -1);\n offset >= 0 && offset < maxOffset;\n right ? offset++ : offset--) {\n m = ~~(offset / l);\n n = offset - m * l;\n cell = this.rows[m].cells[n];\n renderable = Backgrid.callByNeed(cell.column.renderable(), cell.column, cell.model);\n editable = Backgrid.callByNeed(cell.column.editable(), cell.column, model);\n if (renderable && editable) {\n cell.enterEditMode();\n model.trigger(\"backgrid:next\", m, n, false);\n break;\n }\n }\n\n if (offset == maxOffset) {\n model.trigger(\"backgrid:next\", ~~(offset / l), offset - m * l, true);\n }\n }\n }\n\n return this;\n }\n});\n\n/*\n backgrid\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc. and contributors\n Licensed under the MIT license.\n*/\n\n/**\n A Footer is a generic class that only defines a default tag `tfoot` and\n number of required parameters in the initializer.\n\n @abstract\n @class Backgrid.Footer\n @extends Backbone.View\n */\nvar Footer = Backgrid.Footer = Backbone.View.extend({\n\n /** @property */\n tagName: \"tfoot\",\n\n /**\n Initializer.\n\n @param {Object} options\n @param {Backbone.Collection.<Backgrid.Column>|Array.<Backgrid.Column>|Array.<Object>} options.columns\n Column metadata.\n @param {Backbone.Collection} options.collection\n\n @throws {TypeError} If options.columns or options.collection is undefined.\n */\n initialize: function (options) {\n this.columns = options.columns;\n if (!(this.columns instanceof Backbone.Collection)) {\n this.columns = new Backgrid.Columns(this.columns);\n }\n }\n\n});\n\n/*\n backgrid\n http://github.com/cloudflare/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc. and contributors\n Licensed under the MIT license.\n*/\n\n/**\n Grid represents a data grid that has a header, body and an optional footer.\n\n By default, a Grid treats each model in a collection as a row, and each\n attribute in a model as a column. To render a grid you must provide a list of\n column metadata and a collection to the Grid constructor. Just like any\n Backbone.View class, the grid is rendered as a DOM node fragment when you\n call render().\n\n var grid = Backgrid.Grid({\n columns: [{ name: \"id\", label: \"ID\", type: \"string\" },\n // ...\n ],\n collections: books\n });\n\n $(\"#table-container\").append(grid.render().el);\n\n Optionally, if you want to customize the rendering of the grid's header and\n footer, you may choose to extend Backgrid.Header and Backgrid.Footer, and\n then supply that class or an instance of that class to the Grid constructor.\n See the documentation for Header and Footer for further details.\n\n var grid = Backgrid.Grid({\n columns: [{ name: \"id\", label: \"ID\", type: \"string\" }],\n collections: books,\n header: Backgrid.Header.extend({\n //...\n }),\n footer: Backgrid.Paginator\n });\n\n Finally, if you want to override how the rows are rendered in the table body,\n you can supply a Body subclass as the `body` attribute that uses a different\n Row class.\n\n @class Backgrid.Grid\n @extends Backbone.View\n\n See:\n\n - Backgrid.Column\n - Backgrid.Header\n - Backgrid.Body\n - Backgrid.Row\n - Backgrid.Footer\n*/\nvar Grid = Backgrid.Grid = Backbone.View.extend({\n\n /** @property */\n tagName: \"table\",\n\n /** @property */\n className: \"backgrid\",\n\n /** @property */\n header: Header,\n\n /** @property */\n body: Body,\n\n /** @property */\n footer: null,\n\n /**\n Initializes a Grid instance.\n\n @param {Object} options\n @param {Backbone.Collection.<Backgrid.Columns>|Array.<Backgrid.Column>|Array.<Object>} options.columns Column metadata.\n @param {Backbone.Collection} options.collection The collection of tabular model data to display.\n @param {string} [options.caption=string] An optional caption to be added to the table.\n @param {Backgrid.Header} [options.header=Backgrid.Header] An optional Header class to override the default.\n @param {Backgrid.Body} [options.body=Backgrid.Body] An optional Body class to override the default.\n @param {Backgrid.Row} [options.row=Backgrid.Row] An optional Row class to override the default.\n @param {Backgrid.Footer} [options.footer=Backgrid.Footer] An optional Footer class.\n */\n initialize: function (options) {\n // Convert the list of column objects here first so the subviews don't have\n // to.\n if (!(options.columns instanceof Backbone.Collection)) {\n options.columns = new Columns(options.columns || this.columns);\n }\n this.columns = options.columns;\n \n this.caption = options.caption;\n\n var filteredOptions = _.omit(options, [\"el\", \"id\", \"attributes\",\n \"className\", \"tagName\", \"events\"]);\n\n // must construct body first so it listens to backgrid:sort first\n this.body = options.body || this.body;\n this.body = new this.body(filteredOptions);\n\n this.header = options.header || this.header;\n if (this.header) {\n this.header = new this.header(filteredOptions);\n }\n\n this.footer = options.footer || this.footer;\n if (this.footer) {\n this.footer = new this.footer(filteredOptions);\n }\n\n this.listenTo(this.columns, \"reset\", function () {\n if (this.header) {\n this.header = new (this.header.remove().constructor)(filteredOptions);\n }\n this.body = new (this.body.remove().constructor)(filteredOptions);\n if (this.footer) {\n this.footer = new (this.footer.remove().constructor)(filteredOptions);\n }\n this.render();\n });\n },\n\n /**\n Delegates to Backgrid.Body#insertRow.\n */\n insertRow: function () {\n this.body.insertRow.apply(this.body, arguments);\n return this;\n },\n\n /**\n Delegates to Backgrid.Body#removeRow.\n */\n removeRow: function () {\n this.body.removeRow.apply(this.body, arguments);\n return this;\n },\n\n /**\n Delegates to Backgrid.Columns#add for adding a column. Subviews can listen\n to the `add` event from their internal `columns` if rerendering needs to\n happen.\n\n @param {Object} [options] Options for `Backgrid.Columns#add`.\n */\n insertColumn: function () {\n this.columns.add.apply(this.columns, arguments);\n return this;\n },\n\n /**\n Delegates to Backgrid.Columns#remove for removing a column. Subviews can\n listen to the `remove` event from the internal `columns` if rerendering\n needs to happen.\n\n @param {Object} [options] Options for `Backgrid.Columns#remove`.\n */\n removeColumn: function () {\n this.columns.remove.apply(this.columns, arguments);\n return this;\n },\n\n /**\n Delegates to Backgrid.Body#sort.\n */\n sort: function () {\n this.body.sort.apply(this.body, arguments);\n return this;\n },\n\n /**\n Renders the grid's caption, then header, then footer, then finally the body. Triggers a\n Backbone `backgrid:rendered` event along with a reference to the grid when\n the it has successfully been rendered.\n */\n render: function () {\n this.$el.empty();\n \n if (this.caption) {\n this.$el.append($(\"<caption>\").text(this.caption));\n }\n\n if (this.header) {\n this.$el.append(this.header.render().$el);\n }\n\n if (this.footer) {\n this.$el.append(this.footer.render().$el);\n }\n\n this.$el.append(this.body.render().$el);\n\n this.delegateEvents();\n\n this.trigger(\"backgrid:rendered\", this);\n\n return this;\n },\n\n /**\n Clean up this grid and its subviews.\n\n @chainable\n */\n remove: function () {\n this.header && this.header.remove.apply(this.header, arguments);\n this.body.remove.apply(this.body, arguments);\n this.footer && this.footer.remove.apply(this.footer, arguments);\n return Backbone.View.prototype.remove.apply(this, arguments);\n }\n\n});\n return Backgrid;\n}));","/*\n backgrid-filter\n http://github.com/wyuenho/backgrid\n\n Copyright (c) 2013-present Cloudflare, Inc and contributors\n Licensed under the MIT @license.\n*/\n(function (root, factory) {\n\n // CommonJS\n // This block must come first for Webpack to resolve the require call\n if (typeof exports == \"object\") {\n module.exports = factory(\n require(\"underscore\"),\n require(\"backbone\"),\n require(\"backgrid\"),\n );\n }\n // AMD. Register as an anonymous module.\n else if (typeof define === 'function' && define.amd) {\n define(function (require, exports, module) {\n return factory(require(\"underscore\"),\n require(\"backbone\"),\n require(\"backgrid\"),\n );\n });\n }\n // Browser\n else {\n factory(root._, root.Backbone, root.Backgrid);\n }\n\n}(this, function (_, Backbone, Backgrid) {\n\n \"use strict\";\n\n var exports = {};\n\n /**\n ServerSideFilter is a search form widget that submits a query to the server\n for filtering the current collection.\n\n @class Backgrid.Extension.ServerSideFilter\n */\n var ServerSideFilter = exports.ServerSideFilter = Backgrid.Extension.ServerSideFilter = Backbone.View.extend({\n\n /** @property */\n tagName: \"form\",\n\n /** @property */\n className: \"backgrid-filter form-search\",\n\n /** @property {function(Object, ?Object=): string} template */\n template: function (data) {\n return '<span class=\"search\"> </span><input type=\"search\" ' + (data.placeholder ? 'placeholder=\"' + data.placeholder + '\"' : '') + ' name=\"' + data.name + '\" ' + (data.value ? 'value=\"' + data.value + '\"' : '') + '/><a class=\"clear\" data-backgrid-action=\"clear\" href=\"#\">×</a>';\n },\n\n /** @property */\n events: {\n \"keyup input[type=search]\": \"showClearButtonMaybe\",\n \"click a[data-backgrid-action=clear]\": \"clear\",\n \"submit\": \"search\"\n },\n\n /** @property {string} [name='q'] Query key */\n name: \"q\",\n\n /** @property {string} [value] The search box value. */\n value: null,\n\n /**\n @property {string} [placeholder] The HTML5 placeholder to appear beneath\n the search box.\n */\n placeholder: null,\n\n /**\n @param {Object} options\n @param {Backbone.Collection} options.collection\n @param {string} [options.name]\n @param {string} [options.value]\n @param {string} [options.placeholder]\n @param {function(Object): string} [options.template]\n */\n initialize: function (options) {\n ServerSideFilter.__super__.initialize.apply(this, arguments);\n this.name = options.name || this.name;\n this.value = options.value || this.value;\n this.placeholder = options.placeholder || this.placeholder;\n this.template = options.template || this.template;\n\n // Persist the query on pagination\n var collection = this.collection, self = this;\n if (Backbone.PageableCollection &&\n collection instanceof Backbone.PageableCollection &&\n collection.mode == \"server\") {\n collection.queryParams[this.name] = function () {\n return self.query() || null;\n };\n }\n },\n\n /**\n Event handler. Clear the search box and reset the internal search value.\n */\n clearSearchBox: function() {\n this.value = null;\n this.searchBox().val(null);\n this.showClearButtonMaybe();\n },\n\n /**\n Event handler. Show the clear button when the search box has text, hide\n it otherwise.\n */\n showClearButtonMaybe: function () {\n var $clearButton = this.clearButton();\n var searchTerms = this.query();\n if (searchTerms) $clearButton.show();\n else $clearButton.hide();\n },\n\n /**\n Returns the search input box.\n */\n searchBox: function () {\n return this.$el.find(\"input[type=search]\");\n },\n\n /**\n Returns the clear button.\n */\n clearButton: function () {\n return this.$el.find(\"a[data-backgrid-action=clear]\");\n },\n\n /**\n Returns the current search query.\n */\n query: function() {\n this.value = this.searchBox().val();\n return this.value;\n },\n\n /**\n Upon search form submission, this event handler constructs a query\n parameter object and pass it to Collection#fetch for server-side\n filtering.\n\n If the collection is a PageableCollection, searching will go back to the\n first page.\n */\n search: function (e) {\n if (e) e.preventDefault();\n\n var data = {};\n var query = this.query();\n if (query) data[this.name] = query;\n\n var collection = this.collection;\n\n // go back to the first page on search\n if (Backbone.PageableCollection &&\n collection instanceof Backbone.PageableCollection) {\n collection.getFirstPage({data: data, reset: true, fetch: true});\n }\n else collection.fetch({data: data, reset: true});\n },\n\n /**\n Event handler for the clear button. Clears the search box and refetch the\n collection.\n\n If the collection is a PageableCollection, clearing will go back to the\n first page.\n */\n clear: function (e) {\n if (e) e.preventDefault();\n this.clearSearchBox();\n\n var collection = this.collection;\n\n // go back to the first page on clear\n if (Backbone.PageableCollection &&\n collection instanceof Backbone.PageableCollection) {\n collection.getFirstPage({reset: true, fetch: true});\n }\n else collection.fetch({reset: true});\n },\n\n /**\n Renders a search form with a text box, optionally with a placeholder and\n a preset value if supplied during initialization.\n */\n render: function () {\n this.$el.empty().append(this.template({\n name: this.name,\n placeholder: this.placeholder,\n value: this.value\n }));\n this.showClearButtonMaybe();\n this.delegateEvents();\n return this;\n }\n\n });\n\n /**\n ClientSideFilter is a search form widget that searches a collection for\n model matches against a query on the client side. The exact matching\n algorithm can be overriden by subclasses.\n\n @class Backgrid.Extension.ClientSideFilter\n @extends Backgrid.Extension.ServerSideFilter\n */\n var ClientSideFilter = exports.ClientSideFilter = Backgrid.Extension.ClientSideFilter = ServerSideFilter.extend({\n\n /** @property */\n events: _.extend({}, ServerSideFilter.prototype.events, {\n \"click a[data-backgrid-action=clear]\": function (e) {\n e.preventDefault();\n this.clear();\n },\n \"keydown input[type=search]\": \"search\",\n \"submit\": function (e) {\n e.preventDefault();\n this.search();\n }\n }),\n\n /**\n @property {?Array.<string>} [fields] A list of model field names to\n search for matches. If null, all of the fields will be searched.\n */\n fields: null,\n\n /**\n @property [wait=149] The time in milliseconds to wait since the last\n change to the search box's value before searching. This value can be\n adjusted depending on how often the search box is used and how large the\n search index is.\n */\n wait: 149,\n\n /**\n Debounces the #search and #clear methods and makes a copy of the given\n collection for searching.\n\n @param {Object} options\n @param {Backbone.Collection} options.collection\n @param {string} [options.placeholder]\n @param {string} [options.fields]\n @param {string} [options.wait=149]\n */\n initialize: function (options) {\n ClientSideFilter.__super__.initialize.apply(this, arguments);\n\n this.fields = options.fields || this.fields;\n this.wait = options.wait || this.wait;\n\n this._debounceMethods([\"search\", \"clear\"]);\n\n var collection = this.collection = this.collection.fullCollection || this.collection;\n var shadowCollection = this.shadowCollection = collection.clone();\n\n this.listenTo(collection, \"add\", function (model, collection, options) {\n shadowCollection.add(model, options);\n });\n this.listenTo(collection, \"remove\", function (model, collection, options) {\n shadowCollection.remove(model, options);\n });\n this.listenTo(collection, \"sort\", function (col) {\n if (!this.query()) shadowCollection.reset(col.models);\n });\n this.listenTo(collection, \"reset\", function (col, options) {\n options = _.extend({reindex: true}, options || {});\n if (options.reindex && options.from == null && options.to == null) {\n shadowCollection.reset(col.models);\n }\n });\n },\n\n _debounceMethods: function (methodNames) {\n if (_.isString(methodNames)) methodNames = [methodNames];\n\n this.undelegateEvents();\n\n for (var i = 0, l = methodNames.length; i < l; i++) {\n var methodName = methodNames[i];\n var method = this[methodName];\n this[methodName] = _.debounce(method, this.wait);\n }\n\n this.delegateEvents();\n },\n\n /**\n Constructs a Javascript regular expression object for #makeMatcher.\n\n This default implementation takes a query string and returns a Javascript\n RegExp object that matches any of the words contained in the query string\n case-insensitively. Override this method to return a different regular\n expression matcher if this behavior is not desired.\n\n @param {string} query The search query in the search box.\n @return {RegExp} A RegExp object to match against model #fields.\n */\n makeRegExp: function (query) {\n return new RegExp(query.trim().split(/\\s+/).join(\"|\"), \"i\");\n },\n\n /**\n This default implementation takes a query string and returns a matcher\n function that looks for matches in the model's #fields or all of its\n fields if #fields is null, for any of the words in the query\n case-insensitively using the regular expression object returned from\n #makeRegExp.\n\n Most of time, you'd want to override the regular expression used for\n matching. If so, please refer to the #makeRegExp documentation,\n otherwise, you can override this method to return a custom matching\n function.\n\n Subclasses overriding this method must take care to conform to the\n signature of the matcher function. The matcher function is a function\n that takes a model as paramter and returns true if the model matches a\n search, or false otherwise.\n\n In addition, when the matcher function is called, its context will be\n bound to this ClientSideFilter object so it has access to the filter's\n attributes and methods.\n\n @param {string} query The search query in the search box.\n @return {function(Backbone.Model):boolean} A matching function.\n */\n makeMatcher: function (query) {\n var regexp = this.makeRegExp(query);\n return function (model) {\n var keys = this.fields || model.keys();\n for (var i = 0, l = keys.length; i < l; i++) {\n if (regexp.test(model.get(keys[i]) + \"\")) return true;\n }\n return false;\n };\n },\n\n /**\n Takes the query from the search box, constructs a matcher with it and\n loops through collection looking for matches. Reset the given collection\n when all the matches have been found.\n\n If the collection is a PageableCollection, searching will go back to the\n first page.\n */\n search: function () {\n var matcher = _.bind(this.makeMatcher(this.query()), this);\n var col = this.collection;\n if (col.pageableCollection) col.pageableCollection.getFirstPage({silent: true});\n col.reset(this.shadowCollection.filter(matcher), {reindex: false});\n },\n\n /**\n Clears the search box and reset the collection to its original.\n\n If the collection is a PageableCollection, clearing will go back to the\n first page.\n */\n clear: function () {\n this.clearSearchBox();\n var col = this.collection;\n if (col.pageableCollection) col.pageableCollection.getFirstPage({silent: true});\n col.reset(this.shadowCollection.models, {reindex: false});\n }\n\n });\n\n return exports;\n\n}));","/*\n backgrid-select-all\n http://github.com/wyuenho/backgrid\n\n Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors\n Licensed under the MIT @license.\n*/\n(function (root, factory) {\n\n // CommonJS\n if (typeof exports == \"object\") {\n module.exports = factory(require(\"backbone\"), require(\"backgrid\"));\n }\n // Browser\n else factory(root.Backbone, root.Backgrid);\n\n}(this, function (Backbone, Backgrid) {\n\n \"use strict\";\n\n /**\n Renders a checkbox for row selection.\n\n @class Backgrid.Extension.SelectRowCell\n @extends Backbone.View\n */\n var SelectRowCell = Backgrid.Extension.SelectRowCell = Backbone.View.extend({\n\n /** @property */\n className: \"select-row-cell\",\n\n /** @property */\n tagName: \"td\",\n\n /** @property */\n events: {\n \"keydown input[type=checkbox]\": \"onKeydown\",\n \"change input[type=checkbox]\": \"onChange\",\n \"click input[type=checkbox]\": \"enterEditMode\"\n },\n\n /**\n Initializer. If the underlying model triggers a `select` event, this cell\n will change its checked value according to the event's `selected` value.\n\n @param {Object} options\n @param {Backgrid.Column} options.column\n @param {Backbone.Model} options.model\n */\n initialize: function (options) {\n\n this.column = options.column;\n if (!(this.column instanceof Backgrid.Column)) {\n this.column = new Backgrid.Column(this.column);\n }\n\n var column = this.column, model = this.model, $el = this.$el;\n this.listenTo(column, \"change:renderable\", function (column, renderable) {\n $el.toggleClass(\"renderable\", renderable);\n });\n\n if (Backgrid.callByNeed(column.renderable(), column, model)) $el.addClass(\"renderable\");\n\n this.listenTo(model, \"backgrid:select\", function (model, selected) {\n this.$el.find(\"input[type=checkbox]\").prop(\"checked\", selected).change();\n });\n },\n\n /**\n Focuses the checkbox.\n */\n enterEditMode: function () {\n this.$el.find(\"input[type=checkbox]\").focus();\n },\n\n /**\n Unfocuses the checkbox.\n */\n exitEditMode: function () {\n this.$el.find(\"input[type=checkbox]\").blur();\n },\n\n /**\n Process keyboard navigation.\n */\n onKeydown: function (e) {\n var command = new Backgrid.Command(e);\n if (command.passThru()) return true; // skip ahead to `change`\n if (command.cancel()) {\n e.stopPropagation();\n this.$el.find(\"input[type=checkbox]\").blur();\n }\n else if (command.save() || command.moveLeft() || command.moveRight() ||\n command.moveUp() || command.moveDown()) {\n e.preventDefault();\n e.stopPropagation();\n this.model.trigger(\"backgrid:edited\", this.model, this.column, command);\n }\n },\n\n /**\n When the checkbox's value changes, this method will trigger a Backbone\n `backgrid:selected` event with a reference of the model and the\n checkbox's `checked` value.\n */\n onChange: function () {\n var checked = this.$el.find(\"input[type=checkbox]\").prop(\"checked\");\n this.$el.parent().toggleClass(\"selected\", checked);\n this.model.trigger(\"backgrid:selected\", this.model, checked);\n },\n\n /**\n Renders a checkbox in a table cell.\n */\n render: function () {\n this.$el.empty().append('<input tabindex=\"-1\" type=\"checkbox\" />');\n this.delegateEvents();\n return this;\n }\n\n });\n\n /**\n Renders a checkbox to select all rows on the current page.\n\n @class Backgrid.Extension.SelectAllHeaderCell\n @extends Backgrid.Extension.SelectRowCell\n */\n var SelectAllHeaderCell = Backgrid.Extension.SelectAllHeaderCell = SelectRowCell.extend({\n\n /** @property */\n className: \"select-all-header-cell\",\n\n /** @property */\n tagName: \"th\",\n\n /**\n Initializer. When this cell's checkbox is checked, a Backbone\n `backgrid:select` event will be triggered for each model for the current\n page in the underlying collection. If a `SelectRowCell` instance exists\n for the rows representing the models, they will check themselves. If any\n of the SelectRowCell instances trigger a Backbone `backgrid:selected`\n event with a `false` value, this cell will uncheck its checkbox. In the\n event of a Backbone `backgrid:refresh` event, which is triggered when the\n body refreshes its rows, which can happen under a number of conditions\n such as paging or the columns were reset, this cell will still remember\n the previously selected models and trigger a Backbone `backgrid:select`\n event on them such that the SelectRowCells can recheck themselves upon\n refreshing.\n\n @param {Object} options\n @param {Backgrid.Column} options.column\n @param {Backbone.Collection} options.collection\n */\n initialize: function (options) {\n\n this.column = options.column;\n if (!(this.column instanceof Backgrid.Column)) {\n this.column = new Backgrid.Column(this.column);\n }\n\n var collection = this.collection;\n var selectedModels = this.selectedModels = {};\n this.listenTo(collection.fullCollection || collection,\n \"backgrid:selected\", function (model, selected) {\n if (selected) selectedModels[model.id || model.cid] = 1;\n else {\n delete selectedModels[model.id || model.cid];\n this.$el.find(\"input[type=checkbox]\").prop(\"checked\", false);\n }\n });\n\n this.listenTo(collection.fullCollection || collection, \"remove\", function (model) {\n delete selectedModels[model.id || model.cid];\n });\n\n this.listenTo(collection, \"backgrid:refresh\", function () {\n var checked = this.$el.find(\"input[type=checkbox]\").prop(\"checked\");\n for (var i = 0; i < collection.length; i++) {\n var model = collection.at(i);\n if (checked || selectedModels[model.id || model.cid]) {\n model.trigger(\"backgrid:select\", model, true);\n }\n }\n });\n\n var column = this.column, $el = this.$el;\n this.listenTo(column, \"change:renderable\", function (column, renderable) {\n $el.toggleClass(\"renderable\", renderable);\n });\n\n if (Backgrid.callByNeed(column.renderable(), column, collection)) $el.addClass(\"renderable\");\n },\n\n /**\n Propagates the checked value of this checkbox to all the models of the\n underlying collection by triggering a Backbone `backgrid:select` event on\n the models on the current page, passing each model and the current\n `checked` value of the checkbox in each event.\n\n A `backgrid:selected` event will also be triggered with the current\n `checked` value on all the models regardless of whether they are on the\n current page.\n\n This method triggers a 'backgrid:select-all' event on the collection\n afterwards.\n */\n onChange: function () {\n var checked = this.$el.find(\"input[type=checkbox]\").prop(\"checked\");\n\n var collection = this.collection;\n collection.each(function (model) {\n model.trigger(\"backgrid:select\", model, checked);\n });\n\n if (collection.fullCollection) {\n collection.fullCollection.each(function (model) {\n if (!collection.get(model.cid)) {\n model.trigger(\"backgrid:selected\", model, checked);\n }\n });\n }\n\n this.collection.trigger(\"backgrid:select-all\", this.collection, checked);\n }\n\n });\n\n /**\n Convenient method to retrieve a list of selected models. This method only\n exists when the `SelectAll` extension has been included. Selected models\n are retained across pagination.\n\n @member Backgrid.Grid\n @return {Array.<Backbone.Model>}\n */\n Backgrid.Grid.prototype.getSelectedModels = function () {\n var selectAllHeaderCell;\n var headerCells = this.header.row.cells;\n for (var i = 0, l = headerCells.length; i < l; i++) {\n var headerCell = headerCells[i];\n if (headerCell instanceof SelectAllHeaderCell) {\n selectAllHeaderCell = headerCell;\n break;\n }\n }\n\n var result = [];\n if (selectAllHeaderCell) {\n var selectedModels = selectAllHeaderCell.selectedModels;\n var collection = this.collection.fullCollection || this.collection;\n for (var modelId in selectedModels) {\n result.push(collection.get(modelId));\n }\n }\n\n return result;\n };\n\n /**\n Convenient method to deselect the selected models. This method is only\n available when the `SelectAll` extension has been included.\n\n @member Backgrid.Grid\n */\n Backgrid.Grid.prototype.clearSelectedModels = function () {\n var selectedModels = this.getSelectedModels();\n for (var i = 0, l = selectedModels.length; i < l; i++) {\n var model = selectedModels[i];\n model.trigger(\"backgrid:select\", model, false);\n }\n };\n\n}));","/*\n Backgrid select-filter extension\n http://github.com/amiliaapp/backgrid-select-filter\n\n Copyright (c) 2014 Amilia Inc.\n Written by Martin Drapeau\n Licensed under the MIT @license\n */\n(function (root, factory) {\n\n // CommonJS\n // This block must come first for Webpack to resolve the require call\n if (typeof exports == \"object\") {\n module.exports = factory(\n require(\"underscore\"),\n require(\"backbone\"),\n require(\"backgrid\"),\n );\n }\n // AMD. Register as an anonymous module.\n else if (typeof define === 'function' && define.amd) {\n define(function (require, exports, module) {\n return factory(require(\"underscore\"),\n require(\"backbone\"),\n require(\"backgrid\"),\n );\n });\n }\n // Browser\n else {\n factory(root._, root.Backbone, root.Backgrid);\n }\n\n}(this, function (_, Backbone, Backgrid) {\n\n \"use strict\";\n\n var exports = {};\n\n var SelectFilter = exports.SelectFilter = Backgrid.Extension.SelectFilter = Backbone.View.extend({\n tagName: \"select\",\n className: \"backgrid-filter\",\n template: _.template([\n \"<% for (var i=0; i < options.length; i++) { %>\",\n \" <option value='<%=JSON.stringify(options[i].value)%>' <%=options[i].value === initialValue ? 'selected=\\\"selected\\\"' : ''%>><%=options[i].label%></option>\",\n \"<% } %>\"\n ].join(\"\\n\")),\n events: {\n \"change\": \"onChange\"\n },\n defaults: {\n selectOptions: undefined,\n field: undefined,\n clearValue: null,\n initialValue: undefined,\n makeMatcher: function(value) {\n return function(model) {\n return model.get(this.field) == value;\n };\n }\n },\n initialize: function(options) {\n SelectFilter.__super__.initialize.apply(this, arguments);\n\n _.defaults(this, options || {}, this.defaults);\n if (_.isEmpty(this.selectOptions) || !_.isArray(this.selectOptions)) throw \"Invalid or missing selectOptions.\";\n if (_.isEmpty(this.field) || !this.field.length) throw \"Invalid or missing field.\";\n if (this.initialValue === undefined) this.initialValue = this.clearValue;\n\n var collection = this.collection = this.collection.fullCollection || this.collection;\n var shadowCollection = this.shadowCollection = collection.clone();\n\n this.listenTo(collection, \"add\", function (model, collection, options) {\n shadowCollection.add(model, options);\n });\n this.listenTo(collection, \"remove\", function (model, collection, options) {\n shadowCollection.remove(model, options);\n });\n this.listenTo(collection, \"sort\", function (col) {\n if (this.currentValue() == this.clearValue) shadowCollection.reset(col.models);\n });\n this.listenTo(collection, \"reset\", function (col, options) {\n options = _.extend({reindex: true}, options || {});\n if (options.reindex && options.from == null && options.to == null) {\n shadowCollection.reset(col.models);\n }\n });\n },\n render: function() {\n this.$el.empty().append(this.template({\n options: this.selectOptions,\n initialValue: this.initialValue\n }));\n\t\t\tthis.onChange();\n return this;\n },\n currentValue: function() {\n return JSON.parse(this.$el.val());\n },\n onChange: function(e) {\n var col = this.collection,\n field = this.field,\n value = this.currentValue(),\n matcher = _.bind(this.makeMatcher(value), this);\n\n if (col.pageableCollection)\n col.pageableCollection.getFirstPage({silent: true});\n\n if (value !== this.clearValue)\n col.reset(this.shadowCollection.filter(matcher), {reindex: false});\n else\n col.reset(this.shadowCollection.models, {reindex: false});\n }\n });\n\n return exports;\n}));","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryHeaderView';\nimport Template from '../templates/searchGalleryHeaderView.html';\n\nexport default class SearchGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.i18nCountStr = opts.i18nCountStr || 'search:i18n.nAssets';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additonal template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tisSavedSearch: this.collection.selection.at(0).get('elementType') == 24,\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @return {string}\n\t */\n\tgetHeaderTitle() {\n\t\tconst hash = window.location.hash;\n\t\t// the regex above is failing for #search/saved/2, not picking out the id\n\t\tif (hash.includes('search/saved')) {\n\t\t\tconst hashArr = _.compact(hash.replace('#search/saved', '').split('/'));\n\t\t\tconst id = hashArr[0];\n\t\t\tconst savedSearch = Netx.search.saved && Netx.search.saved.all.get(id);\n\t\t\tthis.headerTitle = savedSearch ? _.escape(savedSearch.get('title')) : '';\n\t\t} else if (hash.includes('search/basic/')) {\n\t\t\tthis.headerTitle = _.escape(\n\t\t\t\t'\"' +\n\t\t\t\t\t_.unescapeURI(hash.replace('#search/basic/', '').split('/')[0]) +\n\t\t\t\t\t'\"',\n\t\t\t);\n\t\t} else if (hash.includes('search/exact/')) {\n\t\t\tthis.headerTitle = _.escape(\n\t\t\t\t'\"' +\n\t\t\t\t\t_.unescapeURI(hash.replace('#search/exact/', '').split('/')[0]) +\n\t\t\t\t\t'\"',\n\t\t\t);\n\t\t} else if (hash.includes('search/advanced/')) {\n\t\t\tthis.headerTitle = i18n.t('i18n.advancedSearch');\n\t\t} else if (hash.includes('search/attribute/history/')) {\n\t\t\tthis.headerTitle = i18n.t('i18n.attributeHistorySearch');\n\t\t} else if (hash.includes('search/visual/asset')) {\n\t\t\tconst asset = Netx.search.assets.visual.asset;\n\t\t\tthis.headerTitle = [\n\t\t\t\t'<a class=\"' +\n\t\t\t\t\t(asset.get('previewHeight') > asset.get('previewWidth')\n\t\t\t\t\t\t? 'thumbnail-portrait'\n\t\t\t\t\t\t: 'thumbnail-landscape') +\n\t\t\t\t\t'\" href=\"#asset/' +\n\t\t\t\t\tasset.id +\n\t\t\t\t\t'\" data-nx-control=\"visual-asset-display\">',\n\t\t\t\t'<img src=\"' + asset.get('thumbUrl') + '\">',\n\t\t\t\t'</a>',\n\t\t\t\t'<span>' + i18n.t('i18n.visualAssetSearch') + '</span>',\n\t\t\t].join('');\n\t\t} else if (hash.includes('search/visual/color')) {\n\t\t\tconst color = '#' + Netx.search.assets.visual.color;\n\t\t\tthis.headerTitle = [\n\t\t\t\t'<span class=\"nx-visual-color-display\" style=\"background:' +\n\t\t\t\t\tcolor +\n\t\t\t\t\t'\" title=\"' +\n\t\t\t\t\tcolor +\n\t\t\t\t\t'\"></span>',\n\t\t\t\ti18n.t('i18n.visualColorSearch'),\n\t\t\t].join('');\n\t\t}\n\t\treturn this.headerTitle;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SearchGalleryHeaderView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-search/views/searchGalleryHeaderView';\nimport {faSlidersH} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaSlidersH,\n});\n\nexport default class SearchGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t\tthis.i18nCountStr = null;\n\t}\n}\n","/**\n * Tile Zoom View\n * @class\n * @extends Netx.View\n * @todo Document Netx.Views.AssetZoomifyView events object\n *\n * (Presumes Leaflet (http://leafletjs.com/) with Zoomify extension (https://github.com/turban/Leaflet.Zoomify) is already loaded globally as 'L' .)\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetZoomifyView.html';\n\nimport customConfig from '../config';\n\n// Zoom libs\nimport 'core-libs/leaflet-src';\nimport 'core-libs/L.TileLayer.Zoomify';\n// Netx overrides/enhancements\nimport 'core-libs/zoomify-netx';\n\nexport default class AssetZoomifyView extends Base {\n\t/**\n\t * @override\n\t * @param {object} opts View options\n\t * @listens dispatcher#asset:zoom:zoomify:success\n\t */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t// TODO: data-nx-control\n\t\t\t\t// buttons\n\t\t\t\t'click .zoomClose': 'zoomClose',\n\t\t\t\t'click .zoomIn': 'zoomIn',\n\t\t\t\t'click .zoomOut': 'zoomOut',\n\t\t\t\t'click .zoomReset': 'zoomReset',\n\t\t\t\t// keyboard shortcuts\n\t\t\t\t// NOTE: Leaflet already catches arrow keys for pan and plus/minus for zoom, internally .\n\t\t\t\tkeydown(e) {\n\t\t\t\t\tswitch (e.which) {\n\t\t\t\t\t\tcase 48: // zero\n\t\t\t\t\t\t\tthis.zoomReset();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.id = opts.id || 'asset-zoomify-view';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// DAM-10377\n\t\t// Browser level users should not get default context menus\n\t\tif (Netx.getUserLevel() < 2) {\n\t\t\tthis.events.contextmenu = 'preventDefault';\n\t\t}\n\n\t\t// Hey, listen!\n\t\tthis\n\t\t\t// when tiles are ready & zoom is requested, this event fires\n\t\t\t.listenTo(dispatcher, 'asset:zoom:zoomify:success', (zoomifyData) => {\n\t\t\t\tthis.whenShown.then(() => {\n\t\t\t\t\tthis.startImage(zoomifyData.zoomifyDirectory);\n\t\t\t\t});\n\t\t\t})\n\t\t\t.listenTo(dispatcher, 'asset:zoom:zoomify:error', this.cancel);\n\n\t\tthis.$el.addClass('loading');\n\n\t\t// Brought over from controller - seems odd.\n\t\t// Needed?\n\t\tthis.el.focus();\n\n\t\tthis.addWatermarks = _.debounce(this.addWatermarks, 300);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additonal template vars\n\t\t_.extend(this.templateVars, {\n\t\t\t// No 'close' button if we were opened directly via a route:\n\t\t\tcanClose: !(\n\t\t\t\tNetx.router.history.length == 1 && Netx.router.history[0].match(/zoom$/)\n\t\t\t),\n\t\t});\n\t}\n\n\t/** @override */\n\tescape() {\n\t\tthis.zoomClose();\n\t}\n\n\t/** @method */\n\tgetDimensions() {\n\t\t// This should never happen, but it happens ...\n\t\tlet width = this.model.get('filewidth');\n\t\tlet height = this.model.get('fileheight');\n\t\tif (!width || !height) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'app:alert',\n\t\t\t\ti18n.t('i18n.noAssetDimensions'),\n\t\t\t\ti18n.t('i18n.warning'),\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// In JAVA world when an image does not have a dimension at least equal to 2048px\n\t\t// the image in question is upscaled. Here we fake that silly behavior and\n\t\t// at some point in the future this will break and we won't know about it because\n\t\t// these values should be obtained from a webservice and not arbitrarily hardcoded\n\t\t// here to fake some \"behavior\". Have a nice day! :-)\n\t\tif (width < 2048 && height < 2048) {\n\t\t\tlet w1 = width;\n\t\t\tlet h1 = height;\n\t\t\tlet w2, h2;\n\t\t\tif (width > height) {\n\t\t\t\tw2 = 2048;\n\t\t\t\th2 = (w2 * h1) / w1;\n\t\t\t\twidth = w2;\n\t\t\t\theight = h2;\n\t\t\t} else if (height > width) {\n\t\t\t\th2 = 2048;\n\t\t\t\tw2 = (h2 * w1) / h1;\n\t\t\t\twidth = w2;\n\t\t\t\theight = h2;\n\t\t\t} else {\n\t\t\t\twidth = 2048;\n\t\t\t\theight = 2048;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t};\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} zoomifyDirectory Directory of zoomify tiles on server\n\t */\n\tstartImage(zoomifyDirectory) {\n\t\tthis.$el.removeClass('loading');\n\n\t\t// Get zoom dimensions\n\t\tconst d = this.getDimensions();\n\n\t\t// init Leaflet Tile Viewer: http://leafletjs.com/\n\t\tthis.map && this.map.remove();\n\n\t\tthis.map = new L.Map('zoom-canvas-' + this.model.get('assetId'), {\n\t\t\t// options\n\t\t}).setView(new L.LatLng(0, 0), 0); // center the view\n\n\t\t// Are we using non-destructive watermarking?\n\t\tif (Modernizr.watermark) {\n\t\t\tthis.map.on('zoomend', this.addWatermarks);\n\t\t\tthis.map.on('moveend', this.addWatermarks);\n\t\t}\n\n\t\tL.tileLayer\n\t\t\t.zoomify('/' + zoomifyDirectory, {\n\t\t\t\twidth: d.width,\n\t\t\t\theight: d.height,\n\t\t\t\ttolerance: customConfig.ZOOM_TOLERANCE,\n\t\t\t})\n\t\t\t.addTo(this.map);\n\n\t\t// dunno where these values come from, but these are where they want to get back to:\n\t\tthis.initialZoom = this.map._zoom;\n\t\tthis.initialPan = this.map._initialCenter;\n\n\t\tthis.$('img').attr('role', 'presentation');\n\t}\n\n\t/** @method */\n\taddWatermarks(mapOb) {\n\t\t$(this._container).find('.watermark').remove();\n\t\t_.each(mapOb.target._layers, (layer) => {\n\t\t\t_.each(layer._tiles, (tile) => {\n\t\t\t\tconst $tile = $(tile);\n\t\t\t\tconst position = $tile.position();\n\t\t\t\t$tile.before(\n\t\t\t\t\t`<div class=\"watermark\" style=\"top:${position.top}px; left:${position.left}px; width:${tile.width}px; height:${tile.height}px;\"></div>`,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @fires module:asset#asset:zoom:zoomify:closed\n\t */\n\tzoomClose() {\n\t\tdispatcher.trigger('asset:zoom:zoomify:closed', this.model, this);\n\t\tthis.hide();\n\t}\n\n\t/** @method */\n\tzoomIn() {\n\t\tthis.map && this.map.zoomIn();\n\t}\n\n\t/** @method */\n\tzoomOut() {\n\t\tthis.map && this.map.zoomOut();\n\t}\n\n\t/** @method */\n\tzoomReset() {\n\t\tthis.map && this.map.setView(this.initialPan, this.initialZoom);\n\t}\n\n\t/** @override */\n\tremove() {\n\t\tthis.map && this.map.off();\n\t\tsuper.remove();\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetZoomifyView';\n\t}\n}\n","/** @override */\nimport Base from '@netx/core-asset/views/assetZoomifyView';\n\nimport {\n\tfaStop,\n\tfaTimesCircle,\n\tfaSearchMinus,\n\tfaSearchPlus,\n} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaStop,\n\tfaTimesCircle,\n\tfaSearchMinus,\n\tfaSearchPlus,\n});\n\nimport customConfig from '../config';\n\nexport default class AssetZoomifyView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = {\n\t\t\tcontextmenu: 'onRightClick',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\t\tthis.$('button.zoomClose').focus();\n\t}\n\t/** @method */\n\tonRightClick(e) {\n\t\te.preventDefault();\n\t\treturn false;\n\t}\n}\n","var tabbable = require('tabbable');\nvar xtend = require('xtend');\n\nvar activeFocusDelay;\n\nvar activeFocusTraps = (function() {\n var trapQueue = [];\n return {\n activateTrap: function(trap) {\n if (trapQueue.length > 0) {\n var activeTrap = trapQueue[trapQueue.length - 1];\n if (activeTrap !== trap) {\n activeTrap.pause();\n }\n }\n\n var trapIndex = trapQueue.indexOf(trap);\n if (trapIndex === -1) {\n trapQueue.push(trap);\n } else {\n // move this existing trap to the front of the queue\n trapQueue.splice(trapIndex, 1);\n trapQueue.push(trap);\n }\n },\n\n deactivateTrap: function(trap) {\n var trapIndex = trapQueue.indexOf(trap);\n if (trapIndex !== -1) {\n trapQueue.splice(trapIndex, 1);\n }\n\n if (trapQueue.length > 0) {\n trapQueue[trapQueue.length - 1].unpause();\n }\n }\n };\n})();\n\nfunction focusTrap(element, userOptions) {\n var doc = document;\n var container =\n typeof element === 'string' ? doc.querySelector(element) : element;\n\n var config = xtend(\n {\n returnFocusOnDeactivate: true,\n escapeDeactivates: true\n },\n userOptions\n );\n\n var state = {\n firstTabbableNode: null,\n lastTabbableNode: null,\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false\n };\n\n var trap = {\n activate: activate,\n deactivate: deactivate,\n pause: pause,\n unpause: unpause\n };\n\n return trap;\n\n function activate(activateOptions) {\n if (state.active) return;\n\n updateTabbableNodes();\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n var onActivate =\n activateOptions && activateOptions.onActivate\n ? activateOptions.onActivate\n : config.onActivate;\n if (onActivate) {\n onActivate();\n }\n\n addListeners();\n return trap;\n }\n\n function deactivate(deactivateOptions) {\n if (!state.active) return;\n\n clearTimeout(activeFocusDelay);\n\n removeListeners();\n state.active = false;\n state.paused = false;\n\n activeFocusTraps.deactivateTrap(trap);\n\n var onDeactivate =\n deactivateOptions && deactivateOptions.onDeactivate !== undefined\n ? deactivateOptions.onDeactivate\n : config.onDeactivate;\n if (onDeactivate) {\n onDeactivate();\n }\n\n var returnFocus =\n deactivateOptions && deactivateOptions.returnFocus !== undefined\n ? deactivateOptions.returnFocus\n : config.returnFocusOnDeactivate;\n if (returnFocus) {\n delay(function() {\n tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n });\n }\n\n return trap;\n }\n\n function pause() {\n if (state.paused || !state.active) return;\n state.paused = true;\n removeListeners();\n }\n\n function unpause() {\n if (!state.paused || !state.active) return;\n state.paused = false;\n updateTabbableNodes();\n addListeners();\n }\n\n function addListeners() {\n if (!state.active) return;\n\n // There can be only one listening focus trap at a time\n activeFocusTraps.activateTrap(trap);\n\n // Delay ensures that the focused element doesn't capture the event\n // that caused the focus trap activation.\n activeFocusDelay = delay(function() {\n tryFocus(getInitialFocusNode());\n });\n\n doc.addEventListener('focusin', checkFocusIn, true);\n doc.addEventListener('mousedown', checkPointerDown, {\n capture: true,\n passive: false\n });\n doc.addEventListener('touchstart', checkPointerDown, {\n capture: true,\n passive: false\n });\n doc.addEventListener('click', checkClick, {\n capture: true,\n passive: false\n });\n doc.addEventListener('keydown', checkKey, {\n capture: true,\n passive: false\n });\n\n return trap;\n }\n\n function removeListeners() {\n if (!state.active) return;\n\n doc.removeEventListener('focusin', checkFocusIn, true);\n doc.removeEventListener('mousedown', checkPointerDown, true);\n doc.removeEventListener('touchstart', checkPointerDown, true);\n doc.removeEventListener('click', checkClick, true);\n doc.removeEventListener('keydown', checkKey, true);\n\n return trap;\n }\n\n function getNodeForOption(optionName) {\n var optionValue = config[optionName];\n var node = optionValue;\n if (!optionValue) {\n return null;\n }\n if (typeof optionValue === 'string') {\n node = doc.querySelector(optionValue);\n if (!node) {\n throw new Error('`' + optionName + '` refers to no known node');\n }\n }\n if (typeof optionValue === 'function') {\n node = optionValue();\n if (!node) {\n throw new Error('`' + optionName + '` did not return a node');\n }\n }\n return node;\n }\n\n function getInitialFocusNode() {\n var node;\n if (getNodeForOption('initialFocus') !== null) {\n node = getNodeForOption('initialFocus');\n } else if (container.contains(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n node = state.firstTabbableNode || getNodeForOption('fallbackFocus');\n }\n\n if (!node) {\n throw new Error(\n 'Your focus-trap needs to have at least one focusable element'\n );\n }\n\n return node;\n }\n\n function getReturnFocusNode(previousActiveElement) {\n var node = getNodeForOption('setReturnFocus');\n return node ? node : previousActiveElement;\n }\n\n // This needs to be done on mousedown and touchstart instead of click\n // so that it precedes the focus event.\n function checkPointerDown(e) {\n if (container.contains(e.target)) return;\n if (config.clickOutsideDeactivates) {\n deactivate({\n returnFocus: !tabbable.isFocusable(e.target)\n });\n return;\n }\n // This is needed for mobile devices.\n // (If we'll only let `click` events through,\n // then on mobile they will be blocked anyways if `touchstart` is blocked.)\n if (config.allowOutsideClick && config.allowOutsideClick(e)) {\n return;\n }\n e.preventDefault();\n }\n\n // In case focus escapes the trap for some strange reason, pull it back in.\n function checkFocusIn(e) {\n // In Firefox when you Tab out of an iframe the Document is briefly focused.\n if (container.contains(e.target) || e.target instanceof Document) {\n return;\n }\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n\n function checkKey(e) {\n if (config.escapeDeactivates !== false && isEscapeEvent(e)) {\n e.preventDefault();\n deactivate();\n return;\n }\n if (isTabEvent(e)) {\n checkTab(e);\n return;\n }\n }\n\n // Hijack Tab events on the first and last focusable nodes of the trap,\n // in order to prevent focus from escaping. If it escapes for even a\n // moment it can end up scrolling the page and causing confusion so we\n // kind of need to capture the action at the keydown phase.\n function checkTab(e) {\n updateTabbableNodes();\n if (e.shiftKey && e.target === state.firstTabbableNode) {\n e.preventDefault();\n tryFocus(state.lastTabbableNode);\n return;\n }\n if (!e.shiftKey && e.target === state.lastTabbableNode) {\n e.preventDefault();\n tryFocus(state.firstTabbableNode);\n return;\n }\n }\n\n function checkClick(e) {\n if (config.clickOutsideDeactivates) return;\n if (container.contains(e.target)) return;\n if (config.allowOutsideClick && config.allowOutsideClick(e)) {\n return;\n }\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n function updateTabbableNodes() {\n var tabbableNodes = tabbable(container);\n state.firstTabbableNode = tabbableNodes[0] || getInitialFocusNode();\n state.lastTabbableNode =\n tabbableNodes[tabbableNodes.length - 1] || getInitialFocusNode();\n }\n\n function tryFocus(node) {\n if (node === doc.activeElement) return;\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n node.focus();\n state.mostRecentlyFocusedNode = node;\n if (isSelectableInput(node)) {\n node.select();\n }\n }\n}\n\nfunction isSelectableInput(node) {\n return (\n node.tagName &&\n node.tagName.toLowerCase() === 'input' &&\n typeof node.select === 'function'\n );\n}\n\nfunction isEscapeEvent(e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n}\n\nfunction isTabEvent(e) {\n return e.key === 'Tab' || e.keyCode === 9;\n}\n\nfunction delay(fn) {\n return setTimeout(fn, 0);\n}\n\nmodule.exports = focusTrap;\n","import { createBox } from '@mui/system';\nimport PropTypes from 'prop-types';\nimport { unstable_ClassNameGenerator as ClassNameGenerator } from '../className';\nimport { createTheme } from '../styles';\nconst defaultTheme = createTheme();\nconst Box = createBox({\n defaultTheme,\n defaultClassName: 'MuiBox-root',\n generateClassName: ClassNameGenerator.generate\n});\nprocess.env.NODE_ENV !== \"production\" ? Box.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * @ignore\n */\n children: PropTypes.node,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes.elementType,\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])\n} : void 0;\nexport default Box;","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/ftpShareView.html -->\\n<form class=\"form-horizontal\">\\n\t<fieldset>\\n\t\t<legend>'+\n((__t=( ftpDownloadTitle ))==null?'':__t)+\n'</legend>\\n\t\t<label data-i18n=\"share:i18n.addressBook\"></label>\\n\t\t<select>\\n\t\t\t<option> TODO </option>\\n\t\t\t<option>LATER</option>\\n\t\t</select>\\n\t\t<label data-i18n=\"share:i18n.host\"></label>\\n\t\t<label data-i18n=\"share:i18n.directory\"></label>\\n\t\t<label data-i18n=\"share:i18n.username\"></label>\\n\t\t<label data-i18n=\"share:i18n.password\"></label>\\n\t\t<label class=\"checkbox\">\\n\t\t\t<input type=\"checkbox\" data-i18n=\"share:i18n.useSFTP\"></input>\\n\t\t\t<input type=\"checkbox\" data-i18n=\"share:i18n.saveInAddressBook\"></input>\t\\n\t\t</label>\\n\t</fieldset>\\n</form>\\n';\n}\nreturn __p;\n};\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _getRequireWildcardCache(nodeInterop) {\n if (typeof WeakMap !== \"function\") return null;\n var cacheBabelInterop = new WeakMap();\n var cacheNodeInterop = new WeakMap();\n return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {\n return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n })(nodeInterop);\n}\nfunction _interopRequireWildcard(obj, nodeInterop) {\n if (!nodeInterop && obj && obj.__esModule) {\n return obj;\n }\n if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") {\n return {\n \"default\": obj\n };\n }\n var cache = _getRequireWildcardCache(nodeInterop);\n if (cache && cache.has(obj)) {\n return cache.get(obj);\n }\n var newObj = {};\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n for (var key in obj) {\n if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n if (desc && (desc.get || desc.set)) {\n Object.defineProperty(newObj, key, desc);\n } else {\n newObj[key] = obj[key];\n }\n }\n }\n newObj[\"default\"] = obj;\n if (cache) {\n cache.set(obj, newObj);\n }\n return newObj;\n}\nmodule.exports = _interopRequireWildcard, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar warning = function() {};\n\nif (__DEV__) {\n var printWarning = function printWarning(format, args) {\n var len = arguments.length;\n args = new Array(len > 1 ? len - 1 : 0);\n for (var key = 1; key < len; key++) {\n args[key - 1] = arguments[key];\n }\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n }\n\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '`warning(condition, format, ...args)` requires a warning ' +\n 'message argument'\n );\n }\n if (!condition) {\n printWarning.apply(null, [format].concat(args));\n }\n };\n}\n\nmodule.exports = warning;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = {\n RESISTANCE_COEF: 0.6,\n // This value is closed to what browsers are using internally to\n // trigger a native scroll.\n UNCERTAINTY_THRESHOLD: 3 // px\n\n};\nexports.default = _default;","export default [\n\t/**\n\t * Launch the category editor\n\t * @action\n\t * @todo document user level\n\t */\n\t{\n\t\tevent: 'category:edit',\n\t\tlabel: i18n.t('i18n.editCategory'),\n\t\tuserLevel: 7,\n\t\tmatrix: 'modify',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * Delete a category\n\t * @action\n\t */\n\t{\n\t\tevent: 'category:delete',\n\t\tlabel: i18n.t('i18n.deleteCategory'),\n\t\tuserLevel: 7,\n\t\tmatrix: 'delete',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * Go to the parent category\n\t * @action\n\t */\n\t{\n\t\tevent: 'category:gotoParent',\n\t\tlabel: i18n.t('i18n.goToParentCategory'),\n\t},\n\t/**\n\t * Import to category\n\t * @action\n\t */\n\t{\n\t\tevent: 'category:import',\n\t\tlabel: i18n.t('i18n.importToCategory'),\n\t\tuserLevel: 3,\n\t\tmatrix: 'add',\n\t\tenableTest(view) {\n\t\t\t// Importers and below can only upload to their category\n\t\t\tif (Netx.getUserLevel() < 4) {\n\t\t\t\treturn view.model.id === Netx.getUser('category');\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.id];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'category:route',\n\t\tlabel: i18n.t('i18n.goto'),\n\t\troute(model) {\n\t\t\treturn `category/${model.id}`;\n\t\t},\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'category:route:top',\n\t\tlabel: i18n.t('i18n.viewAllCategories'),\n\t},\n\t/**\n\t * List all (advanced search)\n\t * @action\n\t */\n\t{\n\t\tevent: 'category:search:listAll',\n\t\tlabel: i18n.t('i18n.listAll'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.id];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'category:tree:edit',\n\t\tlabel: i18n.t('i18n.editTree'),\n\t\tuserLevel: 7,\n\t\twrapper(view, e) {\n\t\t\treturn [view && view.collection, view, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'category:tree:edit:confirmed',\n\t\tlabel: i18n.t('i18n.finished'),\n\t\tuserLevel: 7,\n\t\twrapper(view, e) {\n\t\t\treturn [view && view.collection];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'category:tree:refresh',\n\t\tlabel: i18n.t('i18n.refresh'),\n\t\twrapper(view, e) {\n\t\t\treturn [view && view.collection];\n\t\t},\n\t},\n\t/**\n\t * Launch the add category form\n\t * @action\n\t * @todo document user level\n\t */\n\t{\n\t\tevent: 'category:add',\n\t\tlabel: i18n.t('i18n.addCategory'),\n\t\tuserLevel: 7,\n\t\tmatrix: 'modify',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/**\n\t * Add all category assets to cart\n\t * @action\n\t */\n\t{\n\t\tevent: 'category:add:to:current:cart',\n\t\tlabel: i18n.t('i18n.addAllAssetsToCurrentCart'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model ? view.model.id : view.collection.categoryId, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'category:scope:remove',\n\t\tlabel: i18n.t('i18n.removeCategory'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n];\n","import actions from '@netx/core-category/actions';\nimport {extendActions} from '@netx/core/lib/underscore-netx';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {\n\tfaPencilAlt,\n\tfaSearch,\n\tfaTrashAlt,\n\tfaUpload,\n} from '@fortawesome/pro-solid-svg-icons';\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaPencilAlt: icon(faPencilAlt, iconOpts).html,\n\tfaSearch: icon(faSearch, iconOpts).html,\n\tfaTrashAlt: icon(faTrashAlt, iconOpts).html,\n\tfaUpload: icon(faUpload, iconOpts).html,\n};\n\n// Extend actions defined in core file\nlet newActions = extendActions(actions, [\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'category:asset:requests',\n\t\ticon: icons.faUpload,\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'category:asset:request:delete',\n\t\ticon: icons.faTrashAlt,\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'category:asset:request:edit',\n\t\ticon: icons.faPencilAlt,\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'category:search:listAll',\n\t\ticon: icons.faSearch,\n\t},\n]);\n\n// New actions\nnewActions = newActions.concat([\n\t/** @action */\n\t{\n\t\tevent: 'category:tree:toggle',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.id, view.model.get('tree')];\n\t\t},\n\t},\n]);\n\nexport default newActions;\n","import Menu from '@netx/core/lib/netx-menu';\n\nexport default {\n\t/**\n\t * Context menu for a single miniAsset\n\t */\n\tcategoryContextMenu: new Menu({\n\t\tactions: [\n\t\t\t'share:category:download',\n\t\t\t'share:category:createPDF',\n\t\t\t'share:category:menu',\n\t\t\t'category:search:listAll',\n\t\t\t'category:import',\n\t\t\t'category:edit',\n\t\t\t['category:delete'],\n\t\t],\n\t}),\n\tcategoryList: new Menu({\n\t\tactions: ['category:add'],\n\t}),\n};\n","import menus from '@netx/core-category/menus';\nimport Menu from '@netx/core/lib/netx-menu';\n\nmenus.categoryContextMenu = new Menu({\n\tactions: [\n\t\t'share:category:download',\n\t\t'share:category:createPDF',\n\t\t'share:category:menu',\n\t\t'category:search:listAll',\n\t],\n});\n\nexport default menus;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '@netx/core-app/models/labelValue';\n\nexport default class RecentCategories extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch recent categories\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @method */\n\t\t\tread: ['getRecentCategories', 'results'],\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Max results\n\t\t * @type {number}\n\t\t * @default\n\t\t */\n\t\tthis.results = opts.results || 25;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'RecentCategories';\n\t}\n}\n","export default {\n\t/**\n\t * Displays the most recently viewed categories\n\t * @route\n\t * @todo Should the getRecentCategories() method return categoryBeans\n\t * so that we can just piggy back on the categories.js collection?\n\t */\n\t'category/recent'() {\n\t\tdispatcher.trigger('category:getRecent');\n\t},\n\t/**\n\t * Prevent the share module's psuedo-route from re-firing if we reload.\n\t * @route\n\t * @param {number} id Id of category to share\n\t */\n\t'category/:id/share'(id) {\n\t\t// used by various downloaders\n\t\tNetx.router.reroute('category/' + id, true);\n\t},\n\t/**\n\t * Prevent the create-PDF psuedo-route from re-firing if we reload.\n\t * @route\n\t * @param {number} id Id of category to create pdf from\n\t */\n\t'category/:id/pdf'(id) {\n\t\tNetx.router.reroute('category/' + id, true);\n\t},\n\t/**\n\t * @route\n\t * Fetch and display the assets for a category page\n\t * @param {number} id\n\t * @param {number} pageId\n\t */\n\t'category/:id(/page/:page)': 'category',\n};\n","import {\n\tfaCloudUploadAlt,\n\tfaPencilAlt,\n\tfaSearch,\n\tfaTrashAlt,\n\tfaFolderPlus,\n} from '@fortawesome/pro-solid-svg-icons';\n\nimport //faFolderPlus\n'@fortawesome/pro-regular-svg-icons';\n\nexport const CATEGORY_ICON = <const>{\n\tADD: faFolderPlus,\n\tADD_SUBFOLDER: faFolderPlus,\n\tDELETE: faTrashAlt,\n\tEDIT: faPencilAlt,\n\tIMPORT: faCloudUploadAlt,\n\tSEARCH_ALL_ASSETS: faSearch,\n};\n\nexport type CategoryBaseEvent = typeof CATEGORY_BASE_EVENT;\n\nexport const CATEGORY_BASE_EVENT = `category:hack`;\n\nexport const CATEGORY_EVENT = <const>{\n\tADD: `${CATEGORY_BASE_EVENT}:add`,\n\tDELETE: `${CATEGORY_BASE_EVENT}:delete`,\n\tEDIT: `${CATEGORY_BASE_EVENT}:edit`,\n\tIMPORT: `${CATEGORY_BASE_EVENT}:import`,\n\tORGANIZE_ASSETS: `${CATEGORY_BASE_EVENT}:organize:assets`,\n\tSEARCH_ALL_ASSETS: `${CATEGORY_BASE_EVENT}:search:listAll`,\n};\n","import {dispatcher} from '@netx/core/bootstrap';\nimport CategoryModel from '@netx/core-category/models/category';\nimport type {Category, CategoryId} from '@netx/core-category/types';\nimport {CATEGORY_EVENT, CATEGORY_BASE_EVENT} from './actions';\nimport {CategorizeAssetsAction} from '../../constants';\nimport type {Asset} from '@netx/core-asset/types';\n\ndispatcher.once(`${CATEGORY_BASE_EVENT}:init`, () => {\n\t/**\n\t * This is a holdover for react until we can reqork share\n\t * We take the `Category` and convert it over to an `CategoryModel`\n\t * and then pass along to the original event\n\t */\n\tdispatcher.on(CATEGORY_EVENT.ADD, (category?: Category) => {\n\t\tconst model = category && new CategoryModel(category);\n\t\tdispatcher.trigger(`category:add`, model);\n\t});\n\n\t/**\n\t * This is a holdover for react until we can reqork share\n\t * We take the `Category` and convert it over to an `CategoryModel`\n\t * and then pass along to the original event\n\t */\n\tdispatcher.on(CATEGORY_EVENT.DELETE, (category: Category) => {\n\t\tconst model = new CategoryModel(category);\n\t\tdispatcher.trigger(`category:delete`, model);\n\t});\n\n\t/**\n\t * This is a holdover for react until we can reqork share\n\t * We take the `Asset` and convert it over to an `AssetModel`\n\t * and then pass along to the original event\n\t */\n\tdispatcher.on(CATEGORY_EVENT.EDIT, (category: Category) => {\n\t\tconst model = new CategoryModel(category);\n\t\tdispatcher.trigger(`category:edit`, model);\n\t});\n\n\t/**\n\t * This is a holdover for react until we can reqork share\n\t * We take the `Asset` and convert it over to an `AssetModel`\n\t * and then pass along to the original event\n\t */\n\tdispatcher.on(CATEGORY_EVENT.IMPORT, (categoryId: CategoryId) => {\n\t\tdispatcher.trigger(`category:import`, categoryId);\n\t});\n\n\t/**\n\t * This is a holdover for react until we can reqork share\n\t * We take the `Asset` and convert it over to an `AssetModel`\n\t * and then pass along to the original event\n\t */\n\tdispatcher.on(CATEGORY_EVENT.SEARCH_ALL_ASSETS, (categoryId: CategoryId) => {\n\t\tdispatcher.trigger(`category:search:listAll`, categoryId);\n\t});\n\n\tdispatcher.on(\n\t\tCATEGORY_EVENT.ORGANIZE_ASSETS,\n\t\t(\n\t\t\taction: CategorizeAssetsAction,\n\t\t\tasset: Asset,\n\t\t\ttoCategoryId: CategoryId,\n\t\t\tfromCategoryId: CategoryId,\n\t\t) => {\n\t\t\taction === CategorizeAssetsAction.ADD\n\t\t\t\t? asset.inCurrentCart\n\t\t\t\t\t? dispatcher.trigger('cart:add:assets:to:category:confirmed', {\n\t\t\t\t\t\t\tcategoryId: toCategoryId,\n\t\t\t\t\t })\n\t\t\t\t\t: dispatcher.trigger(\n\t\t\t\t\t\t\t'asset:category:add:confirmed',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcategoryId: toCategoryId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tasset,\n\t\t\t\t\t )\n\t\t\t\t: asset.inCurrentCart\n\t\t\t\t? dispatcher.trigger('cart:move:assets:to:category:confirmed', {\n\t\t\t\t\t\tcategoryId: toCategoryId,\n\t\t\t\t })\n\t\t\t\t: dispatcher.trigger(\n\t\t\t\t\t\t'asset:category:move',\n\t\t\t\t\t\tasset,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\ttoCategoryId,\n\t\t\t\t );\n\t\t},\n\t);\n\n\tdispatcher.trigger(`${CATEGORY_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${CATEGORY_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${CATEGORY_BASE_EVENT}:initialized`, () => resolve());\n\t\t\tdispatcher.trigger(`${CATEGORY_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","/**\n * The category module handles retrieving and displaying\n * category information, category tree, and category management\n *\n * @module category\n */\n\n// Models\nimport CoreModel from '@netx/core/lib/netx-model';\nimport CategoryModel from './models/category';\n\n// Collections\nimport AssetSearchRulesCollection from '@netx/core-search/collections/searchRules_assets';\nimport CategoriesCollection from './collections/categories';\nimport CategoryAssetsCollection from './collections/categoryAssets';\nimport CategoryTreeNodesCollection from './collections/categoryTreeNodes';\nimport RecentCategoriesCollection from './collections/recentCategories';\n\nimport {createCategoryIdRule} from '@netx/core-search-rules/rules/categoryId/categoryIdRule';\nimport {convertToRules} from '@netx/core-search-rules/utils/convertToRules';\n\nimport customConfig from './config';\nimport routes from './routes';\n\nimport _CategoryController from './services/category/controller';\nimport {canAddCategory} from './services/category/enablers';\n\n// MODULE INITIALIZATION\n// =====================\n// All collection and model instances and event listeners\n// are created when the module is initialized.\n\n/**\n * Init handler\n * @event module:cart#category:init\n * @param {object} options Normally undefined, but a manual init trigger may override properties of Netx.custom.category here.\n */\ndispatcher.once('category:init', function (options) {\n\t// Each module should create it's own object that is used to store\n\t// custom options, collection/model/view instances and module properties\n\tconst NS = (Netx.category = {});\n\n\tconst router = Netx.router,\n\t\tmodalViews = Netx.app.modalViews;\n\n\t//=================================\n\t//\tCREATE MODELS AND COLLECTIONS\n\t//=================================\n\t// Add module options to module object and make the options variable available\n\tNS.options = options = _.extend({}, customConfig, options);\n\n\tNS.current = new CategoryModel({}, {collection: NS.tree});\n\tNS.list = new CategoriesCollection([], {\n\t\tcache: NS.tree,\n\t\tcurrentCat: NS.current,\n\t});\n\tNS.recent = new RecentCategoriesCollection();\n\tNS.assets = new CategoryAssetsCollection([], {\n\t\tcategoryId: options.categoryid,\n\t\tdirectory: options.repositorydirectory,\n\t});\n\n\tNS.bootstrap = [_CategoryController.initialize()];\n\n\t//=================================\n\t//\t!CREATE MODELS AND COLLECTIONS\n\t//=================================\n\n\t// !! IMPORTANT !!\n\t//\n\t// DEVNOTE: @spence - Check if there is a user available to the module\n\t// before bootstrapping basic category functionality.\n\t// There are some unique situations where we need category module functionality\n\t// via tokenKey access but without sessionKey access.\n\t//\n\n\t// This check was initially added to support asset request functionality.\n\tif (Netx.getUserLevel() > 0) {\n\t\t// Create category tree collection\n\t\tif (options.tree) {\n\t\t\tNS.tree = new CategoryTreeNodesCollection([], {\n\t\t\t\tcategoryid: NS.options.categoryid,\n\t\t\t});\n\t\t\tNS.tree.fetch();\n\t\t}\n\t}\n\n\t// This event is fired by the category model whenever its id is changed\n\tNS.current.on('change:categoryid', function (category, categoryid, opts) {\n\t\tNS.current.fetch().then(\n\t\t\tfunction (cat) {\n\t\t\t\t// If not top level, trigger the category to open\n\t\t\t\tif (NS.current.id !== NS.options.categoryid) {\n\t\t\t\t\tdispatcher.trigger('category:tree:open', NS.current.id, NS.tree);\n\t\t\t\t}\n\t\t\t\tdispatcher.trigger('category:current:update:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('category:current:update:error', err);\n\t\t\t},\n\t\t);\n\t});\n\n\t// NOTE: UI-specific handlers get the Window object as their context, so they can be easily replaced by custom controllers\n\t// without removing other important listeners.\n\n\t//=================================\n\t// COLLECTION AND MODEL EVENT LISTENERS\n\t//=================================\n\n\t// Sometimes, due to timing we do not get our proper active classes on non top level cats\n\t// I would love to put this in the collection but now we have multiple instances of CategoryTreeNodes with\n\t// varying needs (this is the only tree that cares about route currently) -jse-\n\tif (NS.tree && options.tree) {\n\t\tNS.tree.on(\n\t\t\t'sync',\n\t\t\t_.debounce(function () {\n\t\t\t\t// Vars\n\t\t\t\tvar id = NS.current.id;\n\t\t\t\t// `Top level` is of no concern\n\t\t\t\tif (id > 1) {\n\t\t\t\t\tconst cat = this.get(id);\n\t\t\t\t\tif (cat) {\n\t\t\t\t\t\tcat.trigger('activate');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, 150),\n\t\t);\n\t}\n\n\t// Category current\n\n\t/**\n\t * This event takes a data object as a parameter that\n\t * corresponds to one or more of the catetgory model\n\t * attributes and is used to update the current category state\n\t * @event module:category#category:current:update\n\t * @param {object} data Object corresponding to one or more category attributes\n\t * @see module:category#category:current:update:error\n\t * @see module:category#category:current:update:success\n\t */\n\tdispatcher.on('category:current:update', function (data, page) {\n\t\tif (data.categoryid === NS.current.id) {\n\t\t\tNS.current.trigger('sync', NS.current);\n\t\t} else {\n\t\t\t// Keep in mind almost everytime we are just updating the categoryid\n\t\t\t// See the listener above on `change:categoryid`\n\t\t\tNS.current.set(data);\n\t\t}\n\t});\n\t/**\n\t * @event module:category#category:current:update:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @fires module:category#category:route:top\n\t */\n\tdispatcher.on(\n\t\t'category:current:update:error',\n\t\tfunction (error) {\n\t\t\t// Fire off error alert\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t\t// Route to top level\n\t\t\tdispatcher.trigger('category:route:top');\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:category#category:current:update:success\n\t */\n\tdispatcher.on(\n\t\t'category:current:update:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t//=================================\n\t// !COLLECTION AND MODEL EVENT LISTENERS\n\t//=================================\n\n\t//=================================\n\t//\tEVENT LISTENERS\n\t//=================================\n\t// Category events that are passed through the\n\t// dispatcher and available to all modules.\n\n\t//============================================\n\t//\tCategory assets\n\t//============================================\n\t/**\n\t * If an asset was deleted, remove it from our collection if it's there.\n\t * @event module:category#asset:deleted\n\t * @param {number} assetid Asset id\n\t */\n\tdispatcher.on('asset:deleted', function (assetId) {\n\t\tassetId = parseInt(assetId);\n\t\tvar out = NS.assets.find(function (a) {\n\t\t\treturn a.get('assetId') === assetId;\n\t\t});\n\t\tif (out) {\n\t\t\tNS.assets.remove(out);\n\t\t}\n\t});\n\n\t/**\n\t * Add all assets in a category to the current cart (this does not clear current cart's assets)\n\t * @event module:category#category:add:to:current:cart\n\t * @param {number} id Category id\n\t * @fires module:cart#cart:addAll\n\t * @see module:cart#cart:addAll:error\n\t * @see module:cart#cart:addAll:success\n\t */\n\tdispatcher.on('category:add:to:current:cart', function (id) {\n\t\tdispatcher.trigger(\n\t\t\t'cart:addAll',\n\t\t\tnew AssetSearchRulesCollection([\n\t\t\t\t{\n\t\t\t\t\telementType: 23, // search type \"category id\"\n\t\t\t\t\telementValue1: parseInt(id), // id of category\n\t\t\t\t\telementSubType1: 2, // stop recurse\n\t\t\t\t},\n\t\t\t]),\n\t\t);\n\t});\n\t//============================================\n\t//\t!Category assets\n\t//============================================\n\n\t//============================================\n\t//\tCategory route\n\t//============================================\n\t/**\n\t * Routes to a categories parent\n\t * @event module:category#category:gotoParent\n\t */\n\tdispatcher.on('category:gotoParent', function () {\n\t\tconst parentId = NS.current.get('parentid');\n\t\tNetx.router.navigate(parentId > 1 ? 'category/' + parentId : '/', {\n\t\t\ttrigger: true,\n\t\t});\n\t});\n\t/**\n\t * Handler for the default category route: reroute to the default category id route\n\t * @event module:category#category:route:top\n\t */\n\tdispatcher.on('category:route:top', function () {\n\t\t// set the route:\n\t\tNetx.router.navigate('category/' + NS.options.categoryid, {trigger: true});\n\t});\n\t/**\n\t * UI Handler\n\t * Top level tree navigation occured\n\t * @event module:category#category:top:routed\n\t */\n\tdispatcher.on(\n\t\t'category:top:routed',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @route\n\t * @fires module:category#category:routed\n\t */\n\trouter.on(\n\t\t'route:category',\n\t\t_.debounce((id, page) => {\n\t\t\t// DAM-16156 - debouncing category routing\n\t\t\t// to prevent our crazy code from looping\n\t\t\tdispatcher.trigger('category:routed', id, page);\n\t\t}, 1),\n\t);\n\t/**\n\t * Main route handler for categories\n\t * @event module:category#category:routed\n\t * @param {number} id Category id\n\t * @param {number} page Page number\n\t * @fires module:category#category:current:update\n\t * @fires module:category#category:tree:open\n\t * @fires module:category#category:gallery:show\n\t * @fires module:category#category:top:routed\n\t */\n\tdispatcher.on('category:routed', function (id, page) {\n\t\tconst opts = NS.options;\n\t\tif (id === opts.categoryid) {\n\t\t\tdispatcher.trigger('category:current:update', {\n\t\t\t\tcategoryid: opts.categoryid,\n\t\t\t\trepositorydirectory: opts.repositorydirectory,\n\t\t\t});\n\t\t\tdispatcher.trigger('category:top:routed');\n\t\t}\n\t\t// Anything but the top level routed\n\t\telse {\n\t\t\tdispatcher.trigger('category:current:update', {categoryid: id}, page);\n\t\t}\n\n\t\t// TODO: move this original code to portal\n\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\tconditions: convertToRules(createCategoryIdRule({id: parseInt(id)})),\n\t\t\tpage: parseInt(page) || 1,\n\t\t});\n\t});\n\t//============================================\n\t//\t!Category route\n\t//============================================\n\n\t//============================================\n\t//\tCategory add/edit\n\t//============================================\n\t/**\n\t * @event module:category#category:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'category:edit:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-categoryEdit\" */ './views/categoryEditView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['category:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Launches the category editor\n\t * @event module:category#category:add\n\t * @param {Netx.Models.Category} parentCat Parent category model\n\t * @fires module:category#category:edit\n\t */\n\tdispatcher.on('category:add', function (parentCat, e) {\n\t\t// Event silencing\n\t\tif (e && e.preventDefault) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// if no model, add category from main folder tree footer\n\t\tif (!parentCat || !parentCat.constructor?.__isModel__) {\n\t\t\t// if we are routed to a category, assume that as the parent of the new category\n\t\t\tif (window.location.hash.includes('category/' + NS.current.id)) {\n\t\t\t\tparentCat = NS.current;\n\t\t\t}\n\t\t}\n\n\t\tconst catInfo =\n\t\t\tparentCat && canAddCategory(parentCat.attributes)\n\t\t\t\t? {\n\t\t\t\t\t\tparentid: parentCat.id,\n\t\t\t\t\t\tparentCategoryName: parentCat.get('name'),\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\tparentid: 1,\n\t\t\t\t\t\tparentCategoryName: i18n.t('i18n.topLevelCategoryLabel'),\n\t\t\t\t };\n\n\t\tvar model = new CategoryModel(catInfo, NS.current.tree);\n\n\t\tdispatcher.trigger('category:edit', model);\n\t});\n\t/**\n\t * Prepares and calls the category editor if the event parameter is passed\n\t * cageory edit view is displayed if there is no event param the\n\t * category view displays a blank form for adding a new category.\n\t * @event module:category#category:edit\n\t * @param {Netx.Models.Category} model Category model\n\t * @param {event} e jQuery event\n\t * @fires module:category#category:edit:error\n\t * @fires module:category#category:edit:show\n\t * @see module:category#category:edit:confirmed\n\t */\n\tdispatcher.on('category:edit', function (model, e) {\n\t\t// Event silencing\n\t\t// TODO: this is only really necessary because of our tableViews row clicking\n\t\tif (e && e.preventDefault) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\tvar promises = [];\n\t\tif (!model.isNew()) {\n\t\t\tpromises.push(model.getCategoryDetailsData());\n\n\t\t\t// DAM-16146 - If admin user, get selected attribute profile for folder\n\t\t\tif (Netx.getUserLevel() >= 9) {\n\t\t\t\tpromises.push(model.getAttributeProfile());\n\t\t\t}\n\t\t}\n\n\t\t$.when.apply($, promises).then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('category:edit:show', {\n\t\t\t\t\tmodel: model,\n\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('category:edit:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:category#category:edit:confirmed\n\t * @param {object} data Category data\n\t * @param {Netx.Models.Category} model Category model\n\t * @fires module:category#category:add:error\n\t * @fires module:category#category:add:success\n\t * @fires module:category#category:children:changed\n\t * @fires module:category#category:children:changed:(parentid)\n\t */\n\tdispatcher.on('category:edit:confirmed', function (data, model) {\n\t\tvar isNew = model.isNew(),\n\t\t\tbeforeParentId;\n\n\t\tif (!isNew) {\n\t\t\t// My parent as of this moment\n\t\t\tbeforeParentId = parseInt(model.get('parentid'));\n\t\t}\n\n\t\t// Set it\n\t\tmodel.parseAndSave(data).then(\n\t\t\tfunction () {\n\t\t\t\tconst parentid = parseInt(model.get('parentid'));\n\t\t\t\t// New category\n\t\t\t\tif (isNew) {\n\t\t\t\t\t// Get it in the list (if applicable)\n\t\t\t\t\tif (parentid === NS.current.id) {\n\t\t\t\t\t\tNS.list.add(model);\n\t\t\t\t\t}\n\t\t\t\t\t// trigger category:children:changed event with the category's parent\n\t\t\t\t\tdispatcher.trigger('category:children:changed', parentid, model);\n\t\t\t\t\tdispatcher.trigger('category:children:changed:' + parentid, model);\n\t\t\t\t\t// For backwards compatability\n\t\t\t\t\tdispatcher.trigger('category:add:success', model);\n\t\t\t\t}\n\t\t\t\t// Exisiting category\n\t\t\t\telse {\n\t\t\t\t\t// Did the category move?\n\t\t\t\t\tif (beforeParentId !== parentid) {\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'category:moved',\n\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\tbeforeParentId,\n\t\t\t\t\t\t\tparentid,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'category:children:changed',\n\t\t\t\t\t\t\tbeforeParentId,\n\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatcher.trigger('category:children:changed', parentid, model);\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'category:children:changed:' + beforeParentId,\n\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatcher.trigger('category:children:changed:' + parentid, model);\n\t\t\t\t\t\t// NS.tree.fetchCategory( model.get('parentid') );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// DAM-15698 - Get updated category data\n\t\t\t\tmodel.fetch();\n\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'category:edit:success',\n\t\t\t\t\tmodel,\n\t\t\t\t\tisNew,\n\t\t\t\t\t!isNew && beforeParentId !== parentid,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('category:edit:error', err, model);\n\t\t\t\t// For backwards compatability\n\t\t\t\tdispatcher.trigger('category:add:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:category#category:edit:error\n\t * @param {Netx.Models.Category} model Category model\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'category:edit:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:category#category:edit:success\n\t * @param {Netx.Models.Category} model Category model\n\t * @param {boolean} isNew New category\n\t * @param {boolean} newParent Whether the category got a new parent or not\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'category:edit:success',\n\t\tfunction (model, isNew, newParent) {\n\t\t\tif (model instanceof CategoryModel) {\n\t\t\t\tconst name = model.get('name');\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'category',\n\t\t\t\t\ttitle: isNew\n\t\t\t\t\t\t? i18n.t('i18n.categoryAdded')\n\t\t\t\t\t\t: i18n.t('i18n.categoryUpdated'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tdescription: isNew\n\t\t\t\t\t\t? i18n.t('i18n.categorySuccessfullyAdded', {category: name})\n\t\t\t\t\t\t: i18n.t('i18n.categorySuccessfullyUpdated', {\n\t\t\t\t\t\t\t\tcategory: name,\n\t\t\t\t\t\t }),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Category add/edit\n\t//============================================\n\n\t//============================================\n\t//\tCategory delete\n\t//============================================\n\t/**\n\t * Handles a request to delete a category\n\t * @event module:category#category:delete\n\t * @param {Netx.Models.Category} model Category model\n\t * @fires module:app#app:confirm\n\t * @see module:category#category:delete:confirmed\n\t * @see module:category#category:delete:prepare\n\t * @see module:category#category:delete:prepare:error\n\t * @see module:category#category:delete:prepare:success\n\t */\n\tdispatcher.on('category:delete', function (model) {\n\t\t// Notify we are preparing to delete\n\t\tdispatcher.trigger('category:delete:prepare', model);\n\n\t\t// fetch stats for the category:\n\t\tmodel.getDetails().then(\n\t\t\tfunction (data) {\n\t\t\t\t// For clarity's sake:\n\t\t\t\tdata.assetCount = data.fileCount;\n\n\t\t\t\t// The i18n for this message is slightly complicated, because it can contain various mixtures of stats:\n\t\t\t\t// Vars\n\t\t\t\tvar assetCountStr, byteCountStr, message, subCategoryCountStr;\n\n\t\t\t\tmessage = '';\n\t\t\t\tassetCountStr = i18n.t('i18n.assetCount', {\n\t\t\t\t\tcount: data.assetCount,\n\t\t\t\t});\n\t\t\t\tsubCategoryCountStr = i18n.t('i18n.subCategoryCount', {\n\t\t\t\t\tcount: data.subCategoryCount,\n\t\t\t\t});\n\n\t\t\t\t// The DAM translates this one value (but not the others!?!?) to a string:\n\t\t\t\tbyteCountStr = data.byteCount;\n\n\t\t\t\tif (!data.assetCount && !data.subCategoryCount) {\n\t\t\t\t\t// No contents at all.\n\t\t\t\t\tmessage = i18n.t('i18n.confirmDeleteEmpty', {\n\t\t\t\t\t\tname: model.get('name'),\n\t\t\t\t\t});\n\t\t\t\t} else if (!data.assetCount) {\n\t\t\t\t\t// No assets, just subcategories\n\t\t\t\t\tmessage = i18n.t('i18n.confirmDeleteWithoutAssets', {\n\t\t\t\t\t\tname: model.get('name'),\n\t\t\t\t\t\tsubCategoryCount: subCategoryCountStr,\n\t\t\t\t\t});\n\t\t\t\t} else if (!data.subCategoryCount) {\n\t\t\t\t\t// No subcategoriess, just assets\n\t\t\t\t\tmessage = i18n.t('i18n.confirmDeleteWithoutSubCategories', {\n\t\t\t\t\t\tname: model.get('name'),\n\t\t\t\t\t\tassetCount: assetCountStr,\n\t\t\t\t\t\tbyteCount: byteCountStr,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Both assets and categories\n\t\t\t\t\tmessage = i18n.t('i18n.confirmDelete', {\n\t\t\t\t\t\tname: model.get('name'),\n\t\t\t\t\t\tsubCategoryCount: subCategoryCountStr,\n\t\t\t\t\t\tassetCount: assetCountStr,\n\t\t\t\t\t\tbyteCount: byteCountStr,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Preparation was a success\n\t\t\t\tdispatcher.trigger('category:delete:prepare:success', model);\n\n\t\t\t\t// Request confirmation:\n\t\t\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\t\t\tmessage: message,\n\t\t\t\t\teventStr: 'category:delete',\n\t\t\t\t\targs: [model],\n\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('category:delete:prepare:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * When the category edit form fires category:delete:confirmed,\n\t * destroy the category model & remove it from everywhere.\n\t * and category tree and hides the category view.\n\t * @event module:category#category:delete:confirmed\n\t * @param {Netx.Models.Category} model Category model\n\t * @fires module:category#category:delete:error\n\t * @fires module:category#category:delete:success\n\t * @fires module:category#category:children:changed\n\t * @fires module:category#category:children:changed:(parentid)\n\t */\n\tdispatcher.on('category:delete:confirmed', function (model) {\n\t\t// Check if current category is still a valid one\n\t\tvar currentCatDestroyed = NS.current.id === model.id || NS.current.id === 0;\n\n\t\t// tell the server to destroy the model associated with this view\n\t\tmodel.destroy({wait: true}).then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tNS.options.tree && NS.list.remove(model);\n\n\t\t\t\tdispatcher.trigger('category:children:changed', model.get('parentid'));\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'category:children:changed:' + model.get('parentid'),\n\t\t\t\t);\n\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'category:delete:success',\n\t\t\t\t\tmodel,\n\t\t\t\t\tcurrentCatDestroyed,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('category:delete:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:category#category:delete:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'category:delete:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:category#category:delete:success\n\t * @param {Netx.Models.Category} model Category model\n\t * @param {boolean} currentCatDestroyed Whether or not current category is no more (useful for routing away, etc)\n\t * @fires module:notification#notification\n\t * @fires module:category#category:gotoParent\n\t */\n\tdispatcher.on(\n\t\t'category:delete:success',\n\t\tfunction (model, currentCatDestroyed) {\n\t\t\t// Get category name to use in the notification\n\t\t\tconst name = model.get('name');\n\t\t\t// Is the deleted category an ancestor of the current category?\n\t\t\tconst ancestorOfCurrent =\n\t\t\t\t_.indexOf(NS.current.get('ancestors'), model.id) > -1;\n\n\t\t\tconst currentViewDestroyed = currentCatDestroyed || ancestorOfCurrent;\n\t\t\tif (currentViewDestroyed) {\n\t\t\t\tconst parentId = model.get('ancestors')[0];\n\t\t\t\tif (!parentId || parentId === NS.options.categoryid) {\n\t\t\t\t\tNetx.router.home();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tNetx.router.navigate(`category/${parentId}`, {\n\t\t\t\t\ttrigger: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Dispatch notification\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'category',\n\t\t\t\ttitle: i18n.t('i18n.categoriesUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.categorySuccessfullyDeleted', {\n\t\t\t\t\tcategory: name,\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:category#category:delete:prepare\n\t * @param {Netx.Models.Category} model Category model\n\t * @fires module:app#app:progress\n\t * @see module:category#category:delete:prepare:error\n\t * @see module:category#category:delete:prepare:success\n\t */\n\tdispatcher.on('category:delete:prepare', function (model) {\n\t\tdispatcher.trigger('app:progress', {\n\t\t\teventStr: 'category:delete:prepare',\n\t\t\theaderTitle: i18n.t('i18n.preparingCategoryDelete'),\n\t\t\tmessage: i18n.t('i18n.preparingCategoryDeleteMessage'),\n\t\t});\n\t});\n\t/**\n\t * @event module:category#category:delete:prepare:error\n\t * @param {string} error Error string\n\t * @param {Netx.Models.Category} model Category model\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'category:delete:prepare:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:category#category:delete:prepare:success\n\t * @param {Netx.Models.Category} model Category model\n\t */\n\tdispatcher.on(\n\t\t'category:delete:prepare:success',\n\t\tfunction (model) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Category delete\n\t//============================================\n\n\t//============================================\n\t//\tCategory import\n\t//============================================\n\t/**\n\t * @event module:category#category:import\n\t * @param {number} catId Category id\n\t */\n\tdispatcher.on('category:import', function (catId) {\n\t\t// If not already routed\n\t\tif (!window.location.hash.includes('upload/import')) {\n\t\t\tNetx.router.navigate('upload/import/' + catId, {trigger: true});\n\t\t} else {\n\t\t\tdispatcher.trigger('upload:import', catId);\n\t\t}\n\t});\n\t//============================================\n\t//\t!Category import\n\t//============================================\n\n\t//============================================\n\t//\tCategory recent\n\t//============================================\n\t/**\n\t * @event module:category#category:getRecent:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'category:getRecent:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-labelValueList\" */ '@netx/core-app/views/labelValueListView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['category:getRecent:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Gets and displays the most recent categories\n\t * @event module:category#category:getRecent\n\t * @fires module:category#category:getRecent:show\n\t */\n\tdispatcher.on('category:getRecent', function () {\n\t\timport(\n\t\t\t/* webpackChunkName: \"view-recentCategory\" */ './views/recentCategoryView'\n\t\t).then((View) => {\n\t\t\tdispatcher.trigger('category:getRecent:show', {\n\t\t\t\tclassName: '',\n\t\t\t\tcollection: Netx.category.recent,\n\t\t\t\theaderTitle: i18n.t('i18n.recentCategories'),\n\t\t\t\tid: 'recent-categories',\n\t\t\t\tchildView: {\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\ttarget: '.list',\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tclassName: 'category',\n\t\t\t\t\t\ttagName: 'li',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t\tNetx.category.recent.fetch();\n\t});\n\t//============================================\n\t//\t!Category recent\n\t//============================================\n\n\t//============================================\n\t//\tCategory searches\n\t//============================================\n\t/**\n\t * Lists all assets recursively within category\n\t * @event module:category#category:listAll\n\t * @param {number} catId Category id\n\t */\n\tdispatcher.on('category:search:listAll', function (catId) {\n\t\t// Support the ability to make this call from a non fetched category (like a route for example)\n\t\tvar cat = new CategoryModel({categoryid: parseInt(catId)});\n\t\tNetx.router.navigate(\n\t\t\t'search/advanced/' + cat.searchRules_listAll().toStr(),\n\t\t\ttrue,\n\t\t);\n\t});\n\t//============================================\n\t//\t!Category searches\n\t//============================================\n\n\t//============================================\n\t//\tCategory scope (selection)\n\t//============================================\n\t/**\n\t * @event module:category#category:scope:fetch\n\t * @param {Netx.Collections.Categories} categories Categories\n\t */\n\tdispatcher.on('category:scope:fetch', function (categories) {\n\t\tcategories.getCategoryObjects();\n\t});\n\t/**\n\t * @event module:category#category:scope:toggle:category\n\t * @param {Netx.Collections.Categories} categories Categories\n\t * @param {number} catId Category id\n\t */\n\tdispatcher.on('category:scope:toggle:category', function (categories, catId) {\n\t\tcatId = parseInt(catId);\n\t\tvar category = categories.get(catId);\n\t\tif (category) {\n\t\t\tcategories.remove(catId);\n\t\t} else {\n\t\t\tcategory = new CategoryModel({categoryid: catId});\n\t\t\tcategory.fetch().then(function () {\n\t\t\t\tcategories.unshift(category);\n\t\t\t});\n\t\t}\n\t});\n\t//============================================\n\t//\t!Category scope (selection)\n\t//============================================\n\t/**\n\t * event module:category#category:tree:close\n\t * @param {number} catId Category to open id\n\t * @param {Netx.Collections.CategoryTreeNodes} tree CategoryTreeNodes collection\n\t */\n\tdispatcher.on('category:tree:close', function (catId, tree) {\n\t\tvar category;\n\n\t\t// were we passed a model or an int?\n\t\tif (!_.isNumeric(catId)) {\n\t\t\tcategory = catId;\n\t\t\tcatId = catId.id;\n\t\t\tif (!tree && category.get('tree')) {\n\t\t\t\ttree = category.get('tree');\n\t\t\t}\n\t\t}\n\t\t// Default to main tree\n\t\ttree = tree || NS.tree;\n\n\t\tcategory = category || tree.get(catId);\n\t\tcategory && category.close();\n\t});\n\n\t/**\n\t * Handle a request to pop open a deeply-nested category:\n\t * Load the category, give it a model, and recurse on its parent.\n\t * @event module:category#category:tree:open\n\t * @param {number} catId Category to open id\n\t * @param {Netx.Collections.CategoryTreeNodes} tree CategoryTreeNodes collection\n\t * @param {boolean} parentOnly Fetch everything that is needed but do not open tghe passed categor - just open up its parent and above\n\t * @fires module:category#category:tree:open\n\t */\n\tdispatcher.on('category:tree:open', function (catId, tree, parentOnly) {\n\t\tlet category;\n\n\t\t// were we passed a model or an int?\n\t\tif (catId instanceof CoreModel) {\n\t\t\tcategory = catId;\n\t\t\tcatId = catId.id;\n\t\t\tif (!tree && category.get('tree')) {\n\t\t\t\ttree = category.get('tree');\n\t\t\t}\n\t\t}\n\n\t\tif (!catId) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Default if we can't find a tree anyplace:\n\t\ttree = tree || NS.tree;\n\n\t\t// is the category in the tree already?\n\t\tcategory = category || tree.get(catId);\n\t\tif (!category) {\n\t\t\t// We received only a categoryid, and it wasn't in our tree yet.\n\t\t\t// Get it into our tree\n\t\t\ttree.fetchCategory(catId).then(function (cat) {\n\t\t\t\t// retry!\n\t\t\t\tif (cat && cat.id !== NS.options.categoryid) {\n\t\t\t\t\tdispatcher.trigger('category:tree:open', cat.id, tree, parentOnly);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif (parentOnly) {\n\t\t\t\t// if we haven't reached the top, recurse\n\t\t\t\tif (category.id != NS.options.categoryid) {\n\t\t\t\t\tconst parentId = category.get('parentid');\n\t\t\t\t\tlet parentCat;\n\t\t\t\t\t// If we already have the parent category in the tree - do not bother\n\t\t\t\t\t// it will cause unnecessary calls up the tree in most cases\n\t\t\t\t\tif (parentId != NS.options.categoryid) {\n\t\t\t\t\t\tparentCat = tree.get(parentId);\n\t\t\t\t\t\t// We need more data\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!parentCat ||\n\t\t\t\t\t\t\t_.difference(parentCat.get('children'), tree.pluck('categoryid'))\n\t\t\t\t\t\t\t\t.length\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tdispatcher.trigger('category:tree:open', parentId, tree);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// We have all the data we need\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tparentCat.open();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Check that we need to fetch any of its children first\n\t\t\t\tconst childrenNeeded =\n\t\t\t\t\t_.difference(category.get('children'), tree.pluck('categoryid'))\n\t\t\t\t\t\t.length > 0;\n\t\t\t\t// We found the category; cache its children in the tree.\n\t\t\t\t$.when(childrenNeeded ? tree.fetchChildren(catId) : true).then(\n\t\t\t\t\tfunction (children) {\n\t\t\t\t\t\t// This sets the 'open' state on the model, and triggers an 'open' event\n\t\t\t\t\t\tcategory.open();\n\t\t\t\t\t\t// If we haven't reached the top, recurse\n\t\t\t\t\t\tif (category.id != NS.options.categoryid) {\n\t\t\t\t\t\t\tconst parentId = category.get('parentid');\n\t\t\t\t\t\t\tlet parentCat;\n\t\t\t\t\t\t\t// If we already have the parent category in the tree - do not bother\n\t\t\t\t\t\t\t// it will cause unnecessary calls up the tree in most cases\n\t\t\t\t\t\t\tif (parentId != NS.options.categoryid) {\n\t\t\t\t\t\t\t\tparentCat = tree.get(parentId);\n\t\t\t\t\t\t\t\t// We need more data\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!parentCat ||\n\t\t\t\t\t\t\t\t\t_.difference(\n\t\t\t\t\t\t\t\t\t\tparentCat.get('children'),\n\t\t\t\t\t\t\t\t\t\ttree.pluck('categoryid'),\n\t\t\t\t\t\t\t\t\t).length\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tdispatcher.trigger('category:tree:open', parentId, tree);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// We have all the data we need\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tparentCat.open();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * event module:category#category:tree:reset\n\t * @param {Netx.Collections.CategoryTreeNodes} tree CategoryTreeNodes collection\n\t */\n\tdispatcher.on('category:tree:reset', function (tree) {\n\t\tif (tree === Netx.category.tree) {\n\t\t\t// TODO: at the moment there is no way to tell the app \"go to top of category tree\"\n\t\t\t// except to route to the default (blank) route. Someday we may want those to be\n\t\t\t// two different actions ...\n\t\t\tdispatcher.trigger('category:route:top');\n\t\t}\n\t});\n\t/**\n\t * @event module:category#category:tree:search\n\t * @param {string} searchStr Search string\n\t * @param {Netx.Collections.CategoryTreeNodes} tree Tree collection\n\t * @fires module:category#category:tree:search:error\n\t * @fires module:category#category:tree:search:success\n\t */\n\tdispatcher.on('category:tree:search', function (searchStr, tree) {\n\t\ttree = tree || Netx.category.tree;\n\t\t// Do not run if it is the same search string as last time\n\t\tif (searchStr !== tree.searchString) {\n\t\t\ttree.searchCategoryName(searchStr, {duplicateQueryPolicy: 'abort'}).then(\n\t\t\t\tfunction () {\n\t\t\t\t\tdispatcher.trigger('category:tree:search:success', searchStr, tree);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('category:tree:search:error', err, tree);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t});\n\t/**\n\t * @event module:category#category:tree:search:clear\n\t * @param {Netx.Collections.CategoryTreeNodes} tree Tree collection\n\t */\n\tdispatcher.on('category:tree:search:clear', function (tree) {\n\t\ttree = tree || Netx.category.tree;\n\t\ttree.clearSearch();\n\n\t\t// DAM-20007 - make sure we have siblings for any newly fetched categories\n\t\tdispatcher.trigger('category:tree:open', NS.current.id, NS.tree);\n\t});\n\t/**\n\t * @event module:category#category:tree:search:error\n\t * @param {string} error Error string\n\t * @param {Netx.Collections.CategoryTreeNodes} tree Tree collection\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'category:tree:search:error',\n\t\tfunction (error, tree) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:category#category:tree:search:success\n\t * @param {string} searchStr Search string\n\t * @param {Netx.Collections.CategoryTreeNodes} tree Tree collection\n\t */\n\tdispatcher.on(\n\t\t'category:tree:search:success',\n\t\tfunction (searchStr, tree) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:category#category:tree:set:selection\n\t * @param {number} catId Category to open id\n\t * @param {Netx.Collections.CategoryTreeNodes} tree Tree collection\n\t */\n\tdispatcher.on('category:tree:set:selection', function (catId, tree) {\n\t\ttree = tree || Netx.category.tree;\n\t\ttree.selectedCategory = catId;\n\t});\n\t/**\n\t * event module:category#category:tree:toggle\n\t * @param {number} catId Category to open id\n\t * @param {Netx.Collections.CategoryTreeNodes} tree CategoryTreeNodes collection\n\t * @fires module:category#category:tree:close\n\t * @fires module:category#category:tree:open\n\t */\n\tdispatcher.on('category:tree:toggle', function (catId, tree) {\n\t\ttree = tree || Netx.category.tree;\n\n\t\tvar c = tree.get(catId);\n\t\tif (c.isOpen()) {\n\t\t\tdispatcher.trigger('category:tree:close', catId, tree);\n\t\t} else if (c.get('children').length) {\n\t\t\tdispatcher.trigger('category:tree:open', catId, tree);\n\t\t}\n\t});\n\t//============================================\n\t//\t!Category tree\n\t//============================================\n\n\t// END EVENT HANDLERS\n\t// ==================\n\t// After the module has run through it's init routine\n\t// stop listening for subsequent init events which would\n\t// cause duplicate listeners and instances to be created.\n\tPromise.all(NS.bootstrap).then(() => {\n\t\tdelete NS.bootstrap;\n\t\tdispatcher.trigger('category:extend', NS);\n\t\tdispatcher.trigger('category:initialized', NS);\n\t});\n});\n\nexport default {\n\tinitialize(opts) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdispatcher.once('category:initialized', function () {\n\t\t\t\tresolve(routes);\n\t\t\t});\n\t\t\tdispatcher.trigger('category:init');\n\t\t});\n\t},\n};\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryView';\nimport Template from '../templates/categoryGalleryView.html';\n\nexport default class CategoryGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\tconst views = opts.views || {};\n\n\t\topts.className = opts.className || 'assets-view';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.categories');\n\t\topts.id = opts.id || 'category';\n\t\topts.listenToCollection = views.assets && views.assets.collection;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CategoryGalleryView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-category/views/categoryGalleryView';\n\nimport {faSlidersH} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaSlidersH,\n});\n\nclass CategoryGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n}\n\nexport default CategoryGalleryView;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/categoryBreadCrumbView.html';\n\nexport default class CategoryBreadCrumbView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(\n\t\t\tthis.model,\n\t\t\t'change:breadcrumb',\n\t\t\t_.debounce(this.render, 50),\n\t\t);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst crumbs = this.model.get('breadcrumb');\n\t\tconst myCrumb = _.findWhere(crumbs, {value: this.model.id.toString()});\n\t\tconst idx = (myCrumb && _.indexOf(crumbs, myCrumb)) || 0;\n\n\t\t// Additonal template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tbreadcrumb: _.crumbs(crumbs, idx + 1, 6),\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CategoryBreadCrumbView';\n\t}\n}\n","/** @override */\nimport Base from '@netx/core-category/views/categoryBreadCrumbView';\nimport Selectpicker from '@netx/core/functionality/selectpicker';\nimport customConfig from '@netx/core-category/config';\n\nexport default class CategoryBreadCrumbView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = {\n\t\t\t'change .nx-crumb-field': 'selectedCrumbs',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.className =\n\t\t\topts.className ||\n\t\t\t'abbreviate crummy flex-row-grid nx-breadcrumbs flex-align-center';\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additonal template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\t// TODO: find out why it is not getting this from model attrs\n\t\t\ttruncated: this.model.get('truncated'),\n\t\t\tcrumbOverflow: this.model.get('crumbOverflow'),\n\t\t\trootCat: customConfig.categoryid,\n\t\t});\n\t}\n\n\t/** @method */\n\tselectedCrumbs(e) {\n\t\tif (\n\t\t\tNumber(e.currentTarget.value) > 0 &&\n\t\t\tthis.model.get('categoryid') != e.currentTarget.value\n\t\t) {\n\t\t\tthis.$el.find('button.dropdown-toggle').hide();\n\t\t\tNetx.router.navigate(`category/${e.currentTarget.value}`, {\n\t\t\t\ttrigger: true,\n\t\t\t});\n\t\t}\n\t}\n}\nSelectpicker(CategoryBreadCrumbView);\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryHeaderView';\nimport Template from '../templates/categoryGalleryHeaderView.html';\n\nimport CategoryBreadCrumbView from './categoryBreadCrumbView';\n\nexport default class CategoryGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// Breadcrumbs\n\t\tthis.breadCrumbView = this.addSubView(\n\t\t\tnew CategoryBreadCrumbView({\n\t\t\t\tmodel: this.model,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'sync', _.debounce(this.updateTitle, 50));\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additonal template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tcategoryId: this.model.id,\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$breadcrumbs = this.$('[data-nx-control=\"breadcrumbs\"]');\n\n\t\t// Append breadcrumbs\n\t\tthis.breadCrumbView.setElement(this.$breadcrumbs).render();\n\t}\n\n\t/**\n\t * @override\n\t * @return {string}\n\t */\n\tgetHeaderTitle() {\n\t\tthis.headerTitle = this.model.get('name');\n\t\treturn this.headerTitle;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CategoryGalleryHeaderView';\n\t}\n}\n","/** @override */\nimport Base from '@netx/core-category/views/categoryGalleryHeaderView';\n\nexport default class CategoryGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = {\n\t\t\t'input [data-nx-control=\"slider\"]': 'sliding',\n\t\t\t'change [data-nx-control=\"slider\"]': 'sliding', // IE\n\t\t\t'click [data-nx-control=\"sliderMin\"]': 'sliderMin',\n\t\t\t'click [data-nx-control=\"sliderMax\"]': 'sliderMax',\n\t\t\t...opts.events,\n\t\t};\n\n\t\tsuper(opts);\n\n\t\tthis.i18nCountStr = null;\n\t}\n\n\t/** @method */\n\tsliding(e) {\n\t\t//console.log('e: %o', e);\n\t\tif (\n\t\t\te.currentTarget.value !=\n\t\t\tNetx.user.prefs.getPreference('assetList.thumbSize')\n\t\t) {\n\t\t\tdispatcher.trigger('asset:thumb:resize', e.currentTarget.value);\n\t\t}\n\t}\n\n\t/** @method */\n\tsliderMin() {\n\t\tconst $slider = this.$el.find('[data-nx-control=\"slider\"]');\n\t\t$slider.val($slider.attr('min'));\n\t\tdispatcher.trigger('asset:thumb:resize', $slider.attr('min'));\n\t}\n\n\t/** @method */\n\tsliderMax() {\n\t\tconst $slider = this.$el.find('[data-nx-control=\"slider\"]');\n\t\t$slider.val($slider.attr('max'));\n\t\tdispatcher.trigger('asset:thumb:resize', $slider.attr('max'));\n\t}\n}\n","export {default} from '@netx/core-category/controller';\n\nimport CoreModel from '@netx/core/lib/netx-model';\nimport AssetListView from '@netx/core-asset/views/assetListView';\nimport SearchFacetsView from '@netx/core-search/views/searchFacetsView';\nimport CategoryGalleryView from './views/categoryGalleryView';\nimport CategoryTreeNodesView from '@netx/core-category/views/categoryTreeNodesView';\nimport CategoryBreadCrumbView from '@netx/core-category/views/categoryBreadCrumbView';\nimport CategoryGalleryHeaderView from '@netx/core-category/views/categoryGalleryHeaderView';\nimport CategoryListView from '@netx/core-category/views/categoryListView';\n\nimport cmsConfig from '@netx/core-cms/config';\nimport categoryConfig from '@netx/core-category/config';\n\n/**\n * Category Module Extensions\n * @event module:category#category:extend\n * @param {object} NS Namespace object\n */\ndispatcher.once('category:extend', function (NS) {\n\t// Use faceted search\n\t// Filter mode is driven by the property `search.facet.filterMode` - default is quite literally \"DEFAULT\"\n\t// See Netx.Collections.SearchFacets\n\tNS.assets.useFacetedSearch(true);\n\n\t// custom icons\n\tNetx.Actions.Find('category:add').icon = 'plus';\n\tNetx.Actions.Find('category:add').label = 'category:i18n.addNewSubCategory';\n\tNetx.Actions.Find('category:edit').icon = 'pencil';\n\tNetx.Actions.Find('category:delete').icon = 'trash';\n\n\t// Sometimes, due to timing we do not get our proper active classes on non top level cats\n\t// I would love to put this in the collection but now we have multiple instances of CategoryTreeNodes with\n\t// varying needs (this is the only tree that cares about route currently) -jse-\n\tif (NS.tree && NS.options.tree) {\n\t\tNS.tree.on(\n\t\t\t'sync',\n\t\t\t_.debounce(function () {\n\t\t\t\t// Vars\n\t\t\t\tvar id = NS.current.id;\n\t\t\t\t// `Top level` is of no concern\n\t\t\t\tif (id > 1) {\n\t\t\t\t\tconst cat = this.get(id);\n\t\t\t\t\tif (cat) {\n\t\t\t\t\t\tcat.trigger('activate');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, 150),\n\t\t);\n\t}\n\n\t// Re-fetch when attributes change\n\tNS.assets.listenTo(dispatcher, 'asset:attributes:updated', function (\n\t\tattributes,\n\t) {\n\t\tthis.syncedOnce && this.fetch();\n\t});\n\n\t// Listeners for Backbone specific collection and model events.\n\t// No need to duplicate the event bus that already exists via Backbone.\n\tNS.current.on('sync', function () {\n\t\tthis.getCategoryBreadcrumbs();\n\t\tdispatcher.trigger('category:getAssets');\n\t});\n\n\t/**\n\t * Fetches the assets for a category. Handles setting\n\t * up a selection with the proper sort order, reporsitory\n\t * directory path and startPosition.\n\t * @event module:category#category:getAssets\n\t * @see {@link Netx.Collections.MiniAssets}\n\t */\n\tdispatcher.on('category:getAssets', function () {\n\t\tNS.assets.getCategoryAssets(Netx.category.current.id);\n\t});\n\n\t/**\n\t * @event module:category#category:gallery:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'category:gallery:show',\n\t\tfunction (viewOptions) {\n\t\t\tNetx.app.appViews.add({\n\t\t\t\tviewClass: CategoryGalleryView,\n\t\t\t\tshowActions: ['category:gallery:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Main route handler for categories\n\t * @event module:category#category:routed\n\t * @param {number} id Category id\n\t * @param {number} page Page number\n\t * @fires module:category#category:current:update\n\t * @fires module:category#category:tree:open\n\t * @fires module:category#category:gallery:show\n\t * @fires module:category#category:top:routed\n\t */\n\tdispatcher.off('category:routed');\n\tdispatcher.on('category:routed', function (id, page) {\n\t\tvar catAssets = NS.assets,\n\t\t\thash = window.location.hash,\n\t\t\topts = NS.options;\n\n\t\t// Avoids rerendering if we were just at this route(aka entering and exiting asset detail)\n\t\t// THEM-1244 - this was where the issue was when faceting from page 2,\n\t\t// fixed in src/js/modules/app/models/pager.js\n\t\t// the following could be refactored\n\t\tif (catAssets.lastCategoryRoute !== hash) {\n\t\t\tcatAssets.lastCategoryRoute = hash;\n\t\t\tpage = page || 1;\n\t\t\tid = parseInt(id);\n\n\t\t\t// Top level routed\n\t\t\tif (id === opts.categoryid) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'category:current:update',\n\t\t\t\t\t{\n\t\t\t\t\t\tcategoryid: opts.categoryid,\n\t\t\t\t\t\trepositorydirectory: opts.repositorydirectory,\n\t\t\t\t\t},\n\t\t\t\t\tpage,\n\t\t\t\t);\n\t\t\t\t// dispatcher.trigger('category:top:routed');\n\t\t\t}\n\t\t\t// Anything but the top level routed\n\t\t\telse {\n\t\t\t\tdispatcher.trigger('category:current:update', {categoryid: id}, page);\n\t\t\t}\n\t\t} else {\n\t\t\t// search facets get wonky if the category doesn't trigger\n\t\t\tdispatcher.trigger('search:facets:refresh');\n\n\t\t\t// DAM-18538: the asset cursor is likely set to the wrong collection\n\t\t\tNetx.asset.cursor.cacheFetch(Netx.category.assets);\n\t\t}\n\n\t\tif (!Netx.user.prefs.getPreference('assetList.thumbSize')) {\n\t\t\tdispatcher.trigger('asset:thumb:resize', '190');\n\t\t}\n\n\t\tvar categoryViews = {\n\t\t\tbreadcrumbs: {\n\t\t\t\tviewClass: CategoryBreadCrumbView,\n\t\t\t\tmodel: NS.current,\n\t\t\t},\n\t\t\theader: {\n\t\t\t\tviewClass: CategoryGalleryHeaderView,\n\t\t\t\tmodel: NS.current,\n\t\t\t\tcollection: NS.assets,\n\t\t\t},\n\t\t\tlist: !categoryConfig.displayCategoriesAsAssets\n\t\t\t\t? undefined\n\t\t\t\t: {\n\t\t\t\t\t\tviewClass: CategoryListView,\n\t\t\t\t\t\tcollection: NS.list,\n\t\t\t\t },\n\t\t\tassets: {\n\t\t\t\tviewClass: AssetListView,\n\t\t\t\tcollection: NS.assets,\n\t\t\t},\n\t\t\tfacets: {\n\t\t\t\tviewClass: SearchFacetsView,\n\t\t\t\tcollection: NS.assets.selection.searchFacets,\n\t\t\t},\n\t\t\ttree: {\n\t\t\t\tviewClass: CategoryTreeNodesView,\n\t\t\t\tcollection: NS.tree.topLevelCategories,\n\t\t\t\ttree: NS.tree,\n\t\t\t},\n\t\t};\n\n\t\tdispatcher.trigger('category:gallery:show', {\n\t\t\tmodel: NS.current,\n\t\t\tcollection: NS.list,\n\t\t\tviews: categoryViews,\n\t\t});\n\n\t\t$('#wrapper').scrollTop(0);\n\t});\n\t//============================================\n\t//\t!Category route\n\t//============================================\n\n\tdispatcher.off('category:gotoParent');\n\tdispatcher.on('category:gotoParent', function () {\n\t\t// navigate up a category if 1. we are not already at the root\n\t\t// and 2. we are inside the root\n\t\t// and 3. 'top level' isn't in any path, incase portal is set there, back button breaks\n\n\t\tif (\n\t\t\tNS.current.id !== NS.options.categoryid &&\n\t\t\t(categoryConfig.categoryName == 'top level' ||\n\t\t\t\tNS.current.get('path').indexOf(categoryConfig.categoryName) > -1)\n\t\t) {\n\t\t\tvar parentId = NS.current.get('parentid');\n\t\t\tNetx.router.navigate('category/' + parentId, {trigger: true});\n\t\t} else {\n\t\t\t// otherwise, goto the homepage\n\t\t\tNetx.router.navigate('page/' + cmsConfig.homeRoute, {trigger: true});\n\t\t}\n\t});\n\n\t// hide navs on any route\n\tNetx.router.on('route', function (path) {\n\t\tvar $body = $('body');\n\t\tif ($body.hasClass('keep-nav-open')) {\n\t\t\t$body.removeClass('keep-nav-open');\n\t\t} else {\n\t\t\t$body.removeClass('category-nav');\n\t\t\tif ($body.hasClass('page-nav')) {\n\t\t\t\tNetx.views.appView.headerView.togglePages();\n\t\t\t}\n\t\t}\n\t});\n\n\t// Category current\n\t// THEM-1387 - override to not getAssets if on detail route\n\t// when refreshing a detail page, cursor gets confused when\n\t// someone elses collection gets cached (mobile tree)\n\tNS.current.off('sync');\n\tNS.current.on('sync', function () {\n\t\tthis.getCategoryBreadcrumbs();\n\t\tif (window.location.hash.indexOf('#asset/') === -1) {\n\t\t\tdispatcher.trigger('category:getAssets');\n\t\t}\n\t});\n\n\t// This event is fired by the category model whenever its id is changed\n\tNS.current.off('change:categoryid');\n\tNS.current.on('change:categoryid', function (category, categoryid, opts) {\n\t\tNS.current.fetch().then(\n\t\t\tfunction (cat) {\n\t\t\t\t// If not top level, trigger the category to open\n\t\t\t\tif (NS.current.id !== NS.options.categoryid) {\n\t\t\t\t\t// dispatcher.trigger('category:tree:open', NS.current.id, NS.tree);\n\t\t\t\t\tvar parentOnly = this.get('children').length ? false : true;\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'category:tree:open',\n\t\t\t\t\t\tNS.current.id,\n\t\t\t\t\t\tNS.tree,\n\t\t\t\t\t\tparentOnly,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tdispatcher.trigger('category:current:update:success', categoryid);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('category:current:update:error', err);\n\t\t\t},\n\t\t);\n\t});\n\n\tdispatcher.on('category:current:update:success', (catId) => {\n\t\tNS.list.fetch();\n\t});\n\n\t/**\n\t * Handle a request to pop open a deeply-nested category:\n\t * Load the category, give it a model, and recurse on its parent.\n\t * @event module:category#category:tree:open\n\t * @param {number} catId Category to open id\n\t * @param {Netx.Collections.CategoryTreeNodes} tree CategoryTreeNodes collection\n\t * @param {boolean} parentOnly Fetch everything that is needed but do not open tghe passed categor - just open up its parent and above\n\t * @fires module:category#category:tree:open\n\t */\n\tdispatcher.on('category:tree:open', function (catId, tree, parentOnly) {\n\t\tlet category;\n\n\t\t// were we passed a model or an int?\n\t\tif (catId instanceof CoreModel) {\n\t\t\tcategory = catId;\n\t\t\tcatId = catId.id;\n\t\t\tif (!tree && category.get('tree')) {\n\t\t\t\ttree = category.get('tree');\n\t\t\t}\n\t\t}\n\n\t\tif (!catId) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Default if we can't find a tree anyplace:\n\t\ttree = tree || NS.tree;\n\n\t\t// is the category in the tree already?\n\t\tcategory = category || tree.get(catId);\n\t\tif (!category) {\n\t\t\t// We received only a categoryid, and it wasn't in our tree yet.\n\t\t\t// Get it into our tree\n\t\t\ttree.fetchCategory(catId).then(function (cat) {\n\t\t\t\t// retry!\n\t\t\t\tif (cat && cat.id !== NS.options.categoryid) {\n\t\t\t\t\tdispatcher.trigger('category:tree:open', cat.id, tree, parentOnly);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif (parentOnly) {\n\t\t\t\t// if we haven't reached the top, recurse\n\t\t\t\tif (category.id != NS.options.categoryid) {\n\t\t\t\t\tconst parentId = category.get('parentid');\n\t\t\t\t\tlet parentCat;\n\t\t\t\t\t// If we already have the parent category in the tree - do not bother\n\t\t\t\t\t// it will cause unnecessary calls up the tree in most cases\n\t\t\t\t\tif (parentId != NS.options.categoryid) {\n\t\t\t\t\t\tparentCat = tree.get(parentId);\n\t\t\t\t\t\t// We need more data\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!parentCat ||\n\t\t\t\t\t\t\t_.difference(parentCat.get('children'), tree.pluck('categoryid'))\n\t\t\t\t\t\t\t\t.length\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tdispatcher.trigger('category:tree:open', parentId, tree);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// We have all the data we need\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tparentCat.open();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Check that we need to fetch any of its children first\n\t\t\t\tconst childrenNeeded =\n\t\t\t\t\t_.difference(category.get('children'), tree.pluck('categoryid'))\n\t\t\t\t\t\t.length > 0;\n\t\t\t\t// We found the category; cache its children in the tree.\n\t\t\t\t$.when(childrenNeeded ? tree.fetchChildren(catId) : true).then(\n\t\t\t\t\tfunction (children) {\n\t\t\t\t\t\t// This sets the 'open' state on the model, and triggers an 'open' event\n\t\t\t\t\t\tcategory.open();\n\t\t\t\t\t\t// If we haven't reached the top, recurse\n\t\t\t\t\t\tif (category.id != NS.options.categoryid) {\n\t\t\t\t\t\t\tconst parentId = category.get('parentid');\n\t\t\t\t\t\t\tlet parentCat;\n\t\t\t\t\t\t\t// If we already have the parent category in the tree - do not bother\n\t\t\t\t\t\t\t// it will cause unnecessary calls up the tree in most cases\n\t\t\t\t\t\t\tif (parentId != NS.options.categoryid) {\n\t\t\t\t\t\t\t\tparentCat = tree.get(parentId);\n\t\t\t\t\t\t\t\t// We need more data\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!parentCat ||\n\t\t\t\t\t\t\t\t\t_.difference(\n\t\t\t\t\t\t\t\t\t\tparentCat.get('children'),\n\t\t\t\t\t\t\t\t\t\ttree.pluck('categoryid'),\n\t\t\t\t\t\t\t\t\t).length\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tdispatcher.trigger('category:tree:open', parentId, tree);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// We have all the data we need\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tparentCat.open();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n}); // category:extend\n","/**\n * Category module\n */\n\nimport actions from './actions';\nimport menus from './menus';\nimport controller from './controller';\nimport Search from '@netx/core-search';\n\n// Call on this function to load everything needed for the module prior to initialization\nfunction loadDependencies() {\n\treturn new Promise((resolve, reject) => {\n\t\tdispatcher.trigger('netx:load:module', Search, {\n\t\t\terror: reject,\n\t\t\tinitialized: resolve,\n\t\t});\n\t});\n}\n\n/**\n * @property {object} exports - Our module exports\n * @property {string} exports.namespace - Module namespace\n * @property {function} exports.initialize - Module initializer\n */\nexport default {\n\tnamespace: 'category',\n\tinitialize() {\n\t\treturn loadDependencies().then(() => {\n\t\t\t// Register actions\n\t\t\tNetx.Actions.Register(actions);\n\t\t\t// Extend menus\n\t\t\tNetx.addMenus(menus);\n\n\t\t\treturn controller.initialize();\n\t\t});\n\t},\n};\n","import * as React from 'react';\nimport createSvgIcon from '../../utils/createSvgIcon';\n/**\n * @ignore - internal component.\n */\n\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon( /*#__PURE__*/_jsx(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"\n}), 'RadioButtonUnchecked');","import * as React from 'react';\nimport createSvgIcon from '../../utils/createSvgIcon';\n/**\n * @ignore - internal component.\n */\n\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon( /*#__PURE__*/_jsx(\"path\", {\n d: \"M8.465 8.465C9.37 7.56 10.62 7 12 7C14.76 7 17 9.24 17 12C17 13.38 16.44 14.63 15.535 15.535C14.63 16.44 13.38 17 12 17C9.24 17 7 14.76 7 12C7 10.62 7.56 9.37 8.465 8.465Z\"\n}), 'RadioButtonChecked');","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport RadioButtonUncheckedIcon from '../internal/svg-icons/RadioButtonUnchecked';\nimport RadioButtonCheckedIcon from '../internal/svg-icons/RadioButtonChecked';\nimport styled from '../styles/styled';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nconst RadioButtonIconRoot = styled('span')({\n position: 'relative',\n display: 'flex'\n});\nconst RadioButtonIconBackground = styled(RadioButtonUncheckedIcon)({\n // Scale applied to prevent dot misalignment in Safari\n transform: 'scale(1)'\n});\nconst RadioButtonIconDot = styled(RadioButtonCheckedIcon)(({\n theme,\n ownerState\n}) => _extends({\n left: 0,\n position: 'absolute',\n transform: 'scale(0)',\n transition: theme.transitions.create('transform', {\n easing: theme.transitions.easing.easeIn,\n duration: theme.transitions.duration.shortest\n })\n}, ownerState.checked && {\n transform: 'scale(1)',\n transition: theme.transitions.create('transform', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.shortest\n })\n}));\n/**\n * @ignore - internal component.\n */\n\nfunction RadioButtonIcon(props) {\n const {\n checked = false,\n classes = {},\n fontSize\n } = props;\n\n const ownerState = _extends({}, props, {\n checked\n });\n\n return /*#__PURE__*/_jsxs(RadioButtonIconRoot, {\n className: classes.root,\n ownerState: ownerState,\n children: [/*#__PURE__*/_jsx(RadioButtonIconBackground, {\n fontSize: fontSize,\n className: classes.background,\n ownerState: ownerState\n }), /*#__PURE__*/_jsx(RadioButtonIconDot, {\n fontSize: fontSize,\n className: classes.dot,\n ownerState: ownerState\n })]\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? RadioButtonIcon.propTypes = {\n /**\n * If `true`, the component is checked.\n */\n checked: PropTypes.bool,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object,\n\n /**\n * The size of the component.\n * `small` is equivalent to the dense radio styling.\n */\n fontSize: PropTypes.oneOf(['small', 'medium'])\n} : void 0;\nexport default RadioButtonIcon;","import { unstable_createChainedFunction as createChainedFunction } from '@mui/utils';\nexport default createChainedFunction;","import { generateUtilityClass, generateUtilityClasses } from '@mui/base';\nexport function getRadioUtilityClass(slot) {\n return generateUtilityClass('MuiRadio', slot);\n}\nconst radioClasses = generateUtilityClasses('MuiRadio', ['root', 'checked', 'disabled', 'colorPrimary', 'colorSecondary']);\nexport default radioClasses;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"checked\", \"checkedIcon\", \"color\", \"icon\", \"name\", \"onChange\", \"size\", \"className\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { refType } from '@mui/utils';\nimport { unstable_composeClasses as composeClasses } from '@mui/base';\nimport { alpha } from '@mui/system';\nimport SwitchBase from '../internal/SwitchBase';\nimport useThemeProps from '../styles/useThemeProps';\nimport RadioButtonIcon from './RadioButtonIcon';\nimport capitalize from '../utils/capitalize';\nimport createChainedFunction from '../utils/createChainedFunction';\nimport useRadioGroup from '../RadioGroup/useRadioGroup';\nimport radioClasses, { getRadioUtilityClass } from './radioClasses';\nimport styled, { rootShouldForwardProp } from '../styles/styled';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n color\n } = ownerState;\n const slots = {\n root: ['root', `color${capitalize(color)}`]\n };\n return _extends({}, classes, composeClasses(slots, getRadioUtilityClass, classes));\n};\n\nconst RadioRoot = styled(SwitchBase, {\n shouldForwardProp: prop => rootShouldForwardProp(prop) || prop === 'classes',\n name: 'MuiRadio',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, styles[`color${capitalize(ownerState.color)}`]];\n }\n})(({\n theme,\n ownerState\n}) => _extends({\n color: (theme.vars || theme).palette.text.secondary,\n '&:hover': {\n backgroundColor: theme.vars ? `rgba(${ownerState.color === 'default' ? theme.vars.palette.action.activeChannel : theme.vars.palette[ownerState.color].mainChannel} / ${theme.vars.palette.action.hoverOpacity})` : alpha(ownerState.color === 'default' ? theme.palette.action.active : theme.palette[ownerState.color].main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n}, ownerState.color !== 'default' && {\n [`&.${radioClasses.checked}`]: {\n color: (theme.vars || theme).palette[ownerState.color].main\n }\n}, {\n [`&.${radioClasses.disabled}`]: {\n color: (theme.vars || theme).palette.action.disabled\n }\n}));\n\nfunction areEqualValues(a, b) {\n if (typeof b === 'object' && b !== null) {\n return a === b;\n } // The value could be a number, the DOM will stringify it anyway.\n\n\n return String(a) === String(b);\n}\n\nconst defaultCheckedIcon = /*#__PURE__*/_jsx(RadioButtonIcon, {\n checked: true\n});\n\nconst defaultIcon = /*#__PURE__*/_jsx(RadioButtonIcon, {});\n\nconst Radio = /*#__PURE__*/React.forwardRef(function Radio(inProps, ref) {\n var _defaultIcon$props$fo, _defaultCheckedIcon$p;\n\n const props = useThemeProps({\n props: inProps,\n name: 'MuiRadio'\n });\n\n const {\n checked: checkedProp,\n checkedIcon = defaultCheckedIcon,\n color = 'primary',\n icon = defaultIcon,\n name: nameProp,\n onChange: onChangeProp,\n size = 'medium',\n className\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const ownerState = _extends({}, props, {\n color,\n size\n });\n\n const classes = useUtilityClasses(ownerState);\n const radioGroup = useRadioGroup();\n let checked = checkedProp;\n const onChange = createChainedFunction(onChangeProp, radioGroup && radioGroup.onChange);\n let name = nameProp;\n\n if (radioGroup) {\n if (typeof checked === 'undefined') {\n checked = areEqualValues(radioGroup.value, props.value);\n }\n\n if (typeof name === 'undefined') {\n name = radioGroup.name;\n }\n }\n\n return /*#__PURE__*/_jsx(RadioRoot, _extends({\n type: \"radio\",\n icon: /*#__PURE__*/React.cloneElement(icon, {\n fontSize: (_defaultIcon$props$fo = defaultIcon.props.fontSize) != null ? _defaultIcon$props$fo : size\n }),\n checkedIcon: /*#__PURE__*/React.cloneElement(checkedIcon, {\n fontSize: (_defaultCheckedIcon$p = defaultCheckedIcon.props.fontSize) != null ? _defaultCheckedIcon$p : size\n }),\n ownerState: ownerState,\n classes: classes,\n name: name,\n checked: checked,\n onChange: onChange,\n ref: ref,\n className: clsx(classes.root, className)\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? Radio.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * If `true`, the component is checked.\n */\n checked: PropTypes.bool,\n\n /**\n * The icon to display when the component is checked.\n * @default <RadioButtonIcon checked />\n */\n checkedIcon: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The color of the component.\n * It supports both default and custom theme colors, which can be added as shown in the\n * [palette customization guide](https://mui.com/material-ui/customization/palette/#adding-new-colors).\n * @default 'primary'\n */\n color: PropTypes\n /* @typescript-to-proptypes-ignore */\n .oneOfType([PropTypes.oneOf(['default', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), PropTypes.string]),\n\n /**\n * If `true`, the component is disabled.\n */\n disabled: PropTypes.bool,\n\n /**\n * If `true`, the ripple effect is disabled.\n */\n disableRipple: PropTypes.bool,\n\n /**\n * The icon to display when the component is unchecked.\n * @default <RadioButtonIcon />\n */\n icon: PropTypes.node,\n\n /**\n * The id of the `input` element.\n */\n id: PropTypes.string,\n\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps: PropTypes.object,\n\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: refType,\n\n /**\n * Name attribute of the `input` element.\n */\n name: PropTypes.string,\n\n /**\n * Callback fired when the state is changed.\n *\n * @param {React.ChangeEvent<HTMLInputElement>} event The event source of the callback.\n * You can pull out the new value by accessing `event.target.value` (string).\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: PropTypes.func,\n\n /**\n * If `true`, the `input` element is required.\n */\n required: PropTypes.bool,\n\n /**\n * The size of the component.\n * `small` is equivalent to the dense radio styling.\n * @default 'medium'\n */\n size: PropTypes\n /* @typescript-to-proptypes-ignore */\n .oneOfType([PropTypes.oneOf(['medium', 'small']), PropTypes.string]),\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n\n /**\n * The value of the component. The DOM API casts this to a string.\n */\n value: PropTypes.any\n} : void 0;\nexport default Radio;","import * as React from 'react';\nimport RadioGroupContext from './RadioGroupContext';\nexport default function useRadioGroup() {\n return React.useContext(RadioGroupContext);\n}","import { isHostComponent } from '@mui/base';\n\nconst shouldSpreadAdditionalProps = Slot => {\n return !Slot || !isHostComponent(Slot);\n};\n\nexport default shouldSpreadAdditionalProps;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"component\", \"components\", \"componentsProps\", \"color\", \"size\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { chainPropTypes } from '@mui/utils';\nimport { generateUtilityClasses } from '@mui/base';\nimport SliderUnstyled, { SliderValueLabelUnstyled, sliderUnstyledClasses, getSliderUtilityClass } from '@mui/base/SliderUnstyled';\nimport { alpha, lighten, darken } from '@mui/system';\nimport useThemeProps from '../styles/useThemeProps';\nimport styled, { slotShouldForwardProp } from '../styles/styled';\nimport useTheme from '../styles/useTheme';\nimport shouldSpreadAdditionalProps from '../utils/shouldSpreadAdditionalProps';\nimport capitalize from '../utils/capitalize';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const sliderClasses = _extends({}, sliderUnstyledClasses, generateUtilityClasses('MuiSlider', ['colorPrimary', 'colorSecondary', 'thumbColorPrimary', 'thumbColorSecondary', 'sizeSmall', 'thumbSizeSmall']));\nconst SliderRoot = styled('span', {\n name: 'MuiSlider',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, styles[`color${capitalize(ownerState.color)}`], ownerState.size !== 'medium' && styles[`size${capitalize(ownerState.size)}`], ownerState.marked && styles.marked, ownerState.orientation === 'vertical' && styles.vertical, ownerState.track === 'inverted' && styles.trackInverted, ownerState.track === false && styles.trackFalse];\n }\n})(({\n theme,\n ownerState\n}) => _extends({\n borderRadius: 12,\n boxSizing: 'content-box',\n display: 'inline-block',\n position: 'relative',\n cursor: 'pointer',\n touchAction: 'none',\n color: (theme.vars || theme).palette[ownerState.color].main,\n WebkitTapHighlightColor: 'transparent'\n}, ownerState.orientation === 'horizontal' && _extends({\n height: 4,\n width: '100%',\n padding: '13px 0',\n // The primary input mechanism of the device includes a pointing device of limited accuracy.\n '@media (pointer: coarse)': {\n // Reach 42px touch target, about ~8mm on screen.\n padding: '20px 0'\n }\n}, ownerState.size === 'small' && {\n height: 2\n}, ownerState.marked && {\n marginBottom: 20\n}), ownerState.orientation === 'vertical' && _extends({\n height: '100%',\n width: 4,\n padding: '0 13px',\n // The primary input mechanism of the device includes a pointing device of limited accuracy.\n '@media (pointer: coarse)': {\n // Reach 42px touch target, about ~8mm on screen.\n padding: '0 20px'\n }\n}, ownerState.size === 'small' && {\n width: 2\n}, ownerState.marked && {\n marginRight: 44\n}), {\n '@media print': {\n colorAdjust: 'exact'\n },\n [`&.${sliderClasses.disabled}`]: {\n pointerEvents: 'none',\n cursor: 'default',\n color: (theme.vars || theme).palette.grey[400]\n },\n [`&.${sliderClasses.dragging}`]: {\n [`& .${sliderClasses.thumb}, & .${sliderClasses.track}`]: {\n transition: 'none'\n }\n }\n}));\nprocess.env.NODE_ENV !== \"production\" ? SliderRoot.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * @ignore\n */\n children: PropTypes.node\n} : void 0;\nexport { SliderRoot };\nconst SliderRail = styled('span', {\n name: 'MuiSlider',\n slot: 'Rail',\n overridesResolver: (props, styles) => styles.rail\n})(({\n ownerState\n}) => _extends({\n display: 'block',\n position: 'absolute',\n borderRadius: 'inherit',\n backgroundColor: 'currentColor',\n opacity: 0.38\n}, ownerState.orientation === 'horizontal' && {\n width: '100%',\n height: 'inherit',\n top: '50%',\n transform: 'translateY(-50%)'\n}, ownerState.orientation === 'vertical' && {\n height: '100%',\n width: 'inherit',\n left: '50%',\n transform: 'translateX(-50%)'\n}, ownerState.track === 'inverted' && {\n opacity: 1\n}));\nprocess.env.NODE_ENV !== \"production\" ? SliderRail.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * @ignore\n */\n children: PropTypes.node\n} : void 0;\nexport { SliderRail };\nconst SliderTrack = styled('span', {\n name: 'MuiSlider',\n slot: 'Track',\n overridesResolver: (props, styles) => styles.track\n})(({\n theme,\n ownerState\n}) => {\n const color = // Same logic as the LinearProgress track color\n theme.palette.mode === 'light' ? lighten(theme.palette[ownerState.color].main, 0.62) : darken(theme.palette[ownerState.color].main, 0.5);\n return _extends({\n display: 'block',\n position: 'absolute',\n borderRadius: 'inherit',\n border: '1px solid currentColor',\n backgroundColor: 'currentColor',\n transition: theme.transitions.create(['left', 'width', 'bottom', 'height'], {\n duration: theme.transitions.duration.shortest\n })\n }, ownerState.size === 'small' && {\n border: 'none'\n }, ownerState.orientation === 'horizontal' && {\n height: 'inherit',\n top: '50%',\n transform: 'translateY(-50%)'\n }, ownerState.orientation === 'vertical' && {\n width: 'inherit',\n left: '50%',\n transform: 'translateX(-50%)'\n }, ownerState.track === false && {\n display: 'none'\n }, ownerState.track === 'inverted' && {\n backgroundColor: theme.vars ? theme.vars.palette.Slider[`${ownerState.color}Track`] : color,\n borderColor: theme.vars ? theme.vars.palette.Slider[`${ownerState.color}Track`] : color\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? SliderTrack.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * @ignore\n */\n children: PropTypes.node\n} : void 0;\nexport { SliderTrack };\nconst SliderThumb = styled('span', {\n name: 'MuiSlider',\n slot: 'Thumb',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.thumb, styles[`thumbColor${capitalize(ownerState.color)}`], ownerState.size !== 'medium' && styles[`thumbSize${capitalize(ownerState.size)}`]];\n }\n})(({\n theme,\n ownerState\n}) => _extends({\n position: 'absolute',\n width: 20,\n height: 20,\n boxSizing: 'border-box',\n borderRadius: '50%',\n outline: 0,\n backgroundColor: 'currentColor',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: theme.transitions.create(['box-shadow', 'left', 'bottom'], {\n duration: theme.transitions.duration.shortest\n })\n}, ownerState.size === 'small' && {\n width: 12,\n height: 12\n}, ownerState.orientation === 'horizontal' && {\n top: '50%',\n transform: 'translate(-50%, -50%)'\n}, ownerState.orientation === 'vertical' && {\n left: '50%',\n transform: 'translate(-50%, 50%)'\n}, {\n '&:before': _extends({\n position: 'absolute',\n content: '\"\"',\n borderRadius: 'inherit',\n width: '100%',\n height: '100%',\n boxShadow: (theme.vars || theme).shadows[2]\n }, ownerState.size === 'small' && {\n boxShadow: 'none'\n }),\n '&::after': {\n position: 'absolute',\n content: '\"\"',\n borderRadius: '50%',\n // 42px is the hit target\n width: 42,\n height: 42,\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)'\n },\n [`&:hover, &.${sliderClasses.focusVisible}`]: {\n boxShadow: `0px 0px 0px 8px ${theme.vars ? `rgba(${theme.vars.palette[ownerState.color].mainChannel} / 0.16)` : alpha(theme.palette[ownerState.color].main, 0.16)}`,\n '@media (hover: none)': {\n boxShadow: 'none'\n }\n },\n [`&.${sliderClasses.active}`]: {\n boxShadow: `0px 0px 0px 14px ${theme.vars ? `rgba(${theme.vars.palette[ownerState.color].mainChannel} / 0.16)` : alpha(theme.palette[ownerState.color].main, 0.16)}`\n },\n [`&.${sliderClasses.disabled}`]: {\n '&:hover': {\n boxShadow: 'none'\n }\n }\n}));\nprocess.env.NODE_ENV !== \"production\" ? SliderThumb.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * @ignore\n */\n children: PropTypes.node\n} : void 0;\nexport { SliderThumb };\nconst SliderValueLabel = styled(SliderValueLabelUnstyled, {\n name: 'MuiSlider',\n slot: 'ValueLabel',\n overridesResolver: (props, styles) => styles.valueLabel\n})(({\n theme,\n ownerState\n}) => _extends({\n [`&.${sliderClasses.valueLabelOpen}`]: {\n transform: 'translateY(-100%) scale(1)'\n },\n zIndex: 1,\n whiteSpace: 'nowrap'\n}, theme.typography.body2, {\n fontWeight: 500,\n transition: theme.transitions.create(['transform'], {\n duration: theme.transitions.duration.shortest\n }),\n transform: 'translateY(-100%) scale(0)',\n position: 'absolute',\n backgroundColor: (theme.vars || theme).palette.grey[600],\n borderRadius: 2,\n color: (theme.vars || theme).palette.common.white,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0.25rem 0.75rem'\n}, ownerState.orientation === 'horizontal' && {\n top: '-10px',\n transformOrigin: 'bottom center',\n '&:before': {\n position: 'absolute',\n content: '\"\"',\n width: 8,\n height: 8,\n transform: 'translate(-50%, 50%) rotate(45deg)',\n backgroundColor: 'inherit',\n bottom: 0,\n left: '50%'\n }\n}, ownerState.orientation === 'vertical' && {\n right: '30px',\n top: '24px',\n transformOrigin: 'right center',\n '&:before': {\n position: 'absolute',\n content: '\"\"',\n width: 8,\n height: 8,\n transform: 'translate(-50%, 50%) rotate(45deg)',\n backgroundColor: 'inherit',\n right: '-20%',\n top: '25%'\n }\n}, ownerState.size === 'small' && {\n fontSize: theme.typography.pxToRem(12),\n padding: '0.25rem 0.5rem'\n}));\nprocess.env.NODE_ENV !== \"production\" ? SliderValueLabel.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * @ignore\n */\n children: PropTypes.node\n} : void 0;\nexport { SliderValueLabel };\nconst SliderMark = styled('span', {\n name: 'MuiSlider',\n slot: 'Mark',\n shouldForwardProp: prop => slotShouldForwardProp(prop) && prop !== 'markActive',\n overridesResolver: (props, styles) => styles.mark\n})(({\n theme,\n ownerState,\n markActive\n}) => _extends({\n position: 'absolute',\n width: 2,\n height: 2,\n borderRadius: 1,\n backgroundColor: 'currentColor'\n}, ownerState.orientation === 'horizontal' && {\n top: '50%',\n transform: 'translate(-1px, -50%)'\n}, ownerState.orientation === 'vertical' && {\n left: '50%',\n transform: 'translate(-50%, 1px)'\n}, markActive && {\n backgroundColor: (theme.vars || theme).palette.background.paper,\n opacity: 0.8\n}));\nprocess.env.NODE_ENV !== \"production\" ? SliderMark.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * @ignore\n */\n children: PropTypes.node\n} : void 0;\nexport { SliderMark };\nconst SliderMarkLabel = styled('span', {\n name: 'MuiSlider',\n slot: 'MarkLabel',\n shouldForwardProp: prop => slotShouldForwardProp(prop) && prop !== 'markLabelActive',\n overridesResolver: (props, styles) => styles.markLabel\n})(({\n theme,\n ownerState,\n markLabelActive\n}) => _extends({}, theme.typography.body2, {\n color: (theme.vars || theme).palette.text.secondary,\n position: 'absolute',\n whiteSpace: 'nowrap'\n}, ownerState.orientation === 'horizontal' && {\n top: 30,\n transform: 'translateX(-50%)',\n '@media (pointer: coarse)': {\n top: 40\n }\n}, ownerState.orientation === 'vertical' && {\n left: 36,\n transform: 'translateY(50%)',\n '@media (pointer: coarse)': {\n left: 44\n }\n}, markLabelActive && {\n color: (theme.vars || theme).palette.text.primary\n}));\nprocess.env.NODE_ENV !== \"production\" ? SliderMarkLabel.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * @ignore\n */\n children: PropTypes.node\n} : void 0;\nexport { SliderMarkLabel };\n\nconst extendUtilityClasses = ownerState => {\n const {\n color,\n size,\n classes = {}\n } = ownerState;\n return _extends({}, classes, {\n root: clsx(classes.root, getSliderUtilityClass(`color${capitalize(color)}`), classes[`color${capitalize(color)}`], size && [getSliderUtilityClass(`size${capitalize(size)}`), classes[`size${capitalize(size)}`]]),\n thumb: clsx(classes.thumb, getSliderUtilityClass(`thumbColor${capitalize(color)}`), classes[`thumbColor${capitalize(color)}`], size && [getSliderUtilityClass(`thumbSize${capitalize(size)}`), classes[`thumbSize${capitalize(size)}`]])\n });\n};\n\nconst Slider = /*#__PURE__*/React.forwardRef(function Slider(inputProps, ref) {\n var _componentsProps$root, _componentsProps$thum, _componentsProps$trac, _componentsProps$valu;\n\n const props = useThemeProps({\n props: inputProps,\n name: 'MuiSlider'\n });\n const theme = useTheme();\n const isRtl = theme.direction === 'rtl';\n\n const {\n // eslint-disable-next-line react/prop-types\n component = 'span',\n components = {},\n componentsProps = {},\n color = 'primary',\n size = 'medium'\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const ownerState = _extends({}, props, {\n color,\n size\n });\n\n const classes = extendUtilityClasses(ownerState);\n return /*#__PURE__*/_jsx(SliderUnstyled, _extends({}, other, {\n isRtl: isRtl,\n components: _extends({\n Root: SliderRoot,\n Rail: SliderRail,\n Track: SliderTrack,\n Thumb: SliderThumb,\n ValueLabel: SliderValueLabel,\n Mark: SliderMark,\n MarkLabel: SliderMarkLabel\n }, components),\n componentsProps: _extends({}, componentsProps, {\n root: _extends({}, componentsProps.root, shouldSpreadAdditionalProps(components.Root) && {\n as: component,\n ownerState: _extends({}, (_componentsProps$root = componentsProps.root) == null ? void 0 : _componentsProps$root.ownerState, {\n color,\n size\n })\n }),\n thumb: _extends({}, componentsProps.thumb, shouldSpreadAdditionalProps(components.Thumb) && {\n ownerState: _extends({}, (_componentsProps$thum = componentsProps.thumb) == null ? void 0 : _componentsProps$thum.ownerState, {\n color,\n size\n })\n }),\n track: _extends({}, componentsProps.track, shouldSpreadAdditionalProps(components.Track) && {\n ownerState: _extends({}, (_componentsProps$trac = componentsProps.track) == null ? void 0 : _componentsProps$trac.ownerState, {\n color,\n size\n })\n }),\n valueLabel: _extends({}, componentsProps.valueLabel, shouldSpreadAdditionalProps(components.ValueLabel) && {\n ownerState: _extends({}, (_componentsProps$valu = componentsProps.valueLabel) == null ? void 0 : _componentsProps$valu.ownerState, {\n color,\n size\n })\n })\n }),\n classes: classes,\n ref: ref\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? Slider.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The label of the slider.\n */\n 'aria-label': chainPropTypes(PropTypes.string, props => {\n const range = Array.isArray(props.value || props.defaultValue);\n\n if (range && props['aria-label'] != null) {\n return new Error('MUI: You need to use the `getAriaLabel` prop instead of `aria-label` when using a range slider.');\n }\n\n return null;\n }),\n\n /**\n * The id of the element containing a label for the slider.\n */\n 'aria-labelledby': PropTypes.string,\n\n /**\n * A string value that provides a user-friendly name for the current value of the slider.\n */\n 'aria-valuetext': chainPropTypes(PropTypes.string, props => {\n const range = Array.isArray(props.value || props.defaultValue);\n\n if (range && props['aria-valuetext'] != null) {\n return new Error('MUI: You need to use the `getAriaValueText` prop instead of `aria-valuetext` when using a range slider.');\n }\n\n return null;\n }),\n\n /**\n * @ignore\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n\n /**\n * The color of the component.\n * It supports both default and custom theme colors, which can be added as shown in the\n * [palette customization guide](https://mui.com/material-ui/customization/palette/#adding-new-colors).\n * @default 'primary'\n */\n color: PropTypes\n /* @typescript-to-proptypes-ignore */\n .oneOfType([PropTypes.oneOf(['primary', 'secondary']), PropTypes.string]),\n\n /**\n * The components used for each slot inside the Slider.\n * Either a string to use a HTML element or a component.\n * @default {}\n */\n components: PropTypes.shape({\n Input: PropTypes.elementType,\n Mark: PropTypes.elementType,\n MarkLabel: PropTypes.elementType,\n Rail: PropTypes.elementType,\n Root: PropTypes.elementType,\n Thumb: PropTypes.elementType,\n Track: PropTypes.elementType,\n ValueLabel: PropTypes.elementType\n }),\n\n /**\n * The props used for each slot inside the Slider.\n * @default {}\n */\n componentsProps: PropTypes.shape({\n input: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),\n mark: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),\n markLabel: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),\n rail: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),\n root: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),\n thumb: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),\n track: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),\n valueLabel: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({\n children: PropTypes.element,\n className: PropTypes.string,\n components: PropTypes.shape({\n Root: PropTypes.elementType\n }),\n open: PropTypes.bool,\n style: PropTypes.object,\n value: PropTypes.number,\n valueLabelDisplay: PropTypes.oneOf(['auto', 'off', 'on'])\n })])\n }),\n\n /**\n * The default value. Use when the component is not controlled.\n */\n defaultValue: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.number), PropTypes.number]),\n\n /**\n * If `true`, the component is disabled.\n * @default false\n */\n disabled: PropTypes.bool,\n\n /**\n * If `true`, the active thumb doesn't swap when moving pointer over a thumb while dragging another thumb.\n * @default false\n */\n disableSwap: PropTypes.bool,\n\n /**\n * Accepts a function which returns a string value that provides a user-friendly name for the thumb labels of the slider.\n * This is important for screen reader users.\n * @param {number} index The thumb label's index to format.\n * @returns {string}\n */\n getAriaLabel: PropTypes.func,\n\n /**\n * Accepts a function which returns a string value that provides a user-friendly name for the current value of the slider.\n * This is important for screen reader users.\n * @param {number} value The thumb label's value to format.\n * @param {number} index The thumb label's index to format.\n * @returns {string}\n */\n getAriaValueText: PropTypes.func,\n\n /**\n * Indicates whether the theme context has rtl direction. It is set automatically.\n * @default false\n */\n isRtl: PropTypes.bool,\n\n /**\n * Marks indicate predetermined values to which the user can move the slider.\n * If `true` the marks are spaced according the value of the `step` prop.\n * If an array, it should contain objects with `value` and an optional `label` keys.\n * @default false\n */\n marks: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.shape({\n label: PropTypes.node,\n value: PropTypes.number.isRequired\n })), PropTypes.bool]),\n\n /**\n * The maximum allowed value of the slider.\n * Should not be equal to min.\n * @default 100\n */\n max: PropTypes.number,\n\n /**\n * The minimum allowed value of the slider.\n * Should not be equal to max.\n * @default 0\n */\n min: PropTypes.number,\n\n /**\n * Name attribute of the hidden `input` element.\n */\n name: PropTypes.string,\n\n /**\n * Callback function that is fired when the slider's value changed.\n *\n * @param {Event} event The event source of the callback.\n * You can pull out the new value by accessing `event.target.value` (any).\n * **Warning**: This is a generic event not a change event.\n * @param {number | number[]} value The new value.\n * @param {number} activeThumb Index of the currently moved thumb.\n */\n onChange: PropTypes.func,\n\n /**\n * Callback function that is fired when the `mouseup` is triggered.\n *\n * @param {React.SyntheticEvent | Event} event The event source of the callback. **Warning**: This is a generic event not a change event.\n * @param {number | number[]} value The new value.\n */\n onChangeCommitted: PropTypes.func,\n\n /**\n * The component orientation.\n * @default 'horizontal'\n */\n orientation: PropTypes.oneOf(['horizontal', 'vertical']),\n\n /**\n * A transformation function, to change the scale of the slider.\n * @default (x) => x\n */\n scale: PropTypes.func,\n\n /**\n * The size of the slider.\n * @default 'medium'\n */\n size: PropTypes\n /* @typescript-to-proptypes-ignore */\n .oneOfType([PropTypes.oneOf(['small', 'medium']), PropTypes.string]),\n\n /**\n * The granularity with which the slider can step through values. (A \"discrete\" slider.)\n * The `min` prop serves as the origin for the valid values.\n * We recommend (max - min) to be evenly divisible by the step.\n *\n * When step is `null`, the thumb can only be slid onto marks provided with the `marks` prop.\n * @default 1\n */\n step: PropTypes.number,\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n\n /**\n * Tab index attribute of the hidden `input` element.\n */\n tabIndex: PropTypes.number,\n\n /**\n * The track presentation:\n *\n * - `normal` the track will render a bar representing the slider value.\n * - `inverted` the track will render a bar representing the remaining slider value.\n * - `false` the track will render without a bar.\n * @default 'normal'\n */\n track: PropTypes.oneOf(['inverted', 'normal', false]),\n\n /**\n * The value of the slider.\n * For ranged sliders, provide an array with two values.\n */\n value: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.number), PropTypes.number]),\n\n /**\n * Controls when the value label is displayed:\n *\n * - `auto` the value label will display when the thumb is hovered or focused.\n * - `on` will display persistently.\n * - `off` will never display.\n * @default 'off'\n */\n valueLabelDisplay: PropTypes.oneOf(['auto', 'off', 'on']),\n\n /**\n * The format function the value label's value.\n *\n * When a function is provided, it should have the following signature:\n *\n * - {number} value The value label's value to format\n * - {number} index The value label's index to format\n * @default (x) => x\n */\n valueLabelFormat: PropTypes.oneOfType([PropTypes.func, PropTypes.string])\n} : void 0;\nexport default Slider;","import { generateUtilityClass, generateUtilityClasses } from '@mui/base';\nexport function getButtonGroupUtilityClass(slot) {\n return generateUtilityClass('MuiButtonGroup', slot);\n}\nconst buttonGroupClasses = generateUtilityClasses('MuiButtonGroup', ['root', 'contained', 'outlined', 'text', 'disableElevation', 'disabled', 'fullWidth', 'vertical', 'grouped', 'groupedHorizontal', 'groupedVertical', 'groupedText', 'groupedTextHorizontal', 'groupedTextVertical', 'groupedTextPrimary', 'groupedTextSecondary', 'groupedOutlined', 'groupedOutlinedHorizontal', 'groupedOutlinedVertical', 'groupedOutlinedPrimary', 'groupedOutlinedSecondary', 'groupedContained', 'groupedContainedHorizontal', 'groupedContainedVertical', 'groupedContainedPrimary', 'groupedContainedSecondary']);\nexport default buttonGroupClasses;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"children\", \"className\", \"color\", \"component\", \"disabled\", \"disableElevation\", \"disableFocusRipple\", \"disableRipple\", \"fullWidth\", \"orientation\", \"size\", \"variant\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { unstable_composeClasses as composeClasses } from '@mui/base';\nimport { alpha } from '@mui/system';\nimport capitalize from '../utils/capitalize';\nimport styled from '../styles/styled';\nimport useThemeProps from '../styles/useThemeProps';\nimport buttonGroupClasses, { getButtonGroupUtilityClass } from './buttonGroupClasses';\nimport ButtonGroupContext from './ButtonGroupContext';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n\nconst overridesResolver = (props, styles) => {\n const {\n ownerState\n } = props;\n return [{\n [`& .${buttonGroupClasses.grouped}`]: styles.grouped\n }, {\n [`& .${buttonGroupClasses.grouped}`]: styles[`grouped${capitalize(ownerState.orientation)}`]\n }, {\n [`& .${buttonGroupClasses.grouped}`]: styles[`grouped${capitalize(ownerState.variant)}`]\n }, {\n [`& .${buttonGroupClasses.grouped}`]: styles[`grouped${capitalize(ownerState.variant)}${capitalize(ownerState.orientation)}`]\n }, {\n [`& .${buttonGroupClasses.grouped}`]: styles[`grouped${capitalize(ownerState.variant)}${capitalize(ownerState.color)}`]\n }, styles.root, styles[ownerState.variant], ownerState.disableElevation === true && styles.disableElevation, ownerState.fullWidth && styles.fullWidth, ownerState.orientation === 'vertical' && styles.vertical];\n};\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n color,\n disabled,\n disableElevation,\n fullWidth,\n orientation,\n variant\n } = ownerState;\n const slots = {\n root: ['root', variant, orientation === 'vertical' && 'vertical', fullWidth && 'fullWidth', disableElevation && 'disableElevation'],\n grouped: ['grouped', `grouped${capitalize(orientation)}`, `grouped${capitalize(variant)}`, `grouped${capitalize(variant)}${capitalize(orientation)}`, `grouped${capitalize(variant)}${capitalize(color)}`, disabled && 'disabled']\n };\n return composeClasses(slots, getButtonGroupUtilityClass, classes);\n};\n\nconst ButtonGroupRoot = styled('div', {\n name: 'MuiButtonGroup',\n slot: 'Root',\n overridesResolver\n})(({\n theme,\n ownerState\n}) => _extends({\n display: 'inline-flex',\n borderRadius: (theme.vars || theme).shape.borderRadius\n}, ownerState.variant === 'contained' && {\n boxShadow: (theme.vars || theme).shadows[2]\n}, ownerState.disableElevation && {\n boxShadow: 'none'\n}, ownerState.fullWidth && {\n width: '100%'\n}, ownerState.orientation === 'vertical' && {\n flexDirection: 'column'\n}, {\n [`& .${buttonGroupClasses.grouped}`]: _extends({\n minWidth: 40,\n '&:not(:first-of-type)': _extends({}, ownerState.orientation === 'horizontal' && {\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0\n }, ownerState.orientation === 'vertical' && {\n borderTopRightRadius: 0,\n borderTopLeftRadius: 0\n }, ownerState.variant === 'outlined' && ownerState.orientation === 'horizontal' && {\n marginLeft: -1\n }, ownerState.variant === 'outlined' && ownerState.orientation === 'vertical' && {\n marginTop: -1\n }),\n '&:not(:last-of-type)': _extends({}, ownerState.orientation === 'horizontal' && {\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0\n }, ownerState.orientation === 'vertical' && {\n borderBottomRightRadius: 0,\n borderBottomLeftRadius: 0\n }, ownerState.variant === 'text' && ownerState.orientation === 'horizontal' && {\n borderRight: theme.vars ? `1px solid rgba(${theme.vars.palette.common.onBackgroundChannel} / 0.23)` : `1px solid ${theme.palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)'}`\n }, ownerState.variant === 'text' && ownerState.orientation === 'vertical' && {\n borderBottom: theme.vars ? `1px solid rgba(${theme.vars.palette.common.onBackgroundChannel} / 0.23)` : `1px solid ${theme.palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)'}`\n }, ownerState.variant === 'text' && ownerState.color !== 'inherit' && {\n borderColor: theme.vars ? `rgba(${theme.vars.palette[ownerState.color].mainChannel} / 0.5)` : alpha(theme.palette[ownerState.color].main, 0.5)\n }, ownerState.variant === 'outlined' && ownerState.orientation === 'horizontal' && {\n borderRightColor: 'transparent'\n }, ownerState.variant === 'outlined' && ownerState.orientation === 'vertical' && {\n borderBottomColor: 'transparent'\n }, ownerState.variant === 'contained' && ownerState.orientation === 'horizontal' && {\n borderRight: `1px solid ${(theme.vars || theme).palette.grey[400]}`,\n [`&.${buttonGroupClasses.disabled}`]: {\n borderRight: `1px solid ${(theme.vars || theme).palette.action.disabled}`\n }\n }, ownerState.variant === 'contained' && ownerState.orientation === 'vertical' && {\n borderBottom: `1px solid ${(theme.vars || theme).palette.grey[400]}`,\n [`&.${buttonGroupClasses.disabled}`]: {\n borderBottom: `1px solid ${(theme.vars || theme).palette.action.disabled}`\n }\n }, ownerState.variant === 'contained' && ownerState.color !== 'inherit' && {\n borderColor: (theme.vars || theme).palette[ownerState.color].dark\n }, {\n '&:hover': _extends({}, ownerState.variant === 'outlined' && ownerState.orientation === 'horizontal' && {\n borderRightColor: 'currentColor'\n }, ownerState.variant === 'outlined' && ownerState.orientation === 'vertical' && {\n borderBottomColor: 'currentColor'\n })\n }),\n '&:hover': _extends({}, ownerState.variant === 'contained' && {\n boxShadow: 'none'\n })\n }, ownerState.variant === 'contained' && {\n boxShadow: 'none'\n })\n}));\nconst ButtonGroup = /*#__PURE__*/React.forwardRef(function ButtonGroup(inProps, ref) {\n const props = useThemeProps({\n props: inProps,\n name: 'MuiButtonGroup'\n });\n\n const {\n children,\n className,\n color = 'primary',\n component = 'div',\n disabled = false,\n disableElevation = false,\n disableFocusRipple = false,\n disableRipple = false,\n fullWidth = false,\n orientation = 'horizontal',\n size = 'medium',\n variant = 'outlined'\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const ownerState = _extends({}, props, {\n color,\n component,\n disabled,\n disableElevation,\n disableFocusRipple,\n disableRipple,\n fullWidth,\n orientation,\n size,\n variant\n });\n\n const classes = useUtilityClasses(ownerState);\n const context = React.useMemo(() => ({\n className: classes.grouped,\n color,\n disabled,\n disableElevation,\n disableFocusRipple,\n disableRipple,\n fullWidth,\n size,\n variant\n }), [color, disabled, disableElevation, disableFocusRipple, disableRipple, fullWidth, size, variant, classes.grouped]);\n return /*#__PURE__*/_jsx(ButtonGroupRoot, _extends({\n as: component,\n role: \"group\",\n className: clsx(classes.root, className),\n ref: ref,\n ownerState: ownerState\n }, other, {\n children: /*#__PURE__*/_jsx(ButtonGroupContext.Provider, {\n value: context,\n children: children\n })\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? ButtonGroup.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The content of the component.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The color of the component.\n * It supports both default and custom theme colors, which can be added as shown in the\n * [palette customization guide](https://mui.com/material-ui/customization/palette/#adding-new-colors).\n * @default 'primary'\n */\n color: PropTypes\n /* @typescript-to-proptypes-ignore */\n .oneOfType([PropTypes.oneOf(['inherit', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), PropTypes.string]),\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes.elementType,\n\n /**\n * If `true`, the component is disabled.\n * @default false\n */\n disabled: PropTypes.bool,\n\n /**\n * If `true`, no elevation is used.\n * @default false\n */\n disableElevation: PropTypes.bool,\n\n /**\n * If `true`, the button keyboard focus ripple is disabled.\n * @default false\n */\n disableFocusRipple: PropTypes.bool,\n\n /**\n * If `true`, the button ripple effect is disabled.\n * @default false\n */\n disableRipple: PropTypes.bool,\n\n /**\n * If `true`, the buttons will take up the full width of its container.\n * @default false\n */\n fullWidth: PropTypes.bool,\n\n /**\n * The component orientation (layout flow direction).\n * @default 'horizontal'\n */\n orientation: PropTypes.oneOf(['horizontal', 'vertical']),\n\n /**\n * The size of the component.\n * `small` is equivalent to the dense button styling.\n * @default 'medium'\n */\n size: PropTypes\n /* @typescript-to-proptypes-ignore */\n .oneOfType([PropTypes.oneOf(['small', 'medium', 'large']), PropTypes.string]),\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n\n /**\n * The variant to use.\n * @default 'outlined'\n */\n variant: PropTypes\n /* @typescript-to-proptypes-ignore */\n .oneOfType([PropTypes.oneOf(['contained', 'outlined', 'text']), PropTypes.string])\n} : void 0;\nexport default ButtonGroup;","import { generateUtilityClass, generateUtilityClasses } from '@mui/base';\nexport function getFormGroupUtilityClass(slot) {\n return generateUtilityClass('MuiFormGroup', slot);\n}\nconst formGroupClasses = generateUtilityClasses('MuiFormGroup', ['root', 'row', 'error']);\nexport default formGroupClasses;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"className\", \"row\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { unstable_composeClasses as composeClasses } from '@mui/base';\nimport styled from '../styles/styled';\nimport useThemeProps from '../styles/useThemeProps';\nimport { getFormGroupUtilityClass } from './formGroupClasses';\nimport useFormControl from '../FormControl/useFormControl';\nimport formControlState from '../FormControl/formControlState';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n row,\n error\n } = ownerState;\n const slots = {\n root: ['root', row && 'row', error && 'error']\n };\n return composeClasses(slots, getFormGroupUtilityClass, classes);\n};\n\nconst FormGroupRoot = styled('div', {\n name: 'MuiFormGroup',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.row && styles.row];\n }\n})(({\n ownerState\n}) => _extends({\n display: 'flex',\n flexDirection: 'column',\n flexWrap: 'wrap'\n}, ownerState.row && {\n flexDirection: 'row'\n}));\n/**\n * `FormGroup` wraps controls such as `Checkbox` and `Switch`.\n * It provides compact row layout.\n * For the `Radio`, you should be using the `RadioGroup` component instead of this one.\n */\n\nconst FormGroup = /*#__PURE__*/React.forwardRef(function FormGroup(inProps, ref) {\n const props = useThemeProps({\n props: inProps,\n name: 'MuiFormGroup'\n });\n\n const {\n className,\n row = false\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const muiFormControl = useFormControl();\n const fcs = formControlState({\n props,\n muiFormControl,\n states: ['error']\n });\n\n const ownerState = _extends({}, props, {\n row,\n error: fcs.error\n });\n\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/_jsx(FormGroupRoot, _extends({\n className: clsx(classes.root, className),\n ownerState: ownerState,\n ref: ref\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? FormGroup.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The content of the component.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * Display group of elements in a compact row.\n * @default false\n */\n row: PropTypes.bool,\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])\n} : void 0;\nexport default FormGroup;","import { generateUtilityClass, generateUtilityClasses } from '@mui/base';\nexport function getCollapseUtilityClass(slot) {\n return generateUtilityClass('MuiCollapse', slot);\n}\nconst collapseClasses = generateUtilityClasses('MuiCollapse', ['root', 'horizontal', 'vertical', 'entered', 'hidden', 'wrapper', 'wrapperInner']);\nexport default collapseClasses;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"addEndListener\", \"children\", \"className\", \"collapsedSize\", \"component\", \"easing\", \"in\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"orientation\", \"style\", \"timeout\", \"TransitionComponent\"];\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { Transition } from 'react-transition-group';\nimport { elementTypeAcceptingRef } from '@mui/utils';\nimport { unstable_composeClasses as composeClasses } from '@mui/base';\nimport styled from '../styles/styled';\nimport useThemeProps from '../styles/useThemeProps';\nimport { duration } from '../styles/createTransitions';\nimport { getTransitionProps } from '../transitions/utils';\nimport useTheme from '../styles/useTheme';\nimport { useForkRef } from '../utils';\nimport { getCollapseUtilityClass } from './collapseClasses';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n\nconst useUtilityClasses = ownerState => {\n const {\n orientation,\n classes\n } = ownerState;\n const slots = {\n root: ['root', `${orientation}`],\n entered: ['entered'],\n hidden: ['hidden'],\n wrapper: ['wrapper', `${orientation}`],\n wrapperInner: ['wrapperInner', `${orientation}`]\n };\n return composeClasses(slots, getCollapseUtilityClass, classes);\n};\n\nconst CollapseRoot = styled('div', {\n name: 'MuiCollapse',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, styles[ownerState.orientation], ownerState.state === 'entered' && styles.entered, ownerState.state === 'exited' && !ownerState.in && ownerState.collapsedSize === '0px' && styles.hidden];\n }\n})(({\n theme,\n ownerState\n}) => _extends({\n height: 0,\n overflow: 'hidden',\n transition: theme.transitions.create('height')\n}, ownerState.orientation === 'horizontal' && {\n height: 'auto',\n width: 0,\n transition: theme.transitions.create('width')\n}, ownerState.state === 'entered' && _extends({\n height: 'auto',\n overflow: 'visible'\n}, ownerState.orientation === 'horizontal' && {\n width: 'auto'\n}), ownerState.state === 'exited' && !ownerState.in && ownerState.collapsedSize === '0px' && {\n visibility: 'hidden'\n}));\nconst CollapseWrapper = styled('div', {\n name: 'MuiCollapse',\n slot: 'Wrapper',\n overridesResolver: (props, styles) => styles.wrapper\n})(({\n ownerState\n}) => _extends({\n // Hack to get children with a negative margin to not falsify the height computation.\n display: 'flex',\n width: '100%'\n}, ownerState.orientation === 'horizontal' && {\n width: 'auto',\n height: '100%'\n}));\nconst CollapseWrapperInner = styled('div', {\n name: 'MuiCollapse',\n slot: 'WrapperInner',\n overridesResolver: (props, styles) => styles.wrapperInner\n})(({\n ownerState\n}) => _extends({\n width: '100%'\n}, ownerState.orientation === 'horizontal' && {\n width: 'auto',\n height: '100%'\n}));\n/**\n * The Collapse transition is used by the\n * [Vertical Stepper](/material-ui/react-stepper/#vertical-stepper) StepContent component.\n * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.\n */\n\nconst Collapse = /*#__PURE__*/React.forwardRef(function Collapse(inProps, ref) {\n const props = useThemeProps({\n props: inProps,\n name: 'MuiCollapse'\n });\n\n const {\n addEndListener,\n children,\n className,\n collapsedSize: collapsedSizeProp = '0px',\n component,\n easing,\n in: inProp,\n onEnter,\n onEntered,\n onEntering,\n onExit,\n onExited,\n onExiting,\n orientation = 'vertical',\n style,\n timeout = duration.standard,\n // eslint-disable-next-line react/prop-types\n TransitionComponent = Transition\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const ownerState = _extends({}, props, {\n orientation,\n collapsedSize: collapsedSizeProp\n });\n\n const classes = useUtilityClasses(ownerState);\n const theme = useTheme();\n const timer = React.useRef();\n const wrapperRef = React.useRef(null);\n const autoTransitionDuration = React.useRef();\n const collapsedSize = typeof collapsedSizeProp === 'number' ? `${collapsedSizeProp}px` : collapsedSizeProp;\n const isHorizontal = orientation === 'horizontal';\n const size = isHorizontal ? 'width' : 'height';\n React.useEffect(() => {\n return () => {\n clearTimeout(timer.current);\n };\n }, []);\n const nodeRef = React.useRef(null);\n const handleRef = useForkRef(ref, nodeRef);\n\n const normalizedTransitionCallback = callback => maybeIsAppearing => {\n if (callback) {\n const node = nodeRef.current; // onEnterXxx and onExitXxx callbacks have a different arguments.length value.\n\n if (maybeIsAppearing === undefined) {\n callback(node);\n } else {\n callback(node, maybeIsAppearing);\n }\n }\n };\n\n const getWrapperSize = () => wrapperRef.current ? wrapperRef.current[isHorizontal ? 'clientWidth' : 'clientHeight'] : 0;\n\n const handleEnter = normalizedTransitionCallback((node, isAppearing) => {\n if (wrapperRef.current && isHorizontal) {\n // Set absolute position to get the size of collapsed content\n wrapperRef.current.style.position = 'absolute';\n }\n\n node.style[size] = collapsedSize;\n\n if (onEnter) {\n onEnter(node, isAppearing);\n }\n });\n const handleEntering = normalizedTransitionCallback((node, isAppearing) => {\n const wrapperSize = getWrapperSize();\n\n if (wrapperRef.current && isHorizontal) {\n // After the size is read reset the position back to default\n wrapperRef.current.style.position = '';\n }\n\n const {\n duration: transitionDuration,\n easing: transitionTimingFunction\n } = getTransitionProps({\n style,\n timeout,\n easing\n }, {\n mode: 'enter'\n });\n\n if (timeout === 'auto') {\n const duration2 = theme.transitions.getAutoHeightDuration(wrapperSize);\n node.style.transitionDuration = `${duration2}ms`;\n autoTransitionDuration.current = duration2;\n } else {\n node.style.transitionDuration = typeof transitionDuration === 'string' ? transitionDuration : `${transitionDuration}ms`;\n }\n\n node.style[size] = `${wrapperSize}px`;\n node.style.transitionTimingFunction = transitionTimingFunction;\n\n if (onEntering) {\n onEntering(node, isAppearing);\n }\n });\n const handleEntered = normalizedTransitionCallback((node, isAppearing) => {\n node.style[size] = 'auto';\n\n if (onEntered) {\n onEntered(node, isAppearing);\n }\n });\n const handleExit = normalizedTransitionCallback(node => {\n node.style[size] = `${getWrapperSize()}px`;\n\n if (onExit) {\n onExit(node);\n }\n });\n const handleExited = normalizedTransitionCallback(onExited);\n const handleExiting = normalizedTransitionCallback(node => {\n const wrapperSize = getWrapperSize();\n const {\n duration: transitionDuration,\n easing: transitionTimingFunction\n } = getTransitionProps({\n style,\n timeout,\n easing\n }, {\n mode: 'exit'\n });\n\n if (timeout === 'auto') {\n // TODO: rename getAutoHeightDuration to something more generic (width support)\n // Actually it just calculates animation duration based on size\n const duration2 = theme.transitions.getAutoHeightDuration(wrapperSize);\n node.style.transitionDuration = `${duration2}ms`;\n autoTransitionDuration.current = duration2;\n } else {\n node.style.transitionDuration = typeof transitionDuration === 'string' ? transitionDuration : `${transitionDuration}ms`;\n }\n\n node.style[size] = collapsedSize;\n node.style.transitionTimingFunction = transitionTimingFunction;\n\n if (onExiting) {\n onExiting(node);\n }\n });\n\n const handleAddEndListener = next => {\n if (timeout === 'auto') {\n timer.current = setTimeout(next, autoTransitionDuration.current || 0);\n }\n\n if (addEndListener) {\n // Old call signature before `react-transition-group` implemented `nodeRef`\n addEndListener(nodeRef.current, next);\n }\n };\n\n return /*#__PURE__*/_jsx(TransitionComponent, _extends({\n in: inProp,\n onEnter: handleEnter,\n onEntered: handleEntered,\n onEntering: handleEntering,\n onExit: handleExit,\n onExited: handleExited,\n onExiting: handleExiting,\n addEndListener: handleAddEndListener,\n nodeRef: nodeRef,\n timeout: timeout === 'auto' ? null : timeout\n }, other, {\n children: (state, childProps) => /*#__PURE__*/_jsx(CollapseRoot, _extends({\n as: component,\n className: clsx(classes.root, className, {\n 'entered': classes.entered,\n 'exited': !inProp && collapsedSize === '0px' && classes.hidden\n }[state]),\n style: _extends({\n [isHorizontal ? 'minWidth' : 'minHeight']: collapsedSize\n }, style),\n ownerState: _extends({}, ownerState, {\n state\n }),\n ref: handleRef\n }, childProps, {\n children: /*#__PURE__*/_jsx(CollapseWrapper, {\n ownerState: _extends({}, ownerState, {\n state\n }),\n className: classes.wrapper,\n ref: wrapperRef,\n children: /*#__PURE__*/_jsx(CollapseWrapperInner, {\n ownerState: _extends({}, ownerState, {\n state\n }),\n className: classes.wrapperInner,\n children: children\n })\n })\n }))\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? Collapse.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * Add a custom transition end trigger. Called with the transitioning DOM\n * node and a done callback. Allows for more fine grained transition end\n * logic. Note: Timeouts are still used as a fallback if provided.\n */\n addEndListener: PropTypes.func,\n\n /**\n * The content node to be collapsed.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The width (horizontal) or height (vertical) of the container when collapsed.\n * @default '0px'\n */\n collapsedSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: elementTypeAcceptingRef,\n\n /**\n * The transition timing function.\n * You may specify a single easing or a object containing enter and exit values.\n */\n easing: PropTypes.oneOfType([PropTypes.shape({\n enter: PropTypes.string,\n exit: PropTypes.string\n }), PropTypes.string]),\n\n /**\n * If `true`, the component will transition in.\n */\n in: PropTypes.bool,\n\n /**\n * @ignore\n */\n onEnter: PropTypes.func,\n\n /**\n * @ignore\n */\n onEntered: PropTypes.func,\n\n /**\n * @ignore\n */\n onEntering: PropTypes.func,\n\n /**\n * @ignore\n */\n onExit: PropTypes.func,\n\n /**\n * @ignore\n */\n onExited: PropTypes.func,\n\n /**\n * @ignore\n */\n onExiting: PropTypes.func,\n\n /**\n * The transition orientation.\n * @default 'vertical'\n */\n orientation: PropTypes.oneOf(['horizontal', 'vertical']),\n\n /**\n * @ignore\n */\n style: PropTypes.object,\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n\n /**\n * The duration for the transition, in milliseconds.\n * You may specify a single timeout for all transitions, or individually with an object.\n *\n * Set to 'auto' to automatically calculate transition time based on height.\n * @default duration.standard\n */\n timeout: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number, PropTypes.shape({\n appear: PropTypes.number,\n enter: PropTypes.number,\n exit: PropTypes.number\n })])\n} : void 0;\nCollapse.muiSupportAuto = true;\nexport default Collapse;","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-cart/templates/addAssetsToCategoryView.html -->\\n<div class=\"container\">\\n\t<form id=\"add-assets-to-category-view-form\" role=\"form\">\\n\t\t<header>\\n\t\t\t<h2 class=\"title\"><span class=\"text\">'+\n((__t=( headerTitle ))==null?'':__t)+\n'</span></h2>\\n\t\t</header>\\n\t\t<div class=\"striped\" data-nx-control=\"tree\"></div>\\n\t\t<footer>\\n\t\t\t<div class=\"actions\">\\n\t\t\t\t<aside>\\n\t\t\t\t\t<button type=\"button\" class=\"btn btn-default cancel nx-cancel\" data-nx-control=\"cancel\"><span class=\"text\" data-i18n=\"i18n.cancel\">i18n.cancel</span></button>\\n\t\t\t\t</aside>\\n\t\t\t\t<bside>\\n\t\t\t\t\t<button type=\"submit\" class=\"btn btn-save submit\" data-nx-control=\"save\"><span class=\"text\" data-i18n=\"i18n.save\">i18n.save</span></button>\\n\t\t\t\t</bside>\\n\t\t\t</div>\\n\t\t</footer>\\n\t</form>\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/appTabItemsView.html -->\\n<!-- <ul role=\"tablist\" class=\"nav nav-tabs nx-childviews\"></ul> -->\\n';\n if (useList) { \n__p+='\\n<div class=\"mdc-list nx-childviews\"></div>\\n';\n } else { \n__p+='\\n<div class=\"mdc-tab-bar\" role=\"tablist\">\\n\t<div class=\"mdc-tab-scroller\">\\n\t\t<div class=\"mdc-tab-scroller__scroll-area\">\\n\t\t\t<div class=\"mdc-tab-scroller__scroll-content nx-childviews\"></div>\\n\t\t</div>\\n\t</div>\\n</div>\\n';\n } \n__p+='\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/appTabItemView.html -->\\n';\n if (useList) { \n__p+='\\n\t';\n if( icon ) { \n__p+='\\n\t<span class=\"mdc-list-item__graphic\">'+\n((__t=( icon ))==null?'':__t)+\n'</span>\\n\t';\n } \n__p+='\\n\t<span class=\"mdc-list-item__text nx-title\">'+\n((__t=( label ))==null?'':__t)+\n'</span>\\n';\n } else { \n__p+='\\n<span class=\"mdc-tab__content\">\\n\t';\n if( icon ) { \n__p+='\\n\t\t<span class=\"mdc-tab__icon\">'+\n((__t=( icon ))==null?'':__t)+\n'</span>\\n\t';\n } \n__p+='\\n\t';\n if( label ) { \n__p+='\\n\t\t<span class=\"mdc-tab__text-label\">\\n\t\t\t<span class=\"nx-title\">'+\n((__t=( label ))==null?'':__t)+\n'</span>\\n\t\t\t';\n if (hasTotal) { \n__p+='\\n\t\t\t<span class=\"badge item-count nx-count\">2</span>\\n\t\t\t';\n } \n__p+='\\n\t\t</span>\\n\t';\n } \n__p+='\\n</span>\\n<span class=\"mdc-tab-indicator '+\n((__t=( active || !index ? 'mdc-tab-indicator--active' : '' ))==null?'':__t)+\n'\">\\n\t<span class=\"mdc-tab-indicator__content mdc-tab-indicator__content--underline\"></span>\\n</span>\\n<span class=\"mdc-tab__ripple\"></span>\\n';\n } \n__p+='\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/select.html -->\\n<div class=\"mdc-drawer mdc-drawer--modal mdc-drawer--right\">\\n\t<div class=\"mdc-drawer__content tab-content\">\\n\t\t<form class=\"form panel__form\" id=\"app-select-form\" role=\"form\" data-nx-validate-form>\\n\t\t\t<div class=\"sub-header mdc-drawer__sub-header\" role=\"tabpanel\" data-nx-control=\"tabpanel\"></div>\\n\\n\t\t\t<article class=\"content content--no-pad panel__content\" data-nx-control=\"tab-content\"></article>\\n\\n\t\t\t<footer class=\"footer panel__footer form--hide-no-changes\">\\n\t\t\t\t<div class=\"actions double\">\\n\t\t\t\t\t<button type=\"button\" class=\"btn btn-default cancel nx-cancel nx-cancel\"><span class=\"text\" data-i18n=\"i18n.cancel\">i18n.cancel</span></button>\\n\t\t\t\t\t<button type=\"submit\" class=\"btn btn-save submit nx-save\"><span class=\"text\" data-i18n=\"i18n.save\">i18n.save</span></button>\\n\t\t\t\t</div>\\n\t\t\t</footer>\\n\t\t</form>\\n\t</div>\\n</div>\\n\\n<div class=\"mdc-drawer-scrim\"></div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/select_from.html -->\\n';\n if (newItemsEnabled) {\n__p+='\\n<div class=\"sub-header panel__sub-header flex--column\">\\n\t<div class=\"nx-ui-app-select__new\"></div>\\n</div>\\n';\n } \n__p+='\\n\\n<div class=\"sub-header panel__sub-header flex--column\">\\n\t<div class=\"form-group\" role=\"search\">\\n\t\t<nx-search\\n\t\tclass=\"form-control search filter '+\n((__t=( clientSearch ? 'nx-filter-children' : '' ))==null?'':_.escape(__t))+\n'\"\\n\t\tplaceholder=\"'+\n((__t=( i18n.t('i18n.filter') ))==null?'':_.escape(__t))+\n'\"\\n\t\t'+\n((__t=( clientSearchKey ? 'data-nx-search-key=\"' + clientSearchKey + '\"' : '' ))==null?'':_.escape(__t))+\n'\\n\t\tdata-nx-ignore></nx-search>\\n\t</div>\\n</div>\\n\\n<article class=\"content panel__content content--no-pad scrollable\">\\n\t<ul class=\"nx-ui-app-select__items mdc-list nx-childviews hide-empty hide-no-matches\" role=\"group\" aria-label=\"Select from items\"></ul>\\n\\n\t<div class=\"empty-results hide-loading hide-no-matches show-empty\">\\n\t\t<div>\\n\t\t\t<p class=\"text\" data-i18n=\"i18n.emptySelectFromList\">i18n.emptySelectFromList</p>\\n\t\t</div>\\n\t</div>\\n\t<div class=\"empty-matches hide-loading hide-empty show-no-matches\">\\n\t\t<div>\\n\t\t\t<p class=\"text\" data-i18n=\"i18n.noMatches\">i18n.noMatches</p>\\n\t\t</div>\\n\t</div>\\n</article>\\n\\n';\n if (!clientSearch) { \n__p+='\\n<footer class=\"footer panel__footer hide-empty pager\" data-nx-pager></footer>\\n';\n } \n__p+='\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/select_fromItem.html -->\\n<label class=\"mdc-list-item__text\" for=\"item-'+\n((__t=( id ))==null?'':_.escape(__t))+\n'\">'+\n((__t=( title ))==null?'':_.escape(__t))+\n'</label>\\n<span class=\"mdc-list-item__meta\">\\n\t<div class=\"mdc-checkbox\">\\n\t\t<input type=\"checkbox\"\\n\t\t\tname=\"item['+\n((__t=( id ))==null?'':_.escape(__t))+\n']\"\\n\t\t\tclass=\"mdc-checkbox__native-control\"\\n\t\t\tid=\"item-'+\n((__t=( id ))==null?'':_.escape(__t))+\n'\"\\n\t\t\tvalue=\"'+\n((__t=( id ))==null?'':_.escape(__t))+\n'\"\\n\t\t\t'+\n((__t=( selected ? 'checked' : '' ))==null?'':_.escape(__t))+\n'>\\n\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t</svg>\\n\t\t\t<div class=\"mdc-checkbox__mixedmark\"></div>\\n\t\t</div>\\n\t</div>\\n</span>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/select_new.html -->\\n<button type=\"button\" class=\"nx-ui-app-select__new__add-item mdc-button\">\\n\t<span class=\"mdc-button__icon\">'+\n((__t=( icons.faPlus ))==null?'':__t)+\n'</span>\\n\t<span class=\"mdc-button__text\">'+\n((__t=( label ))==null?'':_.escape(__t))+\n'...</span>\\n</button>\\n\\n<ul class=\"nx-childviews\" role=\"group\" aria-label=\"New items\"></ul>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/select_newItem.html -->\\n<div class=\"form-group\">\\n\t<input type=\"text\"\\n\t\tname=\"new['+\n((__t=( id ))==null?'':_.escape(__t))+\n']\"\\n\t\tclass=\"item form-control\"\\n\t\tplaceholder=\"'+\n((__t=( label ))==null?'':_.escape(__t))+\n'\"\\n\t\tautocomplete=\"off\"\\n\t\t';\n if (unique) {\n__p+='\\n\t\t\tdata-fv-lookup\\n\t\t\tdata-fv-lookup-completion=\"'+\n((__t=( uniqueKey ))==null?'':_.escape(__t))+\n'\"\\n\t\t\tdata-fv-lookup-message=\"'+\n((__t=( uniqueMessage ))==null?'':_.escape(__t))+\n'\"\\n\t\t';\n } \n__p+='\\n\t\t>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/select_selected.html -->\\n<div class=\"sub-header panel__sub-header flex--column\">\\n\t<div class=\"form-group\" role=\"search\">\\n\t\t<nx-search\\n\t\tclass=\"form-control search filter '+\n((__t=( clientSearch ? 'nx-filter-children' : '' ))==null?'':_.escape(__t))+\n'\"\\n\t\tplaceholder=\"'+\n((__t=( i18n.t('i18n.filter') ))==null?'':_.escape(__t))+\n'\"\\n\t\t'+\n((__t=( clientSearchKey ? 'data-nx-search-key=\"' + clientSearchKey + '\"' : '' ))==null?'':_.escape(__t))+\n'\\n\t\tdata-nx-ignore></nx-search>\\n\t</div>\\n</div>\\n\\n<article class=\"content panel__content content--no-pad scrollable\">\\n\t<div class=\"nx-ui-app-select__items nx-childviews mdc-list hide-empty hide-no-matches\"></div>\\n\t\\n\t<div class=\"empty-results hide-loading hide-no-matches show-empty\">\\n\t\t<div>\\n\t\t\t<p class=\"text\" data-i18n=\"i18n.emptySelectionList\">i18n.emptySelectionList</p>\\n\t\t</div>\\n\t</div>\\n\t<div class=\"empty-matches hide-loading hide-empty show-no-matches\">\\n\t\t<div>\\n\t\t\t<p class=\"text\" data-i18n=\"i18n.noMatches\">i18n.noMatches</p>\\n\t\t</div>\\n\t</div>\\n</article>\\n\\n';\n if (!clientSearch) { \n__p+='\\n<footer class=\"footer panel__footer hide-empty\">\\n\t<div class=\"pager\" data-nx-pager></div>\\n</footer>\\n';\n } \n__p+='\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/select_selectedItem.html -->\\n<span class=\"mdc-list-item__text\" for=\"item-'+\n((__t=( id ))==null?'':_.escape(__t))+\n'\">'+\n((__t=( title ))==null?'':_.escape(__t))+\n'</span>\\n<span class=\"mdc-list-item__meta\">\\n\t<button title=\"'+\n((__t=( i18n.t('i18n.clear') ))==null?'':__t)+\n'\" class=\"nx-ui-app-select__remove-item mdc-icon-button\">\\n\t\t<span class=\"mdc-icon-button__icon\">'+\n((__t=( icons.faTimes ))==null?'':__t)+\n'</span>\\n\t</button>\\n</span>';\n}\nreturn __p;\n};\n","var candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\nvar candidateSelector = candidateSelectors.join(',');\n\nvar matches = typeof Element === 'undefined'\n ? function () {}\n : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\nfunction tabbable(el, options) {\n options = options || {};\n\n var regularTabbables = [];\n var orderedTabbables = [];\n\n var candidates = el.querySelectorAll(candidateSelector);\n\n if (options.includeContainer) {\n if (matches.call(el, candidateSelector)) {\n candidates = Array.prototype.slice.apply(candidates);\n candidates.unshift(el);\n }\n }\n\n var i, candidate, candidateTabindex;\n for (i = 0; i < candidates.length; i++) {\n candidate = candidates[i];\n\n if (!isNodeMatchingSelectorTabbable(candidate)) continue;\n\n candidateTabindex = getTabindex(candidate);\n if (candidateTabindex === 0) {\n regularTabbables.push(candidate);\n } else {\n orderedTabbables.push({\n documentOrder: i,\n tabIndex: candidateTabindex,\n node: candidate,\n });\n }\n }\n\n var tabbableNodes = orderedTabbables\n .sort(sortOrderedTabbables)\n .map(function(a) { return a.node })\n .concat(regularTabbables);\n\n return tabbableNodes;\n}\n\ntabbable.isTabbable = isTabbable;\ntabbable.isFocusable = isFocusable;\n\nfunction isNodeMatchingSelectorTabbable(node) {\n if (\n !isNodeMatchingSelectorFocusable(node)\n || isNonTabbableRadio(node)\n || getTabindex(node) < 0\n ) {\n return false;\n }\n return true;\n}\n\nfunction isTabbable(node) {\n if (!node) throw new Error('No node provided');\n if (matches.call(node, candidateSelector) === false) return false;\n return isNodeMatchingSelectorTabbable(node);\n}\n\nfunction isNodeMatchingSelectorFocusable(node) {\n if (\n node.disabled\n || isHiddenInput(node)\n || isHidden(node)\n ) {\n return false;\n }\n return true;\n}\n\nvar focusableCandidateSelector = candidateSelectors.concat('iframe').join(',');\nfunction isFocusable(node) {\n if (!node) throw new Error('No node provided');\n if (matches.call(node, focusableCandidateSelector) === false) return false;\n return isNodeMatchingSelectorFocusable(node);\n}\n\nfunction getTabindex(node) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return `tabIndex` correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction sortOrderedTabbables(a, b) {\n return a.tabIndex === b.tabIndex ? a.documentOrder - b.documentOrder : a.tabIndex - b.tabIndex;\n}\n\nfunction isContentEditable(node) {\n return node.contentEditable === 'true';\n}\n\nfunction isInput(node) {\n return node.tagName === 'INPUT';\n}\n\nfunction isHiddenInput(node) {\n return isInput(node) && node.type === 'hidden';\n}\n\nfunction isRadio(node) {\n return isInput(node) && node.type === 'radio';\n}\n\nfunction isNonTabbableRadio(node) {\n return isRadio(node) && !isTabbableRadio(node);\n}\n\nfunction getCheckedRadio(nodes) {\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i].checked) {\n return nodes[i];\n }\n }\n}\n\nfunction isTabbableRadio(node) {\n if (!node.name) return true;\n // This won't account for the edge case where you have radio groups with the same\n // in separate forms on the same page.\n var radioSet = node.ownerDocument.querySelectorAll('input[type=\"radio\"][name=\"' + node.name + '\"]');\n var checked = getCheckedRadio(radioSet);\n return !checked || checked === node;\n}\n\nfunction isHidden(node) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return node.offsetParent === null || getComputedStyle(node).visibility === 'hidden';\n}\n\nmodule.exports = tabbable;\n","module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-cart/templates/cartGalleryView.html -->\\n<div class=\"container\">\\n\t<div class=\"flex-row-grid\">\\n\t\t<div class=\"flex-column-grid search-assets-container\">\\n\t\t\t<header class=\"nx-header\" data-nx-control=\"header\"></header>\\n\t\t\t<div id=\"selection-assets\" class=\"flex-item nx-assets\" data-nx-control=\"assets\"></div>\\n\t\t</div>\\n\t</div>\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-cart/templates/cartGalleryHeaderView.html -->\\n<header class=\"nx-header\">\\n\t<div class=\"list-actions-bar flex-row-grid flex-align-center flex-justify-space\">\\n\t\t<div class=\"flex-row-grid flex-align-center\">\\n\t\t\t<span class=\"asset-count nx-count\" data-count=\"0\">0</span>\\n\t\t\t<span class=\"gallery-title\">\\n\t\t\t\t<span class=\"text\">Current selection</span>\\n\t\t\t</span>\\n\t\t\t<button class=\"checkbox inline selectAll nx-action\" data-action=\"cart:empty\">\\n\t\t\t\t<label for=\"folderAddAll-'+\n((__t=( this.cid ))==null?'':__t)+\n'\"><span class=\"text\"> <span class=\"title\" data-i18n=\"i18n.removeAll\">i18n.removeAll</span></span></label>\\n\t\t\t</button>\\n\t\t</div>\\n\t\t<div class=\"controls nx-sort flex-row-grid flex-align-center flex-justify-end\"></div>\\n\t</div>\\n</header>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-cart/templates/savedCartGalleryView.html -->\\n<div class=\"container\">\t\\n\t<header class=\"nx-header\" data-nx-control=\"header\"></header>\\n\t<div class=\"flex-row-grid\">\\n\t\t<div class=\"nx-facets vertical-facets\" data-nx-control=\"facets\"></div>\\n\t\t<div class=\"flex-column-grid search-assets-container\">\\n\t\t\t<div id=\"collection-assets\" class=\"flex-item nx-assets\" data-nx-control=\"assets\"></div>\\n\t\t</div>\\n\t</div>\\n</div>\\n<div class=\"saved-cart-actions actions-bar mobile-only\" data-nx-control=\"saved-cart-bar\"></div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-cart/templates/savedCartActionsBar.html -->\\n<div class=\"action-list dropdown\">\\n\t<a class=\"dropdown-toggle title btn btn-primary primary-background\" data-toggle=\"dropdown\">'+\n((__t=( icons.faBolt ))==null?'':__t)+\n'<span data-i18n=\"asset:i18n.actions\"></span> <b class=\"caret\"></b></a>\\n\t<ul class=\"dropdown-menu pull-right primary-background-mobile nx-action-context\" role=\"menu\" data-action-context=\"savedCartBarActions\"></ul>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-cart/templates/savedCartGalleryHeaderView.html -->\\n<header class=\"nx-header\">\\n\t<div class=\"list-actions-bar flex-row-grid flex-align-center flex-justify-space\">\\n\t\t<div class=\"flex-row-grid flex-align-center\">\\n\t\t\t<button \\n\t\t\t\ttitle=\"'+\n((__t=( i18n.t('i18n.filters') ))==null?'':__t)+\n'\" \\n\t\t\t\tdata-nx-control=\"filters\" \\n\t\t\t\tclass=\"primary-color-hover\"\\n\t\t\t>\\n\t\t\t\t'+\n((__t=( icons.faSlidersH ))==null?'':__t)+\n'\\n\t\t\t</button>\\n\t\t\t<span class=\"gallery-title\">\\n\t\t\t\t<span class=\"separator\">/</span>\\n\t\t\t\t<a href=\"#cart/saved/all\" class=\"text primary-color-hover\" data-i18n=\"i18n.savedCollections\">i18n.savedCollections</a>\\n\t\t\t\t<span class=\"separator\">/</span>\\n\t\t\t\t<span class=\"text nx-title\">"'+\n((__t=( title ))==null?'':__t)+\n'\t"</span>\\n\t\t\t</span>\\n\t\t\t<span \\n\t\t\t\ttitle=\"'+\n((__t=( i18n.t('i18n.nItems') ))==null?'':__t)+\n'\" \\n\t\t\t\tclass=\"asset-count nx-count\" \\n\t\t\t\tdata-count=\"0\"\\n\t\t\t>0</span>\\n\t\t\t<button class=\"checkbox inline selectAll nx-select-all\">\\n\t\t\t\t<label for=\"folderAddAll-'+\n((__t=( this.cid ))==null?'':__t)+\n'\"><span class=\"text\"> <span class=\"title primary-color-hover\" data-i18n=\"i18n.selectAll\">i18n.selectAll</span></span></label>\\n\t\t\t</button>\\n\t\t\t<span class=\"actions desktop-only\">\\n\t\t\t\t<button class=\"action primary-color-hover nx-action\" data-action=\"cart:saved:delete\" data-action-title>'+\n((__t=( icons.faTrashAlt ))==null?'':__t)+\n'</button>\\n\t\t\t\t<button class=\"action primary-color-hover nx-action\" data-action=\"share:cart:saved:download\" data-action-title>'+\n((__t=( icons.faArrowCircleDown ))==null?'':__t)+\n'</button>\\n\t\t\t\t<button class=\"action primary-color-hover nx-action\" data-action=\"cart:rename\" data-action-title>'+\n((__t=( icons.faPencilAlt ))==null?'':__t)+\n'</button>\\n\t\t\t</span>\\n\t\t</div>\\n\t\t<div class=\"controls nx-sort flex-row-grid flex-align-center flex-justify-end\"></div>\\n\t</div>\\n</header>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/downloadOptionsView.html -->\\n<form class=\"form form--modal\" id=\"download-options-view-form\" role=\"form\">\\n\\n\t<div class=\"sub-header sub-header--modal\" role=\"tabpanel\" data-nx-control=\"tabpanel\"></div>\\n\\n\t<article class=\"content content--modal tab-content content--no-pad\" data-nx-control=\"tab-content\"></article>\\n\t\\n\\n\t<footer class=\"footer footer--modal\">\\n\\n\t\t<div class=\"actions double\">\\n\t\t\t<button type=\"button\" class=\"mdc-button cancel nx-cancel btn-default btn\" data-i18n=\"i18n.cancel\">i18n.cancel</button>\\n\t\t\t<button type=\"submit\" class=\"mdc-button mdc-button--unelevated submit nx-save btn-save btn\">'+\n((__t=( submitLabel ))==null?'':__t)+\n'</button>\\n\t\t</div>\\n\t</footer>\\n\\n</form>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/assetOptionsView.html -->\\n';\n if(shareMessage) { \n__p+='\\n\t<article class=\"message message--modal message--share\"><p>'+\n((__t=( shareMessage ))==null?'':__t)+\n'</p></article>\\n';\n } \n__p+='\\n\\n<div class=\"content--modal\">\\n\\n\t<div class=\"flex-column-grid\">\\n\t\t';\n if ( originalOption.length) { \n__p+='\\n\t\t<div class=\"mdc-form-field form-group\">\\n\t\t\t<div class=\"mdc-checkbox mdc-ripple-surface\">\\n\t\t\t\t<input type=\"checkbox\"\\n\t\t\t\t\tname=\"type-original\"\\n\t\t\t\t\tid=\"download-option-type-original-0\"\\n\t\t\t\t\tclass=\"mdc-checkbox__native-control\"\\n\t\t\t\t\tvalue=\"Original\"\\n\t\t\t\t\tdata-nx-control=\"original\"\\n\t\t\t\t\t'+\n((__t=( ( originalSticky || originalOption[0].get('selected') ) ? 'checked' : '' ))==null?'':__t)+\n'\\n\t\t\t\t/>\\n\t\t\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t\t\t</svg>\\n\t\t\t\t</div>\\n\t\t\t</div>\\n\t\t\t<label for=\"download-option-type-original-0\" data-i18n=\"i18n.original\">i18n.original</label>\\n\t\t</div>\\n\t\\n\t\t';\n } \n__p+='\\n\t\t<div class=\"flex-row-grid flex-item-fluid\">\\n\t\t\t';\n _.each( proxyOptions, function( option ) { \n__p+='\\n\t\t\t<div class=\"mdc-form-field form-group\">\\n\t\t\t\t<div class=\"mdc-checkbox mdc-ripple-surface\">\\n\t\t\t\t\t<input type=\"checkbox\"\\n\t\t\t\t\t\tname=\"type-proxy-'+\n((__t=( _.lcfirst( option.get('name') ) ))==null?'':__t)+\n'\"\\n\t\t\t\t\t\tid=\"download-option-type-proxy-'+\n((__t=( _.lcfirst( option.get('name') ) ))==null?'':__t)+\n'\"\\n\t\t\t\t\t\tclass=\"mdc-checkbox__native-control\"\\n\t\t\t\t\t/>\\n\t\t\t\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t\t\t\t</svg>\\n\t\t\t\t\t</div>\\n\t\t\t\t</div>\\n\t\t\t\t<label for=\"download-option-type-proxy-'+\n((__t=( _.lcfirst( option.get('name') ) ))==null?'':__t)+\n'\" data-i18n=\"share:i18n.'+\n((__t=( _.lcfirst( option.get('name') ) ))==null?'':__t)+\n'ProxyName\">'+\n((__t=( option.get('name') ))==null?'':__t)+\n'</label>\\n\t\t\t</div>\\n\\n\t\t\t';\n } ); \n__p+='\\n\t\t</div>\\n\t</div>\\n\t\\n\t<div class=\"flex-row-grid\">\\n\t\t';\n if( viewOptions.length !== 0 ) { \n__p+='\\n\t\t<div id=\"download-option-type-view\" class=\"flex-column-grid flex-item-fluid\">\\n\t\t\t<label tabindex=\"0\" class=\"control-label\" for=\"download-option-type-process-image\" data-i18n=\"i18n.views\">Views</label>\\n\t\t\t';\n _.each(viewOptions, function(option) { \n__p+='\\n\t\t\t\\n\t\t\t<div class=\"mdc-form-field form-group\">\\n\t\t\t\t<div class=\"mdc-checkbox mdc-ripple-surface\">\\n\t\t\t\t\t<input type=\"checkbox\"\\n\t\t\t\t\t\tname=\"type-view-'+\n((__t=( option.get('name') ))==null?'':__t)+\n'-cid'+\n((__t=( option.cid ))==null?'':__t)+\n'\"\\n\t\t\t\t\t\tid=\"download-option-type-view-'+\n((__t=( _.toCamelCase( option.get('name') ) ))==null?'':__t)+\n'-cid'+\n((__t=( option.cid ))==null?'':__t)+\n'\"\\n\t\t\t\t\t\tclass=\"mdc-checkbox__native-control\"\\n\t\t\t\t\t\t'+\n((__t=( option.get('selected') ? 'checked' : '' ))==null?'':__t)+\n'\\n\t\t\t\t\t/>\\n\t\t\t\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t\t\t\t</svg>\\n\t\t\t\t\t</div>\\n\t\t\t\t</div>\\n\t\t\t\t<label for=\"download-option-type-view-'+\n((__t=( _.toCamelCase( option.get('name') ) ))==null?'':__t)+\n'-cid'+\n((__t=( option.cid ))==null?'':__t)+\n'\">'+\n((__t=( option.get('name') ))==null?'':__t)+\n'</label>\\n\t\t\t</div>\\n\\n\t\t\t';\n }); \n__p+='\\n\t\t</div>\\n\t\t';\n } \n__p+='\\n\t\t\\n\t\t';\n if ( processOptions.length !== 0 ) { \n__p+='\\n\t\t<div id=\"download-option-type-process\" class=\"flex-column-grid flex-item-fluid\">\\n\t\t\t<label class=\"control-label\" for=\"download-option-type-process-image\" data-i18n=\"i18n.presets\">i18n.presets</label>\\n\t\t\t';\n _.each(processOptions, function(option) { \n__p+='\\n\t\t\t\t';\n // Unfortunately our presets for come from XML and have no ids \n__p+='\\n\t\t\t\t';\n var identifier = option.get('id') ? option.get('id') : option.get('name'); \n__p+='\\n\t\t\t\t\\n\t\t\t<div class=\"mdc-form-field form-group\">\\n\t\t\t\t<div class=\"mdc-checkbox mdc-ripple-surface\" data-mdc-ripple-is-unbounded>\\n\t\t\t\t\t<input name=\"type-process-'+\n((__t=( identifier ))==null?'':__t)+\n'\" type=\"checkbox\" class=\"mdc-checkbox__native-control\" id=\"download-option-type-process-'+\n((__t=( identifier ))==null?'':__t)+\n'\" '+\n((__t=( option.get('selected') ? 'checked' : '' ))==null?'':__t)+\n' />\\n\t\t\t\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t\t\t\t</svg>\\n\t\t\t\t\t</div>\\n\t\t\t\t</div>\\n\t\t\t\t<label for=\"download-option-type-process-'+\n((__t=( identifier ))==null?'':__t)+\n'\">'+\n((__t=( option.get('name') ))==null?'':__t)+\n'</label>\\n\t\t\t</div>\\n\t\t\t\\n\t\t\t';\n }); \n__p+='\\n\t\t</div>\\n\t\t';\n } \n__p+='\\n\t\t\\n\t</div>\\n\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/createPDFOptionsView.html -->\\n';\n if(shareMessage) { \n__p+='\\n\t<article class=\"message message--modal message--share\"><p>'+\n((__t=( shareMessage ))==null?'':__t)+\n'</p></article>\\n';\n } \n__p+='\\n<div class=\"container-fluid\">\\n\t<div class=\"container-fluid\">\\n\t\t<div class=\"form-group\" data-nx-control=\"toggle-pdf-options\">\\n\t\t\t<span class=\"checkbox\">\\n\t\t\t\t<label class=\"control-label\" for=\"download-option-type-contact-sheet\" data-i18n=\"i18n.includePDF\">i18n.includePDF</label>\\n\t\t\t\t<input id=\"download-option-type-contact-sheet\" class=\"switch\" type=\"checkbox\" name=\"type-contact-sheet\" value=\"contactSheet\" '+\n((__t=( ( isSelected ? 'checked ' : '' ) ))==null?'':__t)+\n'/>\\n\t\t\t\t<label for=\"download-option-type-contact-sheet\"></label>\\n\t\t\t</span>\\n\t\t</div>\\n\\n\t\t<div class=\"'+\n((__t=( ( isSelected ? '' : 'hide' ) ))==null?'':_.escape(__t))+\n'\" data-nx-control=\"pdf-options\">\\n\t\t\t';\n if( !usingDefaultTemplates ) { \n__p+='\\n\t\t\t<div class=\"alert alert-info\">\\n\t\t\t\t<p data-i18n=\"i18n.attributesDefinedByChosenInDesignTemplate\">i18n.attributesDefinedByChosenInDesignTemplate</p>\\n\t\t\t</div>\\n\t\t\t<div data-nx-control=\"templateListView\"></div>\\n\t\t\t';\n } \n__p+='\\n\\n\t\t\t<div class=\"control-group options-selection\">\\n\t\t\t\t<div class=\"form-group required\">\\n\t\t\t\t\t<label for=\"contact-sheet-name\" class=\"control-label\" data-i18n=\"i18n.title\">i18n.title</label>\\n\t\t\t\t\t<input type=\"text\" class=\"form-control\" name=\"contact-sheet-name\" id=\"contact-sheet-name\" value=\"'+\n((__t=( ( contactSheetName.length ? contactSheetName : '' ) ))==null?'':_.escape(__t))+\n'\" />\\n\t\t\t\t</div>\\n\t\t\t</div>\\n\\n\t\t\t';\n if( !usingDefaultTemplates ) { // Indesign \n__p+='\\n\t\t\t<div class=\"form-group\">\\n\t\t\t\t<label class=\"control-label\" data-i18n=\"i18n.PDFExportPreset\" for=\"contact-sheet-export-preset\">i18n.PDFExportPreset</label>\\n\t\t\t\t<select class=\"selectpicker form-control\" name=\"contact-sheet-export-preset\" id=\"contact-sheet-export-preset\">\\n\t\t\t\t\t<option value=\"\" data-i18n=\"i18n.choosePDFExportPreset\">i18n.choosePDFExportPreset</option>\\n\t\t\t\t';\n exportOptions.each( function( opt ) { \n__p+='\\n\t\t\t\t\t<option value=\"'+\n((__t=( opt.get('value') ))==null?'':__t)+\n'\">'+\n((__t=( opt.get('name') ))==null?'':__t)+\n'</option>\\n\t\t\t\t';\n } ); \n__p+='\\n\t\t\t\t</select>\\n\t\t\t</div>\\n\\n\t\t\t';\n } else { \n__p+='\\n\\n\t\t\t<div class=\"control-group text-center rowscols-selection\">\\n\t\t\t\t<div class=\"control\">\\n\t\t\t\t\t<div class=\"text-center rowscols rowscols-1\">\\n\t\t\t\t\t\t<input id=\\'rowscols1\\' type=\"radio\" checked name=\"pdfTemplate\" value=\"1x1\" class=\"hide\" data-nx-control=\"maxLength\" data-nx-value=\"10\"/>\\n\t\t\t\t\t\t<label tabindex=\"0\" for=\"rowscols1\" class=\"row\">\\n\t\t\t\t\t\t\t<div class=\"layout__wrapper\">\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t\t<div>\\n\t\t\t\t\t\t\t\t<span>1 x 1</span>\\n\t\t\t\t\t\t\t\t<span data-i18n=\"i18n.pdfLayoutUpTo10Attrs\">i18n.pdfLayoutUpTo10Attrs</span>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t</label>\\n\t\t\t\t\t</div>\\n\t\t\t\t\t<div class=\"text-center rowscols rowscols-2\">\\n\t\t\t\t\t\t<input id=\\'rowscols2\\' type=\"radio\" name=\"pdfTemplate\" value=\"2x2\" class=\"hide\" data-nx-control=\"maxLength\" data-nx-value=\"5\"/>\\n\t\t\t\t\t\t<label tabindex=\"0\" for=\"rowscols2\" class=\"row\">\\n\t\t\t\t\t\t\t<div class=\"layout__wrapper\">\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t\t<div>\\n\t\t\t\t\t\t\t\t<span>2 x 2</span>\\n\t\t\t\t\t\t\t\t<span data-i18n=\"i18n.pdfLayoutUpTo5Attrs\">i18n.pdfLayoutUpTo5Attrs</span>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t</label>\\n\t\t\t\t\t</div>\\n\t\t\t\t\t<div class=\"text-center rowscols rowscols-3\">\\n\t\t\t\t\t\t<input id=\\'rowscols3\\' type=\"radio\" name=\"pdfTemplate\" value=\"3x3\" class=\"hide\" data-nx-control=\"maxLength\"/>\\n\t\t\t\t\t\t<label tabindex=\"0\" for=\"rowscols3\" class=\"row\">\\n\t\t\t\t\t\t\t<div class=\"layout__wrapper\">\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t\t<div class=\"col\"></div>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t\t<div>\\n\t\t\t\t\t\t\t\t<span>3 x 3</span>\\n\t\t\t\t\t\t\t\t<span data-i18n=\"i18n.pdfLayoutUpTo3Attrs\">i18n.pdfLayoutUpTo3Attrs</span>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t</label>\\n\t\t\t\t\t</div>\\n\t\t\t\t</div>\\n\t\t\t</div>\\n\\n\t\t\t<hr />\\n\t\t\t';\n } \n__p+='\\n\\n\t\t\t<div class=\"nx-metadata-options\">\\n\t\t\t\t<div class=\"nx-setListView\"></div>\\n\t\t\t</div>\\n\\n\t\t\t';\n if( typeof usingDefaultTemplates !== \"undefined\" && usingDefaultTemplates ) { \n__p+='\\n\t\t\t\t<hr />\\n\t\t\t\t<div class=\"flex-column\">\\n\t\t\t\t\t<div class=\"mdc-form-field form-group\">\\n\t\t\t\t\t\t<div class=\"mdc-checkbox mdc-ripple-surface\" data-mdc-ripple-is-unbounded>\\n\t\t\t\t\t\t\t<input\\n\t\t\t\t\t\t\t\tname=\"contact-sheet-display-labels\"\\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\\n\t\t\t\t\t\t\t\tclass=\"mdc-checkbox__native-control\"\\n\t\t\t\t\t\t\t\tid=\"download-option-contact-sheet-display-labels\"\\n\t\t\t\t\t\t\t\tvalue=\"contactSheetDisplayNames\"\\n\t\t\t\t\t\t\t>\\n\t\t\t\t\t\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t\t\t\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t\t\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t\t\t\t\t\t</svg>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t<label for=\"download-option-contact-sheet-display-labels\" data-i18n=\"i18n.displayAttributeNames\">i18n.displayAttributeNames</label>\\n\t\t\t\t\t</div>\\n\t\t\t\t\t<div class=\"mdc-form-field form-group\">\\n\t\t\t\t\t\t<div class=\"mdc-checkbox mdc-ripple-surface\" data-mdc-ripple-is-unbounded>\\n\t\t\t\t\t\t\t<input\\n\t\t\t\t\t\t\t\tname=\"contact-sheet-high-res\"\\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\\n\t\t\t\t\t\t\t\tclass=\"mdc-checkbox__native-control\"\\n\t\t\t\t\t\t\t\tid=\"download-option-contact-sheet-high-res\"\\n\t\t\t\t\t\t\t\tvalue=\"contactSheetHighRes\"\\n\t\t\t\t\t\t\t>\\n\t\t\t\t\t\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t\t\t\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t\t\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t\t\t\t\t\t</svg>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t<label for=\"download-option-contact-sheet-high-res\" data-i18n=\"i18n.highRes\">i18n.highRes</label>\\n\t\t\t\t\t</div>\\n\t\t\t\t\\n\t\t\t\t</div>\\n\t\t\t';\n } \n__p+='\\n\t\t</div>\\n\t</div>\\n</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/createPDFTemplateItemsView.html -->\\n<div class=\"nx-childviews\"></div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/createPDFTemplateItemView.html -->\\n<span class=\"radio inline\">\\n\t<input id=\"'+\n((__t=( uniqueIdentifier ))==null?'':__t)+\n'\" type=\"radio\" name=\"pdfTemplate\" value=\"'+\n((__t=( name ))==null?'':__t)+\n'\" '+\n((__t=( ( maxAttributes ? 'data-nx-control=\"maxLength\" data-nx-value=\"' + maxAttributes + '\"' : '' ) ))==null?'':__t)+\n' '+\n((__t=( ( selected ? 'checked' : '' ) ))==null?'':__t)+\n'>\\n\t<label for=\"'+\n((__t=( uniqueIdentifier ))==null?'':__t)+\n'\">\\n\t\t<img src=\"'+\n((__t=( thumbUrl ))==null?'':__t)+\n'\">\\n\t\t<span class=\"title text\">'+\n((__t=( name ))==null?'':__t)+\n'</span>\\n\t\t<span class=\"text\">'+\n((__t=( description ))==null?'':__t)+\n'</span>\\n\t</label>\\n</span>';\n}\nreturn __p;\n};\n","/**\n* Detect Element Resize Plugin for jQuery\n*\n* https://github.com/sdecima/javascript-detect-element-resize\n* Sebastian Decima\n*\n* version: 0.5.3\n**/\n\n+function( root, factory ) {\n\t// CommonJS\n\tif (typeof exports == \"object\") {\n\t\tmodule.exports = factory( module.exports, require('jquery') );\n\t}\n\t// Browser\n\telse {\n\t\tfactory( this, this.jQuery );\n\t}\n}( this, function ( root, $ ) {\n\t// Already on the $.fn namespace\n\tif( $.fn.resize.overriden ) {\n\t\treturn $.fn.resize;\n\t}\n\t\n\tvar attachEvent = document.attachEvent,\n\t\tstylesCreated = false;\n\t\n\tvar jQuery_resize = $.fn.resize;\n\t\n\t$.fn.resize = function(callback) {\n\t\treturn this.each(function() {\n\t\t\tif(this == window)\n\t\t\t\tjQuery_resize.call(jQuery(this), callback);\n\t\t\telse\n\t\t\t\taddResizeListener(this, callback);\n\t\t});\n\t}\n\n\t$.fn.removeResize = function(callback) {\n\t\treturn this.each(function() {\n\t\t\tremoveResizeListener(this, callback);\n\t\t});\n\t}\n\t\n\tif (!attachEvent) {\n\t\tvar requestFrame = (function(){\n\t\t\tvar raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame ||\n\t\t\t\t\t\t\t\tfunction(fn){ return window.setTimeout(fn, 20); };\n\t\t\treturn function(fn){ return raf(fn); };\n\t\t})();\n\t\t\n\t\tvar cancelFrame = (function(){\n\t\t\tvar cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame ||\n\t\t\t\t\t\t\t\t window.clearTimeout;\n\t\t return function(id){ return cancel(id); };\n\t\t})();\n\n\t\tfunction resetTriggers(element){\n\t\t\tvar triggers = element.__resizeTriggers__,\n\t\t\t\texpand = triggers.firstElementChild,\n\t\t\t\tcontract = triggers.lastElementChild,\n\t\t\t\texpandChild = expand.firstElementChild;\n\t\t\tcontract.scrollLeft = contract.scrollWidth;\n\t\t\tcontract.scrollTop = contract.scrollHeight;\n\t\t\texpandChild.style.width = expand.offsetWidth + 1 + 'px';\n\t\t\texpandChild.style.height = expand.offsetHeight + 1 + 'px';\n\t\t\texpand.scrollLeft = expand.scrollWidth;\n\t\t\texpand.scrollTop = expand.scrollHeight;\n\t\t};\n\n\t\tfunction checkTriggers(element){\n\t\t\treturn element.offsetWidth != element.__resizeLast__.width ||\n\t\t\t\t\t\t element.offsetHeight != element.__resizeLast__.height;\n\t\t}\n\t\t\n\t\tfunction scrollListener(e){\n\t\t\tvar element = this;\n\t\t\tresetTriggers(this);\n\t\t\tif (this.__resizeRAF__) cancelFrame(this.__resizeRAF__);\n\t\t\tthis.__resizeRAF__ = requestFrame(function(){\n\t\t\t\tif (checkTriggers(element)) {\n\t\t\t\t\telement.__resizeLast__.width = element.offsetWidth;\n\t\t\t\t\telement.__resizeLast__.height = element.offsetHeight;\n\t\t\t\t\telement.__resizeListeners__.forEach(function(fn){\n\t\t\t\t\t\tfn.call(element, e);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\t\n\t\t/* Detect CSS Animations support to detect element display/re-attach */\n\t\tvar animation = false,\n\t\t\tanimationstring = 'animation',\n\t\t\tkeyframeprefix = '',\n\t\t\tanimationstartevent = 'animationstart',\n\t\t\tdomPrefixes = 'Webkit Moz O ms'.split(' '),\n\t\t\tstartEvents = 'webkitAnimationStart animationstart oAnimationStart MSAnimationStart'.split(' '),\n\t\t\tpfx = '';\n\t\t{\n\t\t\tvar elm = document.createElement('fakeelement');\n\t\t\tif( elm.style.animationName !== undefined ) { animation = true; } \n\t\t\t\n\t\t\tif( animation === false ) {\n\t\t\t\tfor( var i = 0; i < domPrefixes.length; i++ ) {\n\t\t\t\t\tif( elm.style[ domPrefixes[i] + 'AnimationName' ] !== undefined ) {\n\t\t\t\t\t\tpfx = domPrefixes[ i ];\n\t\t\t\t\t\tanimationstring = pfx + 'Animation';\n\t\t\t\t\t\tkeyframeprefix = '-' + pfx.toLowerCase() + '-';\n\t\t\t\t\t\tanimationstartevent = startEvents[ i ];\n\t\t\t\t\t\tanimation = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar animationName = 'resizeanim';\n\t\tvar animationKeyframes = '@' + keyframeprefix + 'keyframes ' + animationName + ' { from { opacity: 0; } to { opacity: 0; } } ';\n\t\tvar animationStyle = keyframeprefix + 'animation: 1ms ' + animationName + '; ';\n\t}\n\t\n\tfunction createStyles() {\n\t\tif (!stylesCreated) {\n\t\t\t//opacity:0 works around a chrome bug https://code.google.com/p/chromium/issues/detail?id=286360\n\t\t\tvar css = (animationKeyframes ? animationKeyframes : '') +\n\t\t\t\t\t'.resize-triggers { ' + (animationStyle ? animationStyle : '') + 'visibility: hidden; opacity: 0; } ' +\n\t\t\t\t\t'.resize-triggers, .resize-triggers > div, .contract-trigger:before { content: \\\" \\\"; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; } .resize-triggers > div { background: #eee; overflow: auto; } .contract-trigger:before { width: 200%; height: 200%; }',\n\t\t\t\thead = document.head || document.getElementsByTagName('head')[0],\n\t\t\t\tstyle = document.createElement('style');\n\t\t\t\n\t\t\tstyle.type = 'text/css';\n\t\t\tif (style.styleSheet) {\n\t\t\t\tstyle.styleSheet.cssText = css;\n\t\t\t} else {\n\t\t\t\tstyle.appendChild(document.createTextNode(css));\n\t\t\t}\n\n\t\t\thead.appendChild(style);\n\t\t\tstylesCreated = true;\n\t\t}\n\t}\n\t\n\twindow.addResizeListener = function(element, fn){\n\t\tif (attachEvent) element.attachEvent('onresize', fn);\n\t\telse {\n\t\t\tif (!element.__resizeTriggers__) {\n\t\t\t\tif (getComputedStyle(element).position == 'static') element.style.position = 'relative';\n\t\t\t\tcreateStyles();\n\t\t\t\telement.__resizeLast__ = {};\n\t\t\t\telement.__resizeListeners__ = [];\n\t\t\t\t(element.__resizeTriggers__ = document.createElement('div')).className = 'resize-triggers';\n\t\t\t\telement.__resizeTriggers__.innerHTML = '<div class=\"expand-trigger\"><div></div></div>' +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'<div class=\"contract-trigger\"></div>';\n\t\t\t\telement.appendChild(element.__resizeTriggers__);\n\t\t\t\tresetTriggers(element);\n\t\t\t\telement.addEventListener('scroll', scrollListener, true);\n\t\t\t\t\n\t\t\t\t/* Listen for a css animation to detect element display/re-attach */\n\t\t\t\tanimationstartevent && element.__resizeTriggers__.addEventListener(animationstartevent, function(e) {\n\t\t\t\t\tif(e.animationName == animationName)\n\t\t\t\t\t\tresetTriggers(element);\n\t\t\t\t});\n\t\t\t}\n\t\t\telement.__resizeListeners__.push(fn);\n\t\t}\n\t};\n\t\n\twindow.removeResizeListener = function(element, fn){\n\t\tif (attachEvent) element.detachEvent('onresize', fn);\n\t\telse {\n\t\t\telement.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);\n\t\t\tif (!element.__resizeListeners__.length) {\n\t\t\t\ttry {\n\t\t\t\t\telement.removeEventListener('scroll', scrollListener, true);\n\t\t\t\t\telement.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__);\n\t\t\t\t}\n\t\t\t\tcatch( e ) {\n\t\t\t\t\t// If you hit this error then most likely the element was removed from the DOM prior to calling removeResizeListener\n\t\t\t\t\t// And you are probably in IE\n\t\t\t\t\t// console.log( e );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// jQuery already has a $.fn.resize\n\t$.fn.resize.overriden = true;\n\t\n\treturn $.fn.resize;\n} );","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/exportMetadataView.html -->\\n';\n if(shareMessage) { \n__p+='\\n\t<div class=\"message message--modal message--share\"><p>'+\n((__t=( shareMessage ))==null?'':__t)+\n'</p></div>\\n\t';\n } \n__p+='\\n\t<div class=\"content content--modal\">\\n\t\t<div class=\"panel\">\\n\t\t\t<header class=\"header panel__header\">\\n\t\t\t\t<div class=\"form-group nx-toggle-metadata-options flex flex--fill\">\\n\t\t\t\t\t<div class=\"mdc-form-field\">\\n\t\t\t\t\t\t<div class=\"mdc-checkbox mdc-ripple-surface\" data-mdc-ripple-is-unbounded>\\n\t\t\t\t\t\t\t<input\\n\t\t\t\t\t\t\t\tname=\"type-metadata\"\\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\\n\t\t\t\t\t\t\t\tclass=\"mdc-checkbox__native-control nx-download-metadata\"\\n\t\t\t\t\t\t\t\tid=\"download-option-type-metadata\"\\n\t\t\t\t\t\t\t\tvalue=\"contactSheetHighRes\"\\n\t\t\t\t\t\t\t\t'+\n((__t=( (exportSelected) ? 'checked disabled' : '' ))==null?'':__t)+\n'>\\n\t\t\t\t\t\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t\t\t\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t\t\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t\t\t\t\t\t</svg>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t<label for=\"download-option-type-metadata\" data-i18n=\"i18n.exportAttributes\">i18n.exportAttributes</label>\\n\t\t\t\t\t</div>\\n\t\t\t\t</div>\\n\t\t\t</header>\\n\t\t\t<article class=\"content panel__content '+\n((__t=( !(exportSelected) ? 'hide' : '' ))==null?'':_.escape(__t))+\n' nx-metadata-options\">\\n\t\t\t\t<div class=\"nx-setListView\"></div>\\n\t\t\t</article>\\n\t\t</div>\\n\\n\t\t';\n if( embedAvailable ) { \n__p+='\\n\t\t<div class=\"panel\">\\n\t\t\t<header class=\"header panel__header\">\\n\t\t\t\t<div class=\"form-group nx-toggle-embed-metadata flex flex--fill\">\\n\t\t\t\t\t<div class=\"mdc-form-field\">\\n\t\t\t\t\t\t<div class=\"mdc-checkbox mdc-ripple-surface\" data-mdc-ripple-is-unbounded>\\n\t\t\t\t\t\t\t<input\\n\t\t\t\t\t\t\t\tname=\"embed-metadata\"\\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\\n\t\t\t\t\t\t\t\tclass=\"mdc-checkbox__native-control nx-embed-metadata\"\\n\t\t\t\t\t\t\t\tid=\"download-embed-metadata\"\\n\t\t\t\t\t\t\t\tvalue=\"contactSheetHighRes\"\\n\t\t\t\t\t\t\t\t'+\n((__t=( (embedSelected) ? 'checked ' : ''))==null?'':__t)+\n'>\\n\t\t\t\t\t\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t\t\t\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t\t\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t\t\t\t\t\t</svg>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t<label for=\"download-embed-metadata\" data-i18n=\"i18n.embedAttributes\">i18n.embedAttributes</label>\\n\t\t\t\t\t</div>\\n\t\t\t\t</div>\\n\t\t\t</header>\\n\t\t\t<article class=\"content panel__content '+\n((__t=( !(embedSelected) ? 'hide' : '' ))==null?'':_.escape(__t))+\n' nx-embed-options\">\\n\t\t\t\t';\n if( !metadataMaps.length ) { \n__p+='\\n\t\t\t\t<div class=\"empty-results\">\\n\t\t\t\t\t<div>\\n\t\t\t\t\t\t<p class=\"text\" data-i18n=\"i18n.noMetadataMaps\">i18n.noMetadataMaps</p>\\n\t\t\t\t\t</div>\\n\t\t\t\t</div>\\n\t\t\t\t';\n } else { \n__p+='\\n\\n\t\t\t\t<div class=\"flex flex--fill form-group\">\\n\t\t\t\t\t<div class=\"mdc-select\">\\n\t\t\t\t\t\t<select id=\"select-field-embed-metadata-map\" name=\"embed-metadata-map\" class=\"selectpicker form-control\">\\n\t\t\t\t\t\t\t';\n _.each( metadataMaps, function( map ) { \n__p+='\\n\t\t\t\t\t\t\t<option value=\"'+\n((__t=( map.id ))==null?'':_.escape(__t))+\n'\" '+\n((__t=( embedSelected == map.id ? ' selected' : '' ))==null?'':__t)+\n'>'+\n((__t=( map.name ))==null?'':__t)+\n'</option>\\n\t\t\t\t\t\t\t';\n } ); \n__p+='\\n\t\t\t\t\t\t</select>\\n\t\t\t\t\t\t<label class=\"mdc-floating-label\" for=\"select-field-embed-metadata-map\" data-i18n=\"i18n.selectAttributeMapping\">i18n.selectAttributeMapping</label>\\n\t\t\t\t\t\t<div class=\"mdc-line-ripple\"></div>\\n\t\t\t\t\t</div>\\n\t\t\t\t</div>\\n\\n\t\t\t\t';\n } \n__p+='\\n\t\t\t</article>\\n\t\t</div>\\n\t\t';\n } \n__p+='\\n\\n\t\t';\n if( historicalAvailable ) { \n__p+='\\n\t\t<div class=\"panel\">\\n\t\t\t<header class=\"header panel__header\">\\n\t\t\t\t<div class=\"form-group\">\\n\t\t\t\t\t<div class=\"mdc-form-field\">\\n\t\t\t\t\t\t<div class=\"mdc-checkbox mdc-ripple-surface\" data-mdc-ripple-is-unbounded>\\n\t\t\t\t\t\t\t<input\\n\t\t\t\t\t\t\t\tname=\"type-historical\"\\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\\n\t\t\t\t\t\t\t\tclass=\"mdc-checkbox__native-control nx-download-historical\"\\n\t\t\t\t\t\t\t\tid=\"download-option-type-historical\">\\n\t\t\t\t\t\t\t<div class=\"mdc-checkbox__background\">\\n\t\t\t\t\t\t\t\t<svg class=\"mdc-checkbox__checkmark\" viewBox=\"0 0 24 24\">\\n\t\t\t\t\t\t\t\t\t<path class=\"mdc-checkbox__checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\\n\t\t\t\t\t\t\t\t</svg>\\n\t\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t</div>\\n\t\t\t\t\t\t<label for=\"download-option-type-historical\" data-i18n=\"i18n.exportAttributeHistory\">i18n.exportAttributeHistory</label>\\n\t\t\t\t\t</div>\\n\t\t\t\t</div>\\n\t\t\t</header>\\n\t\t</div>\\n\t\t';\n } \n__p+='\\n\t</div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-share/templates/shareStatusView.html -->\\n<div class=\"container\">\\n\t<header><h4 class=\"title\">'+\n((__t=( jobTitle ))==null?'':__t)+\n'</h4></header>\\n\t<div class=\"container-fluid\">\\n\t\t<div class=\"progress progress-striped active\">\\n\t\t\t<div class=\"primary-background progress-bar\" style=\"width: '+\n((__t=( percentComplete ))==null?'':__t)+\n'%;\"></div>\\n\t\t</div>\\n\t\t<p class=\"details\">'+\n((__t=( details ))==null?'':__t)+\n'</p>\\n\t</div>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-app/templates/confirmView-downloadWarnings.html -->\\n<div class=\"container\">\\n\t\\n\t<div class=\"container-fluid\">\\n\t\t<p>'+\n((__t=( message.format( itemLabel ) ))==null?'':__t)+\n'</p>\\n\\n\t\t';\n if (goo.length) { \n__p+='\\n\t\t<div class=\"container\"> <ul class=\"sub-messages\">\\n\t\t\t';\n _.each(goo, function(warning){ \n__p+='\\n\t\t\t<li class=\"sub-message\">\\n\t\t\t\t<span data-nx-object-label>'+\n((__t=( warning.objectLabel ))==null?'':__t)+\n':</span>\\n\t\t\t\t<span data-nx-code-label>\\n\t\t\t\t\t'+\n((__t=( i18n.t('share:downloadWarning' + warning.code, {\n\t\t\t\t\t\twarning: warning,\n\t\t\t\t\t\tdefaultValue: warning.codeLabel\n\t\t\t\t\t}) ))==null?'':__t)+\n'\\n\t\t\t\t</span>\\n\t\t\t</li>\\n\t\t\t';\n }); \n__p+='\\n\t\t</ul> </div>\\n\t\t';\n } \n__p+='\\n\t</div>\\n\\n\\n\t<footer>\\n\t\t<div class=\"actions '+\n((__t=( yesLabel && noLabel ? 'double' : 'single' ))==null?'':__t)+\n'\">\\n\t\t\t';\n if (noLabel) { \n__p+='\\n\t\t\t<button type=\"button\" class=\"btn btn-default cancel nx-cancel\" data-nx-control=\"no\"><span class=\"text\">'+\n((__t=( noLabel ))==null?'':__t)+\n'</span></button>\\n\t\t\t';\n } \n__p+='\\n\t\t\t';\n if (yesLabel) { \n__p+='\\n\t\t\t<button type=\"submit\" class=\"btn btn-primary submit\" data-nx-control=\"yes\"><span class=\"text\">'+\n((__t=( yesLabel ))==null?'':__t)+\n'</span></button>\\n\t\t\t';\n } \n__p+='\\n\t\t</div>\\n\t</footer>\\n\t\\n</div>\\n';\n}\nreturn __p;\n};\n","import React, {useCallback, useState, useEffect} from 'react';\n\nimport {\n\tSwitch as MuiSwitch,\n\tSwitchProps as MuiSwitchProps,\n} from '@mui/material';\nexport * from '@mui/material/Switch/switchClasses';\nexport {default as switchClasses} from '@mui/material/Switch/switchClasses';\nimport {useConfirmation, Options as ConfirmationOptions} from '../Confirmation';\n\nexport interface SwitchProps extends MuiSwitchProps {\n\tconfirm?: Omit<ConfirmationOptions, 'catchOnCancel'>;\n}\n\nexport const Switch = ({confirm, checked, onChange, ...props}: SwitchProps) => {\n\tconst [isChecked, setIsChecked] = useState(checked === true);\n\n\tuseEffect(() => {\n\t\tsetIsChecked(checked === true);\n\t}, [checked]);\n\n\tconst confirmation = useConfirmation();\n\n\tconst handleChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst {checked} = event.target;\n\t\t\tif (!confirm) {\n\t\t\t\tsetIsChecked(checked);\n\t\t\t\tonChange?.(event, checked);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconfirmation(confirm).then(() => {\n\t\t\t\tsetIsChecked(checked);\n\t\t\t\tonChange?.(event, checked);\n\t\t\t});\n\t\t},\n\t\t[confirm, onChange],\n\t);\n\n\treturn <MuiSwitch {...props} checked={isChecked} onChange={handleChange} />;\n};\n\nexport default React.memo(Switch);\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getTransitionProps = getTransitionProps;\nexports.reflow = void 0;\n\nconst reflow = node => node.scrollTop;\n\nexports.reflow = reflow;\n\nfunction getTransitionProps(props, options) {\n var _style$transitionDura, _style$transitionTimi;\n\n const {\n timeout,\n easing,\n style = {}\n } = props;\n return {\n duration: (_style$transitionDura = style.transitionDuration) != null ? _style$transitionDura : typeof timeout === 'number' ? timeout : timeout[options.mode] || 0,\n easing: (_style$transitionTimi = style.transitionTimingFunction) != null ? _style$transitionTimi : typeof easing === 'object' ? easing[options.mode] : easing,\n delay: style.transitionDelay\n };\n}","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :\n typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :\n (global = global || self, factory(global.swipeable = {}, global.react));\n}(this, (function (exports, React) {\n function _interopNamespace(e) {\n if (e && e.__esModule) return e;\n var n = Object.create(null);\n if (e) {\n Object.keys(e).forEach(function (k) {\n if (k !== 'default') {\n var d = Object.getOwnPropertyDescriptor(e, k);\n Object.defineProperty(n, k, d.get ? d : {\n enumerable: true,\n get: function () {\n return e[k];\n }\n });\n }\n });\n }\n n['default'] = e;\n return n;\n }\n\n var React__namespace = /*#__PURE__*/_interopNamespace(React);\n\n function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n }\n\n var LEFT = \"Left\";\n var RIGHT = \"Right\";\n var UP = \"Up\";\n var DOWN = \"Down\";\n\n var defaultProps = {\n delta: 10,\n preventDefaultTouchmoveEvent: false,\n rotationAngle: 0,\n trackMouse: false,\n trackTouch: true\n };\n var initialState = {\n first: true,\n initial: [0, 0],\n start: 0,\n swiping: false,\n xy: [0, 0]\n };\n var mouseMove = \"mousemove\";\n var mouseUp = \"mouseup\";\n var touchEnd = \"touchend\";\n var touchMove = \"touchmove\";\n var touchStart = \"touchstart\";\n\n function getDirection(absX, absY, deltaX, deltaY) {\n if (absX > absY) {\n if (deltaX > 0) {\n return RIGHT;\n }\n\n return LEFT;\n } else if (deltaY > 0) {\n return DOWN;\n }\n\n return UP;\n }\n\n function rotateXYByAngle(pos, angle) {\n if (angle === 0) return pos;\n var angleInRadians = Math.PI / 180 * angle;\n var x = pos[0] * Math.cos(angleInRadians) + pos[1] * Math.sin(angleInRadians);\n var y = pos[1] * Math.cos(angleInRadians) - pos[0] * Math.sin(angleInRadians);\n return [x, y];\n }\n\n function getHandlers(set, handlerProps) {\n var onStart = function onStart(event) {\n if (event && \"touches\" in event && event.touches.length > 1) return;\n set(function (state, props) {\n if (props.trackMouse) {\n document.addEventListener(mouseMove, onMove);\n document.addEventListener(mouseUp, onUp);\n }\n\n var _ref = \"touches\" in event ? event.touches[0] : event,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n\n var xy = rotateXYByAngle([clientX, clientY], props.rotationAngle);\n return _extends({}, state, initialState, {\n initial: [].concat(xy),\n xy: xy,\n start: event.timeStamp || 0\n });\n });\n };\n\n var onMove = function onMove(event) {\n set(function (state, props) {\n if (\"touches\" in event && event.touches.length > 1) {\n return state;\n }\n\n var _ref2 = \"touches\" in event ? event.touches[0] : event,\n clientX = _ref2.clientX,\n clientY = _ref2.clientY;\n\n var _rotateXYByAngle = rotateXYByAngle([clientX, clientY], props.rotationAngle),\n x = _rotateXYByAngle[0],\n y = _rotateXYByAngle[1];\n\n var deltaX = x - state.xy[0];\n var deltaY = y - state.xy[1];\n var absX = Math.abs(deltaX);\n var absY = Math.abs(deltaY);\n var time = (event.timeStamp || 0) - state.start;\n var velocity = Math.sqrt(absX * absX + absY * absY) / (time || 1);\n var vxvy = [deltaX / (time || 1), deltaY / (time || 1)];\n var dir = getDirection(absX, absY, deltaX, deltaY);\n var delta = typeof props.delta === \"number\" ? props.delta : props.delta[dir.toLowerCase()] || defaultProps.delta;\n if (absX < delta && absY < delta && !state.swiping) return state;\n var eventData = {\n absX: absX,\n absY: absY,\n deltaX: deltaX,\n deltaY: deltaY,\n dir: dir,\n event: event,\n first: state.first,\n initial: state.initial,\n velocity: velocity,\n vxvy: vxvy\n };\n eventData.first && props.onSwipeStart && props.onSwipeStart(eventData);\n props.onSwiping && props.onSwiping(eventData);\n var cancelablePageSwipe = false;\n\n if (props.onSwiping || props.onSwiped || \"onSwiped\" + dir in props) {\n cancelablePageSwipe = true;\n }\n\n if (cancelablePageSwipe && props.preventDefaultTouchmoveEvent && props.trackTouch && event.cancelable) event.preventDefault();\n return _extends({}, state, {\n first: false,\n eventData: eventData,\n swiping: true\n });\n });\n };\n\n var onEnd = function onEnd(event) {\n set(function (state, props) {\n var eventData;\n\n if (state.swiping && state.eventData) {\n eventData = _extends({}, state.eventData, {\n event: event\n });\n props.onSwiped && props.onSwiped(eventData);\n var onSwipedDir = props[\"onSwiped\" + eventData.dir];\n onSwipedDir && onSwipedDir(eventData);\n } else {\n props.onTap && props.onTap({\n event: event\n });\n }\n\n return _extends({}, state, initialState, {\n eventData: eventData\n });\n });\n };\n\n var cleanUpMouse = function cleanUpMouse() {\n document.removeEventListener(mouseMove, onMove);\n document.removeEventListener(mouseUp, onUp);\n };\n\n var onUp = function onUp(e) {\n cleanUpMouse();\n onEnd(e);\n };\n\n var attachTouch = function attachTouch(el, passive) {\n var cleanup = function cleanup() {};\n\n if (el && el.addEventListener) {\n var tls = [[touchStart, onStart], [touchMove, onMove], [touchEnd, onEnd]];\n tls.forEach(function (_ref3) {\n var e = _ref3[0],\n h = _ref3[1];\n return el.addEventListener(e, h, {\n passive: passive\n });\n });\n\n cleanup = function cleanup() {\n return tls.forEach(function (_ref4) {\n var e = _ref4[0],\n h = _ref4[1];\n return el.removeEventListener(e, h);\n });\n };\n }\n\n return cleanup;\n };\n\n var onRef = function onRef(el) {\n if (el === null) return;\n set(function (state, props) {\n if (state.el === el) return state;\n var addState = {};\n\n if (state.el && state.el !== el && state.cleanUpTouch) {\n state.cleanUpTouch();\n addState.cleanUpTouch = undefined;\n }\n\n if (props.trackTouch && el) {\n addState.cleanUpTouch = attachTouch(el, !props.preventDefaultTouchmoveEvent);\n }\n\n return _extends({}, state, {\n el: el\n }, addState);\n });\n };\n\n var output = {\n ref: onRef\n };\n\n if (handlerProps.trackMouse) {\n output.onMouseDown = onStart;\n }\n\n return [output, attachTouch];\n }\n\n function updateTransientState(state, props, attachTouch) {\n var addState = {};\n\n if (!props.trackTouch && state.cleanUpTouch) {\n state.cleanUpTouch();\n addState.cleanUpTouch = undefined;\n } else if (props.trackTouch && !state.cleanUpTouch) {\n if (state.el) {\n addState.cleanUpTouch = attachTouch(state.el, !props.preventDefaultTouchmoveEvent);\n }\n }\n\n return _extends({}, state, addState);\n }\n\n function useSwipeable(options) {\n var trackMouse = options.trackMouse;\n var transientState = React__namespace.useRef(_extends({}, initialState));\n var transientProps = React__namespace.useRef(_extends({}, defaultProps));\n transientProps.current = _extends({}, defaultProps, options);\n\n var _React$useMemo = React__namespace.useMemo(function () {\n return getHandlers(function (stateSetter) {\n return transientState.current = stateSetter(transientState.current, transientProps.current);\n }, {\n trackMouse: trackMouse\n });\n }, [trackMouse]),\n handlers = _React$useMemo[0],\n attachTouch = _React$useMemo[1];\n\n transientState.current = updateTransientState(transientState.current, transientProps.current, attachTouch);\n return handlers;\n }\n\n exports.DOWN = DOWN;\n exports.LEFT = LEFT;\n exports.RIGHT = RIGHT;\n exports.UP = UP;\n exports.useSwipeable = useSwipeable;\n\n})));\n//# sourceMappingURL=react-swipeable.umd.js.map\n","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _SwipeableViews.default;\n }\n});\nObject.defineProperty(exports, \"SwipeableViewsContext\", {\n enumerable: true,\n get: function get() {\n return _SwipeableViews.SwipeableViewsContext;\n }\n});\n\nvar _SwipeableViews = _interopRequireWildcard(require(\"./SwipeableViews\"));","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getDomTreeShapes = getDomTreeShapes;\nexports.findNativeHandler = findNativeHandler;\nexports.default = exports.SwipeableViewsContext = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _reactSwipeableViewsCore = require(\"react-swipeable-views-core\");\n\nfunction addEventListener(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return {\n remove: function remove() {\n node.removeEventListener(event, handler, options);\n }\n };\n}\n\nvar styles = {\n container: {\n direction: 'ltr',\n display: 'flex',\n willChange: 'transform'\n },\n slide: {\n width: '100%',\n WebkitFlexShrink: 0,\n flexShrink: 0,\n overflow: 'auto'\n }\n};\nvar axisProperties = {\n root: {\n x: {\n overflowX: 'hidden'\n },\n 'x-reverse': {\n overflowX: 'hidden'\n },\n y: {\n overflowY: 'hidden'\n },\n 'y-reverse': {\n overflowY: 'hidden'\n }\n },\n flexDirection: {\n x: 'row',\n 'x-reverse': 'row-reverse',\n y: 'column',\n 'y-reverse': 'column-reverse'\n },\n transform: {\n x: function x(translate) {\n return \"translate(\".concat(-translate, \"%, 0)\");\n },\n 'x-reverse': function xReverse(translate) {\n return \"translate(\".concat(translate, \"%, 0)\");\n },\n y: function y(translate) {\n return \"translate(0, \".concat(-translate, \"%)\");\n },\n 'y-reverse': function yReverse(translate) {\n return \"translate(0, \".concat(translate, \"%)\");\n }\n },\n length: {\n x: 'width',\n 'x-reverse': 'width',\n y: 'height',\n 'y-reverse': 'height'\n },\n rotationMatrix: {\n x: {\n x: [1, 0],\n y: [0, 1]\n },\n 'x-reverse': {\n x: [-1, 0],\n y: [0, 1]\n },\n y: {\n x: [0, 1],\n y: [1, 0]\n },\n 'y-reverse': {\n x: [0, -1],\n y: [1, 0]\n }\n },\n scrollPosition: {\n x: 'scrollLeft',\n 'x-reverse': 'scrollLeft',\n y: 'scrollTop',\n 'y-reverse': 'scrollTop'\n },\n scrollLength: {\n x: 'scrollWidth',\n 'x-reverse': 'scrollWidth',\n y: 'scrollHeight',\n 'y-reverse': 'scrollHeight'\n },\n clientLength: {\n x: 'clientWidth',\n 'x-reverse': 'clientWidth',\n y: 'clientHeight',\n 'y-reverse': 'clientHeight'\n }\n};\n\nfunction createTransition(property, options) {\n var duration = options.duration,\n easeFunction = options.easeFunction,\n delay = options.delay;\n return \"\".concat(property, \" \").concat(duration, \" \").concat(easeFunction, \" \").concat(delay);\n} // We are using a 2x2 rotation matrix.\n\n\nfunction applyRotationMatrix(touch, axis) {\n var rotationMatrix = axisProperties.rotationMatrix[axis];\n return {\n pageX: rotationMatrix.x[0] * touch.pageX + rotationMatrix.x[1] * touch.pageY,\n pageY: rotationMatrix.y[0] * touch.pageX + rotationMatrix.y[1] * touch.pageY\n };\n}\n\nfunction adaptMouse(event) {\n event.touches = [{\n pageX: event.pageX,\n pageY: event.pageY\n }];\n return event;\n}\n\nfunction getDomTreeShapes(element, rootNode) {\n var domTreeShapes = [];\n\n while (element && element !== rootNode && element !== document.body) {\n // We reach a Swipeable View, no need to look higher in the dom tree.\n if (element.hasAttribute('data-swipeable')) {\n break;\n }\n\n var style = window.getComputedStyle(element);\n\n if ( // Ignore the scroll children if the element is absolute positioned.\n style.getPropertyValue('position') === 'absolute' || // Ignore the scroll children if the element has an overflowX hidden\n style.getPropertyValue('overflow-x') === 'hidden') {\n domTreeShapes = [];\n } else if (element.clientWidth > 0 && element.scrollWidth > element.clientWidth || element.clientHeight > 0 && element.scrollHeight > element.clientHeight) {\n // Ignore the nodes that have no width.\n // Keep elements with a scroll\n domTreeShapes.push({\n element: element,\n scrollWidth: element.scrollWidth,\n scrollHeight: element.scrollHeight,\n clientWidth: element.clientWidth,\n clientHeight: element.clientHeight,\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n });\n }\n\n element = element.parentNode;\n }\n\n return domTreeShapes;\n} // We can only have one node at the time claiming ownership for handling the swipe.\n// Otherwise, the UX would be confusing.\n// That's why we use a singleton here.\n\n\nvar nodeWhoClaimedTheScroll = null;\n\nfunction findNativeHandler(params) {\n var domTreeShapes = params.domTreeShapes,\n pageX = params.pageX,\n startX = params.startX,\n axis = params.axis;\n return domTreeShapes.some(function (shape) {\n // Determine if we are going backward or forward.\n var goingForward = pageX >= startX;\n\n if (axis === 'x' || axis === 'y') {\n goingForward = !goingForward;\n } // scrollTop is not always be an integer.\n // https://github.com/jquery/api.jquery.com/issues/608\n\n\n var scrollPosition = Math.round(shape[axisProperties.scrollPosition[axis]]);\n var areNotAtStart = scrollPosition > 0;\n var areNotAtEnd = scrollPosition + shape[axisProperties.clientLength[axis]] < shape[axisProperties.scrollLength[axis]];\n\n if (goingForward && areNotAtEnd || !goingForward && areNotAtStart) {\n nodeWhoClaimedTheScroll = shape.element;\n return true;\n }\n\n return false;\n });\n}\n\nvar SwipeableViewsContext = React.createContext();\nexports.SwipeableViewsContext = SwipeableViewsContext;\n\nif (process.env.NODE_ENV !== 'production') {\n SwipeableViewsContext.displayName = 'SwipeableViewsContext';\n}\n\nvar SwipeableViews =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(SwipeableViews, _React$Component);\n\n function SwipeableViews(props) {\n var _this;\n\n (0, _classCallCheck2.default)(this, SwipeableViews);\n _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(SwipeableViews).call(this, props));\n _this.rootNode = null;\n _this.containerNode = null;\n _this.ignoreNextScrollEvents = false;\n _this.viewLength = 0;\n _this.startX = 0;\n _this.lastX = 0;\n _this.vx = 0;\n _this.startY = 0;\n _this.isSwiping = undefined;\n _this.started = false;\n _this.startIndex = 0;\n _this.transitionListener = null;\n _this.touchMoveListener = null;\n _this.activeSlide = null;\n _this.indexCurrent = null;\n _this.firstRenderTimeout = null;\n\n _this.setRootNode = function (node) {\n _this.rootNode = node;\n };\n\n _this.setContainerNode = function (node) {\n _this.containerNode = node;\n };\n\n _this.setActiveSlide = function (node) {\n _this.activeSlide = node;\n\n _this.updateHeight();\n };\n\n _this.handleSwipeStart = function (event) {\n var axis = _this.props.axis;\n var touch = applyRotationMatrix(event.touches[0], axis);\n _this.viewLength = _this.rootNode.getBoundingClientRect()[axisProperties.length[axis]];\n _this.startX = touch.pageX;\n _this.lastX = touch.pageX;\n _this.vx = 0;\n _this.startY = touch.pageY;\n _this.isSwiping = undefined;\n _this.started = true;\n var computedStyle = window.getComputedStyle(_this.containerNode);\n var transform = computedStyle.getPropertyValue('-webkit-transform') || computedStyle.getPropertyValue('transform');\n\n if (transform && transform !== 'none') {\n var transformValues = transform.split('(')[1].split(')')[0].split(',');\n var rootStyle = window.getComputedStyle(_this.rootNode);\n var tranformNormalized = applyRotationMatrix({\n pageX: parseInt(transformValues[4], 10),\n pageY: parseInt(transformValues[5], 10)\n }, axis);\n _this.startIndex = -tranformNormalized.pageX / (_this.viewLength - parseInt(rootStyle.paddingLeft, 10) - parseInt(rootStyle.paddingRight, 10)) || 0;\n }\n };\n\n _this.handleSwipeMove = function (event) {\n // The touch start event can be cancel.\n // Makes sure we set a starting point.\n if (!_this.started) {\n _this.handleTouchStart(event);\n\n return;\n } // We are not supposed to hanlde this touch move.\n\n\n if (nodeWhoClaimedTheScroll !== null && nodeWhoClaimedTheScroll !== _this.rootNode) {\n return;\n }\n\n var _this$props = _this.props,\n axis = _this$props.axis,\n children = _this$props.children,\n ignoreNativeScroll = _this$props.ignoreNativeScroll,\n onSwitching = _this$props.onSwitching,\n resistance = _this$props.resistance;\n var touch = applyRotationMatrix(event.touches[0], axis); // We don't know yet.\n\n if (_this.isSwiping === undefined) {\n var dx = Math.abs(touch.pageX - _this.startX);\n var dy = Math.abs(touch.pageY - _this.startY);\n var isSwiping = dx > dy && dx > _reactSwipeableViewsCore.constant.UNCERTAINTY_THRESHOLD; // We let the parent handle the scroll.\n\n if (!resistance && (axis === 'y' || axis === 'y-reverse') && (_this.indexCurrent === 0 && _this.startX < touch.pageX || _this.indexCurrent === React.Children.count(_this.props.children) - 1 && _this.startX > touch.pageX)) {\n _this.isSwiping = false;\n return;\n } // We are likely to be swiping, let's prevent the scroll event.\n\n\n if (dx > dy) {\n event.preventDefault();\n }\n\n if (isSwiping === true || dy > _reactSwipeableViewsCore.constant.UNCERTAINTY_THRESHOLD) {\n _this.isSwiping = isSwiping;\n _this.startX = touch.pageX; // Shift the starting point.\n\n return; // Let's wait the next touch event to move something.\n }\n }\n\n if (_this.isSwiping !== true) {\n return;\n } // We are swiping, let's prevent the scroll event.\n\n\n event.preventDefault(); // Low Pass filter.\n\n _this.vx = _this.vx * 0.5 + (touch.pageX - _this.lastX) * 0.5;\n _this.lastX = touch.pageX;\n\n var _computeIndex = (0, _reactSwipeableViewsCore.computeIndex)({\n children: children,\n resistance: resistance,\n pageX: touch.pageX,\n startIndex: _this.startIndex,\n startX: _this.startX,\n viewLength: _this.viewLength\n }),\n index = _computeIndex.index,\n startX = _computeIndex.startX; // Add support for native scroll elements.\n\n\n if (nodeWhoClaimedTheScroll === null && !ignoreNativeScroll) {\n var domTreeShapes = getDomTreeShapes(event.target, _this.rootNode);\n var hasFoundNativeHandler = findNativeHandler({\n domTreeShapes: domTreeShapes,\n startX: _this.startX,\n pageX: touch.pageX,\n axis: axis\n }); // We abort the touch move handler.\n\n if (hasFoundNativeHandler) {\n return;\n }\n } // We are moving toward the edges.\n\n\n if (startX) {\n _this.startX = startX;\n } else if (nodeWhoClaimedTheScroll === null) {\n nodeWhoClaimedTheScroll = _this.rootNode;\n }\n\n _this.setIndexCurrent(index);\n\n var callback = function callback() {\n if (onSwitching) {\n onSwitching(index, 'move');\n }\n };\n\n if (_this.state.displaySameSlide || !_this.state.isDragging) {\n _this.setState({\n displaySameSlide: false,\n isDragging: true\n }, callback);\n }\n\n callback();\n };\n\n _this.handleSwipeEnd = function () {\n nodeWhoClaimedTheScroll = null; // The touch start event can be cancel.\n // Makes sure that a starting point is set.\n\n if (!_this.started) {\n return;\n }\n\n _this.started = false;\n\n if (_this.isSwiping !== true) {\n return;\n }\n\n var indexLatest = _this.state.indexLatest;\n var indexCurrent = _this.indexCurrent;\n var delta = indexLatest - indexCurrent;\n var indexNew; // Quick movement\n\n if (Math.abs(_this.vx) > _this.props.threshold) {\n if (_this.vx > 0) {\n indexNew = Math.floor(indexCurrent);\n } else {\n indexNew = Math.ceil(indexCurrent);\n }\n } else if (Math.abs(delta) > _this.props.hysteresis) {\n // Some hysteresis with indexLatest.\n indexNew = delta > 0 ? Math.floor(indexCurrent) : Math.ceil(indexCurrent);\n } else {\n indexNew = indexLatest;\n }\n\n var indexMax = React.Children.count(_this.props.children) - 1;\n\n if (indexNew < 0) {\n indexNew = 0;\n } else if (indexNew > indexMax) {\n indexNew = indexMax;\n }\n\n _this.setIndexCurrent(indexNew);\n\n _this.setState({\n indexLatest: indexNew,\n isDragging: false\n }, function () {\n if (_this.props.onSwitching) {\n _this.props.onSwitching(indexNew, 'end');\n }\n\n if (_this.props.onChangeIndex && indexNew !== indexLatest) {\n _this.props.onChangeIndex(indexNew, indexLatest, {\n reason: 'swipe'\n });\n } // Manually calling handleTransitionEnd in that case as isn't otherwise.\n\n\n if (indexCurrent === indexLatest) {\n _this.handleTransitionEnd();\n }\n });\n };\n\n _this.handleTouchStart = function (event) {\n if (_this.props.onTouchStart) {\n _this.props.onTouchStart(event);\n }\n\n _this.handleSwipeStart(event);\n };\n\n _this.handleTouchEnd = function (event) {\n if (_this.props.onTouchEnd) {\n _this.props.onTouchEnd(event);\n }\n\n _this.handleSwipeEnd(event);\n };\n\n _this.handleMouseDown = function (event) {\n if (_this.props.onMouseDown) {\n _this.props.onMouseDown(event);\n }\n\n event.persist();\n\n _this.handleSwipeStart(adaptMouse(event));\n };\n\n _this.handleMouseUp = function (event) {\n if (_this.props.onMouseUp) {\n _this.props.onMouseUp(event);\n }\n\n _this.handleSwipeEnd(adaptMouse(event));\n };\n\n _this.handleMouseLeave = function (event) {\n if (_this.props.onMouseLeave) {\n _this.props.onMouseLeave(event);\n } // Filter out events\n\n\n if (_this.started) {\n _this.handleSwipeEnd(adaptMouse(event));\n }\n };\n\n _this.handleMouseMove = function (event) {\n if (_this.props.onMouseMove) {\n _this.props.onMouseMove(event);\n } // Filter out events\n\n\n if (_this.started) {\n _this.handleSwipeMove(adaptMouse(event));\n }\n };\n\n _this.handleScroll = function (event) {\n if (_this.props.onScroll) {\n _this.props.onScroll(event);\n } // Ignore events bubbling up.\n\n\n if (event.target !== _this.rootNode) {\n return;\n }\n\n if (_this.ignoreNextScrollEvents) {\n _this.ignoreNextScrollEvents = false;\n return;\n }\n\n var indexLatest = _this.state.indexLatest;\n var indexNew = Math.ceil(event.target.scrollLeft / event.target.clientWidth) + indexLatest;\n _this.ignoreNextScrollEvents = true; // Reset the scroll position.\n\n event.target.scrollLeft = 0;\n\n if (_this.props.onChangeIndex && indexNew !== indexLatest) {\n _this.props.onChangeIndex(indexNew, indexLatest, {\n reason: 'focus'\n });\n }\n };\n\n _this.updateHeight = function () {\n if (_this.activeSlide !== null) {\n var child = _this.activeSlide.children[0];\n\n if (child !== undefined && child.offsetHeight !== undefined && _this.state.heightLatest !== child.offsetHeight) {\n _this.setState({\n heightLatest: child.offsetHeight\n });\n }\n }\n };\n\n if (process.env.NODE_ENV !== 'production') {\n (0, _reactSwipeableViewsCore.checkIndexBounds)(props);\n }\n\n _this.state = {\n indexLatest: props.index,\n // Set to true as soon as the component is swiping.\n // It's the state counter part of this.isSwiping.\n isDragging: false,\n // Help with SSR logic and lazy loading logic.\n renderOnlyActive: !props.disableLazyLoading,\n heightLatest: 0,\n // Let the render method that we are going to display the same slide than previously.\n displaySameSlide: true\n };\n\n _this.setIndexCurrent(props.index);\n\n return _this;\n }\n\n (0, _createClass2.default)(SwipeableViews, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n // Subscribe to transition end events.\n this.transitionListener = addEventListener(this.containerNode, 'transitionend', function (event) {\n if (event.target !== _this2.containerNode) {\n return;\n }\n\n _this2.handleTransitionEnd();\n }); // Block the thread to handle that event.\n\n this.touchMoveListener = addEventListener(this.rootNode, 'touchmove', function (event) {\n // Handling touch events is disabled.\n if (_this2.props.disabled) {\n return;\n }\n\n _this2.handleSwipeMove(event);\n }, {\n passive: false\n });\n\n if (!this.props.disableLazyLoading) {\n this.firstRenderTimeout = setTimeout(function () {\n _this2.setState({\n renderOnlyActive: false\n });\n }, 0);\n } // Send all functions in an object if action param is set.\n\n\n if (this.props.action) {\n this.props.action({\n updateHeight: this.updateHeight\n });\n }\n } // eslint-disable-next-line camelcase,react/sort-comp\n\n }, {\n key: \"UNSAFE_componentWillReceiveProps\",\n value: function UNSAFE_componentWillReceiveProps(nextProps) {\n var index = nextProps.index;\n\n if (typeof index === 'number' && index !== this.props.index) {\n if (process.env.NODE_ENV !== 'production') {\n (0, _reactSwipeableViewsCore.checkIndexBounds)(nextProps);\n }\n\n this.setIndexCurrent(index);\n this.setState({\n // If true, we are going to change the children. We shoudn't animate it.\n displaySameSlide: (0, _reactSwipeableViewsCore.getDisplaySameSlide)(this.props, nextProps),\n indexLatest: index\n });\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.transitionListener.remove();\n this.touchMoveListener.remove();\n clearTimeout(this.firstRenderTimeout);\n }\n }, {\n key: \"getSwipeableViewsContext\",\n value: function getSwipeableViewsContext() {\n var _this3 = this;\n\n return {\n slideUpdateHeight: function slideUpdateHeight() {\n _this3.updateHeight();\n }\n };\n }\n }, {\n key: \"setIndexCurrent\",\n value: function setIndexCurrent(indexCurrent) {\n if (!this.props.animateTransitions && this.indexCurrent !== indexCurrent) {\n this.handleTransitionEnd();\n }\n\n this.indexCurrent = indexCurrent;\n\n if (this.containerNode) {\n var axis = this.props.axis;\n var transform = axisProperties.transform[axis](indexCurrent * 100);\n this.containerNode.style.WebkitTransform = transform;\n this.containerNode.style.transform = transform;\n }\n }\n }, {\n key: \"handleTransitionEnd\",\n value: function handleTransitionEnd() {\n if (!this.props.onTransitionEnd) {\n return;\n } // Filters out when changing the children\n\n\n if (this.state.displaySameSlide) {\n return;\n } // The rest callback is triggered when swiping. It's just noise.\n // We filter it out.\n\n\n if (!this.state.isDragging) {\n this.props.onTransitionEnd();\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this4 = this;\n\n var _this$props2 = this.props,\n action = _this$props2.action,\n animateHeight = _this$props2.animateHeight,\n animateTransitions = _this$props2.animateTransitions,\n axis = _this$props2.axis,\n children = _this$props2.children,\n containerStyleProp = _this$props2.containerStyle,\n disabled = _this$props2.disabled,\n disableLazyLoading = _this$props2.disableLazyLoading,\n enableMouseEvents = _this$props2.enableMouseEvents,\n hysteresis = _this$props2.hysteresis,\n ignoreNativeScroll = _this$props2.ignoreNativeScroll,\n index = _this$props2.index,\n onChangeIndex = _this$props2.onChangeIndex,\n onSwitching = _this$props2.onSwitching,\n onTransitionEnd = _this$props2.onTransitionEnd,\n resistance = _this$props2.resistance,\n slideStyleProp = _this$props2.slideStyle,\n slideClassName = _this$props2.slideClassName,\n springConfig = _this$props2.springConfig,\n style = _this$props2.style,\n threshold = _this$props2.threshold,\n other = (0, _objectWithoutProperties2.default)(_this$props2, [\"action\", \"animateHeight\", \"animateTransitions\", \"axis\", \"children\", \"containerStyle\", \"disabled\", \"disableLazyLoading\", \"enableMouseEvents\", \"hysteresis\", \"ignoreNativeScroll\", \"index\", \"onChangeIndex\", \"onSwitching\", \"onTransitionEnd\", \"resistance\", \"slideStyle\", \"slideClassName\", \"springConfig\", \"style\", \"threshold\"]);\n var _this$state = this.state,\n displaySameSlide = _this$state.displaySameSlide,\n heightLatest = _this$state.heightLatest,\n indexLatest = _this$state.indexLatest,\n isDragging = _this$state.isDragging,\n renderOnlyActive = _this$state.renderOnlyActive;\n var touchEvents = !disabled ? {\n onTouchStart: this.handleTouchStart,\n onTouchEnd: this.handleTouchEnd\n } : {};\n var mouseEvents = !disabled && enableMouseEvents ? {\n onMouseDown: this.handleMouseDown,\n onMouseUp: this.handleMouseUp,\n onMouseLeave: this.handleMouseLeave,\n onMouseMove: this.handleMouseMove\n } : {}; // There is no point to animate if we are already providing a height.\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(!animateHeight || !containerStyleProp || !containerStyleProp.height, \"react-swipeable-view: You are setting animateHeight to true but you are\\nalso providing a custom height.\\nThe custom height has a higher priority than the animateHeight property.\\nSo animateHeight is most likely having no effect at all.\") : void 0;\n var slideStyle = (0, _extends2.default)({}, styles.slide, slideStyleProp);\n var transition;\n var WebkitTransition;\n\n if (isDragging || !animateTransitions || displaySameSlide) {\n transition = 'all 0s ease 0s';\n WebkitTransition = 'all 0s ease 0s';\n } else {\n transition = createTransition('transform', springConfig);\n WebkitTransition = createTransition('-webkit-transform', springConfig);\n\n if (heightLatest !== 0) {\n var additionalTranstion = \", \".concat(createTransition('height', springConfig));\n transition += additionalTranstion;\n WebkitTransition += additionalTranstion;\n }\n }\n\n var containerStyle = {\n height: null,\n WebkitFlexDirection: axisProperties.flexDirection[axis],\n flexDirection: axisProperties.flexDirection[axis],\n WebkitTransition: WebkitTransition,\n transition: transition\n }; // Apply the styles for SSR considerations\n\n if (!renderOnlyActive) {\n var transform = axisProperties.transform[axis](this.indexCurrent * 100);\n containerStyle.WebkitTransform = transform;\n containerStyle.transform = transform;\n }\n\n if (animateHeight) {\n containerStyle.height = heightLatest;\n }\n\n return React.createElement(SwipeableViewsContext.Provider, {\n value: this.getSwipeableViewsContext()\n }, React.createElement(\"div\", (0, _extends2.default)({\n ref: this.setRootNode,\n style: (0, _extends2.default)({}, axisProperties.root[axis], style)\n }, other, touchEvents, mouseEvents, {\n onScroll: this.handleScroll\n }), React.createElement(\"div\", {\n ref: this.setContainerNode,\n style: (0, _extends2.default)({}, containerStyle, styles.container, containerStyleProp),\n className: \"react-swipeable-view-container\"\n }, React.Children.map(children, function (child, indexChild) {\n if (renderOnlyActive && indexChild !== indexLatest) {\n return null;\n }\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(React.isValidElement(child), \"react-swipeable-view: one of the children provided is invalid: \".concat(child, \".\\n We are expecting a valid React Element\")) : void 0;\n var ref;\n var hidden = true;\n\n if (indexChild === indexLatest) {\n hidden = false;\n\n if (animateHeight) {\n ref = _this4.setActiveSlide;\n slideStyle.overflowY = 'hidden';\n }\n }\n\n return React.createElement(\"div\", {\n ref: ref,\n style: slideStyle,\n className: slideClassName,\n \"aria-hidden\": hidden,\n \"data-swipeable\": \"true\"\n }, child);\n }))));\n }\n }]);\n return SwipeableViews;\n}(React.Component); // Added as an ads for people using the React dev tools in production.\n// So they know, the tool used to build the awesome UI they\n// are looking at/retro engineering.\n\n\nSwipeableViews.displayName = 'ReactSwipableView';\nSwipeableViews.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * This is callback property. It's called by the component on mount.\n * This is useful when you want to trigger an action programmatically.\n * It currently only supports updateHeight() action.\n *\n * @param {object} actions This object contains all posible actions\n * that can be triggered programmatically.\n */\n action: _propTypes.default.func,\n\n /**\n * If `true`, the height of the container will be animated to match the current slide height.\n * Animating another style property has a negative impact regarding performance.\n */\n animateHeight: _propTypes.default.bool,\n\n /**\n * If `false`, changes to the index prop will not cause an animated transition.\n */\n animateTransitions: _propTypes.default.bool,\n\n /**\n * The axis on which the slides will slide.\n */\n axis: _propTypes.default.oneOf(['x', 'x-reverse', 'y', 'y-reverse']),\n\n /**\n * Use this property to provide your slides.\n */\n children: _propTypes.default.node.isRequired,\n\n /**\n * This is the inlined style that will be applied\n * to each slide container.\n */\n containerStyle: _propTypes.default.object,\n\n /**\n * If `true`, it will disable touch events.\n * This is useful when you want to prohibit the user from changing slides.\n */\n disabled: _propTypes.default.bool,\n\n /**\n * This is the config used to disable lazyloding,\n * if `true` will render all the views in first rendering.\n */\n disableLazyLoading: _propTypes.default.bool,\n\n /**\n * If `true`, it will enable mouse events.\n * This will allow the user to perform the relevant swipe actions with a mouse.\n */\n enableMouseEvents: _propTypes.default.bool,\n\n /**\n * Configure hysteresis between slides. This value determines how far\n * should user swipe to switch slide.\n */\n hysteresis: _propTypes.default.number,\n\n /**\n * If `true`, it will ignore native scroll container.\n * It can be used to filter out false positive that blocks the swipe.\n */\n ignoreNativeScroll: _propTypes.default.bool,\n\n /**\n * This is the index of the slide to show.\n * This is useful when you want to change the default slide shown.\n * Or when you have tabs linked to each slide.\n */\n index: _propTypes.default.number,\n\n /**\n * This is callback prop. It's call by the\n * component when the shown slide change after a swipe made by the user.\n * This is useful when you have tabs linked to each slide.\n *\n * @param {integer} index This is the current index of the slide.\n * @param {integer} indexLatest This is the oldest index of the slide.\n * @param {object} meta Meta data containing more information about the event.\n */\n onChangeIndex: _propTypes.default.func,\n\n /**\n * @ignore\n */\n onMouseDown: _propTypes.default.func,\n\n /**\n * @ignore\n */\n onMouseLeave: _propTypes.default.func,\n\n /**\n * @ignore\n */\n onMouseMove: _propTypes.default.func,\n\n /**\n * @ignore\n */\n onMouseUp: _propTypes.default.func,\n\n /**\n * @ignore\n */\n onScroll: _propTypes.default.func,\n\n /**\n * This is callback prop. It's called by the\n * component when the slide switching.\n * This is useful when you want to implement something corresponding\n * to the current slide position.\n *\n * @param {integer} index This is the current index of the slide.\n * @param {string} type Can be either `move` or `end`.\n */\n onSwitching: _propTypes.default.func,\n\n /**\n * @ignore\n */\n onTouchEnd: _propTypes.default.func,\n\n /**\n * @ignore\n */\n onTouchMove: _propTypes.default.func,\n\n /**\n * @ignore\n */\n onTouchStart: _propTypes.default.func,\n\n /**\n * The callback that fires when the animation comes to a rest.\n * This is useful to defer CPU intensive task.\n */\n onTransitionEnd: _propTypes.default.func,\n\n /**\n * If `true`, it will add bounds effect on the edges.\n */\n resistance: _propTypes.default.bool,\n\n /**\n * This is the className that will be applied\n * on the slide component.\n */\n slideClassName: _propTypes.default.string,\n\n /**\n * This is the inlined style that will be applied\n * on the slide component.\n */\n slideStyle: _propTypes.default.object,\n\n /**\n * This is the config used to create CSS transitions.\n * This is useful to change the dynamic of the transition.\n */\n springConfig: _propTypes.default.shape({\n delay: _propTypes.default.string,\n duration: _propTypes.default.string,\n easeFunction: _propTypes.default.string\n }),\n\n /**\n * This is the inlined style that will be applied\n * on the root component.\n */\n style: _propTypes.default.object,\n\n /**\n * This is the threshold used for detecting a quick swipe.\n * If the computed speed is above this value, the index change.\n */\n threshold: _propTypes.default.number\n} : {};\nSwipeableViews.defaultProps = {\n animateHeight: false,\n animateTransitions: true,\n axis: 'x',\n disabled: false,\n disableLazyLoading: false,\n enableMouseEvents: false,\n hysteresis: 0.6,\n ignoreNativeScroll: false,\n index: 0,\n threshold: 5,\n springConfig: {\n duration: '0.35s',\n easeFunction: 'cubic-bezier(0.15, 0.3, 0.25, 1)',\n delay: '0s'\n },\n resistance: false\n};\nvar _default = SwipeableViews;\nexports.default = _default;","var objectWithoutPropertiesLoose = require(\"./objectWithoutPropertiesLoose.js\");\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nmodule.exports = _objectWithoutProperties, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"checkIndexBounds\", {\n enumerable: true,\n get: function get() {\n return _checkIndexBounds.default;\n }\n});\nObject.defineProperty(exports, \"computeIndex\", {\n enumerable: true,\n get: function get() {\n return _computeIndex.default;\n }\n});\nObject.defineProperty(exports, \"constant\", {\n enumerable: true,\n get: function get() {\n return _constant.default;\n }\n});\nObject.defineProperty(exports, \"getDisplaySameSlide\", {\n enumerable: true,\n get: function get() {\n return _getDisplaySameSlide.default;\n }\n});\nObject.defineProperty(exports, \"mod\", {\n enumerable: true,\n get: function get() {\n return _mod.default;\n }\n});\n\nvar _checkIndexBounds = _interopRequireDefault(require(\"./checkIndexBounds\"));\n\nvar _computeIndex = _interopRequireDefault(require(\"./computeIndex\"));\n\nvar _constant = _interopRequireDefault(require(\"./constant\"));\n\nvar _getDisplaySameSlide = _interopRequireDefault(require(\"./getDisplaySameSlide\"));\n\nvar _mod = _interopRequireDefault(require(\"./mod\"));","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar checkIndexBounds = function checkIndexBounds(props) {\n var index = props.index,\n children = props.children;\n\n var childrenCount = _react.default.Children.count(children);\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(index >= 0 && index <= childrenCount, \"react-swipeable-view: the new index: \".concat(index, \" is out of bounds: [0-\").concat(childrenCount, \"].\")) : void 0;\n};\n\nvar _default = checkIndexBounds;\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = computeIndex;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _constant = _interopRequireDefault(require(\"./constant\"));\n\nfunction computeIndex(params) {\n var children = params.children,\n startIndex = params.startIndex,\n startX = params.startX,\n pageX = params.pageX,\n viewLength = params.viewLength,\n resistance = params.resistance;\n var indexMax = _react.default.Children.count(children) - 1;\n var index = startIndex + (startX - pageX) / viewLength;\n var newStartX;\n\n if (!resistance) {\n // Reset the starting point\n if (index < 0) {\n index = 0;\n newStartX = (index - startIndex) * viewLength + pageX;\n } else if (index > indexMax) {\n index = indexMax;\n newStartX = (index - startIndex) * viewLength + pageX;\n }\n } else if (index < 0) {\n index = Math.exp(index * _constant.default.RESISTANCE_COEF) - 1;\n } else if (index > indexMax) {\n index = indexMax + 1 - Math.exp((indexMax - index) * _constant.default.RESISTANCE_COEF);\n }\n\n return {\n index: index,\n startX: newStartX\n };\n}","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar getDisplaySameSlide = function getDisplaySameSlide(props, nextProps) {\n var displaySameSlide = false;\n\n var getChildrenKey = function getChildrenKey(child) {\n return child ? child.key : 'empty';\n };\n\n if (props.children.length && nextProps.children.length) {\n var oldKeys = _react.default.Children.map(props.children, getChildrenKey);\n\n var oldKey = oldKeys[props.index];\n\n if (oldKey !== null && oldKey !== undefined) {\n var newKeys = _react.default.Children.map(nextProps.children, getChildrenKey);\n\n var newKey = newKeys[nextProps.index];\n\n if (oldKey === newKey) {\n displaySameSlide = true;\n }\n }\n }\n\n return displaySameSlide;\n};\n\nvar _default = getDisplaySameSlide;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n// Extended version of % with negative integer support.\nfunction mod(n, m) {\n var q = n % m;\n return q < 0 ? q + m : q;\n}\n\nvar _default = mod;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nexports.getListSubheaderUtilityClass = getListSubheaderUtilityClass;\n\nvar _base = require(\"@mui/base\");\n\nfunction getListSubheaderUtilityClass(slot) {\n return (0, _base.generateUtilityClass)('MuiListSubheader', slot);\n}\n\nconst listSubheaderClasses = (0, _base.generateUtilityClasses)('MuiListSubheader', ['root', 'colorPrimary', 'colorInherit', 'gutters', 'inset', 'sticky']);\nvar _default = listSubheaderClasses;\nexports.default = _default;","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABTemplateView.html -->\\n<div class=\"container\">\\n<div class=\"container aside\">\\n\t<div data-nx-control=\"templatePreview\"></div>\\n\t\\n\t<h2 class=\"title ab-label\">'+\n((__t=( abLabel ))==null?'':__t)+\n'</h2>\\n\t\\n\t<h4 class=\"title ab-title\">'+\n((__t=( abTitle ))==null?'':__t)+\n'</h4>\\n\t<p class=\"ab-description\">'+\n((__t=( abDescription ))==null?'':__t)+\n'</p>\\n</div>\\n<div class=\"container bside\">\\n\t<header class=\"fixed-header\">\\n\t<button\\n\t\tid=\"new-template-btn\"\\n\t\tclass=\"btn btn-primary nx-action skip-to-here-primary\"\\n\t\tdata-action=\"adBuilder:customization:new\"\\n\t>\\n\t\t<span data-i18n=\"adBuilder:i18n.newCustomization\">New customization</span>\\n\t</button>\\n\\n\t</header>\\n\t<div data-nx-control=\"templateTabs\"></div>\\n</div>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABTemplatePreviewView.html -->\\n<div class=\"preview thumbnail watermark\">\\n <button class=\"zoom\" title=\"'+\n((__t=( i18n.t('i18n.zoom') ))==null?'':__t)+\n'\">\\n <div class=\"inner va\">'+\n((__t=( icons.faExpandArrows ))==null?'':__t)+\n'</div>\\n </button>\\n <img src=\"'+\n((__t=( custPreview ))==null?'':_.escape(__t))+\n''+\n((__t=( cacheBuster ))==null?'':__t)+\n'\" alt=\"'+\n((__t=( abTitle ))==null?'':__t)+\n'\" />\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABTemplateTabsView.html -->\\n<div class=\"sub-header fixed-header\" role=\"tabpanel\" data-nx-control=\"tabpanel\"></div>\\n<div\\n class=\"tab-content container-fluid\"\\n data-nx-control=\"tab-content\"\\n></div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABBlocksView.html -->\\n<div class=\"container\">\\n <form role=\"form\">\\n <div class=\"pods nx-childviews\"></div>\\n\\n <footer>\\n <div class=\"actions\">\\n <!-- <button type=\"button\" class=\"btn btn-default pull-left\" data-nx-control=\"cancel\">\\n\t\t\t\t\t<span class=\"text\" data-i18n=\"i18n.cancel\">i18n.cancel</span>\\n\t\t\t\t</button> -->\\n <button\\n type=\"button\"\\n class=\"btn btn-save pull-right\"\\n data-nx-control=\"publish\"\\n >\\n <span class=\"text\" data-i18n=\"i18n.publish\">i18n.publish</span>\\n </button>\\n ';\n if(!locked) { \n__p+='\\n <button\\n type=\"submit\"\\n class=\"btn btn-save pull-right\"\\n data-nx-control=\"save\"\\n >\\n <span class=\"text\" data-i18n=\"i18n.save\">i18n.save</span>\\n </button>\\n ';\n } \n__p+='\\n </div>\\n </footer>\\n </form>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABBlockView.html -->\\n<div class=\"container\">\\n\t';\n switch(type) { case 'Text': switch(textType) { case 'Text Area': \n__p+='\\n\t<div class=\"form-group'+\n((__t=( hidden ))==null?'':__t)+\n'\">\\n\t\t<header class=\"container-fluid\">\\n\t\t\t<h5 class=\"title\" id=\"'+\n((__t=( viewCid ))==null?'':__t)+\n'-label\">'+\n((__t=( label ))==null?'':__t)+\n'</h5>\\n\t\t</header>\\n\t\t<div class=\"container-fluid\">\\n\t\t\t<p>'+\n((__t=( description ))==null?'':__t)+\n'</p>\\n\t\t\t<textarea\\n\t\t\t\tclass=\"notes form-control\"\\n\t\t\t\tid=\"'+\n((__t=( viewCid ))==null?'':__t)+\n'\"\\n\t\t\t\tname=\"'+\n((__t=( viewCid ))==null?'':__t)+\n'\"\\n\t\t\t\tvalue=\"'+\n((__t=( value ))==null?'':__t)+\n'\"\\n\t\t\t\taria-labelledby=\"'+\n((__t=( viewCid ))==null?'':__t)+\n'-label\"\\n\t\t\t\t'+\n((__t=( readonly ))==null?'':__t)+\n'\\n\t\t>'+\n((__t=( value ))==null?'':__t)+\n'</textarea>\\n\t\t</div>\\n\t</div>\\n\t';\n break; case 'Text Box': \n__p+='\\n\t<div class=\"form-group'+\n((__t=( hidden ))==null?'':__t)+\n'\">\\n\t\t<header class=\"container-fluid\">\\n\t\t\t<h5 class=\"title\" id=\"'+\n((__t=( viewCid ))==null?'':__t)+\n'-label\">'+\n((__t=( label ))==null?'':__t)+\n'</h5>\\n\t\t</header>\\n\t\t<div class=\"container-fluid\">\\n\t\t\t<p>'+\n((__t=( description ))==null?'':__t)+\n'</p>\\n\t\t\t<input\\n\t\t\t\ttype=\"text\"\\n\t\t\t\tclass=\"form-control\"\\n\t\t\t\tid=\"'+\n((__t=( viewCid ))==null?'':__t)+\n'\"\\n\t\t\t\tname=\"'+\n((__t=( viewCid ))==null?'':__t)+\n'\"\\n\t\t\t\tvalue=\"'+\n((__t=( value ))==null?'':__t)+\n'\"\\n\t\t\t\taria-labelledby=\"'+\n((__t=( viewCid ))==null?'':__t)+\n'-label\"\\n\t\t\t\t'+\n((__t=( readonly ))==null?'':__t)+\n'\\n\t\t\t/>\\n\t\t</div>\\n\t</div>\\n\t';\n break; } break; case 'Image': \n__p+='\\n\\n\t<header class=\"container-fluid\">\\n\t\t<h5 class=\"title\">'+\n((__t=( label ))==null?'':__t)+\n'</h5>\\n\t</header>\\n\t<div class=\"container-fluid\">\\n\t\t<p>'+\n((__t=( description ))==null?'':__t)+\n'</p>\\n\t\t<div class=\"nx-childviews\"></div>\\n\t\t<div id=\"ABBlockViewLoader-'+\n((__t=( this.cid ))==null?'':__t)+\n'\" class=\"list-loader nx-autotemplate\" data-nx-template=\"loader\"></div>\t\t\\n\t\t<div data-nx-pager class=\"nx-pager\"></div>\\n\t</div>\\n\\n\t';\n if(!formLocked && value != '') { \n__p+='\\n\t<footer>\\n\t\t<div class=\"form-group\">\\n\t\t\t<button\\n\t\t\t\tclass=\"btn btn-secondary\"\\n\t\t\t\tdata-nx-control=\"reset-childviews\"\\n\t\t\t\tdata-i18n=\"adBuilder:i18n.reset\"\\n\t\t\t>\\n\t\t\t\treset\\n\t\t\t</button>\\n\t\t</div>\\n\t</footer>\\n\t';\n } break; } \n__p+='\\n\\n\t\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-asset/templates/assetSelectListItemView.html -->\\n<div class=\"form-group\">\\n\t<label tabindex=\"0\" for=\"'+\n((__t=( elementName ))==null?'':__t)+\n''+\n((__t=( assetId ))==null?'':__t)+\n'\" class=\"control-label full-width\">\\n\t\t<div class=\"thumbnail va\">\\n\t\t\t<div class=\"thumbnail-holder va\"><img src=\"'+\n((__t=( thumbUrl ))==null?'':__t)+\n'\" alt=\"'+\n((__t=( name ))==null?'':__t)+\n'\" /></div>\\n\t\t\t<div class=\"actions va\">\\n\t\t\t\t<div class=\"action-items\">\\n\t\t\t\t\t<a class=\"action cart\"><div class=\"bg\"></div>'+\n((__t=( icons.faCheck ))==null?'':__t)+\n'</a>\\n\t\t\t\t</div>\\n\t\t\t</div>\\n\t\t</div>\\n\t\t<div class=\"attribute name\">\\n\t\t\t<span class=\"text abbreviate\" title=\"'+\n((__t=( name ))==null?'':__t)+\n'\">'+\n((__t=( name ))==null?'':__t)+\n'</span>\\n\t\t</div>\\n\t</label>\\n\t<input \\n\t\ttype=\"radio\" \\n\t\trequired id=\"'+\n((__t=( elementName ))==null?'':__t)+\n''+\n((__t=( assetId ))==null?'':__t)+\n'\" \\n\t\tname=\"'+\n((__t=( elementName ))==null?'':__t)+\n'\" \\n\t\tvalue=\"'+\n((__t=( assetId ))==null?'':__t)+\n'\" \\n\t\t'+\n((__t=( isChecked ))==null?'':__t)+\n' \\n\t/>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABCustomizationsListView.html -->\\n<div class=\"container\">\\n <!-- this is where the backgrid table will be populate -->\\n <div data-grid></div>\\n <!-- /this is where the backgrid table will be populate -->\\n <div data-nx-pager></div>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABAssetTemplatesView.html -->\\n<div class=\"flex-row-grid\">\\n\t<div class=\"container no_recurse\">\\n\t\t<div class=\"assets hide-loading hide-empty\" data-layer data-nx-thumbsize=\"'+\n((__t=( Netx.user.prefs.getPreference('assetList.thumbSize') ))==null?'':__t)+\n'\">\\n\t\t\t<div class=\"nx-asset-list nx-childviews flex-row-grid-wrap\"></div>\\n\t\t</div>\\n\t\t<div id=\"listViewLoader-'+\n((__t=( this.cid ))==null?'':__t)+\n'\" class=\"list-loader nx-autotemplate\" data-nx-template=\"loader\"></div>\\n\t\t<div data-nx-pager class=\"hide-loading hide-empty pager\"></div>\\n\t\t<div class=\"empty-results show-empty hide-loading\">\\n\t\t\t<span class=\"text\">\\n\t\t\t\t<p data-i18n=\"i18n.noTemplatesFound\">No templates found.</p>\\n\t\t\t</span>\\n\t\t</div>\\n\t</div>\\n\\n<div>';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABCustomizationDownloadView.html -->\\n<div class=\"container\">\\n <form class=\"form\">\\n \t<div class=\"container-fluid\">\\n <div class=\"form-group required\">\\n <label class=\"control-label\">\\n <span data-i18n=\"adBuilder:i18n.outputFormat\">\\n Output format\\n </span>\\n </label>\\n <select\\n class=\"selectpicker form-control\"\\n autofocus\\n required\\n name=\"process\"\\n >\\n <option value=\"-1\" data-i18n=\"asset:i18n.pleaseSelect\">\\n Please select\\n </option>\\n ';\n _.each( formats, function( p, idx ) { \n__p+='\\n <option value=\"'+\n((__t=( p ))==null?'':_.escape(__t))+\n'\">'+\n((__t=( p ))==null?'':__t)+\n'</option>\\n ';\n } ); \n__p+='\\n </select>\\n </div>\\n \t</div>\\n\\n <footer>\\n <div class=\"actions double\">\\n <button\\n type=\"submit\"\\n id=\"singlebutton\"\\n class=\"btn btn-save pull-right btn-half\"\\n data-nx-control=\"save\"\\n data-i18n=\"asset:i18n.download\"\\n >\\n Download\\n </button>\\n <button\\n type=\"button\"\\n class=\"nx-cancel cancel btn btn-default pull-left\"\\n data-nx-control=\"cancel\"\\n data-i18n=\"share:i18n.cancel\"\\n >\\n Cancel\\n </button>\\n </div>\\n </footer>\\n </form>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABCustomizationNameView.html -->\\n<div class=\"container\">\\n <header class=\"header\">\\n <p class=\"container-fluid\">'+\n((__t=( promptMessage ))==null?'':__t)+\n'</p>\\n </header>\\n <form data-nx-validate-form>\\n <div class=\"container-fluid\">\\n <div class=\"form-group\">\\n <label\\n for=\"abLabel\"\\n class=\"control-label\"\\n data-i18n=\"adBuilder:i18n.name\"\\n >Name</label\\n >\\n <input\\n type=\"text\"\\n class=\"form-control\"\\n id=\"abLabel\"\\n name=\"abLabel\"\\n required\\n value=\"\"\\n />\\n </div>\\n <div class=\"form-group\">\\n <label\\n for=\"abDescription\"\\n class=\"control-label\"\\n data-i18n=\"adBuilder:i18n.description\"\\n >Description</label\\n >\\n <textarea\\n class=\"notes form-control\"\\n id=\"abDescription\"\\n name=\"abDescription\"\\n ></textarea>\\n </div>\\n </div>\\n <footer>\\n <div class=\"actions double\">\\n <button\\n type=\"button\"\\n class=\"btn btn-default cancel nx-cancel pull-left\"\\n data-nx-control=\"cancel\"\\n >\\n <span class=\"text\" data-i18n=\"i18n.cancel\">i18n.cancel</span>\\n </button>\\n <button type=\"submit\" class=\"btn btn-save submit\">\\n <span class=\"text\" data-i18n=\"i18n.save\">i18n.save</span>\\n </button>\\n </div>\\n </footer>\\n </form>\\n</div>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABGalleryHeaderView.html -->\\n<header class=\"nx-header\">\\n\t<div class=\"list-actions-bar flex-row-grid flex-align-center flex-justify-space\">\\n\t\t<div class=\"flex-row-grid flex-align-center\">\\n\t\t\t<button data-nx-control=\"filters\" title=\"'+\n((__t=( i18n.t('i18n.filters') ))==null?'':__t)+\n'\" class=\"primary-color-hover\">'+\n((__t=( icons.faSlidersH ))==null?'':__t)+\n'</button>\\n\t\t\t<span class=\"asset-count nx-count\" data-count=\"0\">0</span>\\n\t\t\t<span class=\"gallery-title\">\\n\t\t\t\t<span class=\"text\">'+\n((__t=( i18n.t('i18n.templates') ))==null?'':__t)+\n'</span>\\n\t\t\t</span>\\n\t\t\t<button class=\"checkbox inline selectAll nx-select-all\">\\n\t\t\t\t<label for=\"folderAddAll-'+\n((__t=( this.cid ))==null?'':__t)+\n'\"><span class=\"text\"> <span class=\"title primary-color-hover\" data-i18n=\"i18n.selectAll\">i18n.selectAll</span></span></label>\\n\t\t\t</button>\\n\t\t</div>\\n\t\t<div class=\"controls nx-sort flex-row-grid flex-align-center flex-justify-end\"></div>\\n\t</div>\\n</header>\\n';\n}\nreturn __p;\n};\n","module.exports = function(obj){\nvar __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\nwith(obj||{}){\n__p+='\\n<!-- build-targets/portal/packages/core-ad-builder/templates/ABGalleryView.html -->\\n\\n\t<header class=\"nx-header\" data-nx-control=\"header\"></header>\\n\t<div class=\"flex-row-grid\">\\n\t\t<div class=\"nx-facets vertical-facets\" data-nx-control=\"facets\"></div>\\n\t\t<div class=\"flex-column-grid ab-search-assets-container\">\\n\t\t\t<div id=\"ab-search-assets\" class=\"flex-item nx-assets\"></div>\\n\t\t</div>\\n\t</div>\\n';\n}\nreturn __p;\n};\n","import {getViewCollection, getViewModel} from '@netx/core/lib/utils';\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\n\n/**\n * Embed code is only available for a single asset of type image or video\n */\nexport const canEmbed = (v) => {\n\tvar assets, fileFormatFamily;\n\tif (v.data && v.data.assetSet) {\n\t\tassets = v.data.assetSet.get('models');\n\t\t// do not enable if not one asset\n\t\tif (v.data.assetSet.get('type') !== 'asset' || assets.length !== 1) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfileFormatFamily =\n\t\t\tassets[0].get('fileFormatFamily') && assets[0].get('fileFormatFamily')[0];\n\n\t\t// If asset is not an image do not enable\n\t\tif (fileFormatFamily !== 'image') {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\t// Something is wrong if v.data.assetSet is not defined\n\t\treturn false;\n\t}\n\treturn true;\n};\n\n/**\n * Clips and manual repurposes cannot be links\n * @method\n */\nexport const canCreateTokenLink = (v) => {\n\tif (v.data && v.data.assetSet) {\n\t\treturn v.data.assetSet.get('canCreateLink') !== false;\n\t}\n\treturn true;\n};\n\nexport const canShareAssetSetWithTeam = (v) => {\n\tvar assetSet;\n\tif (v.data && v.data.assetSet) {\n\t\tassetSet = v.data.assetSet;\n\t} else if (v.model || v.collection) {\n\t\tassetSet = (v.model || v.collection).toAssetSet();\n\t}\n\n\tif (assetSet) {\n\t\t// Right now, just carts\n\t\tif (\n\t\t\t[\n\t\t\t\tassetSetTypes.attributeSet,\n\t\t\t\tassetSetTypes.savedCart,\n\t\t\t\tassetSetTypes.savedSearch,\n\t\t\t].indexOf(assetSet.get('type')) > -1\n\t\t) {\n\t\t\tvar valid = true;\n\t\t\t//console.log( canShareAssetSetWithTeam );\n\t\t\t// TODO: should we invalidate the whole deal if one of these are not met or omit the invalid ones and let the user know they can continue with the rest?\n\t\t\t// This is me assuming there may be a day that we could share multiples (as assetSet is set up to do so)\n\t\t\t_.each(assetSet.get('models'), function (m) {\n\t\t\t\tif (valid) valid = m.allows('share');\n\t\t\t});\n\t\t\treturn valid;\n\t\t}\n\t}\n\n\treturn false;\n};\n\nexport const canUseShareMenu = (v) => {\n\t// Vars\n\tvar action,\n\t\tactions,\n\t\tassetSet,\n\t\tgatherActions,\n\t\tshareMenu,\n\t\tthing,\n\t\ttypes,\n\t\tuserLevel,\n\t\tvalid;\n\n\tuserLevel = Netx.getUserLevel();\n\n\t// Deduce thing and create an assetSet\n\tif (\n\t\tv.model &&\n\t\tv.model.constructor.__name__ === 'asset' &&\n\t\tv.model.get('inCurrentCart')\n\t) {\n\t\tthing = Netx.cart.current;\n\t} else {\n\t\tthing = v.model || v.collection;\n\t}\n\tassetSet = thing.toAssetSet();\n\n\tif (!assetSet) {\n\t\treturn false;\n\t}\n\n\t// For memory sake\n\ttypes = assetSetTypes;\n\n\t// Create a copy of our share menu for mainpulation\n\tshareMenu = Netx.Menus.shareMenu.clone();\n\tshareMenu.set({actions: _.clone(shareMenu.get('actions'))});\n\tswitch (assetSet.get('type')) {\n\t\tcase types.asset:\n\t\tcase types.assets:\n\t\tcase types.cart:\n\t\tcase types.category:\n\t\t\t// No way to share these with team\n\t\t\tshareMenu.set(\n\t\t\t\t'actions',\n\t\t\t\t_.without(shareMenu.get('actions'), 'share:assetSet:users'),\n\t\t\t);\n\t\t\tbreak;\n\t\tcase types.savedSearch:\n\t\t\t// Apparently sharing searches is not all the way there yet either? Investigating ...\n\t\t\tshareMenu.set(\n\t\t\t\t'actions',\n\t\t\t\t_.without(shareMenu.get('actions'), 'share:assetSet:users'),\n\t\t\t);\n\t\t\tbreak;\n\t}\n\t// Check that what is left is valid\n\tactions = [];\n\tgatherActions = _.bind(function (actionStrs) {\n\t\t_.each(\n\t\t\tactionStrs,\n\t\t\tfunction (actionStr) {\n\t\t\t\tif (_.isString(actionStr)) {\n\t\t\t\t\taction = Netx.Actions.Find(actionStr);\n\t\t\t\t\tvar valid = true;\n\t\t\t\t\tif (action) {\n\t\t\t\t\t\tif (action.enableTest) {\n\t\t\t\t\t\t\tif (_.isArray(actions.enableTest)) {\n\t\t\t\t\t\t\t\t_.each(\n\t\t\t\t\t\t\t\t\tactions.enableTest,\n\t\t\t\t\t\t\t\t\tfunction (et) {\n\t\t\t\t\t\t\t\t\t\tif (valid && _.isFunction(et)) {\n\t\t\t\t\t\t\t\t\t\t\tvalid = et(v);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else if (_.isFunction(action.enableTest)) {\n\t\t\t\t\t\t\t\tvalid = action.enableTest(v);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (valid && action.userLevel && action.userLevel > userLevel) {\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (valid) actions.push(action);\n\t\t\t\t\t}\n\t\t\t\t} else if (_.isArray(actionStr)) {\n\t\t\t\t\tgatherActions(actionStr);\n\t\t\t\t}\n\t\t\t},\n\t\t\tthis,\n\t\t);\n\t}, this);\n\n\tgatherActions(shareMenu.get('actions'));\n\n\t// Any valid actions left?\n\treturn actions.length;\n};\n\n/**\n * DAM-13453 - if a single download option type is specified,\n * then it's not a media service\n * @function\n * @param {Backbone.View} v View instance\n * @return {boolean} Link (token) has assets\n */\nexport const downloadOptionSelected = (v) => {\n\treturn v.data.assetSet.displayedDownloadOptionTypes.length > 1;\n};\n\nexport const hasContents = (v) => {\n\tconst model = getViewModel(v);\n\treturn model && model.get('contentCount') > 0;\n};\n\n/**\n * Does the token link have assets?\n * @function\n * @param {Backbone.View} v View instance\n * @return {boolean} Link (token) has assets\n */\nexport const linkHasAssets = (v) => {\n\tvar model = (v.data && v.data.model) || v.model;\n\treturn model && (model.assets.length > 0 || !!model.get('options')?.length);\n};\n\n/**\n * Does the token link a contact sheet?\n * @function\n * @param {Backbone.View} v View instance\n * @return {boolean} Link (token) has a contact sheet\n */\nexport const linkHasContactSheet = (v) => {\n\tvar model = (v.data && v.data.model) || v.model;\n\treturn model.hasOption('contactSheet');\n};\n\n/**\n * Does the token link have metadata?\n * @function\n * @param {Backbone.View} v View instance\n * @return {boolean} Link (token) has metadata\n */\nexport const linkHasMetadata = (v) => {\n\tvar model = (v.data && v.data.model) || v.model;\n\treturn model.hasOption('metadata');\n};\n\n/**\n * Does the token link have template customization?\n * @function\n * @param {Backbone.View} v View instance\n * @return {boolean} Link (token) has template customization\n */\nexport const linkHasTemplateCustomization = (v) => {\n\tvar model = (v.data && v.data.model) || v.model;\n\treturn model.hasOption('templateCustomization');\n};\n","export * from '@netx/core-share/enablers';\n\n/**\n * @function\n * @param {module:core/lib/netx-view} view View\n * @return {boolean}\n */\nexport const canShareAssets = (view) => {\n\treturn Netx.cart.current.length > 0 || view.collection.length;\n};\n","import {getViewModel} from '@netx/core/lib/utils';\n\nexport const categoryNotEmpty = v => {\n\tconst model = getViewModel(v);\n\tif (!model) return false;\n\n\treturn model.has('categoryid') && model.get('hasContents');\n};\n","import {QueryClient} from 'react-query';\nimport {UserLevel} from '@netx/core-user/constants';\n\nexport const queryClient = new QueryClient();\n\nexport const ASSET_SOURCE_TYPE = <const>{\n\tASSETS: 'ASSETS', // 1\n\tCOLLECTION: 'COLLECTION', // 2\n\tFOLDER: 'FOLDER', // 3\n\tSAVED_SEARCH: 'SAVED_SEARCH', // 4\n};\n\nexport const REVIEW_STATUS = <const>{\n\tNO_APPROVAL_REQUIRED: 'NO_APPROVAL_REQUIRED', // 1\n\tPENDING: 'PENDING', // 2\n\tCOMPLETED: 'COMPLETED', // 3\n};\n\nexport const APPROVAL_STATUS = <const>{\n\tNO_APPROVAL_REQUIRED: 'NO_APPROVAL_REQUIRED', // 1\n\tPENDING_APPROVAL: 'PENDING_APPROVAL', // 2\n\tAPPROVED: 'APPROVED', // 3\n\tDENIED: 'DENIED', // 4\n};\n\nexport const PAGE_SIZE = 25;\nexport const MINIMUM_USER_LEVEL = UserLevel.DIRECTOR;\n","import {i18n} from '@netx/core/i18n';\n\nimport {APPROVAL_STATUS, REVIEW_STATUS} from './constants';\n\nexport const APPROVAL_STATUS_LABEL: Record<\n\ttypeof APPROVAL_STATUS[keyof typeof APPROVAL_STATUS],\n\tstring\n> = <const>{\n\t[APPROVAL_STATUS.APPROVED]: i18n.t('i18n.approved'),\n\t[APPROVAL_STATUS.NO_APPROVAL_REQUIRED]: i18n.t('i18n.noApprovalRequired'),\n\t[APPROVAL_STATUS.DENIED]: i18n.t('i18n.denied'),\n\t[APPROVAL_STATUS.PENDING_APPROVAL]: i18n.t('i18n.pendingApproval'),\n};\n\nexport const REVIEW_STATUS_LABEL: Record<\n\ttypeof REVIEW_STATUS[keyof typeof REVIEW_STATUS],\n\tstring\n> = <const>{\n\t[REVIEW_STATUS.COMPLETED]: i18n.t('i18n.completed'),\n\t[REVIEW_STATUS.NO_APPROVAL_REQUIRED]: i18n.t('i18n.noApprovalRequired'),\n\t[REVIEW_STATUS.PENDING]: i18n.t('i18n.pending'),\n};\n\nexport const DOWNLOAD_REQUEST_ACTION_LABEL = <const>{\n\tLIST: i18n.t('i18n.downloadRequests'),\n\tVIEW: i18n.t('i18n.viewAssets'),\n};\n","import {MINIMUM_USER_LEVEL} from './constants';\nimport {DOWNLOAD_REQUEST_ACTION_LABEL} from './locales';\n\nimport type {Action} from '@netx/core/bootstrap';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {faCheckSquare, faImages} from '@fortawesome/pro-solid-svg-icons';\n\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaCheckSquare: icon(faCheckSquare, iconOpts).html,\n\tfaImages: icon(faImages, iconOpts).html,\n};\n\nexport const DOWNLOAD_REQUEST_ROUTES = <const>{\n\tLIST: 'share/approvals',\n\tVIEW: 'share/request/review',\n};\n\nexport type BaseVent = typeof BASE_EVENT;\n\nexport const BASE_EVENT = `download:request`;\n\nexport const DOWNLOAD_REQUEST_EVENT = <const>{\n\tLIST_ROUTE: `${BASE_EVENT}:list:route`,\n\tLIST: `${BASE_EVENT}:list`,\n\tVIEW: `${BASE_EVENT}:view`,\n\tVIEW_ROUTE: `${BASE_EVENT}:view:route`,\n};\n\nexport const ACTIONS: Action<\n\ttypeof DOWNLOAD_REQUEST_EVENT[keyof typeof DOWNLOAD_REQUEST_EVENT]\n>[] = [\n\t{\n\t\tevent: DOWNLOAD_REQUEST_EVENT.LIST,\n\t\ticon: icons.faCheckSquare,\n\t\tlabel: DOWNLOAD_REQUEST_ACTION_LABEL.LIST,\n\t\tuserLevel: MINIMUM_USER_LEVEL,\n\t},\n\t{\n\t\tevent: DOWNLOAD_REQUEST_EVENT.LIST_ROUTE,\n\t\ticon: icons.faCheckSquare,\n\t\tlabel: DOWNLOAD_REQUEST_ACTION_LABEL.LIST,\n\t\troute: DOWNLOAD_REQUEST_ROUTES.LIST,\n\t\tuserLevel: MINIMUM_USER_LEVEL,\n\t},\n\t{\n\t\tevent: DOWNLOAD_REQUEST_EVENT.VIEW,\n\t\ticon: icons.faImages,\n\t\tlabel: DOWNLOAD_REQUEST_ACTION_LABEL.VIEW,\n\t\tuserLevel: MINIMUM_USER_LEVEL,\n\t},\n\t{\n\t\tevent: DOWNLOAD_REQUEST_EVENT.VIEW_ROUTE,\n\t\ticon: icons.faImages,\n\t\tlabel: DOWNLOAD_REQUEST_ACTION_LABEL.VIEW,\n\t\tuserLevel: MINIMUM_USER_LEVEL,\n\t\troute: (id) => `${DOWNLOAD_REQUEST_ROUTES.VIEW}/${id}`,\n\t},\n];\n\nexport default ACTIONS;\n","import CartAssetsCollection from '@netx/core-cart/collections/cartAssets';\nimport SavedCartModel from '@netx/core-cart/models/savedCart';\nimport SearchAssetsCollection from '@netx/core-search/collections/searchAssets';\nimport OptionTileModel from '@netx/core-app/models/optionTile';\n\nimport {\n\tcanCreateTokenLink,\n\tcanEmbed,\n\tcanShareAssetSetWithTeam,\n\tcanUseShareMenu,\n\tdownloadOptionSelected,\n\thasContents,\n\tlinkHasAssets,\n\tlinkHasContactSheet,\n\tlinkHasMetadata,\n\tlinkHasTemplateCustomization,\n} from './enablers';\nimport {\n\tcanEmail,\n\tcollectionNotEmpty,\n\tmediaServicesEnabled,\n\tnotMobile,\n} from '@netx/core/lib/netx-enablers';\nimport {assetIsPresent, assetNotCheckedOut} from '@netx/core-asset/enablers';\nimport {assetsAreSelected, currentCartNotEmpty} from '@netx/core-cart/enablers';\nimport {categoryNotEmpty} from '@netx/core-category/enablers';\n\nimport DownloadRequestActions from '@netx/core-download-request/actions';\n\nexport default [\n\t...DownloadRequestActions,\n\t/**\n\t * Actions for direct download of various sets of assets:\n\t *\n\t * Download a single asset:\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:asset:download',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tuserLevel: 2,\n\t\tmatrix: 'download', // asset model must permit download\n\t\tenableTest: [assetNotCheckedOut, assetIsPresent],\n\t\ttestOnSync: true,\n\t\twrapper(v) {\n\t\t\treturn [v.model.id];\n\t\t},\n\t},\n\t/**\n\t * Download a saved cart\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:cart:download',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\twrapper(v, e) {\n\t\t\tif (v.model) {\n\t\t\t\treturn [v.model, v, e];\n\t\t\t} else if (v.collection) {\n\t\t\t\treturn [v.collection.findCartModel() || v.collection.id, v, e];\n\t\t\t} else if (Netx.cart.gallery) {\n\t\t\t\treturn [\n\t\t\t\t\tNetx.cart.gallery.findCartModel() || Netx.cart.gallery.id,\n\t\t\t\t\tv,\n\t\t\t\t\te,\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\t// Share the current cart:\n\t\t\t\treturn [0, v, e];\n\t\t\t}\n\t\t},\n\t},\n\t/**\n\t * Download the current cart.\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:cart:current:download',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tenableTest: assetsAreSelected,\n\t\ttestOnSync: true,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t},\n\t/**\n\t * Download a saved search.\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:search:download',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\twrapper(v) {\n\t\t\treturn [v.model ? v.model.id : Netx.search.assets.id];\n\t\t},\n\t},\n\t/**\n\t * Download a category\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:category:download',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tuserLevel: 2,\n\t\ttestOnSync: true,\n\t\tmatrix: 'download', // category model must permit download.\n\t\twrapper(v) {\n\t\t\treturn [v.model ? v.model.id : Netx.category.current.id];\n\t\t},\n\t},\n\t/*************************************************************\n\t * Actions for creating shareable PDFs from various sets of assets.\n\t * A user needs \"download\" permission in order to do this.\n\t *\n\t * Create PDF of some assets:\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:asset:createPDF',\n\t\tlabel: i18n.t('i18n.createPDF'),\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\tenableTest: assetIsPresent,\n\t\ttestOnSync: true,\n\t\twrapper(v) {\n\t\t\treturn [v.model ? v.model.id : Netx.asset.current.id];\n\t\t},\n\t},\n\n\t/**\n\t * Create PDF of a saved search\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:cart:createPDF',\n\t\tlabel: i18n.t('i18n.createPDF'),\n\t\tenableTest: hasContents,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\ttestOnSync: true,\n\t\twrapper(v) {\n\t\t\treturn [v.model];\n\t\t},\n\t},\n\n\t/**\n\t *\n\t * Create PDF of saved cart from gallery\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:cart:gallery:createPDF',\n\t\tlabel: i18n.t('i18n.createPDF'),\n\t\tenableTest: collectionNotEmpty,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\ttestOnSync: true,\n\t\twrapper(v, e) {\n\t\t\tif (v.model) {\n\t\t\t\treturn [v.model || Netx.cart.gallery, v, e];\n\t\t\t} else if (v.collection) {\n\t\t\t\treturn [v.collection.findCartModel() || Netx.cart.gallery, v, e];\n\t\t\t} else {\n\t\t\t\tthrow new Error('Cant find saved cart model');\n\t\t\t}\n\t\t},\n\t},\n\t/**\n\t * Create PDF of current selection\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:cart:current:createPDF',\n\t\tlabel: i18n.t('i18n.createPDF'),\n\t\tenableTest: assetsAreSelected,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\ttestOnSync: true,\n\t},\n\t/**\n\t * Create PDF of a category:\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:category:createPDF',\n\t\tlabel: i18n.t('i18n.createPDF'),\n\t\tenableTest: categoryNotEmpty,\n\t\tuserLevel: 2,\n\t\ttestOnSync: true,\n\t\tmatrix: 'download', // category model must permit download.\n\t\twrapper(v, e) {\n\t\t\t// model, view, event\n\t\t\tvar model = v.model || Netx.category.current.id;\n\t\t\treturn [model, v, e];\n\t\t},\n\t},\n\t/**\n\t * Create PDF of a saved search from gallery\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:search:gallery:createPDF',\n\t\tlabel: i18n.t('i18n.createPDF'),\n\t\tenableTest: collectionNotEmpty,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\ttestOnSync: true,\n\t\twrapper(v, e) {\n\t\t\t// if the view is a collectionView, find the saved search for the collection.\n\t\t\tvar model = v.model;\n\t\t\tif (model) {\n\t\t\t\treturn [model ? model : Netx.search.assets, v, e];\n\t\t\t} else if (v.collection instanceof SearchAssetsCollection) {\n\t\t\t\tmodel = v.collection.findSearchModel();\n\t\t\t\treturn [model ? model : Netx.search.assets, v, e];\n\t\t\t} else {\n\t\t\t\t// if the view is of an unsaved search ... I don't think we can share an unsaved search until we save it;\n\t\t\t\t// there's no assetSet for that.\n\t\t\t\tthrow new Error('cannot create PDF of unsaved search');\n\t\t\t}\n\t\t},\n\t},\n\t/**\n\t * Create PDF of a saved search\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:search:createPDF',\n\t\tlabel: i18n.t('i18n.createPDF'),\n\t\tenableTest: hasContents,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\ttestOnSync: true,\n\t\twrapper(v, e) {\n\t\t\treturn [v.model];\n\t\t},\n\t},\n\n\t/**\n\t * Actions that trigger the sharing UIs/behaviors for an assetSet and some downloadOptions:\n\t */\n\t/** @action */\n\t{\n\t\tevent: 'share:assetSet:directDownload',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\twrapper(v) {\n\t\t\tif (_.isObject(v.data)) {\n\t\t\t\treturn _.values(v.data).concat(v);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"wack error: wrapper just can't wrap\");\n\t\t\t}\n\t\t},\n\t\t// TODO: look into putting this wrapper on optionTileView.\n\t\t// The thing is, optionTileView might be showing views that have wrappers already ...\n\t},\n\t/** @action */\n\t{\n\t\t// Send email after creating a link\n\t\tevent: 'share:token:sendEmail',\n\t\tlabel: i18n.t('i18n.emailLink'),\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\tenableTest: canEmail,\n\t\twrapper(v) {\n\t\t\treturn [v.model, v];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\t// create a link, choosing downloadOptions on the way\n\t\tevent: 'share:assetSet:token',\n\t\tlabel: i18n.t('i18n.createLink'),\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\twrapper(v) {\n\t\t\tif (_.isObject(v.data)) {\n\t\t\t\treturn _.values(v.data).concat(v);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"wack error: wrapper just can't wrap\");\n\t\t\t}\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\t// create link, with downloadOptions already chosen\n\t\tevent: 'share:assetSet:token:withOptions',\n\t\tlabel: i18n.t('i18n.createLink'),\n\t\tenableTest: canCreateTokenLink,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\twrapper(v) {\n\t\t\tif (_.isObject(v.data)) {\n\t\t\t\treturn _.values(v.data).concat(v);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"wack error: wrapper just can't wrap\");\n\t\t\t}\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:assetSet:users',\n\t\tlabel: i18n.t('i18n.shareWithTeam'),\n\t\tenableTest: canShareAssetSetWithTeam,\n\t\twrapper(v) {\n\t\t\tif (_.isObject(v.data)) {\n\t\t\t\treturn _.values(v.data).concat(v);\n\t\t\t} else if (v.model && v.model.toAssetSet) {\n\t\t\t\treturn [v.model.toAssetSet(), v];\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"wack error: wrapper just can't wrap\");\n\t\t\t}\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\t// share assetSet to social media:\n\t\tevent: 'share:assetSet:media:service',\n\t\tlabel: i18n.t('i18n.publish'),\n\t\tenableTest: [mediaServicesEnabled, downloadOptionSelected],\n\t\tuserLevel: 2,\n\t\twrapper(v) {\n\t\t\tif (_.isObject(v.data)) {\n\t\t\t\treturn [v.data.assetSet];\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"wack error: wrapper just can't wrap\");\n\t\t\t}\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\t// Get embed code\n\t\tevent: 'share:token:embed',\n\t\tlabel: i18n.t('i18n.createEmbed'),\n\t\tenableTest: canEmbed,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\twrapper(v) {\n\t\t\tif (_.isObject(v.data)) {\n\t\t\t\treturn _.values(v.data).concat(v);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"wack error: wrapper just can't wrap\");\n\t\t\t}\n\t\t},\n\t},\n\n\t/**\n\t * Actions that trigger the sharing UIs/behaviors for an assetSet and some downloadOptions:\n\t */\n\t/** @action */\n\t{\n\t\tevent: 'share:tokens:route',\n\t\tlabel: i18n.t('i18n.accessTokens'),\n\t\tenableTest: notMobile,\n\t\troute: 'share/tokens',\n\t\tuserLevel: 2,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:token:new',\n\t\tlabel: i18n.t('i18n.add'),\n\t\tuserLevel: 2,\n\t\twrapper(v, e) {\n\t\t\treturn [v.model];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:token:edit',\n\t\tlabel: i18n.t('i18n.edit'),\n\t\tuserLevel: 2,\n\t\twrapper(v, e) {\n\t\t\treturn [v.model];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:token:delete',\n\t\tlabel: i18n.t('i18n.delete'),\n\t\tuserLevel: 2,\n\t\twrapper(v, e) {\n\t\t\treturn [v.model, v, e];\n\t\t},\n\t},\n\n\t/**\n\t * Insert an assetSet at the beginning of the direct download workflow\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:assetSet:download:start',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\twrapper(v) {\n\t\t\tif (_.isObject(v.data)) {\n\t\t\t\treturn _.values(v.data).concat(v);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"wack error: wrapper just can't wrap\");\n\t\t\t}\n\t\t},\n\t},\n\n\t/**\n\t * Most generic action for sharing a thing\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:menu',\n\t\tlabel: i18n.t('i18n.share'),\n\t\tenableTest: canUseShareMenu,\n\t\tuserLevel: 1,\n\t\tmatrix: 'download',\n\t\ttestOnSync: true,\n\t\twrapper(v, e) {\n\t\t\tif (!(v.model || v.collection)) {\n\t\t\t\tthrow new Error(\"can't find share object\");\n\t\t\t}\n\n\t\t\t// TODO: this is a mess\n\t\t\t// In 8.12 the currentCart is it's own collection - so this can be fixed a bit more \"elegantly\"\n\t\t\t// We do not want the collection if this is a saved cart - we loose all information about that cart\n\t\t\t// Another alternative is to have collections store a reference to the model they may be representing (or be a property of that model)\n\t\t\tif (\n\t\t\t\tv.collection &&\n\t\t\t\tv.collection instanceof CartAssetsCollection &&\n\t\t\t\t!(v.model instanceof SavedCartModel)\n\t\t\t) {\n\t\t\t\t// Special case:\n\t\t\t\t// When we trigger from the context menu of a shared asset, both model & collection are set,\n\t\t\t\t// but the collection is what we want.\n\t\t\t\treturn [v.collection, v, e];\n\t\t\t} else {\n\t\t\t\t// general case:\n\t\t\t\treturn [v.model || v.collection, v, e];\n\t\t\t}\n\t\t},\n\t},\n\n\t/**\n\t * share:asset:menu is just like share:menu, but for a specific asset. This lets us\n\t * run asset-specific enableTests on the action.\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:asset:menu',\n\t\tlabel: i18n.t('i18n.share'),\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\tenableTest: [assetNotCheckedOut, assetIsPresent, canUseShareMenu],\n\t\ttestOnSync: true,\n\t\twrapper(v, e) {\n\t\t\tif (!(v.model || v.collection)) {\n\t\t\t\tthrow new Error(\"can't find share object\");\n\t\t\t}\n\t\t\treturn [v.model || v.collection, v, e];\n\t\t},\n\t},\n\n\t/**\n\t * Similarly, share:category:menu is just like share:menu, but for a specific category. This lets us\n\t * run category-specific test (like categoryNotEmpty) on the action.\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:category:menu',\n\t\tlabel: i18n.t('i18n.share'),\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\tenableTest: [categoryNotEmpty], // TODO: add .canUseShareMenu ? If not, document why not.\n\t\twrapper(v, e) {\n\t\t\tif (!(v.model || v.collection)) {\n\t\t\t\tthrow new Error(\"can't find share object\");\n\t\t\t}\n\t\t\treturn [v.model || v.collection, v, e];\n\t\t},\n\t\ttestOnSync: true,\n\t},\n\n\t/**\n\t * Recognizably, share:cart:current:menu is just like share:menu but for the current cart.\n\t * @action\n\t */\n\t{\n\t\tevent: 'cart:current:share:menu',\n\t\tlabel: i18n.t('i18n.share'),\n\t\tenableTest: [currentCartNotEmpty, canUseShareMenu],\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\ttestOnSync: true,\n\t},\n\n\t/**\n\t * Action to punt shareStatus view & request an email instead.\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:status:emailWhenDone',\n\t\tlabel: i18n.t('i18n.emailWhenDone'),\n\t\twrapper(v, e) {\n\t\t\treturn [v.model && v.model.uuid, v.model, v];\n\t\t},\n\t},\n\n\t// Older actions that should be deprected and/or refactored into newer actions:\n\t/** @action */\n\t// replace share:asset with asset:share:menu, which instantiates the asset & routes to share:menu.\n\t{\n\t\tevent: 'share:asset',\n\t\tlabel: i18n.t('i18n.share'),\n\t\tmatrix: 'download',\n\t\t//enableTest: assetIsPresent,\n\t\troute(v) {\n\t\t\treturn `asset/${v.model.id}/share`;\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:search:saved',\n\t\tlabel: i18n.t('i18n.share'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\twrapper(v) {\n\t\t\treturn [\n\t\t\t\tv.model\n\t\t\t\t\t? v.model.id\n\t\t\t\t\t: Netx.search.assets.selection.models[0].get('elementValue1'),\n\t\t\t];\n\t\t},\n\t\troute(id) {\n\t\t\treturn 'search-assets/' + id + '/share';\n\t\t},\n\t},\n\n\t/**\n\t * Action to edit a feed model:\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:feed:edit',\n\t\tlabel: i18n.t('i18n.editFeed'),\n\t\tuserLevel: 8,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\n\t/**\n\t * Action to create a feed model:\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:feed:new',\n\t\tlabel: i18n.t('i18n.createFeed'),\n\t\tuserLevel: 8,\n\t\t// DEVNOTE: Enablers.mediaSerivcesEnabled tests the mediaServices.enabled property,\n\t\t// which is what we need to test here.\n\t\t//\n\t\t// But that enabler also tests whether we've authenticated with a foreign server,\n\t\t// which is irrelevant for creating feeds.\n\t\t//\n\t\t// So Enablers.mediaServicesEnabled is misnamed, and not the enabler we need here.\n\t\t// All we need is to test single system property mediaServices.enabled\n\t\tenableTest() {\n\t\t\treturn Netx.getPublicProperty('mediaServices.enabled', true);\n\t\t},\n\t\twrapper(view, e) {\n\t\t\t// Did we get a click from the Share Menu?\n\t\t\tif (view.model instanceof OptionTileModel) {\n\t\t\t\t// There's a model in here someplace ...\n\t\t\t\tvar data = view.model.get('data');\n\t\t\t\tif (data.assetSet) {\n\t\t\t\t\treturn [data.assetSet.get('models')[0]];\n\t\t\t\t} else {\n\t\t\t\t\tthrow \"Can't find model for action\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Any other model, just pass it on.\n\t\t\t\treturn [view.model];\n\t\t\t}\n\t\t},\n\t},\n\n\t/**\n\t * Action to delete a feed model:\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:feed:delete',\n\t\tlabel: i18n.t('i18n.deleteFeed'),\n\t\tuserLevel: 8,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\n\t/** @action */\n\t{\n\t\tevent: 'share:sharedResource:toggle:favorite',\n\t\tlabel: i18n.t('i18n.toggleFavorite'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\n\t/**\n\t * Download all items in token link\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:token:download:all',\n\t\tlabel: i18n.t('i18n.downloadAll'),\n\t\tenableTest: linkHasAssets,\n\t\ttestOnSync: true,\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Download single asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:token:download:asset',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tenableTest: assetIsPresent,\n\t\ttestOnSync: true,\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Download contact sheet in token link\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:token:download:contactSheet',\n\t\tlabel: i18n.t('i18n.downloadPDF'),\n\t\tenableTest: linkHasContactSheet,\n\t\ttestOnSync: true,\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Download metadata in token link\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:token:download:metadata',\n\t\tlabel: i18n.t('i18n.downloadMetadata'),\n\t\tenableTest: linkHasMetadata,\n\t\ttestOnSync: true,\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Download asset proxy\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:token:download:proxy',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tenableTest: assetIsPresent,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, $(e.currentTarget).attr('data-nx-proxy')];\n\t\t},\n\t},\n\t/**\n\t * Download template customization in token link\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:token:download:templateCustomization',\n\t\tlabel: i18n.t('i18n.downloadTemplateCustomization'),\n\t\tenableTest: linkHasTemplateCustomization,\n\t\ttestOnSync: true,\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Download asset view\n\t * @action\n\t */\n\t{\n\t\tevent: 'share:token:download:view',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tenableTest: assetIsPresent,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, $(e.currentTarget).attr('data-nx-view')];\n\t\t},\n\t},\n];\n","import actions from '@netx/core-share/actions';\nimport {extendActions} from '@netx/core/lib/underscore-netx';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {\n\tfaArrowCircleDown,\n\tfaFilePdf,\n\tfaLink,\n\tfaLongArrowAltDown,\n\tfaShare,\n\tfaUsers,\n} from '@fortawesome/pro-solid-svg-icons';\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaArrowCircleDown: icon(faArrowCircleDown, iconOpts).html,\n\tfaFilePdf: icon(faFilePdf, iconOpts).html,\n\tfaLink: icon(faLink, iconOpts).html,\n\tfaLongArrowAltDown: icon(faLongArrowAltDown, iconOpts).html,\n\tfaShare: icon(faShare, iconOpts).html,\n\tfaUsers: icon(faUsers, iconOpts).html,\n};\n\nimport {canShareAssets, canUseShareMenu} from './enablers';\nimport {collectionNotEmpty} from '@netx/core/lib/netx-enablers';\nimport {assetsAreSelected} from '@netx/core-cart/enablers';\nimport {assetNotCheckedOut, assetIsPresent} from '@netx/core-asset/enablers';\n\n// Extend actions defined in core file\nlet newActions = extendActions(actions, [\n\t/** @action */\n\t{\n\t\tevent: 'share:menu',\n\t\ticon: icons.faShare,\n\t},\n\t/** @override */\n\t{\n\t\tevent: 'share:asset:createPDF',\n\t\ticon: icons.faFilePdf,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:asset:download',\n\t\ticon: icons.faArrowCircleDown,\n\t\tlabel: i18n.t('i18n.download'),\n\t\tuserLevel: 2,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:assetSet:directDownload',\n\t\ticon: icons.faLongArrowAltDown,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:assetSet:token:withOptions',\n\t\ticon: icons.faLink,\n\t},\n\t/** @override */\n\t{\n\t\tevent: 'share:cart:current:createPDF',\n\t\ticon: icons.faFilePdf,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:cart:download',\n\t\tenableTest: [collectionNotEmpty, assetsAreSelected],\n\t\twrapper(v, e) {\n\t\t\t// Share the current cart:\n\t\t\treturn [0, v, e];\n\t\t},\n\t\ticon: icons.faArrowCircleDown,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:assetSet:token',\n\t\ticon: icons.faLink,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:assetSet:directDownload',\n\t\ticon: icons.faLongArrowAltDown,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:assetSet:users',\n\t\ticon: icons.faUsers,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:assetSet:download:start',\n\t\ticon: icons.faLongArrowAltDown,\n\t},\n\t/** @override */\n\t{\n\t\tevent: 'share:cart:createPDF',\n\t\ticon: icons.faFilePdf,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:category:download',\n\t\ticon: icons.faArrowCircleDown,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:category:createPDF',\n\t\ticon: icons.faFilePdf,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:category:menu',\n\t\ticon: icons.faShare,\n\t},\n]);\n\n// New actions\nnewActions = newActions.concat([\n\t/** @action */\n\t{\n\t\tevent: 'share:cart:saved:download:check:selection',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tuserLevel: 2,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'share:cart:current:email',\n\t\tlabel: i18n.t('i18n.share'),\n\t},\n\t{\n\t\tevent: 'share:cart:current:download:check:selection',\n\t\tlabel: i18n.t('i18n.download'),\n\t\tenableTest: canShareAssets,\n\t\tuserLevel: 2,\n\t},\n\t{\n\t\tevent: 'share:cart:current:check:selection',\n\t\tlabel: i18n.t('i18n.share'),\n\t\tenableTest: canShareAssets,\n\t\tuserLevel: 2,\n\t},\n\t{\n\t\tevent: 'share:cart:saved:download',\n\t\t// TODO: DAM-12097 - Update translation in Clean 1.8\n\t\tlabel: i18n.t('i18n.download'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 2,\n\t\twrapper(v, e) {\n\t\t\tif (v.model) {\n\t\t\t\treturn [v.model, v, e];\n\t\t\t} else if (v.collection) {\n\t\t\t\treturn [v.collection.findCartModel() || v.collection.id, v, e];\n\t\t\t} else if (Netx.cart.gallery) {\n\t\t\t\treturn [\n\t\t\t\t\tNetx.cart.gallery.findCartModel() || Netx.cart.gallery.id,\n\t\t\t\t\tv,\n\t\t\t\t\te,\n\t\t\t\t];\n\t\t\t}\n\t\t},\n\t},\n\t{\n\t\tevent: 'share:assets', // TODO: add this action to core?\n\t\ticon: icons.faShare,\n\t\tlabel: i18n.t('i18n.share'),\n\t\tenableTest: [canShareAssets, assetsAreSelected],\n\t\tuserLevel: 2,\n\t\twrapper(v) {\n\t\t\t// Pass the current set of selected assets\n\t\t\treturn [Netx.cart.current];\n\t\t},\n\t},\n\t{\n\t\t// Share cart with other users\n\t\t// takes a saved cart model, and can have a different userlevel\n\t\t// so browsers can be allowed to share carts (but not other things) with other users.\n\t\tevent: 'share:cart:users',\n\t\tenableTest(v) {\n\t\t\treturn v.model && v.model.constructor.__name__ === 'SavedCart';\n\t\t},\n\t\tlabel: i18n.t('i18n.shareWithTeam'),\n\t\twrapper(v) {\n\t\t\treturn [v.model];\n\t\t},\n\t\tuserLevel: 1, // browser and above.\n\t},\n\t// TODO likely refactor to use share:asset:menu\n\t{\n\t\tevent: 'asset:share:menu',\n\t\ticon: icons.faShare,\n\t\tlabel: i18n.t('i18n.share'),\n\t\tuserLevel: 2,\n\t\twrapper(v) {\n\t\t\treturn [v.model.id];\n\t\t},\n\t\tenableTest: [assetNotCheckedOut, assetIsPresent, canUseShareMenu],\n\t},\n]);\n\nexport default newActions;\n","// import menus from '@netx/core-share/menus';\nimport Menu from '@netx/core/lib/netx-menu';\n\n// Override asset context menu\nlet menus = {\n\tassetSetShareOptions: new Menu({\n\t\tlabel: i18n.t('i18n.howWouldYouLikeToShare'),\n\t\tactions: [\n\t\t\t'share:assetSet:download:start', // trigger a direct download\n\t\t\t'share:assetSet:token:withOptions', // create a link\n\t\t],\n\t}),\n\tshareMenu: new Menu({\n\t\tlabel: i18n.t('i18n.howWouldYouLikeToShare'),\n\t\tactions: [\n\t\t\t'share:assetSet:token',\n\t\t\t'share:assetSet:users', // share between DAM users/groups\n\t\t],\n\t}),\n};\n\n// New menus\n_.extend(menus, {\n\tcollabCartShareActions: new Menu({\n\t\tactions: ['cart:saved:permissions:remove'],\n\t}),\n\taccessTokenActions: new Menu({\n\t\tactions: ['share:token:edit', 'share:token:delete'],\n\t}),\n});\n\nexport default menus;\n","/**\n * Feed Model\n *\n * Configures how the DAM will publish syndication data in RSS, iTunes or other feed formats.\n *\n * @class\n * @see Netx.Models.SystemMediaService\n * @extends Netx.Model\n */\nimport Base from '@netx/core/lib/netx-model';\n\nimport AssetModel from '@netx/core-asset/models/asset';\n\nimport {formatTypes, sourceTypes} from '../properties/feeds';\n\nexport default class Feed extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * Set the attribute backbone will look to as the id\n\t * @type {string}\n\t */\n\tget idAttribute() {\n\t\treturn 'cast_id';\n\t}\n\n\t/**\n\t * @property {object} defaults\n\t * @property {number} defaults.asset_total - Asset count for selected source (r/o)\n\t * @property {number} defaults.attr_1_id - Episode asset attribute (template ID) for episode title (<title>)\n\t * @property {number} defaults.attr_2_id - Episode asset attribute (template ID) for episode summary (<itunes:summary> or <description>)\n\t * @property {number} defaults.cast_id - Unique ID of this record\n\t * @property {string} defaults.categories - Deprecated field -- List of iTunes Connect content categories. (CSV?)\n\t * @property {string} defaults.copyright - Copyright statement for podcast\n\t * @property {string} defaults.description - Podcast description\n\t * @property {string} defaults.feedURL - Link to created podcast (read-only)\n\t * @property {number} defaults.format_type - Type of feed, from share/properties/feeds#formatTypes. (iTunes == 1)\n\t * @property {number} defaults.imageAssetId - Id of a seperate image asset (not a member of the selected podcast source) shown with the podcast in iTunes (<itunes:image>)\n\t * @property {number} defaults.item_id - Id of selected source\n\t * @property {string} defaults.item_id_label - Human-readable label for the selected source (r/o)\n\t * @property {number} defaults.item_type - Source type ID (category, saved cart, etc ... from share/properties/feeds#sourceTypes)\n\t * @property {string} defaults.item_type_label - Human-readable label for the selected source type (r/o)\n\t * @property {array} defaults.itunesCategories - list of iTunes category strings (replaces .categories field)\n\t * @property {string} defaults.itunes_subtitle - Podcast subtitle\n\t * @property {string} defaults.keywordAttr - Episode asset attribute for additional RSS keywords\n\t * @property {string} defaults.language - ISO 639 language code ('en-US', etc.) ... from app/properties/locales\n\t * @property {string} defaults.managing_editor - Email of the author or managing editor of the podcast\n\t * @property {number} defaults.owner - Manager of this podcast (for iTunes contact)\n\t * @property {number} defaults.ownerEmail - Email addr of owner (for iTunes contact)\n\t * @property {number} defaults.pubDateAttr - Episode asset attribute (template id) for rss <pubDate> field of that episode\n\t * @property {string} defaults.skip_days - Days of the week when aggregators should not poll the feed. (\"sunday,monday\" or similar)\n\t * @property {number} defaults.skip_hours - Hours of the day when aggregators should not poll the feed. (\"22,23,0,1,2\" or similar)\n\t * @property {number} defaults.subtitleAttr - Episode asset attribute for subtitle in iTunes (<itunes:subtitle>)\n\t * @property {string} defaults.title - Podcast title\n\t * @property {number} defaults.ttl - Time to live; how often should aggregators re-check this feed?\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\tasset_total: 0,\n\t\t\tattr_1_id: -100, // Name\n\t\t\tattr_2_id: -103, // Description\n\t\t\t//cast_id : 0, // don't default idAttribute\n\t\t\tcategories: '',\n\t\t\tcopyright: '',\n\t\t\tdescription: '',\n\t\t\tfeedURL: '',\n\t\t\tformat_type: formatTypes.itunes,\n\t\t\timageAssetId: 0,\n\t\t\titem_id: 0,\n\t\t\titem_id_label: '',\n\t\t\titem_type: sourceTypes.category.id,\n\t\t\titem_type_label: i18n.t('i18n.category'),\n\t\t\titunesCategories: [],\n\t\t\titunes_subtitle: '',\n\t\t\tkeywordAttr: 0,\n\t\t\tlanguage: 'en-US',\n\t\t\tmanaging_editor: '',\n\t\t\towner: '',\n\t\t\townerEmail: '',\n\t\t\tpubDateAttr: -111, // Creation Date\n\t\t\tskip_days: '',\n\t\t\tskip_hours: 0, // DEVNOTE: the API returns this as a number, but that's likely wrong.\n\t\t\tsubtitleAttr: 0,\n\t\t\ttitle: '',\n\t\t\tttl: 0,\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - The methods available on this model\n\t * @property {function|array} methods.create - The create method (post)\n\t * @property {function|array} methods.read - The read method (get)\n\t * @property {function|array} methods.update - The update method (put)\n\t * @property {function|array} methods.remove - The delete method (delete)\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @param {object} opts - Sync options */\n\t\t\tcreate: function(opts) {\n\t\t\t\treturn ['setPodcastObject', this.self()];\n\t\t\t},\n\t\t\t/** @param {object} opts - Sync options */\n\t\t\tupdate: function(opts) {\n\t\t\t\treturn ['setPodcastObject', this.self()];\n\t\t\t},\n\t\t\tread: ['getAllPodcastObjects', 'cast_id'],\n\t\t\tremove: ['deleteCast', 'cast_id'],\n\t\t};\n\t}\n\n\tget parsers() {\n\t\treturn {\n\t\t\tread: function(result, opts) {\n\t\t\t\treturn result[0];\n\t\t\t},\n\t\t\tcreate: function(id, opts) {\n\t\t\t\treturn {cast_id: id};\n\t\t\t},\n\t\t\tupdate: function(id, opts) {\n\t\t\t\treturn {};\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @override\n\t * @param {object} attrs Model attributes\n\t * @param {object} opts Model options\n\t */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\t/**\n\t\t * Stores the asset that we pull our feed image from\n\t\t * @memberOf Netx.Models.Feed\n\t\t * @alias imageAsset\n\t\t * @type {module:asset/models/asset}\n\t\t */\n\t\tthis.imageAsset = opts.imageAsset || new AssetModel();\n\t\tthis.addSubModel(this.imageAsset);\n\t}\n\n\t/**\n\t * Fetch the feed's image asset.\n\t * (If it can't be fetched, set a flag for our view.)\n\t * @method\n\t * @param {object} opts Request options\n\t */\n\tfetchImage(assetId, opts) {\n\t\tvar d = new $.Deferred();\n\t\tthis.imageAsset\n\t\t\t.set({\n\t\t\t\tassetId: assetId,\n\t\t\t})\n\t\t\t.fetch(opts)\n\t\t\t.then(\n\t\t\t\tfunction(result) {\n\t\t\t\t\tthis.imageNotFound = false;\n\t\t\t\t\td.resolveWith(this, [result]);\n\t\t\t\t},\n\t\t\t\tfunction(err) {\n\t\t\t\t\tif (err.code == 4003) {\n\t\t\t\t\t\t// Asset doesn't exist!\n\t\t\t\t\t\tthis.imageNotFound = true;\n\t\t\t\t\t\t// resolve anyway\n\t\t\t\t\t\treturn d.resolveWith(this);\n\t\t\t\t\t}\n\n\t\t\t\t\td.rejectWith(this, [err]);\n\t\t\t\t},\n\t\t\t);\n\t\treturn d.promise();\n\t}\n\n\t/**\n\t * The standard way for Netx.Models that contain a specific URL to return that URL.\n\t * @method\n\t * @returns {string} URL for this feed (undefined on new/unsaved feed models)\n\t */\n\tlinkUrl() {\n\t\treturn this.get('feedURL');\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Feed';\n\t}\n}\n","/**\n * This model represents a status report from the DAM regarding a sharable archive under construction\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class ShareStatus extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\tget methods() {\n\t\treturn {\n\t\t\tread: [\n\t\t\t\t'getProgressReport',\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.uuid || 0;\n\t\t\t\t},\n\t\t\t],\n\t\t\tsetProgressReportNotify: [\n\t\t\t\t'setProgressReportNotify',\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.uuid || null;\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t],\n\t\t\tunsetProgressReportNotify: [\n\t\t\t\t'setProgressReportNotify',\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.uuid || null;\n\t\t\t\t},\n\t\t\t\tfalse,\n\t\t\t],\n\t\t};\n\t}\n\n\tget defaults() {\n\t\treturn {\n\t\t\tpollWait: 1000, // milliseconds between checks\n\t\t\tcompleteUrl: '', // when job is completed, this is the location of finished file for download\n\t\t\tsize: 0, // byte size of the finished file, when ready.\n\t\t\tdetails: '', // information about the status -- shown to the user\n\t\t\tjobTitle: 'Downloading ...', // Title for the job -- shown to the user\n\t\t\tpercentComplete: 0, // For progress bar\n\t\t\tstartTime: 0, // timestamp of when the job started -- in millis from the epoch.\n\t\t\tprogressMessageCount: 0, // total number of messages generated\n\t\t\tprogressMessages: [], // the first N message objects generated; N is configured on the server.\n\n\t\t\t// also starring:\n\t\t\trunningTime: null, // not used?\n\t\t\trunningTimeLabel: '', // not used?\n\t\t\tsecondsToReload: null, // not used?\n\t\t\tnotifyOnComplete: false, // ignored\n\t\t\testimatedTime: null, // not used?\n\t\t\tincrement: 0, // not used?\n\t\t};\n\t}\n\n\t/**\n\t * Poll the DAM for the status of the share archive being prepared.\n\t *\n\t * @param {string} methodName substring for polling events\n\t * @param {string} uuid DAM job key\n\t * @param {function} doneTest polling finished when this returns true\n\t * @method\n\t */\n\tpoll(methodName, uuid, doneTest, opts = {}) {\n\t\tthis.uuid = uuid || this.uuid;\n\n\t\tdoneTest =\n\t\t\tdoneTest ||\n\t\t\tfunction() {\n\t\t\t\treturn this.get('percentComplete') >= 100;\n\t\t\t};\n\n\t\tvar eventStr = 'share:' + methodName;\n\n\t\t// A minor code tragedy: certain parts of the system depend on 'share:status:success',\n\t\t// and others on 'share:(methodName):complete' & 'share:(methodName):error' .\n\t\t// We are trying to unify on one system, but this disperate event naming\n\t\t// makes changing to the new polling system way more complicated.\n\t\t//\n\t\t// Workaround: for now we will ask the poller to use share:(methodname) as its prefix, and\n\t\t// translate those events to recreate the three 'share:status' events that this method used to emit.\n\t\tif (!opts.preventDefaultPollingStatus) {\n\t\t\t// TODO: dispatcher.retrigger(), for \"trigger a different event with the same arguments object\",\n\t\t\t// instead of this trigger.apply() stuff.\n\t\t\tthis.listenTo(dispatcher, eventStr + ':startedPolling', function() {\n\t\t\t\tdispatcher.trigger.apply(\n\t\t\t\t\tdispatcher,\n\t\t\t\t\t['share:status:polling'].concat(_.toArray(arguments)),\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t\tthis.listenTo(dispatcher, eventStr + ':polled', function() {\n\t\t\tdispatcher.trigger.apply(\n\t\t\t\tdispatcher,\n\t\t\t\t['share:status:success'].concat(_.toArray(arguments)),\n\t\t\t);\n\t\t});\n\t\tthis.listenTo(dispatcher, eventStr + ':stoppedPolling', function() {\n\t\t\tdispatcher.trigger.apply(\n\t\t\t\tdispatcher,\n\t\t\t\t['share:status:stoppedPolling'].concat(_.toArray(arguments)),\n\t\t\t);\n\t\t});\n\t\tthis.listenTo(dispatcher, eventStr + ':errorPolling', function(\n\t\t\tmessage,\n\t\t\terrObj,\n\t\t\tstatus,\n\t\t\tresponse,\n\t\t) {\n\t\t\tdispatcher.trigger(eventStr + ':error', errObj, status, response);\n\t\t});\n\t\tthis.listenTo(dispatcher, eventStr + ':donePolling', function() {\n\t\t\tdispatcher.trigger.apply(\n\t\t\t\tdispatcher,\n\t\t\t\t[eventStr + ':complete'].concat(_.toArray(arguments)),\n\t\t\t);\n\t\t\tdispatcher.trigger.apply(\n\t\t\t\tdispatcher,\n\t\t\t\t['share:status:complete'].concat(_.toArray(arguments)),\n\t\t\t);\n\n\t\t\tthis.stopListening(dispatcher, eventStr + ':startedPolling');\n\t\t\tthis.stopListening(dispatcher, eventStr + ':polled');\n\t\t\tthis.stopListening(dispatcher, eventStr + ':errorPolling');\n\t\t\tthis.stopListening(dispatcher, eventStr + ':donePolling');\n\t\t});\n\n\t\tthis.pollUntil(doneTest, eventStr);\n\n\t\t// dispatcher.trigger('share:status:polling');\n\t\t// this.fetch()\n\t\t// .then(function(){\n\t\t//\n\t\t// \tdispatcher.trigger('share:status:success');\n\t\t// \tif (!doneTest(this, methodName)){\n\t\t// \t\t// loop if we're not done yet\n\t\t// \t\t_.delay(\n\t\t// \t\t\t_.bind(function(){\n\t\t// \t\t\t\tthis.poll(methodName, uuid, doneTest);\n\t\t// \t\t\t},this),\n\t\t// \t\tthis.get('pollWait'));\n\t\t// \t} else {\n\t\t// \t\t// issue events if we're done.\n\t\t// \t\tdispatcher.trigger('share:'+methodName+':complete');\n\t\t// \t\tdispatcher.trigger('share:status:complete');\n\t\t// \t}\n\t\t//\n\t\t// }, function(message, err){\n\t\t// \tdispatcher.trigger('share:'+methodName+':error', err, this);\n\t\t// });\n\t}\n\n\t/**\n\t * Stop the current polling, and tell the DAM to send us a message when the job finishes.\n\t * @method\n\t */\n\temailWhenDone() {\n\t\treturn this.setProgressReportNotify().then(function() {\n\t\t\tthis.stopPolling();\n\t\t\treturn this._polling ? this._polling.promise() : this;\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ShareStatus';\n\t}\n}\n","/**\n * Access Token collection\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/accessToken';\n\nimport PagerModel from '@netx/core-app/models/pager';\nimport SorterModel from '@netx/core-app/models/sorter';\n\nexport default class AccessTokens extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetAllApprovedTokens: 'Loading completed approvals',\n\t\t\tgetAllPendingTokens: 'Loading pending approvals',\n\t\t\tgetUserTokens: 'Loading shared links',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetAllApprovedTokens: 'Loaded completed approvals',\n\t\t\tgetAllPendingTokens: 'Loaded pending approvals',\n\t\t\tgetUserTokens: 'Loaded shared links',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch access tokens\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\t// Pending\n\t\t\t\tif (this.pending) {\n\t\t\t\t\tif (this.all) {\n\t\t\t\t\t\treturn ['getAllPendingTokens', this.pager.getPageDTO()];\n\t\t\t\t\t}\n\t\t\t\t\t// Just ours\n\t\t\t\t\treturn ['getAllPendingTokens', this.pager.getPageDTO()];\n\t\t\t\t\t// TODO: We need to fix this in the backend so that pending approvals are set by id and not user emails\n\t\t\t\t\t//['getUserPendingTokens', this.userId ? this.userId : Netx.user.profile.id ];\n\t\t\t\t}\n\n\t\t\t\t// Non-pending\n\t\t\t\tif (this.all) {\n\t\t\t\t\treturn ['getAllApprovedTokens', this.pager.getPageDTO()];\n\t\t\t\t}\n\n\t\t\t\t// All\n\t\t\t\tif (Netx.getUser().get('type') === 9) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t'getAllTokens',\n\t\t\t\t\t\tthis.filterStr,\n\t\t\t\t\t\tthis.sorter.getSortDTO(),\n\t\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\t// Just ours\n\t\t\t\treturn [\n\t\t\t\t\t'getUserTokens',\n\t\t\t\t\tthis.userId ? this.userId : Netx.getUser().id,\n\t\t\t\t\tthis.filterStr,\n\t\t\t\t\tthis.sorter.getSortDTO(),\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} parsers - Collection parsers\n\t * @property {function} parsers.read - Parse fetch of access tokens\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * Avoid overwriting the password fields of our existing objects with the string '********' that this call returns\n\t\t\t * @function\n\t\t\t * @param {object} response Response\n\t\t\t * @param {object} opts Request options\n\t\t\t * @returns {array} Token objects with password field removed.\n\t\t\t */\n\t\t\tread(response, opts) {\n\t\t\t\t_.each(response.results, token => {\n\t\t\t\t\tdelete token.password;\n\t\t\t\t});\n\t\t\t\treturn response.results;\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Are we fetching just our tokens, or everybody's tokens? (Non-admins can only fetch their own tokens.)\n\t\t * @type {boolean}\n\t\t * @default\n\t\t */\n\t\tthis.all = opts.all === true;\n\n\t\t/**\n\t\t * Are we fetching pending tokens or current tokens?\n\t\t * @type {boolean}\n\t\t * @default\n\t\t */\n\t\tthis.pending = opts.pending === true;\n\n\t\t/**\n\t\t * The user whose tokens we are fetching. (Non-admins should not need to touch this.)\n\t\t * 0 == 'the current user's ID'\n\t\t * @type {number}\n\t\t * @default\n\t\t */\n\t\tthis.userId = opts.userId || 0;\n\n\t\t/**\n\t\t * Paging model\n\t\t * @memberOf Netx.Collections.AssetRequests\n\t\t * @alias pager\n\t\t * @type {Netx.Models.Pager}\n\t\t */\n\t\tthis.pager = new PagerModel(\n\t\t\t{\n\t\t\t\tpageSize: opts.pageSize || 20,\n\t\t\t\tpagesToDisplay: 10,\n\t\t\t\troutesToPage: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcollection: this,\n\t\t\t},\n\t\t);\n\t\t/**\n\t\t * Sorting model\n\t\t * @memberof module:share/collections/accessTokens\n\t\t * @alias sorter\n\t\t * @type {module:app/models/sorter}\n\t\t */\n\t\tthis.sorter = new SorterModel(\n\t\t\t{\n\t\t\t\tfield: opts.sortField || 'title',\n\t\t\t\torder: opts.sortOrder || 'desc',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcollection: this,\n\t\t\t\tsortableFields: ['title', 'userLabel', 'timesUsed'],\n\t\t\t},\n\t\t);\n\t\tthis.addSubModel(this.sorter);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AccessTokens';\n\t}\n}\n","/**\n * RSS/iTunes/Atom/MRSS Feeds Collection\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/feed';\n\nexport default class Feeds extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @property {object} methods - Collection RPC methods\n\t * @property {method} methods.read - Fetch feeds\n\t * @property {method} methods.getAllFeedIds - Fetch the IDs of all feed objects\n\t * @property {method} methods.getFeeds - Fetch feeds by id\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * Two-step method for getting the system feeds list:\n\t\t\t * @method\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tread(opts) {\n\t\t\t\treturn this.getAllFeedIds(opts).then(ids => this.getFeeds(ids, opts));\n\t\t\t},\n\t\t\t// DEVNOTE:\n\t\t\t// The existing API calls have very confusing names (to me at least):\n\t\t\t// * 'podcast' objects describe RSS feeds of at least three other types besides 'podcast',\n\t\t\t// * 'getAllPodcasts' returns IDs, not objects\n\t\t\t// * 'getAllPodcastObjects' returns just the requested objects, not \"all\"\n\t\t\t//\n\t\t\t// ... so I've renamed these methods to better describe what the enclosed calls actually do.\n\t\t\t//\n\t\t\t// Proposed new API to address these & other issues: https://kb.netx.net/display/DEV/Proposed+new+Feeds+API\n\t\t\t/** @method */\n\t\t\tgetAllFeedIds: ['getAllPodcasts'],\n\t\t\t/**\n\t\t\t * @method\n\t\t\t * @param {array} ids Feed IDs\n\t\t\t * @param {object} opts Request options\n\t\t\t */\n\t\t\tgetFeeds(ids, opts) {\n\t\t\t\treturn ['getAllPodcastObjects', ids];\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Feeds';\n\t}\n}\n","/**\n * ShareMediaService Model\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class ShareMediaService extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {string} defaults.name - The default system media service name (system)\n\t * @property {array} defaults.label - The default system media service label (UI)\n\t * @property {number} defaults.authenticated - The default system media service authentication status\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\tname: '',\n\t\t\tlabel: '',\n\t\t\tauthenticated: false,\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods \t\t\t- The methods available on this model\n\t * @property {function|array} methods._fetch\t\t- The read method (get)\n\t * @property {function|array} methods._update\t\t- The update method (put)\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t// authenticate: ['authenticateMediaService', 'id'], // Removed from API.\n\t\t\t// TODO: change assetIds from raw property to client-only attribute.\n\t\t\tshare: ['shareToMediaService', 'id', 'assetIds'],\n\t\t};\n\t}\n\n\t/**\n\t *\n\t */\n\tget parsers() {\n\t\treturn {\n\t\t\tauthenticate: function(data) {\n\t\t\t\tconsole.log(data);\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ShareMediaService';\n\t}\n}\n","export const allowed = ['Brightcove', 'YouTube'];\n","/**\n * ShareMediaServices Collection\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/shareMediaService';\n\nimport {allowed as allowedServices} from '../properties/mediaServices';\n\nexport default class ShareMediaServices extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @type {object}\n\t */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetMediaServices: 'Checking media services',\n\t\t};\n\t}\n\n\t/** @type {object} */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetMediaServices: 'Checked media services',\n\t\t};\n\t}\n\n\t/**\n\t * @property {object} methods - Model RPC methods\n\t * @property {method} methods.read - Fetch all media services\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\tread: ['getMediaServices'],\n\t\t};\n\t}\n\n\t/**\n\t * Have authenticated media service(s)\n\t * @type {boolean}\n\t */\n\tget authenticated() {\n\t\treturn this.models.some(\n\t\t\tservice =>\n\t\t\t\tallowedServices.includes(service.get('name')) &&\n\t\t\t\tservice.get('authenticated') === true,\n\t\t);\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\t}\n\n\t/**\n\t * @method\n\t * @return {array} Authenticated services\n\t */\n\tgetAuthenticatedServices() {\n\t\treturn this.filter(\n\t\t\tservice =>\n\t\t\t\tallowedServices.includes(service.get('name')) &&\n\t\t\t\tservice.get('authenticated'),\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ShareMediaServices';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/shareStatusView.html';\nimport Netx from '@netx/core/bootstrap';\nimport _ from 'underscore';\n\nexport default class ShareStatusView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'click [data-nx-control=\"emailWhenDone\"]': 'disableTarget',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.shareStatus');\n\t\topts.id = opts.id || 'share-status-view';\n\t\topts.modalOptions = _.extend(\n\t\t\t{\n\t\t\t\tblocking: true,\n\t\t\t},\n\t\t\topts.modalOptions,\n\t\t);\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// Debounced methods\n\t\tthis.escape = _.debounce(this.escape, 10);\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'share:status:complete share:status:donePolling share:status:stoppedPolling share:rpc:error',\n\t\t\t() => {\n\t\t\t\tthis.whenShown.then(this.hide);\n\t\t\t},\n\t\t)\n\t\t\t// Make this go away if the user has opted to be notifed when done\n\t\t\t.listenTo(dispatcher, 'share:poll:deferred', (statusModel) => {\n\t\t\t\tif (this.model && statusModel && statusModel.uuid === this.model.uuid) {\n\t\t\t\t\tthis.whenShown.then(this.hide);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'change:details', this.detailsUpdated)\n\t\t\t.listenTo(this.model, 'change:jobTitle', this.titleUpdated)\n\t\t\t.listenTo(this.model, 'change:percentComplete', this.progressUpdated);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additonal template vars\n\t\t_.extend(this.templateVars, {\n\t\t\t// Make sure that we have a user\n\t\t\t// Token downloads have no user and can't be \"emailed when done\"\n\t\t\tuserExists: Netx.getUserLevel() > 0 ? true : false,\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$details = this.$('.details');\n\t\tthis.$progress = this.$('.progress');\n\t\tthis.$progressBar = this.$progress.find('.progress-bar');\n\t\tthis.$title = this.$('.title .text');\n\t}\n\n\t/**\n\t * @method\n\t * @fires module:share#share:status:emailWhenDone\n\t */\n\tescape() {\n\t\t// DAM-7502 - Notify on complete if escape key is pressed\n\t\t// Not already opting to be notified\n\t\tif (!this.model.get('notifyOnComplete')) {\n\t\t\tdispatcher.trigger('share:status:emailWhenDone', this.model.uuid);\n\t\t}\n\t}\n\n\t/**\n\t * @method\n\t * @param {Netx.Models.ShareStatus} model Share ststus model\n\t * @param {string} details Job details\n\t */\n\tdetailsUpdated(model, details) {\n\t\tthis.$details && this.$details.html(details);\n\t}\n\n\t/**\n\t * @method\n\t * @param {Netx.Models.ShareStatus} model Share ststus model\n\t * @param {number} percentComplete Job percent complete\n\t */\n\tprogressUpdated(model, percentComplete) {\n\t\tthis.$progressBar && this.$progressBar.width(percentComplete + '%');\n\t}\n\n\t/**\n\t * @method\n\t * @param {Netx.Models.ShareStatus} model Share ststus model\n\t * @param {string} jobTitle Job title\n\t */\n\ttitleUpdated(model, jobTitle) {\n\t\tthis.$title && this.$title.html(jobTitle);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ShareStatusView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-share/views/shareStatusView';\n\nexport default class ShareStatusView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.id = opts.id || 'share-status';\n\t\tsuper(opts);\n\t}\n}\n","export default {\n\t/**\n\t * Container for shareOptionsView\n\t * @const\n\t * @type {string}\n\t * @default\n\t */\n\tCONTAINER_ID: 'share',\n\t/**\n\t * Container for shareStatusView\n\t * @const\n\t * @type {string}\n\t * @default\n\t */\n\tSTATUS_CONTAINER_ID: 'share-status',\n\t/**\n\t * Should the TokenAssets collection fetch miniAssets instead of full Assets?\n\t * @const\n\t * @type {string}\n\t * @default\n\t */\n\tTOKEN_ASSETS_MINI: false,\n};\n","import DownloadRequestRoutes from '@netx/core-download-request/routes';\n\nexport default {\n\t...DownloadRequestRoutes,\n\t/**\n\t * Share tokens\n\t * @route\n\t * @fires module:share#share:tokens:routed\n\t */\n\t'share/tokens'() {\n\t\tdispatcher.trigger('share:tokens:routed');\n\t},\n};\n","import {DOWNLOAD_REQUEST_EVENT, DOWNLOAD_REQUEST_ROUTES} from './actions';\n\nexport const downloadRequestRoutes = <const>{\n\t[DOWNLOAD_REQUEST_ROUTES.LIST]: DOWNLOAD_REQUEST_EVENT.LIST,\n\t[`${DOWNLOAD_REQUEST_ROUTES.VIEW}/:id`]: DOWNLOAD_REQUEST_EVENT.VIEW,\n\t// TODO: approve/reject routes?\n\t// 'share/request/approve/:id/': ,\n\t// 'share/request/reject/:id/': ,\n};\n\nexport default downloadRequestRoutes;\n","import React, {useMemo, useCallback} from 'react';\nimport clsx from 'clsx';\nimport {dispatcher} from '@netx/core/bootstrap';\nimport {i18n} from '@netx/core/i18n';\n\nimport {withStyles, createStyles, WithStyles} from '@mui/styles';\nimport {ArrowFocusTrapItemActions} from '@netx/core-components/ArrowFocusTrap';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {Checkbox} from '@mui/material';\nimport {useTableRowSelectionProvider} from '@netx/core-components/VirtualizedTable';\nimport Tooltip from '@netx/core-components/Tooltip';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faImage} from '@fortawesome/pro-solid-svg-icons';\n\nimport AssetImage from '@netx/core-asset/components/AssetImage';\nimport {CellProps} from '@netx/core-components/VirtualizedTable';\n\nimport type {DownloadRequestApproval} from '../../../types';\nimport {APPROVAL_STATUS} from '../../../constants';\n\nconst gotoAsset = (id: number) => {\n\tdispatcher.trigger('asset:route', id, true);\n};\n\nconst cellImageStyles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\theight: 43,\n\t\t\twidth: 43,\n\t\t\tdisplay: 'flex',\n\t\t\tmargin: `0 0 0 10px`,\n\t\t\toutlineColor: '#000',\n\t\t},\n\t\tclickable: {\n\t\t\tcursor: 'pointer',\n\t\t},\n\t});\n\nconst CellImage = withStyles(cellImageStyles)(\n\t({\n\t\tclasses,\n\t\trow,\n\t\ttabIndex,\n\t\t...props\n\t}: WithStyles<typeof cellImageStyles> &\n\t\tCellProps<DownloadRequestApproval> & {tabIndex?: number}) => {\n\t\tconst handleKeyDown = useCallback(\n\t\t\t(event: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\t\tswitch (event.key) {\n\t\t\t\t\tcase ' ':\n\t\t\t\t\tcase 'Enter':\n\t\t\t\t\t\t// TODO: this is still making it to the document listener\n\t\t\t\t\t\t// and results in the checkbox being toggled\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tgotoAsset(row.original.id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\t[row.original.id],\n\t\t);\n\n\t\tconst handleClick = useCallback(\n\t\t\t(event) => {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tgotoAsset(row.original.id);\n\t\t\t},\n\t\t\t[row.original.id],\n\t\t);\n\n\t\tif (!row.original.asset)\n\t\t\treturn (\n\t\t\t\t<div className={classes.root}>\n\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\ticon={faImage}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontSize: 32,\n\t\t\t\t\t\t\topacity: 0.25,\n\t\t\t\t\t\t\tmargin: 'auto',\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\treturn (\n\t\t\t<Tooltip title={i18n.t('i18n.viewAsset')}>\n\t\t\t\t<div\n\t\t\t\t\tclassName={clsx(classes.root, {[classes.clickable]: true})}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\ttabIndex={tabIndex}\n\t\t\t\t>\n\t\t\t\t\t<AssetImage\n\t\t\t\t\t\tdisableXHR\n\t\t\t\t\t\thideShadow\n\t\t\t\t\t\tforceImageSize=\"thumb\"\n\t\t\t\t\t\tasset={\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tassetId: row.original.id,\n\t\t\t\t\t\t\t\tname: row.original.asset?.name || '',\n\t\t\t\t\t\t\t\tthumbUrl: row.original.asset?.thumbUrl || '',\n\t\t\t\t\t\t\t} as any\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Tooltip>\n\t\t);\n\t},\n);\n\nconst CheckboxCellPrimitive = (props: CellProps<DownloadRequestApproval>) => {\n\tconst {column, readOnly, row} = props;\n\n\tconst {state, toggleRowSelected} = useTableRowSelectionProvider();\n\n\tlet readOnlyChecked = false;\n\tif (\n\t\trow.original.approvalStatus === APPROVAL_STATUS.PENDING_APPROVAL &&\n\t\t!row.original.asset\n\t) {\n\t\treadOnlyChecked = true;\n\t} else {\n\t\treadOnlyChecked = row.original.approvalStatus === APPROVAL_STATUS.APPROVED;\n\t}\n\n\tconst _readOnly =\n\t\t!row.original.asset ||\n\t\treadOnly ||\n\t\trow.original.approvalStatus !== APPROVAL_STATUS.PENDING_APPROVAL;\n\n\treturn useMemo(() => {\n\t\tconst checked =\n\t\t\tstate.allRowsSelected ||\n\t\t\t(state.rowsDeselected.length &&\n\t\t\t\t!state.rowsDeselected.includes(row.original.id)) ||\n\t\t\tstate.rowsSelected.includes(row.original.id);\n\n\t\treturn (\n\t\t\t<ArrowFocusTrapItemActions index={row.index} style={{display: 'flex'}}>\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={_readOnly ? readOnlyChecked : checked}\n\t\t\t\t\tdisabled={_readOnly}\n\t\t\t\t\tid={`${column.id}_${row.original.id}`}\n\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\tif (_readOnly) return;\n\t\t\t\t\t\ttoggleRowSelected(row.original.id, event.target.checked);\n\t\t\t\t\t}}\n\t\t\t\t\treadOnly={_readOnly}\n\t\t\t\t/>\n\t\t\t\t<CellImage {...props} />\n\t\t\t</ArrowFocusTrapItemActions>\n\t\t);\n\t}, [\n\t\ttoggleRowSelected,\n\t\tstate.allRowsSelected,\n\t\tstate.rowsSelected,\n\t\tstate.rowsDeselected,\n\t\trow.index,\n\t\trow.original.asset,\n\t\trow.original.id,\n\t\tcolumn.id,\n\n\t\treadOnlyChecked,\n\t\t_readOnly,\n\t]);\n};\n\nexport const CheckboxCell = CheckboxCellPrimitive;\nexport default CheckboxCell;\n","export const ACTIONS = <const>{\n\tSET_DATA: 'SET_DATA',\n\tSET_VISIBLE_INDEX: 'SET_VISIBLE_INDEX',\n};\n","import {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nimport type {DownloadRequestApproval} from '../../types';\n\nexport type DownloadRequestDetailIndexed = DownloadRequestApproval & {\n\tindex: number;\n};\n\nexport type State = {\n\tdata: DownloadRequestDetailIndexed[];\n\ttotal: number;\n\ttoalLoaded: number;\n\tvisibleIndex: number;\n\tpage: number;\n\tready: boolean;\n};\n\nexport const initialState: State = {\n\tdata: [],\n\tready: false,\n\ttotal: 0,\n\ttoalLoaded: 0,\n\tvisibleIndex: 0,\n\tpage: 1,\n};\n\nconst reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.SET_DATA:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdata: action.data,\n\t\t\t\ttotal: action.total,\n\t\t\t\ttoalLoaded: action.data.length,\n\t\t\t\tready: action.ready,\n\t\t\t};\n\t\tcase ACTIONS.SET_VISIBLE_INDEX:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tvisibleIndex: action.index,\n\t\t\t\tpage: action.page,\n\t\t\t};\n\t}\n};\n\nexport default reducer;\n","import {Dispatch} from 'react';\n\nimport {ACTIONS} from './constants';\nimport {State} from './reducer';\n\nexport type Action =\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_DATA;\n\t\t\tdata: State['data'];\n\t\t\ttotal: number;\n\t\t\tready: boolean;\n\t }\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_VISIBLE_INDEX;\n\t\t\tindex: State['visibleIndex'];\n\t\t\tpage: State['page'];\n\t };\n\nexport const Actions = (dispatch: Dispatch<Action>) => ({\n\tsetVisibleIndex: (\n\t\tindex: State['visibleIndex'],\n\t\tpage: State['page'],\n\t\tvisibleEndIndex: number,\n\t) => dispatch({type: ACTIONS.SET_VISIBLE_INDEX, index, page}),\n});\n\nexport default Actions;\n","import NetxQueryDam, {\n\tSuccessResponse,\n\tQueryPager,\n\tQuerySort,\n\tQUERY_SORT_ORDER,\n} from '@netx/core/lib/netx-query-dam';\nimport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {FETCH_ERROR_CODES} from '../errors';\n\nimport type {DownloadRequestId, DownloadRequestApproval} from '../types';\nimport {PAGE_SIZE} from '../constants';\n\nexport const GET_DOWNLOAD_REQUEST_DETAILS_SORT_FIELDS = ['orderby'] as const;\n\nexport type GetDownloadRequestApprovalsFilter = {\n\tdownloadRequestId: number;\n};\n\nexport type GetDownloadRequestApprovalsSort = QuerySort<\n\ttypeof GET_DOWNLOAD_REQUEST_DETAILS_SORT_FIELDS[number]\n>;\n\n/**\n * `getDownloadRequestApprovals` request params\n * (what is used to send to server)\n */\nexport type GetDownloadRequestApprovalsRequestOptions = {\n\tid: DownloadRequestId;\n\tstartIndex?: number;\n\tstopIndex?: number;\n};\n\n/**\n * `getDownloadRequestApprovals` request\n * (what gets sent to the server)\n */\nexport type GetDownloadRequestApprovalsRequest = [\n\tGetDownloadRequestApprovalsFilter,\n\tGetDownloadRequestApprovalsSort,\n\tQueryPager,\n];\n\n/**\n * `getDownloadRequestApprovals` response\n * (what comes back from the server)\n */\nexport type GetDownloadRequestApprovalsResponse =\n\tSuccessResponse<GetDownloadRequestApprovalsResult>;\n\n/**\n * `getDownloadRequestApprovals` result\n * (what is utilized from the server response)\n */\nexport type GetDownloadRequestApprovalsResult = {\n\tresults: DownloadRequestApproval[]; // TODO: we do not get a top level id\n\tsize: number;\n\tstartIndex: number;\n};\n\n/** the error that is thrown from `netxQueryDam` */\nexport type GetDownloadRequestApprovalsQueryError = QueryError<\n\ttypeof FETCH_ERROR_CODES[number]\n>;\n\nexport const getDownloadRequestApprovalsEndpoint =\n\t'getDownloadRequestApprovals';\n\n/**\n * Get download request details\n */\nexport const getDownloadRequestApprovals = async (\n\t{\n\t\tid,\n\t\tstartIndex = 0,\n\t\tstopIndex = PAGE_SIZE,\n\t}: GetDownloadRequestApprovalsRequestOptions,\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetDownloadRequestApprovalsRequest = [\n\t\t{\n\t\t\tdownloadRequestId: id,\n\t\t},\n\t\t{\n\t\t\tfield: 'orderby',\n\t\t\torder: QUERY_SORT_ORDER.ASCENDING,\n\t\t},\n\t\t{\n\t\t\tstartIndex,\n\t\t\tsize: stopIndex - startIndex,\n\t\t},\n\t];\n\n\treturn client\n\t\t.post<GetDownloadRequestApprovalsResponse>(\n\t\t\tgetDownloadRequestApprovalsEndpoint,\n\t\t\trequestParams,\n\t\t\t{signal},\n\t\t)\n\t\t.then((response) => {\n\t\t\tresponse.data.result.results = response.data.result.results.map(\n\t\t\t\t(result, index) => ({\n\t\t\t\t\t...result,\n\t\t\t\t\tid: result.asset?.id || -1,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn response.data.result;\n\t\t});\n};\n\nexport default getDownloadRequestApprovals;\n","import {\n\tuseInfiniteQuery,\n\tQueryFunctionContext,\n\tUseInfiniteQueryOptions,\n} from 'react-query';\nimport {\n\tGetDownloadRequestApprovalsQueryError,\n\tGetDownloadRequestApprovalsResult,\n\tGetDownloadRequestApprovalsRequestOptions,\n\tgetDownloadRequestApprovals,\n} from '../getDownloadRequestApprovals';\n\nimport {getNextPageParam} from '@netx/core-components/VirtualizedList/react-query';\n\ntype GetDownloadRequestApprovalsQueryKey = Pick<\n\tGetDownloadRequestApprovalsRequestOptions,\n\t'id'\n>;\n\ntype GetDownloadRequestApprovalsPageParam = {\n\tstartIndex: number;\n\tstopIndex: number;\n};\n\ntype ReactQueryOptions = Omit<\n\tUseInfiniteQueryOptions<\n\t\tGetDownloadRequestApprovalsResult,\n\t\tGetDownloadRequestApprovalsQueryError\n\t>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * react-query wrapper for `getDownloadRequestApprovals`\n * @param queryKeyParams\n * @param options\n */\nexport const reactQueryGetDownloadRequestApprovals = (\n\tqueryKeyParams: GetDownloadRequestApprovalsQueryKey,\n\toptions?: ReactQueryOptions,\n) => {\n\tconst getDownloadRequestApprovalsQuery = useInfiniteQuery<\n\t\tGetDownloadRequestApprovalsResult,\n\t\tGetDownloadRequestApprovalsQueryError\n\t>({\n\t\tqueryKey: ['getDownloadRequestApprovals', queryKeyParams],\n\t\tqueryFn: ({\n\t\t\tqueryKey,\n\t\t\tpageParam,\n\t\t\tsignal,\n\t\t}: QueryFunctionContext<\n\t\t\t[string, GetDownloadRequestApprovalsQueryKey],\n\t\t\tGetDownloadRequestApprovalsPageParam\n\t\t>) => getDownloadRequestApprovals({...pageParam, ...queryKey[1]}, signal),\n\t\tgetNextPageParam,\n\t\t...options,\n\t});\n\n\treturn getDownloadRequestApprovalsQuery;\n};\n\nexport default reactQueryGetDownloadRequestApprovals;\n","import {i18n} from '@netx/core/i18n';\nimport type {\n\tDownloadRequestCustomJustificationForm,\n\tDownloadRequestDetailsRaw,\n} from '../../types';\n\n/**\n * For decoding html entities (like ` `, `"`, and `'`)\n * @param str\n * @return Decoded string\n */\nexport const decodeHTML = function (str: string) {\n\tconst txt = document.createElement('textarea');\n\ttxt.innerHTML = str;\n\treturn txt.value;\n};\n\nexport const stripHTML = (str: string) => str.replace(/(<([^>]+)>)/gi, '');\n\nexport const cleanString = (str: string) => decodeHTML(stripHTML(str));\n\nexport const getFormItem = (\n\tcustomForm: DownloadRequestCustomJustificationForm[],\n\tkey: string,\n\tkeyPieces: string[],\n) => {\n\treturn customForm.find((form) => {\n\t\tif (form.label?.key === key) return true;\n\t\tif (\n\t\t\tkeyPieces.length < 2 ||\n\t\t\t!Array.isArray(form.value) ||\n\t\t\tform.label.key !== keyPieces[0]\n\t\t)\n\t\t\treturn false;\n\t\treturn (form.value as any[]).some((val) => {\n\t\t\tif (typeof val === 'string') return val === keyPieces.slice(1).join('-');\n\t\t\treturn val.key === keyPieces.slice(1).join('-');\n\t\t});\n\t});\n};\n\nexport const getValue = (\n\tformItem: DownloadRequestCustomJustificationForm,\n\tvalue: string,\n\tkeyPieces: string[],\n) => {\n\tif (!Array.isArray(formItem.value) || ['true', 'false'].includes(value))\n\t\treturn value;\n\tconst formValue = (formItem.value as any[]).find((formValue) => {\n\t\tif (typeof formValue === 'string') return value === formValue;\n\t\treturn (\n\t\t\tformValue.key === value || formValue.key === keyPieces.slice(1).join('-')\n\t\t);\n\t});\n\treturn formValue ? formValue?.en || formValue : value;\n};\n\nexport const parseCustomJustificationFormData = (\n\tcustomForm: DownloadRequestCustomJustificationForm[],\n\tjustification: DownloadRequestDetailsRaw['justification'],\n) => {\n\t// Need to utilize and index so we can maintain the original custom form order\n\t// the server sends the justification info in alphabetical order of the key\n\tconst data: {\n\t\tlabel: string;\n\t\tvalue: string;\n\t\tindex: number;\n\t}[] = [];\n\n\tObject.entries(justification).forEach(([key, value], index) => {\n\t\t// No custom form\n\t\tif (!customForm.length) {\n\t\t\treturn data.push({\n\t\t\t\tlabel:\n\t\t\t\t\tkey === 'justification'\n\t\t\t\t\t\t? i18n.t('i18n.justification')\n\t\t\t\t\t\t: cleanString(key),\n\t\t\t\tvalue,\n\t\t\t\tindex,\n\t\t\t});\n\t\t}\n\n\t\t// Need to do some fun matching in some cases\n\t\tconst keyPieces = key.split('-');\n\n\t\tconst formItem = getFormItem(customForm, key, keyPieces);\n\t\tif (!formItem) {\n\t\t\treturn data.push({\n\t\t\t\tlabel: cleanString(key),\n\t\t\t\tvalue,\n\t\t\t\tindex,\n\t\t\t});\n\t\t}\n\n\t\tdata.push({\n\t\t\tlabel: cleanString(formItem.label.en || formItem.label.key || key),\n\t\t\tvalue: cleanString(getValue(formItem, value, keyPieces)),\n\t\t\tindex: customForm.indexOf(formItem),\n\t\t});\n\t});\n\n\treturn data.sort((a, b) => a.index - b.index).map(({index, ...d}) => d);\n};\nexport default parseCustomJustificationFormData;\n","import type {\n\tDownloadRequestCustomJustificationForm,\n\tDownloadRequestCustomJustificationFormRaw,\n} from '../../types';\n\nexport const parseInCustomJustificationForm = (\n\tcustomJustificationForm: DownloadRequestCustomJustificationFormRaw,\n): DownloadRequestCustomJustificationForm[] => {\n\treturn JSON.parse(customJustificationForm.formData.replace(/\\\\\\\"/g, '\"'));\n};\nexport default parseInCustomJustificationForm;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport type {DownloadRequestCustomJustificationFormRaw} from '../types';\n\nimport {parseInCustomJustificationForm} from './parsers';\n\nexport const CUSTOM_JUSTIFICATION_FORM_NAME = 'downloadJustification';\n\n/**\n * `getCustomJustificationForm` request params\n * (what is used to send to server)\n */\nexport type GetCustomJustificationFormRequestOptions = {};\n\n/**\n * `getCustomJustificationForm` request\n * (what gets sent to the server)\n */\nexport type GetCustomJustificationFormRequest = [\n\ttypeof CUSTOM_JUSTIFICATION_FORM_NAME,\n];\n\n/**\n * `getCustomJustificationForm` response\n * (what comes back from the server)\n */\nexport type GetCustomJustificationFormResponse = SuccessResponse<\n\tGetCustomJustificationFormResult\n>;\n\n/**\n * `getCustomJustificationForm` result\n * (what is utilized from the server response)\n */\nexport type GetCustomJustificationFormResult = DownloadRequestCustomJustificationFormRaw | null;\n\nexport const getCustomJustificationFormEndpoint = 'getCustomFormByName';\n\n/**\n * Get download request details\n */\nexport const getCustomJustificationForm = async () => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetCustomJustificationFormRequest = [\n\t\tCUSTOM_JUSTIFICATION_FORM_NAME,\n\t];\n\n\treturn client\n\t\t.post<GetCustomJustificationFormResponse>(\n\t\t\tgetCustomJustificationFormEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => {\n\t\t\tif (response.data.result == null) return [];\n\t\t\treturn parseInCustomJustificationForm(response.data.result);\n\t\t});\n};\n\nexport default getCustomJustificationForm;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nimport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {FETCH_ERROR_CODES} from '../errors';\n\nimport type {ReturnPromiseType} from '@netx/core/typings';\n\nimport {\n\tDownloadRequestId,\n\tDownloadRequestDetails,\n\tDownloadRequestDetailsRaw,\n} from '../types';\n\nimport getCustomJustificationForm from './getCustomJustificationForm';\nimport {parseCustomJustificationFormData} from './parsers';\n\n/**\n * `getDownloadRequestDetails` request params\n * (what is used to send to server)\n */\nexport type GetDownloadRequestDetailsRequestOptions = {\n\tid: DownloadRequestId;\n};\n\n/**\n * `getDownloadRequestDetails` request\n * (what gets sent to the server)\n */\nexport type GetDownloadRequestDetailsRequest = [\n\tGetDownloadRequestDetailsRequestOptions['id'],\n];\n\n/**\n * `getDownloadRequestDetails` response\n * (what comes back from the server)\n */\nexport type GetDownloadRequestDetailsResponse =\n\tSuccessResponse<DownloadRequestDetailsRaw>;\n\n/**\n * `getDownloadRequestDetails` result\n * (what is utilized from the server response)\n */\nexport type GetDownloadRequestDetailsResult = ReturnPromiseType<\n\ttypeof getDownloadRequestDetails\n>;\n\n/** the error that is thrown from `netxQueryDam` */\nexport type GetDownloadRequestDetailsQueryError = QueryError<\n\ttypeof FETCH_ERROR_CODES[number]\n>;\n\nexport const getDownloadRequestDetailsEndpoint = 'getDownloadRequestDetails';\n\n/**\n * Get download request details\n */\nexport const getDownloadRequestDetails = async (\n\t{id}: GetDownloadRequestDetailsRequestOptions,\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetDownloadRequestDetailsRequest = [id];\n\n\tconst response = await client.post<GetDownloadRequestDetailsResponse>(\n\t\tgetDownloadRequestDetailsEndpoint,\n\t\trequestParams,\n\t\t{signal},\n\t);\n\tconst customForm = await getCustomJustificationForm();\n\n\tconst {justification, ...rest} = response.data.result;\n\tconst result: DownloadRequestDetails = {\n\t\t...rest,\n\t\tjustification: parseCustomJustificationFormData(customForm, justification),\n\t};\n\treturn result;\n};\n\nexport default getDownloadRequestDetails;\n","import {useQuery, QueryFunctionContext, UseQueryOptions} from 'react-query';\n\nimport {\n\tGetDownloadRequestDetailsQueryError,\n\tGetDownloadRequestDetailsResult,\n\tGetDownloadRequestDetailsRequestOptions,\n\tgetDownloadRequestDetails,\n} from '../getDownloadRequestDetails';\n\ntype GetDownloadRequestDetailsQueryKey =\n\tGetDownloadRequestDetailsRequestOptions;\n\ntype ReactQueryOptions = Omit<\n\tUseQueryOptions<\n\t\tGetDownloadRequestDetailsResult,\n\t\tGetDownloadRequestDetailsQueryError\n\t>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * react-query wrapper for `getDownloadRequestDetails`\n * @param queryKeyParams\n * @param options\n */\nexport const reactQueryGetDownloadRequestDetails = (\n\tqueryKeyParams: GetDownloadRequestDetailsQueryKey,\n\toptions?: ReactQueryOptions,\n) => {\n\tconst query = useQuery<\n\t\tGetDownloadRequestDetailsResult,\n\t\tGetDownloadRequestDetailsQueryError\n\t>({\n\t\tqueryKey: ['getDownloadRequestDetails', queryKeyParams],\n\t\tqueryFn: ({\n\t\t\tqueryKey,\n\t\t\tsignal,\n\t\t}: QueryFunctionContext<[string, GetDownloadRequestDetailsQueryKey]>) =>\n\t\t\tgetDownloadRequestDetails(queryKey[1], signal),\n\t\t...options,\n\t});\n\n\treturn query;\n};\n\nexport default reactQueryGetDownloadRequestDetails;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nimport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {FETCH_ERROR_CODES} from '../errors';\n\nimport {SortOrder} from '@netx/core/types';\nimport {SORT_ORDER} from '@netx/core/constants';\n\nimport {PAGE_SIZE, REVIEW_STATUS} from '../constants';\nimport type {DownloadRequest, ReviewStatus} from '../types';\n\nexport const GET_DOWNLOAD_REQUESTS_FIELD = <const>{\n\tID: 'id',\n\tAPPROVAL_COUNT: 'approvalCount',\n\tASSET_SOURCE_TYPE: 'assetSourceType',\n\tREQUESTER: 'requester',\n\tREQUEST_DATE: 'requestDate',\n\tREVIEW_STATUS: 'reviewStatus',\n\tPORTAL_CONTEXT: 'portalContext',\n};\n\nexport const GET_DOWNLOAD_REQUESTS_SORTABLE_FIELDS = [\n\tGET_DOWNLOAD_REQUESTS_FIELD.APPROVAL_COUNT,\n\tGET_DOWNLOAD_REQUESTS_FIELD.REQUESTER,\n\tGET_DOWNLOAD_REQUESTS_FIELD.REQUEST_DATE,\n\tGET_DOWNLOAD_REQUESTS_FIELD.REVIEW_STATUS,\n\tGET_DOWNLOAD_REQUESTS_FIELD.PORTAL_CONTEXT,\n] as const;\n\nexport type GetDownloadRequestsSortableField =\n\ttypeof GET_DOWNLOAD_REQUESTS_SORTABLE_FIELDS[number];\n\nexport const GET_DOWNLOAD_REQUESTS_REVIEW_STATUS_FILTERS = [\n\tREVIEW_STATUS.COMPLETED,\n\tREVIEW_STATUS.PENDING,\n];\n\nexport const GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_FIELD =\n\tGET_DOWNLOAD_REQUESTS_FIELD.REQUEST_DATE;\nexport const GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_ORDER = SORT_ORDER.DESCENDING;\nexport const GET_DOWNLOAD_REQUESTS_DEFAULT_REVIEW_STATUS = [\n\tREVIEW_STATUS.PENDING,\n];\n\nexport const getDownloadRequestsFilterStatus = (\n\tfilterStatus?: string | string[],\n): ReviewStatus[] => {\n\tif (filterStatus == null) return GET_DOWNLOAD_REQUESTS_DEFAULT_REVIEW_STATUS;\n\tif (!Array.isArray(filterStatus)) filterStatus = [filterStatus];\n\tconst filtered = filterStatus.filter((status) =>\n\t\tGET_DOWNLOAD_REQUESTS_REVIEW_STATUS_FILTERS.includes(status as any),\n\t) as ReviewStatus[];\n\treturn filtered.length\n\t\t? filtered\n\t\t: GET_DOWNLOAD_REQUESTS_DEFAULT_REVIEW_STATUS;\n};\n\nexport const getDownloadRequestsSortField = (\n\tsortField?: string,\n): GetDownloadRequestsSortableField =>\n\tGET_DOWNLOAD_REQUESTS_SORTABLE_FIELDS.includes(sortField as any)\n\t\t? (sortField as GetDownloadRequestsSortableField)\n\t\t: GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_FIELD;\n\nexport const getDownloadRequestSortOrder = (sortOrder?: string): SortOrder =>\n\tObject.values(SORT_ORDER).includes(sortOrder as any)\n\t\t? (sortOrder as SortOrder)\n\t\t: GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_ORDER;\n\n/**\n * `getDownloadRequests` request params\n * (what is used to send to server)\n */\nexport type GetDownloadRequestsRequestOptions = {\n\tstartIndex?: number;\n\tstopIndex?: number;\n\tfilterText?: string | null;\n\tfilterStatus?: string[] | null;\n\tsortField?: GetDownloadRequestsSortableField | null;\n\tsortOrder?: SortOrder | null;\n};\n\n/**\n * `getDownloadRequests` request\n * (what gets sent to the server)\n */\nexport type GetDownloadRequestsRequest = [\n\t{\n\t\ttext: string | null;\n\t\treviewStatus: string[] | null;\n\t},\n\t{\n\t\tfield: string | null;\n\t\torder: SortOrder | null;\n\t},\n\t{\n\t\tstartIndex: number;\n\t\tsize: number;\n\t},\n];\n\n/**\n * `getDownloadRequests` response\n * (what comes back from the server)\n */\nexport type GetDownloadRequestsResponse =\n\tSuccessResponse<GetDownloadRequestsResult>;\n\n/**\n * `getDownloadRequests` result\n * (what is utilized from the server response)\n */\nexport type GetDownloadRequestsResult = {\n\tresults: DownloadRequest[];\n\tsize: number;\n\tstartIndex: number;\n};\n\n/** the error that is thrown from `netxQueryDam` */\nexport type GetDownloadRequestsQueryError = QueryError<\n\ttypeof FETCH_ERROR_CODES[number]\n>;\n\nexport const getDownloadRequestsEndpoint = 'getDownloadRequests';\n\n/**\n * Get download requests\n */\nexport const getDownloadRequests = async (\n\t{\n\t\tstartIndex = 0,\n\t\tstopIndex = PAGE_SIZE,\n\t\tfilterText = null,\n\t\tfilterStatus = GET_DOWNLOAD_REQUESTS_DEFAULT_REVIEW_STATUS,\n\t\tsortField = GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_FIELD,\n\t\tsortOrder = GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_ORDER,\n\t}: GetDownloadRequestsRequestOptions,\n\tsignal?: AbortSignal,\n) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: GetDownloadRequestsRequest = [\n\t\t{\n\t\t\ttext: filterText,\n\t\t\treviewStatus: filterStatus,\n\t\t},\n\t\t{\n\t\t\tfield: sortField,\n\t\t\torder: sortOrder,\n\t\t},\n\t\t{\n\t\t\tstartIndex,\n\t\t\tsize: stopIndex - startIndex,\n\t\t},\n\t];\n\n\treturn client\n\t\t.post<GetDownloadRequestsResponse>(\n\t\t\tgetDownloadRequestsEndpoint,\n\t\t\trequestParams,\n\t\t\t{signal},\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default getDownloadRequests;\n","import {\n\tuseInfiniteQuery,\n\tQueryFunctionContext,\n\tUseInfiniteQueryOptions,\n} from 'react-query';\nimport {\n\tGetDownloadRequestsQueryError,\n\tGetDownloadRequestsResult,\n\tGetDownloadRequestsRequestOptions,\n\tgetDownloadRequests,\n} from '../getDownloadRequests';\n\nimport {getNextPageParam} from '@netx/core-components/VirtualizedList/react-query';\n\ntype GetDownloadRequestsQueryKey = Pick<\n\tGetDownloadRequestsRequestOptions,\n\t'filterText' | 'filterStatus' | 'sortField' | 'sortOrder'\n>;\n\ntype GetDownloadRequestsPageParam = {\n\tstartIndex: number;\n\tstopIndex: number;\n};\n\ntype ReactQueryOptions = Omit<\n\tUseInfiniteQueryOptions<\n\t\tGetDownloadRequestsResult,\n\t\tGetDownloadRequestsQueryError\n\t>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * react-query wrapper for `reactQueryGetDownloadRequests`\n * @param queryKeyParams\n * @param options\n */\nexport const reactQueryGetDownloadRequests = (\n\tqueryKeyParams: GetDownloadRequestsQueryKey,\n\toptions?: ReactQueryOptions,\n) => {\n\tconst getDownloadRequestsQuery = useInfiniteQuery<\n\t\tGetDownloadRequestsResult,\n\t\tGetDownloadRequestsQueryError\n\t>({\n\t\tqueryKey: ['getDownloadRequests', queryKeyParams],\n\t\tqueryFn: ({\n\t\t\tqueryKey,\n\t\t\tpageParam,\n\t\t\tsignal,\n\t\t}: QueryFunctionContext<\n\t\t\t[string, GetDownloadRequestsQueryKey],\n\t\t\tGetDownloadRequestsPageParam\n\t\t>) => getDownloadRequests({...pageParam, ...queryKey[1]}, signal),\n\t\tgetNextPageParam,\n\t\t...options,\n\t});\n\n\treturn getDownloadRequestsQuery;\n};\n\nexport default reactQueryGetDownloadRequests;\n","import {i18n} from '@netx/core/i18n';\n\nimport type {ErrorTranslations, ServerError} from '@netx/core/typings';\n\nexport const ERROR_CODE = <const>{\n\tUNKNOWN_DOWNLOAD_REQUEST: 10006,\n\tDOWNLOAD_REQUEST_CANT_BE_REVIEWED: 10007,\n\tEMAIL_FAILED: 10008,\n\tINVALID_DOWNLOAD_REQUEST: 10009,\n\tINVALID_DOWNLOAD_REQUEST_OPTION: 10010,\n\tJUSTIFICATION_SYNTAX_ERROR: 10011,\n\tNO_DOWNLOAD_APPROVAL_REVIEWER: 10015,\n};\n\nexport const UPDATE_ERROR_CODES = [\n\tERROR_CODE.DOWNLOAD_REQUEST_CANT_BE_REVIEWED,\n\tERROR_CODE.UNKNOWN_DOWNLOAD_REQUEST,\n\tERROR_CODE.EMAIL_FAILED,\n\tERROR_CODE.INVALID_DOWNLOAD_REQUEST_OPTION,\n\tERROR_CODE.JUSTIFICATION_SYNTAX_ERROR,\n];\n\nexport const FETCH_ERROR_CODES = [\n\tERROR_CODE.DOWNLOAD_REQUEST_CANT_BE_REVIEWED,\n\tERROR_CODE.INVALID_DOWNLOAD_REQUEST,\n\tERROR_CODE.UNKNOWN_DOWNLOAD_REQUEST,\n];\n\nexport const ERRORS: ServerError<typeof ERROR_CODE> = <const>{\n\tDOWNLOAD_REQUEST_CANT_BE_REVIEWED: {\n\t\tcode: ERROR_CODE.DOWNLOAD_REQUEST_CANT_BE_REVIEWED,\n\t\tmessage: `The specified download request can't be reviewed in its current state`,\n\t},\n\tEMAIL_FAILED: {\n\t\tcode: ERROR_CODE.EMAIL_FAILED,\n\t\tmessage: `Email could not be sent`,\n\t},\n\tINVALID_DOWNLOAD_REQUEST: {\n\t\tcode: ERROR_CODE.INVALID_DOWNLOAD_REQUEST,\n\t\tmessage: `Invalid download request`,\n\t},\n\tINVALID_DOWNLOAD_REQUEST_OPTION: {\n\t\tcode: ERROR_CODE.INVALID_DOWNLOAD_REQUEST_OPTION,\n\t\tmessage: `Invalid download request option`,\n\t},\n\tJUSTIFICATION_SYNTAX_ERROR: {\n\t\tcode: ERROR_CODE.JUSTIFICATION_SYNTAX_ERROR,\n\t\tmessage: `Unable to parse download requester's justification`,\n\t},\n\tNO_DOWNLOAD_APPROVAL_REVIEWER: {\n\t\tcode: ERROR_CODE.NO_DOWNLOAD_APPROVAL_REVIEWER,\n\t\tmessage: `Download Approval is configured incorrectly`,\n\t},\n\tUNKNOWN_DOWNLOAD_REQUEST: {\n\t\tcode: ERROR_CODE.UNKNOWN_DOWNLOAD_REQUEST,\n\t\tmessage: `User doesn't have access to the specified download request`,\n\t},\n};\n\nexport const errors = {\n\tfetch: {\n\t\tdefault: i18n.t('i18n.errorDownloadRequestsFetch_default'),\n\t\t...FETCH_ERROR_CODES.reduce(\n\t\t\t(errors, code) =>\n\t\t\t\tObject.assign(errors, {\n\t\t\t\t\t[code]: i18n.t(`i18n.errorDownloadRequestsFetch_${code}`),\n\t\t\t\t}),\n\t\t\t{} as ErrorTranslations<typeof ERROR_CODE>,\n\t\t),\n\t},\n\tupdate: {\n\t\tdefault: i18n.t('i18n.errorDownloadRequestsUpdate_default'),\n\t\t...FETCH_ERROR_CODES.reduce(\n\t\t\t(errors, code) =>\n\t\t\t\tObject.assign(errors, {\n\t\t\t\t\t[code]: i18n.t(`i18n.errorDownloadRequestsUpdate_${code}`),\n\t\t\t\t}),\n\t\t\t{} as ErrorTranslations<typeof ERROR_CODE>,\n\t\t),\n\t},\n};\n\nexport const get = (\n\ttype: keyof typeof errors,\n\tcode?: typeof ERROR_CODE[keyof typeof ERROR_CODE] | number,\n) => errors[type][code as number] || errors[type].default;\n\nexport default {\n\tget,\n\t...errors,\n};\n","import React, {\n\tcreateContext,\n\tuseContext,\n\tuseMemo,\n\tuseReducer,\n\tuseRef,\n\tuseEffect,\n} from 'react';\n\nimport {QueryClient, QueryClientProvider} from 'react-query';\n\nimport {useReactQueryUtils} from '@netx/core-components/VirtualizedList/hooks';\nimport {getIndexedResults} from '@netx/core-components/VirtualizedList/react-query';\nimport {LoadMoreItems} from '@netx/core-components/VirtualizedList/types';\nimport {useSnackbar} from '@netx/core-components/Snackbar';\n\nimport reducer, {initialState, State} from './reducer';\nimport actions from './actions';\nimport {ACTIONS} from './constants';\nimport {reactQueryGetDownloadRequestApprovals} from '../../api/react-query';\nimport errors from '../../errors';\nimport type {DownloadRequestApproval} from '../../types';\n\ntype DownloadRequestApprovalsContextType = {\n\tactions: ReturnType<typeof actions> & {\n\t\tdebouncedLoadMoreItems: LoadMoreItems;\n\t\tloadMoreItems: LoadMoreItems;\n\t};\n\tstate: State;\n\tisItemLoaded(index: number): boolean;\n\tloading: boolean;\n};\n\nconst queryClient = new QueryClient();\n\nconst StoreContext = createContext<DownloadRequestApprovalsContextType>(\n\t{} as any,\n);\n\nexport const useDownloadRequestApprovalsProvider = () =>\n\tuseContext<DownloadRequestApprovalsContextType>(StoreContext);\n\nexport type DownloadRequestApprovalsProviderProps = React.PropsWithChildren<{\n\tid: number;\n}>;\n\nconst DownloadRequestApprovalsProviderPrimitive = ({\n\tchildren,\n\tid,\n}: DownloadRequestApprovalsProviderProps) => {\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\n\tconst snackbar = useSnackbar();\n\n\tconst dataRef = useRef(state.data);\n\tdataRef.current = state.data;\n\n\tconst query = reactQueryGetDownloadRequestApprovals(\n\t\t{\n\t\t\tid,\n\t\t},\n\t\t{\n\t\t\trefetchOnWindowFocus: false,\n\t\t\trefetchOnMount: true,\n\t\t\trefetchOnReconnect: false,\n\t\t\tretry: false,\n\t\t\tenabled: false,\n\t\t\tonError: (error) => {\n\t\t\t\tsnackbar({\n\t\t\t\t\tmessage: errors.get('fetch', error.code),\n\t\t\t\t\tseverity: 'error',\n\t\t\t\t});\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.SET_DATA,\n\t\t\t\t\tdata: [],\n\t\t\t\t\ttotal: 0,\n\t\t\t\t\tready: true,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonSuccess: (data) => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.SET_DATA,\n\t\t\t\t\t...getIndexedResults<DownloadRequestApproval>(data),\n\t\t\t\t\tready: true,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t);\n\n\tconst reactQueryUtils = useReactQueryUtils(query, dataRef);\n\n\t// The reducer actions to expose to outside components\n\tconst dispatchActions = useMemo(\n\t\t() => ({\n\t\t\t...actions(dispatch),\n\t\t\tdebouncedLoadMoreItems: reactQueryUtils.debouncedLoadMoreItems,\n\t\t\tloadMoreItems: reactQueryUtils.loadMoreItems,\n\t\t}),\n\t\t[reactQueryUtils.loadMoreItems],\n\t);\n\n\tuseEffect(() => {\n\t\tid > -1 && query.refetch();\n\t\t() => {\n\t\t\tqueryClient.invalidateQueries();\n\t\t};\n\t}, [id]);\n\n\treturn (\n\t\t<StoreContext.Provider\n\t\t\tvalue={{\n\t\t\t\tstate,\n\t\t\t\tactions: dispatchActions,\n\t\t\t\tisItemLoaded: reactQueryUtils.isItemLoaded,\n\t\t\t\tloading: reactQueryUtils.loading,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</StoreContext.Provider>\n\t);\n};\n\nexport const DownloadRequestApprovalsProvider = React.memo(\n\t(props: DownloadRequestApprovalsProviderProps) => {\n\t\treturn (\n\t\t\t<QueryClientProvider client={queryClient}>\n\t\t\t\t<DownloadRequestApprovalsProviderPrimitive {...props} />\n\t\t\t</QueryClientProvider>\n\t\t);\n\t},\n);\n\nexport default DownloadRequestApprovalsProvider;\n","import React, {useCallback, useEffect} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {Collapse, Slide, FormControlLabel} from '@mui/material';\nimport FormDialog, {FormDialogProps} from '@netx/core-components/FormDialog';\nimport {useForm, TextField} from '@netx/core-components/Form';\nimport Switch from '@netx/core-components/Switch';\nimport ScrollBorder from '@netx/core-components/ScrollBorder';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nconst StyledScrollBorder = withStyles((theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t},\n\t\tscrollWrapper: {\n\t\t\tpadding: theme.spacing(2.5, 3),\n\t\t},\n\t}),\n)(ScrollBorder);\n\nconst StyledFormDialog = withStyles((theme: Theme) =>\n\tcreateStyles({\n\t\tdialogContent: {\n\t\t\tpadding: 0,\n\t\t},\n\t}),\n)(FormDialog) as <WithForm extends boolean = false>(\n\tprops: Omit<FormDialogProps<WithForm>, 'classes'>,\n) => JSX.Element;\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\tcontrols: {\n\t\t\tmarginBottom: theme.spacing(2),\n\t\t\t'& .MuiFormControlLabel-root': {\n\t\t\t\twidth: '100%',\n\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\tmarginLeft: 0,\n\t\t\t},\n\t\t\t'& .MuiSwitch-root': {\n\t\t\t\tmarginRight: -10,\n\t\t\t},\n\t\t},\n\t\tmessage: {},\n\t});\n\ntype FormValues = {\n\tmessage: string;\n\tmessageEnabled: boolean;\n};\n\nconst DEFAULT_VALUES: FormValues = {\n\tmessage: '',\n\tmessageEnabled: true,\n};\n\nexport type DownloadRequestConfirmProps = Omit<\n\tFormDialogProps<true, FormValues>,\n\t'classes' | 'form'\n> & {\n\tapprovalCount: number;\n};\n\nexport const DownloadRequestConfirmPrimitive = ({\n\tclasses,\n\tapprovalCount,\n\tonSubmit,\n\t...props\n}: WithStyles<typeof styles> & DownloadRequestConfirmProps) => {\n\tconst form = useForm<FormValues>(DEFAULT_VALUES, {\n\t\tonSubmit,\n\t\tresetOnSubmit: true,\n\t\tresetWithOriginalValues: true,\n\t});\n\n\tuseEffect(() => {\n\t\tform.register('messageEnabled');\n\t\treturn () => {\n\t\t\tform.unregister('messageEnabled');\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tform.setValue('messageEnabled', true);\n\t}, [approvalCount]);\n\n\tconst handleMessageEnableChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tform.setValue('messageEnabled', event.target.checked);\n\t\t},\n\t\t[],\n\t);\n\n\treturn (\n\t\t<StyledFormDialog<true>\n\t\t\tform={form}\n\t\t\trequiresChanges={false}\n\t\t\tsecondaryTitle={i18n.t('i18n.nItemsApproved', {count: approvalCount})}\n\t\t\ttitle={i18n.t('i18n.downloadRequest')}\n\t\t\t{...props}\n\t\t\tTransitionProps={{\n\t\t\t\t...props.TransitionProps,\n\t\t\t\tonExited: (node) => {\n\t\t\t\t\tform.reset();\n\t\t\t\t\tprops.TransitionProps?.onExited?.(node);\n\t\t\t\t},\n\t\t\t}}\n\t\t>\n\t\t\t<StyledScrollBorder>\n\t\t\t\t{!approvalCount ? (\n\t\t\t\t\t<div className={classes.controls}>\n\t\t\t\t\t\t<FormControlLabel\n\t\t\t\t\t\t\tcontrol={\n\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\tchecked={form.values.messageEnabled}\n\t\t\t\t\t\t\t\t\tonChange={handleMessageEnableChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlabelPlacement=\"start\"\n\t\t\t\t\t\t\tlabel={i18n.t('i18n.notifyRequestorOfStatusChange')}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t\t<Collapse in={form.values.messageEnabled}>\n\t\t\t\t\t<div className={classes.message}>\n\t\t\t\t\t\t<Slide direction=\"up\" in={form.values.messageEnabled}>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<TextField\n\t\t\t\t\t\t\t\t\tform={form}\n\t\t\t\t\t\t\t\t\thelperText={i18n.t('i18n.messageForRequestingUser')}\n\t\t\t\t\t\t\t\t\tlabel={i18n.t('i18n.message')}\n\t\t\t\t\t\t\t\t\tmultiline\n\t\t\t\t\t\t\t\t\tname=\"message\"\n\t\t\t\t\t\t\t\t\tvalue={form.values.message}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Slide>\n\t\t\t\t\t</div>\n\t\t\t\t</Collapse>\n\t\t\t</StyledScrollBorder>\n\t\t</StyledFormDialog>\n\t);\n};\n\nexport const DownloadRequestConfirm = withStyles(styles)(\n\tDownloadRequestConfirmPrimitive,\n);\nexport default DownloadRequestConfirm;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nimport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {FETCH_ERROR_CODES} from '../errors';\n\nimport type {BatchJobId as UUID} from '@netx/core-app/models/batchJob';\n\nimport {\n\tGET_DOWNLOAD_REQUESTS_DEFAULT_REVIEW_STATUS,\n\tGET_DOWNLOAD_REQUESTS_DEFAULT_SORT_FIELD,\n\tGET_DOWNLOAD_REQUESTS_DEFAULT_SORT_ORDER,\n\tGetDownloadRequestsRequestOptions,\n\tGetDownloadRequestsRequest,\n} from './getDownloadRequests';\n\n/**\n * `exportDownloadRequests` request params\n * (what is used to send to server)\n */\nexport type ExportDownloadRequestsRequestOptions = GetDownloadRequestsRequestOptions;\n\n/**\n * `exportDownloadRequests` request\n * (what gets sent to the server)\n */\nexport type ExportDownloadRequestsRequest = GetDownloadRequestsRequest;\n\n/**\n * `exportDownloadRequests` response\n * (what comes back from the server)\n */\nexport type ExportDownloadRequestsResponse = SuccessResponse<\n\tExportDownloadRequestsResult\n>;\n\n/**\n * `exportDownloadRequests` result\n * (what is utilized from the server response)\n */\nexport type ExportDownloadRequestsResult = UUID;\n\n/** the error that is thrown from `netxQueryDam` */\nexport type ExportDownloadRequestsQueryError = QueryError<\n\ttypeof FETCH_ERROR_CODES[number]\n>;\n\nexport const exportDownloadRequestsEndpoint = 'exportDownloadRequests';\n\n/**\n * Export download requests\n */\nexport const exportDownloadRequests = async ({\n\tstartIndex = 0,\n\tstopIndex = 0xfff7,\n\tfilterText = null,\n\tfilterStatus = GET_DOWNLOAD_REQUESTS_DEFAULT_REVIEW_STATUS,\n\tsortField = GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_FIELD,\n\tsortOrder = GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_ORDER,\n}: ExportDownloadRequestsRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: ExportDownloadRequestsRequest = [\n\t\t{\n\t\t\ttext: filterText,\n\t\t\treviewStatus: filterStatus,\n\t\t},\n\t\t{\n\t\t\tfield: sortField,\n\t\t\torder: sortOrder,\n\t\t},\n\t\t{\n\t\t\tstartIndex,\n\t\t\tsize: stopIndex - startIndex,\n\t\t},\n\t];\n\n\treturn client\n\t\t.post<ExportDownloadRequestsResponse>(\n\t\t\texportDownloadRequestsEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default exportDownloadRequests;\n","import NetxQueryDam, {SuccessResponse} from '@netx/core/lib/netx-query-dam';\nexport type {QueryError} from '@netx/core/lib/netx-query-dam';\n\nimport {DownloadRequestId, DownloadRequestDetails} from '../types';\n\ntype EntitySelector = {\n\tall: boolean;\n\tincludeIds: number[];\n\texcludeIds: number[];\n};\n\n/**\n * `reviewDownloadRequest` request params\n * (what is used to send to server)\n */\nexport type ReviewDownloadRequestRequestOptions = {\n\tid: DownloadRequestId;\n\tentitySelector: EntitySelector;\n\tnotifyRequester: boolean;\n\tmessage: string;\n};\n\n/**\n * `reviewDownloadRequest` request\n * (what gets sent to the server)\n */\nexport type ReviewDownloadRequestRequest = [\n\tReviewDownloadRequestRequestOptions['id'],\n\tReviewDownloadRequestRequestOptions['entitySelector'],\n\tReviewDownloadRequestRequestOptions['notifyRequester'],\n\tReviewDownloadRequestRequestOptions['message'],\n];\n\n/**\n * `reviewDownloadRequest` response\n * (what comes back from the server)\n */\nexport type ReviewDownloadRequestResponse = SuccessResponse<\n\tReviewDownloadRequestResult\n>;\n\n/**\n * `reviewDownloadRequest` result\n * (what is utilized from the server response)\n */\nexport type ReviewDownloadRequestResult = DownloadRequestDetails;\n\nexport const reviewDownloadRequestEndpoint = 'reviewDownloadRequest';\n\n/**\n * Review download request approvals\n */\nexport const reviewDownloadRequest = async ({\n\tid,\n\tentitySelector,\n\tnotifyRequester,\n\tmessage,\n}: ReviewDownloadRequestRequestOptions) => {\n\tconst client = NetxQueryDam();\n\n\tconst requestParams: ReviewDownloadRequestRequest = [\n\t\tid,\n\t\tentitySelector,\n\t\tnotifyRequester,\n\t\tmessage,\n\t];\n\n\treturn client\n\t\t.post<ReviewDownloadRequestResponse>(\n\t\t\treviewDownloadRequestEndpoint,\n\t\t\trequestParams,\n\t\t)\n\t\t.then((response) => response.data.result);\n};\n\nexport default reviewDownloadRequest;\n","export const ACTIONS = <const>{\n\tSET_DATA: 'SET_DATA',\n\tRESET_DATA: 'RESET_DATA',\n\n\tSET_ID: 'SET_ID',\n\n\tTOGGLE_SHOW_APPROVALS: 'TOGGLE_SHOW_APPROVALS',\n\tTOGGLE_SHOW_CONFIRM: 'TOGGLE_SHOW_CONFIRM',\n};\n","import {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nimport type {DownloadRequestDetails} from '../../types';\nimport {REVIEW_STATUS, ASSET_SOURCE_TYPE} from '../../constants';\n\nexport type DownloadRequestDetailsIndexed = DownloadRequestDetails & {\n\tindex: number;\n};\n\nexport type State = DownloadRequestDetails & {\n\tshowApprovals: boolean;\n\tshowConfirm: boolean;\n};\n\nexport const initialState: State = {\n\tid: -1,\n\tapprovalCount: 0,\n\tapprovedCount: 0,\n\tassetSourceType: ASSET_SOURCE_TYPE.ASSETS,\n\toptions: [],\n\tportalContext: '',\n\trequester: null,\n\trequestDate: '',\n\treviewStatus: REVIEW_STATUS.NO_APPROVAL_REQUIRED,\n\tjustification: [],\n\n\tshowApprovals: false,\n\tshowConfirm: false,\n};\n\nconst reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.RESET_DATA:\n\t\t\treturn initialState;\n\t\tcase ACTIONS.SET_DATA:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t...action.data,\n\t\t\t};\n\t\tcase ACTIONS.SET_ID:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tid: action.id,\n\t\t\t};\n\t\tcase ACTIONS.TOGGLE_SHOW_APPROVALS:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tshowApprovals: action.show,\n\t\t\t};\n\t\tcase ACTIONS.TOGGLE_SHOW_CONFIRM:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tshowConfirm: action.show,\n\t\t\t};\n\t}\n};\n\nexport default reducer;\n","import {Dispatch} from 'react';\n\nimport {ACTIONS} from './constants';\nimport {State} from './reducer';\n\nexport type Action =\n\t| {type: typeof ACTIONS.RESET_DATA}\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_DATA;\n\t\t\tdata: Omit<State, 'showApprovals' | 'showConfirm'>;\n\t }\n\t| {type: typeof ACTIONS.SET_ID; id: number}\n\t| {type: typeof ACTIONS.TOGGLE_SHOW_APPROVALS; show: boolean}\n\t| {type: typeof ACTIONS.TOGGLE_SHOW_CONFIRM; show: boolean};\n\nexport const Actions = (dispatch: Dispatch<Action>) => ({\n\thideApprovals: () =>\n\t\tdispatch({type: ACTIONS.TOGGLE_SHOW_APPROVALS, show: false}),\n\thideConfirm: () => dispatch({type: ACTIONS.TOGGLE_SHOW_CONFIRM, show: false}),\n\treset: () => dispatch({type: ACTIONS.RESET_DATA}),\n\tsetId: (id: number) => dispatch({type: ACTIONS.SET_ID, id}),\n\tshowApprovals: () =>\n\t\tdispatch({type: ACTIONS.TOGGLE_SHOW_APPROVALS, show: true}),\n\tshowConfirm: () => dispatch({type: ACTIONS.TOGGLE_SHOW_CONFIRM, show: true}),\n});\n\nexport default Actions;\n","import React, {\n\tcreateContext,\n\tuseContext,\n\tuseMemo,\n\tuseReducer,\n\tuseEffect,\n\tuseState,\n\tuseRef,\n} from 'react';\n\nimport Netx from '@netx/core/bootstrap';\n\nimport _ from 'underscore';\n\nimport {useMutation, QueryClientProvider} from 'react-query';\n\nimport {useSnackbar} from '@netx/core-components/Snackbar';\nimport DownloadRequestApprovalsContainer from '../../containers/DownloadRequestApprovals';\n\nimport {DownloadRequestConfirm} from '../../components/DownloadRequestConfirm';\n\nimport {\n\treviewDownloadRequest,\n\tReviewDownloadRequestResult,\n\tReviewDownloadRequestRequestOptions,\n\tQueryError,\n} from '../../api';\nimport {queryClient} from '../../constants';\nimport errors from '../../errors';\n\nimport reducer, {initialState, State} from './reducer';\nimport actions from './actions';\nimport {ACTIONS} from './constants';\n\nimport {reactQueryGetDownloadRequestDetails} from '../../api/react-query';\n\nimport type {ApprovalObject, DownloadRequestId} from '../../types';\n\ntype DownloadRequestContextType = {\n\tactions: ReturnType<typeof actions> & {\n\t\tsubmitApprovals: (\n\t\t\tid: DownloadRequestId,\n\t\t\tdata: Omit<ApprovalObject, 'id'>,\n\t\t) => void;\n\t};\n\tstate: State;\n\tloading: boolean;\n};\n\nconst StoreContext = createContext<DownloadRequestContextType>({} as any);\n\nexport const useDownloadRequestProvider = () =>\n\tuseContext<DownloadRequestContextType>(StoreContext);\n\nexport type DownloadRequestProviderProps = React.PropsWithChildren<{\n\tonUpdated?: (id: DownloadRequestId) => void;\n}>;\n\n/**\n * Download request provider\\\n * With this you can load a download request, show approvals for that request,\n * and submit a review for that request\n * @param Props\n */\nexport const DownloadRequestProviderPrimitive = ({\n\tchildren,\n\tonUpdated,\n}: DownloadRequestProviderProps) => {\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\n\tconst snackbar = useSnackbar();\n\n\tconst [approvalsActive, setApprovalsActive] = useState(false);\n\tconst [confirmActive, setConfirmActive] = useState(false);\n\n\tconst [approvalObjext, setApprovalObject] = useState<\n\t\tApprovalObject | undefined\n\t>(undefined);\n\n\tconst query = reactQueryGetDownloadRequestDetails(\n\t\t{\n\t\t\tid: state.id,\n\t\t},\n\t\t{\n\t\t\trefetchOnReconnect: false,\n\t\t\trefetchOnMount: false,\n\t\t\trefetchOnWindowFocus: false,\n\t\t\tretry: false,\n\t\t\tenabled: state.id >= 0,\n\t\t\tonSuccess: (data) => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.SET_DATA,\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\t// TODO: not sure why this is not being disabled when less than zero\n\t\t\t\tif (state.id < 0) return;\n\t\t\t\tsnackbar({\n\t\t\t\t\tmessage: errors.get('fetch', error.code),\n\t\t\t\t\tseverity: 'error',\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t);\n\n\tconst mutation = useMutation<\n\t\tReviewDownloadRequestResult,\n\t\tQueryError,\n\t\tReviewDownloadRequestRequestOptions\n\t>(reviewDownloadRequest, {\n\t\tonError: (error) => {\n\t\t\tsnackbar({\n\t\t\t\tmessage: errors.get('update', error.code),\n\t\t\t\tseverity: 'error',\n\t\t\t});\n\t\t},\n\t\tonSuccess: (data) => {\n\t\t\t// TODO: what do we want returned\n\t\t\tonUpdated?.(state.id);\n\t\t\tdispatch({type: ACTIONS.RESET_DATA});\n\t\t\tsetApprovalObject(undefined);\n\t\t\tsetTimeout(() => {\n\t\t\t\tqueryClient.invalidateQueries({\n\t\t\t\t\tpredicate: (query) => {\n\t\t\t\t\t\treturn query.queryKey[0] === 'getDownloadRequests';\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}, 100);\n\t\t},\n\t});\n\n\t// The reducer actions to expose to outside components\n\tconst dispatchActions = useMemo(\n\t\t() => ({\n\t\t\t...actions(dispatch),\n\t\t\tsubmitApprovals: (\n\t\t\t\tid: DownloadRequestId, // TODO: we already have the id\n\t\t\t\tdata: Omit<ApprovalObject, 'id'>,\n\t\t\t) => {\n\t\t\t\tsetApprovalObject({...data, id});\n\t\t\t},\n\t\t}),\n\t\t[],\n\t);\n\n\tuseEffect(() => {\n\t\t() => {\n\t\t\tqueryClient.invalidateQueries({\n\t\t\t\tpredicate: (query) => {\n\t\t\t\t\treturn query.queryKey[0] === 'getDownloadRequestDetails';\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\t}, []);\n\n\tconst idRef = useRef(state.id);\n\tidRef.current = state.id;\n\n\tuseEffect(() => {\n\t\tconst routed = (route: string) => {\n\t\t\tif (route === 'download:request:list') {\n\t\t\t\tdispatchActions.hideApprovals();\n\t\t\t}\n\t\t};\n\t\tNetx.router?.on?.('route', routed);\n\t\treturn () => {\n\t\t\tNetx.router?.off?.('route', routed);\n\t\t};\n\t}, []);\n\n\t// TODO: clean this up\n\tuseEffect(() => {\n\t\tif (!state.showApprovals) return;\n\t\tsetApprovalsActive(state.showApprovals);\n\t\tNetx.router?.navigate?.(`share/request/review/${idRef.current}`, false);\n\t}, [state.showApprovals]);\n\n\t// These two things are basically the same...\n\tuseEffect(() => {\n\t\tif (!state.showConfirm) return;\n\t\tsetConfirmActive(state.showConfirm);\n\t}, [state.showConfirm]);\n\tuseEffect(() => {\n\t\tif (!approvalObjext) return;\n\t\tsetConfirmActive(true);\n\t}, [approvalObjext]);\n\n\treturn (\n\t\t<StoreContext.Provider\n\t\t\tvalue={{\n\t\t\t\tstate,\n\t\t\t\tactions: dispatchActions,\n\t\t\t\tloading: query.isFetching || query.isLoading,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\n\t\t\t{approvalsActive ? (\n\t\t\t\t<DownloadRequestApprovalsContainer\n\t\t\t\t\topen={state.showApprovals}\n\t\t\t\t\tid={state.id}\n\t\t\t\t\tonSubmit={\n\t\t\t\t\t\tstate.reviewStatus === 'PENDING'\n\t\t\t\t\t\t\t? dispatchActions.submitApprovals\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tDialogProps={{\n\t\t\t\t\t\tonClose: () => dispatchActions.hideApprovals(),\n\t\t\t\t\t\tTransitionProps: {\n\t\t\t\t\t\t\tonExited: () => {\n\t\t\t\t\t\t\t\tsetApprovalsActive(false);\n\t\t\t\t\t\t\t\tdispatchActions.reset();\n\t\t\t\t\t\t\t\tNetx.router?.navigate?.('share/approvals', true);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t) : null}\n\n\t\t\t{confirmActive ? (\n\t\t\t\t<DownloadRequestConfirm\n\t\t\t\t\topen={Boolean(approvalObjext)}\n\t\t\t\t\tapprovalCount={approvalObjext?.total || 0}\n\t\t\t\t\tonClose={() => setApprovalObject(undefined)}\n\t\t\t\t\tTransitionProps={{\n\t\t\t\t\t\tonExited: () => {\n\t\t\t\t\t\t\tsetConfirmActive(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tonSubmit={async (values) => {\n\t\t\t\t\t\tif (!approvalObjext) return;\n\t\t\t\t\t\tconst {id, total, ...rest} = approvalObjext;\n\t\t\t\t\t\trest.excludeIds = rest.excludeIds.filter((id) => id > -1);\n\t\t\t\t\t\trest.includeIds = rest.includeIds.filter((id) => id > -1);\n\t\t\t\t\t\tawait mutation.mutateAsync({\n\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\tentitySelector: rest,\n\t\t\t\t\t\t\tnotifyRequester: values.messageEnabled,\n\t\t\t\t\t\t\tmessage: values.message,\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</StoreContext.Provider>\n\t);\n};\n\nexport const DownloadRequestProvider = React.memo(\n\t(props: DownloadRequestProviderProps) => {\n\t\treturn (\n\t\t\t<QueryClientProvider client={queryClient}>\n\t\t\t\t<DownloadRequestProviderPrimitive {...props} />\n\t\t\t</QueryClientProvider>\n\t\t);\n\t},\n);\n\nexport default DownloadRequestProvider;\n","export const ACTIONS = <const>{\n\tSET_DATA: 'SET_DATA',\n\tSET_FILTER_STATUS: 'SET_FILTER_STATUS',\n\tSET_FILTER_TEXT: 'SET_FILTER_TEXT',\n\tSET_SORT: 'SET_SORT',\n\tSET_VISIBLE_INDEX: 'SET_VISIBLE_INDEX',\n};\n","import {Dispatch} from 'react';\n\nimport {ACTIONS} from './constants';\nimport {State} from './reducer';\n\nexport type Action =\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_DATA;\n\t\t\tdata: State['data'];\n\t\t\ttotal: number;\n\t\t\tready: boolean;\n\t }\n\t| {type: typeof ACTIONS.SET_FILTER_STATUS; filter: State['filterStatus']}\n\t| {type: typeof ACTIONS.SET_FILTER_TEXT; filter: string | null}\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_SORT;\n\t\t\tfield: State['sortField'];\n\t\t\torder: 'asc' | 'desc';\n\t }\n\t| {\n\t\t\ttype: typeof ACTIONS.SET_VISIBLE_INDEX;\n\t\t\tindex: State['visibleIndex'];\n\t\t\tpage: State['page'];\n\t };\n\nexport const Actions = (dispatch: Dispatch<Action>) => ({\n\tsetFilterText: (filter: string | null) =>\n\t\tdispatch({type: ACTIONS.SET_FILTER_TEXT, filter}),\n\tsetStatusFilter: (filter: State['filterStatus']) =>\n\t\tdispatch({type: ACTIONS.SET_FILTER_STATUS, filter}),\n\tsetSort: (field: State['sortField'], order: 'asc' | 'desc' = 'desc') =>\n\t\tdispatch({type: ACTIONS.SET_SORT, field, order}),\n\tsetVisibleIndex: (\n\t\tindex: State['visibleIndex'],\n\t\tpage: State['page'],\n\t\tvisibleEndIndex: number,\n\t) => dispatch({type: ACTIONS.SET_VISIBLE_INDEX, index, page}),\n});\n\nexport default Actions;\n","import {ACTIONS} from './constants';\nimport type {Action} from './actions';\n\nimport type {ReviewStatus, DownloadRequest} from '../../types';\nimport {\n\tGetDownloadRequestsSortableField,\n\tgetDownloadRequestsFilterStatus,\n\tGET_DOWNLOAD_REQUESTS_DEFAULT_SORT_ORDER,\n\tGET_DOWNLOAD_REQUESTS_DEFAULT_SORT_FIELD,\n\tGET_DOWNLOAD_REQUESTS_DEFAULT_REVIEW_STATUS,\n} from '../../api/getDownloadRequests';\n\nexport type DownloadRequestIndexed = DownloadRequest & {index: number};\n\nexport type State = {\n\tdata: DownloadRequestIndexed[];\n\tfilterStatus: ReviewStatus[];\n\tfilterText: string | null;\n\tshow: boolean;\n\ttotal: number;\n\ttoalLoaded: number;\n\tvisibleIndex: number;\n\tpage: number;\n\tready: boolean;\n\tsortField: GetDownloadRequestsSortableField;\n\tsortOrder: 'asc' | 'desc';\n};\n\nexport const initialState: State = {\n\tdata: [],\n\tfilterText: null,\n\tfilterStatus: GET_DOWNLOAD_REQUESTS_DEFAULT_REVIEW_STATUS,\n\tready: false,\n\tshow: false,\n\ttotal: 0,\n\ttoalLoaded: 0,\n\tvisibleIndex: 0,\n\tpage: 1,\n\tsortField: GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_FIELD,\n\tsortOrder: GET_DOWNLOAD_REQUESTS_DEFAULT_SORT_ORDER,\n};\n\nconst reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase ACTIONS.SET_DATA:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdata: action.data,\n\t\t\t\ttotal: action.total,\n\t\t\t\ttoalLoaded: action.data.length,\n\t\t\t\tready: action.ready,\n\t\t\t};\n\t\tcase ACTIONS.SET_FILTER_STATUS:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfilterStatus: getDownloadRequestsFilterStatus(action.filter),\n\t\t\t};\n\t\tcase ACTIONS.SET_FILTER_TEXT:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfilterText: action.filter,\n\t\t\t};\n\t\tcase ACTIONS.SET_SORT:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tsortField: action.field,\n\t\t\t\tsortOrder: action.order,\n\t\t\t};\n\t\tcase ACTIONS.SET_VISIBLE_INDEX:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tvisibleIndex: action.index,\n\t\t\t\tpage: action.page,\n\t\t\t};\n\t}\n};\n\nexport default reducer;\n","import React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseReducer,\n\tuseRef,\n\tuseEffect,\n} from 'react';\n\nimport {QueryClientProvider} from 'react-query';\nimport {queryClient} from '../../constants';\nimport errors from '../../errors';\n\nimport {useUserPref} from '@netx/core-components/hooks/useUserPref';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\nimport {useReactQueryUtils} from '@netx/core-components/VirtualizedList/hooks';\nimport {getIndexedResults} from '@netx/core-components/VirtualizedList/react-query';\nimport {LoadMoreItems} from '@netx/core-components/VirtualizedList/types';\nimport {useSnackbar} from '@netx/core-components/Snackbar';\nimport {\n\tuseDownload,\n\twithDownloadDialog,\n} from '@netx/core-components/DownloadDialog';\n\nimport actions from './actions';\nimport {ACTIONS} from './constants';\nimport reducer, {initialState, State} from './reducer';\nimport {\n\tDownloadRequestProvider,\n\tuseDownloadRequestProvider,\n} from '../DownloadRequest';\nimport {\n\treactQueryGetDownloadRequests,\n\texportDownloadRequests,\n\tgetDownloadRequestsFilterStatus,\n\tgetDownloadRequestsSortField,\n\tgetDownloadRequestSortOrder,\n} from '../../api';\nimport type {DownloadRequest} from '../../types';\n\ntype DownloadRequestsContextType = {\n\tactions: ReturnType<typeof actions> & {\n\t\tdebouncedLoadMoreItems: LoadMoreItems;\n\t\texportToCSV(): void;\n\t\tloadMoreItems: LoadMoreItems;\n\t};\n\tstate: State;\n\tisItemLoaded(index: number): boolean;\n\tloading: boolean;\n};\n\nconst StoreContext = createContext<DownloadRequestsContextType>({} as any);\n\nexport const useDownloadRequestsProvider = () =>\n\tuseContext<DownloadRequestsContextType>(StoreContext);\n\nexport type DownloadRequestsProviderProps = React.PropsWithChildren<{\n\tactiveId?: number;\n}>;\n\nexport const DownloadRequestsProviderPrimitive = ({\n\tchildren,\n\tactiveId,\n}: DownloadRequestsProviderProps) => {\n\tconst snackbar = useSnackbar();\n\tconst download = useDownload();\n\tconst downloadRequestProvider = useDownloadRequestProvider();\n\n\tconst [sortFieldPref, setSortFieldPref] = useUserPref(\n\t\t'downloadRequest.sortField',\n\t);\n\tconst [sortOrderPref, setSortOrderPref] = useUserPref(\n\t\t'downloadRequest.sortOrder',\n\t);\n\tconst [filterStatusPref, setFilterStatusPref] = useUserPref(\n\t\t'downloadRequest.filterStatus',\n\t);\n\n\tconst [state, dispatch] = useReducer(reducer, {\n\t\t...initialState,\n\t\tsortField: getDownloadRequestsSortField(sortFieldPref),\n\t\tsortOrder: getDownloadRequestSortOrder(sortOrderPref),\n\t\tfilterStatus: getDownloadRequestsFilterStatus(filterStatusPref?.split(',')),\n\t});\n\n\tuseWhenChangedEffect(\n\t\tstate.sortField,\n\t\tuseCallback((sortField) => {\n\t\t\tsetSortFieldPref(sortField);\n\t\t}, []),\n\t);\n\n\tuseWhenChangedEffect(\n\t\tstate.sortOrder,\n\t\tuseCallback((sortOrder) => {\n\t\t\tsetSortOrderPref(sortOrder);\n\t\t}, []),\n\t);\n\n\tuseWhenChangedEffect(\n\t\tstate.filterStatus,\n\t\tuseCallback((filterStatus) => {\n\t\t\tsetFilterStatusPref(filterStatus.join(','));\n\t\t}, []),\n\t);\n\n\tconst dataRef = useRef(state.data);\n\tdataRef.current = state.data;\n\n\tconst query = reactQueryGetDownloadRequests(\n\t\t{\n\t\t\tfilterText: state.filterText,\n\t\t\tfilterStatus: state.filterStatus,\n\t\t\tsortField: state.sortField,\n\t\t\tsortOrder: state.sortOrder,\n\t\t},\n\t\t{\n\t\t\trefetchOnWindowFocus: false,\n\t\t\trefetchOnMount: true,\n\t\t\trefetchOnReconnect: false,\n\t\t\tretry: false,\n\t\t\tenabled: false,\n\t\t\tonSuccess: (data) => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.SET_DATA,\n\t\t\t\t\t...getIndexedResults<DownloadRequest>(data),\n\t\t\t\t\tready: true,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tsnackbar({\n\t\t\t\t\tmessage: errors.get('fetch', error.code),\n\t\t\t\t\tseverity: 'error',\n\t\t\t\t});\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: ACTIONS.SET_DATA,\n\t\t\t\t\tdata: [],\n\t\t\t\t\ttotal: 0,\n\t\t\t\t\tready: true,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t);\n\n\tconst reactQueryUtils = useReactQueryUtils(query, dataRef);\n\n\tconst exportToCSV = useCallback(() => {\n\t\tdownload({\n\t\t\tgetUUID: () =>\n\t\t\t\texportDownloadRequests({\n\t\t\t\t\tfilterStatus: state.filterStatus,\n\t\t\t\t\tfilterText: state.filterText,\n\t\t\t\t\tsortField: state.sortField,\n\t\t\t\t\tsortOrder: state.sortOrder,\n\t\t\t\t}),\n\t\t});\n\t}, [state.filterStatus, state.filterText, state.sortField, state.sortOrder]);\n\n\tuseWhenChangedEffect(\n\t\t[\n\t\t\tstate.filterText,\n\t\t\tstate.filterStatus,\n\t\t\tstate.sortField,\n\t\t\tstate.sortOrder,\n\t\t] as const,\n\t\tuseCallback(() => {\n\t\t\tdataRef.current = [];\n\t\t\tdispatch({\n\t\t\t\ttype: ACTIONS.SET_DATA,\n\t\t\t\tdata: [],\n\t\t\t\tready: false,\n\t\t\t\ttotal: state.total,\n\t\t\t});\n\t\t\treactQueryUtils.debouncedRefetch();\n\t\t}, [reactQueryUtils.debouncedRefetch, state.total]),\n\t);\n\n\t// The reducer actions to expose to outside components\n\tconst dispatchActions = useMemo(\n\t\t() => ({\n\t\t\t...actions(dispatch),\n\t\t\tdebouncedLoadMoreItems: reactQueryUtils.debouncedLoadMoreItems,\n\t\t\texportToCSV,\n\t\t\tloadMoreItems: reactQueryUtils.loadMoreItems,\n\t\t}),\n\t\t[\n\t\t\texportToCSV,\n\t\t\treactQueryUtils.debouncedLoadMoreItems,\n\t\t\treactQueryUtils.loadMoreItems,\n\t\t],\n\t);\n\n\tuseEffect(() => {\n\t\tquery.refetch();\n\t\t() => {\n\t\t\tqueryClient.invalidateQueries({\n\t\t\t\tpredicate: (query) => {\n\t\t\t\t\treturn query.queryKey[0] === 'getDownloadRequests';\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (activeId == null) return;\n\t\tdownloadRequestProvider.actions.setId(activeId);\n\t\tdownloadRequestProvider.actions.showApprovals();\n\t}, [activeId]);\n\n\treturn (\n\t\t<StoreContext.Provider\n\t\t\tvalue={{\n\t\t\t\tstate,\n\t\t\t\tactions: dispatchActions,\n\t\t\t\tisItemLoaded: reactQueryUtils.isItemLoaded,\n\t\t\t\tloading: reactQueryUtils.loading,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</StoreContext.Provider>\n\t);\n};\n\nexport const DownloadRequestsProvider = withDownloadDialog(\n\tReact.memo((props: DownloadRequestsProviderProps) => {\n\t\treturn (\n\t\t\t<QueryClientProvider client={queryClient}>\n\t\t\t\t<DownloadRequestProvider\n\t\t\t\t\tonUpdated={() => {\n\t\t\t\t\t\tqueryClient.invalidateQueries();\n\t\t\t\t\t\tqueryClient.refetchQueries();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<DownloadRequestsProviderPrimitive {...props} />\n\t\t\t\t</DownloadRequestProvider>\n\t\t\t</QueryClientProvider>\n\t\t);\n\t}),\n\t{\n\t\tdisableEmailWhenDone: true,\n\t},\n);\n\nexport default DownloadRequestsProvider;\n","import React, {useMemo} from 'react';\nimport {i18n} from '@netx/core/i18n';\nimport {Checkbox, FormControlLabel} from '@mui/material';\n\nimport {useTableRowSelectionProvider} from '@netx/core-components/VirtualizedTable';\nimport {useDownloadRequestProvider} from '../../../contexts';\nimport {DownloadRequestApproval} from '../../../';\n\nimport {ColumnInstance} from '@netx/core-components/VirtualizedTable';\n\nconst CheckboxHeaderCellComponent = (\n\tprops: ColumnInstance<DownloadRequestApproval>,\n) => {\n\tconst tableRowSelectionProvider = useTableRowSelectionProvider();\n\tconst downloadRequestProvider = useDownloadRequestProvider();\n\n\tconst readOnly =\n\t\tdownloadRequestProvider.state.id === -1 ||\n\t\tdownloadRequestProvider.state.reviewStatus !== 'PENDING';\n\n\tlet readOnlyValue: 'indeterminate' | boolean = false;\n\tif (\n\t\tdownloadRequestProvider.state.approvalCount &&\n\t\tdownloadRequestProvider.state.approvedCount ===\n\t\t\tdownloadRequestProvider.state.approvalCount\n\t) {\n\t\treadOnlyValue = true;\n\t} else if (\n\t\tdownloadRequestProvider.state.approvalCount &&\n\t\tdownloadRequestProvider.state.approvedCount > 0\n\t) {\n\t\treadOnlyValue = 'indeterminate';\n\t}\n\n\treturn useMemo(\n\t\t() => (\n\t\t\t<FormControlLabel\n\t\t\t\tlabel={i18n.t('i18n.approve')}\n\t\t\t\tsx={{\n\t\t\t\t\tmarginLeft: 0,\n\t\t\t\t\t'.MuiFormControlLabel-label': {\n\t\t\t\t\t\tmarginLeft: 1.25,\n\t\t\t\t\t\tfontSize: `0.875rem`,\n\t\t\t\t\t\tletterSpacing: '0.01071em',\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t\tcontrol={\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tdisabled={readOnly}\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\tindeterminate={\n\t\t\t\t\t\t\t(readOnly && readOnlyValue === 'indeterminate') ||\n\t\t\t\t\t\t\t!!tableRowSelectionProvider.state.rowsSelected.length ||\n\t\t\t\t\t\t\t!!tableRowSelectionProvider.state.rowsDeselected.length\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchecked={\n\t\t\t\t\t\t\ttableRowSelectionProvider.state.allRowsSelected ||\n\t\t\t\t\t\t\t(readOnly && readOnlyValue === true)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\ttableRowSelectionProvider.toggleAllRowsSelected(\n\t\t\t\t\t\t\t\tevent.target.checked,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t),\n\t\t[\n\t\t\ttableRowSelectionProvider.state.allRowsSelected,\n\t\t\ttableRowSelectionProvider.state.rowsSelected,\n\t\t\ttableRowSelectionProvider.state.rowsDeselected,\n\t\t\ttableRowSelectionProvider.toggleAllRowsSelected,\n\t\t\treadOnly,\n\t\t\treadOnlyValue,\n\t\t],\n\t);\n};\n\nexport const CheckboxHeaderCell = CheckboxHeaderCellComponent;\nexport default CheckboxHeaderCell;\n","import {i18n} from '@netx/core/i18n';\n\nimport {GenericCell} from '@netx/core-components/VirtualizedTable';\n\nimport type {DownloadRequestApprovalsListColumns} from './';\nimport {CheckboxHeaderCell, CheckboxCell} from './cells';\n\nexport const columns = (): DownloadRequestApprovalsListColumns => [\n\t{\n\t\tHeader: '',\n\t\tid: 'checkbox',\n\t\taccessor: (originalRow) => originalRow,\n\t\tinteractive: true,\n\t\twidth: 164,\n\t\tcolumnType: 'checkboxWithLabel',\n\t\tCell: CheckboxCell,\n\t\tColumnComponent: CheckboxHeaderCell,\n\t},\n\t{\n\t\tHeader: i18n.t('i18n.name'),\n\t\tid: 'name',\n\t\taccessor: (originalRow) =>\n\t\t\toriginalRow.asset?.name || `(${i18n.t('i18n.unknown')})`,\n\t\twidth: 200,\n\t\tCell: GenericCell,\n\t},\n\t{\n\t\tHeader: i18n.t('i18n.fileType'),\n\t\tid: 'fileType',\n\t\taccessor: (originalRow) =>\n\t\t\toriginalRow.asset?.fileType || `(${i18n.t('i18n.unknown')})`,\n\t\twidth: 150,\n\t\tCell: GenericCell,\n\t},\n];\n\nexport default () => columns();\n","import React, {useMemo, useCallback} from 'react';\n\nimport {i18n} from '@netx/core/i18n';\n\nimport {faList} from '@fortawesome/pro-solid-svg-icons';\nimport FallbackMessage from '@netx/core-components/FallbackMessage';\nimport {\n\tVirtualizedTableContainer,\n\tVirtualizedTableContainerProps,\n} from '@netx/core-components/VirtualizedTable';\nimport {useTableRowSelectionProvider} from '@netx/core-components/VirtualizedTable';\n\nimport getColumns from './columns';\nimport type {DownloadRequestApproval} from '../../types';\n\ntype VirtualizedTableProps = VirtualizedTableContainerProps<\n\tDownloadRequestApproval\n>;\ntype VirtualizedTableCallbacks = Required<\n\tPick<VirtualizedTableProps, 'onColumnClick' | 'onRowClick' | 'onRowKeyDown'>\n>;\n\nexport type DownloadRequestApprovalsListColumns = VirtualizedTableProps['columns'];\n\nexport interface DownloadRequestApprovalsListProps\n\textends Omit<VirtualizedTableProps, 'columns' | 'id'> {\n\tid: number;\n\treadOnly?: boolean;\n}\n\nexport const DownloadRequestApprovalsListPrimitive = ({\n\treadOnly,\n\tid,\n\tonColumnClick,\n\tonRowClick,\n\tonRowKeyDown,\n\t...props\n}: DownloadRequestApprovalsListProps) => {\n\tconst tableRowSelectionProvider = useTableRowSelectionProvider();\n\n\tconst columns = useMemo<DownloadRequestApprovalsListColumns>(\n\t\t() => getColumns(),\n\t\t[],\n\t);\n\n\tconst handleColumnClick = useCallback<\n\t\tVirtualizedTableCallbacks['onColumnClick']\n\t>(\n\t\t(column) => {\n\t\t\tonColumnClick?.(column);\n\n\t\t\tif (readOnly || column.id !== 'checkbox') return;\n\t\t\ttableRowSelectionProvider.toggleAllRowsSelected();\n\t\t},\n\t\t[onColumnClick, readOnly, tableRowSelectionProvider.toggleAllRowsSelected],\n\t);\n\n\tconst handleRowClick = useCallback<VirtualizedTableCallbacks['onRowClick']>(\n\t\t(event, index, row) => {\n\t\t\tif (readOnly) return;\n\t\t\ttableRowSelectionProvider.toggleRowSelected(row.original.id);\n\t\t\treturn onRowClick?.(event, index, row);\n\t\t},\n\t\t[onRowClick, readOnly, tableRowSelectionProvider.toggleRowSelected],\n\t);\n\n\tconst handleRowKeyDown = useCallback<\n\t\tVirtualizedTableCallbacks['onRowKeyDown']\n\t>(\n\t\t(event, index, row) => {\n\t\t\tif (readOnly) return;\n\t\t\ttableRowSelectionProvider.toggleRowSelected(row.original.id);\n\t\t\treturn onRowKeyDown?.(event, index, row);\n\t\t},\n\t\t[onRowKeyDown, readOnly, tableRowSelectionProvider.toggleRowSelected],\n\t);\n\n\tif (props.dataReady && props.total === 0) {\n\t\treturn (\n\t\t\t<FallbackMessage\n\t\t\t\ttitle={i18n.t('i18n.noRecords')}\n\t\t\t\ticon={faList}\n\t\t\t\tvariant=\"light\"\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<VirtualizedTableContainer<DownloadRequestApproval>\n\t\t\tcolumns={columns}\n\t\t\tdisableTabIndex\n\t\t\tfrozenLeadingColumnCount={1}\n\t\t\trowId=\"download-request-approval\"\n\t\t\tonColumnClick={handleColumnClick}\n\t\t\tonRowClick={handleRowClick}\n\t\t\tonRowKeyDown={handleRowKeyDown}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nexport const DownloadRequestApprovalsList = React.memo(\n\tDownloadRequestApprovalsListPrimitive,\n) as (props: DownloadRequestApprovalsListProps) => JSX.Element;\n\nexport default DownloadRequestApprovalsList;\n","// TODO: document and make usable for all other sides (currently only bottom support is tested and in)\nimport React, {useState, useRef, useEffect, useCallback, useMemo} from 'react';\nimport clsx from 'clsx';\nimport {Box} from '@mui/material';\n\nimport {Theme} from '@netx/core-components/Theme';\nimport {styled} from '@mui/material/styles';\nimport {useSwipeable, SwipeEventData} from 'react-swipeable';\nimport {nanoid} from 'nanoid';\n\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport {getTransitionProps} from '@mui/material/transitions/utils';\nimport {duration} from '@mui/material/styles/createTransitions';\nimport useWhenChangedEffect from '@netx/core-components/hooks/useWhenChangedEffect';\n\nconst HANDLE_HEIGHT = 42;\n\nconst StyledBox = styled(Box)(({theme}) => ({\n\tbackgroundColor: theme.palette.background.default,\n\theight: HANDLE_HEIGHT,\n\tflex: '0 0 auto',\n\tposition: 'relative',\n\tcursor: 'pointer',\n}));\n\nconst Puller = styled(Box)(({theme}) => ({\n\twidth: 32,\n\theight: 6,\n\tbackgroundColor: theme.palette.text.secondary,\n\tborderRadius: 3,\n\tposition: 'absolute',\n\ttop: 8,\n\tleft: 'calc(50% - 16px)',\n}));\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\tboxShadow:\n\t\t\t\ttheme.palette.mode === 'light' ? theme.shadows[2] : theme.shadows[6],\n\t\t\tposition: 'absolute',\n\t\t\tbackground: theme.palette.background.paper,\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t\tzIndex: 3,\n\t\t\twidth: '100%',\n\t\t\ttransform: 'translate(0px, 100%)',\n\t\t\tborderTopLeftRadius: 8,\n\t\t\tborderTopRightRadius: 8,\n\t\t\toverflow: 'hidden',\n\t\t\t'&$open, &$couldBeOpen': {\n\t\t\t\t'& $handle': {\n\t\t\t\t\tborderColor: theme.palette.custom.border,\n\t\t\t\t},\n\t\t\t},\n\t\t\t'&:not($open):not($couldBeOpen)': {\n\t\t\t\t'& $content': {\n\t\t\t\t\tvisibility: 'hidden',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcontent: {\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t\tflex: '1 1 auto',\n\t\t\toverflow: 'hidden',\n\t\t},\n\t\tcouldBeOpen: {},\n\t\tdummySpacer: {\n\t\t\tflex: '0 0 auto',\n\t\t\theight: HANDLE_HEIGHT,\n\t\t},\n\t\thandle: {\n\t\t\tborderBottom: `1px solid transparent`,\n\t\t\t'&:focus, &:active': {\n\t\t\t\toutline: 0,\n\t\t\t\t'& $puller': {\n\t\t\t\t\tbackgroundColor: theme.palette.primary.main,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tpuller: {\n\t\t\twidth: 32,\n\t\t\theight: 6,\n\t\t\tbackgroundColor: theme.palette.text.secondary,\n\t\t\tborderRadius: 3,\n\t\t\tposition: 'absolute',\n\t\t\ttop: 8,\n\t\t\tleft: 'calc(50% - 16px)',\n\t\t},\n\t\topen: {},\n\t\tbackdrop: {\n\t\t\t...theme.mixins.absoluteFill,\n\t\t\tbackground:\n\t\t\t\ttheme.palette.mode === 'light'\n\t\t\t\t\t? 'rgba(0, 0, 0, 0.28)'\n\t\t\t\t\t: 'rgba(0, 0, 0, 0.48)',\n\t\t\tzIndex: 3,\n\t\t\t'&:not($open)': {\n\t\t\t\tpointerEvents: 'none',\n\t\t\t},\n\t\t},\n\t});\n\nconst transitionDurationDefault = {\n\tenter: duration.enteringScreen,\n\texit: duration.leavingScreen,\n};\n\ntype Anchor = 'left' | 'right' | 'top' | 'bottom';\n\nconst oppositeDirection = {\n\tleft: 'right',\n\tright: 'left',\n\ttop: 'down',\n\tbottom: 'up',\n};\n\nconst GUTTER = 32;\n\nfunction isHorizontal(anchor: Anchor) {\n\treturn ['left', 'right'].indexOf(anchor) > -1;\n}\nfunction getAnchor(theme: Theme, anchor: Anchor) {\n\treturn theme.direction === 'rtl' && isHorizontal(anchor)\n\t\t? oppositeDirection[anchor]\n\t\t: anchor;\n}\n\nfunction getDelta(\n\tanchor: Anchor,\n\teventData: SwipeEventData,\n\tdrawerEl: HTMLDivElement,\n) {\n\tswitch (anchor) {\n\t\tcase 'left':\n\t\tcase 'right':\n\t\t\treturn eventData.deltaX;\n\t\tcase 'top':\n\t\tcase 'bottom':\n\t\t\treturn eventData.deltaY;\n\t}\n}\n\ntype PositionOptions = {\n\tmode?: 'enter' | 'exit' | null;\n\tchangeTransition?: boolean;\n};\n\nexport type SlidePanelProps = React.PropsWithChildren<{\n\tanchor?: Anchor;\n\thysteresis?: number;\n\tminFlingVelocity?: number;\n\theight: number;\n\tonOpen?: () => void;\n\tonClose?: () => void;\n\ttransitionDuration?: typeof transitionDurationDefault;\n}>;\n\nexport const SlidePanelPrimitive = ({\n\tclasses,\n\tchildren,\n\ttheme,\n\tanchor = 'bottom',\n\theight,\n\thysteresis = 0.52,\n\tminFlingVelocity = 450 / 1000,\n\tonClose,\n\tonOpen,\n\ttransitionDuration = transitionDurationDefault,\n}: WithStyles<typeof styles, true> & SlidePanelProps) => {\n\tconst mountedRefOnce = useRef(false);\n\n\tconst uuid = useMemo(() => `slide-panel-${nanoid()}`, []);\n\n\tconst [open, setOpen] = useState(false);\n\tconst ref = useRef<HTMLDivElement>(null);\n\tconst backdropRef = useRef<HTMLDivElement>(null);\n\tconst [couldBeOpen, setCouldBeOpen] = useState(false);\n\n\tconst translationBeforeSwipe = useRef(0);\n\tconst lastTranslation = useRef(translationBeforeSwipe.current);\n\n\tconst maxTranslateRef = useRef(height - HANDLE_HEIGHT);\n\tmaxTranslateRef.current = height - HANDLE_HEIGHT;\n\n\tconst setPosition = React.useCallback(\n\t\t(translate, options: PositionOptions = {}) => {\n\t\t\tif (!ref.current) return;\n\n\t\t\tconst horizontal = isHorizontal(anchor);\n\t\t\tconst maxTranslate = maxTranslateRef.current; //getMaxTranslate(horizontal, ref.current);\n\t\t\ttranslate = Math.max(Math.min(translate, maxTranslate), GUTTER);\n\n\t\t\tconst {mode = null, changeTransition = true} = options;\n\n\t\t\tconst anchorRtl = getAnchor(theme, anchor);\n\t\t\tconst rtlTranslateMultiplier =\n\t\t\t\t['right', 'bottom'].indexOf(anchorRtl) !== -1 ? 1 : -1;\n\t\t\tconst transform = isHorizontal(anchor)\n\t\t\t\t? `translate(${rtlTranslateMultiplier * translate}px, 0)`\n\t\t\t\t: `translate(0, ${rtlTranslateMultiplier * translate}px)`;\n\n\t\t\tconst drawerStyle = ref.current.style;\n\t\t\tdrawerStyle.webkitTransform = transform;\n\t\t\tdrawerStyle.transform = transform;\n\n\t\t\tconst transition = mode\n\t\t\t\t? theme.transitions.create(\n\t\t\t\t\t\t'all',\n\t\t\t\t\t\tgetTransitionProps(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\teasing: undefined,\n\t\t\t\t\t\t\t\tstyle: undefined,\n\t\t\t\t\t\t\t\ttimeout: transitionDuration,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmode,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t )\n\t\t\t\t: '';\n\n\t\t\tif (changeTransition) {\n\t\t\t\tdrawerStyle.webkitTransition = transition;\n\t\t\t\tdrawerStyle.transition = transition;\n\t\t\t}\n\n\t\t\tif (backdropRef.current) {\n\t\t\t\tconst backdropStyle = backdropRef.current.style;\n\t\t\t\tbackdropStyle.opacity = (1 - translate / maxTranslate).toString();\n\t\t\t\tif (changeTransition) {\n\t\t\t\t\tbackdropStyle.webkitTransition = transition;\n\t\t\t\t\tbackdropStyle.transition = transition;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlastTranslation.current = translate;\n\t\t},\n\t\t[anchor, theme, transitionDuration],\n\t);\n\n\tconst handleSwipeEnd = useCallback(\n\t\t(eventData: SwipeEventData) => {\n\t\t\tsetCouldBeOpen(false);\n\t\t\tif (!ref.current) return;\n\n\t\t\tconst horizontal = isHorizontal(anchor);\n\t\t\tconst maxTranslate = maxTranslateRef.current; //getMaxTranslate(horizontal, ref.current);\n\t\t\tconst currentTranslate = lastTranslation.current;\n\t\t\tconst translateRatio = currentTranslate / maxTranslate;\n\n\t\t\tif (open) {\n\t\t\t\teventData.velocity > minFlingVelocity || translateRatio > hysteresis\n\t\t\t\t\t? setOpen(false)\n\t\t\t\t\t: setPosition(0, {\n\t\t\t\t\t\t\tmode: 'exit',\n\t\t\t\t\t });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\teventData.velocity > minFlingVelocity || 1 - translateRatio > hysteresis\n\t\t\t\t? setOpen(true)\n\t\t\t\t: setPosition(maxTranslate, {\n\t\t\t\t\t\tmode: 'enter',\n\t\t\t\t });\n\t\t},\n\t\t[anchor, hysteresis, minFlingVelocity, open],\n\t);\n\n\tconst handleSwipeStart = useCallback((eventData: SwipeEventData) => {\n\t\ttranslationBeforeSwipe.current = lastTranslation.current;\n\t\tsetCouldBeOpen(true);\n\t}, []);\n\n\tconst handleSwipeMove = useCallback(\n\t\t(eventData: SwipeEventData) => {\n\t\t\tif (!ref.current) return;\n\t\t\tsetPosition(\n\t\t\t\ttranslationBeforeSwipe.current +\n\t\t\t\t\tgetDelta(anchor, eventData, ref.current),\n\t\t\t);\n\t\t},\n\t\t[anchor],\n\t);\n\n\tconst handlers = useSwipeable({\n\t\tonSwiped: handleSwipeEnd,\n\t\tonSwipeStart: handleSwipeStart,\n\t\tonSwiping: handleSwipeMove,\n\t});\n\n\tuseEffect(() => {\n\t\tif (mountedRefOnce.current || !ref.current) return;\n\t\tconst maxTranslate = maxTranslateRef.current; //getMaxTranslate(isHorizontal(anchor), ref.current);\n\t\tsetPosition(maxTranslate);\n\t});\n\n\tuseEffect(() => {\n\t\tif (!ref.current) return;\n\t\tmountedRefOnce.current = true;\n\n\t\topen\n\t\t\t? setPosition(0, {mode: 'enter'})\n\t\t\t: setPosition(maxTranslateRef.current, {mode: 'exit'});\n\t}, [anchor, open, height]);\n\n\tuseWhenChangedEffect(\n\t\topen,\n\t\tuseCallback(\n\t\t\t(open) => {\n\t\t\t\topen ? onOpen?.() : onClose?.();\n\t\t\t},\n\t\t\t[onClose, onOpen],\n\t\t),\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<div className={classes.dummySpacer} />\n\n\t\t\t<div\n\t\t\t\tclassName={clsx(classes.backdrop, {\n\t\t\t\t\t[classes.open]: open,\n\t\t\t\t})}\n\t\t\t\tref={backdropRef}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tonClick={() => setOpen(false)}\n\t\t\t/>\n\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={clsx(classes.root, {\n\t\t\t\t\t[classes.open]: open,\n\t\t\t\t\t[classes.couldBeOpen]: couldBeOpen,\n\t\t\t\t})}\n\t\t\t\tstyle={{height: height - GUTTER}}\n\t\t\t>\n\t\t\t\t<StyledBox\n\t\t\t\t\tclassName={classes.handle}\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\t{...handlers}\n\t\t\t\t\tonClick={() => setOpen((open) => !open)}\n\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\tswitch (event.key) {\n\t\t\t\t\t\t\tcase ' ':\n\t\t\t\t\t\t\tcase 'Enter':\n\t\t\t\t\t\t\t\tsetOpen((open) => !open);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={classes.puller}\n\t\t\t\t\t\taria-controls={uuid}\n\t\t\t\t\t\taria-expanded={couldBeOpen || open ? 'false' : 'true'}\n\t\t\t\t\t/>\n\t\t\t\t</StyledBox>\n\t\t\t\t<div\n\t\t\t\t\tid={uuid}\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\tclassName={clsx(classes.content, 'slide-panel')}\n\t\t\t\t\taria-hidden={couldBeOpen || open ? 'false' : 'true'}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n\nexport const SlidePanel = withStyles(styles, {withTheme: true})(\n\tSlidePanelPrimitive,\n);\nexport default SlidePanel;\n","import React from 'react';\n\nimport {SlidePanel, SlidePanelProps} from './SlidePanel';\n\n/**\n * wrap component in slide panel componenet\n * @example\n\tconst WrappedComponenet = withSlidePanel(Componenet);\n */\nexport const withSlidePanel = function <C extends React.ElementType>(\n\tComponent: C,\n\tdefaults?: Partial<SlidePanelProps>,\n) {\n\treturn ({\n\t\tSlidePanelProps,\n\t\t...props\n\t}: JSX.IntrinsicAttributes &\n\t\tJSX.LibraryManagedAttributes<C, React.ComponentProps<C>> & {\n\t\t\tSlidePanelProps: SlidePanelProps;\n\t\t}) => {\n\t\treturn (\n\t\t\t<SlidePanel {...defaults} {...SlidePanelProps}>\n\t\t\t\t<Component\n\t\t\t\t\t{...(props as JSX.IntrinsicAttributes &\n\t\t\t\t\t\tJSX.LibraryManagedAttributes<C, React.ComponentProps<C>>)}\n\t\t\t\t/>\n\t\t\t</SlidePanel>\n\t\t);\n\t};\n};\n\nexport default withSlidePanel;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface DownloadRequestDetailsClasses {\n\t/** Styles applied to the root element. */\n\troot: string;\n}\n\nexport function getDownloadRequestDetailsClass(slot: string) {\n\treturn generateUtilityClass('DownloadRequestDetails', slot);\n}\n\nexport const downloadRequestDetailsClasses = generateUtilityClasses(\n\t'DownloadRequestDetails',\n\t['root'],\n);\nexport default downloadRequestDetailsClasses;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport Tab, {TabProps} from '@netx/core-components/Tab';\nimport Tabs, {TabsProps} from '@netx/core-components/Tabs';\nimport {styled} from '@netx/core-components/Theme';\n\nconst DownloadRequestTabRoot = styled(Tab, {\n\tslot: 'Root',\n})(({theme}) => ({\n\twidth: '50%',\n\tmaxWidth: 'none',\n}));\n\nexport interface DownloadRequestDetailsTabsProps extends TabsProps {\n\tTabProps?: Omit<Partial<TabProps>, 'label'>;\n}\n\nexport const DownloadRequestDetailsTabsPrimitive = (\n\tprops: DownloadRequestDetailsTabsProps,\n) => {\n\tconst {TabProps, ...sendProps} = props;\n\treturn (\n\t\t<Tabs\n\t\t\tindicatorColor=\"primary\"\n\t\t\ttextColor=\"primary\"\n\t\t\taria-label=\"details\"\n\t\t\t{...sendProps}\n\t\t>\n\t\t\t<DownloadRequestTabRoot\n\t\t\t\tlabel={i18n.t('i18n.justification')}\n\t\t\t\t{...TabProps}\n\t\t\t/>\n\t\t\t<DownloadRequestTabRoot label={i18n.t('i18n.files')} {...TabProps} />\n\t\t</Tabs>\n\t);\n};\n\nexport const DownloadRequestDetailsTabs = React.memo(\n\tDownloadRequestDetailsTabsPrimitive,\n);\nexport default DownloadRequestDetailsTabs;\n","import React from 'react';\n\nimport SwipeableViews from 'react-swipeable-views';\n\nimport TabPanel from '@netx/core-components/TabPanel';\nimport {useTabsProvider} from '@netx/core-components/Tabs';\nimport {useTheme} from '@netx/core-components/Theme';\n\nimport {\n\tDownloadRequestJustificationDetailsScrollBordered,\n\tDownloadRequestDownloadOptionsScrollBordered,\n} from '../';\nimport type {DownloadRequestDetails as DownloadRequestDetailsType} from '../../types';\n\nexport type DownloadRequestDetailsTabPanelsProps = {\n\tdownloadRequestDetails: DownloadRequestDetailsType;\n\tloading?: boolean;\n};\n\nexport const DownloadRequestDetailsTabPanelsPrimitive = ({\n\tdownloadRequestDetails,\n\tloading,\n}: DownloadRequestDetailsTabPanelsProps) => {\n\tconst tabs = useTabsProvider();\n\tconst theme = useTheme();\n\treturn (\n\t\t<SwipeableViews\n\t\t\taxis={theme.direction === 'rtl' ? 'x-reverse' : 'x'}\n\t\t\tindex={tabs.activeTabIndex}\n\t\t\tonChangeIndex={tabs.setTab}\n\t\t\tdisableLazyLoading={true}\n\t\t\tstyle={{\n\t\t\t\tdisplay: 'flex',\n\t\t\t\theight: '100%',\n\t\t\t}}\n\t\t\tcontainerStyle={{\n\t\t\t\twidth: '100%',\n\t\t\t\t// https://github.com/oliviertassinari/react-swipeable-views/issues/599#issuecomment-657601754\n\t\t\t\ttransition: 'transform 0.35s cubic-bezier(0.15, 0.3, 0.25, 1) 0s',\n\t\t\t}}\n\t\t\tslideStyle={{\n\t\t\t\tdisplay: 'flex',\n\t\t\t\toverflow: 'hidden',\n\t\t\t}}\n\t\t>\n\t\t\t<TabPanel disablePadding value={0} index={0} keepMounted>\n\t\t\t\t<DownloadRequestJustificationDetailsScrollBordered\n\t\t\t\t\tdownloadRequestDetails={downloadRequestDetails}\n\t\t\t\t\tloading={loading}\n\t\t\t\t/>\n\t\t\t</TabPanel>\n\t\t\t<TabPanel disablePadding value={1} index={1} keepMounted>\n\t\t\t\t<DownloadRequestDownloadOptionsScrollBordered\n\t\t\t\t\tdata={downloadRequestDetails.options}\n\t\t\t\t\tloading={loading}\n\t\t\t\t/>\n\t\t\t</TabPanel>\n\t\t</SwipeableViews>\n\t);\n};\n\nexport const DownloadRequestDetailsTabPanels = React.memo(\n\tDownloadRequestDetailsTabPanelsPrimitive,\n);\nexport default DownloadRequestDetailsTabPanels;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport listSubheaderClasses from '@mui/material/ListSubheader/listSubheaderClasses';\nimport {composeClasses, styled} from '@netx/core-components/Theme';\n\nimport {\n\tgetDownloadRequestDetailsClass,\n\tDownloadRequestDetailsClasses,\n} from './downloadRequestDetailsClasses';\nimport {DownloadRequestDetailsTabs} from './DownloadRequestDetailsTabs';\nimport {DownloadRequestDetailsTabPanels} from './DownloadRequestDetailsTabPanels';\nimport type {DownloadRequestDetails as DownloadRequestDetailsType} from '../../types';\nimport {TabsProvider} from '@netx/core-components/Tabs';\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(slots, getDownloadRequestDetailsClass, classes);\n};\n\nconst DownloadRequestDetailsRoot = styled('div', {\n\tname: 'NxDocument',\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tflexDirection: 'column',\n\toverflow: 'hidden',\n\twhiteSpace: 'nowrap',\n\twidth: 350,\n\tborderLeft: `1px solid ${theme.palette.custom.border}`,\n\tboxShadow:\n\t\ttheme.palette.mode === 'light'\n\t\t\t? `inset 2px 0px 8px -2px rgb(0 0 0 / 8%)`\n\t\t\t: `inset 2px 0px 8px -2px rgb(0 0 0 / 45%)`,\n\tbackground:\n\t\ttheme.palette.mode === 'light' ? `rgba(0,0,0,0.02)` : `rgba(0,0,0,0.12)`,\n\t[`& .${listSubheaderClasses.root}`]: {\n\t\tbackground: 'transparent',\n\t\tposition: 'relative',\n\t\twidth: '100%',\n\t},\n}));\n\nexport type DownloadRequestDetailsProps = {\n\tclasses?: DownloadRequestDetailsClasses;\n\tclassName?: string;\n\tdownloadRequestDetails: DownloadRequestDetailsType;\n\tloading?: boolean;\n};\n\nexport const DownloadRequestDetailsPrimitive = (\n\tprops: DownloadRequestDetailsProps,\n) => {\n\tconst {className, loading, downloadRequestDetails} = props;\n\n\tconst classes = useUtilityClasses(props);\n\n\tif (!loading && !downloadRequestDetails.options.length) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<DownloadRequestDetailsRoot className={clsx(classes.root, className)}>\n\t\t\t<TabsProvider>\n\t\t\t\t<DownloadRequestDetailsTabs />\n\t\t\t\t<DownloadRequestDetailsTabPanels {...props} />\n\t\t\t</TabsProvider>\n\t\t</DownloadRequestDetailsRoot>\n\t);\n};\n\nexport const DownloadRequestDetails = React.memo(\n\tDownloadRequestDetailsPrimitive,\n);\nexport default DownloadRequestDetails;\n","import React from 'react';\nimport useMediaQuery from '@netx/core-components/hooks/useMediaQuery';\n\nimport {withSlidePanel} from '@netx/core-components/SlidePanel';\n\nimport DownloadRequestDetails, {\n\tDownloadRequestDetailsProps,\n} from './DownloadRequestDetails';\nimport {useTheme, styled} from '@netx/core-components/Theme';\nimport {SlidePanelProps} from '@netx/core-components/SlidePanel';\n\nexport * from './DownloadRequestDetails';\n\nexport const DownloadRequestDetailsSlidePanel = withSlidePanel(\n\tstyled(DownloadRequestDetails)({\n\t\tflex: '1 1 auto',\n\t\twidth: '100%',\n\t\tborderLeft: 0,\n\t\tboxShadow: 'none',\n\t}),\n);\n\nexport const DownloadRequestDetailsContainerPrimitive = ({\n\tSlidePanelProps,\n\t...props\n}: DownloadRequestDetailsProps & {\n\tSlidePanelProps: SlidePanelProps;\n}) => {\n\tconst theme = useTheme();\n\tconst smallScreen = useMediaQuery(theme.breakpoints.down('md'));\n\n\tif (!smallScreen) return <DownloadRequestDetails {...props} />;\n\treturn (\n\t\t<DownloadRequestDetailsSlidePanel\n\t\t\tSlidePanelProps={SlidePanelProps}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nexport const DownloadRequestDetailsContainer = React.memo(\n\tDownloadRequestDetailsContainerPrimitive,\n);\nexport default DownloadRequestDetailsContainer;\n","import React from 'react';\n\nimport {Avatar, ListItem, ListItemText, ListItemAvatar} from '@mui/material';\nimport {withStyles, createStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {\n\tfaFile as FileIcon,\n\tfaFileAudio as AudioIcon,\n\tfaEllipsisH as EllipsisIcon,\n\tfaImage as ImageIcon,\n\tfaList as ListIcon,\n\tfaFilePdf as PDFIcon,\n\tfaHistory as HistoryIcon,\n\tfaFileVideo as VideoIcon,\n} from '@fortawesome/pro-regular-svg-icons';\n\nimport {TOKEN_DOWNLOAD_OPTION_TYPES} from '@netx/core-share/constants';\nimport {getOptionLabel} from '@netx/core-share-request/labels';\n\nimport type {\n\tDownloadRequestDetails,\n\tDownloadRequestDetailsOption,\n} from '../../types';\n\nconst getOptionKey = (downloadOption: DownloadRequestDetailsOption) =>\n\t`${downloadOption.type}-${downloadOption.name}`;\n\nconst getIcon = (downloadOption: DownloadRequestDetailsOption) => {\n\tswitch (downloadOption.type) {\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.ORIGINAL:\n\t\t\treturn FileIcon;\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.PROXY:\n\t\t\treturn ImageIcon;\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.METADATA:\n\t\t\treturn ListIcon;\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.CONTACT_SHEET:\n\t\t\treturn PDFIcon;\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.HISTORICAL:\n\t\t\treturn HistoryIcon;\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.MANUAL_REPURPOSE: {\n\t\t\tif (downloadOption.family === 'audio') return AudioIcon;\n\t\t\tif (downloadOption.family === 'document') return PDFIcon;\n\t\t\tif (downloadOption.family === 'image') return ImageIcon;\n\t\t\tbreak;\n\t\t}\n\t\tcase TOKEN_DOWNLOAD_OPTION_TYPES.PRESET_PROCESS: {\n\t\t\tif (downloadOption.family === 'image') return ImageIcon;\n\t\t\tif (downloadOption.family === 'video') return VideoIcon;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn EllipsisIcon;\n};\n\nexport const downloadRequestDownloadOptionListItemStyles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {},\n\t\tavatar: {\n\t\t\tbackgroundColor: theme.palette.secondary.main,\n\t\t\tcolor: theme.palette.secondary.contrastText,\n\t\t},\n\t});\n\nexport type DownloadRequestDownloadOptionListItemProps = {\n\toption?: DownloadRequestDetails['options'][number];\n\tloading?: boolean;\n};\n\nexport const DownloadRequestDownloadOptionListItemPrimitive = ({\n\tclasses,\n\toption,\n\tloading,\n}: WithStyles<typeof downloadRequestDownloadOptionListItemStyles> &\n\tDownloadRequestDownloadOptionListItemProps) => {\n\t// TODO: never got around to skeletons here apparently\n\treturn (\n\t\t<ListItem className={classes.root}>\n\t\t\t<ListItemAvatar>\n\t\t\t\t<Avatar className={classes.avatar}>\n\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\ticon={loading || !option ? EllipsisIcon : getIcon(option)}\n\t\t\t\t\t/>\n\t\t\t\t</Avatar>\n\t\t\t</ListItemAvatar>\n\n\t\t\t<ListItemText\n\t\t\t\tid={loading || !option ? undefined : getOptionKey(option)}\n\t\t\t\tprimary={\n\t\t\t\t\tloading || !option ? 'loading...' : getOptionLabel(option as any)\n\t\t\t\t}\n\t\t\t/>\n\t\t</ListItem>\n\t);\n};\n\nexport const DownloadRequestDownloadOptionListItem = withStyles(\n\tdownloadRequestDownloadOptionListItemStyles,\n)(DownloadRequestDownloadOptionListItemPrimitive);\nexport default DownloadRequestDownloadOptionListItem;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {List, ListSubheader} from '@mui/material';\nimport {withStyles, createStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport {TokenDownloadOptionType} from '@netx/core-share-request/types';\nimport {TOKEN_DOWNLOAD_OPTION_TYPES} from '@netx/core-share/constants';\nimport ScrollBorder from '@netx/core-components/ScrollBorder';\n\nimport FallbackMessage from '@netx/core-components/FallbackMessage';\n\nimport {faListUl} from '@fortawesome/pro-solid-svg-icons';\n\nimport type {\n\tDownloadRequestDetails,\n\tDownloadRequestDetailsOption,\n} from '../../types';\n\nimport {DownloadRequestDownloadOptionListItem} from './DownloadRequestDownloadOptionsListItem';\n\n// TODO: move this to asset specific code (duplciating share request asset info here)\nconst getOptionHeaderLabel = (downloadOption: DownloadRequestDetailsOption) => {\n\tif (downloadOption.type === 'historical') return i18n.t('i18n.history');\n\treturn i18n.t(`i18n.${downloadOption.type}`);\n};\n\nconst getOptionKey = (downloadOption: DownloadRequestDetailsOption) =>\n\t`${downloadOption.type}-${downloadOption.name}`;\n\nconst shouldShowHeader = (downloadOption: DownloadRequestDetailsOption) => {\n\treturn !([\n\t\tTOKEN_DOWNLOAD_OPTION_TYPES.ORIGINAL,\n\t\tTOKEN_DOWNLOAD_OPTION_TYPES.PROXY,\n\t] as TokenDownloadOptionType[]).includes(downloadOption.type);\n};\n\nexport const downloadRequestDownloadOptionsStyles = (theme: Theme) =>\n\tcreateStyles({\n\t\tscrollBorder: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\twidth: '100%',\n\t\t\tflexDirection: 'column',\n\t\t},\n\t\tfallback: {\n\t\t\tbackground: 'transparent',\n\t\t\tmarginTop: -48,\n\t\t},\n\t\tlist: {},\n\t});\n\nexport type DownloadRequestDownloadOptionsProps = {\n\tdata: DownloadRequestDetails['options'];\n\tloading?: boolean;\n};\n\nexport const DownloadRequestDownloadOptionsPrimitive = ({\n\tclasses,\n\tdata,\n\tloading,\n}: WithStyles<typeof downloadRequestDownloadOptionsStyles> &\n\tDownloadRequestDownloadOptionsProps) => {\n\tlet lastHeader = '';\n\n\tif (!loading && !data.length) {\n\t\treturn (\n\t\t\t<FallbackMessage\n\t\t\t\tclassName={classes.fallback}\n\t\t\t\ttitle={i18n.t('i18n.noDownloadOptions')}\n\t\t\t\ticon={faListUl}\n\t\t\t\tvariant=\"light\"\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<List className={classes.list} component=\"div\">\n\t\t\t{loading\n\t\t\t\t? [1].map((_, index) => (\n\t\t\t\t\t\t<DownloadRequestDownloadOptionListItem\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t/>\n\t\t\t\t ))\n\t\t\t\t: data.map((downloadOption) => {\n\t\t\t\t\t\tconst showSubHeader =\n\t\t\t\t\t\t\tlastHeader !== downloadOption.type &&\n\t\t\t\t\t\t\tshouldShowHeader(downloadOption);\n\t\t\t\t\t\tlastHeader = downloadOption.type;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{(showSubHeader && (\n\t\t\t\t\t\t\t\t\t<ListSubheader key={`${downloadOption.type}-subheader`}>\n\t\t\t\t\t\t\t\t\t\t{getOptionHeaderLabel(downloadOption)}\n\t\t\t\t\t\t\t\t\t</ListSubheader>\n\t\t\t\t\t\t\t\t)) ||\n\t\t\t\t\t\t\t\t\tnull}\n\n\t\t\t\t\t\t\t\t<DownloadRequestDownloadOptionListItem\n\t\t\t\t\t\t\t\t\tkey={getOptionKey(downloadOption)}\n\t\t\t\t\t\t\t\t\toption={downloadOption}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t);\n\t\t\t\t })}\n\t\t</List>\n\t);\n};\n\nexport const DownloadRequestDownloadOptionsScrollBordered = withStyles(\n\tdownloadRequestDownloadOptionsStyles,\n)(\n\t(\n\t\tprops: WithStyles<typeof downloadRequestDownloadOptionsStyles> &\n\t\t\tDownloadRequestDownloadOptionsProps,\n\t) => {\n\t\treturn (\n\t\t\t<ScrollBorder\n\t\t\t\tclassName={props.classes.scrollBorder}\n\t\t\t\tcontentPadding=\"8px 4px\"\n\t\t\t>\n\t\t\t\t<DownloadRequestDownloadOptions {...props} />\n\t\t\t</ScrollBorder>\n\t\t);\n\t},\n);\n\nexport const DownloadRequestDownloadOptions = withStyles(\n\tdownloadRequestDownloadOptionsStyles,\n)(DownloadRequestDownloadOptionsPrimitive);\nexport default DownloadRequestDownloadOptions;\n","import React from 'react';\n\nimport {withStyles, createStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport ReadOnlyTextField from '@netx/core-components/Form/TextField/ReadOnlyTextField';\n\nimport type {DownloadRequestDetails} from '../../types';\n\nexport const downloadRequestJustificationDetailsFieldStyles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\t'& + &': {\n\t\t\t\tmarginTop: theme.spacing(1),\n\t\t\t},\n\t\t},\n\t});\n\nexport type DownloadRequestJustificationDetailsFieldProps = {\n\tjustification?: DownloadRequestDetails['justification'][number];\n\tloading?: boolean;\n};\n\nexport const DownloadRequestJustificationDetailsFieldPrimitive = ({\n\tclasses,\n\tjustification,\n\tloading,\n}: WithStyles<typeof downloadRequestJustificationDetailsFieldStyles> &\n\tDownloadRequestJustificationDetailsFieldProps) => {\n\tif (loading || !justification)\n\t\treturn <ReadOnlyTextField className={classes.root} loading label=\"...\" />;\n\treturn (\n\t\t<ReadOnlyTextField\n\t\t\tclassName={classes.root}\n\t\t\tlabel={justification.label}\n\t\t\tvalue={justification.value}\n\t\t\twrapLabel\n\t\t/>\n\t);\n};\n\nexport const DownloadRequestJustificationDetailsField = withStyles(\n\tdownloadRequestJustificationDetailsFieldStyles,\n)(DownloadRequestJustificationDetailsFieldPrimitive);\nexport default DownloadRequestJustificationDetailsField;\n","import React from 'react';\n\nimport {withStyles, createStyles, WithStyles} from '@mui/styles';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport ScrollBorder from '@netx/core-components/ScrollBorder';\n\nimport type {DownloadRequestDetails} from '../../types';\nimport {DownloadRequestRequesterPaper} from '../';\nimport {DownloadRequestJustificationDetailsField} from './DownloadRequestJustificationDetailsField';\n\nexport const downloadRequestJustificationDetailsStyles = (theme: Theme) =>\n\tcreateStyles({\n\t\tscrollBorder: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\twidth: '100%',\n\t\t\tflexDirection: 'column',\n\t\t},\n\t});\n\nexport type DownloadRequestJustificationDetailsProps = {\n\tdownloadRequestDetails: DownloadRequestDetails;\n\tloading?: boolean;\n};\n\nexport const DownloadRequestJustificationDetailsPrimitive = ({\n\tclasses,\n\tdownloadRequestDetails,\n\tloading,\n}: WithStyles<typeof downloadRequestJustificationDetailsStyles> &\n\tDownloadRequestJustificationDetailsProps) => {\n\treturn (\n\t\t<>\n\t\t\t<DownloadRequestRequesterPaper\n\t\t\t\tloading={loading}\n\t\t\t\tdownloadRequestDetails={downloadRequestDetails}\n\t\t\t/>\n\t\t\t{loading\n\t\t\t\t? [1, 2, 3, 4, 5, 6].map((_, index) => (\n\t\t\t\t\t\t<DownloadRequestJustificationDetailsField\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t/>\n\t\t\t\t ))\n\t\t\t\t: downloadRequestDetails.justification.map((d) => (\n\t\t\t\t\t\t<DownloadRequestJustificationDetailsField\n\t\t\t\t\t\t\tkey={d.label}\n\t\t\t\t\t\t\tjustification={d}\n\t\t\t\t\t\t/>\n\t\t\t\t ))}\n\t\t</>\n\t);\n};\n\nexport const DownloadRequestJustificationDetailsScrollBordered = withStyles(\n\tdownloadRequestJustificationDetailsStyles,\n)(\n\t(\n\t\tprops: WithStyles<typeof downloadRequestJustificationDetailsStyles> &\n\t\t\tDownloadRequestJustificationDetailsProps,\n\t) => {\n\t\treturn (\n\t\t\t<ScrollBorder\n\t\t\t\tclassName={props.classes.scrollBorder}\n\t\t\t\tcontentPadding=\"8px 4px\"\n\t\t\t>\n\t\t\t\t<DownloadRequestJustificationDetails {...props} />\n\t\t\t</ScrollBorder>\n\t\t);\n\t},\n);\n\nexport const DownloadRequestJustificationDetails = withStyles(\n\tdownloadRequestJustificationDetailsStyles,\n)(DownloadRequestJustificationDetailsPrimitive);\nexport default DownloadRequestJustificationDetails;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface DownloadRequestRequesterPaperContentClasses {\n\t/** styles applied to the root element */\n\troot: string;\n\tprimary: string;\n\tsecondary: string;\n}\n\nexport const getDownloadRequestRequesterPaperContentUtilityClass = (\n\tslot: string,\n) => generateUtilityClass('DownloadRequestRequesterPaperContent', slot);\n\nexport const downloadRequestRequesterPaperContentClasses = generateUtilityClasses<\n\tkeyof DownloadRequestRequesterPaperContentClasses\n>('DownloadRequestRequesterPaperContent', ['root', 'primary', 'secondary']);\nexport default downloadRequestRequesterPaperContentClasses;\n","import React, {useMemo} from 'react';\n\nimport moment from '@netx/core/lib/netx-moment';\n\nimport {\n\tTypography,\n\tTypographyProps,\n\tSkeleton,\n\tSkeletonProps,\n} from '@mui/material';\n\nexport interface DownloadRequestRequesterDateProps\n\textends Omit<\n\t\tTypographyProps<\n\t\t\t'div',\n\t\t\t{\n\t\t\t\tloading?: boolean;\n\t\t\t\tdate?: string;\n\t\t\t\tSkeletonProps?: Partial<SkeletonProps>;\n\t\t\t}\n\t\t>,\n\t\t'children'\n\t> {}\n\nexport const DownloadRequestRequesterDatePrimitive = (\n\tprops: DownloadRequestRequesterDateProps,\n) => {\n\tconst {loading, date, SkeletonProps, ...sendProps} = props;\n\n\tconst formattedDate = useMemo(\n\t\t() => moment(date).format('MMMM Do YYYY, h:mm:ss A'),\n\t\t[date],\n\t);\n\n\tif (loading) return <Skeleton width={'60%'} height={19} {...SkeletonProps} />;\n\n\treturn (\n\t\t<Typography\n\t\t\tvariant=\"caption\"\n\t\t\tnoWrap\n\t\t\ttitle={date}\n\t\t\tcomponent=\"div\"\n\t\t\t{...sendProps}\n\t\t>\n\t\t\t{formattedDate !== 'Invalid date' ? formattedDate : ''}\n\t\t</Typography>\n\t);\n};\n\nexport const DownloadRequestRequesterDate =\n\tDownloadRequestRequesterDatePrimitive;\nexport default DownloadRequestRequesterDate;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {\n\tTypography,\n\tTypographyProps,\n\tSkeleton,\n\tSkeletonProps,\n} from '@mui/material';\n\nexport interface DownloadRequestRequesterEmailProps\n\textends Omit<\n\t\tTypographyProps<\n\t\t\t'div',\n\t\t\t{\n\t\t\t\tloading?: boolean;\n\t\t\t\temail?: string;\n\t\t\t\tSkeletonProps?: Partial<SkeletonProps>;\n\t\t\t}\n\t\t>,\n\t\t'children'\n\t> {}\n\nexport const DownloadRequestRequesterEmailPrimitive = (\n\tprops: DownloadRequestRequesterEmailProps,\n) => {\n\tconst {loading, email = '', SkeletonProps, ...sendProps} = props;\n\n\tif (loading) return <Skeleton width={'85%'} height={20} {...SkeletonProps} />;\n\n\treturn (\n\t\t<Typography\n\t\t\tvariant=\"body2\"\n\t\t\tnoWrap\n\t\t\ttitle={email}\n\t\t\tcomponent=\"div\"\n\t\t\t{...sendProps}\n\t\t>\n\t\t\t{email}\n\t\t</Typography>\n\t);\n};\n\nexport const DownloadRequestRequesterEmail = DownloadRequestRequesterEmailPrimitive;\nexport default DownloadRequestRequesterEmail;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {\n\tTypography,\n\tTypographyProps,\n\tSkeleton,\n\tSkeletonProps,\n} from '@mui/material';\n\nexport interface DownloadRequestRequesterNameProps\n\textends Omit<\n\t\tTypographyProps<\n\t\t\t'div',\n\t\t\t{\n\t\t\t\tloading?: boolean;\n\t\t\t\tname?: string;\n\t\t\t\tSkeletonProps?: Partial<SkeletonProps>;\n\t\t\t}\n\t\t>,\n\t\t'children'\n\t> {}\n\nexport const DownloadRequestRequesterNamePrimitive = (\n\tprops: DownloadRequestRequesterNameProps,\n) => {\n\tconst {\n\t\tloading,\n\t\tname = `(${i18n.t('i18n.unknown')})`,\n\t\tSkeletonProps,\n\t\t...sendProps\n\t} = props;\n\n\tif (loading) return <Skeleton width={'75%'} height={24} {...SkeletonProps} />;\n\n\treturn (\n\t\t<Typography\n\t\t\tvariant=\"body1\"\n\t\t\tnoWrap\n\t\t\ttitle={name}\n\t\t\tcomponent=\"div\"\n\t\t\t{...sendProps}\n\t\t>\n\t\t\t{name}\n\t\t</Typography>\n\t);\n};\n\nexport const DownloadRequestRequesterName = DownloadRequestRequesterNamePrimitive;\nexport default DownloadRequestRequesterName;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {\n\tTypography,\n\tTypographyProps,\n\tSkeleton,\n\tSkeletonProps,\n} from '@mui/material';\nimport {styled, WithMuiPropOverrides} from '@netx/core-components/Theme';\n\nconst DownloadRequestRequesterSourceRoot = styled(Typography)({\n\tdisplay: 'inline-block',\n});\n\nexport interface DownloadRequestRequesterSourceProps\n\textends WithMuiPropOverrides<\n\t\tOmit<\n\t\t\tTypographyProps<\n\t\t\t\t'span',\n\t\t\t\t{\n\t\t\t\t\tloading?: boolean;\n\t\t\t\t\tsource?: string;\n\t\t\t\t\tSkeletonProps?: Partial<SkeletonProps>;\n\t\t\t\t}\n\t\t\t>,\n\t\t\t'children'\n\t\t>\n\t> {}\n\nexport const DownloadRequestRequesterSourcePrimitive = (\n\tprops: DownloadRequestRequesterSourceProps,\n) => {\n\tconst {loading, source, SkeletonProps, ...sendProps} = props;\n\n\tconst displaySource =\n\t\tsource == null || source === '' ? `(${i18n.t('i18n.unknown')})` : source;\n\n\tif (loading) return <Skeleton width={'60%'} height={19} {...SkeletonProps} />;\n\n\treturn (\n\t\t<DownloadRequestRequesterSourceRoot\n\t\t\tvariant=\"caption\"\n\t\t\tnoWrap\n\t\t\ttitle={`${i18n.t('i18n.source')}: ${displaySource}`}\n\t\t\t{...sendProps}\n\t\t>\n\t\t\t{i18n.t('i18n.source')}: {displaySource}\n\t\t</DownloadRequestRequesterSourceRoot>\n\t);\n};\n\nexport const DownloadRequestRequesterSource = DownloadRequestRequesterSourcePrimitive;\nexport default DownloadRequestRequesterSource;\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {composeClasses, styled} from '@netx/core-components/Theme';\n\nimport downloadRequestRequesterPaperContentClasses, {\n\tgetDownloadRequestRequesterPaperContentUtilityClass,\n\tDownloadRequestRequesterPaperContentClasses,\n} from './downloadRequestRequesterPaperContentClasses';\nimport {DownloadRequestRequesterDate} from './DownloadRequestRequesterDate';\nimport {DownloadRequestRequesterEmail} from './DownloadRequestRequesterEmail';\nimport {DownloadRequestRequesterName} from './DownloadRequestRequesterName';\nimport {DownloadRequestRequesterSource} from './DownloadRequestRequesterSource';\nimport type {DownloadRequestDetails} from '../../types';\n\nconst useUtilityClasses = (\n\townerState: Pick<DownloadRequestRequesterPaperContentProps, 'classes'>,\n) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t\tprimary: ['primary'],\n\t\tsecondary: ['secondary'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetDownloadRequestRequesterPaperContentUtilityClass,\n\t\tclasses as typeof downloadRequestRequesterPaperContentClasses,\n\t);\n};\n\nconst DownloadRequestRequesterPaperContentRoot = styled('div', {\n\tname: 'DownloadRequestRequesterPaperContent',\n\tslot: 'Root',\n})(({theme}) => ({\n\tflex: '1 1 auto',\n\toverflow: 'hidden',\n}));\n\nconst DownloadRequestRequesterPaperContentPrimaryRoot = styled('div', {\n\tname: 'DownloadRequestRequesterPaperContent',\n\tslot: 'Primary',\n})(({theme}) => ({\n\tmarginBottom: theme.spacing(0.5),\n\t[theme.breakpoints.down('md')]: {\n\t\ttextAlign: 'center',\n\t},\n}));\n\nconst DownloadRequestRequesterPaperContentSecondaryRoot = styled('div', {\n\tname: 'DownloadRequestRequesterPaperContent',\n\tslot: 'Secondary',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\t[theme.breakpoints.down('md')]: {\n\t\talignItems: 'center',\n\t},\n}));\n\nexport interface DownloadRequestRequesterPaperContentProps\n\textends React.DetailedHTMLProps<\n\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\tHTMLDivElement\n\t> {\n\tclasses?: Partial<DownloadRequestRequesterPaperContentClasses>;\n\tclassName?: string;\n\tdownloadRequestDetails: DownloadRequestDetails;\n\tloading?: boolean;\n}\n\nexport const DownloadRequestRequesterPaperContentPrimitive = (\n\tprops: DownloadRequestRequesterPaperContentProps,\n) => {\n\tconst {className, downloadRequestDetails, loading, ...sendProps} = props;\n\n\tconst classes = useUtilityClasses({\n\t\tclasses: sendProps.classes,\n\t});\n\n\treturn (\n\t\t<DownloadRequestRequesterPaperContentRoot\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\t{...sendProps}\n\t\t>\n\t\t\t<DownloadRequestRequesterPaperContentPrimaryRoot\n\t\t\t\tclassName={classes.primary}\n\t\t\t>\n\t\t\t\t<DownloadRequestRequesterName\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tname={downloadRequestDetails.requester?.name}\n\t\t\t\t/>\n\t\t\t\t<DownloadRequestRequesterEmail\n\t\t\t\t\tloading={loading}\n\t\t\t\t\temail={downloadRequestDetails.requester?.email}\n\t\t\t\t/>\n\t\t\t</DownloadRequestRequesterPaperContentPrimaryRoot>\n\t\t\t<DownloadRequestRequesterPaperContentSecondaryRoot\n\t\t\t\tclassName={classes.secondary}\n\t\t\t>\n\t\t\t\t<DownloadRequestRequesterDate\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tdate={downloadRequestDetails.requestDate}\n\t\t\t\t/>\n\t\t\t\t<DownloadRequestRequesterSource\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tsource={downloadRequestDetails.portalContext}\n\t\t\t\t/>\n\t\t\t</DownloadRequestRequesterPaperContentSecondaryRoot>\n\t\t</DownloadRequestRequesterPaperContentRoot>\n\t);\n};\n\nexport const DownloadRequestRequesterPaperContent = DownloadRequestRequesterPaperContentPrimitive;\nexport default DownloadRequestRequesterPaperContent;\n","import React from 'react';\n\nimport {Paper, PaperProps} from '@mui/material';\nimport ColoredAvatar, {\n\tColoredAvatarProps,\n} from '@netx/core-components/ColoredAvatar';\nimport {styled} from '@netx/core-components/Theme';\n\nimport {\n\tDownloadRequestRequesterPaperContent,\n\tDownloadRequestRequesterPaperContentProps,\n} from './DownloadRequestRequesterPaperContent';\nimport type {DownloadRequestDetails} from '../../types';\n\nconst ColoredAvatarRoot = styled(ColoredAvatar)(({theme}) => ({\n\tflex: '0 0 auto',\n\tmarginRight: theme.spacing(2),\n\t[theme.breakpoints.down('md')]: {\n\t\tmarginRight: 0,\n\t\tmarginBottom: theme.spacing(1),\n\t},\n}));\n\nconst DownloadRequestRequesterPaperRoot = styled(Paper, {\n\tname: 'DownloadRequestRequesterPaper',\n\tslot: 'Root',\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tpadding: theme.spacing(2),\n\tmargin: theme.spacing(2),\n\talignItems: 'center',\n\toverflow: 'hidden',\n\twidth: `calc(100% - ${theme.spacing(4)})`,\n\t[theme.breakpoints.down('md')]: {\n\t\tflexDirection: 'column',\n\t\tjustifyContent: 'center',\n\t},\n}));\n\nexport interface DownloadRequestRequesterPaperProps extends PaperProps {\n\tdownloadRequestDetails: DownloadRequestDetails;\n\tloading?: boolean;\n\tAvatarProps?: Partial<ColoredAvatarProps>;\n\tContentProps?: Partial<DownloadRequestRequesterPaperContentProps>;\n}\n\nexport const DownloadRequestRequesterPaperPrimitive = (\n\tprops: DownloadRequestRequesterPaperProps,\n) => {\n\tconst {\n\t\tdownloadRequestDetails,\n\t\tloading,\n\t\tAvatarProps,\n\t\tContentProps,\n\t\t...sendProps\n\t} = props;\n\treturn (\n\t\t<DownloadRequestRequesterPaperRoot\n\t\t\tvariant=\"outlined\"\n\t\t\trole=\"presentation\"\n\t\t\t{...sendProps}\n\t\t>\n\t\t\t<ColoredAvatarRoot\n\t\t\t\tlabel={downloadRequestDetails.requester?.name || '?'}\n\t\t\t\tloading={loading}\n\t\t\t\t{...AvatarProps}\n\t\t\t/>\n\t\t\t<DownloadRequestRequesterPaperContent\n\t\t\t\tloading={loading}\n\t\t\t\tdownloadRequestDetails={downloadRequestDetails}\n\t\t\t\t{...ContentProps}\n\t\t\t/>\n\t\t</DownloadRequestRequesterPaperRoot>\n\t);\n};\n\nexport const DownloadRequestRequesterPaper = DownloadRequestRequesterPaperPrimitive;\nexport default DownloadRequestRequesterPaper;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface DownloadRequestsHeaderClasses {\n\t/** styles applied to the root element */\n\troot: string;\n\tactions: string;\n\ttitle: string;\n}\n\nexport const getDownloadRequestsHeaderUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('DownloadRequestsHeader', slot);\n\nexport const downloadRequestsHeaderClasses = generateUtilityClasses<\n\tkeyof DownloadRequestsHeaderClasses\n>('DownloadRequestsHeader', ['root', 'actions', 'title']);\nexport default downloadRequestsHeaderClasses;\n","import React, {useCallback, useState} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport SelectField, {\n\tSelectFieldProps,\n} from '@netx/core-components/Form/SelectField';\nimport {styled} from '@netx/core-components/Theme';\n\nimport {REVIEW_STATUS} from '../../constants';\nimport {useDownloadRequestsProvider} from '../../contexts';\nimport {REVIEW_STATUS_LABEL} from '../../locales';\nimport type {ReviewStatus} from '../../types';\n\nconst DownloadRequestsStatusFilterRoot = styled(SelectField, {\n\tslot: 'Root',\n\toverridesResolver: (props, styles) => styles.root,\n})(({theme}) => ({\n\tflex: '0 0 auto',\n\tminWidth: 200,\n\twidth: 'auto',\n\t[theme.breakpoints.down('md')]: {\n\t\twidth: '100%',\n\t},\n})) as <\n\tT,\n\tMultiple extends boolean | undefined = false,\n\tDisableClearable extends boolean | undefined = false,\n\tFreeSolo extends boolean | undefined = false\n>(\n\tprops: Omit<\n\t\tSelectFieldProps<T, Multiple, DisableClearable, FreeSolo>,\n\t\t'classes'\n\t>,\n) => JSX.Element;\n\ntype FilterOption = {\n\tlabel: string;\n\tvalue: ReviewStatus[];\n};\n\nconst FILTER_OPTIONS = [\n\t{\n\t\tlabel: REVIEW_STATUS_LABEL[REVIEW_STATUS.PENDING],\n\t\tvalue: [REVIEW_STATUS.PENDING],\n\t},\n\t{\n\t\tlabel: REVIEW_STATUS_LABEL[REVIEW_STATUS.COMPLETED],\n\t\tvalue: [REVIEW_STATUS.COMPLETED],\n\t},\n\t{\n\t\tlabel: i18n.t('i18n.any'),\n\t\tvalue: [REVIEW_STATUS.PENDING, REVIEW_STATUS.COMPLETED],\n\t},\n];\n\nexport type DownloadRequestsStatusFilterProps = {};\n\nexport const DownloadRequestsStatusFilterPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tDownloadRequestsStatusFilterProps\n>((props, ref) => {\n\tconst provider = useDownloadRequestsProvider();\n\n\tconst [approvalStatusFilter, setApprovalStatusFilter] = useState<\n\t\tFilterOption\n\t>(\n\t\tFILTER_OPTIONS.find(\n\t\t\t(opt) =>\n\t\t\t\t!opt.value.some(\n\t\t\t\t\t(val) =>\n\t\t\t\t\t\topt.value.length !== provider.state.filterStatus.length ||\n\t\t\t\t\t\t!provider.state.filterStatus.includes(val),\n\t\t\t\t),\n\t\t) || FILTER_OPTIONS[0],\n\t);\n\n\tconst handleApprovalStatusFilter = useCallback(\n\t\t(value?: FilterOption | null | undefined) => {\n\t\t\tsetApprovalStatusFilter(value || FILTER_OPTIONS[0]);\n\t\t\tprovider.actions.setStatusFilter((value || FILTER_OPTIONS[0]).value);\n\t\t},\n\t\t[provider],\n\t);\n\n\treturn (\n\t\t<DownloadRequestsStatusFilterRoot<FilterOption, false, true>\n\t\t\tdisabled={!provider.state.ready}\n\t\t\tlabel={i18n.t('i18n.status')}\n\t\t\tlabelKey=\"label\"\n\t\t\tname=\"approvalStatusFilter\"\n\t\t\tonChange={handleApprovalStatusFilter}\n\t\t\toptions={FILTER_OPTIONS}\n\t\t\tvalue={approvalStatusFilter}\n\t\t\tAutocompleteProps={{\n\t\t\t\tdisableClearable: true,\n\t\t\t}}\n\t\t/>\n\t);\n});\n\nexport const DownloadRequestsStatusFilter = React.memo(\n\tDownloadRequestsStatusFilterPrimitive,\n);\nexport default DownloadRequestsStatusFilter;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface SearchFilterExpandableClasses {\n\t/** Styles applied to the root element. */\n\troot: string;\n\texpanded: string;\n}\n\nexport const getSearchFilterExpandableUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('SearchFilterExpandable', slot);\n\nexport const searchFilterExpandableClasses = generateUtilityClasses(\n\t'SearchFilterExpandable',\n\t['root', 'expanded'],\n);\nexport default searchFilterExpandableClasses;\n","import React, {useCallback, useEffect, useState} from 'react';\n\nimport {inputClasses} from '@mui/material/Input';\nimport {outlinedInputClasses} from '@mui/material/OutlinedInput';\nimport {formControlClasses} from '@mui/material/FormControl';\nimport {composeClasses, styled} from '@netx/core-components/Theme';\n\nimport searchFilterExpandableClasses, {\n\tgetSearchFilterExpandableUtilityClass,\n} from './searchFilterExpandableClasses';\nimport {\n\tSearchFilter,\n\tSearchFilterProps,\n\tsearchFilterClasses,\n\tsearchFilterEndAdornmentClasses,\n\tsearchFilterStartAdornmentClasses,\n} from '../SearchFilter';\nimport {useWhenChangedEffect} from '../hooks/useWhenChangedEffect';\n\nexport const COLLAPSED_WIDTH = 48;\nexport const DEFAULT_EXPANDED_WIDTH = 200;\nexport const MINIMUM_EXPANDED_WIDTH = 75;\n\nexport interface SearchFilterExpandableProps extends SearchFilterProps {\n\twidth?: number | string;\n\tonOpen?: () => void;\n\tonClose?: () => void;\n}\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {classes, expanded} = ownerState;\n\tconst slots = {\n\t\troot: ['root', expanded && 'expanded'],\n\t};\n\treturn composeClasses(slots, getSearchFilterExpandableUtilityClass, classes);\n};\n\nconst SearchFilterExpandableFieldRoot = styled('div', {\n\tname: 'SearchFilterExpandable',\n\tslot: 'Root',\n\tshouldForwardProp: (prop) => prop !== 'width',\n})(({theme, ...rest}) => {\n\tconst {width} = rest as any;\n\treturn {\n\t\t[`& .${searchFilterClasses.root}`]: {\n\t\t\tflex: '0 0 auto',\n\t\t\twidth: COLLAPSED_WIDTH,\n\t\t\ttransition: theme.transitions.create('width', {\n\t\t\t\teasing: theme.transitions.easing.sharp,\n\t\t\t\tduration: theme.transitions.duration.enteringScreen,\n\t\t\t}),\n\t\t\t[`& .${inputClasses.root}:not(.${outlinedInputClasses.root})`]: {\n\t\t\t\t[`& .${searchFilterStartAdornmentClasses.root}`]: {\n\t\t\t\t\ttransform: `translateX(13px)`,\n\t\t\t\t},\n\t\t\t},\n\t\t\t[`& .${formControlClasses.root}`]: {\n\t\t\t\twidth: '100%',\n\t\t\t},\n\t\t},\n\t\t[`&:not(.${searchFilterExpandableClasses.expanded})`]: {\n\t\t\t[`& .${searchFilterEndAdornmentClasses.root}`]: {\n\t\t\t\tvisibility: 'hidden',\n\t\t\t},\n\t\t},\n\t\t[`&.${searchFilterExpandableClasses.expanded}`]: {\n\t\t\t[`& .${searchFilterClasses.root}`]: {\n\t\t\t\t// minWidth: MINIMUM_EXPANDED_WIDTH,\n\t\t\t\twidth:\n\t\t\t\t\ttypeof width === 'string' && width.includes('%')\n\t\t\t\t\t\t? width\n\t\t\t\t\t\t: Math.max(width || DEFAULT_EXPANDED_WIDTH, MINIMUM_EXPANDED_WIDTH),\n\t\t\t},\n\t\t\t[`& .${inputClasses.root}:not(.${outlinedInputClasses.root})`]: {\n\t\t\t\t[`& .${searchFilterStartAdornmentClasses.root}`]: {\n\t\t\t\t\ttransform: `translateX(0)`,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t};\n});\n\nexport const SearchFilterExpandablePrimitive = ({\n\tonClose,\n\tonOpen,\n\t...props\n}: SearchFilterExpandableProps) => {\n\tconst [expanded, setExpanded] = useState(false);\n\tconst [focused, setFocused] = useState(false);\n\tconst [filtered, setFiltered] = useState(false);\n\n\tconst {onFilteredChange, width, ...sendProps} = props;\n\n\tconst classes = useUtilityClasses({\n\t\texpanded,\n\t});\n\n\tconst handleBlur = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n\t\tif (event.currentTarget.contains(event.relatedTarget as Node)) return;\n\t\tsetFocused(false);\n\t}, []);\n\n\tconst handleFocus = useCallback(() => setFocused(true), []);\n\n\tuseWhenChangedEffect(\n\t\texpanded,\n\t\t(expanded) => {\n\t\t\texpanded ? onOpen?.() : onClose?.();\n\t\t},\n\t\t{\n\t\t\texecuteAtMount: true,\n\t\t},\n\t);\n\n\tconst handleFilterChange = useCallback(\n\t\t(filtered: boolean) => {\n\t\t\tsetFiltered(filtered);\n\t\t\t// pass through\n\t\t\tonFilteredChange?.(filtered);\n\t\t},\n\t\t[onFilteredChange],\n\t);\n\n\tuseEffect(() => {\n\t\tsetExpanded(focused || props.focused || filtered);\n\t}, [filtered, focused, props.focused]);\n\n\treturn (\n\t\t<SearchFilterExpandableFieldRoot\n\t\t\tclassName={classes.root}\n\t\t\tonFocus={handleFocus}\n\t\t\tonBlur={handleBlur}\n\t\t\t// @ts-ignore\n\t\t\twidth={width}\n\t\t>\n\t\t\t<SearchFilter onFilteredChange={handleFilterChange} {...sendProps} />\n\t\t</SearchFilterExpandableFieldRoot>\n\t);\n};\n\nexport const SearchFilterExpandable = SearchFilterExpandablePrimitive;\nexport default SearchFilterExpandable;\n","import React, {useCallback} from 'react';\nimport {styled} from '@netx/core-components/Theme';\n\nimport {inputClasses} from '@mui/material/Input';\nimport {\n\tSearchFilterExpandable,\n\tSearchFilterExpandableProps,\n\tsearchFilterExpandableClasses,\n} from '@netx/core-components/SearchFilterExpandable';\nimport {searchFilterClasses} from '@netx/core-components/SearchFilter';\nimport {useDownloadRequestsProvider} from '../../contexts';\n\nconst DownloadRequestsTextFilterRoot = styled(SearchFilterExpandable, {\n\tname: 'DownloadRequestsTextFilterRoot',\n\tslot: 'Root',\n\toverridesResolver: (props, styles) => styles.root,\n})(({theme}) => ({\n\tmarginRight: theme.spacing(2),\n\t[theme.breakpoints.down('md')]: {\n\t\tmarginRight: 0,\n\t\tmarginBottom: theme.spacing(1),\n\t\ttransition: 'none !important',\n\t\twidth: '100% !important',\n\t\t[`& .${searchFilterClasses.root}, & .${inputClasses.input}`]: {\n\t\t\twidth: '100%',\n\t\t},\n\t\t[`&.${searchFilterExpandableClasses.expanded}`]: {\n\t\t\twidth: '100%',\n\t\t},\n\t},\n}));\n\nexport interface DownloadRequestsTextFilterProps\n\textends Omit<SearchFilterExpandableProps, 'onFilter'> {}\n\nexport const DownloadRequestsTextFilterPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tDownloadRequestsTextFilterProps\n>((props, ref) => {\n\tconst {actions, state} = useDownloadRequestsProvider();\n\n\tconst handleFilter = useCallback(\n\t\t(filter: string) => {\n\t\t\tactions.setFilterText(filter != '' ? filter : null);\n\t\t},\n\t\t[actions.setFilterText],\n\t);\n\n\treturn (\n\t\t<DownloadRequestsTextFilterRoot\n\t\t\tref={ref}\n\t\t\tonFilter={handleFilter}\n\t\t\tfilterStr={state.filterText || ''}\n\t\t\tvariant=\"outlined\"\n\t\t\t{...props}\n\t\t/>\n\t);\n});\n\nexport const DownloadRequestsTextFilter = React.memo(\n\tDownloadRequestsTextFilterPrimitive,\n);\nexport default DownloadRequestsTextFilter;\n","import React from 'react';\n\nimport {styled} from '@netx/core-components/Theme';\n\nimport {DownloadRequestsStatusFilter} from './DownloadRequestsStatusFilter';\nimport {DownloadRequestsTextFilter} from './DownloadRequestsTextFilter';\n\nconst DownloadRequestFiltersRoot = styled('div', {\n\tname: 'DownloadRequestsFilters',\n\tslot: 'Root',\n})(({theme}) => ({\n\tflex: '0 0 auto',\n\tdisplay: 'flex',\n\tpaddingLeft: theme.spacing(2),\n\t[theme.breakpoints.down('md')]: {\n\t\tflexDirection: 'column',\n\t\tpadding: 0,\n\t\twidth: '100%',\n\t\tmarginTop: theme.spacing(1),\n\t},\n}));\n\nexport interface DownloadRequestsFiltersProps\n\textends React.DetailedHTMLProps<\n\t\tReact.HTMLAttributes<HTMLDivElement>,\n\t\tHTMLDivElement\n\t> {}\n\nexport const DownloadRequestsFiltersPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tDownloadRequestsFiltersProps\n>((props, ref) => {\n\treturn (\n\t\t<DownloadRequestFiltersRoot ref={ref} {...props}>\n\t\t\t<DownloadRequestsTextFilter />\n\t\t\t<DownloadRequestsStatusFilter />\n\t\t</DownloadRequestFiltersRoot>\n\t);\n});\n\nexport const DownloadRequestsFilters = React.memo(\n\tDownloadRequestsFiltersPrimitive,\n);\nexport default DownloadRequestsFilters;\n","import React from 'react';\nimport {i18n} from '@netx/core/i18n';\nimport clsx from 'clsx';\n\nimport {\n\tfaClipboardCheck,\n\tfaCloudDownload,\n} from '@fortawesome/pro-solid-svg-icons';\nimport ActionButton from '@netx/core-components/ActionButton';\nimport {composeClasses, styled} from '@netx/core-components/Theme';\nimport Title from '@netx/core-components/Title';\n\nimport downloadRequestsHeaderClasses, {\n\tgetDownloadRequestsHeaderUtilityClass,\n\tDownloadRequestsHeaderClasses,\n} from './downloadRequestsHeaderClasses';\nimport DownloadRequestsFilters from '../DownloadRequestsFilters';\nimport {useDownloadRequestsProvider} from '../../contexts';\n\nconst useUtilityClasses = (\n\townerState: Pick<DownloadRequestsHeaderProps, 'classes'>,\n) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t\tactions: ['actions'],\n\t\ttitle: ['title'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetDownloadRequestsHeaderUtilityClass,\n\t\tclasses as typeof downloadRequestsHeaderClasses,\n\t);\n};\n\nconst DownloadRequestsHeaderRoot = styled('div', {\n\tname: 'DownloadRequestsHeader',\n\tslot: 'Root',\n\toverridesResolver: (props, styles) => styles.root,\n})(({theme}) => ({\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tpadding: theme.spacing(2),\n\talignItems: 'center',\n\toverflow: 'hidden',\n\t[theme.breakpoints.down('md')]: {\n\t\tflexDirection: 'column',\n\t\talignItems: 'flex-start',\n\t},\n}));\n\nconst DownloadRequestsHeaderTitleRoot = styled(Title, {\n\tname: 'DownloadRequestsHeader',\n\tslot: 'Title',\n\toverridesResolver: (props, styles) => styles.title,\n})(({theme}) => ({\n\t[theme.breakpoints.down('md')]: {\n\t\tmarginBottom: theme.spacing(1),\n\t},\n}));\n\nconst DownloadRequestsHeaderActionsRoot = styled('div', {\n\tname: 'DownloadRequestsHeader',\n\tslot: 'Actions',\n\toverridesResolver: (props, styles) => styles.actions,\n})(({theme}) => ({\n\tpaddingLeft: theme.spacing(2),\n\t'& button': {\n\t\theight: 40,\n\t},\n\t[theme.breakpoints.down('md')]: {\n\t\tmarginTop: 8,\n\t\tpaddingLeft: 0,\n\t\twidth: '100%',\n\t\t'& button': {\n\t\t\twidth: '100%',\n\t\t},\n\t},\n}));\n\nexport interface DownloadRequestsHeaderProps {\n\tclasses?: Partial<DownloadRequestsHeaderClasses>;\n\tclassName?: string;\n\tloading?: boolean;\n\ttotal: number;\n}\n\nexport const DownloadRequestsHeaderPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tDownloadRequestsHeaderProps\n>((props, ref) => {\n\tconst {className, loading, total, ...ownerState} = props;\n\n\tconst classes = useUtilityClasses(ownerState);\n\n\tconst {actions} = useDownloadRequestsProvider();\n\n\treturn (\n\t\t<DownloadRequestsHeaderRoot\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tref={ref}\n\t\t>\n\t\t\t<DownloadRequestsHeaderTitleRoot\n\t\t\t\ticon={faClipboardCheck}\n\t\t\t\tclassName={classes.title}\n\t\t\t\tprimary={i18n.t('i18n.downloadRequests')}\n\t\t\t\tsecondary={i18n.t('i18n.nItems', {count: total})}\n\t\t\t\tloading={loading}\n\t\t\t/>\n\t\t\t<DownloadRequestsFilters />\n\t\t\t<DownloadRequestsHeaderActionsRoot className={classes.actions}>\n\t\t\t\t<ActionButton\n\t\t\t\t\tdisabled={loading || !total}\n\t\t\t\t\tlabel={i18n.t('i18n.export')}\n\t\t\t\t\ticon={faCloudDownload}\n\t\t\t\t\tonClick={actions.exportToCSV}\n\t\t\t\t/>\n\t\t\t</DownloadRequestsHeaderActionsRoot>\n\t\t</DownloadRequestsHeaderRoot>\n\t);\n});\n\nexport const DownloadRequestsHeader = React.memo(\n\tDownloadRequestsHeaderPrimitive,\n);\nexport default DownloadRequestsHeader;\n","import React, {useMemo} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {faCheck, faTimes, faImages} from '@fortawesome/pro-solid-svg-icons';\nimport type {ReactAction} from '@netx/core/bootstrap';\nimport ActionMenu from '@netx/core-components/ActionMenu';\nimport {ArrowFocusTrapItemActions} from '@netx/core-components/ArrowFocusTrap';\nimport {CellProps} from '@netx/core-components/VirtualizedTable';\nimport {REVIEW_STATUS} from '../../../constants';\nimport {\n\tuseDownloadRequestsProvider,\n\tuseDownloadRequestProvider,\n} from '../../../contexts';\nimport type {DownloadRequest} from '../../../types';\n\nconst ActionCellPrimitive = ({row}: CellProps<DownloadRequest>) => {\n\tconst {state} = useDownloadRequestsProvider();\n\tconst downloadRequestProvider = useDownloadRequestProvider();\n\n\tconst menuActions: ReactAction[] = useMemo(() => {\n\t\tconst actions = [\n\t\t\t{\n\t\t\t\tcb: () => {\n\t\t\t\t\tdownloadRequestProvider.actions.setId(row.original.id);\n\t\t\t\t\tdownloadRequestProvider.actions.submitApprovals(row.original.id, {\n\t\t\t\t\t\tall: true,\n\t\t\t\t\t\tincludeIds: [],\n\t\t\t\t\t\texcludeIds: [],\n\t\t\t\t\t\ttotal: state.total,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\ticon: faCheck,\n\t\t\t\tlabel: i18n.t('i18n.approveAll'),\n\t\t\t},\n\t\t\t{\n\t\t\t\tcb: () => {\n\t\t\t\t\tdownloadRequestProvider.actions.setId(row.original.id);\n\t\t\t\t\tdownloadRequestProvider.actions.submitApprovals(row.original.id, {\n\t\t\t\t\t\tall: false,\n\t\t\t\t\t\tincludeIds: [],\n\t\t\t\t\t\texcludeIds: [],\n\t\t\t\t\t\ttotal: 0,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\ticon: faTimes,\n\t\t\t\tlabel: i18n.t('i18n.denyAll'),\n\t\t\t},\n\t\t\t{\n\t\t\t\tcb: () => {\n\t\t\t\t\tdownloadRequestProvider.actions.setId(row.original.id);\n\t\t\t\t\tdownloadRequestProvider.actions.showApprovals();\n\t\t\t\t},\n\t\t\t\ticon: faImages,\n\t\t\t\tlabel: i18n.t('i18n.viewAssets'),\n\t\t\t},\n\t\t];\n\t\t// TODO: clean up\n\t\treturn row.original.reviewStatus !== REVIEW_STATUS.PENDING\n\t\t\t? actions.slice(2)\n\t\t\t: actions;\n\t}, [\n\t\trow.original.id,\n\t\trow.original.reviewStatus,\n\t\tstate.total,\n\t\tdownloadRequestProvider.actions,\n\t]);\n\n\treturn useMemo(\n\t\t() => (\n\t\t\t<ArrowFocusTrapItemActions index={row.index}>\n\t\t\t\t<ActionMenu\n\t\t\t\t\talwaysUseEllipsis\n\t\t\t\t\tonAction={(action) => action.cb()}\n\t\t\t\t\tactions={menuActions}\n\t\t\t\t/>\n\t\t\t</ArrowFocusTrapItemActions>\n\t\t),\n\t\t[row.original.id, row.index, menuActions],\n\t);\n};\n\nexport const ActionCell = ActionCellPrimitive;\nexport default ActionCell;\n","import React from 'react';\n\nimport type {DownloadRequest} from '../../../types';\n\nimport {CellProps} from '@netx/core-components/VirtualizedTable';\nimport {GenericCell} from '@netx/core-components/VirtualizedTable/components/VirtualizedTableRowCells/Generic';\nimport {GenericIconCell} from '@netx/core-components/VirtualizedTable/components/VirtualizedTableRowCells/GenericIconCell';\n\nimport {faUserTimes} from '@fortawesome/pro-solid-svg-icons';\n\nconst UserCellPrimitive = (props: CellProps<DownloadRequest>) => {\n\tif (!props.row.original.requester) {\n\t\treturn <GenericIconCell icon={faUserTimes} {...props} />;\n\t}\n\treturn <GenericCell {...props} />;\n};\n\nexport const UserCell = UserCellPrimitive;\nexport default UserCell;\n","import {i18n} from '@netx/core/i18n';\n\nimport type {DownloadRequestsListColumns} from './DownloadRequestsList';\n\nimport {GenericCell} from '@netx/core-components/VirtualizedTable';\nimport {REVIEW_STATUS_LABEL} from '../../locales';\nimport moment from '@netx/core/lib/netx-moment';\n\nimport {ActionCell, UserCell} from './cells';\n\nexport const columns = (): DownloadRequestsListColumns => [\n\t{\n\t\tHeader: i18n.t('i18n.requestedBy'),\n\t\tid: 'requester',\n\t\taccessor: (originalRow) =>\n\t\t\toriginalRow.requester\n\t\t\t\t? `${originalRow.requester.name} (${originalRow.requester.email})`\n\t\t\t\t: `(${i18n.t('i18n.unknown')})`,\n\t\twidth: 250,\n\t\tsortable: true,\n\t\tCell: UserCell,\n\t},\n\t{\n\t\tHeader: i18n.t('i18n.date'),\n\t\tid: 'requestDate',\n\t\taccessor: (originalRow) =>\n\t\t\tmoment(originalRow.requestDate).format('MM/DD/YYYY h:mm:ss A'),\n\t\twidth: 160,\n\t\tsortable: true,\n\t\tsortType: 'numeric',\n\t\tCell: GenericCell,\n\t},\n\t{\n\t\tHeader: i18n.t('i18n.assets'),\n\t\tid: 'approvalCount',\n\t\taccessor: 'approvalCount',\n\t\twidth: 160,\n\t\tsortable: true,\n\t\tsortType: 'numeric',\n\t\tCell: GenericCell,\n\t},\n\t{\n\t\tHeader: i18n.t('i18n.status'),\n\t\tid: 'reviewStatus',\n\t\taccessor: (originalRow) => REVIEW_STATUS_LABEL[originalRow.reviewStatus],\n\t\twidth: 150,\n\t\tsortable: true,\n\t\tCell: GenericCell,\n\t},\n\t{\n\t\tHeader: i18n.t('i18n.source'),\n\t\tid: 'portalContext',\n\t\taccessor: (originalRow) =>\n\t\t\toriginalRow.portalContext || `(${i18n.t('i18n.unknown')})`,\n\t\tsortable: true,\n\t\twidth: 150,\n\t\tCell: GenericCell,\n\t},\n\t{\n\t\tHeader: '',\n\t\tid: 'action',\n\t\tCell: ActionCell,\n\t\tcolumnType: 'action',\n\t\twidth: 64,\n\t},\n];\n\nexport default () => columns();\n","import React, {useMemo} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport {faList} from '@fortawesome/pro-solid-svg-icons';\n\nimport FallbackMessage from '@netx/core-components/FallbackMessage';\nimport {\n\tVirtualizedTableContainer,\n\tVirtualizedTableContainerProps,\n} from '@netx/core-components/VirtualizedTable';\n\nimport getColumns from './columns';\nimport type {DownloadRequest} from '../..';\n\ntype VirtualizedTableProps = VirtualizedTableContainerProps<DownloadRequest>;\n\nexport type DownloadRequestsListColumns = VirtualizedTableProps['columns'];\n\nexport interface DownloadRequestsListProps\n\textends Omit<VirtualizedTableProps, 'columns'> {\n\tnoMatches?: boolean;\n\tnoRecords?: boolean;\n}\n\nexport const DownloadRequestsListPrimitive = ({\n\tnoMatches,\n\tnoRecords,\n\t...props\n}: Omit<DownloadRequestsListProps, 'columns'>) => {\n\tconst columns = useMemo<DownloadRequestsListColumns>(() => getColumns(), []);\n\treturn !noRecords ? (\n\t\t<VirtualizedTableContainer<DownloadRequest>\n\t\t\tcolumns={columns}\n\t\t\tdisableTabIndex\n\t\t\tfrozenTrailingColumnCount={1}\n\t\t\tdefaultSortOrder=\"desc\"\n\t\t\trowId=\"download-request\"\n\t\t\t{...props}\n\t\t/>\n\t) : (\n\t\t<FallbackMessage\n\t\t\ticon={faList}\n\t\t\tvariant=\"light\"\n\t\t\ttitle={i18n.t('i18n.noResults')}\n\t\t/>\n\t);\n};\n\nexport const DownloadRequestsList = React.memo(\n\tDownloadRequestsListPrimitive,\n) as (props: DownloadRequestsListProps) => JSX.Element;\n\nexport default DownloadRequestsList;\n","import React from 'react';\n\nimport {styled} from '@netx/core-components/Theme';\n\nimport {\n\tDownloadRequestsHeader,\n\tDownloadRequestsHeaderProps,\n} from './DownloadRequestsHeader';\nimport DownloadRequestsList, {\n\tDownloadRequestsListProps,\n} from '../DownloadRequestsList';\n\nconst DownloadRequestsRoot = styled('div', {\n\tname: 'DownloadRequests',\n\tslot: 'Root',\n})(({theme}) => ({\n\t...theme.mixins.flexFillColumn,\n\toverflow: 'hidden',\n}));\n\nexport interface DownloadRequestsProps extends DownloadRequestsListProps {\n\tDownloadRequestsHeaderProps?: Partial<DownloadRequestsHeaderProps>;\n\tref?: React.Ref<HTMLDivElement>;\n}\n\nexport const DownloadRequestsPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tDownloadRequestsProps\n>((props, ref) => {\n\tconst {DownloadRequestsHeaderProps, dataReady, total, ...sendProps} = props;\n\treturn (\n\t\t<DownloadRequestsRoot ref={ref}>\n\t\t\t<DownloadRequestsHeader\n\t\t\t\ttotal={total}\n\t\t\t\tloading={!dataReady}\n\t\t\t\t{...DownloadRequestsHeaderProps}\n\t\t\t/>\n\t\t\t<DownloadRequestsList\n\t\t\t\t{...sendProps}\n\t\t\t\tdataReady={dataReady}\n\t\t\t\ttotal={dataReady ? total : 25}\n\t\t\t/>\n\t\t</DownloadRequestsRoot>\n\t);\n});\n\nexport const DownloadRequests = React.memo(DownloadRequestsPrimitive);\nexport default DownloadRequests;\n","import {generateUtilityClass, generateUtilityClasses} from '@mui/base';\n\nexport interface DownloadRequestApprovalsFooterClasses {\n\t/** styles applied to the root element */\n\troot: string;\n}\n\nexport const getDownloadRequestApprovalsFooterUtilityClass = (slot: string) =>\n\tgenerateUtilityClass('DownloadRequestApprovalsFooter', slot);\n\nexport const downloadRequestApprovalsFooterClasses = generateUtilityClasses<\n\tkeyof DownloadRequestApprovalsFooterClasses\n>('DownloadRequestApprovalsFooter', ['root']);\nexport default downloadRequestApprovalsFooterClasses;\n","import React, {useCallback} from 'react';\nimport {i18n} from '@netx/core/i18n';\nimport clsx from 'clsx';\n\nimport SubmitButton from '@netx/core-components/SubmitButton';\nimport {composeClasses, styled} from '@netx/core-components/Theme';\nimport {useTableRowSelectionProvider} from '@netx/core-components/VirtualizedTable';\nimport downloadRequestApprovalsFooterClasses, {\n\tgetDownloadRequestApprovalsFooterUtilityClass,\n\tDownloadRequestApprovalsFooterClasses,\n} from './downloadRequestApprovalsFooterClasses';\n\nconst useUtilityClasses = (ownerState) => {\n\tconst {classes} = ownerState;\n\tconst slots = {\n\t\troot: ['root'],\n\t};\n\treturn composeClasses(\n\t\tslots,\n\t\tgetDownloadRequestApprovalsFooterUtilityClass,\n\t\tclasses as typeof downloadRequestApprovalsFooterClasses,\n\t);\n};\n\nconst DownloadRequestApprovalsFooterRoot = styled('footer', {\n\tname: 'DownloadRequestApprovalsFooter',\n\tslot: 'Root',\n})(({theme}) => ({\n\talignItems: 'center',\n\tjustifyContent: 'flex-end',\n\tdisplay: 'flex',\n\tflex: '0 0 auto',\n\tpadding: theme.spacing(2),\n\tborderTop: `1px solid ${theme.palette.custom.border}`,\n\tbackground: theme.palette.background.paper,\n\t[theme.breakpoints.down('md')]: {\n\t\tzIndex: 5,\n\t\tborderTopColor: 'transparent',\n\t\t'& button': {\n\t\t\twidth: '100%',\n\t\t},\n\t},\n}));\n\nexport interface DownloadRequestApprovalsFooterProps {\n\tclasses?: Partial<DownloadRequestApprovalsFooterClasses>;\n\tclassName?: string;\n\tid: number;\n\tonSubmit(\n\t\tid: number,\n\t\tdata: {\n\t\t\ttotal: number;\n\t\t\texcludeIds: number[];\n\t\t\tincludeIds: number[];\n\t\t\tall: boolean;\n\t\t},\n\t): void;\n}\n\nexport const DownloadRequestApprovalsFooterPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tDownloadRequestApprovalsFooterProps\n>((props, ref) => {\n\tconst {className, id, onSubmit, ...sendProps} = props;\n\tconst classes = useUtilityClasses(sendProps);\n\n\tconst tableRowSelectionProvider = useTableRowSelectionProvider();\n\tconst handleSubmit = useCallback(() => {\n\t\tonSubmit(id, {\n\t\t\ttotal: tableRowSelectionProvider.state.count,\n\t\t\texcludeIds: tableRowSelectionProvider.state.rowsDeselected as number[],\n\t\t\tincludeIds: tableRowSelectionProvider.state.rowsSelected as number[],\n\t\t\tall:\n\t\t\t\ttableRowSelectionProvider.state.allRowsSelected ||\n\t\t\t\ttableRowSelectionProvider.state.rowsDeselected.length > 0,\n\t\t});\n\t}, [id, onSubmit, tableRowSelectionProvider.state]);\n\n\treturn (\n\t\t<DownloadRequestApprovalsFooterRoot\n\t\t\tclassName={clsx(classes.root, className)}\n\t\t\tref={ref}\n\t\t>\n\t\t\t<SubmitButton label={i18n.t('i18n.continue')} onClick={handleSubmit} />\n\t\t</DownloadRequestApprovalsFooterRoot>\n\t);\n});\n\nexport const DownloadRequestApprovalsFooter = React.memo(\n\tDownloadRequestApprovalsFooterPrimitive,\n);\nexport default DownloadRequestApprovalsFooter;\n","import React, {useRef, useState} from 'react';\nimport {i18n} from '@netx/core/i18n';\n\nimport ResizeDetector from 'react-resize-detector';\nimport {Skeleton} from '@mui/material';\nimport {createStyles, withStyles, WithStyles} from '@mui/styles';\nimport {faClipboardCheck} from '@fortawesome/pro-solid-svg-icons';\nimport type {Theme} from '@netx/core-components/Theme';\n\nimport type {Optional} from '@netx/core/typings';\nimport useMediaQuery from '@netx/core-components/hooks/useMediaQuery';\nimport Dialog, {DialogProps} from '@netx/core-components/Dialog';\nimport {\n\tTableRowSelectionProvider,\n\tuseTableRowSelectionProvider,\n} from '@netx/core-components/VirtualizedTable';\n\nimport {\n\tDownloadRequestDetailsContainer,\n\tDownloadRequestApprovalsList,\n\tDownloadRequestApprovalsListProps,\n} from '../';\n\nimport {DownloadRequestApprovalsFooter} from './DownloadRequestApprovalsFooter';\n\nimport {useDownloadRequestProvider} from '../../contexts';\nimport {REVIEW_STATUS} from '../../constants';\n\nimport type {\n\tDownloadRequestApproval,\n\tDownloadRequestDetails as DownloadRequestDetailsType,\n} from '../../types';\n\nconst styles = (theme: Theme) =>\n\tcreateStyles({\n\t\troot: {\n\t\t\theight: '100%',\n\t\t\tposition: 'relative',\n\t\t\t'& .MuiDialogTitle-root': {\n\t\t\t\tborderBottom: `1px solid ${theme.palette.custom.border}`,\n\t\t\t},\n\t\t},\n\t\tcontent: {\n\t\t\tdisplay: 'flex',\n\t\t\tflex: '1 1 auto',\n\t\t\toverflow: 'hidden',\n\t\t\tposition: 'relative',\n\t\t\tzIndex: 3,\n\t\t\t[theme.breakpoints.down('md')]: {\n\t\t\t\tflexDirection: 'column',\n\t\t\t},\n\t\t},\n\t\tlist: {\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t\tflex: '1 1 auto',\n\t\t\toverflow: 'hidden',\n\t\t\tzIndex: 3,\n\t\t},\n\t});\n\nexport interface DownloadRequestApprovalsProps\n\textends Omit<DownloadRequestApprovalsListProps, 'onSubmit' | 'ref'> {\n\tdownloadRequestDetails: DownloadRequestDetailsType;\n\topen: boolean;\n\tref?: React.Ref<HTMLDivElement>;\n\tDialogProps: Optional<DialogProps, 'title' | 'open'>;\n\tonSubmit?: (\n\t\tid: number,\n\t\tdata: {\n\t\t\ttotal: number;\n\t\t\texcludeIds: number[];\n\t\t\tincludeIds: number[];\n\t\t\tall: boolean;\n\t\t},\n\t) => void;\n}\n\nexport const DownloadRequestApprovalsPrimitive = React.forwardRef<\n\tHTMLDivElement,\n\tWithStyles<typeof styles, true> & DownloadRequestApprovalsProps\n>(\n\t(\n\t\t{\n\t\t\tclasses,\n\t\t\ttheme,\n\t\t\tDialogProps,\n\t\t\tdownloadRequestDetails,\n\t\t\tonSubmit,\n\t\t\topen,\n\t\t\t// prevent sedning along to the nested component\n\t\t\tref: _ref,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [height, setHeight] = useState(0);\n\t\tconst tableRowSelectionProvider = useTableRowSelectionProvider();\n\t\tconst downloadRequestProvider = useDownloadRequestProvider();\n\t\tconst smallScreen = useMediaQuery(theme.breakpoints.down('sm'));\n\t\tconst contentRef = useRef<HTMLDivElement>(null);\n\t\tconst [panelOpen, setPanelOpen] = useState(false);\n\n\t\treturn (\n\t\t\t<Dialog\n\t\t\t\ticon={faClipboardCheck}\n\t\t\t\ttitle={i18n.t('i18n.downloadRequest')}\n\t\t\t\tsecondaryTitle={\n\t\t\t\t\t<>\n\t\t\t\t\t\t{downloadRequestProvider.loading ? (\n\t\t\t\t\t\t\t<Skeleton width={100} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\ti18n.t('i18n.nItemsApproved', {\n\t\t\t\t\t\t\t\tcount:\n\t\t\t\t\t\t\t\t\tdownloadRequestDetails.reviewStatus === 'PENDING'\n\t\t\t\t\t\t\t\t\t\t? tableRowSelectionProvider.state.count\n\t\t\t\t\t\t\t\t\t\t: downloadRequestDetails.approvedCount,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t}\n\t\t\t\tkeepMounted={false}\n\t\t\t\tfullWidth\n\t\t\t\tfullScreen={smallScreen}\n\t\t\t\tmaxWidth=\"xl\"\n\t\t\t\topen={open}\n\t\t\t\tref={ref}\n\t\t\t\t{...DialogProps}\n\t\t\t\tPaperProps={{\n\t\t\t\t\tclassName: classes.root,\n\t\t\t\t\t...DialogProps.PaperProps,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ResizeDetector\n\t\t\t\t\thandleHeight\n\t\t\t\t\tonResize={(_, height) => {\n\t\t\t\t\t\tsetHeight(height || 0);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div className={classes.content} ref={contentRef}>\n\t\t\t\t\t\t<div className={classes.list}>\n\t\t\t\t\t\t\t<DownloadRequestApprovalsList\n\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\ttotal={props.dataReady ? props.total : 25}\n\t\t\t\t\t\t\t\tdisableFocus={panelOpen}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<DownloadRequestDetailsContainer\n\t\t\t\t\t\t\tdownloadRequestDetails={downloadRequestDetails}\n\t\t\t\t\t\t\tloading={downloadRequestProvider.loading}\n\t\t\t\t\t\t\tSlidePanelProps={{\n\t\t\t\t\t\t\t\theight,\n\t\t\t\t\t\t\t\tonOpen: () => setPanelOpen(true),\n\t\t\t\t\t\t\t\tonClose: () => setPanelOpen(false),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</ResizeDetector>\n\t\t\t\t{onSubmit ? (\n\t\t\t\t\t<DownloadRequestApprovalsFooter onSubmit={onSubmit} id={props.id} />\n\t\t\t\t) : null}\n\t\t\t</Dialog>\n\t\t);\n\t},\n);\n\nconst StyledDownloadRequestApprovals = withStyles(styles, {\n\twithTheme: true,\n})(DownloadRequestApprovalsPrimitive);\n\nexport const DownloadRequestApprovals = React.forwardRef<\n\tHTMLDivElement,\n\tDownloadRequestApprovalsProps\n>((props: DownloadRequestApprovalsProps, ref) => {\n\treturn (\n\t\t<TableRowSelectionProvider<DownloadRequestApproval>\n\t\t\ttotalRows={props.total}\n\t\t\tallRowsSelected={\n\t\t\t\tprops.downloadRequestDetails.reviewStatus === REVIEW_STATUS.PENDING\n\t\t\t}\n\t\t>\n\t\t\t<StyledDownloadRequestApprovals {...props} ref={ref} />\n\t\t</TableRowSelectionProvider>\n\t);\n});\nexport default DownloadRequestApprovals;\n","import React from 'react';\n\nimport DownloadRequestApprovals, {\n\tDownloadRequestApprovalsProps,\n} from '../../components/DownloadRequestApprovals';\n\nimport {\n\tDownloadRequestApprovalsProvider,\n\tuseDownloadRequestApprovalsProvider,\n\tuseDownloadRequestProvider,\n} from '../../contexts';\n\nimport {PAGE_SIZE} from '../..';\n\nexport type DownloadRequestApprovalsContainerProps = Omit<\n\tDownloadRequestApprovalsProps,\n\t| 'columns'\n\t| 'downloadRequestDetails'\n\t| 'data'\n\t| 'itemSize'\n\t| 'isItemLoaded'\n\t| 'loadMoreItems'\n\t| 'total'\n>;\n\nexport const DownloadRequestApprovalsContainerPrimitive = (\n\tprops: DownloadRequestApprovalsContainerProps,\n) => {\n\tconst {\n\t\tstate,\n\t\tactions,\n\t\tloading,\n\t\tisItemLoaded,\n\t} = useDownloadRequestApprovalsProvider();\n\n\tconst downloadRequestProvider = useDownloadRequestProvider();\n\n\treturn (\n\t\t<DownloadRequestApprovals\n\t\t\tdownloadRequestDetails={downloadRequestProvider.state}\n\t\t\tloadMoreItems={actions.debouncedLoadMoreItems}\n\t\t\tdata={state.data}\n\t\t\tdataReady={state.ready}\n\t\t\tisItemLoaded={isItemLoaded}\n\t\t\tonScrollIndexUpdate={actions.setVisibleIndex}\n\t\t\tpage={state.page}\n\t\t\tpageSize={PAGE_SIZE}\n\t\t\treadOnly={downloadRequestProvider.state.reviewStatus !== 'PENDING'}\n\t\t\tscrollIndex={state.visibleIndex}\n\t\t\ttotal={state.total}\n\t\t\t{...props}\n\t\t\tTableBodyProps={{\n\t\t\t\t...props.TableBodyProps,\n\t\t\t\thidePager: true,\n\t\t\t\tListItemComponentProps: {\n\t\t\t\t\treadOnly: downloadRequestProvider.state.reviewStatus !== 'PENDING',\n\t\t\t\t\t...props.TableBodyProps?.ListItemComponentProps,\n\t\t\t\t},\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport const DownloadRequestApprovalsContainer = (\n\tprops: DownloadRequestApprovalsContainerProps,\n) => {\n\treturn (\n\t\t<DownloadRequestApprovalsProvider id={props.id}>\n\t\t\t<DownloadRequestApprovalsContainerPrimitive {...props} />\n\t\t</DownloadRequestApprovalsProvider>\n\t);\n};\n\nexport default DownloadRequestApprovalsContainer;\n","import React from 'react';\n\nimport DownloadRequests, {\n\tDownloadRequestsProps,\n} from '../../components/DownloadRequests';\n\nimport {\n\tDownloadRequestsProvider,\n\tuseDownloadRequestsProvider,\n\tuseDownloadRequestProvider,\n} from '../../contexts';\n\nimport {PAGE_SIZE} from '../..';\n\nexport type DownloadRequestsContainerProps = Omit<\n\tDownloadRequestsProps,\n\t| 'columns'\n\t| 'data'\n\t| 'id'\n\t| 'itemSize'\n\t| 'isItemLoaded'\n\t| 'loadMoreItems'\n\t| 'total'\n> & {\n\tid?: number;\n};\n\nexport const DownloadRequestsContainerPrimitive = ({\n\tid,\n\t...props\n}: DownloadRequestsContainerProps) => {\n\tconst {state, actions, isItemLoaded, loading} = useDownloadRequestsProvider();\n\tconst downloadRequestProvider = useDownloadRequestProvider();\n\n\tconst noRecords = !loading && state.ready && !state.total;\n\tconst noMatches = noRecords && state.filterText != null;\n\n\treturn (\n\t\t<DownloadRequests\n\t\t\tloadMoreItems={actions.debouncedLoadMoreItems}\n\t\t\tdata={state.data}\n\t\t\tdataReady={state.ready}\n\t\t\tid={id as any}\n\t\t\tisItemLoaded={isItemLoaded}\n\t\t\tnoMatches={noMatches}\n\t\t\tnoRecords={noRecords}\n\t\t\tonRowClick={(event, index, row) => {\n\t\t\t\tdownloadRequestProvider.actions.setId(row.original.id);\n\t\t\t\tdownloadRequestProvider.actions.showApprovals();\n\t\t\t}}\n\t\t\tonRowKeyDown={(event, index, row) => {\n\t\t\t\tswitch (event.key) {\n\t\t\t\t\tcase 'Enter':\n\t\t\t\t\tcase ' ':\n\t\t\t\t\t\tdownloadRequestProvider.actions.setId(row.original.id);\n\t\t\t\t\t\tdownloadRequestProvider.actions.showApprovals();\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}}\n\t\t\tonScrollIndexUpdate={actions.setVisibleIndex}\n\t\t\tonSort={(column, order) => {\n\t\t\t\tactions.setSort(column.id as any, order);\n\t\t\t}}\n\t\t\tpage={state.page}\n\t\t\tpageSize={PAGE_SIZE}\n\t\t\tscrollIndex={state.visibleIndex}\n\t\t\tsortField={state.sortField}\n\t\t\tsortOrder={state.sortOrder}\n\t\t\ttotal={state.ready ? state.total : 25}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nexport const DownloadRequestsContainer = React.memo(\n\t(props: DownloadRequestsContainerProps) => {\n\t\t// console.log('props.id', props.id);\n\t\treturn (\n\t\t\t<DownloadRequestsProvider activeId={props.id}>\n\t\t\t\t<DownloadRequestsContainerPrimitive {...props} />\n\t\t\t</DownloadRequestsProvider>\n\t\t);\n\t},\n);\n\nexport default DownloadRequestsContainer;\n","import Base from '@netx/core/lib/netx-react-view';\n\nimport {DownloadRequestsContainer} from '../containers';\n\nimport {withConfirmation} from '@netx/core-components/Confirmation';\nimport {withSnackbar} from '@netx/core-components/Snackbar';\nimport {withTheme} from '@netx/core-components/Theme';\n\nimport type {DownloadRequestId} from '../types';\n\nconst ThemedComponent = withTheme(\n\twithSnackbar(withConfirmation(DownloadRequestsContainer)),\n);\n\nexport type DownloadRequestsViewOptions = {\n\tdownloadRequestId: DownloadRequestId;\n};\n\nexport class DownloadRequestsView extends Base {\n\tdownloadRequestId: DownloadRequestId;\n\n\tconstructor(opts: DownloadRequestsViewOptions) {\n\t\tsuper(opts);\n\t\tthis.removeOnHide = true;\n\t\tthis.downloadRequestId = opts.downloadRequestId;\n\t\tthis.listenTo(\n\t\t\tthis.viewSpec,\n\t\t\t'change:viewOptions:downloadRequestId',\n\t\t\t(viewSpec, downloadRequestId) => {\n\t\t\t\tthis.downloadRequestId = downloadRequestId;\n\t\t\t\tthis.render();\n\t\t\t},\n\t\t);\n\t}\n\n\trender() {\n\t\treturn super.render(ThemedComponent, {\n\t\t\tid: this.downloadRequestId,\n\t\t});\n\t}\n\n\tstatic get __name__() {\n\t\treturn 'DownloadRequestView';\n\t}\n}\n\nexport default DownloadRequestsView;\n","import {dispatcher} from '@netx/core/bootstrap';\nimport errors from './errors';\nimport DownloadRequestsView from './views/download-requests';\nimport Netx from '@netx/core/bootstrap';\n\nimport type {DownloadRequestId} from './types';\n\nimport {RpcError} from '@netx/core/typings';\n\nimport {DOWNLOAD_REQUEST_EVENT, BASE_EVENT} from './actions';\n\ndispatcher.once(`${BASE_EVENT}:init`, () => {\n\tconst router = Netx.router;\n\n\trouter.on(`route:${DOWNLOAD_REQUEST_EVENT.LIST}`, () => {\n\t\tdispatcher.trigger(DOWNLOAD_REQUEST_EVENT.LIST);\n\t});\n\n\trouter.on(`route:${DOWNLOAD_REQUEST_EVENT.VIEW}`, (id: DownloadRequestId) => {\n\t\tdispatcher.trigger(DOWNLOAD_REQUEST_EVENT.LIST, id);\n\t});\n\n\tdispatcher.on(\n\t\tDOWNLOAD_REQUEST_EVENT.LIST,\n\t\t(downloadRequestId?: DownloadRequestId) => {\n\t\t\tNetx.app.appViews.add({\n\t\t\t\tviewClass: DownloadRequestsView as any,\n\t\t\t\tuniqueShowAction: DOWNLOAD_REQUEST_EVENT.LIST,\n\t\t\t\tviewOptions: {\n\t\t\t\t\tdownloadRequestId,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t);\n\n\tdispatcher.on(\n\t\tDOWNLOAD_REQUEST_EVENT.VIEW,\n\t\t(downloadRequestId: DownloadRequestId) => {\n\t\t\tdispatcher.trigger(DOWNLOAD_REQUEST_EVENT.LIST, downloadRequestId);\n\t\t},\n\t);\n\n\tdispatcher.trigger(`${BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${BASE_EVENT}:initialized`, () => resolve());\n\t\t\tdispatcher.trigger(`${BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport AssetModel from '@netx/core-asset/models/asset';\nimport type {Asset} from '@netx/core-asset/types';\nimport {ASSET_SHARE_EVENT, ASSET_SHARE_BASE_EVENT} from './actions';\n\ndispatcher.once(`${ASSET_SHARE_BASE_EVENT}:init`, () => {\n\t/**\n\t * This is a holdover for react until we can reqork share\n\t * We take the `Asset` and convert it over to an `AssetModel`\n\t * and then pass along to the original event\n\t */\n\tdispatcher.on(ASSET_SHARE_EVENT.MENU, (asset: Asset) => {\n\t\tconst model = new AssetModel(asset);\n\t\tdispatcher.trigger(`${ASSET_SHARE_BASE_EVENT}:menu`, model);\n\t});\n\n\tdispatcher.trigger(`${ASSET_SHARE_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${ASSET_SHARE_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${ASSET_SHARE_BASE_EVENT}:initialized`, () => resolve());\n\t\t\tdispatcher.trigger(`${ASSET_SHARE_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import {\n\tfaArrowCircleDown,\n\tfaFilePdf,\n\tfaShare,\n} from '@fortawesome/pro-solid-svg-icons';\n\nexport const CATEGORY_SHARE_ICON = <const>{\n\tCREATE_PDF: faFilePdf,\n\tDOWNLOAD: faArrowCircleDown,\n\tMENU: faShare,\n};\n\nexport type CategoryShareBaseEvent = typeof CATEGORY_SHARE_BASE_EVENT;\n\nexport const CATEGORY_SHARE_BASE_EVENT = `share:category`;\n\nexport const CATEGORY_SHARE_EVENT = <const>{\n\tCREATE_PDF: `${CATEGORY_SHARE_BASE_EVENT}:createPDF:react`,\n\tDOWNLOAD: `${CATEGORY_SHARE_BASE_EVENT}:download`,\n\tMENU: `${CATEGORY_SHARE_BASE_EVENT}:menu:react`,\n};\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport CategoryModel from '@netx/core-category/models/category';\nimport type {Category} from '@netx/core-category/types';\nimport {CATEGORY_SHARE_EVENT, CATEGORY_SHARE_BASE_EVENT} from './actions';\n\ndispatcher.once(`${CATEGORY_SHARE_BASE_EVENT}:init`, () => {\n\t/**\n\t * This is a holdover for react until we can reqork share\n\t * We take the `Asset` and convert it over to an `AssetModel`\n\t * and then pass along to the original event\n\t */\n\tdispatcher.on(CATEGORY_SHARE_EVENT.CREATE_PDF, (category: Category) => {\n\t\tconst model = new CategoryModel(category);\n\t\tdispatcher.trigger(`${CATEGORY_SHARE_BASE_EVENT}:createPDF`, model);\n\t});\n\n\t/**\n\t * This is a holdover for react until we can reqork share\n\t * We take the `Asset` and convert it over to an `AssetModel`\n\t * and then pass along to the original event\n\t */\n\tdispatcher.on(CATEGORY_SHARE_EVENT.MENU, (category: Category) => {\n\t\tconst model = new CategoryModel(category);\n\t\tdispatcher.trigger(`${CATEGORY_SHARE_BASE_EVENT}:menu`, model);\n\t});\n\n\tdispatcher.trigger(`${CATEGORY_SHARE_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${CATEGORY_SHARE_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${CATEGORY_SHARE_BASE_EVENT}:initialized`, () =>\n\t\t\t\tresolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${CATEGORY_SHARE_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import {dispatcher} from '@netx/core/bootstrap';\nimport type {Asset} from '@netx/core-asset/types';\nimport SavedCartModel from '@netx/core-cart/models/savedCart';\nimport CartAssetsCollection from '@netx/core-cart/collections/cartAssets';\nimport type {SavedCart} from '@netx/core-cart/types';\nimport {CART_SAVED_EVENT, CART_SAVED_BASE_EVENT} from './actions';\nimport {cart as cartSingleton} from '@netx/core-cart/collections/singleton';\n\ndispatcher.once(`${CART_SAVED_BASE_EVENT}:init`, () => {\n\tdispatcher.on(CART_SAVED_EVENT.CREATE_PDF, (savedCart: SavedCart) => {\n\t\tconst model = new SavedCartModel(savedCart);\n\t\tdispatcher.trigger(`share:cart:createPDF`, model);\n\t});\n\n\tdispatcher.on(\n\t\tCART_SAVED_EVENT.CREATE_TMS_OBJECT_PACKAGE,\n\t\t(savedCart: SavedCart) => {\n\t\t\tconst collection = new CartAssetsCollection([]);\n\t\t\tcollection.id = savedCart.id;\n\t\t\tdispatcher.trigger(`cart:create:tmsObjectPackage`, collection);\n\t\t},\n\t);\n\n\tdispatcher.on(CART_SAVED_EVENT.DELETE, (savedCart: SavedCart) => {\n\t\tconst model = new SavedCartModel(savedCart);\n\t\tdispatcher.trigger(`cart:saved:delete`, model);\n\t});\n\n\tdispatcher.on(CART_SAVED_EVENT.DOWNLOAD, (savedCart: SavedCart) => {\n\t\tconst model = new SavedCartModel(savedCart);\n\t\tdispatcher.trigger(`share:cart:download`, model);\n\t});\n\n\tdispatcher.on(CART_SAVED_EVENT.DUPLICATE, (savedCart: SavedCart) => {\n\t\tconst model = new SavedCartModel(savedCart);\n\t\tdispatcher.trigger(`cart:duplicate`, model);\n\t});\n\n\tdispatcher.on(CART_SAVED_EVENT.MANAGE_ARCHIVE, (savedCart: SavedCart) => {\n\t\tconst model = new SavedCartModel(savedCart);\n\t\tdispatcher.trigger(`cart:saved:manage:assets:archive`, model);\n\t});\n\n\tdispatcher.on(CART_SAVED_EVENT.MANAGE_EXPIRATION, (savedCart: SavedCart) => {\n\t\tconst model = new SavedCartModel(savedCart);\n\t\tdispatcher.trigger(`cart:saved:manage:assets:expire`, model);\n\t});\n\n\tdispatcher.on(CART_SAVED_EVENT.MENU, (savedCart: SavedCart) => {\n\t\tconst model = new SavedCartModel(savedCart);\n\t\tdispatcher.trigger(`share:menu`, model);\n\t});\n\n\tdispatcher.on(CART_SAVED_EVENT.RENAME, (savedCart: SavedCart) => {\n\t\tconst model = new SavedCartModel(savedCart);\n\t\tdispatcher.trigger(`cart:rename`, model);\n\t});\n\n\tdispatcher.on(\n\t\tCART_SAVED_EVENT.REMOVE_ASSET,\n\t\t(savedCart: SavedCart, asset: Asset) => {\n\t\t\tconst model = new SavedCartModel(savedCart);\n\t\t\t// TODO: .d.ts for `SavedCart` model\n\t\t\tmodel\n\t\t\t\t// @ts-ignore\n\t\t\t\t.removeAssetsFromCart([asset.assetId])\n\t\t\t\t.then(() => {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t`${CART_SAVED_EVENT.REMOVE_ASSET}:success`,\n\t\t\t\t\t\tsavedCart,\n\t\t\t\t\t\tasset.assetId,\n\t\t\t\t\t);\n\t\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\t\ttitle: i18n.t('i18n.cartUpdated'),\n\t\t\t\t\t\tdescription: i18n.t('i18n.removedFromSavedCart'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((ex) => {\n\t\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\t\ttitle: i18n.t('i18n.cartUpdating'),\n\t\t\t\t\t\tdescription: i18n.t('i18n.cartUpdateError'),\n\t\t\t\t\t\ttype: 'danger',\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t},\n\t);\n\n\tdispatcher.on(\n\t\tCART_SAVED_EVENT.REMOVE_SELECTED_ASSETS,\n\t\t(savedCart: SavedCart) => {\n\t\t\tconst model = new SavedCartModel(savedCart);\n\t\t\tlet _assetIds: number[] = [];\n\t\t\t// TODO: add to .d.ts for `CartAssets` collection\n\t\t\tcartSingleton\n\t\t\t\t// @ts-ignore\n\t\t\t\t.getAssetIds()\n\t\t\t\t.then((assetIds: number[]) => {\n\t\t\t\t\t_assetIds = assetIds;\n\t\t\t\t\t// TODO: .d.ts for `SavedCart` model\n\t\t\t\t\t// make the call to remove the assets\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\treturn model.removeAssetsFromCart(assetIds);\n\t\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t`${CART_SAVED_EVENT.REMOVE_SELECTED_ASSETS}:success`,\n\t\t\t\t\t\tsavedCart,\n\t\t\t\t\t\t_assetIds,\n\t\t\t\t\t);\n\t\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\t\ttitle: i18n.t('i18n.cartUpdating'),\n\t\t\t\t\t\tdescription: i18n.t('i18n.removedFromSavedCart'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\t\ttitle: i18n.t('i18n.cartUpdating'),\n\t\t\t\t\t\tdescription: i18n.t('i18n.cartUpdateError'),\n\t\t\t\t\t\ttype: 'danger',\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t},\n\t);\n\n\tdispatcher.on(CART_SAVED_EVENT.REVIEW, (savedCart: SavedCart) => {\n\t\tconst model = new SavedCartModel(savedCart);\n\t\tdispatcher.trigger(`cart:saved:project`, model);\n\t});\n\n\tdispatcher.trigger(`${CART_SAVED_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${CART_SAVED_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${CART_SAVED_BASE_EVENT}:initialized`, () => resolve());\n\t\t\tdispatcher.trigger(`${CART_SAVED_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","/**\n * The share module handles UI & functions for various flavors of sharing\n *\n * @module share\n */\n\n// Models\nimport CoreModel from '@netx/core/lib/netx-model';\nimport AccessTokenModel from './models/accessToken';\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\nimport CategoryModel from '@netx/core-category/models/category';\nimport DownloadOptionModel from './models/downloadOption';\nimport DownloadOptionsCollection from './collections/downloadOptions';\nimport FeedModel from './models/feed';\nimport SavedCartModel from '@netx/core-cart/models/savedCart';\nimport SavedSearchModel from '@netx/core-search/models/savedSearch';\nimport ShareStatusModel from './models/shareStatus';\nimport ShareableModel from './models/shareable';\n\n// Collections\nimport CoreCollection from '@netx/core/lib/netx-collection';\nimport AccessTokensCollection from './collections/accessTokens';\nimport CustomFormCollection from '@netx/core-app/collections/customForm';\nimport FeedsCollection from './collections/feeds';\nimport ShareMediaServicesCollection from './collections/shareMediaServices';\n\n// Views\nimport DownloadOptionsView from './views/downloadOptionsView';\nimport ShareStatusView from './views/shareStatusView';\n\n// Templates\nimport ConfirmDownloadWarningsTemplate from '@netx/core-app/templates/confirmView-downloadWarnings.html';\n\nimport DownloadShareTemplate from './templates/downloadShareView.html';\nimport EmailShareTemplate from './templates/emailShareView.html';\nimport FTPShareTemplate from './templates/ftpShareView.html';\nimport GlobalSearchShareTemplate from './templates/globalSearchShareView.html';\nimport MediaServiceShareTemplate from './templates/mediaServiceShareView.html';\nimport UserShareTemplate from './templates/userShareView.html';\n\nconst Templates = {\n\tdownload: DownloadShareTemplate,\n\temail: EmailShareTemplate,\n\tftp: FTPShareTemplate,\n\tglobalSearch: GlobalSearchShareTemplate,\n\tmediaService: MediaServiceShareTemplate,\n\tuser: UserShareTemplate,\n};\n\nimport {accessTypes, expirationTypes} from './properties/accessToken';\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\nimport customConfig from './config';\nimport routes from './routes';\n\nimport {\n\tignoreDownloadWarningTypes,\n\ttypes as downloadOptionTypes,\n} from './properties/downloadOptions';\nimport {sourceTypes} from './properties/feeds';\nimport CategoryAssets from '@netx/core-category/collections/categoryAssets';\n\nimport DownloadRequestService from '@netx/core-download-request/controller';\nimport AssetShareController from '@netx/core-asset/services/share/controller';\nimport CategoryShareController from '@netx/core-category/services/share/controller';\nimport SavedCartController from '@netx/core-cart-saved/controller';\nimport {openDownloadLink} from '@netx/core/utils';\n\n/**\n * @event module:share#share:init\n */\ndispatcher.once('share:init', function (options) {\n\tvar NS = (Netx.share = Netx.share || {});\n\t// Check for module options\n\tNS.options = options = _.extend({}, customConfig, options);\n\t// Bootstrapping: collect information from the DAM before we finish initializing\n\tNS.bootstrap = [\n\t\tDownloadRequestService.initialize(),\n\t\tAssetShareController.initialize(),\n\t\tCategoryShareController.initialize(),\n\t\tSavedCartController.initialize(),\n\t];\n\tNS.status = new ShareStatusModel();\n\n\tvar fsViews = Netx.app.fsViews,\n\t\tappViews = Netx.app.appViews,\n\t\tmodalViews = Netx.app.modalViews;\n\n\t// Helper functions\n\t_.extend(Netx, {\n\t\t/**\n\t\t * @function\n\t\t * @param {module:share/models/sharedResource} sharedResource Shared resource\n\t\t */\n\t\trouteToSharedResource(sharedResource) {\n\t\t\tNetx.router.navigate(sharedResource.sharedResourceRoute, true);\n\t\t},\n\t});\n\n\t// Media services is enabled\n\tif (Netx.getPublicProperty('mediaServices.enabled', true)) {\n\t\t// console.log( 'Media services enabled' );\n\t\tif (Netx.getUser().id) {\n\t\t\tNS.mediaServices = new ShareMediaServicesCollection([]);\n\t\t\tNS.mediaServices.fetch();\n\n\t\t\tNS.feeds = new FeedsCollection();\n\t\t}\n\t} else {\n\t\t// Disable the feed-share entry points.\n\t\t// The old-world solution -- ShareWays are hella deprecated, but just in case:\n\t\tdelete Netx.ShareWays.mediaService;\n\t\t// In the new world of sharing, the proper solution enables/disables the share:feed:new action with an enableTest.\n\t\t// (See the action definition.)\n\t}\n\n\t//=================================\n\t//\tEVENT LISTENERS\n\t//=================================\n\n\t//=================================\n\t// DOWNLOAD OPTIONS SECTION\n\t//=================================\n\n\t/**\n\t * @event module:share#share:options:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:options:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-shareOptions\" */ './views/shareOptionsView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:options:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:share#share:asset:options:original:sticky\n\t * @param {boolen} on On (off)\n\t * @fires module:user#user:prefs:set\n\t */\n\tdispatcher.on('share:asset:options:original:sticky', function (on) {\n\t\tdispatcher.trigger('user:prefs:set', 'share.assetOptions.original', on);\n\t});\n\n\t/**\n\t * @event module:share#share:assetSet:options:check:prepare\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:progress\n\t * @see module:share#share:assetSet:options:check:prepare:error\n\t * @see module:share#share:assetSet:options:check:prepare:success\n\t */\n\tdispatcher.on('share:assetSet:options:check:prepare', function (assetSet) {\n\t\tdispatcher.trigger('app:progress', {\n\t\t\teventStr: 'share:assetSet:options:check:prepare',\n\t\t\theaderTitle: i18n.t('i18n.preparingDownload'),\n\t\t\tmessage: i18n.t('i18n.preparingDownloadMessage'),\n\t\t});\n\t});\n\n\t/**\n\t * @event module:share#share:assetSet:justify:success\n\t */\n\tdispatcher.on(\n\t\t'share:assetSet:justify:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:assetSet:justify:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:assetSet:justify:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t//=================================\n\t// END DOWNLOAD OPTIONS SECTION\n\t//=================================\n\n\t//=================================\n\t// \tDOWNLOAD SECTION\n\t//=================================\n\n\t/**\n\t * The download workflow lets us use the token system to export data to a direct download process\n\t * (as opposed to a more complex set of sharing options.)\n\t *\n\t * Download Workflow Entry Points:\n\t * Each of these action listeners forwards a new assetSet object to the direct-download workflow.\n\t *\n\t * Download one asset.\n\t * @event module:share#share:asset:download\n\t * @param {number} id Asset id\n\t * @fires module:share#share:assetSet:download:start\n\t */\n\t// TODO: i updated all the createPDF handlers to work with models instead of IDs,\n\t// and I think that's probably a better pattern overall. These share:*:download should be updated\n\t// as well. (share:cart:download is done already.)\n\tdispatcher.on('share:asset:download', function (id) {\n\t\t// Check for download options.\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:download:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.asset,\n\t\t\t\tids: [parseInt(id)],\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * Archive & download a saved cart\n\t * @event module:share#share:cart:download\n\t * @param {number|module:cart/models/savedCart} cart Cart or cart id (if ommited, current cart will be used)\n\t * @fires module:share#share:cart:current:download\n\t * @fires module:share#share:assetSet:download:start\n\t */\n\tdispatcher.on('share:cart:download', function (cart) {\n\t\tvar model, id;\n\t\tif (_.isNumber(cart)) {\n\t\t\tid = parseInt(cart);\n\t\t} else {\n\t\t\tmodel = cart;\n\t\t\tid = cart.id;\n\t\t}\n\n\t\t// If this is the current cart, punt to the other handler:\n\t\tif (cart === 0 || cart.id === 0) {\n\t\t\tdispatcher.trigger('share:cart:current:download');\n\t\t\treturn;\n\t\t}\n\t\t// Check for download options.\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:download:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.savedCart,\n\t\t\t\tids: [id],\n\t\t\t\tmodel: model,\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * Archive & download the current cart\n\t * @event module:share#share:cart:current:download\n\t * @fires module:share#share:assetSet:download:start\n\t */\n\tdispatcher.on('share:cart:current:download', function () {\n\t\t// Check for download options.\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:download:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.cart,\n\t\t\t\tids: [0],\n\t\t\t\tlabel: i18n.t('i18n.currentCart'),\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * Archive & download a saved search\n\t * @event module:share#share:search:download\n\t * @param {number} id Search id\n\t * @fires module:share#share:assetSet:download:start\n\t */\n\tdispatcher.on('share:search:download', function (id) {\n\t\t// Check for download options.\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:download:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.savedSearch,\n\t\t\t\tids: [parseInt(id)],\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * Archive & download the assets in a category\n\t * @event module:share#share:category:download\n\t * @param {number} id Category id\n\t * @param {boolean} recursive Recursive download\n\t * @fires module:share#share:assetSet:download:start\n\t */\n\tdispatcher.on('share:category:download', function (id, recursive) {\n\t\t// Check for download options.\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:download:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.category,\n\t\t\t\tids: [parseInt(id)],\n\t\t\t\t// recursive is off the table for 8.5\n\t\t\t\t// ,recursive: recursive || false\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * Generic entry point to the download workflow for assetSets.\n\t * @event module:share#share:assetSet:download:start\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @param {Netx.Models.DownloadOption} downloadOptions Chosen download options\n\t * @param {object} contextOptions contains event prefix and context(repurpose, create pdf, etc)\n\t * @fires module:share#share:assetSet:download:warnings:check\n\t */\n\tdispatcher.on('share:assetSet:download:start', function (\n\t\tassetSet,\n\t\tdownloadOptions,\n\t\tcontextOptions,\n\t) {\n\t\tdispatcher.trigger(\n\t\t\t'share:download',\n\t\t\tassetSet,\n\t\t\tdownloadOptions,\n\t\t\tcontextOptions,\n\t\t);\n\t});\n\n\t/**\n\t * TODO: This should repalce 'share:assetSet:download:start' but I don't want to go and change that everywhere yet\n\t * Generic entry point to the download workflow for assetSets.\n\t * @event module:share#share:download\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @param {Netx.Models.DownloadOption} downloadOptions Chosen download options\n\t * @fires module:share#share:download:warnings:check\n\t */\n\tdispatcher.on('share:download', function (\n\t\tassetSet,\n\t\tdownloadOptions,\n\t\tcontextOptions,\n\t) {\n\t\t// If downloadOptions are already defined then set it on the assetSet\n\t\tif (downloadOptions) {\n\t\t\tassetSet.downloadOptions = downloadOptions;\n\t\t}\n\t\t// Pass along context options to the asset set\n\t\tif (contextOptions) {\n\t\t\tassetSet.contextOptions = contextOptions;\n\t\t}\n\n\t\t// we do not want a download warning for export metadata\n\t\t// DAM-15807 or when creating a pdf\n\t\tvar types = assetSet.displayedDownloadOptionTypes;\n\t\tif (types.length === 1 && ignoreDownloadWarningTypes.includes(types[0])) {\n\t\t\tdispatcher.trigger('share:download:warnings:checked', assetSet);\n\t\t} else {\n\t\t\tdispatcher.trigger('share:download:warnings:check', assetSet);\n\t\t}\n\t});\n\t/**\n\t * @event module:share#share:download:warnings:checked\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:share#share:download:downloadOptions:check\n\t * @fires module:share#share:download:edit:downloadOptions\n\t * @fires module:share#share:download:justify:check\n\t */\n\tdispatcher.on('share:download:warnings:checked', function (assetSet) {\n\t\tvar contextOptions = assetSet.contextOptions || {},\n\t\t\tdownloadOptions = assetSet.downloadOptions;\n\t\tif (downloadOptions.length) {\n\t\t\tvar manualOption = downloadOptions.findWhere({type: 'manual'}),\n\t\t\t\torginalOption = downloadOptions.findWhere({type: 'original'}),\n\t\t\t\tconfigurableOptions = downloadOptions.filter(function (opt) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\topt.get('type') === 'contactSheet' ||\n\t\t\t\t\t\topt.get('type') === 'metadata' ||\n\t\t\t\t\t\topt.get('type') === 'presetProcess'\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t// See notes in module:asset/models/assetSet, Netx.Models.ImageEditorImage, Netx.Models.AufioEditorAudio and `share:assetSet:repurpose:manual` about this\n\t\t\t// We need to remove the original option if we made here with a manaul operation (due to some inconsistencies on the server)\n\t\t\tmanualOption && orginalOption && downloadOptions.remove(orginalOption);\n\t\t\t// If the context id for preset process then remove all options but the presets/metadata\n\t\t\tif (contextOptions.context === 'presetProcess') {\n\t\t\t\tdownloadOptions.set(\n\t\t\t\t\tdownloadOptions.filter(function (opt) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\topt.get('type') === 'metadata' ||\n\t\t\t\t\t\t\topt.get('type') === 'presetProcess'\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// At least to options or the single option as a configurable one\n\t\t\tif (downloadOptions.length > 1 || configurableOptions.length) {\n\t\t\t\t// Show download options interface\n\t\t\t\tdispatcher.trigger('share:download:edit:downloadOptions', assetSet);\n\t\t\t} else {\n\t\t\t\t// We already have download options, don't ask again\n\t\t\t\tdispatcher.trigger('share:download:justify:check', assetSet);\n\t\t\t}\n\t\t} else {\n\t\t\t// No download options passed, best get to checking\n\t\t\tdispatcher.trigger('share:download:downloadOptions:check', assetSet);\n\t\t}\n\t});\n\t/**\n\t * Download workflow steps:\n\t *\n\t * Step 1: Check for any warnings on the set of assets selected -- one\n\t * might be checked out, for instance.\n\t * @event module:share#share:download:warnings:check\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:share#share:download:noWarnings\n\t * @fires module:share#share:download:warnings:prepare\n\t * @fires module:share#share:download:warnings:prepare:error\n\t * @fires module:share#share:download:warnings:prepare:success\n\t * @fires module:share#share:download:warnings:warn\n\t */\n\n\tdispatcher.on('share:download:warnings:check', function (assetSet) {\n\t\t// This could take a minute\n\t\tdispatcher.trigger('share:download:warnings:prepare', assetSet);\n\n\t\t// Get download warnings\n\t\tassetSet.getDownloadWarnings().then(\n\t\t\tfunction (warnings) {\n\t\t\t\t// Warnings\n\t\t\t\tif (warnings.messageCount) {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:download:warnings:warn',\n\t\t\t\t\t\twarnings.progressMessages,\n\t\t\t\t\t\tassetSet,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tdispatcher.trigger('share:download:warnings:checked', assetSet);\n\t\t\t\t}\n\t\t\t\t// Get warning was a success\n\t\t\t\tdispatcher.trigger('share:download:warnings:prepare:success', assetSet);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tif (err.code == 2102) {\n\t\t\t\t\t// getDownloadWarnings will return error 2102 if the request is too large;\n\t\t\t\t\tvar types = assetSet.displayedDownloadOptionTypes;\n\t\t\t\t\tif (types.length === 1 && types[0] === 'contactSheet') {\n\t\t\t\t\t\t// we don't care about this error when creating a pdf\n\t\t\t\t\t\tdispatcher.trigger('share:download:warnings:checked', assetSet);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// otherwise, ask for confirmation & continue.\n\t\t\t\t\t\tdispatcher.trigger('share:download:noWarnings', assetSet);\n\t\t\t\t\t}\n\t\t\t\t\t// Get warning was technically a success\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:download:warnings:prepare:success',\n\t\t\t\t\t\tassetSet,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// Get warning was not a success\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:download:warnings:prepare:error',\n\t\t\t\t\t\terr,\n\t\t\t\t\t\tassetSet,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:share#share:download:warnings:prepare\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:progress\n\t * @see module:share#share:download:warnings:prepare:error\n\t * @see module:share#share:download:warnings:prepare:success\n\t */\n\tdispatcher.on('share:download:warnings:prepare', function (assetSet) {\n\t\tdispatcher.trigger('app:progress', {\n\t\t\teventStr: 'share:download:warnings:prepare',\n\t\t\theaderTitle: i18n.t('i18n.preparingDownloadOptions'),\n\t\t\tmessage: i18n.t('i18n.preparingDownloadOptionsMessage'),\n\t\t});\n\t});\n\t/**\n\t * @event module:share#share:download:warnings:prepare:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:download:warnings:prepare:error',\n\t\tfunction (error, assetSet) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:download:warnings:prepare:success\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t */\n\tdispatcher.on(\n\t\t'share:download:warnings:prepare:success',\n\t\tfunction (assetSet) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI handler for showing download warnings at the start of the download process.\n\t * @event module:share#share:download:warnings:warn\n\t * @param {array} warnings Array of warning objects\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:confirm\n\t * @see module:share#share:download:downloadOptions:check\n\t */\n\tdispatcher.on(\n\t\t'share:download:warnings:warn',\n\t\tfunction (warnings, assetSet) {\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t('i18n.someAssetsMayNotDownload'),\n\t\t\t\tgoo: warnings || {},\n\t\t\t\tyesLabel: i18n.t('i18n.continue'),\n\t\t\t\tnoLabel: i18n.t('i18n.cancel'),\n\t\t\t\teventStr: 'share:download:warnings:warn',\n\t\t\t\ttemplate: ConfirmDownloadWarningsTemplate,\n\t\t\t\targs: [assetSet],\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:download:warnings:warn:confirmed\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:share#share:download:downloadOptions:check\n\t * @see module:share#share:download:warnings:warn\n\t */\n\tdispatcher.on('share:download:warnings:warn:confirmed', function (assetSet) {\n\t\tdispatcher.trigger('share:download:downloadOptions:check', assetSet);\n\t});\n\t/**\n\t * The request is so large, we can't check for download warnings.\n\t * Instead, just issue a blanket disclaimer.\n\t * @event module:share#share:download:noWarnings\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:confirm\n\t * @fires module:share#share:download:justify:check\n\t * @fires module:share#share:download:downloadOptions:check\n\t */\n\tdispatcher.on(\n\t\t'share:download:noWarnings',\n\t\tfunction (assetSet) {\n\t\t\tlet yesEvent, yesEventArgs;\n\n\t\t\t// DEVNOTE: this logic is copied from the previous handler,\n\t\t\t// but it shouldn't be written twice.\n\t\t\t// can we reconfigure this traffic pattern?\n\n\t\t\tif (assetSet.downloadOptions.length) {\n\t\t\t\t// If we have downloadoptions already, the next step is justification.\n\t\t\t\tyesEvent = 'share:download:justify:check';\n\t\t\t\tyesEventArgs = [assetSet, 'download', assetSet.downloadOptions];\n\t\t\t} else {\n\t\t\t\t// If we don't have downloadoptions, then that's the next step.\n\t\t\t\tyesEvent = 'share:download:downloadOptions:check';\n\t\t\t\tyesEventArgs = [assetSet];\n\t\t\t}\n\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t('i18n.requestTooLargeForDownloadWarnings'),\n\t\t\t\tyesLabel: i18n.t('i18n.continue'),\n\t\t\t\tnoLabel: i18n.t('i18n.cancel'),\n\t\t\t\tyesEvent: yesEvent,\n\t\t\t\targs: yesEventArgs,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:download:downloadOptions:check\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @param {object} viewOptions View options for `Netx.Views.DownloadOptionsView`\n\t * @fires module:share#share:download:justify:check\n\t * @fires module:share#share:download:edit:downloadOptions:check:prepare\n\t * @fires module:share#share:download:edit:downloadOptions\n\t * @fires module:share#share:download:edit:downloadOptions:check:prepare:success\n\t * @fires module:share#share:download:edit:downloadOptions:check:prepare:error\n\t */\n\tdispatcher.on('share:download:downloadOptions:check', function (\n\t\tassetSet,\n\t\tviewOptions,\n\t) {\n\t\t// This could take a minute\n\t\tdispatcher.trigger(\n\t\t\t'share:download:edit:downloadOptions:check:prepare',\n\t\t\tassetSet,\n\t\t);\n\n\t\t// Get download options\n\t\tassetSet.getDownloadOptions().then(\n\t\t\tfunction (downloadOptions) {\n\t\t\t\tvar contextOptions = assetSet.contextOptions || {},\n\t\t\t\t\tconfigurableOptions = downloadOptions.filter(function (opt) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\topt.get('type') === 'contactSheet' ||\n\t\t\t\t\t\t\topt.get('type') === 'metadata' ||\n\t\t\t\t\t\t\topt.get('type') === 'presetProcess'\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t// If this is for a preset process - only use presets/metadata\n\t\t\t\tif (contextOptions.context === 'presetProcess') {\n\t\t\t\t\tdownloadOptions.set(\n\t\t\t\t\t\tdownloadOptions.filter(function (opt) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\topt.get('type') === 'metadata' ||\n\t\t\t\t\t\t\t\topt.get('type') === 'presetProcess'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// At least two options or the single option is a configurable one\n\t\t\t\tif (downloadOptions.length > 1 || configurableOptions.length) {\n\t\t\t\t\t// Show download options interface\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:download:edit:downloadOptions',\n\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\tviewOptions,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// Proceed without displaying download options\n\t\t\t\t\tdispatcher.trigger('share:download:justify:check', assetSet);\n\t\t\t\t}\n\t\t\t\t// Preparation was a success\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'share:download:edit:downloadOptions:check:prepare:success',\n\t\t\t\t\tassetSet,\n\t\t\t\t\tdownloadOptions,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Preparation was not a success\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'share:download:edit:downloadOptions:check:prepare:error',\n\t\t\t\t\terr,\n\t\t\t\t\tassetSet,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:share#share:download:edit:downloadOptions:check:prepare\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:progress\n\t * @see module:share#share:download:edit:downloadOptions:check:prepare:error\n\t * @see module:share#share:download:edit:downloadOptions:check:prepare:success\n\t */\n\tdispatcher.on('share:download:edit:downloadOptions:check:prepare', function (\n\t\tassetSet,\n\t) {\n\t\tdispatcher.trigger('app:progress', {\n\t\t\teventStr: 'share:download:edit:downloadOptions:check:prepare',\n\t\t\theaderTitle: i18n.t('i18n.preparingDownload'),\n\t\t\tmessage: i18n.t('i18n.preparingDownloadMessage'),\n\t\t});\n\t});\n\t/**\n\t * @event module:share#share:download:edit:downloadOptions:check:prepare:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:download:edit:downloadOptions:check:prepare:error',\n\t\tfunction (error, assetSet) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:download:edit:downloadOptions:check:prepare:success\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @param {Netx.Collections.DownloadOptions} downloadOptions Download options\n\t */\n\tdispatcher.on(\n\t\t'share:download:edit:downloadOptions:check:prepare:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:share#share:download:edit:downloadOptions:show\n\t * @param {object} viewOption View options\n\t */\n\tdispatcher.on(\n\t\t'share:download:edit:downloadOptions:show',\n\t\tfunction (viewOptions) {\n\t\t\tmodalViews.add({\n\t\t\t\tviewClass: DownloadOptionsView,\n\t\t\t\tshowActions: ['share:download:edit:downloadOptions:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:download:edit:downloadOptions\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @param {object} viewOptions options to DownloadOptionsView\n\t * @fires module:share#share:download:edit:downloadOptions:show\n\t */\n\tdispatcher.on('share:download:edit:downloadOptions', function (\n\t\tassetSet,\n\t\tviewOptions,\n\t) {\n\t\t// Attach any extra args to the view's options' .args property;\n\t\t// Standard formViews will return this unmodified with the form submission event.\n\t\tviewOptions = viewOptions || {};\n\t\t_.extend(viewOptions, {\n\t\t\targs: [assetSet],\n\t\t});\n\n\t\t// Show\n\t\tdispatcher.trigger(\n\t\t\t'share:download:edit:downloadOptions:show',\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tcollection: assetSet.downloadOptions,\n\t\t\t\t\tassetSet: assetSet,\n\t\t\t\t\teventStr: 'share:download:edit:downloadOptions',\n\t\t\t\t},\n\t\t\t\tviewOptions,\n\t\t\t),\n\t\t);\n\t});\n\n\t/**\n\t * Form handler for downloadOptionsView\n\t * @event module:share#share:download:edit:downloadOptions:confirmed\n\t * @param {object} form Form submission\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:share#share:download:edit:downloadOptions:success\n\t * @fires module:share#share:download:justify:check\n\t */\n\tdispatcher.on('share:download:edit:downloadOptions:confirmed', function (\n\t\tform,\n\t\tassetSet,\n\t) {\n\t\t// reduce the option set to just the selected item\n\t\tassetSet.downloadOptions.parseSelectedDownloadOptions(form);\n\t\t// if sharing a category, the form has a recursive option\n\t\tassetSet.set({recursive: form.recursive});\n\t\t// Close window\n\t\tdispatcher.trigger('share:download:edit:downloadOptions:success');\n\t\t// Check to see if justifcation is required\n\t\tdispatcher.trigger('share:download:justify:check', assetSet);\n\t});\n\t/**\n\t * Checks to see if justification is required\n\t * @event module:share#share:download:justify:check\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:share#share:download:justify\n\t * @fires module:share#share:download:confirmed\n\t */\n\tdispatcher.on('share:download:justify:check', function (assetSet) {\n\t\tvar requiresJustification = false,\n\t\t\tdownloadOptions;\n\t\t// TODO: We should always define download options before we get here. Look into why this is like this. VAR 2/27/17\n\t\t// If no downloadOptions specified, choose the original asset file.\n\t\tdownloadOptions = assetSet.downloadOptions;\n\n\t\trequiresJustification = downloadOptions.some(function (opt, i) {\n\t\t\tif (opt.get('requiresJustification')) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\n\t\tif (requiresJustification) {\n\t\t\tdispatcher.trigger('share:download:justify', assetSet);\n\t\t} else {\n\t\t\tdispatcher.trigger('share:download:confirmed', assetSet);\n\t\t}\n\t});\n\n\t/**\n\t * @event module:share#share:download:justify:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:download:justify:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-downloadJustify\" */ './views/downloadJustifyView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:download:justify:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:download:justify\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:share#share:download:justify:show\n\t * @see module:share#share:download:justify:confirmed\n\t */\n\tdispatcher.on('share:download:justify', function (assetSet) {\n\t\tvar customForm = new CustomFormCollection([], {\n\t\t\tformName: 'downloadJustification',\n\t\t});\n\n\t\tcustomForm.fetch().then(function () {\n\t\t\t// Show\n\t\t\tdispatcher.trigger('share:download:justify:show', {\n\t\t\t\tcollection: customForm,\n\t\t\t\tremoveOnHide: true,\n\t\t\t\teventStr: 'share:download:justify',\n\t\t\t\targs: [assetSet],\n\t\t\t});\n\t\t});\n\t});\n\t/**\n\t * @event module:share#share:download:justify:confirmed\n\t * @param {object} form Form submission\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:share#share:download:confirmed\n\t * @fires module:share#share:download:justify:success\n\t */\n\tdispatcher.on('share:download:justify:confirmed', function (form, assetSet) {\n\t\tdispatcher.trigger('share:download:confirmed', assetSet, form);\n\t\tdispatcher.trigger('share:download:justify:success');\n\t});\n\t/**\n\t * @event module:share#share:download:justify:success\n\t */\n\tdispatcher.on(\n\t\t'share:download:justify:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:download:justify:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:download:justify:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Step 4: prepare download -- hand off to ShareWay download handler for asset sets.\n\t * If there are no exceptions, the ShareWay will handle tracking the progress of\n\t * the task & send an event when complete.\n\t * @event module:share#share:download:confirmed\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @param {string} justification Justification message\n\t * @fires module:share#share:download:downloadOptions:success\n\t * @fires module:share#share:download:prepare\n\t */\n\tdispatcher.on('share:download:confirmed', function (assetSet, justification) {\n\t\t// Tell the download options window we're happy with it.\n\t\tdispatcher.trigger('share:download:downloadOptions:success');\n\n\t\t// This could take a minute\n\t\tdispatcher.trigger('share:download:prepare', assetSet);\n\n\t\t// DEVNOTE: Sticking with the standard (weird) argument format for these handlers, because I think it might be required.\n\t\t// TODO: move this code to the assetSet model & get rid of shareways completely ...\n\t\tNetx.ShareWays.download.handlers.assetSet(\n\t\t\t// first argument is an object with whatever metadata we need to attempt a share\n\t\t\t{\n\t\t\t\tdownloadOptions: assetSet.downloadOptions,\n\t\t\t\tjustification: justification,\n\t\t\t},\n\t\t\t// second argument is a list of ids to share\n\t\t\tassetSet.get('ids'),\n\t\t\t// third argument is the object itself.\n\t\t\tassetSet,\n\t\t);\n\t});\n\t/**\n\t * @event module:share#share:download:prepare\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:progress\n\t * @see module:share#share:download:error\n\t * @see module:share#share:download:success\n\t */\n\tdispatcher.on('share:download:prepare', function (assetSet) {\n\t\tdispatcher.trigger('app:progress', {\n\t\t\teventStr: 'share:download',\n\t\t\theaderTitle: i18n.t('i18n.preparingDownload'),\n\t\t\tmessage: i18n.t('i18n.preparingDownloadMessage'),\n\t\t});\n\t});\n\n\t/**\n\t * @event module:share#share:download:error\n\t * @param {string} error Error\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:download:error',\n\t\tfunction (error, assetSet) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Step 5: When the download finishes, we are notified via this event:\n\t * @event module:share#share:download:done\n\t * @param {Netx.Models.ShareStatus} progressReport Share status model\n\t * @fires module:share#share:simpleDownload\n\t * @fires module:share#share:download:warnings:notify\n\t * @see module:share#share:download:prepare:success\n\t */\n\tdispatcher.on('share:download:done', function (progressReport) {\n\t\t// shareWays confuses the issue: it triggers 'share:assetSet:download:done' even if we interrupted the download. (see TODO above.)\n\t\t// So we check the actual instance here for the skinny.\n\t\tif (\n\t\t\tprogressReport.get('percentComplete') >= 100 &&\n\t\t\tprogressReport.get('completeUrl')\n\t\t) {\n\t\t\t// start the download.\n\t\t\tdispatcher.trigger(\n\t\t\t\t'share:simpleDownload',\n\t\t\t\tprogressReport.get('completeUrl'),\n\t\t\t);\n\t\t\t// Any warnings to display?\n\t\t\tif (progressReport.get('progressMessageCount')) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'share:download:warnings:notify',\n\t\t\t\t\tprogressReport.get('progressMessages'),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * UI handler for showing download warnings at the end of the download process.\n\t * @event module:share#share:download:warnings:notify\n\t * @param {array} warnings Array of warning objects\n\t * @fires module:app#app:confirm\n\t */\n\tdispatcher.on(\n\t\t'share:download:warnings:notify',\n\t\tfunction (warnings) {\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t('i18n.someAssetsDidNotDownload'),\n\t\t\t\tgoo: warnings || {},\n\t\t\t\ttemplate: ConfirmDownloadWarningsTemplate,\n\t\t\t\tnoLabel: undefined,\n\t\t\t\tyesLabel: i18n.t('i18n.btnOK'),\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * UI handler: Handle a justification exception. This is triggered if we\n\t * request a download without a required justification.\n\t * @event module:share#share:download:rejected:justify\n\t * @param {object} err Error object from backbone.rpc\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @see module:share#share:download:justify\n\t */\n\tdispatcher.on(\n\t\t'share:download:rejected:justify',\n\t\tfunction (err, assetSet) {\n\t\t\t// We get here if we are coming from a manual repurpose because it does not know if justification is required or not\n\t\t\t// This previous triggered an app:confirm, now short circuiting to trigger the justify right away\n\t\t\tdispatcher.trigger('share:download:justify', assetSet);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * UI handler: Handle an approval exception. This is triggered if we submit\n\t * a download that will require approval.\n\t * @event module:share#share:download:rejected:approve, module:share#share:token:edit:rejected:approve\n\t * @param {object} err Error object from backbone.rpc\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:download:rejected:approve share:token:edit:rejected:approve',\n\t\tfunction (err, assetSet) {\n\t\t\t// Inform the user that their download awaits justification.\n\t\t\tdispatcher.trigger(\n\t\t\t\t'app:alert',\n\t\t\t\ti18n.t('i18n.downloadApprovalMessage', {\n\t\t\t\t\tyourEmail: Netx.getUser('email'),\n\t\t\t\t\tadminEmail: Netx.getPreference('image.downloadApprovalAdminEmail'),\n\t\t\t\t\t// (Not sure if any of this data is useful to the translation or not, but it's there if we want it.)\n\t\t\t\t\t// TODO: stop using protected names `set`!\n\t\t\t\t\tset: assetSet,\n\t\t\t\t\toptions: assetSet.downloadOptions,\n\t\t\t\t}),\n\t\t\t\ti18n.t('i18n.info'),\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * UI handler: Handle a download exception. This is triggered if we get a failure\n\t * while polling the status of a download in preparation.\n\t * @event module:share#share:rpc:error\n\t * @param {object} err Error object from backbone.rpc\n\t * @fires module:share#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:rpc:error',\n\t\tfunction (err) {\n\t\t\t// TODO: i18n\n\t\t\tdispatcher.trigger(\n\t\t\t\t'app:alert',\n\t\t\t\t'Download failed: ' + err.message,\n\t\t\t\ti18n.t('i18n.error'),\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * UI handler for when user decides they'll want an email later\n\t * @event module:share#share:poll:deferred\n\t * @param {Netx.Models.ShareStatus} statusModel Status model\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'share:poll:deferred',\n\t\tfunction (statusModel) {\n\t\t\tvar email = Netx.getUser('email');\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'share',\n\t\t\t\ttitle: i18n.t('i18n.preparingData'),\n\t\t\t\tdescription: i18n.t('i18n.weWillSendALink'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t//=================================\n\t// END DOWNLOAD SECTION\n\t//=================================\n\n\t//=================================\n\t// CREATE PDF SECTION\n\t//=================================\n\n\t/**\n\t * The Create PDF workflow is for creating PDFs of various asset sets.\n\t * The process configures a PDF downloadOption for an asset set.\n\t * Then the set & options are handed to the assetSet sharing menu.\n\t *\n\t * Create PDF Workflow entry points:\n\t *\n\t * Create PDF of some asset/assets\n\t * Arguments can be a single array, an array of objects, or an collection of asset models,\n\t * and the objects can be assets or asset ids.\n\t *\n\t * @event module:share#share:asset:createPDF\n\t * @fires module:share#share:assetSet:createPDF:start\n\t */\n\tdispatcher.on('share:asset:createPDF', function () {\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:createPDF:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.asset,\n\t\t\t\tids: _.tidyAssetList(arguments),\n\t\t\t\tlabel: i18n.t('share:PDF', {defaultValue: 'PDF'}),\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * @event module:share#share:cart:gallery:createPDF\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:share#share:cart:createPDF\n\t */\n\tdispatcher.on('share:cart:gallery:createPDF', function (model) {\n\t\tdispatcher.trigger('share:cart:createPDF', model);\n\t});\n\n\t/**\n\t * Create PDF of a saved cart:\n\t * @event module:share#share:cart:createPDF\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:share#share:assetSet:createPDF:start\n\t */\n\tdispatcher.on('share:cart:createPDF', function (model) {\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:createPDF:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.savedCart,\n\t\t\t\tids: [model.id],\n\t\t\t\t// Fix this translation - you cannot jsut append \"PDF\" to the end - that is not how language works\n\t\t\t\tlabel: model.get('title')\n\t\t\t\t\t? model.get('title') + ' PDF'\n\t\t\t\t\t: i18n.t('share:cartPDF'),\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * Create PDF of the current cart/asset selection\n\t * @event module:share#share:cart:current:createPDF\n\t * @fires module:share#share:assetSet:createPDF:start\n\t */\n\tdispatcher.on('share:cart:current:createPDF', function () {\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:createPDF:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.cart,\n\t\t\t\tids: [0],\n\t\t\t\tlabel: i18n.t('i18n.selectedAssets'),\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * @event module:share#share:search:gallery:createPDF\n\t * @param {module:search/models/savedSearch} model Saved search\n\t * @fires module:share#share:search:createPDF\n\t */\n\tdispatcher.on('share:search:gallery:createPDF', function (model) {\n\t\tdispatcher.trigger('share:search:createPDF', model);\n\t});\n\n\t/**\n\t * Create PDF of a saved search\n\t * @event module:share#share:search:createPDF\n\t * @param {module:search/models/savedSearch} model Saved search\n\t * @fires module:share#share:assetSet:createPDF:start\n\t */\n\tdispatcher.on('share:search:createPDF', function (model) {\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:createPDF:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.savedSearch,\n\t\t\t\tids: [model.id],\n\t\t\t\t// TODO: fix label and make i18n this is not how translations work in the real world - yo ucannot jsut append \"PDF\" to the end\n\t\t\t\tlabel: model.get('title')\n\t\t\t\t\t? model.get('title') + ' PDF'\n\t\t\t\t\t: i18n.t('i18n.savedSearchPDF'),\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * Create PDF of a category\n\t * @event module:share#share:category:createPDF\n\t * @param {Netx.Models.Category} model Category\n\t * @fires module:share#share:assetSet:createPDF:start\n\t */\n\tdispatcher.on('share:category:createPDF', function (model) {\n\t\tdispatcher.trigger(\n\t\t\t'share:assetSet:createPDF:start',\n\t\t\tnew AssetSetModel({\n\t\t\t\ttype: assetSetTypes.category,\n\t\t\t\tids: [model.id],\n\t\t\t\t// TODO: fix label and make i18n this is not how translations work in the real world - yo ucannot jsut append \"PDF\" to the end\n\t\t\t\tlabel: model.get('name')\n\t\t\t\t\t? model.get('name') + ' PDF'\n\t\t\t\t\t: i18n.t('i18n.categoryPDF'),\n\t\t\t}),\n\t\t);\n\t});\n\n\t/**\n\t * CreatePDF workflow steps:\n\t * Everything now goes through the share menu which will go through share:assetSet:download:start or share:assetSet:token:withOptions\n\t * @event module:share#share:assetSet:createPDF:start\n\t * @param module:asset/models/assetSet assetSet\n\t * @fires module:share#share:assetSet:menu\n\t */\n\tdispatcher.on('share:assetSet:createPDF:start', function (assetSet) {\n\t\tassetSet.displayedDownloadOptionTypes = ['contactSheet'];\n\t\tassetSet.downloadOptions.set({type: 'contactSheet'});\n\t\tdispatcher.trigger('share:assetSet:menu', assetSet);\n\t});\n\n\t//=================================\n\t// END CREATE PDF SECTION\n\t//=================================\n\n\t//=================================\n\t// REPURPOSE SECTION\n\t//=================================\n\n\t/**\n\t * @event module:share#share:assetSet:repurpose:manual\n\t * @param {number|string} processId Repurpose preset id or name (for videos - yeah...)\n\t * @param {module:asset/models/assetSet} assetSet An asset or assets collection\n\t * @param {string} type Asset type (audio/image/video)\n\t * @fires module:share#share:assetSet:menu\n\t * @fires module:share#share:assetSet:repurpose:manual:error\n\t */\n\tdispatcher.on('share:assetSet:repurpose:manual', function (\n\t\tassetSet,\n\t\trepurposeOptions,\n\t\ttype,\n\t) {\n\t\tassetSet.getDownloadOptions().then(function (downloadOptions) {\n\t\t\t// Find the manual repurpose option\n\t\t\tvar manualOpt = downloadOptions.findWhere({type: 'manualRepurpose'});\n\t\t\tconst originalOpt = downloadOptions.findWhere({type: 'original'});\n\n\t\t\t// If not there, try and do it with the asset if original is available\n\t\t\t// This is happening with non image related assets\n\t\t\tif (!manualOpt) {\n\t\t\t\tif (originalOpt) {\n\t\t\t\t\tmanualOpt = new DownloadOptionModel({\n\t\t\t\t\t\tattributeIds: [],\n\t\t\t\t\t\tfamily: type,\n\t\t\t\t\t\tid: 0,\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t\trequiresApproval: originalOpt.requiresApproval,\n\t\t\t\t\t\trequiresJustification: originalOpt.requiresJustification,\n\t\t\t\t\t\ttype: 'manualRepurpose',\n\t\t\t\t\t});\n\t\t\t\t\tdownloadOptions.add(manualOpt);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Need to have this option to go forward\n\t\t\tif (!manualOpt) {\n\t\t\t\treturn dispatcher.trigger(\n\t\t\t\t\t'share:assetSet:repurpose:manual:error',\n\t\t\t\t\tnew Error(i18n.t('i18n.repurposeManualUnavailableForSelectedAssets')),\n\t\t\t\t\trepurposeOptions,\n\t\t\t\t\tassetSet,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// We do not want the user to have this option - but in some cases, as seen above, we need this download option to create our manual one\n\t\t\toriginalOpt && downloadOptions.remove(originalOpt);\n\n\t\t\t// Set the manual operations\n\t\t\tmanualOpt.set('options', repurposeOptions);\n\n\t\t\t// Punt to the share workflow.\n\t\t\tdispatcher.trigger('share:assetSet:menu', assetSet);\n\t\t});\n\t});\n\n\t/**\n\t * UI handler for repurpose preset errors\n\t * @event module:share#share:assetSet:repurpose:manual:error\n\t * @param {error} error Error\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:assetSet:repurpose:manual:error',\n\t\tfunction (error, repurposeOptions, assetSet) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * UI handler for repurpose preset errors\n\t * @event module:share#share:assetSet:repurpose:preset:error\n\t * @param {error} error Error\n\t * @fires module:app#app:alert\n\t * @todo Cannot find this referenced anywhere (remove?) -jse-\n\t */\n\tdispatcher.on(\n\t\t'share:assetSet:repurpose:preset:error',\n\t\tfunction (error, processId, assetSet) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t//=================================\n\t// END REPURPOSE SECTION\n\t//=================================\n\n\t//=================================\n\t// ASSETSET SHARE MENU SECTION\n\t//=================================\n\t/**\n\t * @event module:share#share:assetSet:menu:show\n\t * @param {object} viewOptions View options\n\t * @fires moudle:app#app:showOptions\n\t */\n\tdispatcher.on(\n\t\t'share:assetSet:menu:show',\n\t\tfunction (viewOptions) {\n\t\t\tdispatcher.trigger('app:showOptions', viewOptions);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * If we have previously chosen an assetSet and some download Options,\n\t * and want to explore the world of possibilities they bring,\n\t * this is where we start:\n\t * @event module:share#share:assetSet:menu\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @param {Netx.Collections.DownloadOptions} downloadOptions selected downloadOptions\n\t * @param {object} contextOptions contains event prefix and context(repurpose, create pdf, etc)\n\t * @fires module:share#share:assetSet:menu:show\n\t */\n\tdispatcher.on('share:assetSet:menu', function (\n\t\tassetSet,\n\t\tdownloadOptions,\n\t\tcontextOptions,\n\t) {\n\t\t// The default actions in that menu are\n\t\t// 'share:assetSet:directDownload', // trigger a direct download\n\t\t// 'share:assetSet:email', // show email form\n\t\tdispatcher.trigger('share:assetSet:menu:show', {\n\t\t\tmenu: Netx.Menus.assetSetShareOptions,\n\t\t\thideOnSelect: true,\n\t\t\tdata: {\n\t\t\t\tassetSet: assetSet,\n\t\t\t\tdownloadOptions: downloadOptions,\n\t\t\t\tcontextOptions: contextOptions,\n\t\t\t},\n\t\t});\n\t});\n\n\t/**\n\t * @event module:share#share:menu:show\n\t * @param {object} viewOptions View options\n\t * @fires moudle:app#app:showOptions\n\t */\n\tdispatcher.on(\n\t\t'share:menu:show',\n\t\tfunction (viewOptions) {\n\t\t\tdispatcher.trigger('app:showOptions', viewOptions);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * More generally: if we want to share a thing, we can trigger the action 'share:menu',\n\t * figure out what it is and create an appropriate assetSet.\n\t * (DownloadOptions are not chosen yet, so that will still be necessary for some kinds of sharing.)\n\t * @event module:share#share:menu\n\t * @param {Asset|Assets|CartAssets|SavedCart|SavedSearch|SearchAssets|Category|CategoryAssets} thing Any model/collection with a valid .toAssetSet() function.\n\t * @param Netx.View view the view that the action was clicked in\n\t * @param Event event the click event\n\t * @fires module:share#share:menu:show\n\t */\n\tdispatcher.on('share:menu', function (thing, view, event) {\n\t\tif (!_.isFunction(thing.toAssetSet)) {\n\t\t\tthrow new Error(\"can't make asset set from \" + thing);\n\t\t}\n\t\tvar assetSet = thing.toAssetSet(),\n\t\t\tshareMenu = Netx.Menus.shareMenu.clone();\n\n\t\t// TODO: shareMenu.clone() really ought to also do this:\n\t\tshareMenu.set({actions: _.clone(shareMenu.get('actions'))});\n\n\t\t// The actions in that menu are (at most) these:\n\t\t//\n\t\t// 'share:assetSet:download:start', // trigger a direct download\n\t\t// 'share:assetSet:email', // show email form\n\t\t// 'share:assetSet:users', // share between DAM users/groups (if this assetSet can do that.)\n\t\t// 'share:assetSet:media:service' // publish to social media (carts only in 8.5)\n\t\t// 'share:feed:new' // create syndication feed (iTunes podcast, etc)\n\n\t\tswitch (assetSet.get('type')) {\n\t\t\tcase assetSetTypes.asset:\n\t\t\t\t// No way to share asset with team\n\t\t\t\t// Not creating feeds of individual assets yet\n\t\t\t\tshareMenu.set(\n\t\t\t\t\t'actions',\n\t\t\t\t\t_.without(\n\t\t\t\t\t\tshareMenu.get('actions'),\n\t\t\t\t\t\t'share:assetSet:users',\n\t\t\t\t\t\t'share:feed:new',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase assetSetTypes.cart:\n\t\t\tcase assetSetTypes.assets:\n\t\t\t\t// Not creating feeds of arbitrary sets of assets in NetX yet. (Use a saved cart instead.)\n\t\t\t\t// No way to share arbitrary set of assets with team, make a feed of them or embed them.\n\t\t\t\tshareMenu.set(\n\t\t\t\t\t'actions',\n\t\t\t\t\t_.without(\n\t\t\t\t\t\tshareMenu.get('actions'),\n\t\t\t\t\t\t'share:feed:new',\n\t\t\t\t\t\t'share:assetSet:users',\n\t\t\t\t\t\t'share:token:embed',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase assetSetTypes.category:\n\t\t\t\t// No way to share category with team or to get embed code\n\t\t\t\tshareMenu.set(\n\t\t\t\t\t'actions',\n\t\t\t\t\t_.without(\n\t\t\t\t\t\tshareMenu.get('actions'),\n\t\t\t\t\t\t'share:assetSet:users',\n\t\t\t\t\t\t'share:token:embed',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase assetSetTypes.savedSearch:\n\t\t\t\t// No way to get embed code\n\t\t\t\tshareMenu.set(\n\t\t\t\t\t'actions',\n\t\t\t\t\t_.without(shareMenu.get('actions'), 'share:token:embed'),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// for 8.5 hotfix DAM-6376: remove 'publish' action from everything but carts & video assets\n\t\t// (in 8.6 we must get publishing to be more generic ...)\n\t\tvar assets = assetSet.get('models'),\n\t\t\ttype = assetSet.get('type'),\n\t\t\ttypes = assetSetTypes;\n\n\t\tif (\n\t\t\ttype !== types.cart &&\n\t\t\ttype !== types.savedCart &&\n\t\t\ttype === types.asset\n\t\t) {\n\t\t\t// Can only be for video type assets and only a single video currently\n\t\t\tif (\n\t\t\t\tassets.length != 1 ||\n\t\t\t\t!assets[0].get('fileFormatFamily').length ||\n\t\t\t\tassets[0].get('fileFormatFamily')[0] != 'video'\n\t\t\t) {\n\t\t\t\tshareMenu.set(\n\t\t\t\t\t'actions',\n\t\t\t\t\t_.without(shareMenu.get('actions'), 'share:assetSet:media:service'),\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// Don't show the publish option if we're not addressing (only) video assets.\n\t\t\tshareMenu.set(\n\t\t\t\t'actions',\n\t\t\t\t_.without(shareMenu.get('actions'), 'share:assetSet:media:service'),\n\t\t\t);\n\t\t}\n\n\t\t// If there's only one action left in the menu, just trigger it.\n\t\t// TODO: should we check enabler/userLevel tests here? Otherwise the view will have to do that in order to tell\n\t\t// if there is only one enabled action.\n\t\tif (shareMenu.get('actions').length == 1) {\n\t\t\tdispatcher.trigger(shareMenu.get('actions')[0], assetSet);\n\t\t} else {\n\t\t\t// Passing undef for the downloadOptions should trigger other workflows to ask for those.\n\t\t\t// Show\n\t\t\tdispatcher.trigger('share:menu:show', {\n\t\t\t\tmenu: shareMenu,\n\t\t\t\tdata: {assetSet: assetSet},\n\t\t\t\thideOnSelect: true,\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * UI success notice handler\n\t * @event share:assets:media:service:complete\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on('share:assets:media:service:complete', function (\n\t\tuuid,\n\t\tmediaService,\n\t) {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'share',\n\t\t\ttitle: i18n.t('i18n.publishing'),\n\t\t\tdescription: i18n.t('i18n.publishing'),\n\t\t\ttype: 'info',\n\t\t\tprogressTask: {\n\t\t\t\teventStr: 'share:assets:media:service',\n\t\t\t\tuuid: uuid,\n\t\t\t\targs: [mediaService.get('id')],\n\t\t\t},\n\t\t});\n\t});\n\t/**\n\t * UI success notice handler\n\t * @event share:assets:media:service:succeeded\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on('share:assets:media:service:succeeded', function () {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'share',\n\t\t\ttitle: i18n.t('i18n.published'),\n\t\t\tdescription: i18n.t('i18n.published'),\n\t\t\ttype: 'info',\n\t\t});\n\t});\n\n\t/**\n\t * Synonyms for `share:menu`, but can be enabled/disabled by specific object properties.\n\t * @event module:share#share:asset:menu\n\t * @fires module:share#share:menu\n\t */\n\tdispatcher.on('share:asset:menu', function (thing, view, event) {\n\t\tdispatcher.trigger('share:menu', thing, view, event);\n\t});\n\t/**\n\t * Synonym for `share:menu`, but can be enabled/disabled by specific object properties\n\t * @event module:share#share:category:menu\n\t * @fires module:share#share:menu\n\t */\n\tdispatcher.on('share:category:menu', function (thing, view, event) {\n\t\tdispatcher.trigger('share:menu', thing, view, event);\n\t});\n\n\t/**\n\t * For sharing to users, punt to other actions for cart, search\n\t * @event module:share#share:assetSet:users\n\t * @param assetSet assetSet\n\t * @fires module:permissions#permissions:edit\n\t */\n\tdispatcher.on('share:assetSet:users', function (assetSet) {\n\t\tswitch (assetSet.get('type')) {\n\t\t\tcase assetSetTypes.attributeSet:\n\t\t\tcase assetSetTypes.savedCart:\n\t\t\tcase assetSetTypes.savedSearch:\n\t\t\t\t// Show\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'permissions:participants',\n\t\t\t\t\tassetSet.get('models')[0],\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"no way to share '\" + assetSet.get('type') + \"' with users\",\n\t\t\t\t);\n\t\t}\n\t});\n\n\t//=================================\n\t// END ASSETSET SHARE MENU SECTION\n\t//=================================\n\t//\n\t//=================================\n\t// TOKEN MGT SECTION\n\t//=================================\n\t//\n\t// Showing the user's token list, and letting them CRUD tokens.\n\t//\n\n\t// TODO: get all of the share actions that expect an assetSet as their sole\n\t// argument to also take downloadOptions as an optional second arg; that would\n\t// reduce code complexity all around. But it has to get done all at once,\n\t// across wrappers, menus & handlers.\n\n\t/**\n\t *\n\t * @event module:share#share:tokens:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:tokens:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-accessTokensView\" */ './views/accessTokensView'\n\t\t\t).then((View) => {\n\t\t\t\tappViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowOptions: ['share:tokens:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:routed\n\t * @fires module:share#share:tokens\n\t */\n\tdispatcher.on('share:tokens:routed', function () {\n\t\tdispatcher.trigger('share:tokens');\n\t});\n\t/**\n\t * @event module:share#share:tokens\n\t * @fires module:share#share:tokens:show\n\t */\n\tdispatcher.on('share:tokens', function () {\n\t\tNS.tokens = NS.tokens || new AccessTokensCollection();\n\t\t// clear filter string\n\t\tNS.tokens.setFilterStr('');\n\t\tNS.tokens.fetch();\n\t\t// TODO: Deprecation of the public links system:\n\t\tNetx.publicLink.mine.fetch();\n\t\t// Show\n\t\tdispatcher.trigger('share:tokens:show', {\n\t\t\tcollection: Netx.share.tokens,\n\t\t\t// Deprecation of the public links system:\n\t\t\tpublicLinks: Netx.publicLink.mine,\n\t\t\t// renderOnChange : true\n\t\t});\n\t});\n\t/**\n\t * Action handler: when the user says \"create a link\", add a token.\n\t * @event module:share#share:assetSet:token\n\t * @fires module:share#share:assetSet:token:withOptions\n\t */\n\tdispatcher.on('share:assetSet:token', function (assetSet) {\n\t\tdispatcher.trigger('share:assetSet:token:withOptions', assetSet);\n\t});\n\t/**\n\t * @event module:share#share:assetSet:token:withOptions\n\t * @param {module:asset/models/assetSet} assetSet Asset set\n\t * @param {Netx.Collections.DownloadOptions} selectedOptions\n\t * @param {object} contextOptions Contains event prefix and context(repurpose, create pdf, etc)\n\t * @fires module:share#share:token:new\n\t */\n\tdispatcher.on('share:assetSet:token:withOptions', function (\n\t\tassetSet,\n\t\tdownloadOptions,\n\t\tcontextOptions,\n\t) {\n\t\tdispatcher.trigger(\n\t\t\t'share:token:new',\n\t\t\tnew AccessTokenModel(\n\t\t\t\t{\n\t\t\t\t\toptions: downloadOptions,\n\t\t\t\t},\n\t\t\t\t{assetSet: assetSet},\n\t\t\t),\n\t\t\tcontextOptions,\n\t\t);\n\t});\n\t/**\n\t * CRUD handlers: open token editor on a new token\n\t * @event module:share#share:token:new\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @param {object} contextOptions Contains event prefix and context(repurpose, create pdf, etc)\n\t * @fires module:share#share:token:edit:show\n\t * @see module:share#share:token:edit:confirmed\n\t */\n\tdispatcher.on('share:token:new', function (tokenModel, contextOptions) {\n\t\tcontextOptions = contextOptions || {};\n\t\tcontextOptions.eventStr = 'token:edit';\n\t\tvar hasOptions =\n\t\t\t!_.isUndefined(tokenModel) &&\n\t\t\ttokenModel.get('options') &&\n\t\t\ttokenModel.get('options').length > 0;\n\n\t\t// Show\n\t\tdispatcher.trigger('share:token:edit:show', {\n\t\t\tmodel: tokenModel || new AccessTokenModel(),\n\t\t\tcollection: NS.tokens,\n\t\t\tsubmitLabel: hasOptions\n\t\t\t\t? i18n.t('i18n.createLink')\n\t\t\t\t: i18n.t('i18n.chooseOptions'),\n\t\t\targs: [contextOptions],\n\t\t});\n\t});\n\n\t/**\n\t * @event module:share#share:token:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:token:edit:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-accessTokenEdit\" */ './views/accessTokenEditView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:token:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * CRUD handlers: open token editor on a pre-existing token\n\t * @event module:share#share:token:edit\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @param {object} contextOptions Contains event prefix and context(repurpose, create pdf, etc)\n\t * @fires module:share#share:token:edit:error\n\t * @fires module:share#share:token:edit:show\n\t * @see module:share#share:token:edit:confirmed\n\t */\n\tdispatcher.on('share:token:edit', function (tokenModel, contextOptions) {\n\t\tcontextOptions = contextOptions || {};\n\t\tcontextOptions.eventStr = 'token:edit';\n\t\ttokenModel.fetch().then(\n\t\t\tfunction () {\n\t\t\t\t// Show\n\t\t\t\tdispatcher.trigger('share:token:edit:show', {\n\t\t\t\t\tmodel: tokenModel,\n\t\t\t\t\tcollection: NS.tokens,\n\t\t\t\t\tsubmitLabel: i18n.t('i18n.chooseOptions', {\n\t\t\t\t\t\tdefaultValue: 'Choose options ...',\n\t\t\t\t\t}),\n\t\t\t\t\targs: [contextOptions],\n\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// TODO: handle approval failures?\n\t\t\t\tdispatcher.trigger('share:token:edit:error', err, tokenModel);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * CRUD handlers: create/edit a token\n\t * @event module:share#share:token:edit:confirmed\n\t * @param {object} form Token edit form data\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @param {object} contextOptions Contains event prefix and context(repurpose, create pdf, etc)\n\t * @fires module:share#share:token:edit:success\n\t * @fires module:share#share:assetSet:options:check\n\t * @see module:share#share:token:new\n\t * @see module:share#share:token:edit\n\t */\n\tdispatcher.on('share:token:edit:confirmed', function (\n\t\tform,\n\t\ttokenModel,\n\t\tcontextOptions,\n\t) {\n\t\t// Vars\n\t\tvar isNew = tokenModel.isNew(),\n\t\t\tassetSet,\n\t\t\texpirationDate;\n\n\t\t// Store context options\n\t\ttokenModel.assetSet.contextOptions = contextOptions;\n\n\t\t// TODO: https://jira.netx.net/browse/DAM-8714\n\t\t// Right now we are setting the `expirationDate` (currently nothing the server has) - which is really setting `secondsToLive`\n\t\t// And since we are setting it here and the model does not save until `share:token:edit:options:save`, we are creating a lag\n\t\t// and not setting `secondsToLive` on the DAM until it is also setting `createDate`. If this stuff is all so timed to the second\n\t\t// this should probably matter and the user should be presented with both a day and time picker.\n\n\t\t// DAM-7710\n\t\t// Dates must be in the future\n\t\t// TODO: https://jira.netx.net/browse/DAM-8713\n\t\t// `isNew` is not functioning\n\t\tif (isNew && form.expirationType === expirationTypes.date) {\n\t\t\t// This is to enforce localized date\n\t\t\t// By putting the date `mm/dd/yyyy` we get the local date the user has picked - the server will treat this as UTC once it gets it.\n\t\t\t// But if we treat it as UTC prior to sending it the server will be a day behind\n\t\t\texpirationDate = form.expirationDate.split('-');\n\t\t\t// Setting it to `11:29:00` so that they can spend up to 31 minutes on the download options screen before saving and not affect the date\n\t\t\t// Really - we need date and timpicker\n\t\t\texpirationDate = new Date(\n\t\t\t\texpirationDate[1] +\n\t\t\t\t\t'/' +\n\t\t\t\t\texpirationDate[2] +\n\t\t\t\t\t'/' +\n\t\t\t\t\texpirationDate[0] +\n\t\t\t\t\t' 23:29:0',\n\t\t\t);\n\n\t\t\tvar expirationTime = expirationDate.getTime();\n\t\t\t// Invalid expiration date\n\t\t\tif (isNaN(expirationTime) || expirationTime <= _.now()) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'share:token:edit:error',\n\t\t\t\t\tnew Error(i18n.t('i18n.newTokenExpirationDatesMustBeInTheFuture')),\n\t\t\t\t\ttokenModel,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// While it would be ideal to allow the user to come back to this form after they have already hit the next step we don't currently have a workflow for this\n\t\tdispatcher.trigger('share:token:edit:success');\n\n\t\t// Set some pertinent data\n\t\ttokenModel.set(\n\t\t\t_.extend(\n\t\t\t\t_.pick(\n\t\t\t\t\tform,\n\t\t\t\t\t'attributeIds',\n\t\t\t\t\t'securityType',\n\t\t\t\t\t'accessType',\n\t\t\t\t\t'expirationType',\n\t\t\t\t\t'totalUses',\n\t\t\t\t\t'title',\n\t\t\t\t\t'type',\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\taccessId: form['accessId-' + form.accessType],\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\n\t\t// Password set\n\t\t// If the model is not new then we need a password form the form before setting\n\t\tif (\n\t\t\tform.securityType === 'password' &&\n\t\t\t(isNew || (form.password && form.password !== '********'))\n\t\t) {\n\t\t\ttokenModel.set('password', form.password);\n\t\t} else {\n\t\t\ttokenModel.set('password', '');\n\t\t}\n\n\t\t// If we only got a date, then set the actual sections to the difference between today @ midnight & then @ midnight\n\t\t// truth is, both of these can be set at once on the DAM. But we hide that feature in 8.5 .\n\t\t// TODO: wrap all this logic in a model method?\n\t\tif (form.expirationType === expirationTypes.date) {\n\t\t\t// If not already handled above\n\t\t\tif (!expirationDate) {\n\t\t\t\t// Setting it to `11:29:00` so that they can spend up to 31 minutes on the download options screen before saving and not affect the date\n\t\t\t\t// Really - we need date and timpicker\n\t\t\t\texpirationDate = new Date(\n\t\t\t\t\t_.dateToLocalTimezone(new Date(form.expirationDate)).setHours(\n\t\t\t\t\t\t23,\n\t\t\t\t\t\t29,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Set it\n\t\t\ttokenModel.expirationDate(expirationDate);\n\t\t\ttokenModel.set({\n\t\t\t\ttotalUses: 0,\n\t\t\t});\n\t\t} else if (form.expirationType == expirationTypes.accesses) {\n\t\t\t// clear it\n\t\t\ttokenModel.set({\n\t\t\t\tsecondsToLive: 0,\n\t\t\t\ttotalUses: form.totalUses,\n\t\t\t});\n\t\t} else {\n\t\t\t// clear it\n\t\t\ttokenModel.set({\n\t\t\t\tsecondsToLive: 0,\n\t\t\t\ttotalUses: 0,\n\t\t\t});\n\t\t}\n\n\t\t// DAM-5558: hackaround #2\n\t\tif (_.isUndefined(tokenModel.get('type'))) {\n\t\t\ttokenModel.set({type: 'download'});\n\t\t}\n\n\t\t// DAM-5558: hackaround #1: handle empty options list (on a new token):\n\t\t// DAM-6129: and allow editing of options of options\n\n\t\t// If accessType is an assetSet then we need to look at the sources to get the type and ids\n\t\t// As far as I know the type will either be cart(creating a new token) or asset(retrieving a token previously created from the current cart)\n\t\t// Ids will either be 0 for the current cart or an array of all assets in the asset set\n\t\tif (form.accessType === 'assetSet') {\n\t\t\ttokenModel.assetSet.set({\n\t\t\t\ttype: tokenModel.get('sources')[0].type,\n\t\t\t\tids: tokenModel.get('sources')[0].ids,\n\t\t\t\tlabel: tokenModel.get('title'),\n\t\t\t});\n\t\t} else {\n\t\t\ttokenModel.assetSet.set({\n\t\t\t\ttype: form.accessType,\n\t\t\t\tids: [tokenModel.get('accessId')],\n\t\t\t\tlabel: tokenModel.get('title'),\n\t\t\t});\n\t\t}\n\n\t\tif (tokenModel.get('type') === 'viewOnly') {\n\t\t\tdispatcher.trigger('share:token:justify:check', tokenModel);\n\t\t\treturn;\n\t\t}\n\n\t\tconst contactSheet = tokenModel\n\t\t\t.get('options')\n\t\t\t?.find((option) => option.type === 'contactSheet');\n\t\t// This will trigger either share:assetSet:token:edit:options:selected or share:assetSet:token:edit:options:skipped\n\t\tdispatcher.trigger('share:token:downloadOptions:check', tokenModel, {\n\t\t\tid: 'token-edit-options',\n\t\t\tform: {\n\t\t\t\t// use the already defined title or the link's title\n\t\t\t\t'contact-sheet-name':\n\t\t\t\t\tcontactSheet?.options?.find((opt) => opt.label === 'title')?.value ||\n\t\t\t\t\ttokenModel.assetSet.get('label'),\n\t\t\t},\n\t\t\ttitle: i18n.t('i18n.chooseTokenDownloadOptions'),\n\t\t\tsubmitLabel: tokenModel.isNew()\n\t\t\t\t? i18n.t('i18n.createToken')\n\t\t\t\t: i18n.t('i18n.save'),\n\t\t\tselectedOptions: tokenModel.get('options'),\n\t\t});\n\t});\n\t/**\n\t * This handles checking if there are download options to display and setting the available download options on tokenModel.assetSet\n\t * @event module:share#share:token:downloadOptions:check\n\t * @param {object} viewOptions View options for `Netx.Views.DownloadOptionsView`\n\t * @param {Netx.Models.AccessToken} tokenModel a token model\n\t * @fires module:share#share:token:downloadOptions:check:prepare\n\t * @fires module:share#share:token:downloadOptions:check:prepare:error\n\t * @fires module:share#share:token:downloadOptions:check:prepare:success\n\t * @fires module:share#share:token:edit:downloadOptions\n\t * @fires module:share#share:token:justify:check\n\t */\n\tdispatcher.on('share:token:downloadOptions:check', function (\n\t\ttokenModel,\n\t\tviewOptions,\n\t) {\n\t\t// TODO: how would these get here from an action? Is this just a good to have?\n\t\tviewOptions = viewOptions || {};\n\n\t\tvar downloadOptions = tokenModel.assetSet.downloadOptions;\n\t\t// Check to see if manaual repurposing. Presently manual repurpose only exist by itself\n\t\tvar isManualRepurpose =\n\t\t\tdownloadOptions.length === 1 &&\n\t\t\tdownloadOptions.findWhere({type: 'manualRepurpose'});\n\t\t// Check to see if type is embed\n\t\tvar isEmbed = tokenModel && tokenModel.get('type') === 'embed';\n\n\t\t// We don't show download options if manual repurposing or embed\n\t\tif (isManualRepurpose || isEmbed) {\n\t\t\t// Proceed without an interface\n\t\t\treturn dispatcher.trigger('share:token:justify:check', tokenModel);\n\t\t}\n\n\t\t// This could take a minute\n\t\tdispatcher.trigger('share:token:downloadOptions:check:prepare');\n\n\t\t// Get download options and sets them on tokenModel.assetSet\n\t\ttokenModel.assetSet.getDownloadOptions().then(\n\t\t\tfunction (downloadOptions) {\n\t\t\t\tvar contextOptions = tokenModel.assetSet.contextOptions || {};\n\t\t\t\tconst editableOptions = downloadOptions.filter(function (opt) {\n\t\t\t\t\tvar type = opt.get('type');\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttype === 'contactSheet' ||\n\t\t\t\t\t\ttype === 'metadata' ||\n\t\t\t\t\t\ttype === 'presetProcess'\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t// If the context id for preset process then remove all options but the presets/metadata\n\t\t\t\tif (contextOptions.context === 'presetProcess') {\n\t\t\t\t\tdownloadOptions.set(\n\t\t\t\t\t\tdownloadOptions.filter(function (opt) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\topt.get('type') === 'metadata' ||\n\t\t\t\t\t\t\t\topt.get('type') === 'presetProcess'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// At least two options to choose from or there are editable options\n\t\t\t\tif (downloadOptions.length > 1 || editableOptions.length) {\n\t\t\t\t\t// TODO: how would these get here from an action? Is this just a good to have?\n\t\t\t\t\t// If passed, these get set on downloadOptions and so I do not see the need to keep passing them along as params to other events\n\t\t\t\t\tvar selectedOptions = viewOptions.selectedOptions.constructor\n\t\t\t\t\t\t.__isCollection__\n\t\t\t\t\t\t? _.pluck(viewOptions.selectedOptions.models, 'attributes')\n\t\t\t\t\t\t: viewOptions.selectedOptions;\n\n\t\t\t\t\t// if editting, we probably have selected options\n\t\t\t\t\tdownloadOptions.setUserSelectedDownloadOptions(selectedOptions);\n\n\t\t\t\t\t// Show download options interface\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:token:edit:downloadOptions',\n\t\t\t\t\t\ttokenModel,\n\t\t\t\t\t\tviewOptions,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// Proceed without displaying download options\n\t\t\t\t\tdispatcher.trigger('share:token:justify:check', tokenModel);\n\t\t\t\t}\n\n\t\t\t\t// Preparation was a success\n\t\t\t\tdispatcher.trigger('share:token:downloadOptions:check:prepare:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Preparation was not a success\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'share:token:downloadOptions:check:prepare:error',\n\t\t\t\t\terr,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:share#share:token:downloadOptions:check:prepare\n\t * @fires module:app#app:progress\n\t * @see module:share#share:token:downloadOptions:check:prepare:error\n\t * @see module:share#share:token:downloadOptions:check:prepare:success\n\t */\n\tdispatcher.on('share:token:downloadOptions:check:prepare', function () {\n\t\tdispatcher.trigger('app:progress', {\n\t\t\teventStr: 'share:token:downloadOptions:check:prepare',\n\t\t\theaderTitle: i18n.t('i18n.preparingDownload'),\n\t\t\tmessage: i18n.t('i18n.preparingDownloadMessage'),\n\t\t});\n\t});\n\t/**\n\t * @event module:share#share:token:downloadOptions:check:prepare:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:token:downloadOptions:check:prepare:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:token:downloadOptions:check:prepare:success\n\t */\n\tdispatcher.on(\n\t\t'share:token:downloadOptions:check:prepare:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:share#share:token:edit:downloadOptions:show\n\t * @param {object} viewOption View options\n\t */\n\tdispatcher.on(\n\t\t'share:token:edit:downloadOptions:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-downloadOptions\" */ './views/downloadOptionsView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:token:edit:downloadOptions:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:token:edit:downloadOptions\n\t * @param {Netx.Models.AccessToken} tokenModel a token model\n\t * @param {object} viewOptions options to DownloadOptionsView\n\t * @fires module:share#share:token:edit:downloadOptions:show\n\t * @see module:share#share:token:edit:downloadOptions:confirmed\n\t */\n\tdispatcher.on('share:token:edit:downloadOptions', function (\n\t\ttokenModel,\n\t\tviewOptions,\n\t) {\n\t\t// Attach any extra args to the view's options' .args property;\n\t\t// Standard formViews will return this unmodified with the form submission event.\n\t\tviewOptions = viewOptions || {};\n\t\t_.extend(viewOptions, {\n\t\t\targs: [tokenModel],\n\t\t});\n\n\t\t// Show\n\t\tdispatcher.trigger(\n\t\t\t'share:token:edit:downloadOptions:show',\n\t\t\t_.extend(\n\t\t\t\t{\n\t\t\t\t\tcollection: tokenModel.assetSet.downloadOptions,\n\t\t\t\t\tassetSet: tokenModel.assetSet,\n\t\t\t\t\teventStr: 'share:token:edit:downloadOptions',\n\t\t\t\t},\n\t\t\t\tviewOptions,\n\t\t\t),\n\t\t);\n\t});\n\n\t/**\n\t * Form handler for downloadOptionsView\n\t * @event module:share#share:token:edit:downloadOptions:confirmed\n\t * @param {object} form Form submission\n\t * @param {Netx.Models.AccessToken} tokenModel The token being created or edited\n\t * @fires module:share#share:token:edit:downloadOptions:success\n\t * @fires module:share#share:token:justify:check\n\t * @fires module:share#share:download:warnings:warn\n\t * @fires module:share#share:download:warnings:prepare\n\t * @fires module:share#share:download:warnings:prepare:success\n\t * @fires module:share#share:download:noWarnings\n\t */\n\t//dispatcher.on('share:token:options:confirmed', function( assetSet, downloadOptions, form, eventStr, tokenModel ) {\n\tdispatcher.on('share:token:edit:downloadOptions:confirmed', function (\n\t\tform,\n\t\ttokenModel,\n\t) {\n\t\t// reduce the option set to just the selected item\n\t\ttokenModel.assetSet.downloadOptions.parseSelectedDownloadOptions(form);\n\t\t// If the \"Include subfolders\" box is ticked,\n\t\t// set `includeSubFolders` on token model\n\t\ttokenModel.set('includeSubFolders', form.recursive);\n\t\t// Close window\n\t\tdispatcher.trigger('share:token:edit:downloadOptions:success');\n\n\t\tvar assetSet = tokenModel.assetSet;\n\n\t\tvar checkForDownloadWarnings =\n\t\t\tform.original ||\n\t\t\t(form.processes || []).length ||\n\t\t\t(form.contactSheet && form.contactSheet.selected);\n\n\t\t// get download warnings\n\t\tif (checkForDownloadWarnings) {\n\t\t\t// This could take a minute\n\t\t\tdispatcher.trigger('share:download:warnings:prepare', assetSet);\n\t\t\tconst promises = [];\n\t\t\t// DAM-19752\n\t\t\t// We do not have access to the category count from an asset set\n\t\t\t// we could try and get it from the current category's assets but that present (at least) two problems:\n\t\t\t// 1. We may not have fetched all the assets in the category (and so a false abort could occur depending on the warning count)\n\t\t\t// 2. We may not even be in a category (there are share actions from the context menu of a category list item)\n\t\t\tif (assetSet.get('type') === assetSetTypes.category) {\n\t\t\t\tconst categoryAssets = new CategoryAssets([], {\n\t\t\t\t\tcategoryId: assetSet.get('ids')[0],\n\t\t\t\t});\n\t\t\t\tpromises.push(\n\t\t\t\t\tcategoryAssets.fetchAssetCount().then((count) => {\n\t\t\t\t\t\tassetSet.set('assetCount', count);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tPromise.all(promises).then(() => {\n\t\t\t\t// Get download warnings\n\t\t\t\tassetSet.getDownloadWarnings().then(\n\t\t\t\t\tfunction (warnings) {\n\t\t\t\t\t\t// Warnings\n\t\t\t\t\t\tif (warnings.abort) {\n\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t'share:download:warnings:prepare:error',\n\t\t\t\t\t\t\t\twarnings.abort,\n\t\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (warnings.messageCount) {\n\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t'share:token:warnings:warn',\n\t\t\t\t\t\t\t\twarnings.progressMessages,\n\t\t\t\t\t\t\t\ttokenModel,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdispatcher.trigger('share:token:justify:check', tokenModel);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Get warning was a success\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'share:download:warnings:prepare:success',\n\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tfunction (err) {\n\t\t\t\t\t\tif (err.code == 2102) {\n\t\t\t\t\t\t\t// getDownloadWarnings will return error 2102 if the request is too large;\n\t\t\t\t\t\t\t// in that case, ask for confirmation & continue.\n\t\t\t\t\t\t\tdispatcher.trigger('share:token:noWarnings', tokenModel);\n\t\t\t\t\t\t\t// Get warning was technically a success\n\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t'share:download:warnings:prepare:success',\n\t\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Get warning was not a success\n\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t'share:download:warnings:prepare:error',\n\t\t\t\t\t\t\t\terr,\n\t\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t\t} else {\n\t\t\t// Check to see if justifcation is required\n\t\t\tdispatcher.trigger('share:token:justify:check', tokenModel);\n\t\t}\n\t});\n\t/**\n\t * UI handler for showing download warnings at the start of the download process.\n\t * @event module:share#share:download:warnings:warn\n\t * @param {array} warnings Array of warning objects\n\t * @param {module:asset/models/assetSet} assetSet Asset set model\n\t * @fires module:app#app:confirm\n\t * @see module:share#share:download:downloadOptions:check\n\t */\n\tdispatcher.on(\n\t\t'share:token:warnings:warn',\n\t\tfunction (warnings, tokenModel) {\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t('i18n.someAssetsMayNotDownload'),\n\t\t\t\tgoo: warnings || {},\n\t\t\t\tyesLabel: i18n.t('i18n.continue'),\n\t\t\t\tnoLabel: i18n.t('i18n.cancel'),\n\t\t\t\tyesEvent: 'share:token:justify:check',\n\t\t\t\ttemplate: ConfirmDownloadWarningsTemplate,\n\t\t\t\targs: [tokenModel],\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:token:noWarnings\n\t * @param {module:asset/models/assetSet} tokenModel\n\t * @fires module:app#app:confirm\n\t * @fires module:share#share:token:justify:check\n\t */\n\tdispatcher.on(\n\t\t'share:token:noWarnings',\n\t\tfunction (tokenModel) {\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t('i18n.requestTooLargeForDownloadWarnings'),\n\t\t\t\tyesLabel: i18n.t('i18n.continue'),\n\t\t\t\tnoLabel: i18n.t('i18n.cancel'),\n\t\t\t\tyesEvent: 'share:token:justify:check',\n\t\t\t\t// template : ConfirmDownloadWarningsTemplate,\n\t\t\t\targs: [tokenModel],\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Checks to see if justification is required\n\t * @event module:share#share:token:justify:check\n\t * @param {Netx.Models.AccessToken} tokenModel The token being created or edited\n\t * @fires module:share#share:token:justify\n\t * @fires module:share#share:token:save\n\t */\n\tdispatcher.on('share:token:justify:check', function (tokenModel) {\n\t\tvar requiresJustification = false,\n\t\t\tdownloadOptions;\n\t\t// TODO: We should always define download options before we get here. Look into why this is like this. VAR 2/27/17\n\t\t// If no downloadOptions specified, choose the original asset file.\n\t\tdownloadOptions = tokenModel.assetSet.downloadOptions;\n\n\t\trequiresJustification = downloadOptions.some(function (opt, i) {\n\t\t\tif (opt.get('requiresJustification')) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t\t// You best start explaining\n\t\tif (requiresJustification) {\n\t\t\tdispatcher.trigger('share:token:justify', tokenModel);\n\t\t}\n\t\t// No justification, save token\n\t\telse {\n\t\t\tdispatcher.trigger('share:token:save', tokenModel);\n\t\t}\n\t});\n\n\t/**\n\t * @event module:share#share:token:justify:showw\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:token:justify:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-downloadJustify\" */ './views/downloadJustifyView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:token:justify:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:token:justify\n\t * @param {Netx.Models.AccessToken} tokenModel The token being created or edited\n\t * @fires module:share#share:token:justify:show\n\t * @see module:share#share:token:justify:confirmed\n\t */\n\tdispatcher.on('share:token:justify', function (tokenModel) {\n\t\tvar customForm = new CustomFormCollection([], {\n\t\t\tformName: 'downloadJustification',\n\t\t\tuserValues: {},\n\t\t});\n\t\tcustomForm.fetch().then(function () {\n\t\t\t// Show\n\t\t\tdispatcher.trigger('share:token:justify:show', {\n\t\t\t\tcollection: customForm,\n\t\t\t\tremoveOnHide: true,\n\t\t\t\teventStr: 'share:token:justify',\n\t\t\t\targs: [tokenModel],\n\t\t\t});\n\t\t});\n\t});\n\t/**\n\t * @event module:share#share:token:justify:confirmed\n\t * @param {object} form form data\n\t * @param {Netx.Models.AccessToken} tokenModel The token being created or edited\n\t * @fires module:share#share:assetSet:justify:success\n\t * @fires module:share#share:assetSet:justify:error\n\t */\n\tdispatcher.on('share:token:justify:confirmed', function (form, tokenModel) {\n\t\t// DAM-13094 - share token justification now needs to be label value beans\n\t\tvar labVal = [];\n\t\t_.each(\n\t\t\tform,\n\t\t\t_.bind(function (ele, idx, all) {\n\t\t\t\tthis.push({label: idx, value: ele});\n\t\t\t}, labVal),\n\t\t);\n\t\t// Set justication details\n\t\ttokenModel.set({\n\t\t\tjustifyDetails: labVal,\n\t\t});\n\t\tdispatcher.trigger('share:token:save', tokenModel);\n\t\tdispatcher.trigger('share:token:justify:success');\n\t});\n\t/**\n\t * @event module:share#share:token:justify:success\n\t */\n\tdispatcher.on(\n\t\t'share:token:justify:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:token:justify:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:token:justify:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Save a token after applying edits to the model.\n\t * @event module:share#share:token:save\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @fires module:share#share:token:prepare\n\t * @fires module:share#share:token:save:error\n\t * @fires module:share#share:token:save:success\n\t */\n\tdispatcher.on('share:token:save', function (tokenModel) {\n\t\tvar isNew = tokenModel.isNew();\n\t\t// This could take a minute\n\t\tdispatcher.trigger('share:token:prepare', tokenModel);\n\t\t// Save token\n\t\ttokenModel.save().then(\n\t\t\tfunction () {\n\t\t\t\t// Refetch the whole token collection if we have it.\n\t\t\t\t// (If this becomes too heavy, we could re-fetch just this token & add it to the collection with 'merge: true')\n\t\t\t\t$.when(Netx.share.tokens ? Netx.share.tokens.fetch() : true).then(\n\t\t\t\t\tfunction () {\n\t\t\t\t\t\tdispatcher.trigger('share:token:save:success', tokenModel, isNew);\n\t\t\t\t\t},\n\t\t\t\t\tfunction (err) {\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'share:token:save:error',\n\t\t\t\t\t\t\terr,\n\t\t\t\t\t\t\ttokenModel,\n\t\t\t\t\t\t\tisNew,\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('share:token:save:error', err, tokenModel, isNew);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * UI success notice handler\n\t * @event module:share#share:token:save:success\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @param boolean isNew True if adding false if editing\n\t * @fires module:notification#notification\n\t * @fires module:share#share:token:added:show\n\t */\n\tdispatcher.on(\n\t\t'share:token:save:success',\n\t\tfunction (tokenModel, isNew) {\n\t\t\t// Notify\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'share',\n\t\t\t\ttitle: isNew\n\t\t\t\t\t? i18n.t('i18n.tokenCreated', {defaultValue: 'Link created'})\n\t\t\t\t\t: i18n.t('i18n.tokenEdited', {defaultValue: 'Link edited'}),\n\t\t\t\tdescription: isNew\n\t\t\t\t\t? i18n.t('i18n.theTokenWasCreated', {\n\t\t\t\t\t\t\tdefaultValue: 'The link was created.',\n\t\t\t\t\t })\n\t\t\t\t\t: i18n.t('i18n.theTokenWasEdited', {\n\t\t\t\t\t\t\tdefaultValue: 'The link was edited.',\n\t\t\t\t\t }),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t\tif (isNew) {\n\t\t\t\t// Show\n\t\t\t\tdispatcher.trigger('share:token:added:show', {\n\t\t\t\t\tmodel: tokenModel,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI error notice handler\n\t * @event module:share#share:token:save:error\n\t * @param {string} error Error string\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @param boolean isNew True if adding false if editing\n\t * @fires module:share#share:token:edit:rejected:approve\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'share:token:save:error',\n\t\tfunction (error, tokenModel, isNew) {\n\t\t\tif (error.code == 221) {\n\t\t\t\t// is approval required?\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'share:token:edit:rejected:approve',\n\t\t\t\t\terror,\n\t\t\t\t\ttokenModel.assetSet,\n\t\t\t\t);\n\t\t\t} else if (error.code == 220) {\n\t\t\t\tdispatcher.trigger('share:token:justify', tokenModel);\n\t\t\t} else {\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'share',\n\t\t\t\t\ttitle: isNew\n\t\t\t\t\t\t? i18n.t('i18n.errorEditingLink', {\n\t\t\t\t\t\t\t\tdefaultValue: 'Error creating link',\n\t\t\t\t\t\t })\n\t\t\t\t\t\t: i18n.t('i18n.errorEditingLink', {\n\t\t\t\t\t\t\t\tdefaultValue: 'Error editing link',\n\t\t\t\t\t\t }),\n\t\t\t\t\tdescription: error,\n\t\t\t\t\ttype: 'danger',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:token:added:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:token:added:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-tokenLinkAdded\" */ './views/tokenLinkAddedView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowOptions: ['share:token:added:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:token:sendEmail\n\t * @see module:system#share:token:sendEmail:confirmed\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @fires module:share#share:show\n\t */\n\tdispatcher.on('share:token:sendEmail', function (tokenModel) {\n\t\t// TODO: why not pass along to share:email:show?\n\t\tdispatcher.trigger('share:show', {\n\t\t\teventStr: 'share:token:sendEmail',\n\t\t\ttemplate: Templates.email,\n\t\t\ttoken: tokenModel,\n\t\t});\n\t});\n\t/**\n\t * @event module:share#share:token:sendEmail:confirmed\n\t * @param {object} form email form data\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @param Netx.View view the emailShareView\n\t * @fires module:share:token:sendEmail:success\n\t * @fires module:share#share:token:sendEmail:error\n\t */\n\tdispatcher.on('share:token:sendEmail:confirmed', function (form, tokenModel) {\n\t\t// Send the token in an email message:\n\t\treturn tokenModel.mail(form).then(\n\t\t\tfunction () {\n\t\t\t\t// Notify the user the message was sent.\n\t\t\t\tdispatcher.trigger('share:token:sendEmail:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('share:token:sendEmail:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:share#share:token:sendEmail:success\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on('share:token:sendEmail:success', function () {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'share',\n\t\t\ttitle: i18n.t('i18n.messageSent', {defaultValue: 'Message sent'}),\n\t\t\tdescription: i18n.t('i18n.yourAssetsWereSent', {\n\t\t\t\tdefaultValue: 'Your assets were sent.',\n\t\t\t}),\n\t\t\ttype: 'success',\n\t\t});\n\t});\n\t/**\n\t * @event module:share#share:token:sendEmail:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('share:token:sendEmail:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\n\t/**\n\t * @event module:share#share:token:prepare\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @fires module:app#app:progress\n\t * @see module:share#share:token:edit:options:save:error\n\t * @see module:share#share:token:edit:options:save:success\n\t */\n\tdispatcher.on('share:token:prepare', function (tokenModel) {\n\t\tdispatcher.trigger('app:progress', {\n\t\t\teventStr: 'share:token:save',\n\t\t\theaderTitle: i18n.t('i18n.preparingToken'),\n\t\t\tmessage: i18n.t('i18n.preparingTokenMessage'),\n\t\t});\n\t});\n\n\t////////////////////////////////\n\t// DELETE TOKEN\n\t////////////////////////////////\n\t/**\n\t * CRUD handlers: show a delete confirmation modal\n\t * @event module:share#share:token:delete\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @fires module:app#app:confirm:delete\n\t * @see module:share#share:token:delete:confirmed\n\t */\n\tdispatcher.on(\n\t\t'share:token:delete',\n\t\tfunction (tokenModel) {\n\t\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\t\tmessage: i18n.t('i18n.deleteLinkConfirm', {\n\t\t\t\t\tdefaultValue: 'Are you sure you want to delete this link?',\n\t\t\t\t}),\n\t\t\t\teventStr: 'share:token:delete',\n\t\t\t\targs: [tokenModel],\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * CRUD handlers: delete a token\n\t * @event module:share#share:token:delete:confirmed\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @fires module:share#share:token:delete:error\n\t * @fires module:share#share:token:delete:success\n\t * @see module:share#share:token:delete\n\t */\n\tdispatcher.on('share:token:delete:confirmed', function (tokenModel) {\n\t\ttokenModel.destroy().then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('share:token:delete:success', tokenModel);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('share:token:delete:error', err, tokenModel);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * UI error notice handler\n\t * @event module:share#share:token:delete:error\n\t * @param {string} error Error string\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @fires module:app#app:alert\n\t * @see module:share#share:token:delete\n\t */\n\tdispatcher.on(\n\t\t'share:token:delete:error',\n\t\tfunction (error, tokenModel) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI success notice handler\n\t * @event module:share#share:token:delete:success\n\t * @param {Netx.Models.AccessToken} tokenModel Token\n\t * @fires module:notification#notification\n\t * @see module:share#share:token:delete\n\t */\n\tdispatcher.on(\n\t\t'share:token:delete:success',\n\t\tfunction (tokenModel) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'share',\n\t\t\t\ttitle: i18n.t('i18n.tokensUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.tokenDeleted'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t////////////////////////////////\n\t// !DELETE TOKEN\n\t////////////////////////////////\n\n\t////////////////////////////////\n\t// DOWNLOAD TOKEN\n\t////////////////////////////////\n\t/**\n\t * @event module:share#share:token:download\n\t * @param {Netx.Models.AccessToken} tokenModel Token model\n\t * @param {array} types An array of downlaod option types (metadata/contactSheet/etc)\n\t * @fires module:share#share:simpleDownload\n\t */\n\tdispatcher.on('share:token:download', function (tokenModel, types) {\n\t\ttokenModel.downloadForToken(types).then(function (uuid) {\n\t\t\t// Really?!\n\t\t\tNetx.ShareWays.download.waitForDam(uuid).then(function () {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\tNS.status.get('completeUrl'),\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\t/**\n\t * @event module:share#share:token:download:all\n\t * @param {Netx.Models.AccessToken} token Token\n\t * @fires module:share#share:token:download\n\t */\n\tdispatcher.on('share:token:download:all', function (token) {\n\t\tdispatcher.trigger('share:token:download', token);\n\t});\n\t/**\n\t * @event module:share#share:token:download:asset\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:share#share:simple:download\n\t */\n\tdispatcher.on('share:token:download:asset', function (asset) {\n\t\tvar token = NS.token;\n\t\tdispatcher.trigger(\n\t\t\t'share:simpleDownload',\n\t\t\t'/file/asset/' +\n\t\t\t\tasset.id +\n\t\t\t\t'/original/attachment?token=' +\n\t\t\t\tNetx.session.getToken() +\n\t\t\t\t'&pw=' +\n\t\t\t\tencodeURIComponent(token.get('password')),\n\t\t);\n\t});\n\t/**\n\t * @event module:share#share:token:download:contactSheet\n\t * @param {Netx.Models.AccessToken} token Token\n\t * @fires module:share#share:token:download\n\t */\n\tdispatcher.on('share:token:download:contactSheet', function (token) {\n\t\tdispatcher.trigger('share:token:download', token, ['contactSheet']);\n\t});\n\t/**\n\t * @event module:share#share:token:download:metadata\n\t * @param {Netx.Models.AccessToken} token Token\n\t * @fires module:share#share:token:download\n\t */\n\tdispatcher.on('share:token:download:metadata', function (token) {\n\t\tdispatcher.trigger('share:token:download', token, ['metadata']);\n\t});\n\t/**\n\t * @event module:share#share:token:download:proxy\n\t * @param {module:asset/models/asset} asset Asset\n\t * @param {string} proxy Proxy name\n\t * @fires module:share#share:simple:download\n\t */\n\tdispatcher.on('share:token:download:proxy', function (asset, proxy) {\n\t\tvar token = NS.token;\n\t\tdispatcher.trigger(\n\t\t\t'share:simpleDownload',\n\t\t\t'/file/asset/' +\n\t\t\t\tasset.id +\n\t\t\t\t'/' +\n\t\t\t\tproxy +\n\t\t\t\t'/attachment?token=' +\n\t\t\t\tNetx.session.getToken() +\n\t\t\t\t'&pw=' +\n\t\t\t\tencodeURIComponent(token.get('password')),\n\t\t);\n\t});\n\t/**\n\t * @event module:share#share:token:download:templateCustomization\n\t * @param {Netx.Models.AccessToken} token Token\n\t * @fires module:share#share:token:download\n\t */\n\tdispatcher.on('share:token:download:templateCustomization', function (token) {\n\t\tdispatcher.trigger('share:token:download', token, [\n\t\t\t'templateCustomization',\n\t\t]);\n\t});\n\t/**\n\t * @event module:share#share:token:download:view\n\t * @param {module:asset/models/asset} asset Asset\n\t * @param {string} view View name\n\t * @fires module:share#share:simple:download\n\t */\n\tdispatcher.on('share:token:download:view', function (asset, view) {\n\t\tvar token = NS.token;\n\t\tdispatcher.trigger(\n\t\t\t'share:simpleDownload',\n\t\t\t'/file/asset/' +\n\t\t\t\tasset.id +\n\t\t\t\t'/view/' +\n\t\t\t\tview +\n\t\t\t\t'/attachment?token=' +\n\t\t\t\tNetx.session.getToken() +\n\t\t\t\t'&pw=' +\n\t\t\t\tencodeURIComponent(token.get('password')),\n\t\t);\n\t});\n\t////////////////////////////////\n\t// !DOWNLOAD TOKEN\n\t////////////////////////////////\n\n\t////////////////////////////////\n\t// GET EMBED CODE\n\t////////////////////////////////\n\t/**\n\t * @event module:share#share:token:embed\n\t * @fires module:share#share:token:downloadOptions:check\n\t * @fires module:share#share:token:embed:error\n\t */\n\tdispatcher.on('share:token:embed', function (assetSet) {\n\t\tvar asset, downloadOptions, tokenModel;\n\n\t\tif (assetSet && assetSet.get('models') && assetSet.get('models')[0]) {\n\t\t\tasset = assetSet.get('models')[0];\n\t\t} else {\n\t\t\treturn dispatcher.trigger(\n\t\t\t\t'share:token:embed:error',\n\t\t\t\ti18n.t('i18n.errorOccured'),\n\t\t\t);\n\t\t}\n\n\t\t// Set download options to original\n\t\tassetSet.downloadOptions = new DownloadOptionsCollection([\n\t\t\t{\n\t\t\t\ttype: downloadOptionTypes.original,\n\t\t\t},\n\t\t]);\n\n\t\t// Create token model\n\t\ttokenModel = new AccessTokenModel(\n\t\t\t{\n\t\t\t\ttype: 'embed',\n\t\t\t\ttitle: asset.get('name'),\n\t\t\t\texpirationType: 'indefinite',\n\t\t\t\tsecondsToLive: 0,\n\t\t\t\tsecurityType: 'none',\n\t\t\t\toptions: downloadOptions,\n\t\t\t},\n\t\t\t{\n\t\t\t\tassetSet: assetSet,\n\t\t\t},\n\t\t);\n\n\t\t// Check download options\n\t\tdispatcher.trigger('share:token:downloadOptions:check', tokenModel);\n\t});\n\t/*\n\t * @event module:share#share:token:embed:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('share:token:embed:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\t////////////////////////////////\n\t// !GET EMBED CODE\n\t////////////////////////////////\n\n\t//\n\t//=================================\n\t// END TOKEN MGT SECTION\n\t//=================================\n\n\t//=================================\n\t// MEDIA SERVICES SECTION\n\t//=================================\n\t/**\n\t * @event module:share#share:assetSet:media:service\n\t * @param {module:asset/models/assetSet} assetSet Asset set\n\t * @fires module:share#share:assetSet:media:service\n\t * @fires module:share#share:assetSet:media:service:error\n\t */\n\tdispatcher.on('share:assetSet:media:service', function (assetSet) {\n\t\tconst mediaServices = NS.mediaServices;\n\n\t\tmediaServices.fetch().then(function () {\n\t\t\tlet cart;\n\t\t\tswitch (assetSet.get('type')) {\n\t\t\t\tcase assetSetTypes.savedCart:\n\t\t\t\t\tcart =\n\t\t\t\t\t\tassetSet.get('model') ||\n\t\t\t\t\t\tNetx.cart.saved.all.get(assetSet.get('ids')[0]);\n\t\t\t\t\tif (!cart) {\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'share:assetSet:media:service:error',\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\ti18n.t('i18n.cantFindCartForAssetSet', {\n\t\t\t\t\t\t\t\t\tdefaultValue: 'Cant find collection',\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase assetSetTypes.cart:\n\t\t\t\t\tcart = Netx.cart.current;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase assetSetTypes.asset:\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// Currently, we only share carts this way. And it's imperfect: we only share the first ten assets.\n\t\t\t\t\t// We ought to be able to add arbitrary asset sets. But not in this 8.5 hotfix.\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:assetSet:media:service:error',\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\ti18n.t('i18n.cantPublishAssetSetType', {\n\t\t\t\t\t\t\t\tdefaultValue: 'Cant publish that asset set',\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tassetSet,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!cart) {\n\t\t\t\t// we have an assetSet of type 'asset' or we couldn't get here:\n\t\t\t\tdispatcher.trigger('share:assetSet:media:service:success', assetSet);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcart.inspect().then(function (inspection) {\n\t\t\t\t// inspect cart contents:\n\t\t\t\t// We must have video assets,\n\t\t\t\tif (inspection.videoCount == 0) {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:assetSet:media:service:error',\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\ti18n.t('share:noVideoAssetsSelected', {\n\t\t\t\t\t\t\t\tdefaultValue: 'No video assets selected',\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tassetSet,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// and as of 8.4, we must only have video assets.\n\t\t\t\tif (\n\t\t\t\t\tinspection.audioCount > 0 ||\n\t\t\t\t\tinspection.documentCount > 0 ||\n\t\t\t\t\tinspection.imageCount > 0 ||\n\t\t\t\t\tinspection.otherAssetCount > 0\n\t\t\t\t) {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:assetSet:media:service:error',\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\ti18n.t('i18n.canOnlyPublishVideoAssets', {\n\t\t\t\t\t\t\t\tdefaultValue: 'Only video assets can be published',\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tassetSet,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Okay, forward to shareWays for now.\n\t\t\t\tdispatcher.trigger('share:assetSet:media:service:success', assetSet);\n\t\t\t});\n\t\t});\n\t});\n\n\t/**\n\t * Pass along to the share interface:\n\t * @event module:share#share:assetSet:media:service:success\n\t * @fires module:share#share:specific\n\t */\n\tdispatcher.on('share:assetSet:media:service:success', function (assetSet) {\n\t\tdispatcher.trigger(\n\t\t\t'share:specific',\n\t\t\tassetSet.toShareable(),\n\t\t\t'mediaService',\n\t\t);\n\t});\n\n\t/**\n\t * Display some kind of error:\n\t * @event module:share#share:assetSet:media:service:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'share:assetSet:media:service:error',\n\t\tfunction (error, assetSet) {\n\t\t\tdispatcher.trigger('app:alert', error.message, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t//\n\t//=================================\n\t// END MEDIA SERVICES SECTION\n\t//=================================\n\n\t//=================================\n\t// SHARE ASSET VERSION\n\t//=================================\n\n\t/**\n\t * Download an asset version\n\t * @event module:share#share:assetSet:version\n\t * @param {module:asset/models/assetVersion} model AssetVersion model\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on('share:assetSet:version', function (versionModel) {\n\t\t// DAM-9860 make some download options just for this.\n\n\t\t// From Jason - Beware: this ONLY works for single asset downloads — can't do this in a batch.\n\t\t// Also, this option is NOT advertised in the GetDownloadOptions as this should only be hooked\n\t\t// up on the Versions tab of the Asset Details view (and not in any selection).\n\n\t\tvar downloadOptions = new DownloadOptionsCollection([\n\t\t\tnew DownloadOptionModel({\n\t\t\t\ttype: 'assetVersion',\n\t\t\t\tid: versionModel.get('versionId'),\n\t\t\t}),\n\t\t]);\n\n\t\tvar assetSet = new AssetSetModel(\n\t\t\t{\n\t\t\t\ttype: assetSetTypes.asset,\n\t\t\t\tids: [versionModel.get('assetId')],\n\t\t\t},\n\t\t\t{\n\t\t\t\tdownloadOptions: downloadOptions,\n\t\t\t},\n\t\t);\n\n\t\tassetSet\n\t\t\t.prepareDownload(downloadOptions, _.uniqueId('download_'), {}, {})\n\t\t\t.then(function (uuid) {\n\t\t\t\t// Notify\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'notification',\n\t\t\t\t\t{\n\t\t\t\t\t\tmodule: 'asset',\n\t\t\t\t\t\tids: versionModel.get('assetId'),\n\t\t\t\t\t\ttitle: i18n.t('i18n.assetVersion'),\n\t\t\t\t\t\tdescription: i18n.t('i18n.downloading'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\t\t// args : [ versionModel ],\n\t\t\t\t\t\t\teventStr: 'share:assetSet:version',\n\t\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tfunction (err) {\n\t\t\t\t\t\tdispatcher.trigger('share:assetSet:version:error', err);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t});\n\t/**\n\t * asset version ready for download\n\t * @event module:share#share:assetSet:version:succeeded\n\t * @param {Netx.Models.ShareStatus} model ShareStatus model\n\t * @fires module:share#share:simpleDownload\n\t */\n\tdispatcher.on('share:assetSet:version:succeeded', function (\n\t\tshareStatusModel,\n\t) {\n\t\t// give em the goods\n\t\tdispatcher.trigger(\n\t\t\t'share:simpleDownload',\n\t\t\tshareStatusModel.get('completeUrl'),\n\t\t);\n\t});\n\t/**\n\t * @event module:share#share:assetSet:version:error\n\t * @param {object} err\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('share:assetSet:version:error', function (err) {\n\t\t// d'oh\n\t\tdispatcher.trigger('app:alert', err, i18n.t('i18n.error'));\n\t});\n\n\t//=================================\n\t// !SHARE ASSET VERSION\n\t//=================================\n\n\t//=================================\n\t// MISC/OBSOLETE SECTION\n\t//=================================\n\t//TODO: make a distinction between 'misc' and 'obsolete', and deprecate the latter ...\n\n\t/**\n\t * share:assets handler creates sharing interface for a set of assets;\n\t * it can take various things as an argument: array of IDs, array of models, a collection, or (for backwards compatibility) a single model.\n\t * @event\n\t * @deprecated\n\t */\n\tdispatcher.on('share:assets', function (thing) {\n\t\tconsole.warn('share:assets deprecated, gone in 8.13 .'); // Does not appear to be used.\n\t\t// Show\n\t\tdispatcher.trigger('share:options:show', {\n\t\t\tmodel: NS.status,\n\t\t\tshareable: new ShareableModel({\n\t\t\t\ttype: 'assets',\n\t\t\t\t// figure out which kind of thing we have ...\n\t\t\t\tids:\n\t\t\t\t\t_.isArray(thing) && thing[0] && _.isNumber(thing[0])\n\t\t\t\t\t\t? thing\n\t\t\t\t\t\t: undefined,\n\t\t\t\tmodel: thing instanceof CoreModel ? thing : undefined,\n\t\t\t\tmodels:\n\t\t\t\t\t_.isArray(thing) && thing[0] && thing[0] instanceof CoreModel\n\t\t\t\t\t\t? thing\n\t\t\t\t\t\t: undefined,\n\t\t\t\tcollection: thing instanceof CoreCollection ? thing : undefined,\n\t\t\t}),\n\t\t});\n\t});\n\n\t/**\n\t * share:assets:pdf assumes that a PDF is already waiting on the server.\n\t * @event\n\t * @deprecated\n\t */\n\tdispatcher.on('share:assets:pdf', function () {\n\t\tconsole.warn('share:assets:pdf deprecated, gone in 8.13 .'); // Does not appear to be used.\n\t\tdispatcher.trigger('share:options:show', {\n\t\t\tmodel: NS.status,\n\t\t\tshareable: new ShareableModel({\n\t\t\t\ttype: 'assets PDF',\n\t\t\t\tlabel: i18n.t('i18n.PDFContactSheet'),\n\t\t\t}),\n\t\t});\n\t});\n\n\t/**\n\t * share:repurposed assumes a repurpose job is already waiting on the server.\n\t * @event\n\t * @deprecated\n\t */\n\tdispatcher.on('share:repurposed', function () {\n\t\tconsole.warn('share:repurposed is deprecated, gone in 8.13');\n\t\tdispatcher.trigger('share:options:show', {\n\t\t\tmodel: NS.status,\n\t\t\tshareable: new ShareableModel({\n\t\t\t\ttype: 'assets repurposed',\n\t\t\t\tlabel: i18n.t('i18n.repurposedAssets'),\n\t\t\t}),\n\t\t});\n\t});\n\n\t/**\n\t * Share a saved search.\n\t * @param int id saved search id.\n\t * @event\n\t */\n\tdispatcher.on('share:search:saved', function (id) {\n\t\tvar s = Netx.search.saved.all.get(id);\n\t\tif (!s) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'app:alert',\n\t\t\t\t'Saved search #' + id + ' not found',\n\t\t\t\t'Danger',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tdispatcher.trigger('share:options:show', {\n\t\t\tmodel: NS.status,\n\t\t\tshareable: new ShareableModel({\n\t\t\t\ttype: 'saved search',\n\t\t\t\tmodel: s,\n\t\t\t}),\n\t\t});\n\t});\n\n\t/**\n\t * Share stat query\n\t * @event module:share#share:stat:query\n\t * @param {Netx.Collections.StatQueryDatum} collection Stat query datum collection\n\t */\n\tdispatcher.on('share:statQuery', function (collection) {\n\t\tdispatcher.trigger('share:options:show', {\n\t\t\tmodel: NS.status,\n\t\t\tshareable: new ShareableModel({\n\t\t\t\ttype: 'statQuery',\n\t\t\t\tcollection: collection,\n\t\t\t}),\n\t\t});\n\t});\n\t/**\n\t * Share system logs\n\t * @event module:share#share:systemLogs\n\t * @param {Netx.Collections.SystemLogs} collection System logs collection\n\t */\n\tdispatcher.on('share:systemLogs', function (collection) {\n\t\tdispatcher.trigger('share:options:show', {\n\t\t\tmodel: NS.status,\n\t\t\tshareable: new ShareableModel({\n\t\t\t\ttype: 'systemLogs',\n\t\t\t\tcollection: collection,\n\t\t\t}),\n\t\t});\n\t});\n\t/**\n\t * Share users\n\t * @event module:share#share:users\n\t * @param {Netx.Collections.Users} collection Users collection\n\t */\n\tdispatcher.on('share:users', function (collection) {\n\t\tdispatcher.trigger('share:options:show', {\n\t\t\tmodel: NS.status,\n\t\t\tshareable: new ShareableModel({\n\t\t\t\ttype: 'users',\n\t\t\t\tcollection: collection,\n\t\t\t}),\n\t\t});\n\t});\n\n\t/**\n\t * @event module:share#share:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(/* webpackChunkName: \"view-share\" */ './views/shareView').then(\n\t\t\t\t(View) => {\n\t\t\t\t\tmodalViews.add({\n\t\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\t\tshowActions: ['share:show'],\n\t\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:download:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:download:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-downloadShare\" */ './views/downloadShareView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:download:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:email:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:email:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-emailShare\" */ './views/emailShareView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:email:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:globalSearch:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:globalSearch:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-globalSearchShare\" */ './views/globalSearchShareView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:globalSearch:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:mediaService:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:mediaservice:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-mediaServiceShare\" */ './views/mediaServiceShareView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:mediaService:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:share#share:publicLink:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:publicLink:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-publicLinkShare\" */ './views/publicLinkShareView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:publicLink:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * This event circumvents the shareOptionsView, and inserts a specific\n\t * share option view in a specific target element.\n\t * @event\n\t * @param {Netx.Models.Shareable} shareable defines the thing being shared\n\t * @param {} way a shareway instance, or a key to an instance in Netx.Shareways\n\t * @fires module:share#share:show\n\t * @fires module:share#share:download:show\n\t * @fires module:share#share:globalSearch:show\n\t * @fires module:share#share:mediaService:show\n\t * @fires module:share#share:publicLink:show\n\t */\n\t// TODO: this handler is full of bugs and does not work in 8.12 . Deprecate?\n\tdispatcher.on('share:specific', function (shareable, way) {\n\t\tvar NS = (Netx.share = Netx.share || {});\n\n\t\t// convert shareway string to shareway instance.\n\t\tif (_.isString(way)) {\n\t\t\tvar sw = Netx.ShareWays[way];\n\t\t\tif (_.isUndefined(sw)) {\n\t\t\t\tthrow new Error(\"No such shareway '\" + way + \"'\");\n\t\t\t} else {\n\t\t\t\tway = sw;\n\t\t\t}\n\t\t}\n\n\t\t// DAM-13453 - share:mediaservice:show needs to get called as\n\t\t// mediaServiceShareView is defered and doesn't exist yet\n\t\tif (way.get('name') === 'mediaService') {\n\t\t\tdispatcher.trigger('share:mediaservice:show', {\n\t\t\t\tmodel: NS.status,\n\t\t\t\tshareable: shareable,\n\t\t\t\tshareWay: way,\n\t\t\t\tmediaServices: NS.mediaServices,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (!way.supports(shareable)) {\n\t\t\tthrow new Error(\"can't share this way\");\n\t\t}\n\n\t\tvar name = way.get('name');\n\t\t// widget -> Widget\n\t\tvar key = _.ucfirst(name);\n\n\t\t// Create a fresh view:\n\t\tif (!_.isUndefined(Netx.Views[key + 'ShareView'])) {\n\t\t\t// Possible outcomes\n\t\t\t// share:download:show\n\t\t\t// share:email:view\n\t\t\t// share:globalSearch:show\n\t\t\t// share:mediaServices:show\n\t\t\t// share:publicLink:show\n\t\t\t// Show\n\t\t\tdispatcher.trigger('share:' + key.toLowerCase() + ':show', {\n\t\t\t\tmodel: NS.status,\n\t\t\t\tshareable: shareable,\n\t\t\t\tshareWay: way,\n\t\t\t});\n\t\t} else {\n\t\t\tdispatcher.trigger('share:show', {\n\t\t\t\tmodel: NS.status,\n\t\t\t\ttemplate: Templates[name],\n\t\t\t\tshareable: shareable,\n\t\t\t\tshareWay: way,\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * the generic share:submit:confirmed handler for shareViews:\n\t * finds the appropriate handler and calls it with the appropriate arguments.\n\t * @event module:share#share:submit:confirmed\n\t * @fires module:share#share:submit:success\n\t */\n\tdispatcher.on('share:submit:confirmed', function (data, shareWay, shareable) {\n\t\t// console.log( data, shareWay, shareable );\n\t\tshareWay.handlers[shareable.get('type')](\n\t\t\tdata,\n\t\t\tshareable.get('ids'),\n\t\t\tshareable,\n\t\t);\n\t\t// For posterity\n\t\tdispatcher.trigger('share:submit:success', data, shareWay, shareable);\n\t});\n\n\t/**\n\t * on 'share:simpleDownload', the share controller redirects to a URL that is expected to trigger a browser download.\n\t * @event module:share#share:simpleDownload\n\t * @param {string} URL the URL of the downloadable item.\n\t */\n\tdispatcher.on('share:simpleDownload', function (URL) {\n\t\t// clean up window.\n\t\topenDownloadLink(URL);\n\t});\n\n\t/**\n\t * On 'share:downloadWhenReady', the share controller will wait for a current DAM task to complete,\n\t * then downloads the result directly to the browser. This is the simplest way to trigger a download\n\t * after a shareable API call.\n\t * @event module:share#share:downloadWhenReady\n\t */\n\tdispatcher.on('share:downloadWhenReady', function () {\n\t\tvar shareWays = Netx.ShareWays;\n\t\tshareWays.download.waitForDam().then(function () {\n\t\t\tshareWays.download.getShareData().then(function () {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\tshareWays.download.get('shareData').path,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\n\t/**\n\t * On share:poll, start polling the status of the server's share preparations:\n\t * @event module:share#share:poll\n\t */\n\tdispatcher.on('share:poll', function (methodName, uuid, doneTest, opts) {\n\t\tNS.status.poll(methodName, uuid, doneTest, opts);\n\t});\n\n\t/**\n\t * On share:status:emailWhenDone, stop polling the status of the server's share preparations:\n\t * @event module:share#share:status:emailWhenDone\n\t */\n\tdispatcher.on('share:status:emailWhenDone', function (uuid) {\n\t\tNS.status.emailWhenDone().then(function (status) {\n\t\t\tdispatcher.trigger('share:poll:deferred', status);\n\t\t});\n\t});\n\n\t/**\n\t * @event module:share#share:status:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:status:show',\n\t\tfunction (viewOptions) {\n\t\t\tmodalViews.add({\n\t\t\t\tviewClass: ShareStatusView,\n\t\t\t\tshowActions: ['share:status:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI: Show the shareStatusView when we begin polling\n\t * @event module:share#share:status:polling\n\t */\n\tdispatcher.on(\n\t\t'share:status:polling',\n\t\tfunction (name) {\n\t\t\tdispatcher.trigger('share:status:show', {\n\t\t\t\tmodel: NS.status,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI: Show the shareStatusView when we begin polling\n\t * @event module:share#share:status:startedPolling\n\t */\n\tdispatcher.on(\n\t\t'share:status:startedPolling',\n\t\tfunction (name) {\n\t\t\tdispatcher.trigger('share:status:show', {\n\t\t\t\tmodel: NS.status,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t// TODO: are we stil lattempting to support this via the emai ltemplate in the new\n\t// download request stuff? Does the UI need to change anything?\n\t/**\n\t * @event module:share#share:approval:download:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'share:approval:download:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-tokenDownload\" */ './views/tokenDownloadView'\n\t\t\t).then((View) => {\n\t\t\t\tfsViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['share:approval:download:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * logic for downloading an approved token\n\t * @event module:share#share:approval:download\n\t * @param {string} tokenStr Token string\n\t * @fires module:share#share:simpleDownload\n\t * @fires module:share#share:approval:download:show\n\t */\n\tdispatcher.on('share:approval:download', function (tokenStr) {\n\t\t// Show\n\t\tdispatcher.trigger('share:approval:download:show', {});\n\n\t\tvar tokenModel = new AccessTokenModel({token: tokenStr});\n\t\ttokenModel.fetchInfo().then(function () {\n\t\t\t// NOTE: password is not used for now. In 8.2 there may be tokens with securityType == \"password\";\n\t\t\t// TODO-LATER: implement a workflow when that happens.\n\t\t\ttokenModel.set({password: ''});\n\t\t\ttokenModel.downloadForToken().then(function (uuid) {\n\t\t\t\t// TODO: test this once DAM-3416 is fixed.\n\t\t\t\tNetx.ShareWays.download.waitForDam(uuid).then(function () {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\t\tNS.status.get('completeUrl'),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tif (Netx.getPublicProperty('mediaServices.enabled', true)) {\n\t\t/*******************************\n\t\t * RSS Feeds\n\t\t *******************************/\n\t\t/**\n\t\t * @event module:share#share:feed:delete\n\t\t * @param {module:share/models/feed} feed Feed\n\t\t * @fires module:app#app:confirm:delete\n\t\t */\n\t\tdispatcher.on('share:feed:delete', function (feed) {\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t('i18n.confirmDeleteBody'),\n\t\t\t\teventStr: 'share:feed:delete',\n\t\t\t\targs: [feed],\n\t\t\t});\n\t\t});\n\t\t/**\n\t\t * @event module:share#share:feed:delete:confirmed\n\t\t * @param {module:share/models/feed} feed Feed\n\t\t * @fires module:share#share:feed:delete:error\n\t\t * @fires module:share#share:feed:delete:success\n\t\t */\n\t\tdispatcher.on('share:feed:delete:confirmed', function (feed) {\n\t\t\tfeed.destroy({wait: true}).then(\n\t\t\t\tfunction () {\n\t\t\t\t\tdispatcher.trigger('share:feed:delete:success');\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('share:feed:delete:error', err);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t\t/**\n\t\t * @event module:share#share:feed:delete:error\n\t\t * @param {string} error Error\n\t\t * @param {module:share/models/feed} feed Feed\n\t\t * @fires module:app#app:alert\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'share:feed:delete:error',\n\t\t\tfunction (error, feed) {\n\t\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\t\t/**\n\t\t * @event module:share#share:feed:delete:success\n\t\t * @param {module:share/models/feed} feed Feed\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'share:feed:delete:success',\n\t\t\tfunction (feed) {\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'share',\n\t\t\t\t\ttitle: i18n.t('i18n.feedDeleteSuccessTitle'),\n\t\t\t\t\tdescription: i18n.t('i18n.feedDeleteSuccessDescription'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t});\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\n\t\t/**\n\t\t * @event module:share#share:feed:edit:Show\n\t\t * @param {object} viewOptions View options\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'share:feed:edit:show',\n\t\t\tfunction (viewOptions) {\n\t\t\t\timport(\n\t\t\t\t\t/* webpackChunkName: \"view-feedEdit\" */ './views/feedEditView'\n\t\t\t\t).then((View) => {\n\t\t\t\t\tmodalViews.add({\n\t\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\t\tshowActions: ['share:feed:edit'],\n\t\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\t\t/**\n\t\t * @event module:share#share:feed:edit\n\t\t * @param {module:share/models/feed} feed Feed\n\t\t * @fires module:share#share:feed:edit:show\n\t\t */\n\t\tdispatcher.on('share:feed:edit', function (feed) {\n\t\t\tif (feed.get('imageAssetId')) {\n\t\t\t\t// Pre-load the image asset that attaches to this view, so it'll have the info it needs to render\n\t\t\t\tfeed.fetchImage(feed.get('imageAssetId'));\n\t\t\t}\n\n\t\t\tdispatcher.trigger('share:feed:edit:show', {\n\t\t\t\tmodel: feed,\n\t\t\t});\n\t\t});\n\t\t/**\n\t\t * @event module:share#share:feed:edit\n\t\t * @param {object} data Data\n\t\t * @param {module:share/models/feed} feed Feed\n\t\t * @fires module:share#share:feed:edit:error\n\t\t * @fires module:share#share:feed:edit:success\n\t\t */\n\t\tdispatcher.on('share:feed:edit:confirmed', function (data, feed) {\n\t\t\tvar isNew = feed.isNew();\n\n\t\t\t// form.source should be 'category', 'cart' or 'search', matching the keys in sourceTypes.\n\t\t\tif (data.source && sourceTypes[data.source]) {\n\t\t\t\t// munge selected source type & id\n\t\t\t\tdata.item_type = sourceTypes[data.source].id;\n\t\t\t\tdata.item_id = data['source-' + data.source];\n\t\t\t\t// Clean up form: don't set these on the model:\n\t\t\t\tdelete data.source;\n\t\t\t\t_.each(_.keys(sourceTypes), function (key) {\n\t\t\t\t\tdelete data['source-' + key];\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// this should never happen, because the source field is required in the form template\n\t\t\t\tthrow new Error('assertion failure: no source selected');\n\t\t\t}\n\n\t\t\tfeed.save(data).then(\n\t\t\t\tfunction () {\n\t\t\t\t\t// TODO: Netx.Controller does try to do this for us, but not early enough.\n\t\t\t\t\t// Make that happen sooner, somehow.\n\t\t\t\t\tNS.feeds.add(feed);\n\t\t\t\t\t// Refetch to add properties (like feedURL) to the model.\n\t\t\t\t\t// TODO: the need to fetch after saving is so common, we should have a config option for it.\n\t\t\t\t\tNS.feeds.fetch({merge: true}).then(function () {\n\t\t\t\t\t\tdispatcher.trigger('share:feed:edit:success', feed, data, isNew);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('share:feed:edit:error', err, feed, data);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t\t/**\n\t\t * @event module:share#share:feed:edit:error\n\t\t * @param {string} error Error\n\t\t * @param {module:share/models/feed} feed Feed\n\t\t * @param {object} data Data\n\t\t * @fires module:app#app:alert\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'share:feed:edit:error',\n\t\t\tfunction (error, feed, data) {\n\t\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\t\t/**\n\t\t * @event module:share#share:feed:edit:success\n\t\t * @param {module:share/models/feed} feed Feed\n\t\t * @param {object} data Data\n\t\t * @fires module:notification#notification\n\t\t * @todo This is not our pattern, views should come from events that end in `show` - that way we are not tying this view directly to this success event\n\t\t */\n\t\tdispatcher.on(\n\t\t\t'share:feed:edit:success',\n\t\t\tfunction (feed, data, isNew) {\n\t\t\t\tvar title = isNew\n\t\t\t\t\t\t? 'share:i18n.feedNewSuccessTitle'\n\t\t\t\t\t\t: 'share:i18n.feedEditSuccessTitle',\n\t\t\t\t\tdescription = isNew\n\t\t\t\t\t\t? 'share:i18n.feedNewSuccessDescription'\n\t\t\t\t\t\t: 'share:i18n.feedEditSuccessDescription';\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'share',\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\ttitle: i18n.t(title, {replace: feed.attributes}),\n\t\t\t\t\tdescription: i18n.t(description, {replace: feed.attributes}),\n\t\t\t\t});\n\n\t\t\t\tif (isNew) {\n\t\t\t\t\timport(\n\t\t\t\t\t\t/* webpackChunkName: \"view-tokenLinkAdded\" */ './views/tokenLinkAddedView'\n\t\t\t\t\t).then((View) => {\n\t\t\t\t\t\tmodalViews.add({\n\t\t\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\t\t\tshowActions: ['share:feed:edit:success'],\n\t\t\t\t\t\t\tviewOptions: {\n\t\t\t\t\t\t\t\tmodel: feed,\n\t\t\t\t\t\t\t\theaderTitle: i18n.t('i18n.feedNewSuccessTitle'),\n\t\t\t\t\t\t\t\thereItIsMsg: i18n.t('i18n.newFeedLinkMessage'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\twindow,\n\t\t);\n\t\t/**\n\t\t * @event module:share#share:feed:new\n\t\t * @param {module:cart/models/savedCart|module:category/models/category|module:search/models/savedSearch} providedModel Provided model\n\t\t * @fires module:share#share:feed:edit\n\t\t */\n\t\tdispatcher.on('share:feed:new', function (providedModel) {\n\t\t\t// Populate new models with sensible defaults\n\t\t\tvar user = Netx.getUser();\n\n\t\t\t// Create a new model\n\t\t\tvar model = new FeedModel({\n\t\t\t\towner: user.fullName(),\n\t\t\t\townerEmail: user.get('email'),\n\t\t\t\tmanaging_editor: user.get('email'),\n\t\t\t\ttitle: NS.feeds.makeUniqueName('share:i18n.newPodcast'),\n\t\t\t});\n\n\t\t\t// Our non-feed model argument may have information we want:\n\t\t\tif (providedModel instanceof CategoryModel) {\n\t\t\t\tmodel.set({\n\t\t\t\t\titem_type: sourceTypes.category.id,\n\t\t\t\t\titem_id: providedModel.id,\n\t\t\t\t\titem_id_label: providedModel.get('path'),\n\t\t\t\t});\n\t\t\t} else if (providedModel instanceof SavedCartModel) {\n\t\t\t\tmodel.set({\n\t\t\t\t\titem_type: sourceTypes.cart.id,\n\t\t\t\t\titem_id: providedModel.id,\n\t\t\t\t\titem_id_label: providedModel.get('title'),\n\t\t\t\t});\n\t\t\t} else if (providedModel instanceof SavedSearchModel) {\n\t\t\t\tmodel.set({\n\t\t\t\t\titem_type: sourceTypes.search.id,\n\t\t\t\t\titem_id: providedModel.id,\n\t\t\t\t\titem_id_label: providedModel.get('title'),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tdispatcher.trigger('share:feed:edit', model);\n\t\t});\n\n\t\t/**\n\t\t * @event module:share#share:feed:load:image\n\t\t * @param {Netx.Models.Feed} feed Feed model\n\t\t * @param {number} assetId Asset id\n\t\t */\n\t\tdispatcher.on('share:feed:load:image', function (feed, assetId) {\n\t\t\tassetId && feed.fetchImage(assetId);\n\t\t});\n\t}\n\n\t/**\n\t * @event module:share@share:sharedResource:toggle:favorite\n\t * @param {Netx.Models.SharedResource} model Shared resource model\n\t */\n\tdispatcher.on('share:sharedResource:toggle:favorite', function (model) {\n\t\tmodel.toggleFavorite().then(function (isFavorite) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'share:sharedResource:toggle:favorite:success',\n\t\t\t\tmodel,\n\t\t\t\tisFavorite,\n\t\t\t);\n\t\t});\n\t});\n\n\t/**\n\t * @event module:share#share:sharedResources:set:filterMode\n\t * @param {module:share/collections/sharedResources} collection Shred resources\n\t * @param {string} mode Mode filter\n\t */\n\tdispatcher.on('share:sharedResources:set:filterMode', function (\n\t\tcollection,\n\t\tmode,\n\t) {\n\t\tcollection.setModeFilter(mode);\n\t});\n\n\t/**\n\t * @event module:share#share:sharedResources:search\n\t * @param {module:share/collections/sharedResources} collection Shred resources\n\t * @param {string} str Search string\n\t */\n\tdispatcher.on('share:sharedResources:search', function (collection, str) {\n\t\tcollection.setFilterStr(str);\n\t});\n\t/**\n\t * @event module:share#share:sharedResources:search:clear\n\t * @param {module:share/collections/sharedResources} collection Shred resources\n\t */\n\tdispatcher.on('share:sharedResources:search:clear', function (collection) {\n\t\tcollection.setFilterStr('');\n\t});\n\n\t/**************************************************/\n\t/**** end event handlers **************************/\n\t/**** thank you, and have a pleasant evening *****/\n\t/**************************************************/\n\n\tPromise.all(NS.bootstrap).then(() => {\n\t\tdelete NS.bootstrap;\n\t\tdispatcher.trigger('share:extend', NS);\n\t\tdispatcher.trigger('share:initialized', NS);\n\t});\n});\n\nexport default {\n\tinitialize(opts) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdispatcher.once('share:initialized', () => {\n\t\t\t\tresolve(routes);\n\t\t\t});\n\t\t\tdispatcher.trigger('share:init');\n\t\t});\n\t},\n};\n","export {default} from '@netx/core-share/controller';\n\nimport AccessTokenModel from './models/accessToken';\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\n\nimport PromptViewTextareaTemplate from '@netx/core-app/templates/promptView-textarea';\n\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\n\n/**\n * @event module:share#share:cart:saved:download\n * @fires module:share#share:cart:download\n */\ndispatcher.on('share:cart:saved:download', function (model) {\n\tdispatcher.trigger('share:cart:download', model);\n});\n\n/** Share Module Extensions */\ndispatcher.once('share:extend', function () {\n\tvar NS = Netx.share;\n\n\t// THEM-1603 - client side selection for the public user\n\tif (_.isPublicUser()) {\n\t\t/**\n\t\t * Archive & download the current cart\n\t\t * @event module:share#share:cart:current:download\n\t\t * @fires module:share#share:assetSet:download:start\n\t\t */\n\t\tdispatcher.off('share:cart:current:download');\n\t\tdispatcher.on('share:cart:current:download', function () {\n\t\t\t// Check for download options.\n\t\t\tdispatcher.trigger(\n\t\t\t\t'share:assetSet:download:start',\n\t\t\t\tnew AssetSetModel({\n\t\t\t\t\ttype: assetSetTypes.assetSet,\n\t\t\t\t\tids: Netx.cart.current.returnAssetIdArray(),\n\t\t\t\t\tlabel: i18n.t('i18n.currentCart'),\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t\t/**\n\t\t * Create PDF of the current cart/asset selection\n\t\t * @event module:share#share:cart:current:createPDF\n\t\t * @fires module:share#share:assetSet:createPDF:start\n\t\t */\n\t\tdispatcher.off('share:cart:current:createPDF');\n\t\tdispatcher.on('share:cart:current:createPDF', function () {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'share:assetSet:createPDF:start',\n\t\t\t\tnew AssetSetModel({\n\t\t\t\t\ttype: assetSetTypes.assetSet,\n\t\t\t\t\tids: Netx.cart.current.returnAssetIdArray(),\n\t\t\t\t\tlabel: i18n.t('i18n.selectedAssets'),\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t}\n\tdispatcher.off('share:token:edit:options:save:success');\n\tdispatcher.on(\n\t\t'share:token:edit:options:save:success',\n\t\tfunction (tokenModel, isNew) {\n\t\t\tif (isNew) {\n\t\t\t\t// Show\n\t\t\t\tdispatcher.trigger('share:publicLink:added:show', {\n\t\t\t\t\tmodel: tokenModel,\n\t\t\t\t});\n\t\t\t}\n\t\t\t//dispatcher.trigger('share:assetSet:token:sendEmail', tokenModel);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @override\n\t */\n\tdispatcher.off('share:token:sendEmail:success');\n\tdispatcher.on('share:token:sendEmail:success', function () {\n\t\tdispatcher.trigger('app:passiveAlert', {\n\t\t\tmessage: i18n.t('i18n.messageSent'),\n\t\t\tclassName: 'alert alert-success',\n\t\t});\n\t});\n\n\t/**\n\t * UI handler for when user decides they'll want an email later\n\t * @event module:share#share:poll:deferred\n\t * @param {Netx.Models.ShareStatus} statusModel Status model\n\t * @fires module:app#app:reset:modalViews\n\t */\n\tdispatcher.on(\n\t\t'share:poll:deferred',\n\t\tfunction (statusModel) {\n\t\t\t// Currently there is not a workflow that entails having another modal appear\n\t\t\t// when we opt to \"Email when done\"\n\t\t\tdispatcher.trigger('app:reset:modalViews');\n\t\t},\n\t\twindow,\n\t);\n\n\t// PassiveAlert instead of AppAlert\n\t_.extend(Netx.ShareWays.email, {\n\t\temailAssets: function () {\n\t\t\treturn this._emailAssets()\n\t\t\t\t.fail(this.fail)\n\t\t\t\t.done(\n\t\t\t\t\t_.bind(function (msg) {\n\t\t\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\t\t\tmodule: 'share',\n\t\t\t\t\t\t\ttitle: i18n.t('share:i18n.sharing'),\n\t\t\t\t\t\t\tdescription: msg,\n\t\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.done();\n\t\t\t\t\t}, this),\n\t\t\t\t);\n\t\t},\n\t});\n\n\t/**\n\t * @event module:share#share:approval:note\n\t * @override\n\t * @param {string} tokenStr Token\n\t * @param {Netx.Models.AccessToken} tokenModel Token model\n\t * @param {string} eventStr Event string\n\t * @fires module:app#app:prompt\n\t */\n\tdispatcher.off('share:approval:note');\n\tdispatcher.on('share:approval:note', function (\n\t\ttokenStr,\n\t\ttokenModel,\n\t\teventStr,\n\t) {\n\t\tdispatcher.trigger('app:prompt', {\n\t\t\theaderTitle: i18n.t('i18n.notifyUserOfStatus'),\n\t\t\tprompt: i18n.t('i18n.messageForRequestingUser'),\n\t\t\ttemplate: PromptViewTextareaTemplate,\n\t\t\teventStr: eventStr,\n\t\t\tsubmitLabel: i18n.t('i18n.send'),\n\t\t\trequired: false,\n\t\t\trequiresChanges: false,\n\t\t\targs: [tokenStr, tokenModel],\n\t\t\tsubmitArgs: function () {\n\t\t\t\treturn this.args.concat([this.inputs.$neededInformation.val()]);\n\t\t\t},\n\t\t});\n\t});\n\n\t/**\n\t * UI handler for when a link URL is copied to the clipboard.\n\t * @event module:share#share:token:copiedLink\n\t * @param {Netx.Models.AccessToken} tokenModel Token model\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'share:token:copiedLink',\n\t\tfunction (tokenModel) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'share',\n\t\t\t\tids: [tokenModel.id],\n\t\t\t\ttitle: i18n.t('share:i18n.token'),\n\t\t\t\tdescription: i18n.t('i18n.linkSuccessfullyCopiedToClipboard', {\n\t\t\t\t\tdefaultValue: 'Link successfully copied to clipboard. \"__link__\"',\n\t\t\t\t\tlink: tokenModel.linkUrl(),\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:share#share:shareable:menu:show:show\n\t * @param {object} viewOptions View options\n\t * @fires moudle:app#app:showOptions\n\t */\n\tdispatcher.on(\n\t\t'share:shareable:menu:show',\n\t\tfunction (viewOptions) {\n\t\t\tdispatcher.trigger('app:showOptions', viewOptions);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * share:shareable:menu exists to make our legacy sharing system look more like our\n\t * new sharing system. Hopefully we only use this for repurposed assets, and only in 8.5.\n\t * It accepts a Shareable object, and uses shareableMenu,\n\t * @event module:share#share:shareable:menu\n\t * @param {Netx.Models.Shareable} shareable Shareable model\n\t * @fires module:share#share:shareable:menu:show:show\n\t * @deprecated\n\t */\n\tdispatcher.on('share:shareable:menu', function (shareable) {\n\t\tconsole.warn('share:shareable:menu is deprecated, gone in 8.13'); // only used by one action, also deprecated.\n\t\tvar shareableMenu = Netx.Menus.shareableMenu.clone();\n\t\tshareableMenu.set({actions: _.clone(shareableMenu.get('actions'))});\n\t\t// Show\n\t\tdispatcher.trigger('share:shareable:menu:show', {\n\t\t\tmenu: shareableMenu,\n\t\t\tdata: [shareable],\n\t\t});\n\t});\n\n\t/**\n\t * Load specificShareViews with just one view: email.\n\t * @param {Netx.Models.Shareable} shareable Shareable model\n\t * @fires module:share#share:specific\n\t * @deprecated\n\t */\n\tdispatcher.on('share:shareable:email', function (shareable) {\n\t\tconsole.warn('share:shareable:email is deprecated, gone in 8.13'); // only used by one deprecated menu\n\t\tdispatcher.trigger('share:specific', shareable, 'email');\n\n\t\t// dispatcher.once('share:submit:success');\n\t});\n\n\t/**\n\t * Direct download of old-school batch payload.\n\t * @event module:share#share:shareable:download\n\t * @fires module:share#share:downloadWhenReady\n\t * @deprecated\n\t */\n\tdispatcher.on('share:shareable:download', function () {\n\t\tconsole.warn('share:shareable:download is deprecated, gone in 8.13'); // only used by one deprecated menu\n\t\tdispatcher.trigger('share:downloadWhenReady');\n\t});\n\n\tNetx.ShareWays.email.set(\n\t\t'label',\n\t\ti18n.t('share:i18n.emailLink', {defaultValue: 'Email Link'}),\n\t);\n\n\t// these stop an overzealous loading screen\n\tdispatcher.off('share:assetSet:download:prepare');\n\tdispatcher.off('share:assetSet:options:check:prepare');\n\tdispatcher.off('share:assetSet:download:warnings:prepare');\n});\n","/**\n * This file defines the model Netx.Models.ShareWay, and instantiates a base set of those models\n * as properties of the object Netx.ShareWays .\n *\n * A ShareWay defines a way to share some stuff. Each instance of this object defines what kind of\n * stuff it can share -- i.e. what shareableTypes it supports -- by adding a handler for each shareableType.\n *\n * @class\n */\n\n// DEVNOTE: Using object instances instead of subclasses to define specific shareways is weird, and perhaps should\n// be refactored, ala the subclasses of AssetAttributeEditView.\nimport Base from '@netx/core/lib/netx-model';\n\nimport CartAssetsCollection from '@netx/core-cart/collections/cartAssets';\nimport PublicLinkModel from '@netx/core-public-link/models/publicLink';\nimport SavedSearchModel from '@netx/core-search/models/savedSearch';\nimport SavedCartModel from '@netx/core-cart/models/savedCart';\n\nexport default class ShareWay extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\tget defaults() {\n\t\treturn {\n\t\t\tlabel: '',\n\t\t\tname: '',\n\t\t\t// DEVNOTE: defining these RPC argument objects as Backbone Model attributes is often more trouble than it's worth.\n\t\t\t// However I did put the shareData in the model, so views may get change events from it.\n\t\t\tshareData: {\n\t\t\t\tappendMetadata: null,\n\t\t\t\terrorCatastrophe: '',\n\t\t\t\terrorMessage: '',\n\t\t\t\thoursToLive: 0,\n\t\t\t\tname: '',\n\t\t\t\tpath: '',\n\t\t\t\tsize: '',\n\t\t\t\tsizeUncompressed: '',\n\t\t\t\twarningMessage: '',\n\t\t\t\tmessages: [],\n\t\t\t},\n\t\t};\n\t}\n\n\tget methods() {\n\t\treturn {\n\t\t\t// DEVNOTE: We should avoid renaming symbols, but the 'downloadAssets' call\n\t\t\t// does not necessarily have anything to do with a download,\n\t\t\t// while many other parts of this module do. So 'downloadAssets' -> 'prepareAssets'\n\t\t\t// to avoid confusion. (Confused?)\n\n\t\t\tprepareAssets: [\n\t\t\t\t'downloadAssets',\n\t\t\t\t'prepareAssetsArgs.assetIds',\n\t\t\t\t'prepareAssetsArgs.compression',\n\t\t\t\t'prepareAssetsArgs.reduceFileSize',\n\t\t\t\t'prepareAssetsArgs.downloadOverride',\n\t\t\t],\n\n\t\t\t// TODO: these cart-specific methods & props should probably remain on the Cart model;\n\t\t\t// we just need a way to pass that model through rpcAndShare().\n\t\t\tprepareCart: ['downloadAssetsFromSavedCart', 'prepareCartId', true],\n\n\t\t\tgetShareData: ['getShareBean'],\n\n\t\t\t_downloadForToken: [\n\t\t\t\t'downloadForToken',\n\t\t\t\t'downloadForTokenArgs.token',\n\t\t\t\t'downloadForTokenArgs.password',\n\t\t\t\t'downloadForTokenArgs.options',\n\t\t\t],\n\t\t};\n\t}\n\n\tget parsers() {\n\t\treturn {\n\t\t\tgetShareData: function (a) {\n\t\t\t\tthis.set('shareData', a);\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\tthis.prepareCartId = 0;\n\n\t\tthis.prepareAssetsArgs = {\n\t\t\tassetIds: [], // the cart assets will be used when this array is empty.\n\t\t\tcompression: false,\n\t\t\treduceFileSize: false,\n\t\t\tdownloadOverride: '',\n\t\t};\n\n\t\t// DEVNOTE: You'd think we could extend opts.methods onto 'this' (our instance) like so:\n\t\t//\n\t\t// _.extend(this.methods, opts.methods);\n\t\t//\n\t\t// However, in this case _.extend seems to modify the object prototype instead.\n\t\t// Not sure if that's \"smart\" or a bug, or my misreading of the docs.\n\t\t// The workaround is simply to be more explicit about what goes where, like so:\n\t\t//\n\n\t\t// must use ugly backbone.rpc internals to re-hook the methods, sorry.\n\t\tthis._rpc.newConst(undefined, this);\n\t}\n\n\t/**\n\t * supports: does this shareWay support this shareable?\n\t * By default this compares the shareable type to the handlers array,\n\t * but it could be overridden ...\n\t */\n\tsupports(shareable) {\n\t\tvar d, supported, type;\n\n\t\td = new $.Deferred();\n\t\ttype = shareable.get('type');\n\t\tsupported = _.isFunction(this.handlers[type]);\n\n\t\tif (supported && this.tests && _.isFunction(this.tests[type])) {\n\t\t\tthis.tests[type](shareable).then(\n\t\t\t\t(supported) => {\n\t\t\t\t\td.resolve(supported);\n\t\t\t\t},\n\t\t\t\t(err) => {\n\t\t\t\t\td.resolve(false);\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\td.resolve(supported);\n\t\t}\n\n\t\treturn d.promise();\n\t}\n\n\t/**\n\t * waitForDAM: poll the DAM for status on a method call, and resolve a promise when it finishes.\n\t */\n\twaitForDam(uuid, doneTest, opts) {\n\t\tvar d = new $.Deferred();\n\n\t\t// TODO: there ought to be a simpler pattern for this. We need to either resolve\n\t\t// or reject the promise based on which event we get back. But we also need to\n\t\t// not leave extra handlers attached.\n\t\tvar resolve, reject;\n\t\tresolve = function (arg) {\n\t\t\tdispatcher.off('share:rpc:error', reject);\n\t\t\td.resolve(arg);\n\t\t};\n\t\treject = function (err) {\n\t\t\tdispatcher.off('share:rpc:error', resolve);\n\t\t\td.reject(err);\n\t\t};\n\t\tdispatcher.once(\n\t\t\t'share:rpc:complete share:rpc:donePolling share:rpc:stoppedPolling',\n\t\t\tresolve,\n\t\t);\n\t\tdispatcher.once('share:rpc:error', reject);\n\n\t\tdispatcher.trigger('share:poll', 'rpc', uuid, doneTest, opts);\n\n\t\treturn d.promise();\n\t}\n\n\t/**\n\t * rpcAndWait: general-purpose function for sharing methods that trigger the creation of a shareBean.\n\t * Returns a promise.\n\t *\n\t * It calls an rpc method to prepare a share,\n\t * polls status until that share is prepared,\n\t * then resolves its promise.\n\t *\n\t */\n\trpcAndWait(method, context) {\n\t\tvar d = new $.Deferred();\n\n\t\tvar rpcMethod;\n\n\t\tif (_.isString(method) && _.isFunction(this[method])) {\n\t\t\trpcMethod = this[method];\n\t\t} else if (_.isFunction(method)) {\n\t\t\tif (_.isObject(context)) {\n\t\t\t\trpcMethod = _.bind(method, context);\n\t\t\t} else {\n\t\t\t\trpcMethod = method;\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error('rpcAndWait: bad argument: ' + method);\n\t\t}\n\n\t\trpcMethod()\n\t\t\t.fail(d.reject)\n\t\t\t.done(\n\t\t\t\t_.bind(function () {\n\t\t\t\t\tthis.waitForDam()\n\t\t\t\t\t\t.fail(d.reject)\n\t\t\t\t\t\t.done(function (arg) {\n\t\t\t\t\t\t\td.resolve(arg);\n\t\t\t\t\t\t});\n\t\t\t\t}, this),\n\t\t\t);\n\n\t\treturn d.promise();\n\t}\n\n\t/**\n\t * rpcAndShare: a wrapper around everything from first RPC call to getStatus().\n\t */\n\trpcAndShare(method, context) {\n\t\tvar d = $.Deferred();\n\n\t\tvar fail = function (err) {\n\t\t\td.reject(err);\n\t\t};\n\n\t\tthis.rpcAndWait(method, context)\n\t\t\t.fail(fail)\n\t\t\t.done(\n\t\t\t\t_.bind(function () {\n\t\t\t\t\tthis.getShareData()\n\t\t\t\t\t\t.fail(fail)\n\t\t\t\t\t\t.done(\n\t\t\t\t\t\t\t_.bind(function () {\n\t\t\t\t\t\t\t\tvar shareData = this.get('shareData');\n\t\t\t\t\t\t\t\tif (shareData.warningMessage) {\n\t\t\t\t\t\t\t\t\tvar msgText = shareData.warningMessage;\n\t\t\t\t\t\t\t\t\tdispatcher.once('share:rpcAndShare:confirmed', d.resolve);\n\t\t\t\t\t\t\t\t\tdispatcher.once('share:rpcAndShare:cancelled', d.reject);\n\n\t\t\t\t\t\t\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\t\t\t\t\t\t\tmessage: shareData.warningMessage,\n\t\t\t\t\t\t\t\t\t\tdetails: shareData.messages, // TODO: show this somehow in the confirmView template\n\t\t\t\t\t\t\t\t\t\teventStr: 'share:rpcAndShare',\n\t\t\t\t\t\t\t\t\t\tyesLabel: 'continue',\n\t\t\t\t\t\t\t\t\t\tnoLabel: 'cancel',\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\td.resolve();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, this),\n\t\t\t\t\t\t);\n\t\t\t\t}, this),\n\t\t\t);\n\n\t\treturn d.promise();\n\t}\n\n\t// some generic RPC result handlers:\n\tfail(e) {\n\t\tdispatcher.trigger('share:' + this.get('name') + ':error', e);\n\t}\n\n\tdone(d) {\n\t\tdispatcher.trigger('share:' + this.get('name') + ':success', d);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ShareWay';\n\t}\n}\n\n/**\n * Netx.ShareWays holds the initial set of shareWay instances defined by the share module.\n * Other modules that want to define shareWays will need the share module to load first.\n */\n\nexport class ShareWay_download extends ShareWay {\n\tget defaults() {\n\t\treturn {\n\t\t\tlabel: 'download',\n\t\t\tname: 'download',\n\t\t};\n\t}\n\n\tget handlers() {\n\t\tconst self = this;\n\t\treturn {\n\t\t\tassetSet(shareData, ids, assetSet) {\n\t\t\t\t// Tell the server to create the download.\n\t\t\t\t// Stop using protected names as variables `set`\n\t\t\t\tassetSet\n\t\t\t\t\t.prepareDownload(\n\t\t\t\t\t\tshareData.downloadOptions,\n\t\t\t\t\t\tshareData.filename || _.uniqueId('download_'),\n\t\t\t\t\t\tJSON.stringify(shareData.justification),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// disable default BRC exception handler ... by replacing it with a null function! (hmm.)\n\t\t\t\t\t\t\terror: function () {},\n\t\t\t\t\t\t\t// that lets our reject handlers work (below ) to deal with justify/approval\n\t\t\t\t\t\t\t// TODO: move that logic into share controller.\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\t.then(\n\t\t\t\t\t\t(uuid) => {\n\t\t\t\t\t\t\t// success handler\n\t\t\t\t\t\t\tself\n\t\t\t\t\t\t\t\t.waitForDam(uuid, function () {\n\t\t\t\t\t\t\t\t\t// Workaround for DAM-4175\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\tthis.get('percentComplete') >= 100 &&\n\t\t\t\t\t\t\t\t\t\tthis.get('completeUrl') && // DAM started sending NULL here, bleh.\n\t\t\t\t\t\t\t\t\t\tthis.get('completeUrl').length > 0\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\t\t\t\t// Deal with warnings:\n\t\t\t\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t\t\t\t'share:download:done',\n\t\t\t\t\t\t\t\t\t\t\tNetx.share.status,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t// Would be cool to fire off some standard events\n\t\t\t\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t\t\t\t'share:download:success',\n\t\t\t\t\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t\t\t\t\t\tshareData.downloadOptions,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tfunction (err) {\n\t\t\t\t\t\t\t\t\t\tdispatcher.trigger('share:download:error', err);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfunction (err, status) {\n\t\t\t\t\t\t\t// error handler -- might be a justification or approval complaint.\n\t\t\t\t\t\t\tif (err.code == 220) {\n\t\t\t\t\t\t\t\t// were we rejected for justification?\n\t\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t\t'share:download:rejected:justify',\n\t\t\t\t\t\t\t\t\terr,\n\t\t\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t\t\t\tshareData.downloadOptions,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t// Technically this was a success (As far as anything else is concerned)?\n\t\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t\t'share:download:success',\n\t\t\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t\t\t\tshareData.downloadOptions,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else if (err.code == 221) {\n\t\t\t\t\t\t\t\t// is approval required?\n\t\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t\t'share:download:rejected:approve',\n\t\t\t\t\t\t\t\t\terr,\n\t\t\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t\t\t\tshareData.downloadOptions,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t// Technically this was a success (As far as anything else is concerned)?\n\t\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t\t'share:download:success',\n\t\t\t\t\t\t\t\t\tassetSet,\n\t\t\t\t\t\t\t\t\tshareData.downloadOptions,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else if (err.code == 4005) {\n\t\t\t\t\t\t\t\t// No assets to download\n\t\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t\t'app:alert',\n\t\t\t\t\t\t\t\t\ti18n.t('i18n.noAssetsFound'),\n\t\t\t\t\t\t\t\t\ti18n.t('i18n.error'),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tdispatcher.trigger('share:download:error', err);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// I don't know what happened\n\t\t\t\t\t\t\t\tdispatcher.trigger('app:alert', err, i18n.t('i18n.error'));\n\t\t\t\t\t\t\t\t// Would be cool to fire off some standard events and fire off the app alert in the controller listening\n\t\t\t\t\t\t\t\tdispatcher.trigger('share:download:error', err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t},\n\n\t\t\tassets(shareData, ids) {\n\t\t\t\t// TODO: if it's just a single asset, can we skip the prep step?\n\t\t\t\tself.prepareAssetsArgs.assetIds = ids;\n\t\t\t\tself.rpcAndShare('prepareAssets').done(() => {\n\t\t\t\t\t// get the path to the share, and trigger a download\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\t\tself.get('shareData').path,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t'saved cart'(shareData, ids) {\n\t\t\t\tself.prepareCartId = ids[0];\n\t\t\t\tself.rpcAndShare('prepareCart').done(() => {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\t\tself.get('shareData').path,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t'current cart'(shareData, ids) {\n\t\t\t\tself.prepareCartId = 0;\n\t\t\t\tself.rpcAndShare('prepareCart').done(() => {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\t\tself.get('shareData').path,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t'current cart metadata'(shareData, ids) {\n\t\t\t\tself.prepareCartId = 0;\n\t\t\t\tself.rpcAndShare(Netx.cart.current.exportMetadata).done(() => {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\t\tself.get('shareData').path,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t'assets PDF'() {\n\t\t\t\tself.getShareData().done(() => {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\t\tthis.get('shareData').path,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t'assets repurposed'(...args) {\n\t\t\t\t// exactly the same:\n\t\t\t\tthis['assets PDF'](...args);\n\t\t\t},\n\n\t\t\tstatQuery(shareData) {\n\t\t\t\tself.rpcAndShare('getShareData').done(() => {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\t\tself.get('shareData').path,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tsystemLogs(shareData) {\n\t\t\t\tself.rpcAndShare('getShareData').done(() => {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\t\tthis.get('shareData').path,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tusers(shareData) {\n\t\t\t\tself.rpcAndShare('getShareData').done(() => {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'share:simpleDownload',\n\t\t\t\t\t\tthis.get('shareData').path,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n}\nexport class ShareWay_email extends ShareWay {\n\tget defaults() {\n\t\treturn _.extend(super.defaults, {\n\t\t\tlabel: i18n.t('i18n.emailLink'),\n\t\t\tname: 'email',\n\t\t});\n\t}\n\n\tget methods() {\n\t\treturn _.extend(super.methods, {\n\t\t\t_emailAssets: ['shareEmail', 'emailArgs'],\n\t\t});\n\t}\n\n\tget handlers() {\n\t\tconst self = this;\n\t\treturn {\n\t\t\tassets(shareData, ids) {\n\t\t\t\t// verify this here, or in the form? I say in the form.\n\t\t\t\t_.extend(\n\t\t\t\t\tself.emailArgs,\n\t\t\t\t\tself.defaultEmailArgs,\n\t\t\t\t\t_.pick(shareData, _.keys(self.defaultEmailArgs)),\n\t\t\t\t);\n\n\t\t\t\t// Tell the DAM to prepare the assets\n\t\t\t\t// Wait for that to finish, then send email.\n\t\t\t\t// (No need to fetch the sharebean here. The email will use the most recent assetShare.)\n\t\t\t\tself.prepareAssetsArgs.assetIds = ids;\n\t\t\t\tself.rpcAndWait('prepareAssets').done(_.bind(self.emailAssets, self));\n\t\t\t},\n\n\t\t\t'saved cart'(shareData, ids) {\n\t\t\t\t_.extend(\n\t\t\t\t\tself.emailArgs,\n\t\t\t\t\tself.defaultEmailArgs,\n\t\t\t\t\t_.pick(shareData, _.keys(self.defaultEmailArgs)),\n\t\t\t\t);\n\t\t\t\tself.prepareCartId = ids[0];\n\t\t\t\tself.rpcAndShare('prepareCart').done(_.bind(self.emailAssets, self));\n\t\t\t},\n\n\t\t\t'current cart'(shareData, ids) {\n\t\t\t\t_.extend(\n\t\t\t\t\tself.emailArgs,\n\t\t\t\t\tself.defaultEmailArgs,\n\t\t\t\t\t_.pick(shareData, _.keys(self.defaultEmailArgs)),\n\t\t\t\t);\n\t\t\t\tself.prepareCartId = 0; // 0 == current cart\n\t\t\t\tself.rpcAndShare('prepareCart').done(_.bind(self.emailAssets, self));\n\t\t\t},\n\n\t\t\t'current cart metadata'(shareData, ids) {\n\t\t\t\t_.extend(\n\t\t\t\t\tself.emailArgs,\n\t\t\t\t\tself.defaultEmailArgs,\n\t\t\t\t\t_.pick(shareData, _.keys(self.defaultEmailArgs)),\n\t\t\t\t);\n\t\t\t\tself.prepareCartId = 0; // 0 == current cart\n\t\t\t\tself\n\t\t\t\t\t.rpcAndShare(Netx.cart.current.exportMetadata)\n\t\t\t\t\t.done(_.bind(self.emailAssets, self));\n\t\t\t},\n\n\t\t\t'assets PDF'(shareData, ids) {\n\t\t\t\t// The prep stage has already happened by the time we get here, so it's this easy:\n\t\t\t\t_.extend(\n\t\t\t\t\tself.emailArgs,\n\t\t\t\t\tself.defaultEmailArgs,\n\t\t\t\t\t_.pick(shareData, _.keys(self.defaultEmailArgs)),\n\t\t\t\t);\n\t\t\t\tself.emailAssets();\n\t\t\t},\n\n\t\t\t'assets repurposed'(...args) {\n\t\t\t\t// exactly the same:\n\t\t\t\tthis['assets PDF'].apply(...args);\n\t\t\t},\n\n\t\t\tstatQuery(shareData) {\n\t\t\t\t_.extend(\n\t\t\t\t\tself.emailArgs,\n\t\t\t\t\tself.defaultEmailArgs,\n\t\t\t\t\t_.pick(shareData, _.keys(self.defaultEmailArgs)),\n\t\t\t\t);\n\t\t\t\tself.rpcAndShare('getShareData').done(_.bind(self.emailAssets, self));\n\t\t\t},\n\n\t\t\tsystemLogs(shareData) {\n\t\t\t\t_.extend(\n\t\t\t\t\tself.emailArgs,\n\t\t\t\t\tself.defaultEmailArgs,\n\t\t\t\t\t_.pick(shareData, _.keys(self.defaultEmailArgs)),\n\t\t\t\t);\n\t\t\t\tself.rpcAndShare('getShareData').done(_.bind(self.emailAssets, self));\n\t\t\t},\n\n\t\t\tusers(shareData) {\n\t\t\t\t_.extend(\n\t\t\t\t\tself.emailArgs,\n\t\t\t\t\tself.defaultEmailArgs,\n\t\t\t\t\t_.pick(shareData, _.keys(self.defaultEmailArgs)),\n\t\t\t\t);\n\t\t\t\tself.rpcAndShare('getShareData').done(_.bind(self.emailAssets, self));\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(attrs, opts = {}) {\n\t\tsuper(attrs, opts);\n\n\t\tthis.defaultEmailArgs = {\n\t\t\tautoCc: '', // RPC needs this field, but it's not in the UI. What does it mean?\n\t\t\tcustomType: 1, // include attribute data? 1=yes, 0=no\n\t\t\temailCc: '',\n\t\t\temailFrom: '',\n\t\t\temailNotes: '',\n\t\t\temailSubject: '',\n\t\t\temailTo: '',\n\t\t\ttype: 0, // How to encode in email? 1=attachment, 0=link\n\t\t};\n\n\t\tthis.emailArgs = _.extend({}, opts.emailArgs);\n\t}\n\n\temailAssets() {\n\t\treturn this._emailAssets()\n\t\t\t.fail(this.fail)\n\t\t\t.done((msg) => {\n\t\t\t\tdispatcher.trigger('app:alert', msg, 'Info');\n\t\t\t\tthis.done();\n\t\t\t});\n\t}\n}\nexport class ShareWay_mediaService extends ShareWay {\n\tget defaults() {\n\t\treturn _.extend(super.defaults, {\n\t\t\tlabel: 'Publish',\n\t\t\tname: 'mediaService',\n\t\t});\n\t}\n\n\tget handlers() {\n\t\tconst self = this;\n\t\treturn {\n\t\t\tassets(shareData, ids) {\n\t\t\t\tself.prepareAssetsArgs.assetIds = ids;\n\t\t\t\tself.rpcAndShare('prepareAssets').then(() => {\n\t\t\t\t\t_.each(shareData, (share, k) => {\n\t\t\t\t\t\tif (!share) return;\n\t\t\t\t\t\tlet mediaService = Netx.share.mediaServices.findWhere({id: k});\n\t\t\t\t\t\tif (!mediaService) return;\n\t\t\t\t\t\tmediaService.assetIds = ids.slice(0, 10);\n\t\t\t\t\t\tmediaService.share().then((uuid) => {\n\t\t\t\t\t\t\t// dispatcher.trigger('app:pollBatchJob', uuid, 'share:assets:media:service', false, [ mediaService.get('id') ] );\n\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t'share:assets:media:service:complete',\n\t\t\t\t\t\t\t\tuuid,\n\t\t\t\t\t\t\t\tmediaService,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\t'current cart'(shareData, ids) {\n\t\t\t\tself.prepareCartId = 0;\n\t\t\t\tself.rpcAndShare('prepareCart').then(() => {\n\t\t\t\t\t_.each(shareData, (share, k) => {\n\t\t\t\t\t\tif (!share) return;\n\t\t\t\t\t\tlet mediaService = Netx.share.mediaServices.findWhere({id: k});\n\t\t\t\t\t\tif (!mediaService) return;\n\t\t\t\t\t\t//mediaService.assetIds = ids.slice( 0, 10 );\n\t\t\t\t\t\tmediaService.assetIds = Netx.cart.current.inspection.videoAssetIds.slice(\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tmediaService.share().then((uuid) => {\n\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t'app:pollBatchJob',\n\t\t\t\t\t\t\t\tuuid,\n\t\t\t\t\t\t\t\t'share:cart:current:media:service',\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t[mediaService.get('id')],\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\t'saved cart'(shareData, ids) {\n\t\t\t\tself.prepareCartId = ids[0];\n\t\t\t\tself.rpcAndShare('prepareCart').then(() => {\n\t\t\t\t\t_.each(shareData, (share, k) => {\n\t\t\t\t\t\tif (!share) return;\n\t\t\t\t\t\tlet mediaService = Netx.share.mediaServices.findWhere({id: k});\n\t\t\t\t\t\tif (!mediaService) return;\n\t\t\t\t\t\tNetx.cart.saved.all\n\t\t\t\t\t\t\t.get(ids[0])\n\t\t\t\t\t\t\t.inspect()\n\t\t\t\t\t\t\t.then(function (inspection) {\n\t\t\t\t\t\t\t\tmediaService.assetIds = inspection.videoAssetIds.slice(0, 10);\n\t\t\t\t\t\t\t\tmediaService.share().then((uuid) => {\n\t\t\t\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t\t\t\t'app:pollBatchJob',\n\t\t\t\t\t\t\t\t\t\tuuid,\n\t\t\t\t\t\t\t\t\t\t'share:cart:saved:media:service',\n\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\t[mediaService.get('id'), this.prepareCartId],\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n\n\tget tests() {\n\t\treturn {\n\t\t\tassets(shareable) {\n\t\t\t\t// Vars\n\t\t\t\tvar assets,\n\t\t\t\t\td = new $.Deferred(),\n\t\t\t\t\tvideoAssets;\n\n\t\t\t\tif (!Netx.share.mediaServices.authenticated) {\n\t\t\t\t\t// disable if no services are authenticated yet.\n\t\t\t\t\td.reject();\n\t\t\t\t} else {\n\t\t\t\t\tassets = shareable.get('models');\n\t\t\t\t\tvideoAssets = [];\n\t\t\t\t\t_.each(\n\t\t\t\t\t\tassets,\n\t\t\t\t\t\tfunction (asset) {\n\t\t\t\t\t\t\tif (_.indexOf(asset.get('fileFormatFamily'), 'video') > -1)\n\t\t\t\t\t\t\t\tvideoAssets.push(asset);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis,\n\t\t\t\t\t);\n\n\t\t\t\t\td.resolve(videoAssets.length === assets.length);\n\t\t\t\t}\n\n\t\t\t\treturn d.promise();\n\t\t\t},\n\t\t\t'current cart'(shareable) {\n\t\t\t\t// Vars\n\t\t\t\tconst deferred = new $.Deferred();\n\n\t\t\t\tif (!Netx.share.mediaServices.authenticated) {\n\t\t\t\t\t// disable if no services are authenticated yet.\n\t\t\t\t\tdeferred.reject();\n\t\t\t\t} else {\n\t\t\t\t\tconst cart = Netx.cart.current;\n\n\t\t\t\t\tcart.inspect().then(function (inspection) {\n\t\t\t\t\t\tdeferred.resolve(\n\t\t\t\t\t\t\tinspection.videoAssetIds.length === cart.assetCount(),\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn deferred.promise();\n\t\t\t},\n\t\t\t'saved cart'(shareable) {\n\t\t\t\t// Vars\n\t\t\t\tvar cart,\n\t\t\t\t\td = new $.Deferred();\n\n\t\t\t\tif (!Netx.share.mediaServices.authenticated) {\n\t\t\t\t\t// disable if no services are authenticated yet.\n\t\t\t\t\td.reject();\n\t\t\t\t} else {\n\t\t\t\t\t//console.log( cart );\n\t\t\t\t\tcart = new CartAssetsCollection([]);\n\t\t\t\t\tcart.setCartId(shareable.get('ids')[0]);\n\t\t\t\t\tcart.fetch().then(\n\t\t\t\t\t\t_.bind(function () {\n\t\t\t\t\t\t\tcart.inspect().then(function (inspection) {\n\t\t\t\t\t\t\t\td.resolve(inspection.videoAssetIds.length === cart.length);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}, this),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn d.promise();\n\t\t\t},\n\t\t};\n\t}\n}\nexport class ShareWay_publicLink extends ShareWay {\n\tget defaults() {\n\t\treturn _.extend(super.defaults, {\n\t\t\tlabel: 'create public link',\n\t\t\tname: 'publicLink',\n\t\t});\n\t}\n\n\tget handlers() {\n\t\tconst self = this;\n\t\treturn {\n\t\t\tassets(form, ids) {\n\t\t\t\tself.linkHandler(form, ids);\n\t\t\t},\n\n\t\t\t'saved cart'(form, ids) {\n\t\t\t\tself.linkHandler(form, ids);\n\t\t\t},\n\n\t\t\t'saved search'(form, ids) {\n\t\t\t\tself.linkHandler(form, ids);\n\t\t\t},\n\t\t};\n\t}\n\n\tlinkHandler(form, ids) {\n\t\t// the ids data is already in the form. Punt to link edit controller:\n\t\tdispatcher.trigger(\n\t\t\t'publicLink:save:confirmed',\n\t\t\tform,\n\t\t\tnew PublicLinkModel(),\n\t\t);\n\t}\n}\nexport class ShareWay_user extends ShareWay {\n\tget defaults() {\n\t\treturn _.extend(super.defaults, {\n\t\t\tlabel: 'share internally',\n\t\t\tname: 'user',\n\t\t});\n\t}\n\n\tget handlers() {\n\t\tconst self = this;\n\t\treturn {\n\t\t\t'saved search'(form, ids, shareable) {\n\t\t\t\tself.shareSavedThing(form, ids, shareable);\n\t\t\t} /*,\n\t\t\t'saved cart': function(form, ids, shareable){\n\t\t\t\tthis.shareSavedThing(form, ids, shareable);\n\t\t\t}*/,\n\t\t};\n\t}\n\n\t//\n\t// The old-style cart sharing was orthagonal to the search sharing, and this\n\t// method handled both of them. Now it's just used for search sharing.\n\t//\n\tshareSavedThing(form, ids, shareable) {\n\t\tvar id = ids[0];\n\n\t\tvar thing, thingCache, thingLabel;\n\t\tswitch (shareable.get('type')) {\n\t\t\tcase 'saved search':\n\t\t\t\tthing = new SavedSearchModel({id: id});\n\t\t\t\tthingCache = Netx.search.saved.all;\n\t\t\t\tthingLabel = 'search';\n\t\t\t\tbreak;\n\t\t\tcase 'saved cart':\n\t\t\t\tthing = new SavedCartModel({id: id});\n\t\t\t\tthingCache = Netx.cart.saved.all;\n\t\t\t\tthingLabel = 'cart';\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// copy these form values directly to the model\n\t\tthing.set(_.pick(form, ['shareEmail', 'shareNote']));\n\n\t\tif (shareable.models && shareable.models.length) {\n\t\t\tthing.set({shareTitle: shareable.models[0].getLabel()});\n\t\t} else if (thingCache.get(id)) {\n\t\t\tthing.set({shareTitle: thingCache.get(id).getLabel()});\n\t\t} else {\n\t\t\tthing.set({shareTitle: 'Shared ' + shareable.type + ' ' + id});\n\t\t}\n\n\t\t// the DAM has different API methods for group and user sharing ...\n\t\tvar shareFunction =\n\t\t\tform.shareType == 'group' ? 'shareWithGroup' : 'shareWithUser';\n\n\t\tthing[shareFunction]().then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('share:internal:success', thing);\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'share',\n\t\t\t\t\ttitle: i18n.t('i18n.sharing', {defaultValue: 'Sharing'}),\n\t\t\t\t\tdescription: i18n.t('i18n.yourThingWasShared', {\n\t\t\t\t\t\tdefaultValue: 'You __thing__ __title__ was shared',\n\t\t\t\t\t\tthing: thingLabel,\n\t\t\t\t\t\ttitle: thing.get('shareTitle'),\n\t\t\t\t\t}),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'app:alert',\n\t\t\t\t\terr,\n\t\t\t\t\ti18n.t('i18n.error', {defaultValue: 'Error'}),\n\t\t\t\t);\n\t\t\t\tdispatcher.trigger('share:internal:error', thing);\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport const ShareWays = {\n\tdownload: new ShareWay_download(),\n\n\temail: new ShareWay_email(),\n\n\tmediaService: new ShareWay_mediaService(),\n\n\tpublicLink: new ShareWay_publicLink(),\n\n\tuser: new ShareWay_user(),\n};\n\nNetx.ShareWays = ShareWays;\n","export {default} from '@netx/core-share/models/shareWays';\n\n// Extend core\nNetx.ShareWays.email.emailAssets = () => {\n\treturn this._emailAssets()\n\t\t.fail(this.fail)\n\t\t.done((msg) => {\n\t\t\tdispatcher.trigger('app:passiveAlert', {\n\t\t\t\tmessage: msg,\n\t\t\t\tclassName: 'alert alert-success',\n\t\t\t});\n\t\t\tthis.done();\n\t\t});\n};\n","/**\n * Share module\n */\n\nimport actions from './actions';\nimport menus from './menus';\nimport controller from './controller';\n// TODO: remove when share ways are no more\nimport shareWays from '@netx/core-share/models/shareWays';\n\n/**\n * @property {object} exports - Our module exports\n * @property {string} exports.namespace - Module namespace\n * @property {function} exports.initialize - Module initializer\n */\nexport default {\n\tnamespace: 'share',\n\tinitialize() {\n\t\t// Register actions\n\t\tNetx.Actions.Register(actions);\n\t\t// Extend menus\n\t\tNetx.addMenus(menus);\n\n\t\treturn controller.initialize();\n\t},\n};\n","import {\n\tassetInCart,\n\tassetNotInCart,\n\tassetsAreSelected,\n\tcanManageArchive,\n\tcanManageAssetExpiration,\n\tcanRemoveCartPermission,\n\tcanRepurpose,\n\tcartCanCreateTMSObject,\n} from './enablers';\n\nimport {\n\tallowsDelete,\n\tcollectionNotEmpty,\n\treviewEnabled,\n\tnotMobile,\n} from '@netx/core/lib/netx-enablers';\n\nimport {assetExpirationEnabled} from '@netx/core-asset/enablers';\n\nimport {getViewModel} from '@netx/core/lib/utils';\n\nexport default [\n\t/** @action */\n\t{\n\t\tevent: 'cart:add',\n\t\tlabel: i18n.t('i18n.addToCart'),\n\t\tenableTest: assetNotInCart,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:add:assets:to:category',\n\t\tlabel: i18n.t('i18n.addToCategory'),\n\t\tuserLevel: 4,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:addAll',\n\t\tlabel: i18n.t('i18n.addAllToSelection'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:addPage',\n\t\tlabel: i18n.t('i18n.addPageToCart'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:route',\n\t\tlabel: i18n.t('i18n.viewAll'),\n\t\troute: 'cart',\n\t},\n\n\t////////////////////////////////\n\t// ARCHIVING\n\t////////////////////////////////\n\t/** @action */\n\t{\n\t\tevent: 'cart:manage:assets:archive',\n\t\tlabel: i18n.t('i18n.manageArchive'),\n\t\tuserLevel: 8,\n\t\ttestOnSync: true,\n\t\tenableTest: [assetsAreSelected, canManageArchive],\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:assets:archive',\n\t\tlabel: i18n.t('i18n.archive'),\n\t\ttestOnSync: true,\n\t\tuserLevel: 8,\n\t\tenableTest: [assetsAreSelected, canManageArchive],\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:assets:unarchive',\n\t\tlabel: i18n.t('i18n.unarchive'),\n\t\ttestOnSync: true,\n\t\tuserLevel: 8,\n\t\tenableTest: [assetsAreSelected, canManageArchive],\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:manage:assets:archive',\n\t\tlabel: i18n.t('i18n.manageArchive'),\n\t\ttestOnSync: true,\n\t\tuserLevel: 8,\n\t\tenableTest(view) {\n\t\t\t// Support option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\t// Check for existance of model - as there will not be one until a saved cart is actually loaded\n\t\t\treturn model && model.get('count') > 0 && canManageArchive(view);\n\t\t},\n\t\twrapper(view, e) {\n\t\t\t// Support option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\treturn [model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:assets:archive',\n\t\tlabel: i18n.t('i18n.archive'),\n\t\ttestOnSync: true,\n\t\tuserLevel: 8,\n\t\tenableTest(view) {\n\t\t\t// Support option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\t// Check for existance of model - as there will not be one until a saved cart is actually loaded\n\t\t\treturn model && model.get('count') > 0 && canManageArchive(view);\n\t\t},\n\t\twrapper(view, e) {\n\t\t\t// Support option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\treturn [model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:assets:unarchive',\n\t\tlabel: i18n.t('i18n.unarchive'),\n\t\ttestOnSync: true,\n\t\tuserLevel: 8,\n\t\tenableTest(view) {\n\t\t\t// Support option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\t// Check for existance of model - as there will not be one until a saved cart is actually loaded\n\t\t\treturn model && model.get('count') > 0 && canManageArchive(view);\n\t\t},\n\t\twrapper(view, e) {\n\t\t\t// Support option tiles\n\t\t\tvar model = view.data && view.data.model ? view.data.model : view.model;\n\t\t\treturn [model, e];\n\t\t},\n\t},\n\t////////////////////////////////\n\t// !ARCHIVING\n\t////////////////////////////////\n\n\t/** @action */\n\t{\n\t\tevent: 'cart:categorize',\n\t\tlabel: i18n.t('i18n.organize'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 7,\n\t\tmatrix: 'modify',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:create:tmsObjectPackage',\n\t\tlabel: i18n.t('i18n.createObjectPackageInTMS'),\n\t\tenableTest: cartCanCreateTMSObject,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, e];\n\t\t},\n\t},\n\t/** @action */\n\t// DEVNOTE: cart:delete is unfortunately a vague action name; it doesn't delete a cart, it deletes all the assets in the current cart.\n\t{\n\t\tevent: 'cart:delete',\n\t\tlabel: i18n.t('i18n.delete'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 7,\n\t\tmatrix: 'delete',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:delink',\n\t\tlabel: i18n.t('i18n.delink'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:duplicate',\n\t\tlabel: i18n.t('i18n.duplicateCart'),\n\t\twrapper(view, e) {\n\t\t\treturn view.model\n\t\t\t\t? [view.model, e]\n\t\t\t\t: Netx.cart.saved.all\n\t\t\t\t\t\t.getCart(view.collection.id)\n\t\t\t\t\t\t.then(function(savedCart) {\n\t\t\t\t\t\t\treturn [savedCart, e];\n\t\t\t\t\t\t});\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:empty',\n\t\tlabel: i18n.t('i18n.clearCart'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t},\n\n\t////////////////////////////////\n\t// EXPIRATION\n\t////////////////////////////////\n\t/** @action */\n\t{\n\t\tevent: 'cart:manage:assets:expire',\n\t\tlabel: i18n.t('i18n.manageAssetExpiration'),\n\t\tuserLevel: 7,\n\t\tenableTest: [assetsAreSelected, assetExpirationEnabled],\n\t\ttestOnSync: true,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:assets:expire',\n\t\tlabel: i18n.t('i18n.expireAssets'),\n\t\tuserLevel: 7,\n\t\tenableTest: [assetsAreSelected, assetExpirationEnabled],\n\t\ttestOnSync: true,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:assets:unexpire',\n\t\tlabel: i18n.t('i18n.unexpireAssets'),\n\t\tuserLevel: 7,\n\t\tenableTest: [assetsAreSelected, assetExpirationEnabled],\n\t\ttestOnSync: true,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:manage:assets:expire',\n\t\tlabel: i18n.t('i18n.manageAssetExpiration'),\n\t\tuserLevel: 7,\n\t\ttestOnSync: true,\n\t\tenableTest: canManageAssetExpiration,\n\t\twrapper(view, e) {\n\t\t\treturn [getViewModel(view)];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:assets:expire',\n\t\tlabel: i18n.t('i18n.expireAssets'),\n\t\tuserLevel: 7,\n\t\ttestOnSync: true,\n\t\tenableTest: canManageAssetExpiration,\n\t\twrapper(view, e) {\n\t\t\treturn [getViewModel(view)];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:assets:unexpire',\n\t\tlabel: i18n.t('i18n.unexpireAssets'),\n\t\tuserLevel: 7,\n\t\ttestOnSync: true,\n\t\tenableTest: canManageAssetExpiration,\n\t\twrapper(view, e) {\n\t\t\treturn [getViewModel(view)];\n\t\t},\n\t},\n\t////////////////////////////////\n\t// !EXPIRATION\n\t////////////////////////////////\n\n\t////////////////////////////////\n\t// PROJECTS\n\t////////////////////////////////\n\t/**\n\t * Add to or create project from current cart\n\t * @action\n\t */\n\t{\n\t\tevent: 'cart:project',\n\t\tlabel: i18n.t('i18n.review'),\n\t\ttestOnSync: true,\n\t\tenableTest: [notMobile, collectionNotEmpty, reviewEnabled],\n\t},\n\t/**\n\t * Add current cart to project\n\t * @action\n\t */\n\t{\n\t\tevent: 'cart:project:add',\n\t\tlabel: i18n.t('i18n.addCartToProject'),\n\t\tenableTest: [notMobile, collectionNotEmpty, reviewEnabled],\n\t},\n\t/**\n\t * Create project from current cart\n\t * @action\n\t */\n\t{\n\t\tevent: 'cart:project:new',\n\t\tlabel: i18n.t('i18n.newProjectFromCart'),\n\t\tenableTest: [notMobile, collectionNotEmpty, reviewEnabled],\n\t},\n\t/**\n\t * Add to or create project from saved cart\n\t * @action\n\t */\n\t{\n\t\tevent: 'cart:saved:project',\n\t\tlabel: i18n.t('i18n.review'),\n\t\tenableTest: [notMobile, collectionNotEmpty, reviewEnabled],\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/**\n\t * Add saved cart to project\n\t * @action\n\t */\n\t{\n\t\tevent: 'cart:saved:project:add',\n\t\tlabel: i18n.t('i18n.addSavedCartToProject'),\n\t\tenableTest: [notMobile, collectionNotEmpty, reviewEnabled],\n\t\twrapper(view) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t////////////////////////////////\n\t// !PROJECTS\n\t////////////////////////////////\n\n\t/** @action */\n\t{\n\t\tevent: 'cart:current:share:metadata',\n\t\tlabel: i18n.t('i18n.exportMetadata'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:link',\n\t\tlabel: i18n.t('i18n.link'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:move:assets:to:category',\n\t\tlabel: i18n.t('i18n.moveToCategory'),\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:relationships',\n\t\tlabel: i18n.t('i18n.relationships'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, view, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:remove',\n\t\tlabel: i18n.t('i18n.removeFromCart'),\n\t\tenableTest: assetInCart,\n\t\ttestOnSync: true,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:remove:assets:from:category',\n\t\tlabel: i18n.t('i18n.removeFromCategory'),\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:rename',\n\t\tlabel: i18n.t('i18n.renameCart'),\n\t\tmatrix: 'manage',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:replace',\n\t\tlabel: i18n.t('i18n.findReplace'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:repurpose',\n\t\tlabel: i18n.t('i18n.repurpose'),\n\t\tenableTest: canRepurpose,\n\t\ttestOnSync: true,\n\t\tuserLevel: 2,\n\t\tmatrix: 'download',\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:resync',\n\t\tlabel: i18n.t('i18n.resync'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 4,\n\t\tmatrix: 'modify',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:save',\n\t\tlabel: i18n.t('i18n.collect'),\n\t\tenableTest: collectionNotEmpty,\n\t\ttestOnSync: true,\n\t\tuserLevel: 1,\n\t},\n\t/**\n\t * @action\n\t * DAM-13712 - needs a wrapper when it's the only option,\n\t * in order to get auto-triggered, see 'app:showOptions'\n\t */\n\t{\n\t\tevent: 'cart:save:current',\n\t\tlabel: i18n.t('i18n.createNewCart'),\n\t\twrapper(view, e) {\n\t\t\treturn [view, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:collect',\n\t\tlabel: i18n.t('i18n.addToSavedCart'),\n\t\tenableTest() {\n\t\t\treturn Netx.cart.saved.all.hasEditableCarts();\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved',\n\t\tlabel: i18n.t('i18n.savedCart'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.id, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:route',\n\t\tlabel: i18n.t('i18n.savedCart'),\n\t\troute(id) {\n\t\t\treturn `cart-assets/${id}`;\n\t\t},\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.id, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:add:to:current:cart',\n\t\tlabel: i18n.t('i18n.addAllToSelection'),\n\t\twrapper(view, e) {\n\t\t\tif (!view.model) {\n\t\t\t\tif (window.location.hash.includes('cart-assets')) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tparseInt(window.location.hash.replace('#cart-assets/', '')),\n\t\t\t\t\t\te,\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\treturn [0, e];\n\t\t\t}\n\t\t\treturn [view.model.id, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:delete',\n\t\tlabel: i18n.t('i18n.deleteThisCart'),\n\t\ttestOnSync: true,\n\t\tenableTest: allowsDelete,\n\t\twrapper(view, e) {\n\t\t\tif (view.constructor.__isView__) {\n\t\t\t\treturn [view.model || view.collection, e];\n\t\t\t}\n\t\t\treturn [view, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:load',\n\t\tlabel: i18n.t('i18n.loadThisCart'),\n\t\twrapper(view, e) {\n\t\t\tif (view.constructor.__isView__) {\n\t\t\t\treturn [view.model || view.collection, e];\n\t\t\t}\n\t\t\treturn [view, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:permissions:remove',\n\t\tlabel: i18n.t('i18n.deletePermission'),\n\t\tenableTest: canRemoveCartPermission,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model.collection.cart, view.model];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:share:menu',\n\t\tlabel: i18n.t('i18n.sharethisCart'),\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:toggle',\n\t\tlabel: i18n.t('i18n.cartToggle'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.model, e];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:visibility',\n\t\tlabel: i18n.t('i18n.visibility'),\n\t\tuserLevel: 9,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:visibility:visible',\n\t\tlabel: i18n.t('i18n.setToVisible'),\n\t\tuserLevel: 9,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:visibility:hidden',\n\t\tlabel: i18n.t('i18n.setToHidden'),\n\t\tuserLevel: 9,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:testBatchForever',\n\t\tlabel: i18n.t(' endless batch job'),\n\t\twrapper(view, e) {\n\t\t\treturn [view.collection, e];\n\t\t},\n\t},\n];\n","import actions from '@netx/core-cart/actions';\nimport {extendActions} from '@netx/core/lib/underscore-netx';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {\n\tfaCopy,\n\tfaFileExport,\n\tfaICursor,\n\tfaInboxIn,\n\tfaPlus,\n\tfaPlusCircle,\n\tfaTimes,\n\tfaTrashAlt,\n} from '@fortawesome/pro-solid-svg-icons';\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaCopy: icon(faCopy, iconOpts).html,\n\tfaFileExport: icon(faFileExport, iconOpts).html,\n\tfaICursor: icon(faICursor, iconOpts).html,\n\tfaInboxIn: icon(faInboxIn, iconOpts).html,\n\tfaPlus: icon(faPlus, iconOpts).html,\n\tfaPlusCircle: icon(faPlusCircle, iconOpts).html,\n\tfaTimes: icon(faTimes, iconOpts).html,\n\tfaTrashAlt: icon(faTrashAlt, iconOpts).html,\n};\n\nimport {\n\tassetInCart,\n\tassetNotInCart,\n\tassetsAreSelected,\n\tcanAddAssetsToCart,\n\tcanRemoveAssetFromSavedCart,\n} from './enablers';\nimport {\n\tcollectionNotEmpty,\n\tisNotPublicUser,\n} from '@netx/core/lib/netx-enablers';\n\n// Extend actions defined in core file\nlet newActions = extendActions(actions, [\n\t/** @override */\n\t{\n\t\tevent: 'cart:current:share:metadata',\n\t\ticon: icons.faFileExport,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:duplicate',\n\t\ticon: icons.faCopy,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model || Netx.cart.saved.all.get(view.collection.id), e];\n\t\t},\n\t},\n\t/**\n\t * @action\n\t * @override\n\t */\n\t{\n\t\tevent: 'cart:rename',\n\t\ticon: icons.faICursor,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:save',\n\t\ticon: icons.faInboxIn,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:save:current',\n\t\ticon: 'plus',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:add:to:current:cart',\n\t\ticon: icons.faInboxIn,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:collect',\n\t\ticon: icons.faPlus,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:delete',\n\t\ticon: icons.faTrashAlt,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:add',\n\t\ticon: icons.faPlusCircle,\n\t\tlabel: i18n.t('i18n.addToCart'),\n\t\tenableTest: [assetNotInCart],\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:remove',\n\t\ticon: icons.faTimes,\n\t\tlabel: i18n.t('i18n.removeFromCart'),\n\t\tenableTest: [assetInCart],\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:resync',\n\t\tlabel: i18n.t('i18n.resync'),\n\t\ttestOnSync: true,\n\t\tuserLevel: 4,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:delete',\n\t\tlabel: i18n.t('i18n.deleteCart'),\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:addAll',\n\t\tenableTest: [collectionNotEmpty],\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:addPage',\n\t\tenableTest: [collectionNotEmpty],\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:permissions:remove',\n\t\tlabel: i18n.t('i18n.delete'),\n\t\ticon: icons.faTimes,\n\t\twrapper(v) {\n\t\t\treturn [v.model.collection.cart, v.model];\n\t\t},\n\t},\n]);\n\nif (_.isPublicUser()) {\n\t// Extend actions defined in core file\n\tnewActions = extendActions(newActions, [\n\t\t/** @action */\n\t\t{\n\t\t\tevent: 'cart:save',\n\t\t\ticon: icons.faInboxIn,\n\t\t\tenableTest: [collectionNotEmpty, isNotPublicUser],\n\t\t\tdisabledClass: 'hide',\n\t\t},\n\t]);\n}\n\n// New actions\nnewActions = newActions.concat([\n\t/** @action */\n\t{\n\t\tevent: 'cart:addSelected',\n\t\ticon: icons.faInboxIn,\n\t\tlabel: i18n.t('i18n.addToSavedCart'),\n\t\tenableTest: canAddAssetsToCart,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:removeSelected',\n\t\ticon: icons.faTimes,\n\t\tlabel: i18n.t('i18n.removeSelectedFromCart'),\n\t\tenableTest: assetsAreSelected,\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:removeAssets',\n\t\tlabel: i18n.t('i18n.removeFromSavedCart'),\n\t\tenableTest: canRemoveAssetFromSavedCart,\n\t\twrapper: function (view, e) {\n\t\t\treturn [Netx.cart.gallery, [view.model]];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:landing:all:route',\n\t\tlabel: i18n.t('i18n.all'),\n\t\troute: 'cart/saved/all',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:landing:own:route',\n\t\tlabel: i18n.t('i18n.own'),\n\t\troute: 'cart/saved/own',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:landing:shared:route',\n\t\tlabel: i18n.t('i18n.shared'),\n\t\troute: 'cart/saved/shared',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'cart:saved:empty',\n\t\tlabel: i18n.t('i18n.emptyCollection'),\n\t},\n\t{\n\t\tevent: 'cart:saveSelection',\n\t\tlabel: i18n.t('i18n.saveSelection'),\n\t},\n]);\n\nexport default newActions;\n","import Menu from '@netx/core/lib/netx-menu';\n\nexport default {\n\t/**\n\t * Operations on the current cart\n\t */\n\tcart: new Menu({\n\t\tactions: [\n\t\t\t'share:cart:current:createPDF',\n\t\t\t'cart:empty',\n\t\t\t'cart:categorize',\n\t\t\t'cart:save',\n\t\t\t'cart:repurpose',\n\t\t\t'cart:link',\n\t\t\t'cart:delink',\n\t\t\t'cart:delete',\n\t\t\t'cart:current:share:metadata',\n\t\t\t'cart:resync',\n\t\t\t// 'cart:testBatchForever',\n\t\t\t'cart:current:share:menu',\n\t\t],\n\t}),\n\tcartManageArchive: new Menu({\n\t\tlabel: i18n.t('i18n.manageArchive'),\n\t\tactions: ['cart:assets:archive', 'cart:assets:unarchive'],\n\t}),\n\tsavedCartManageArchive: new Menu({\n\t\tlabel: i18n.t('i18n.manageArchive'),\n\t\tactions: ['cart:saved:assets:archive', 'cart:saved:assets:unarchive'],\n\t}),\n\tcartExpirationActions: new Menu({\n\t\tlabel: i18n.t('i18n.currentCartAssetExpiration'),\n\t\tactions: ['cart:assets:expire', 'cart:assets:unexpire'],\n\t}),\n\t/**\n\t * Operations on a saved cart\n\t */\n\t// TODO: is this menu used? How do/should we deprecate entire menus?\n\tsavedCart: new Menu({\n\t\tactions: [\n\t\t\t'cart:repurpose',\n\t\t\t'cart:link',\n\t\t\t'cart:delink',\n\t\t\t'cart:resync',\n\t\t\t'cart:saved:load',\n\t\t\t'cart:saved:share:menu',\n\t\t\t'cart:saved:delete',\n\t\t],\n\t}),\n\tsavedCartExpirationActions: new Menu({\n\t\tlabel: i18n.t('i18n.savedCartAssetExpiration'),\n\t\tactions: ['cart:saved:assets:expire', 'cart:saved:assets:unexpire'],\n\t}),\n};\n","import menus from '@netx/core-cart/menus';\nimport Menu from '@netx/core/lib/netx-menu';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {faEllipsisV} from '@fortawesome/pro-solid-svg-icons';\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaEllipsisV: icon(faEllipsisV, iconOpts).html,\n};\n\n// Override asset context menu\nmenus.cart = new Menu({\n\tactions: [\n\t\t'share:cart:current:email',\n\t\t'share:cart:current:download',\n\t\t'share:cart:current:createPDF',\n\t\t'cart:current:share:metadata',\n\t\t'cart:empty',\n\t\t'cart:save',\n\t],\n});\n\n/**\n * Current cart actions menu\n * @menu\n */\nmenus.cartBarActions = new Menu({\n\tactions: [\n\t\t// works for current or saved\n\t\t'share:cart:download',\n\t\t'cart:save',\n\t\t'share:menu',\n\t\tnew Menu({\n\t\t\ticon: icons.faEllipsisV,\n\t\t\tactions: ['share:cart:current:createPDF', 'cart:current:share:metadata'],\n\t\t}),\n\t],\n});\n/**\n * Current cart actions menu\n * @menu\n */\nmenus.savedCartBarActions = new Menu({\n\tactions: ['cart:saved:delete', 'share:cart:saved:download', 'cart:rename'],\n});\n/**\n * Current cart actions menu for Mobile\n * @menu\n */\nmenus.cartBarActionsMobile = new Menu({\n\tactions: [\n\t\tnew Menu({\n\t\t\ticon: icons.faEllipsisV,\n\t\t\tactions: [\n\t\t\t\t'share:cart:download',\n\t\t\t\t'cart:save',\n\t\t\t\t'share:menu',\n\t\t\t\t'share:cart:current:createPDF',\n\t\t\t\t'cart:current:share:metadata',\n\t\t\t],\n\t\t}),\n\t],\n});\n\n// New menus\nObject.assign(menus, {\n\tsavedCollection: new Menu({\n\t\tactions: [\n\t\t\t'share:cart:createPDF',\n\t\t\t'share:cart:download',\n\t\t\t'share:menu',\n\t\t\t'cart:save',\n\t\t\t'cart:saved:delete',\n\t\t\t'cart:rename',\n\t\t],\n\t}),\n\n\t/**\n\t * Saved collection context actions menu\n\t * @menu\n\t */\n\tsavedCollectionContextMenu: new Menu({\n\t\tactions: [\n\t\t\t'cart:saved:add:to:current:cart',\n\t\t\t'share:cart:download',\n\t\t\t'share:cart:createPDF',\n\t\t\t'share:menu',\n\t\t\t['cart:rename', 'cart:duplicate', 'cart:saved:delete'],\n\t\t],\n\t}),\n\tcartHeaderActions: new Menu({\n\t\tactions: ['share:cart:download', 'share:cart:current'],\n\t}),\n\tcartSavedHeaderActions: new Menu({\n\t\tactions: [\n\t\t\t'nx:savedCart:duplicate',\n\t\t\t'share:cart:download',\n\t\t\t'share:cart:saved',\n\t\t],\n\t}),\n});\n\nexport default menus;\n","/**\n * @class\n */\nimport Base from '@netx/core-category/views/categoryTreeSelectView';\nimport Template from '../templates/addAssetsToCategoryView.html';\n\nexport default class AddAssetsToCategoryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.eventStr = opts.eventStr || 'cart:add:assets:to:category';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.addAssetToCategory');\n\t\topts.id = opts.id || 'add-asset-to-category-view';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tconst assetCount = this.collection.assetCount();\n\t\tthis.headerTitle = i18n.t('i18n.addAsset', {\n\t\t\tcount: assetCount,\n\t\t});\n\n\t\tsuper.preRender();\n\n\t\tObject.assign(this.templateVars, {\n\t\t\tassetCount: assetCount,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AddAssetsToCategoryView';\n\t}\n}\n","/**\n * View for showing replace cart asset delete warnings\n * @class\n */\nimport Base from '@netx/core-app/views/alertView';\nimport Template from '../templates/cartDeleteWarningsView.html';\n\nclass CartDeleteWarningsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tthis.warning = opts.warning;\n\t\tthis.headerTitle = opts.headerTitle || i18n.t('i18n.warning');\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tObject.assign(this.templateVars, {\n\t\t\twarning: this.warning,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CartDeleteWarningsView';\n\t}\n}\n\nexport default CartDeleteWarningsView;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/select_fromItem.html';\n\nconst cssClasses = {\n\troot: 'nx-ui-app-select__item',\n};\n\nclass Select_FromItem extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = `${cssClasses.root} ${opts.className || ''}`;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tthis.selection = opts.selection;\n\t\tthis.selected = opts.selected;\n\n\t\t// Hey, listen!\n\t\tthis.selection &&\n\t\t\tthis.listenTo(this.selection, 'add remove reset', this.render);\n\t}\n\n\t/** @method */\n\tdeselect() {\n\t\tif (!this.$input) return;\n\n\t\tthis.$input.prop('checked', false);\n\t\tthis.$input.trigger('change');\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\t\tconst selection = this.selection;\n\n\t\t// Additional template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tid: model.id,\n\t\t\ttitle: model.getAutocompleteLabel(),\n\t\t\tselected: selection\n\t\t\t\t? this.selected || selection.get(model.id) != null\n\t\t\t\t: false,\n\t\t\tindex: model.collection.indexOf(model),\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$input = this.$('.mdc-checkbox__native-control');\n\t}\n\n\t/** @method */\n\tselect() {\n\t\tif (!this.$input) return;\n\n\t\tthis.$input.prop('checked', true);\n\t\tthis.$input.trigger('change');\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Select_FromItem';\n\t}\n}\n\nexport default Select_FromItem;\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-app/views/select_fromItem';\n\nclass Select_FromItem extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\tconst selection = opts.selection;\n\t\tconst selected = selection\n\t\t\t? opts.selected === true || selection.get(opts.model.id) != null\n\t\t\t: false;\n\t\tconst index = opts.model.collection.indexOf(opts.model);\n\n\t\topts.attributes = {\n\t\t\trole: 'checkbox',\n\t\t\t'aria-checked': selected,\n\t\t\ttabindex: index === 0 ? '0' : '-1',\n\t\t\t...opts.attributes,\n\t\t};\n\t\topts.className = `mdc-list-item ${opts.className || ''}`;\n\t\topts.tagName = 'li';\n\n\t\tsuper(opts);\n\t}\n}\n\nexport default Select_FromItem;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/select_newItem.html';\n\nconst cssClasses = {\n\troot: 'nx-ui-app-select__item',\n};\n\nclass Select_NewItem extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\t// Since we do not come from any actual data\n\t\topts.attributes = {\n\t\t\t'data-nx-model-id': opts.model.id,\n\t\t\t...opts.attributes,\n\t\t};\n\t\topts.className = `${cssClasses.root} ${opts.className || ''}`;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tif (opts.unique === true && !opts.uniqueKey) {\n\t\t\tconsole.warn(\n\t\t\t\t'Cannot enforce unique names without an autolookup `uniqueKey`',\n\t\t\t);\n\t\t}\n\n\t\tthis.label = opts.label || i18n.t('i18n.newItem');\n\t\tthis.placeholder = opts.placeholder || i18n.t('i18n.enterNewName');\n\t\tthis.unique = opts.unique === true && opts.uniqueKey != null;\n\t\tthis.uniqueKey = opts.uniqueKey;\n\t\tthis.uniqueMessage = opts.uniqueMessage || i18n.t('i18n.nameAlreadyExists');\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tObject.assign(this.templateVars, {\n\t\t\tid: this.model.id,\n\t\t\tlabel: this.label,\n\t\t\tplaceholder: this.placeholder,\n\t\t\tunique: this.unique,\n\t\t\tuniqueKey: this.uniqueKey,\n\t\t\tuniqueMessage: this.uniqueMessage,\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$input = this.$('input[type=\"text\"]');\n\n\t\tthis.$input.trigger('nx.fieldAdded').focus();\n\t}\n\n\t/** @override */\n\tremove() {\n\t\tthis.$input && this.$input.trigger('nx.fieldRemoved');\n\n\t\tsuper.remove();\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Select_NewItem';\n\t}\n}\n\nexport default Select_NewItem;\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-app/views/select_newItem';\n\n//import MaterialTextFields from '@netx/core/functionality/materialTextFields';\n\nimport {faPlus} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaPlus,\n});\n\nclass Select_NewItem extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\topts.tagName = 'li';\n\t\tsuper(opts);\n\t}\n}\n\n// MaterialTextFields(Select_NewItem);\n\nexport default Select_NewItem;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/select_new.html';\nimport ChildView from './select_newItem';\n\nimport ChildViews from '@netx/core/functionality/childViews';\n\nconst cssClasses = {\n\troot: 'nx-ui-app-select__new',\n\taddItem: 'nx-ui-app-select__new__add-item',\n\thasItems: 'nx-ui-app-select__new--has-items',\n\titem: 'nx-ui-app-select__item',\n\titems: 'nx-ui-app-select__items',\n\tremoveItem: 'nx-ui-app-select__remove-item',\n\tsingleItem: 'nx-ui-app-select__new--single-item',\n};\n\nclass Select_New extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = {\n\t\t\tviewClass: ChildView,\n\t\t\toptions(model) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: this.label,\n\t\t\t\t\tunique: this.unique,\n\t\t\t\t\tuniqueKey: this.uniqueKey,\n\t\t\t\t\tuniqueMessage: this.uniqueMessage,\n\t\t\t\t\tplaceholder: this.placeholder,\n\t\t\t\t};\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.className = `${cssClasses.root} ${opts.className || ''}`;\n\t\topts.events = {\n\t\t\t[`click .${cssClasses.addItem}`]: 'onAddItemClick',\n\t\t\t[`tap .${cssClasses.addItem}`]: 'onAddItemClick',\n\t\t\t[`click .${cssClasses.removeItem}`]: 'onRemoveItemClick',\n\t\t\t[`tap .${cssClasses.removeItem}`]: 'onRemoveItemClick',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tthis.label = opts.label || i18n.t('i18n.createOneNow');\n\t\tthis.multiple = opts.multiple === true;\n\t\tthis.placeholder = opts.placeholder;\n\t\tthis.unique = opts.unique;\n\t\tthis.uniqueKey = opts.uniqueKey;\n\t\tthis.uniqueMessage = opts.uniqueMessage;\n\n\t\tthis.el.classList.toggle(cssClasses.singleItem, !this.multiple);\n\n\t\tthis.addItem();\n\t}\n\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\t\treturn this.listenTo(this.collection, 'add remove', () => {\n\t\t\tthis.el.classList.toggle(cssClasses.hasItems, this.collection.length > 0);\n\t\t});\n\t}\n\n\t/** @method */\n\taddItem() {\n\t\t// Already maxed out\n\t\tif (!this.multiple && this.collection.length > 0) return;\n\n\t\tconst idKey = this.collection.model.prototype.idAttribute || 'id';\n\t\tthis.collection.add({[idKey]: _.uniqueId()});\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean} Has new items (not empty)\n\t */\n\thasNewItems() {\n\t\tconst childViews = Object.values(this.childViews);\n\t\tif (!childViews.length) return false;\n\t\t// Look for any child view with an empty name\n\t\treturn !childViews.some(\n\t\t\tchildView => childView.$input && childView.$input.val() === '',\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `click`/`tap`\n\t */\n\tonAddItemClick(e) {\n\t\te.preventDefault();\n\n\t\tthis.addItem();\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `click`/`tap`\n\t */\n\tonRemoveItemClick(e) {\n\t\te.preventDefault();\n\n\t\tconst $target = $(e.target).closest(`.${cssClasses.item}`);\n\t\tthis.removeItem($target.nxData('model-id'));\n\t}\n\n\t/**\n\t * @param {string} id ID\n\t */\n\tremoveItem(id) {\n\t\tconst model = this.collection.get(id);\n\t\tif (!model) return;\n\n\t\tthis.collection.remove(id);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tObject.assign(this.templateVars, {\n\t\t\tlabel: this.label,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Select_New';\n\t}\n}\n\n// Functionality\nChildViews(Select_New);\n\nexport default Select_New;\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-app/views/select_new';\n\nimport {faPlus} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaPlus,\n});\n\nclass Select_New extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\topts.materialList = {\n\t\t\tchildViews: true,\n\t\t\t...opts.materialList,\n\t\t};\n\t\tsuper(opts);\n\t}\n}\n\nexport default Select_New;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/select_from.html';\nimport ChildView from './select_fromItem';\n\nimport SelectNewView from './select_new';\n\nimport ChildViews from '@netx/core/functionality/childViews';\nimport Select2 from '@netx/core/functionality/select2';\n\nimport 'core-libs/customElements/nx-search';\n\nconst cssClasses = {\n\troot: 'nx-ui-app-select__from',\n\titems: 'nx-ui-app-select__items',\n\tnewItems: 'nx-ui-app-select__new',\n};\n\nclass Select_From extends Base {\n\tget selectionChanged() {\n\t\treturn (\n\t\t\tthis._addedIds.length > 0 ||\n\t\t\tthis._removedIds.length > 0 ||\n\t\t\t(this.newItemsEnabled && this.newItemsView.hasNewItems())\n\t\t);\n\t}\n\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = {\n\t\t\tviewClass: ChildView,\n\t\t\toptions: {\n\t\t\t\tselection() {\n\t\t\t\t\treturn this.selection;\n\t\t\t\t},\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.className = `${cssClasses.root} ${opts.className || ''}`;\n\t\topts.events = {\n\t\t\t'change [data-nx-model-id] input': 'onSelectChange',\n\t\t\t'search nx-search:first': 'search',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.browse');\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tthis.additionalAttrs = opts.additionalAttrs || [];\n\t\tthis.clientSearch = opts.clientSearch === true;\n\t\tthis.clientSearchKey = this.clientSearch ? opts.clientSearchKey : null;\n\t\tthis.selection = opts.selection;\n\n\t\tthis._originalIds = this.selection.ids();\n\t\tthis._addedIds = [];\n\t\tthis._removedIds = [];\n\n\t\tthis.newItemsEnabled = _.isObject(opts.newItems) || opts.newItems === true;\n\t\tif (this.newItemsEnabled) {\n\t\t\tconst newItemOpts = _.isObject(opts.newItems) ? opts.newItems : {};\n\t\t\tthis.newItems = new this.collection.constructor([]);\n\t\t\tthis.newItemsView = new SelectNewView({\n\t\t\t\tcollection: this.newItems,\n\t\t\t\tlabel: opts.newLabel,\n\t\t\t\t...newItemOpts,\n\t\t\t});\n\t\t}\n\n\t\tthis.listenTo(this.selection, 'add', model => {\n\t\t\tconst id = model.id;\n\t\t\tconst removedIdx = this._removedIds.indexOf(id);\n\t\t\tif (removedIdx > -1) {\n\t\t\t\tthis._removedIds.splice(removedIdx, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this._addedIds.includes(id)) return;\n\t\t\tthis._addedIds.push(id);\n\t\t}).listenTo(this.selection, 'remove', model => {\n\t\t\tconst id = model.id;\n\t\t\tconst addedIdx = this._addedIds.indexOf(id);\n\t\t\tif (addedIdx > -1) {\n\t\t\t\tthis._addedIds.splice(addedIdx, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this._removedIds.includes(id)) return;\n\t\t\tthis._removedIds.push(id);\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {module:core/lib/netx-model} model Model\n\t */\n\tdeselectItem(model) {\n\t\tif (!this.selection.get(model.id)) return;\n\n\t\tthis.selection.remove(model);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additional template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tclientSearch: this.clientSearch,\n\t\t\tclientSearchKey: this.clientSearchKey,\n\t\t\tnewItemsEnabled: this.newItemsEnabled,\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\tif (this.newItemsEnabled) {\n\t\t\tthis.newItemsView.setElement(this.$('.nx-ui-app-select__new'));\n\t\t\tthis.newItemsView.render();\n\t\t}\n\n\t\t// Inject pager\n\t\tthis.collection.pager && this.addPagerView();\n\t}\n\n\t/** @override */\n\tgetSelection() {\n\t\treturn {\n\t\t\tids: this.selection\n\t\t\t\t.map(selected => {\n\t\t\t\t\treturn selected.id;\n\t\t\t\t})\n\t\t\t\t.filter(id => !id.toString().match(/^new-/)),\n\t\t\tadded: [...this._addedIds],\n\t\t\tremoved: [...this._removedIds],\n\t\t};\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `change` event\n\t */\n\tonSelectChange(e) {\n\t\te.preventDefault();\n\n\t\tconst $target = $(e.target);\n\t\tthis.toggleSelected($target.val(), $target.is(':checked'));\n\t}\n\n\t/**\n\t * @method\n\t * @param {module:core/lib/netx-model} model Model\n\t */\n\tselectItem(model) {\n\t\tif (this.selection.get(model.id)) return;\n\n\t\tconst attrs = {};\n\t\tthis.additionalAttrs.forEach(attr => {\n\t\t\tattrs[attr] = model.get(attr);\n\t\t});\n\n\t\t// Normalize as if it cam from an autocomplete\n\t\tthis.selection.add(\n\t\t\tthis.selection.toSelectedItemFromAutocomplete(\n\t\t\t\t{\n\t\t\t\t\tid: model.id,\n\t\t\t\t\ttext: model.getAutocompleteLabel(),\n\t\t\t\t},\n\t\t\t\tattrs,\n\t\t\t),\n\t\t\t{sort: true, ignoreUsers: true},\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number|string} id ID\n\t * @param {boolean} selected Selected\n\t */\n\ttoggleSelected(id, selected) {\n\t\tlet _id = parseInt(id);\n\t\tif (_.isNaN(_id)) {\n\t\t\t_id = id;\n\t\t}\n\n\t\tlet model = this.collection.get(_id);\n\t\tif (!model) return;\n\n\t\tselected = selected == null ? this.selection.get(_id) : selected === true;\n\t\tselected ? this.selectItem(model) : this.deselectItem(model);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Select_From';\n\t}\n}\n\n// Functionality\nChildViews(Select_From);\nSelect2(Select_From);\n\nexport default Select_From;\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-app/views/select_from';\n\nimport MaterialCheckboxes from '@netx/core/functionality/materialCheckboxes';\nimport MaterialList from '@netx/core/functionality/materialList';\n\nimport {faPlus} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaPlus,\n});\n\nclass Select_From extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\topts.materialList = {\n\t\t\tchildViews: true,\n\t\t\t...opts.materialList,\n\t\t};\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tcancel() {\n\t\t// do nothing, for you can do nothing\n\t}\n}\n\nMaterialList(Select_From);\n\nexport default Select_From;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/select_selectedItem.html';\n\nconst cssClasses = {\n\troot: 'nx-ui-app-select__item',\n};\n\nclass Select_SelectedItem extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = `${cssClasses.root} ${opts.className || ''}`;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\t\t// Additional template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tid: model.id,\n\t\t\ttitle: model.getAutocompleteLabel(),\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Select_SelectedItem';\n\t}\n}\n\nexport default Select_SelectedItem;\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-app/views/select_selectedItem';\n\nimport {faTimes} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaTimes,\n});\n\nclass Select_SelectedItem extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\tconst index = opts.model.collection.indexOf(opts.model);\n\t\topts.attributes = {\n\t\t\ttabindex: index === 0 ? '0' : '-1',\n\t\t\t...opts.attributes,\n\t\t};\n\t\topts.className = `mdc-list-item ${opts.className || ''}`;\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n}\n\nexport default Select_SelectedItem;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/select_selected.html';\n\nimport ChildView from './select_selectedItem';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nimport 'core-libs/customElements/nx-search';\n\nconst cssClasses = {\n\troot: 'nx-ui-app-select__selected',\n\titem: 'nx-ui-app-select__item',\n\titems: 'nx-ui-app-select__items',\n\tremoveItem: 'nx-ui-app-select__remove-item',\n};\n\nclass Select_Selected extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = {\n\t\t\tviewClass: ChildView,\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.className = `${cssClasses.root} ${opts.className || ''}`;\n\t\topts.events = {\n\t\t\t[`click .${cssClasses.removeItem}`]: 'onRemoveItemClick',\n\t\t\t[`tap .${cssClasses.removeItem}`]: 'onRemoveItemClick',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.selected');\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// We do (currently) not page the selection\n\t\tthis.clientSearch = true;\n\t\tthis.clientSearchKey = this.collection.model.TitleAttribute;\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additional template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tclientSearch: this.clientSearch,\n\t\t\tclientSearchKey: this.clientSearchKey,\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {number|string} id Selection model id\n\t */\n\tremoveItem(id) {\n\t\tlet _id = parseInt(id);\n\t\t// Assume they meant to send a string\n\t\tif (isNaN(_id)) _id = id;\n\n\t\tconst model = this.collection.get(id);\n\t\tif (!model) return;\n\n\t\tthis.collection.remove(model);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `click`/`tap`\n\t */\n\tonRemoveItemClick(e) {\n\t\te.preventDefault();\n\n\t\tconst $target = $(e.target).closest(`.${cssClasses.item}`);\n\t\tthis.removeItem($target.nxData('model-id'));\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Select_Selected';\n\t}\n}\n\n// Functionality\nChildViews(Select_Selected);\n\nexport default Select_Selected;\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-app/views/select_selected';\n\nimport KeyEvents from '@netx/core/functionality/keyEvents';\nimport MaterialList from '@netx/core/functionality/materialList';\n\nclass Select_Selected extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.keyEvents = {\n\t\t\tbackspace: {\n\t\t\t\texecute: 'keyboardDelete',\n\t\t\t\tglobal: true,\n\t\t\t},\n\t\t\tdelete: {\n\t\t\t\texecute: 'keyboardDelete',\n\t\t\t\tglobal: true,\n\t\t\t},\n\t\t\t...opts.keyEvents,\n\t\t};\n\t\topts.materialList = {\n\t\t\tchildViews: true,\n\t\t\t...opts.materialList,\n\t\t};\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tcancel() {\n\t\t// do nothing, for you can do nothing\n\t}\n\n\tkeyboardDelete(e) {\n\t\tconst list = this.getActiveList();\n\t\tif (!list) return;\n\n\t\tconst foundation = list.foundation_;\n\t\tlet index = foundation.focusedItemIndex_;\n\t\tconst listItem = list.listElements[index];\n\n\t\tif (!listItem) return;\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tthis.removeItem(listItem.getAttribute('data-nx-model-id'));\n\n\t\t// Re-focus on next item\n\t\tif (index && index > list.listElements.length - 1) {\n\t\t\tindex--;\n\t\t}\n\t\tfoundation.adapter_.focusItemAtIndex(index);\n\t}\n}\n\nKeyEvents(Select_Selected);\nMaterialList(Select_Selected);\n\nexport default Select_Selected;\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-tabView';\nimport Template from '../templates/select.html';\n\nimport Form from '@netx/core/functionality/form';\n\nimport SelectFromView from './select_from';\nimport SelectionView from './select_selected';\n\nimport {isEmptyValue} from '@netx/core/lib/underscore-netx';\n\nclass Select extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = `nx-ui-app-select ${opts.className || ''}`;\n\t\topts.defaultTab = opts.defaultTab || 'select-from';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.selectItems');\n\t\topts.hideOnSubmit = opts.hideOnSubmit !== false;\n\t\t// We want both tabs to be created at initialization\n\t\topts.instantiateOnAdd = true;\n\t\topts.loadingMethods = opts.loadingMethods || [];\n\t\topts.removeOnHide = opts.removeOnHide !== false;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * @param {boolean}\n\t\t */\n\t\tthis.clientSearch = opts.clientSearch === true;\n\t\t/**\n\t\t * @param {string}\n\t\t */\n\t\tthis.clientSearchKey = opts.clientSearchKey;\n\n\t\t/**\n\t\t * @param {boolean}\n\t\t */\n\t\tthis.requiresSelection = opts.requiresSelection !== false;\n\n\t\t/**\n\t\t * @param {string}\n\t\t */\n\t\tthis.sortBy = opts.sortBy || 'title';\n\n\t\t/**\n\t\t * @param {array}\n\t\t */\n\t\tthis.additionalAttrs = opts.additionalAttrs || [];\n\n\t\t/**\n\t\t * @param {boolean}\n\t\t */\n\t\tthis.newItems = opts.newItems;\n\n\t\t/**\n\t\t * @memberof module:app/views/select\n\t\t * @alias selection\n\t\t * @type {module:core/lib/netx-collection}\n\t\t */\n\t\tthis.selection =\n\t\t\topts.selection ||\n\t\t\tnew this.collection.constructor([], {comparator: this.sortBy});\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tthis.selection,\n\t\t\t'add remove reset',\n\n\t\t\t// This code will run before other code in select_from\n\t\t\t// Really, we were trying to make it so the panel does not bother you, when\n\t\t\t// you navigate away, with unsaved changes warnings\n\t\t\t// The code in select_from keeps track of removed/added but does so on the same\n\t\t\t// events we are listening to here\n\t\t\t// This would be a good candidate for making into a react component.\n\t\t\t// We are trying to (and failing) manage state here through multiple layers of\n\t\t\t// backbone views - when it could be so much easier\n\t\t\t_.debounce(() => {\n\t\t\t\tthis.selectionUpdated();\n\t\t\t\tthis.formChanged = true;\n\t\t\t\tthis.checkForm();\n\t\t\t}, 50),\n\t\t);\n\t}\n\n\t/** @override\n\t * rerender when the groups collection resets\n\t */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\t\treturn this.listenTo(this.collection, 'reset', this.render);\n\t}\n\n\t/** @method */\n\ttabs() {\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: 'select-from',\n\t\t\t\tviewClass: SelectFromView,\n\t\t\t\thasTotal: true,\n\t\t\t\tviewOptions: {\n\t\t\t\t\tadditionalAttrs: this.additionalAttrs,\n\t\t\t\t\tclientSearch: this.clientSearch,\n\t\t\t\t\tclientSearchKey: this.clientSearchKey,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\tnewItems: this.newItems,\n\t\t\t\t\tselection: this.selection,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'selected',\n\t\t\t\tviewClass: SelectionView,\n\t\t\t\thasTotal: true,\n\t\t\t\tviewOptions: {\n\t\t\t\t\tcollection: this.selection,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$select = this.$('select.nx-select');\n\t\tthis.$selectedCount = this.$('.nx-selected-count');\n\n\t\tthis.selectionUpdated();\n\t}\n\n\t/** @override */\n\tsubmitArgs() {\n\t\tconst args = super.submitArgs();\n\n\t\tconst values = args[0];\n\t\t// No one needs this\n\t\tdelete values.item;\n\n\t\t// Convert to array of values and strip out any empty items\n\t\tconst newItems = values.new;\n\t\tif (newItems) {\n\t\t\tvalues.new = Object.values(newItems).filter((newItem) => newItem !== '');\n\t\t}\n\n\t\tconst selectFromView = this.getViewByName('select-from');\n\t\tObject.assign(values, selectFromView.getSelection());\n\n\t\treturn args;\n\t}\n\n\t/** @override */\n\tsubmitReady() {\n\t\tconst selectFromView = this.getViewByName('select-from');\n\t\tif (!selectFromView) return false;\n\n\t\treturn (\n\t\t\tsuper.submitReady() &&\n\t\t\t(!this.requiresSelection || selectFromView.selectionChanged)\n\t\t);\n\t}\n\n\t/** @method */\n\tselectionUpdated() {\n\t\tthis.$selectedCount &&\n\t\t\tthis.$selectedCount.html(\n\t\t\t\ti18n.t(this.i18nCountStr, {\n\t\t\t\t\tcount: this.selection.length,\n\t\t\t\t}),\n\t\t\t);\n\t}\n\n\t/** @override */\n\tunsavedChanges() {\n\t\tconst selectFromView = this.getViewByName('select-from');\n\t\tif (!selectFromView) return false;\n\n\t\treturn selectFromView.selectionChanged ? this : false;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'Select';\n\t}\n}\n\n// Functionality\nForm(Select);\n\nexport default Select;\n","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar cssClasses = {\n ANIMATE: 'mdc-drawer--animate',\n CLOSING: 'mdc-drawer--closing',\n DISMISSIBLE: 'mdc-drawer--dismissible',\n MODAL: 'mdc-drawer--modal',\n OPEN: 'mdc-drawer--open',\n OPENING: 'mdc-drawer--opening',\n ROOT: 'mdc-drawer',\n};\nvar strings = {\n APP_CONTENT_SELECTOR: '.mdc-drawer-app-content',\n CLOSE_EVENT: 'MDCDrawer:closed',\n OPEN_EVENT: 'MDCDrawer:opened',\n SCRIM_SELECTOR: '.mdc-drawer-scrim',\n};\nexport { cssClasses, strings };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses, strings } from '../constants';\nvar MDCDismissibleDrawerFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCDismissibleDrawerFoundation, _super);\n function MDCDismissibleDrawerFoundation(adapter) {\n var _this = _super.call(this, tslib_1.__assign({}, MDCDismissibleDrawerFoundation.defaultAdapter, adapter)) || this;\n _this.animationFrame_ = 0;\n _this.animationTimer_ = 0;\n return _this;\n }\n Object.defineProperty(MDCDismissibleDrawerFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCDismissibleDrawerFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCDismissibleDrawerFoundation, \"defaultAdapter\", {\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n addClass: function () { return undefined; },\n removeClass: function () { return undefined; },\n hasClass: function () { return false; },\n elementHasClass: function () { return false; },\n notifyClose: function () { return undefined; },\n notifyOpen: function () { return undefined; },\n saveFocus: function () { return undefined; },\n restoreFocus: function () { return undefined; },\n focusActiveNavigationItem: function () { return undefined; },\n trapFocus: function () { return undefined; },\n releaseFocus: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n MDCDismissibleDrawerFoundation.prototype.destroy = function () {\n if (this.animationFrame_) {\n cancelAnimationFrame(this.animationFrame_);\n }\n if (this.animationTimer_) {\n clearTimeout(this.animationTimer_);\n }\n };\n MDCDismissibleDrawerFoundation.prototype.open = function () {\n var _this = this;\n if (this.isOpen() || this.isOpening() || this.isClosing()) {\n return;\n }\n this.adapter_.addClass(cssClasses.OPEN);\n this.adapter_.addClass(cssClasses.ANIMATE);\n // Wait a frame once display is no longer \"none\", to establish basis for animation\n this.runNextAnimationFrame_(function () {\n _this.adapter_.addClass(cssClasses.OPENING);\n });\n this.adapter_.saveFocus();\n };\n MDCDismissibleDrawerFoundation.prototype.close = function () {\n if (!this.isOpen() || this.isOpening() || this.isClosing()) {\n return;\n }\n this.adapter_.addClass(cssClasses.CLOSING);\n };\n /**\n * @return true if drawer is in open state.\n */\n MDCDismissibleDrawerFoundation.prototype.isOpen = function () {\n return this.adapter_.hasClass(cssClasses.OPEN);\n };\n /**\n * @return true if drawer is animating open.\n */\n MDCDismissibleDrawerFoundation.prototype.isOpening = function () {\n return this.adapter_.hasClass(cssClasses.OPENING) || this.adapter_.hasClass(cssClasses.ANIMATE);\n };\n /**\n * @return true if drawer is animating closed.\n */\n MDCDismissibleDrawerFoundation.prototype.isClosing = function () {\n return this.adapter_.hasClass(cssClasses.CLOSING);\n };\n /**\n * Keydown handler to close drawer when key is escape.\n */\n MDCDismissibleDrawerFoundation.prototype.handleKeydown = function (evt) {\n var keyCode = evt.keyCode, key = evt.key;\n var isEscape = key === 'Escape' || keyCode === 27;\n if (isEscape) {\n this.close();\n }\n };\n /**\n * Handles a transition end event on the root element.\n */\n MDCDismissibleDrawerFoundation.prototype.handleTransitionEnd = function (evt) {\n var OPENING = cssClasses.OPENING, CLOSING = cssClasses.CLOSING, OPEN = cssClasses.OPEN, ANIMATE = cssClasses.ANIMATE, ROOT = cssClasses.ROOT;\n // In Edge, transitionend on ripple pseudo-elements yields a target without classList, so check for Element first.\n var isRootElement = this.isElement_(evt.target) && this.adapter_.elementHasClass(evt.target, ROOT);\n if (!isRootElement) {\n return;\n }\n if (this.isClosing()) {\n this.adapter_.removeClass(OPEN);\n this.closed_();\n this.adapter_.restoreFocus();\n this.adapter_.notifyClose();\n }\n else {\n this.adapter_.focusActiveNavigationItem();\n this.opened_();\n this.adapter_.notifyOpen();\n }\n this.adapter_.removeClass(ANIMATE);\n this.adapter_.removeClass(OPENING);\n this.adapter_.removeClass(CLOSING);\n };\n /**\n * Extension point for when drawer finishes open animation.\n */\n MDCDismissibleDrawerFoundation.prototype.opened_ = function () { }; // tslint:disable-line:no-empty\n /**\n * Extension point for when drawer finishes close animation.\n */\n MDCDismissibleDrawerFoundation.prototype.closed_ = function () { }; // tslint:disable-line:no-empty\n /**\n * Runs the given logic on the next animation frame, using setTimeout to factor in Firefox reflow behavior.\n */\n MDCDismissibleDrawerFoundation.prototype.runNextAnimationFrame_ = function (callback) {\n var _this = this;\n cancelAnimationFrame(this.animationFrame_);\n this.animationFrame_ = requestAnimationFrame(function () {\n _this.animationFrame_ = 0;\n clearTimeout(_this.animationTimer_);\n _this.animationTimer_ = setTimeout(callback, 0);\n });\n };\n MDCDismissibleDrawerFoundation.prototype.isElement_ = function (element) {\n // In Edge, transitionend on ripple pseudo-elements yields a target without classList.\n return Boolean(element.classList);\n };\n return MDCDismissibleDrawerFoundation;\n}(MDCFoundation));\nexport { MDCDismissibleDrawerFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCDismissibleDrawerFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCDismissibleDrawerFoundation } from '../dismissible/foundation';\n/* istanbul ignore next: subclass is not a branch statement */\nvar MDCModalDrawerFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCModalDrawerFoundation, _super);\n function MDCModalDrawerFoundation() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Handles click event on scrim.\n */\n MDCModalDrawerFoundation.prototype.handleScrimClick = function () {\n this.close();\n };\n /**\n * Called when drawer finishes open animation.\n */\n MDCModalDrawerFoundation.prototype.opened_ = function () {\n this.adapter_.trapFocus();\n };\n /**\n * Called when drawer finishes close animation.\n */\n MDCModalDrawerFoundation.prototype.closed_ = function () {\n this.adapter_.releaseFocus();\n };\n return MDCModalDrawerFoundation;\n}(MDCDismissibleDrawerFoundation));\nexport { MDCModalDrawerFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCModalDrawerFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCList } from '@material/list/component';\nimport { MDCListFoundation } from '@material/list/foundation';\nimport { default as createFocusTrap } from 'focus-trap';\nimport { MDCDismissibleDrawerFoundation } from './dismissible/foundation';\nimport { MDCModalDrawerFoundation } from './modal/foundation';\nimport * as util from './util';\nvar cssClasses = MDCDismissibleDrawerFoundation.cssClasses, strings = MDCDismissibleDrawerFoundation.strings;\nvar MDCDrawer = /** @class */ (function (_super) {\n tslib_1.__extends(MDCDrawer, _super);\n function MDCDrawer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCDrawer.attachTo = function (root) {\n return new MDCDrawer(root);\n };\n Object.defineProperty(MDCDrawer.prototype, \"open\", {\n /**\n * Returns true if drawer is in the open position.\n */\n get: function () {\n return this.foundation_.isOpen();\n },\n /**\n * Toggles the drawer open and closed.\n */\n set: function (isOpen) {\n if (isOpen) {\n this.foundation_.open();\n }\n else {\n this.foundation_.close();\n }\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCDrawer.prototype, \"list\", {\n get: function () {\n return this.list_;\n },\n enumerable: true,\n configurable: true\n });\n MDCDrawer.prototype.initialize = function (focusTrapFactory, listFactory) {\n if (focusTrapFactory === void 0) { focusTrapFactory = createFocusTrap; }\n if (listFactory === void 0) { listFactory = function (el) { return new MDCList(el); }; }\n var listEl = this.root_.querySelector(\".\" + MDCListFoundation.cssClasses.ROOT);\n if (listEl) {\n this.list_ = listFactory(listEl);\n this.list_.wrapFocus = true;\n }\n this.focusTrapFactory_ = focusTrapFactory;\n };\n MDCDrawer.prototype.initialSyncWithDOM = function () {\n var _this = this;\n var MODAL = cssClasses.MODAL;\n var SCRIM_SELECTOR = strings.SCRIM_SELECTOR;\n this.scrim_ = this.root_.parentNode.querySelector(SCRIM_SELECTOR);\n if (this.scrim_ && this.root_.classList.contains(MODAL)) {\n this.handleScrimClick_ = function () { return _this.foundation_.handleScrimClick(); };\n this.scrim_.addEventListener('click', this.handleScrimClick_);\n this.focusTrap_ = util.createFocusTrapInstance(this.root_, this.focusTrapFactory_);\n }\n this.handleKeydown_ = function (evt) { return _this.foundation_.handleKeydown(evt); };\n this.handleTransitionEnd_ = function (evt) { return _this.foundation_.handleTransitionEnd(evt); };\n this.listen('keydown', this.handleKeydown_);\n this.listen('transitionend', this.handleTransitionEnd_);\n };\n MDCDrawer.prototype.destroy = function () {\n this.unlisten('keydown', this.handleKeydown_);\n this.unlisten('transitionend', this.handleTransitionEnd_);\n if (this.list_) {\n this.list_.destroy();\n }\n var MODAL = cssClasses.MODAL;\n if (this.scrim_ && this.handleScrimClick_ && this.root_.classList.contains(MODAL)) {\n this.scrim_.removeEventListener('click', this.handleScrimClick_);\n // Ensure drawer is closed to hide scrim and release focus\n this.open = false;\n }\n };\n MDCDrawer.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n addClass: function (className) { return _this.root_.classList.add(className); },\n removeClass: function (className) { return _this.root_.classList.remove(className); },\n hasClass: function (className) { return _this.root_.classList.contains(className); },\n elementHasClass: function (element, className) { return element.classList.contains(className); },\n saveFocus: function () { return _this.previousFocus_ = document.activeElement; },\n restoreFocus: function () {\n var previousFocus = _this.previousFocus_;\n if (previousFocus && previousFocus.focus && _this.root_.contains(document.activeElement)) {\n previousFocus.focus();\n }\n },\n focusActiveNavigationItem: function () {\n var activeNavItemEl = _this.root_.querySelector(\".\" + MDCListFoundation.cssClasses.LIST_ITEM_ACTIVATED_CLASS);\n if (activeNavItemEl) {\n activeNavItemEl.focus();\n }\n },\n notifyClose: function () { return _this.emit(strings.CLOSE_EVENT, {}, true /* shouldBubble */); },\n notifyOpen: function () { return _this.emit(strings.OPEN_EVENT, {}, true /* shouldBubble */); },\n trapFocus: function () { return _this.focusTrap_.activate(); },\n releaseFocus: function () { return _this.focusTrap_.deactivate(); },\n };\n // tslint:enable:object-literal-sort-keys\n var DISMISSIBLE = cssClasses.DISMISSIBLE, MODAL = cssClasses.MODAL;\n if (this.root_.classList.contains(DISMISSIBLE)) {\n return new MDCDismissibleDrawerFoundation(adapter);\n }\n else if (this.root_.classList.contains(MODAL)) {\n return new MDCModalDrawerFoundation(adapter);\n }\n else {\n throw new Error(\"MDCDrawer: Failed to instantiate component. Supported variants are \" + DISMISSIBLE + \" and \" + MODAL + \".\");\n }\n };\n return MDCDrawer;\n}(MDCComponent));\nexport { MDCDrawer };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport { default as createFocusTrap } from 'focus-trap';\nexport function createFocusTrapInstance(surfaceEl, focusTrapFactory) {\n if (focusTrapFactory === void 0) { focusTrapFactory = createFocusTrap; }\n return focusTrapFactory(surfaceEl, {\n clickOutsideDeactivates: true,\n escapeDeactivates: false,\n initialFocus: undefined,\n returnFocusOnDeactivate: false,\n });\n}\n//# sourceMappingURL=util.js.map","const NAME = 'materialDrawer';\n\nimport {MDCDrawer} from '@material/drawer';\n\nexport default function (target) {\n\tif (!target || target.hasFunctionality(NAME)) return target;\n\n\ttarget.addInitializer((instance, opts = {}) => {\n\t\tlet materialDrawer;\n\n\t\tconst cleanUp = () => {\n\t\t\tmaterialDrawer && materialDrawer.destroy();\n\t\t\tmaterialDrawer = null;\n\t\t};\n\n\t\tconst materialOptions = opts.materialDrawer || {};\n\n\t\t// Hey, listen!\n\t\tinstance\n\t\t\t.on('preRenderHook', cleanUp)\n\t\t\t.on('removeHook', cleanUp)\n\t\t\t.on('materialDrawer:close', () => {\n\t\t\t\tif (!materialDrawer) return;\n\t\t\t\tmaterialDrawer.open = false;\n\t\t\t})\n\t\t\t.on('materialDrawer:open', () => {\n\t\t\t\tif (!materialDrawer) return;\n\t\t\t\tmaterialDrawer.open = true;\n\t\t\t})\n\t\t\t.on('materialDrawer:toggle', () => {\n\t\t\t\tif (!materialDrawer) return;\n\t\t\t\tmaterialDrawer.open = !materialDrawer.open;\n\t\t\t})\n\t\t\t.on('postRenderHook', () => {\n\t\t\t\tconst el = instance.el.querySelector('.mdc-drawer');\n\t\t\t\tif (!el) return;\n\n\t\t\t\tmaterialDrawer = new MDCDrawer(el);\n\n\t\t\t\t// When `escape` is used we want to hide, no questions asked\n\t\t\t\tmaterialDrawer.foundation_.handleKeydown = function (evt) {\n\t\t\t\t\tconst keyCode = evt.keyCode,\n\t\t\t\t\t\tkey = evt.key;\n\t\t\t\t\tconst isEscape = key === 'Escape' || keyCode === 27;\n\t\t\t\t\tif (isEscape) {\n\t\t\t\t\t\tthis.close(true);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (materialOptions.blocking === true && materialDrawer.scrim_) {\n\t\t\t\t\tmaterialDrawer.scrim_.removeEventListener(\n\t\t\t\t\t\t'click',\n\t\t\t\t\t\tmaterialDrawer.handleScrimClick_,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tmaterialDrawer.foundation_.close = _.wrap(\n\t\t\t\t\tmaterialDrawer.foundation_.close,\n\t\t\t\t\t(close, escapeKey) => {\n\t\t\t\t\t\tif (!materialDrawer.open) return;\n\n\t\t\t\t\t\tlet canClose = true;\n\t\t\t\t\t\tif (!escapeKey && typeof instance.mdcDrawerClosing === 'function') {\n\t\t\t\t\t\t\tcanClose = instance.mdcDrawerClosing();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!canClose) return;\n\t\t\t\t\t\tclose.call(materialDrawer.foundation_);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t}, NAME);\n\n\treturn target;\n}\n","const NAME = 'resizable';\n\nimport {isMobile} from '@netx/core/lib/underscore-netx';\n\nimport 'core-libs/nx-drag/jquery-netx-dragresize';\n\n/**\n * @function\n * @param {string} str String\n * @param {boolean} Is percent\n */\nconst isPercent = (str) => {\n\tif (str == null) return false;\n\treturn /^\\d+(\\.\\d+)?\\%$/g.test(str.toString());\n};\n\nconst Props = {\n\t/** @method */\n\tcleanUpResizable() {\n\t\tif (!this.resizeTargets) return;\n\t\tthis.Plugins.Destroy('netxDragResize', this.resizeTargets);\n\t},\n\n\t/** @method */\n\tprepareResizable() {\n\t\tthis.resizeTargets = this.resizeTargetSelector\n\t\t\t? [...this.el.querySelectorAll(this.resizeTargetSelector)]\n\t\t\t: [this.el];\n\n\t\tif (!this.resizeTargets.length) {\n\t\t\tthis.resizeTargets = null;\n\t\t\treturn;\n\t\t}\n\n\t\tlet startSize = this.resizableGetStartSize();\n\t\tthis.Plugins.Initialize('netxDragResize', this.resizeTargets, {\n\t\t\tstartHeigh: startSize,\n\t\t\tstartWidth: startSize,\n\t\t});\n\t},\n\n\t/**\n\t * @method\n\t * @return {number|string} Size\n\t */\n\tresizableGetStartSize() {\n\t\tif (!this.resizeUserPref)\n\t\t\treturn horizontal ? this.resizeStartWidth : this.resizeStartHeight;\n\n\t\tconst horizontal = this.resizeDirection === 'horizontal';\n\t\tlet size = Netx.getPreference(this.resizeUserPref) || 0;\n\t\tlet minSize = horizontal ? this.resizeMinWidth : this.resizeMinHeight;\n\n\t\tif (\n\t\t\t!this.resizeUsingPercent &&\n\t\t\t(isPercent(size) || isNaN(parseInt(size)) || size < minSize)\n\t\t) {\n\t\t\tsize = minSize;\n\t\t}\n\n\t\treturn size;\n\t},\n\n\t/**\n\t * @method\n\t * @param {event} e `dragresizestart` event\n\t */\n\tresizeStart(e) {\n\t\te && e.stopPropagation();\n\t},\n\n\t/**\n\t * @method\n\t * @param {event} e `dragresizeend`|`dragresizereset`|`hidden.bs.collapse`|`shown.bs.collapse` event\n\t */\n\tresized(e) {\n\t\te && e.stopPropagation();\n\n\t\tif (!this.resizeTargets) return;\n\n\t\tconst originalEvent = (e && e.originalEvent) || {};\n\t\t// Store user preferred width\n\t\tif (!originalEvent.ui) return;\n\n\t\tif (this.resizeUserPref) {\n\t\t\tNetx.setPreference(\n\t\t\t\tthis.resizeUserPref,\n\t\t\t\tthis.resizeDirection === 'horizontal'\n\t\t\t\t\t? originalEvent.ui.width\n\t\t\t\t\t: originalEvent.ui.height,\n\t\t\t);\n\t\t}\n\t},\n\n\t/**\n\t * @method\n\t * @param {event} e `dragresizing` event\n\t */\n\tresizing(e) {\n\t\t// Prevent parent response\n\t\te && e.stopPropagation();\n\t},\n\n\t/**\n\t * @method\n\t * @param {boolean} resizable Resizable\n\t */\n\ttoggleResizable(resizable) {\n\t\tif (!this.resizeTargets) return;\n\n\t\tresizable = resizable != null ? resizable === true : !this.resizable;\n\t\tthis.resizeDisabled = !resizable;\n\t\tthis.resizeTargets.forEach((target) => {\n\t\t\ttarget.classList.toggle('resize-disabled', !resizable);\n\t\t});\n\t},\n};\n\nexport default function (target) {\n\tif (isMobile() || !target || target.hasFunctionality(NAME)) return target;\n\n\ttarget.extendFunctionality(Props);\n\n\ttarget.addInitializer((instance, opts = {}) => {\n\t\tinstance.events = {\n\t\t\tdragresizestart: 'resizeStart',\n\t\t\tdragresizeend: 'resized',\n\t\t\tdragresizing: 'resizing',\n\t\t\tdragresizereset: 'resized',\n\t\t\t...instance.events,\n\t\t};\n\t\tinstance.resizeStartHeight = opts.resizeStartHeight;\n\t\tinstance.resizeStartWidth = opts.resizeStartWidth;\n\t\tinstance.resizeTargetSelector = opts.resizeTargetSelector;\n\t\tinstance.resizeUserPref = opts.resizeUserPref;\n\t\tinstance.resizeDirection = opts.resizeDirection || 'horizontal';\n\t\tinstance.resizeUsingPercent = opts.resizeUsingPercent === true;\n\t\tinstance.resizeMinHeight = opts.resizeMinHeight;\n\t\tinstance.resizeMinWidth = opts.resizeMinWidth;\n\n\t\t// Add plugins\n\t\tinstance.Plugins.Register({\n\t\t\tnetxDragResize: {\n\t\t\t\tname: 'netxDragResize',\n\t\t\t\toptions: {\n\t\t\t\t\tdirection: instance.resizeDirection,\n\t\t\t\t\tdragFrom: opts.resizeDragFrom || 'right',\n\t\t\t\t\tmaxHeight: opts.resizeMaxHeight,\n\t\t\t\t\tminHeight: opts.resizeMinHeight,\n\t\t\t\t\tmaxWidth: opts.resizeMaxWidth,\n\t\t\t\t\tminWidth: opts.resizeMinWidth,\n\t\t\t\t\tusePercent: instance.resizeUsingPercent,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\t// Hey, listen!\n\t\tinstance\n\t\t\t.on('preRenderHook', instance.cleanUpResizable)\n\t\t\t.on('postRenderHook', instance.prepareResizable)\n\t\t\t.on('removeHook', instance.cleanUpResizable)\n\t\t\t.on('hidden', () => {})\n\t\t\t.on('shown', () => {});\n\t}, NAME);\n}\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-app/views/select';\n\nimport '../css/select.less';\n\nimport MaterialDrawer from '@netx/core/functionality/materialDrawer';\nimport Resizable from '@netx/core/functionality/resizable';\n\nclass Select extends Base {\n\t/** @type {boolean} */\n\tget formChanged() {\n\t\treturn this._formChanged;\n\t}\n\n\t/** @param {boolean} changed Changed */\n\tset formChanged(changed) {\n\t\tthis._formChanged = changed === true;\n\t\tthis.el.classList.toggle('form--changed', this._formChanged);\n\t}\n\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = `panel ${opts.className || ''}`;\n\n\t\topts.resizeTargetSelector = '.mdc-drawer';\n\t\topts.resizeUserPref = 'app.selectionPanel.width';\n\t\topts.resizeMinWidth = 255;\n\t\topts.resizeDragFrom = 'left';\n\n\t\t// opts.materialDrawer = {\n\t\t// \tblocking: true,\n\t\t// };\n\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * We want to be able to respond to `formChanged` being updated\n\t\t * see the setter and getter\n\t\t * @type {boolean}\n\t\t */\n\t\tthis._formChanged = false;\n\t}\n\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\t\tif (!this.collection) return this;\n\n\t\treturn this.listenTo(\n\t\t\tthis.collection,\n\t\t\t'sync reset add remove',\n\t\t\tthis.checkInputsReady,\n\t\t);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\n\t\tif (this.model) {\n\t\t\tthis.$el.toggleClass('form--is-new', this.model.isNew());\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/** @override */\n\tcancel(e) {\n\t\tif (e) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\tthis.cancelled = true;\n\t\tthis.hideDrawer();\n\t}\n\n\t/** @override */\n\tescape() {\n\t\tthis.cancel();\n\t}\n\n\t/** @override */\n\thide() {\n\t\tthis.hideDrawer();\n\t}\n\n\t/**\n\t * See notes in post render about material lists and firing changes at init\n\t * @override\n\t */\n\tinputChanged(e) {\n\t\tif (!this.inputsReady) return;\n\t\treturn super.inputChanged(e);\n\t}\n\n\t/** @method */\n\tmdcDrawerClosing() {\n\t\tif (this.cancelled || this.submitted) return true;\n\n\t\tif (!this.confirmedUnsavedChanges) {\n\t\t\tthis.confirmHide().then(() => {\n\t\t\t\tthis.confirmedUnsavedChanges = true;\n\t\t\t\tthis.hideDrawer();\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\t// const validator = this.validator.plugin;\n\t\t// if (!validator) return true;\n\t\t// validator.validate();\n\t\t// return validator.isValid() !== false;\n\t\treturn true;\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tthis.onmdcdrawerclosed &&\n\t\t\tthis.el.removeEventListener('MDCDrawer:closed', this.onmdcdrawerclosed);\n\t\tsuper.preRender();\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\tthis.el.addEventListener(\n\t\t\t'MDCDrawer:closed',\n\t\t\t(this.onmdcdrawerclosed = () => {\n\t\t\t\tthis.remove();\n\t\t\t}),\n\t\t);\n\n\t\tthis.showDrawer();\n\t\tthis.checkInputsReady();\n\t}\n\n\t/** @method */\n\tcheckInputsReady() {\n\t\t// So, material list triggers a change at init //initializeListType ... -> setCheckedCheckboxOrRadioAtIndex\n\t\t// they should be checking if the value they set actually differs from what was already set...\n\t\t// so delay listening for input changes at render\n\t\tthis.inputsReady = false;\n\t\tthis.inputReadyTimeout && clearTimeout(this.inputReadyTimeout);\n\t\tthis.inputReadyTimeout = setTimeout(() => {\n\t\t\tthis.inputsReady = true;\n\t\t}, 100);\n\t}\n\n\t/** @method */\n\thideDrawer() {\n\t\tthis.trigger('materialDrawer:close', this);\n\t}\n\n\t/** @method */\n\tshowDrawer() {\n\t\tthis.trigger('materialDrawer:open', this);\n\t}\n}\n\nResizable(Select);\nMaterialDrawer(Select);\n\nexport default Select;\n","export default {\n\t/**\n\t * View the current cart\n\t * @route\n\t * @fires {@link module:cart#cart:current:routed}\n\t */\n\t'cart(/page/:page)'(page) {\n\t\tdispatcher.trigger('cart:current:routed', page);\n\t},\n\t/**\n\t * Share the current cart\n\t * @route\n\t */\n\t'cart/share'() {\n\t\t// used by downloaders\n\t\t//dispatcher.trigger(\"share:cart:current\");\n\t\tdispatcher.trigger('cart:current:share:menu');\n\t},\n\t/**\n\t * Download metadata for the current cart\n\t * @route\n\t */\n\t'cart/share/current/metadata'() {\n\t\t// used by downloaders\n\t\t//dispatcher.trigger(\"share:cart:metadata\");\n\t\tdispatcher.trigger('cart:current:share:metadata');\n\t},\n\t// forward these psuedo-routes to /cart if they are reloaded\n\t// TODO: fold into new sharing architecture instead.\n\t/** @route */\n\t'cart/pdf'() {\n\t\t// used by pdf downloader\n\t\tNetx.router.reroute('cart', true);\n\t},\n\n\t/**\n\t * View a saved cart\n\t * @route\n\t * @fires module:cart#cart:saved:routed\n\t */\n\t'cart-assets/:id'(id) {\n\t\tdispatcher.trigger('cart:saved:routed', id);\n\t},\n\t/**\n\t * View a saved cart\n\t * @route\n\t * @fires module:cart#cart:saved:routed\n\t */\n\t'cart-assets/:id(/page/:page)'(id, page) {\n\t\tdispatcher.trigger('cart:saved:routed', id, page);\n\t},\n\t/**\n\t * Share a saved cart\n\t * @route\n\t * @fires {@link module:cart#cart:saved:share:menu|cart:saved:share:menu}\n\t */\n\t'cart-assets/:id/share'(id) {\n\t\tid = parseInt(id, 10);\n\t\tdispatcher.trigger('cart:saved:share:menu', id);\n\t},\n\n\t/**\n\t * Displays the landing page for saved carts\n\t * @route\n\t * @fires module:cart#cart:saved:landing:routed\n\t */\n\t'cart/saved'() {\n\t\tdispatcher.trigger('cart:saved:landing:routed');\n\t},\n};\n","import routes from '@netx/core-cart/routes';\n\nObject.assign(routes, {\n\t/**\n\t * Displays the landing page for saved carts\n\t * @route\n\t * @fires module:cart#cart:saved:landing:routed\n\t */\n\t'cart/saved(/:tab)'(tab) {\n\t\tdispatcher.trigger('cart:saved:landing:routed', tab);\n\t},\n});\n\nexport default routes;\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport type {AssetId} from '@netx/core-asset/types';\nimport {CART_ASSET_EVENT, CART_ASSET_BASE_EVENT} from './actions';\n\ndispatcher.once(`${CART_ASSET_BASE_EVENT}:init`, () => {\n\tdispatcher.on(\n\t\tCART_ASSET_EVENT.ADD_TO_CART,\n\t\t(assetIds: AssetId | AssetId[]) => {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'cart:addAssets',\n\t\t\t\tArray.isArray(assetIds) ? assetIds : [assetIds],\n\t\t\t);\n\t\t},\n\t);\n\n\tdispatcher.on(\n\t\tCART_ASSET_EVENT.REMOVE_FROM_CART,\n\t\t(assetIds: AssetId | AssetId[]) => {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'cart:removeAssets',\n\t\t\t\tArray.isArray(assetIds) ? assetIds : [assetIds],\n\t\t\t);\n\t\t},\n\t);\n\n\tdispatcher.trigger(`${CART_ASSET_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${CART_ASSET_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${CART_ASSET_BASE_EVENT}:initialized`, () => resolve());\n\t\t\tdispatcher.trigger(`${CART_ASSET_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","import Netx, {dispatcher} from '@netx/core/bootstrap';\nimport {CART_CURRENT_EVENT, CART_CURRENT_BASE_EVENT} from './actions';\nimport {cart} from '@netx/core-cart/collections/singleton';\n\nimport {REPURPOSE_EVENT} from '@netx/core-asset-repurpose';\n\ndispatcher.once(`${CART_CURRENT_BASE_EVENT}:init`, () => {\n\tdispatcher.on(CART_CURRENT_EVENT.CATEGORIZE, () => {\n\t\tdispatcher.trigger(`cart:categorize`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.CREATE_PDF, () => {\n\t\tdispatcher.trigger(`share:cart:current:createPDF`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.CREATE_TMS_OBJECT_PACKAGE, () => {\n\t\tdispatcher.trigger(`cart:create:tmsObjectPackage`, cart);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.DELETE, () => {\n\t\tdispatcher.trigger('cart:delete');\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.EMPTY, () => {\n\t\tdispatcher.trigger('cart:empty');\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.EDIT_ATTRIBUTES, () => {\n\t\tNetx.router.navigate('assets/grideditor', true);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.DOWNLOAD, () => {\n\t\tdispatcher.trigger(`share:cart:current:download`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.DOWNLOAD_METADATA, () => {\n\t\tdispatcher.trigger(`cart:current:share:metadata`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.FIND_REPLACE, () => {\n\t\tdispatcher.trigger(`cart:replace`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.MANAGE_ARCHIVE, () => {\n\t\tdispatcher.trigger(`cart:manage:assets:archive`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.MANAGE_EXPIRATION, () => {\n\t\tdispatcher.trigger(`cart:manage:assets:expire`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.MENU, () => {\n\t\tdispatcher.trigger(`share:menu`, cart);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.RELATIONSHIPS, () => {\n\t\tdispatcher.trigger(`cart:relationships`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.REPURPOSE, () => {\n\t\tdispatcher.trigger(REPURPOSE_EVENT.REPURPOSE_SELECTION);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.RESYNC, () => {\n\t\tdispatcher.trigger(`cart:resync`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.REVIEW, () => {\n\t\tdispatcher.trigger(`cart:project`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.SAVE, () => {\n\t\tdispatcher.trigger(`cart:save`);\n\t});\n\n\tdispatcher.on(CART_CURRENT_EVENT.VISIBILITY, () => {\n\t\tdispatcher.trigger(`cart:visibility`);\n\t});\n\n\tdispatcher.trigger(`${CART_CURRENT_BASE_EVENT}:extend`);\n\tdispatcher.trigger(`${CART_CURRENT_BASE_EVENT}:initialized`);\n});\n\nexport default {\n\tinitialize() {\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tdispatcher.once(`${CART_CURRENT_BASE_EVENT}:initialized`, () =>\n\t\t\t\tresolve(),\n\t\t\t);\n\t\t\tdispatcher.trigger(`${CART_CURRENT_BASE_EVENT}:init`);\n\t\t});\n\t},\n};\n","/**\n * The cart module creates ui & handles CRUD events for the server-side cart.\n *\n * @module cart\n */\n\n// Models\nimport SavedCartModel from './models/savedCart';\n\nimport CartSingleton from './collections/singleton/cart';\nimport SavedCartSingleton from './collections/singleton/savedCart';\n\n// Collections\nimport AssetSearchRulesCollection from '@netx/core-search/collections/searchRules_assets';\nimport CartAssetsCollection from './collections/cartAssets';\nimport SavedCartsCollection from './collections/savedCarts';\nimport SearchRulesCollection from '@netx/core-search/collections/searchRules';\n\n// Views\nimport AddAssetsToCategoryView from './views/addAssetsToCategoryView';\nimport CartDeleteWarningsView from './views/cartDeleteWarningsView';\nimport SelectView from '@netx/core-app/views/select';\n\nimport customConfig from './config';\n// import assetCustomConfig from '@netx/core-asset/config';\n\nimport routes from './routes';\n\nimport {convertToRules} from '@netx/core-search-rules/utils/convertToRules';\nimport {createCartRule} from '@netx/core-search-rules/rules/cart/cartRule';\n\nimport CartAssetController from '@netx/core-cart-asset/controller';\nimport CurrentCartController from '@netx/core-cart-current/controller';\n\n// SHAREABLE TYPES\n// ===========================\n// Define shareable types introduced by this module.\n_.extend(Netx.ShareableTypes, {\n\t'current cart': {\n\t\tlabel: i18n.t('i18n.currentCartAssets'),\n\t},\n\t'current cart metadata': {\n\t\tlabel: i18n.t('i18n.currentCartMetadata'),\n\t},\n\t'saved cart': {\n\t\tlabel: i18n.t('i18n.savedCartAssets'),\n\t},\n\t'current cart repurposed': {\n\t\tlabel: i18n.t('i18n.repurposedAssetsFromCurrentCart'),\n\t},\n\t'saved cart repurposed': {\n\t\tlabel: i18n.t('i18n.repurposedAssetsFromSavedCart'),\n\t},\n});\n\n// MODULE INITIALIZATION\n// =====================\n// All collection and model instances and event listeners\n// are created when the module is initialized.\n\n/**\n * Cart module initialize handler\n * @event module:cart#cart:init\n * @param {object} options\n */\ndispatcher.once('cart:init', function (options) {\n\t// the cart collections and views\n\tvar NS = (Netx.cart = Netx.cart || {});\n\tNS.options = options = _.extend({}, customConfig, options);\n\n\tvar bodyViews = Netx.app.bodyViews,\n\t\tfsViews = Netx.app.fsViews,\n\t\tappViews = Netx.app.appViews,\n\t\tmodalViews = Netx.app.modalViews;\n\n\t// Helper functions\n\t_.extend(Netx, {\n\t\t/**\n\t\t * @function\n\t\t * @return {module:cart/collections/currentCart} Current cart\n\t\t */\n\t\tgetCurrentCart() {\n\t\t\treturn NS.current;\n\t\t},\n\t\t/**\n\t\t * @function\n\t\t * @param {number} id Cart id\n\t\t * @return {module:cart/models/savedCart} Saved cart\n\t\t */\n\t\tgetSavedCart(id) {\n\t\t\treturn NS.saved.all.get(id);\n\t\t},\n\t});\n\n\t//=================================\n\t//\tCREATE MODELS AND COLLECTIONS\n\t//=================================\n\t// Until we can get away from this global namespace\n\t// doing this will maintain the behavior in the rest of the app while allowing\n\t// us to slowly switch over to importing the singleton instead\n\tNS.current = CartSingleton;\n\n\tNS.saved = {\n\t\tall: SavedCartSingleton.allSavedCarts,\n\t\tfavorite: SavedCartSingleton.favoriteSavedCarts,\n\t};\n\n\tNS.bootstrap = [\n\t\tCurrentCartController.initialize(),\n\t\tCartAssetController.initialize(),\n\t];\n\n\t/**\n\t * This allows themes to use their own CurrentCart classes\n\t */\n\tdispatcher.on('cart:current:fetch', function () {\n\t\tNS.current.fetch();\n\t});\n\n\t// Valid user\n\tif (Netx.user && Netx.user.profile.id) {\n\t\tNS.saved.all.fetch();\n\t}\n\n\t// any old saved cart, displayed in the gallery\n\tNS.gallery = new CartAssetsCollection([]);\n\t//=================================\n\t//\t!CREATE MODELS AND COLLECTIONS\n\t//=================================\n\n\t//=================================\n\t//\tEVENT LISTENERS\n\t//=================================\n\n\t/**\n\t * @event module:cart#cart:routed\n\t * @fires module:app#cart:current\n\t * @todo One of these routed needs to go - either this one or 'cart:current:routed'\n\t */\n\tdispatcher.on('cart:routed', function (page) {\n\t\tdispatcher.trigger('cart:current', page);\n\t});\n\t/**\n\t * @event module:cart#cart:current:routed\n\t * @fires module:app#cart:current\n\t */\n\tdispatcher.on('cart:current:routed', function (page) {\n\t\tdispatcher.trigger('cart:current', page);\n\t});\n\t/**\n\t * @event module:cart#cart:current\n\t * @param {number} page Page number\n\t * @fires module:cart#cart:current:show\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t */\n\tdispatcher.on('cart:current', function (page) {\n\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\tconditions: convertToRules(createCartRule(0)),\n\t\t\tpage: parseInt(page) || 1,\n\t\t});\n\t});\n\n\t//============================================\n\t//\tCart archiving\n\t//============================================\n\t/**\n\t * @event module:cart#cart:manage:assets:archive:show\n\t * @param {object} viewOptions View options\n\t * @fires moudle:app#app:showOptions\n\t */\n\tdispatcher.on(\n\t\t'cart:manage:assets:archive:show',\n\t\tfunction (viewOptions) {\n\t\t\tdispatcher.trigger('app:showOptions', viewOptions);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:manage:assets:archive\n\t * @fires module:cart#cart:manage:assets:archive:show\n\t * @see module:cart#cart:assets:archive\n\t * @see module:cart#cart:assets:unarchive\n\t */\n\tdispatcher.on('cart:manage:assets:archive', function () {\n\t\t// Show\n\t\tdispatcher.trigger('cart:manage:assets:archive:show', {\n\t\t\tmenu: Netx.Menus.cartManageArchive,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:assets:archive:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:archive:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartAssetsArchive\" */ './views/cartAssetsArchiveView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:assets:archive:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:archive\n\t * @fires module:cart#cart:assets:archive:show\n\t * @see module:cart#cart:assets:manage:archive\n\t */\n\tdispatcher.on('cart:assets:archive', function () {\n\t\tdispatcher.trigger('cart:assets:archive:show', {\n\t\t\tcollection: NS.current,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:assets:archive:confirmed\n\t * @param {object} data Form data\n\t * @param {Netx.Collections.CartAssets} collection Current cart assets\n\t * @fires module:notification#notification\n\t * @fires module:user#user:prefs:set\n\t * @see module:cart#cart:assets:archive\n\t */\n\tdispatcher.on('cart:assets:archive:confirmed', function (data, collection) {\n\t\tvar locationId = parseInt(data.locationId);\n\t\tcollection.archive(locationId).then(\n\t\t\tfunction (uuid) {\n\t\t\t\t// Sticky\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'user:prefs:set',\n\t\t\t\t\t'cart.archive.location',\n\t\t\t\t\tlocationId,\n\t\t\t\t);\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.archivingAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\teventStr: 'cart:assets:archive',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:assets:archive:success', data, collection);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:assets:archive:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:assets:archive:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:cart#cart:assets:archive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:archive:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:archive:succeeded\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:assets:archive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:archive:succeeded',\n\t\tfunction () {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.cartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullyArchivedAssets'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:archive:success\n\t * @see module:cart#cart:assets:archive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:archive:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:assets:unarchive:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:unarchive:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartAssetsUnarchive\" */ './views/cartAssetsUnarchiveView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:assets:unarchive:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:unarchive\n\t * @fires module:cart#cart:assets:unarchive:show\n\t * @see module:cart#cart:assets:manage:archive\n\t */\n\tdispatcher.on('cart:assets:unarchive', function () {\n\t\tdispatcher.trigger('cart:assets:unarchive:show', {\n\t\t\tcollection: NS.current,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:assets:unarchive:confirmed\n\t * @param {object} data Form data\n\t * @param {Netx.Collections.CartAssets} collection Current cart assets\n\t * @fires module:notification#notification\n\t * @fires module:user#user:prefs:set\n\t * @see module:cart#cart:assets:unarchive\n\t */\n\tdispatcher.on('cart:assets:unarchive:confirmed', function (data, collection) {\n\t\t// Vars\n\t\tvar emailWhenReady = data.unarchiveEmailWhenReady,\n\t\t\temail = emailWhenReady ? data.unarchiveEmail : '',\n\t\t\ttype = parseInt(data.unarchiveType);\n\n\t\tcollection.unarchive(type, email).then(\n\t\t\tfunction (uuid) {\n\t\t\t\t// Sticky\n\t\t\t\tdispatcher.trigger('user:prefs:set', {\n\t\t\t\t\t'cart.unarchive.emailWhenReady': emailWhenReady,\n\t\t\t\t\t'cart.unarchive.type': type,\n\t\t\t\t\t'cart.unarchive.email': emailWhenReady ? email : '',\n\t\t\t\t});\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.unarchivingAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\teventStr: 'cart:assets:unarchive',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:assets:unarchive:success', data, collection);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:assets:unarchive:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:assets:unarchive:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:cart#cart:assets:unarchive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:unarchive:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:unarchive:succeeded\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:assets:unarchive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:unarchive:succeeded',\n\t\tfunction () {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.cartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullyUnarchivedAssets'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:unarchive:success\n\t * @see module:cart#cart:assets:unarchive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:unarchive:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:saved:manage:assets:archive:show\n\t * @param {object} viewOptions View options\n\t * @fires moudle:app#app:showOptions\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:manage:assets:archive:show',\n\t\tfunction (viewOptions) {\n\t\t\tdispatcher.trigger('app:showOptions', viewOptions);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:manage:assets:archive\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:cart#cart:saved:manage:assets:archive:show\n\t * @see module:cart#cart:saved:assets:archive\n\t * @see module:cart#cart:saved:assets:unarchive\n\t */\n\tdispatcher.on('cart:saved:manage:assets:archive', function (model) {\n\t\t// Show\n\t\tdispatcher.trigger('cart:saved:manage:assets:archive:show', {\n\t\t\tmenu: Netx.Menus.savedCartManageArchive,\n\t\t\tdata: {model: model},\n\t\t});\n\t});\n\n\t/**\n\t * @event module:cart#cart:saved:assets:archive:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:archive:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartAssetsArchive\" */ './views/cartAssetsArchiveView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:saved:assets:archive:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:assets:archive\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:cart#cart:saved:assets:archive:show\n\t * @see module:cart#cart:saved:assets:manage:archive\n\t */\n\tdispatcher.on('cart:saved:assets:archive', function (model) {\n\t\tdispatcher.trigger('cart:saved:assets:archive:show', {\n\t\t\teventStr: 'cart:saved:assets:archive',\n\t\t\tmodel: model,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets:archive:confirmed\n\t * @param {object} data Form data\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:notification#notification\n\t * @fires module:user#user:prefs:set\n\t * @see module:cart#cart:saved:assets:archive\n\t */\n\tdispatcher.on('cart:saved:assets:archive:confirmed', function (data, model) {\n\t\tvar locationId = parseInt(data.locationId);\n\t\tmodel.archive(locationId).then(\n\t\t\tfunction (uuid) {\n\t\t\t\t// Sticky\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'user:prefs:set',\n\t\t\t\t\t'cart.archive.location',\n\t\t\t\t\tlocationId,\n\t\t\t\t);\n\t\t\t\t// Progress notification\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: [model.id],\n\t\t\t\t\ttitle: i18n.t('i18n.savedCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.archivingAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [model],\n\t\t\t\t\t\teventStr: 'cart:saved:assets:archive',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:saved:assets:archive:success', data, model);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:saved:assets:archive:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets::archive:error\n\t * @param {string} error Error string\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:app#app:alert\n\t * @see module:cart#cart:saved:assets:archive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:archive:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:assets:archive:succeeded\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:saved:assets:archive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:archive:succeeded',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: [model.id],\n\t\t\t\ttitle: i18n.t('i18n.savedCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullyArchivedAssets'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:assets:archive:success\n\t * @param {object} opts Unarchive options\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @see module:cart#cart:saved:assets:archive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:archive:success',\n\t\tfunction (opts, model) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:saved:assets:unarchive:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:unarchive:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartAssetsUnarchive\" */ './views/cartAssetsUnarchiveView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:saved:assets:unarchive:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:assets:unarchive\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:cart#cart:saved:assets:unarchive:show\n\t * @see module:cart#cart:saved:assets:manage:archive\n\t */\n\tdispatcher.on('cart:saved:assets:unarchive', function (model) {\n\t\tdispatcher.trigger('cart:saved:assets:unarchive:show', {\n\t\t\teventStr: 'cart:saved:assets:unarchive',\n\t\t\tmodel: model,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets:unarchive:confirmed\n\t * @param {object} data Form data\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:user#user:prefs:set\n\t * @see module:cart#cart:saved:assets:unarchive\n\t */\n\tdispatcher.on('cart:saved:assets:unarchive:confirmed', function (\n\t\tdata,\n\t\tmodel,\n\t) {\n\t\t// Vars\n\t\tvar emailWhenReady = data.unarchiveEmailWhenReady,\n\t\t\temail = emailWhenReady ? data.unarchiveEmail : '',\n\t\t\ttype = parseInt(data.unarchiveType);\n\n\t\tmodel.unarchive(type, email).then(\n\t\t\tfunction (uuid) {\n\t\t\t\t// Sticky\n\t\t\t\tdispatcher.trigger('user:prefs:set', {\n\t\t\t\t\t'cart.unarchive.emailWhenReady': emailWhenReady,\n\t\t\t\t\t'cart.unarchive.type': type,\n\t\t\t\t\t'cart.unarchive.email': emailWhenReady ? email : '',\n\t\t\t\t});\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: [model.id],\n\t\t\t\t\ttitle: i18n.t('i18n.savedCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.unarchivingAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [model],\n\t\t\t\t\t\teventStr: 'cart:saved:assets:unarchive',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:saved:assets:unarchive:success', data, model);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:saved:assets:unarchive:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets:unarchive:error\n\t * @param {string} error Error string\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:app#app:alert\n\t * @see module:cart#cart:saved:assets:unarchive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:unarchive:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:assets:unarchive:succeeded\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:saved:assets:unarchive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:unarchive:succeeded',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: [model.id],\n\t\t\t\ttitle: i18n.t('i18n.savedCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullyUnarchivedAssets'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:assets:unarchive:success\n\t * @param {object} opts Unarchive options\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @see module:cart#cart:saved:assets:unarchive:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:unarchive:success',\n\t\tfunction (opts, model) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\tCart archiving\n\t//============================================\n\n\t//============================================\n\t//\tCart add/remove assets\n\t//============================================\n\t/**\n\t * @event module:cart#cart:add\n\t * @param {module:asset/models/asset} model Asset model\n\t */\n\tdispatcher.on('cart:add', function (model) {\n\t\t// Pass everything that isn't an 'all' through cart:addAssets\n\t\tdispatcher.trigger('cart:addAssets', [model.id]);\n\t});\n\n\t/**\n\t * @event module:cart#cart:addAll\n\t * @param {Netx.Collections.Assets|Netx.Collections.SearchRules} collection Assets collection or selection\n\t * @fires module:app#app:progress\n\t */\n\tdispatcher.on('cart:addAll', function (collection) {\n\t\tvar thing =\n\t\t\tcollection instanceof SearchRulesCollection\n\t\t\t\t? collection\n\t\t\t\t: collection.selection;\n\n\t\t// Show\n\t\tdispatcher.trigger('app:progress', {\n\t\t\tcollection: collection,\n\t\t\teventStr: 'cart:addAll',\n\t\t\tmessage: i18n.t('i18n.addingToCart', {\n\t\t\t\tdefaultValue: 'Adding to selection...',\n\t\t\t}),\n\t\t});\n\n\t\tNS.current.addFacetedSearchToCart(thing).then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tif (!(collection instanceof SearchRulesCollection)) {\n\t\t\t\t\tdispatcher.trigger('cart:added', collection.pluck('assetId'));\n\t\t\t\t}\n\t\t\t\tdispatcher.trigger('cart:addAll:success', collection);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('cart:addAll:error', err, collection);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * Add assets to cart\n\t * @event module:cart#cart:addAssets\n\t * @param {array} ids Assets ids\n\t */\n\tdispatcher.on('cart:addAssets', function (ids) {\n\t\t// Queue ( so we do not end up hitting the server an ungodly amount of times)\n\t\tNS.current.addQueue.assets.add(\n\t\t\tids.map((id) => {\n\t\t\t\treturn {id};\n\t\t\t}),\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:addPage\n\t * @param {Netx.Collections.Assets} collection Assets collection\n\t */\n\tdispatcher.on('cart:addPage', function (collection) {\n\t\t// Pass everything that isn't an 'all' through cart:addAssets\n\t\tdispatcher.trigger('cart:addAssets', collection);\n\t});\n\n\t/**\n\t * @event module:cart#cart:empty:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:empty:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartEmptyConfirm\" */ './views/cartEmptyConfirm'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:empty:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:empty\n\t * @fires module:cart#cart:empty:confirmed\n\t * @fires module:cart#cart:empty:show\n\t */\n\tdispatcher.on('cart:empty', function () {\n\t\t// Did the user choose to disable confirm empty?\n\t\tif (!Netx.getPreference('cart.disableConfirmEmpty', true)) {\n\t\t\t// Show confirm (prompt)\n\t\t\tdispatcher.trigger('cart:empty:show');\n\t\t} else {\n\t\t\tdispatcher.trigger('cart:empty:confirmed');\n\t\t}\n\t});\n\t/**\n\t * @event module:cart#cart:empty:confirmed\n\t * @fires module:cart#cart:empty:error\n\t * @fires module:cart#cart:empty:success\n\t * @fires module:user#user:prefs:set\n\t */\n\tdispatcher.on('cart:empty:confirmed', function (values) {\n\t\t// Does the user wnat to disable further confirmations on this?\n\t\tif (_.isObject(values) && values.disableFutureConfirm) {\n\t\t\tdispatcher.trigger('user:prefs:set', 'cart.disableConfirmEmpty', true);\n\t\t}\n\n\t\tNS.current.empty().then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('cart:empty:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('cart:empty:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:remove\n\t * @param {module:asset/models/asset} model Asset model\n\t * @fires module:cart#cart:removeAssets\n\t */\n\tdispatcher.on('cart:remove', function (model) {\n\t\tdispatcher.trigger('cart:removeAssets', [model.id]);\n\t});\n\t/**\n\t * @event module:cart#cart:removeAssets\n\t * @param {array} assets Assets array\n\t */\n\tdispatcher.on('cart:removeAssets', function (ids) {\n\t\t// Queue ( so we do not end up hitting the server an ungodly amount of times)\n\t\tNS.current.removeQueue.assets.add(\n\t\t\tids.map((id) => {\n\t\t\t\treturn {id};\n\t\t\t}),\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:toggle\n\t * @param {module:asset/models/asset} asset Asset model\n\t * @param {event} e jQuery event\n\t * @fires module:cart#cart:add\n\t * @fires module:cart#cart:remove\n\t */\n\tdispatcher.on('cart:toggle', function (asset, e) {\n\t\tdispatcher.trigger(\n\t\t\tasset.get('inCurrentCart') ? 'cart:remove' : 'cart:add',\n\t\t\tasset,\n\t\t\te,\n\t\t);\n\t});\n\t//============================================\n\t//\t!Cart add/remove assets\n\t//============================================\n\n\t//============================================\n\t//\tCart delete assets\n\t//============================================\n\t/**\n\t * Deleting all assets in current cart. (Not deleting a saved cart.)\n\t * @event module:cart#cart:delete\n\t * @fires module:app#app:confirm:delete\n\t * @fires module:notifiaction#notification\n\t * @see module:cart#cart:delete:confirmed\n\t */\n\tdispatcher.on('cart:delete', function () {\n\t\tconst assetCount = NS.current.assetCount();\n\t\t// Nothing to delete\n\t\tif (!assetCount) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\tdescription: i18n.t('i18n.noAssetsToDelete'),\n\t\t\t\ttype: 'warning',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\targs: [NS.current],\n\t\t\teventStr: 'cart:delete',\n\t\t\tmessage: i18n.t('i18n.confirmDeleteCart', {\n\t\t\t\tcount: assetCount,\n\t\t\t}),\n\t\t});\n\t});\n\n\t/**\n\t * Deleting assets\n\t * @event module:cart#cart:delete:confirmed\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:cart#cart:delete:error\n\t * @fires module:cart#cart:delete:success\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:delete:succeeded\n\t */\n\tdispatcher.on('cart:delete:confirmed', function (currentCart) {\n\t\tPromise.all([currentCart.getAssetIds(), currentCart.deleteCartAssets()])\n\t\t\t.then((results) => {\n\t\t\t\tconst [assetIds, uuid] = results;\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: assetIds,\n\t\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.deletingCartAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [currentCart, assetIds],\n\t\t\t\t\t\teventStr: 'cart:delete',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:delete:success', currentCart, assetIds);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tdispatcher.trigger('cart:delete:error', err);\n\t\t\t});\n\t});\n\t//\n\t// TODO: see DAM-5109 re: the inevitabe confusion between :success events and :succeeded events.\n\t// The former are emitted by action handlers (like above); The latter are intended for batch waiters (like below)\n\t//\n\t/**\n\t * Deleted assets - this event comes from a successful app:pollBatchJob\n\t * @event module:cart#cart:delete:succeeded\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t * @fires module:notification#notification\n\t * @fires module:cart#cart:delete:warn\n\t * @fires module:asset#asset:deleted\n\t * @fires module:asset#asset:deleted:(assetId)\n\t */\n\tdispatcher.on(\n\t\t'cart:delete:succeeded',\n\t\tfunction (currentCart, assetIds, batchJob) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: assetIds,\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartAssetsSuccessfullyDeleted'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\tconst warningObj = batchJob.get('warningObject');\n\t\t\tif (warningObj && warningObj.failedAssetCount) {\n\t\t\t\tassetIds = assetIds.filter(\n\t\t\t\t\t(id) => !warningObj.failedAssets.includes(id),\n\t\t\t\t);\n\t\t\t\tdispatcher.trigger('cart:delete:warn', NS.current, warningObj);\n\t\t\t}\n\n\t\t\tassetIds.forEach((id) => {\n\t\t\t\tdispatcher.trigger('asset:deleted', id);\n\t\t\t\tdispatcher.trigger(`asset:deleted:${id}`);\n\t\t\t});\n\n\t\t\t// Refetch our sets\n\t\t\tNS.current.fetch({duplicateQueryPolicy: 'abort'});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:delete:error\n\t * @param {string} error Error\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:delete:error',\n\t\tfunction (error, currentCart) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:delete:success\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t */\n\tdispatcher.on(\n\t\t'cart:delete:success',\n\t\tfunction (currentCart, assetIds) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:delete:warn:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on('cart:delete:warn:show', (viewOptions) => {\n\t\tNetx.app.modalViews.add({\n\t\t\tviewClass: CartDeleteWarningsView,\n\t\t\tshowActions: ['cart:delete:warn:show'],\n\t\t\tviewOptions: viewOptions,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:delete:warn\n\t * @param {module/@netx/core-cart/collections/currentCart} currentCart Current cart\n\t * @param {object} warning Warning\n\t * @fires module:dataSet#dataSet:replace:warn:show\n\t */\n\tdispatcher.on('cart:delete:warn', (currentCart, warning) => {\n\t\tdispatcher.trigger('cart:delete:warn:show', {\n\t\t\tcollection: currentCart,\n\t\t\twarning: warning,\n\t\t});\n\t});\n\t//============================================\n\t//\t!Cart assets\n\t//============================================\n\n\t//============================================\n\t//\tCart add assets to category\n\t//============================================\n\t/**\n\t * @event module:cart#cart:add:assets:to:category:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:add:assets:to:category:show',\n\t\tfunction (viewOptions) {\n\t\t\tmodalViews.add({\n\t\t\t\tviewClass: AddAssetsToCategoryView,\n\t\t\t\tshowActions: ['cart:add:assets:to:category:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:add:assets:to:category\n\t * @fires module:cart#cart:add:assets:to:category:show\n\t * @see module:cart#cart:add:assets:to:category:confirmed\n\t */\n\tdispatcher.on('cart:add:assets:to:category', function () {\n\t\tconst tree = Netx.category.selectTree;\n\t\ttree.fetch().then(() => {\n\t\t\ttree.disabledCategories = [];\n\t\t\ttree.selectedCategory = null;\n\n\t\t\tdispatcher.trigger('cart:add:assets:to:category:show', {\n\t\t\t\tcollection: NS.current,\n\t\t\t\ttree: tree,\n\t\t\t});\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:add:assets:to:category:confirmed\n\t * @param {object} data Data\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:cart#cart:add:assets:to:category:error\n\t * @fires module:cart#cart:add:assets:to:category:success\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:add:assets:to:category:succeeded\n\t */\n\tdispatcher.on('cart:add:assets:to:category:confirmed', function (data) {\n\t\t// Category ID needed\n\t\tconst catId = parseInt(data.categoryId);\n\n\t\t// Ensure it is a good category id value\n\t\tif (!catId || isNaN(catId)) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'cart:add:assets:to:category:error',\n\t\t\t\ti18n.t('i18n.invalidCategory'),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tPromise.all([\n\t\t\tCartSingleton.getAssetIds(),\n\t\t\tCartSingleton.categorize(catId, 'Add'),\n\t\t])\n\t\t\t.then((results) => {\n\t\t\t\tconst [assetIds, uuid] = results;\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: assetIds,\n\t\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.addingAssetsToCategory'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [CartSingleton, assetIds, catId],\n\t\t\t\t\t\teventStr: 'cart:add:assets:to:category',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:add:assets:to:category:success',\n\t\t\t\t\tCartSingleton,\n\t\t\t\t\tassetIds,\n\t\t\t\t\tcatId,\n\t\t\t\t);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:add:assets:to:category:error',\n\t\t\t\t\terr,\n\t\t\t\t\tCartSingleton,\n\t\t\t\t);\n\t\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:add:assets:to:category:error\n\t * @param {string} error Error\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:add:assets:to:category:error',\n\t\tfunction (error, currentCart) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:add:assets:to:category:succeeded\n\t * @param {array} assetIds Asset id array\n\t * @param {number} catId Category id\n\t * @fires module:cart#cart:add:assets:to:category:error\n\t * @fires module:cart#cart:add:assets:to:category:success\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:add:assets:to:category:succeeded',\n\t\tfunction (currentCart, assetIds, catId) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: assetIds,\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.assetsWereSuccessfullyAddedToCategory', {\n\t\t\t\t\tcount: assetIds.length,\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:add:assets:to:category:success\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t * @param {number} catId Category id\n\t */\n\tdispatcher.on(\n\t\t'cart:add:assets:to:category:success',\n\t\tfunction (assetIds, catId) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Cart add assets to category\n\t//============================================\n\n\t//============================================\n\t//\tCart duplicate\n\t//============================================\n\t/**\n\t * @event module:cart#cart:duplicate:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:duplicate:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-duplicateFormView\" */ './views/duplicateFormView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:duplicate:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Duplicate saved cart\n\t * @event module:cart#cart:duplicate\n\t * @fires module:cart#cart:duplicate:show\n\t */\n\tdispatcher.on('cart:duplicate', function (model) {\n\t\t// Show\n\t\tdispatcher.trigger('cart:duplicate:show', {\n\t\t\tmodel: model,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:duplicate:confirmed\n\t * @param {object|string} values Cart duplication values\n\t * @param {module:cart/models/savedCart} model SavedCart model\n\t * @fires module:cart#cart:duplicate:error\n\t * @fires module:cart#cart:duplicate:success\n\t */\n\tdispatcher.on('cart:duplicate:confirmed', function (values, model) {\n\t\tmodel.duplicateCart(_.isObject(values) ? values.title : values).then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('cart:duplicate:success', model);\n\t\t\t\tNS.saved.all.fetch();\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:duplicate:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:duplicate:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:duplicate:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, 'Danger');\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:duplicate:success\n\t * @param {module:cart/models/savedCart} model SavedCart model\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:duplicate:success',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.cartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullyDuplicated'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Cart duplicate\n\t//============================================\n\n\t//============================================\n\t//\tCart Expiration (assets)\n\t//============================================\n\n\t/**\n\t * @event module:cart#cart:manage:assets:expire:show\n\t * @param {object} viewOptions View options\n\t * @fires moudle:app#app:showOptions\n\t */\n\tdispatcher.on(\n\t\t'cart:manage:assets:expire:show',\n\t\tfunction (viewOptions) {\n\t\t\tdispatcher.trigger('app:showOptions', viewOptions);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:manage:assets:expire\n\t * @see module:cart#cart:assets:expire\n\t * @see module:cart#cart:assets:unexpire\n\t */\n\tdispatcher.on('cart:manage:assets:expire', function () {\n\t\t// Show\n\t\tdispatcher.trigger('cart:manage:assets:expire:show', {\n\t\t\tmenu: Netx.Menus.cartExpirationActions,\n\t\t\tdata: {cart: NS.current},\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:assets:expire:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:expire:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartAssetsSetExpiration\" */ './views/cartAssetsSetExpirationView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:assets:expire:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:expire\n\t * @fires module:cart#cart:assets:expire:show\n\t * @see module:cart#cart:assets:expire:confirmed\n\t */\n\tdispatcher.on('cart:assets:expire', function () {\n\t\t// Show\n\t\tdispatcher.trigger('cart:assets:expire:show', {\n\t\t\tcollection: NS.current,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:assets:expire:confirmed\n\t * @param {object} data Form data\n\t * @param {Netx.Collections.CartAssets} collection Current cart assets\n\t * @fires module:cart#cart:assets:expire:error\n\t * @fires module:cart#cart:assets:expire:success\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:assets:expire\n\t * @see module:cart#cart:assets:expire:succeeded\n\t */\n\tdispatcher.on('cart:assets:expire:confirmed', function (data, collection) {\n\t\tif (!data || !data.expirationDate) {\n\t\t\treturn dispatcher.trigger(\n\t\t\t\t'cart:assets:expire:error',\n\t\t\t\tnew Error(i18n.t('i18n.noExpirationDateProvided')),\n\t\t\t);\n\t\t}\n\n\t\tvar date = data.expirationDate;\n\t\tcollection.expireAssets(date).then(\n\t\t\tfunction ([uuid, time]) {\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\ttitle: i18n.t('i18n.cartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.expiringAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [time],\n\t\t\t\t\t\teventStr: 'cart:assets:expire',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tdispatcher.trigger('cart:assets:expire:success', time);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:assets:expire:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:assets:expire:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:cart#cart:assets:expire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:expire:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:expire:success\n\t * @param {string} date Date string\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:assets:expire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:expireAssets:success',\n\t\tfunction (date) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:expire:succeeded\n\t * @param {number} date Date in ms\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:assets:expire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:expire:succeeded',\n\t\tfunction (date) {\n\t\t\tNS.current.getAssetIds().then((assetIds) => {\n\t\t\t\tassetIds.forEach((assetId) => {\n\t\t\t\t\tdispatcher.trigger('cart:assets:expire:asset:success', assetId, date);\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t`cart:assets:expire:asset:${assetId}:success`,\n\t\t\t\t\t\tdate,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\t// Web sockets would be really cool!\n\t\t\t\tNS.current.fetch();\n\t\t\t});\n\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.cartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullySetAssetExpiration'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:assets:unexpire\n\t * @fires module:app#app:confirm\n\t * @see module:cart#cart:assets:unexpire:confirmed\n\t */\n\tdispatcher.on('cart:assets:unexpire', function () {\n\t\tdispatcher.trigger('app:confirm', {\n\t\t\tmessage: i18n.t('i18n.confirmCurrentCartAssetsUnexpire'),\n\t\t\ttitle: i18n.t('i18n.unexpireCartAssets'),\n\t\t\targs: [NS.current],\n\t\t\teventStr: 'cart:assets:unexpire',\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:assets:unexpire:confirmed\n\t * @param {Netx.Collections.CartAssets} collection Current cart assets\n\t * @see module:cart#cart:assets:unexpire:error\n\t * @see module:cart#cart:assets:unexpire:success\n\t * @see module:cart#cart:assets:unexpire:succeeded\n\t * @see module:cart#cart:assets:unexpire\n\t */\n\tdispatcher.on('cart:assets:unexpire:confirmed', function (collection) {\n\t\tcollection.unexpireAssets().then(\n\t\t\tfunction ([uuid, time]) {\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.unexpiringAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\teventStr: 'cart:assets:unexpire',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:assets:unexpire:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:assets:unexpire:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:assets:unexpire:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:cart#cart:assets:unexpire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:unexpire:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:unexpire:success\n\t * @see module:cart#cart:assets:unexpire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:unexpireAssets:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:assets:unexpire:succeeded\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:assets:unexpire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:assets:unexpire:succeeded',\n\t\tfunction () {\n\t\t\tNS.current.getAssetIds().then((assetIds) => {\n\t\t\t\tassetIds.forEach((assetId) => {\n\t\t\t\t\tdispatcher.trigger('cart:assets:expire:asset:success', assetId, 0);\n\t\t\t\t\tdispatcher.trigger(`cart:assets:expire:asset:${assetId}:success`, 0);\n\t\t\t\t});\n\t\t\t\t// Web sockets would be really cool!\n\t\t\t\tNS.current.fetch();\n\t\t\t});\n\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.cartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullySetAssetUnexpiration'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Cart Expiration (assets)\n\t//============================================\n\n\t//============================================\n\t//\tCart link/delink\n\t//============================================\n\t/**\n\t * @event module:cart#cart:delink:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:delink:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(/* webpackChunkName: \"view-delink\" */ './views/delinkView').then(\n\t\t\t\t(View) => {\n\t\t\t\t\tmodalViews.add({\n\t\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\t\tshowActions: ['cart:delink:show'],\n\t\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Delinking all assets in current cart\n\t * @event module:cart#cart:delink\n\t * @fires module:notification#notification\n\t * @fires module:cart#cart:delink:show\n\t * @see module:cart#cart:delink:confirmed\n\t */\n\tdispatcher.on('cart:delink', function () {\n\t\tconst currentCart = Netx.getCurrentCart();\n\t\t// Nothing to delink (must have at least 2)\n\t\tif (currentCart.assetCount() < 2) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\tdescription: i18n.t('i18n.noAssetsToDelink'),\n\t\t\t\ttype: 'warning',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tdispatcher.trigger('cart:delink:show', {\n\t\t\tcollection: currentCart,\n\t\t});\n\t});\n\t/**\n\t * Delinking assets\n\t * @event module:cart#cart:delink:confirmed\n\t * @param {object} data Data object\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:cart#cart:delink:error\n\t * @fires module:cart#cart:delink:success\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:delink:succeeded\n\t */\n\tdispatcher.on('cart:delink:confirmed', function (data, currentCart) {\n\t\tPromise.all([currentCart.getAssetIds(), currentCart.delink(data.scope)])\n\t\t\t.then((results) => {\n\t\t\t\tconst [assetIds, uuid] = results;\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: assetIds,\n\t\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.delinkingAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [currentCart, assetIds],\n\t\t\t\t\t\teventStr: 'cart:delink',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:delink:success', currentCart, assetIds);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tdispatcher.trigger('cart:delink:error', err, currentCart);\n\t\t\t});\n\t});\n\t/**\n\t * Delinked assets - this event comes from a successful app:pollBatchJob\n\t * @event module:cart#cart:delink:succeeded\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t * @fires module:asset#asset:delinked\n\t * @fires module:asset#asset:delinked:(assetId)\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:delink:succeeded',\n\t\tfunction (currentCart, assetIds) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartAssetsSuccessfullyDelinked'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\t// Loop over assetIds and send out events\n\t\t\tassetIds.forEach((id) => {\n\t\t\t\tdispatcher.trigger('asset:delinked', id, assetIds);\n\t\t\t\tdispatcher.trigger(`asset:delinked:${id}`, _.without(assetIds, id));\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI handler for delink error\n\t * @event module:cart#cart:delink:error\n\t * @param {string} error Error\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:delink:error',\n\t\tfunction (error, currentCart) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI handler for delink success\n\t * @event module:cart#cart:delink:success\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t */\n\tdispatcher.on(\n\t\t'cart:delink:succeess',\n\t\tfunction (currentCart, assetIds) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Link all assets in current cart\n\t * @event module:cart#cart:link\n\t * @fires module:notification#notification\n\t * @fires module:cart#cart:link:show\n\t */\n\tdispatcher.on('cart:link', function () {\n\t\tconst currentCart = Netx.getCurrentCart();\n\t\tconst assetCount = currentCart.assetCount();\n\n\t\t// Nothing to delink (must have at least 2)\n\t\tif (assetCount < 2) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\tdescription: i18n.t('i18n.noAssetsToLink'),\n\t\t\t\ttype: 'warning',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\targs: [currentCart],\n\t\t\teventStr: 'cart:link',\n\t\t\tyesLabel: i18n.t('i18n.confirm'),\n\t\t\tmessage: i18n.t('i18n.confirmLinkCart', {\n\t\t\t\tcount: assetCount,\n\t\t\t}),\n\t\t});\n\t});\n\t/**\n\t * Linking assets\n\t * @event module:cart#cart:link:confirmed\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:cart#cart:link:error\n\t * @fires module:cart#cart:link:success\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:link:succeeded\n\t */\n\tdispatcher.on('cart:link:confirmed', function (currentCart) {\n\t\tPromise.all([currentCart.getAssetIds(), currentCart.link()])\n\t\t\t.then((results) => {\n\t\t\t\tconst [assetIds, uuid] = results;\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: assetIds,\n\t\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.linkingAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [currentCart, assetIds],\n\t\t\t\t\t\teventStr: 'cart:link',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:link:success', currentCart, assetIds);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tdispatcher.trigger('cart:link:error', err, currentCart);\n\t\t\t});\n\t});\n\t/**\n\t * Linked assets - this event comes from a successful app:pollBatchJob\n\t * @event module:cart#cart:link:succeeded\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t * @fires module:asset#asset:linked\n\t * @fires module:asset#asset:linked:(assetId)\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:link:succeeded',\n\t\tfunction (currentCart, assetIds) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: assetIds,\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartAssetsSuccessfullyLinked'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\t// Loop over assetIds and send out events\n\t\t\tassetIds.forEach((id) => {\n\t\t\t\tdispatcher.trigger('asset:linked', id, assetIds);\n\t\t\t\tdispatcher.trigger(`asset:linked:${id}`, _.without(assetIds, id));\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:link:error\n\t * @param {string} error Error\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:link:error',\n\t\tfunction (error, currentCart) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:link:success\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t */\n\tdispatcher.on('cart:link:success', function (currentCart, assetIds) {\n\t\t//\n\t});\n\t//============================================\n\t//\t!Cart link/delink\n\t//============================================\n\n\t//============================================\n\t//\tCart move assets to category\n\t//============================================\n\t/**\n\t * @event module:cart#cart:move:assets:to:category:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:move:assets:to:category:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-moveAssetsToCategory\" */ './views/moveAssetsToCategoryView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:move:assets:to:category:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:move:assets:to:category\n\t * @fires module:cart#cart:move:assets:to:category:show\n\t * @see module:cart#cart:move:assets:to:category:confirmed\n\t */\n\tdispatcher.on('cart:move:assets:to:category', function () {\n\t\tconst tree = Netx.category.selectTree;\n\t\ttree.fetch();\n\n\t\tdispatcher.trigger('cart:move:assets:to:category:show', {\n\t\t\tcollection: NS.current,\n\t\t\ttree: tree,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:move:assets:to:category:confirmed\n\t * @param {object} data Data object\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:cart#cart:move:assets:to:category:error\n\t * @fires module:cart#cart:move:assets:to:category:success\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:move:assets:to:category:succeeded\n\t */\n\tdispatcher.on('cart:move:assets:to:category:confirmed', function (data) {\n\t\tconst catId = parseInt(data.categoryId);\n\n\t\t// Ensure it is a good category id value\n\t\tif (!catId || isNaN(catId)) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'cart:move:assets:to:category:error',\n\t\t\t\ti18n.t('i18n.invalidCategory'),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tPromise.all([\n\t\t\tCartSingleton.getAssetIds(),\n\t\t\tCartSingleton.categorize(catId, 'Move'),\n\t\t])\n\t\t\t.then((results) => {\n\t\t\t\tconst [assetIds, uuid] = results;\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: assetIds,\n\t\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.movingAssetsToCategory'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [CartSingleton, assetIds, catId],\n\t\t\t\t\t\teventStr: 'cart:move:assets:to:category',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:move:assets:to:category:success',\n\t\t\t\t\tCartSingleton,\n\t\t\t\t\tassetIds,\n\t\t\t\t\tcatId,\n\t\t\t\t);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:move:assets:to:category:error',\n\t\t\t\t\terr,\n\t\t\t\t\tCartSingleton,\n\t\t\t\t);\n\t\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:move:assets:to:category:error\n\t * @param {string} error Error\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('cart:move:assets:to:category:error', function (\n\t\terror,\n\t\tcurrentCart,\n\t) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\t/**\n\t * @event module:cart#cart:move:assets:to:category:succeeded\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t * @param {number} catId Category id\n\t * @fires module:asset#asset:moved:to:category\n\t * @fires module:asset#asset:moved:to:category:<assetId>\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:move:assets:to:category:succeeded',\n\t\tfunction (currentCart, assetIds, catId) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: assetIds,\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartAssetsWereSuccessfullyMoved', {\n\t\t\t\t\tcount: assetIds.length,\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t\tassetIds.forEach((id) => {\n\t\t\t\tdispatcher.trigger('asset:moved:to:category', id, catId);\n\t\t\t\tdispatcher.trigger(`asset:moved:to:category:${id}`, catId);\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:move:assets:to:category:success\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t * @param {number} catId Category id\n\t */\n\tdispatcher.on(\n\t\t'cart:move:assets:to:category:success',\n\t\tfunction (currentCart, assetIds, catId) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Cart move assets to category\n\t//============================================\n\n\t//============================================\n\t//\tProjects\n\t//============================================\n\tif (Netx.getPreference('review.enabled', true)) {\n\t\t/**\n\t\t * @event module:cart#cart:project\n\t\t * @fires module:project#project:cart\n\t\t */\n\t\tdispatcher.on('cart:project', function () {\n\t\t\tdispatcher.trigger('project:cart', NS.current);\n\t\t});\n\t\t/**\n\t\t * @event module:cart#cart:project:new\n\t\t * @fires module:project#project:new:from:cart\n\t\t */\n\t\tdispatcher.on('cart:project:new', function () {\n\t\t\tdispatcher.trigger('project:new:from:cart', NS.current);\n\t\t});\n\t\t/**\n\t\t * @event module:cart#cart:project:add\n\t\t * @fires module:project#project:add:cart\n\t\t */\n\t\tdispatcher.on('cart:project:add', function () {\n\t\t\tdispatcher.trigger('project:add:cart', NS.current);\n\t\t});\n\t\t/**\n\t\t * @event module:cart#cart:project\n\t\t * @param {module:cart/models/savedCart} model Saved cart\n\t\t * @fires module:project#project:cart\n\t\t */\n\t\tdispatcher.on('cart:saved:project', function (model) {\n\t\t\tdispatcher.trigger('project:savedCart', model);\n\t\t});\n\t\t/**\n\t\t * @event module:cart#cart:project:new\n\t\t * @param {module:cart/models/savedCart} model Saved cart\n\t\t * @fires module:project#project:new:from:savedCart\n\t\t */\n\t\tdispatcher.on('cart:saved:project:new', function (model) {\n\t\t\tdispatcher.trigger('project:new:from:savedCart', model);\n\t\t});\n\t\t/**\n\t\t * @event module:cart#cart:project:add\n\t\t * @param {module:cart/models/savedCart} model Saved cart\n\t\t * @fires module:project#project:add:savedCart\n\t\t */\n\t\tdispatcher.on('cart:saved:project:add', function (model) {\n\t\t\tdispatcher.trigger('project:add:savedCart', model);\n\t\t});\n\t}\n\t//============================================\n\t//\t!Projects\n\t//============================================\n\n\t//============================================\n\t//\tCart remove assets from category\n\t//============================================\n\t/**\n\t * @event module:cart#cart:remove:assets:from:category:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:remove:assets:from:category:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-removeAssetsFromCategory\" */ './views/removeAssetsFromCategoryView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:remove:assets:from:category:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:remove:assets:from:category\n\t * @fires module:cart#cart:remove:assets:from:category:error\n\t * @fires module:cart#cart:remove:assets:from:category:show\n\t * @see module:cart#cart:move:assets:from:category:confirmed\n\t */\n\tdispatcher.on('cart:remove:assets:from:category', function () {\n\t\tconst tree = Netx.category && Netx.category.selectTree;\n\t\tif (!tree) return;\n\n\t\ttree.fetch().then(() => {\n\t\t\ttree.disabledCategories = [];\n\t\t\ttree.selectedCategory = null;\n\n\t\t\tdispatcher.trigger('cart:remove:assets:from:category:show', {\n\t\t\t\tcollection: NS.current,\n\t\t\t\ttree: tree,\n\t\t\t});\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:remove:assets:from:category:confirmed\n\t * @param {object} data Data object\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:cart#cart:remove:assets:from:category:error\n\t * @fires module:cart#cart:remove:assets:from:category:success\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:remove:assets:from:category:succeeded\n\t */\n\tdispatcher.on('cart:remove:assets:from:category:confirmed', function (\n\t\tdata,\n\t\tcurrentCart,\n\t) {\n\t\tconst catId = parseInt(data.categoryId);\n\n\t\t// Ensure it is a good category id value\n\t\tif (!catId || isNaN(catId)) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'cart:remove:assets:from:category:error',\n\t\t\t\tnew Error(i18n.t('i18n.invalidCategory')),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tPromise.all([\n\t\t\tcurrentCart.getAssetIds(),\n\t\t\tcurrentCart.categorize(catId, 'Remove'),\n\t\t])\n\t\t\t.then((results) => {\n\t\t\t\tconst [assetIds, uuid] = results;\n\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: assetIds,\n\t\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.removingAssetsFromCategory'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [currentCart, assetIds, catId],\n\t\t\t\t\t\teventStr: 'cart:remove:assets:from:category',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:remove:assets:from:category:success',\n\t\t\t\t\tcurrentCart,\n\t\t\t\t\tassetIds,\n\t\t\t\t\tcatId,\n\t\t\t\t);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:remove:assets:from:category:error',\n\t\t\t\t\terr,\n\t\t\t\t\tcurrentCart,\n\t\t\t\t);\n\t\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:remove:assets:from:category:error\n\t * @param {string} error Error\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:remove:assets:from:category:error',\n\t\tfunction (error, currentCart) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:remove:assets:from:category:succeeded\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t * @param {number} catId Category id\n\t * @fires module:asset#asset:removed:from:category\n\t * @fires module:asset#asset:removed:from:category:<assetId>\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:remove:assets:from:category:succeeded',\n\t\tfunction (currentCart, assetIds, catId) {\n\t\t\t// Notify\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: assetIds,\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartAssetsWereSuccessfullyRemoved', {\n\t\t\t\t\tcount: assetIds.length,\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t\tassetIds.forEach((id) => {\n\t\t\t\tdispatcher.trigger('asset:removed:from:category', id, catId);\n\t\t\t\tdispatcher.trigger(`asset:removed:from:category:${id}`, catId);\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:remove:assets:from:category:success\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {array} assetIds Asset ids\n\t * @param {number} catId Category id\n\t */\n\tdispatcher.on(\n\t\t'cart:remove:assets:from:category:success',\n\t\tfunction (currentCart, assetIds, catId) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Cart remove assets from category\n\t//============================================\n\n\t//============================================\n\t//\tCart rename\n\t//============================================\n\t/**\n\t * @event module:cart#cart:rename:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:rename:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartRenameForm\" */ './views/cartRenameFormView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:rename:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Rename saved cart\n\t * @event module:cart#cart:rename\n\t * @fires module:cart#cart:rename:show\n\t */\n\tdispatcher.on('cart:rename', function (model) {\n\t\tdispatcher.trigger('cart:rename:show', {\n\t\t\tmodel: model,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:rename:confirmed\n\t * @param {object|string} values Cart rename values\n\t * @param {module:cart/models/savedCart} model SavedCart model\n\t * @fires module:cart#cart:rename:error\n\t * @fires module:cart#cart:rename:success\n\t */\n\tdispatcher.on('cart:rename:confirmed', function (values, model) {\n\t\tmodel.rename(_.isObject(values) ? values.title : values).then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('cart:rename:success', model);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:rename:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:rename:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:rename:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:rename:success\n\t * @param {module:cart/models/savedCart} model SavedCart model\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:rename:success',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: [model.id],\n\t\t\t\ttitle: i18n.t('i18n.cartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullyRenamed'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Cart rename\n\t//============================================\n\n\t//============================================\n\t//\tCart repurpose\n\t//============================================\n\t/**\n\t * @event module:cart#cart:repurpose\n\t * @param {Netx.Collections.CartAssets} collection CartAssets collection\n\t * @fires module:app#app:alert\n\t * @fires module:asset#asset:repurpose\n\t * @fires module:cart#cart:repurpose:error\n\t */\n\tdispatcher.on('cart:repurpose', (collection) =>\n\t\tdispatcher.trigger('asset:repurpose:seleciton'),\n\t);\n\n\t/**\n\t * @event module:cart#cart:repurpose:error\n\t * @param {string} error Error string\n\t * @param {Netx.Collections.CartAssets} collection CartAssets collection\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:repurpose:error',\n\t\tfunction (error, collection) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Cart repurpose\n\t//============================================\n\n\t//============================================\n\t//\tFind/replace attributes\n\t//============================================\n\n\t/**\n\t * @event module:cart#cart:replace:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:replace:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartReplace\" */ './views/cartReplaceView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:replace:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:replace\n\t * @fires moudle:cart#cart:replace:show\n\t */\n\tdispatcher.on('cart:replace', function () {\n\t\tdispatcher.trigger('cart:replace:show', {\n\t\t\tcollection: Netx.getCurrentCart(),\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:replace:confirmed\n\t * @param {object} data Data\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:cart#cart:replace:error\n\t * @fires module:cart#cart:replace:success\n\t * @fires module:cart#cart:replace:succeeded\n\t */\n\tdispatcher.on('cart:replace:confirmed', function (data, currentCart) {\n\t\tcurrentCart.replace(data).then(\n\t\t\tfunction (batchJob) {\n\t\t\t\tbatchJob &&\n\t\t\t\t\tbatchJob.once('complete', function (batchJob, data) {\n\t\t\t\t\t\tdispatcher.trigger('cart:replace:succeeded', data, currentCart);\n\t\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:replace:success', currentCart, data, batchJob);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:replace:error', err, currentCart, data);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:replace:error\n\t * @param {string} error Error\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {object} data Data\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:replace:error',\n\t\tfunction (error, currentCart, data) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:replace:success\n\t * @param {object} data Data\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @param {module:app/models/batchJob} batchJob Batch job\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:replace:success',\n\t\tfunction (currentCart, data, batchJob) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\tdescription: i18n.t('i18n.attributesUpdating'),\n\t\t\t\ttype: 'info',\n\t\t\t\tprogressTask: {\n\t\t\t\t\tuuid: batchJob.id,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:replace:succeeded\n\t * @param {object} data Data\n\t * @param {module:cart/collections/currentCart} currentCart Current cart\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on('cart:replace:succeeded', function (data, currentCart) {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'cart',\n\t\t\ttitle: i18n.t('i18n.cartReplaceSuccessTitle'),\n\t\t\tdescription: i18n.t('i18n.cartReplaceSuccessDescription'),\n\t\t\ttype: 'success',\n\t\t});\n\n\t\t// Update current cart contents after the edit completes.\n\t\tcurrentCart.fetch();\n\t});\n\n\t//============================================\n\t//\t!Find/replace attributes\n\t//============================================\n\n\t//============================================\n\t//\tCart resync\n\t//============================================\n\t/**\n\t * @event module:cart#cart:resync:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:resync:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(/* webpackChunkName: \"view-resync\" */ './views/resyncView').then(\n\t\t\t\t(View) => {\n\t\t\t\t\tmodalViews.add({\n\t\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\t\tshowActions: ['cart:resync:show'],\n\t\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Resyncing all assets in current cart\n\t * @event module:cart#cart:resync\n\t * @fires module:cart#cart:resync:show\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:resync:confirmed\n\t */\n\tdispatcher.on('cart:resync', function () {\n\t\t// Nothing to resync\n\t\tif (!NS.current.assetCount()) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\tdescription: i18n.t('i18n.noAssetsToResync'),\n\t\t\t\ttype: 'warning',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tdispatcher.trigger('cart:resync:show', {\n\t\t\tcollection: NS.current,\n\t\t});\n\t});\n\t/**\n\t * Resync cart assets\n\t * @event module:cart#cart:resync:confirmed\n\t * @param {object} data Data object\n\t * @param {module:cart/collections/currentCart} currentCart Cuurent cart\n\t * @fires module:cart#cart:resync:complete\n\t * @fires module:cart#cart:resync:error\n\t * @fires module:cart#cart:resync:success\n\t */\n\tdispatcher.on('cart:resync:confirmed', function (data, currentCart) {\n\t\tPromise.all([currentCart.getAssetIds(), currentCart.resync(data.scope)])\n\t\t\t.then((results) => {\n\t\t\t\tconst [assetIds, batchJob] = results;\n\n\t\t\t\t// The initial request was successful\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:resync:success',\n\t\t\t\t\tcurrentCart,\n\t\t\t\t\tassetIds,\n\t\t\t\t\tbatchJob,\n\t\t\t\t);\n\n\t\t\t\t// Listen to job\n\t\t\t\treturn batchJob.completed.then(\n\t\t\t\t\tfunction (batchJob) {\n\t\t\t\t\t\tdispatcher.trigger('cart:resync:complete', currentCart, assetIds);\n\t\t\t\t\t},\n\t\t\t\t\tfunction (err, batchJob) {\n\t\t\t\t\t\tdispatcher.trigger('cart:resync:error', err, currentCart);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tdispatcher.trigger('cart:resync:error', err, currentCart);\n\t\t\t});\n\t});\n\t/**\n\t * Error resyncing cart assets\n\t * @event module:cart#cart:resync:error\n\t * @param {string} error Error\n\t * @param {module:cart/collections/currentCart} currentCart Cuurent cart\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:resync:error',\n\t\tfunction (error, currentCart) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * The request to resync cart assets was successful\n\t * @event module:cart#cart:resync:success\n\t * @param {module:cart/collections/currentCart} currentCart Cuurent cart\n\t * @param {array} assetIds Asset ids\n\t * @param {module:app/models/batchJob} batchJob Batch job model\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:resync:success',\n\t\tfunction (currentCart, assetIds, batchJob) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: assetIds,\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdating'),\n\t\t\t\tdescription: i18n.t('i18n.resyncingCartAssets'),\n\t\t\t\ttype: 'info',\n\t\t\t\tprogressTask: {\n\t\t\t\t\tuuid: batchJob.id,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Resync cart assets has completed\n\t * @event module:cart#cart:resync:complete\n\t * @param {module:cart/collections/currentCart} currentCart Cuurent cart\n\t * @param {array} assetIds Asset ids\n\t * @fires module:asset#asset:resynced\n\t * @fires module:asset#asset:resynced:(assetId)\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:resync:complete',\n\t\tfunction (currentCart, assetIds) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: assetIds,\n\t\t\t\ttitle: i18n.t('i18n.currentCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.assetsSuccessfullyResynced'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\n\t\t\t// Loop over assetIds and send out events\n\t\t\tassetIds.forEach((id) => {\n\t\t\t\tdispatcher.trigger('asset:resynced', id);\n\t\t\t\tdispatcher.trigger(`asset:resynced:${id}`);\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t//============================================\n\t//\t!Cart resync\n\t//============================================\n\n\t//============================================\n\t//\tCart save/d\n\t//============================================\n\t/**\n\t * @event module:cart#cart:save:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:save:show',\n\t\tfunction (viewOptions) {\n\t\t\tdispatcher.trigger('app:showOptions', viewOptions);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * saving the current cart\n\t * @event module:cart#cart:save\n\t * @fires module:cart#cart:save:show\n\t */\n\tdispatcher.on('cart:save', function () {\n\t\tdispatcher.trigger('cart:saved:collect');\n\t});\n\n\t/**\n\t * @event module:cart#cart:save:current:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:save:current:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartSaveForm\" */ './views/cartSaveFormView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:save:current:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:save:current\n\t * @fires module:cart#cart:save:current:show\n\t */\n\tdispatcher.on('cart:save:current', function () {\n\t\tdispatcher.trigger('cart:save:current:show', {\n\t\t\tcollection: NS.current,\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:save:current:confirmed\n\t * @param {object} data Data object\n\t * @fires module:cart#cart:save:current:error\n\t * @fires module:cart#cart:save:current:success\n\t */\n\tdispatcher.on('cart:save:current:confirmed', function (data, collection) {\n\t\t// Save it\n\t\tvar savedCart = new SavedCartModel({title: data.title});\n\t\tsavedCart.save().then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('cart:save:current:success', savedCart);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('cart:save:current:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:save:current:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:save:current:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:save:current:success\n\t * @param {module:cart/models/savedCart} savedCart Saved cart\n\t * @fires module:notification#notification\n\t * @todo pass the saved cart id\n\t */\n\tdispatcher.on(\n\t\t'cart:save:current:success',\n\t\tfunction (savedCart) {\n\t\t\tvar title = savedCart.get('title');\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.cartsUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullySaved', {cart: title}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:saved:collect:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:collect:show',\n\t\tfunction (viewOptions) {\n\t\t\tbodyViews.add({\n\t\t\t\tviewClass: SelectView,\n\t\t\t\tshowActions: ['cart:saved:collect:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:collect\n\t * @fires module:cart#cart:saved:collect:show\n\t */\n\tdispatcher.on('cart:saved:collect', function () {\n\t\tconst collection = new SavedCartsCollection([], {\n\t\t\tpager: {pageSize: 0x7fffffff, pagesToDisplay: 0},\n\t\t});\n\t\tcollection.setModeFilter('write');\n\n\t\tdispatcher.trigger('cart:saved:collect:show', {\n\t\t\teventStr: 'cart:saved:collect',\n\t\t\t// For right now we are not paging carts\n\t\t\tclientSearch: true,\n\t\t\tclientSearchKey: 'title',\n\t\t\tcollection: collection,\n\t\t\tnewItems: {\n\t\t\t\tlabel: i18n.t('i18n.cartName'),\n\t\t\t},\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:saved:collect:confirmed\n\t * @param {object} data Data\n\t * @param {Netx.Collection.SavedCarts} collection Asset collection\n\t * @fires module:cart#cart:saved:collect:error\n\t * @fires module:cart#cart:saved:collect:success\n\t */\n\tdispatcher.on('cart:saved:collect:confirmed', function (data, collection) {\n\t\tPromise.all([\n\t\t\tNS.saved.all.addCurrentCart(data.ids),\n\t\t\tNS.saved.all.createNewCarts(\n\t\t\t\t// Turn into the minimum object needed for new model\n\t\t\t\t(data.new || []).map((title) => ({title})),\n\t\t\t),\n\t\t])\n\t\t\t.then((results) => {\n\t\t\t\tconst [savedCarts, newSavedCarts] = results;\n\t\t\t\tnewSavedCarts && savedCarts.push(newSavedCarts);\n\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:saved:collect:success',\n\t\t\t\t\tcollection,\n\t\t\t\t\tsavedCarts,\n\t\t\t\t);\n\n\t\t\t\tnewSavedCarts &&\n\t\t\t\t\tnewSavedCarts.forEach((newSavedCart) => {\n\t\t\t\t\t\tdispatcher.trigger('cart:save:current:success', newSavedCart);\n\t\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tdispatcher.trigger('cart:saved:collect:error', err, collection);\n\t\t\t});\n\t});\n\n\t/**\n\t * @event module:cart#cart:saved:collectt:error\n\t * @param {string} error Error\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:collect:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:saved:collect:success\n\t * @param {module:cart/collections/savedCarts} collection Saved carts collection\n\t * @param {module:cart/collections/savedCarts} savedCarts Saved carts that were updated\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on('cart:saved:collect:success', function (\n\t\tcollection,\n\t\tsavedCarts,\n\t) {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'cart',\n\t\t\tids: savedCarts.map((savedCart) => savedCart.id),\n\t\t\ttitle: i18n.t('i18n.cartsUpdated'),\n\t\t\tdescription: i18n.t('i18n.cartSavedSuccess'),\n\t\t\ttype: 'success',\n\t\t});\n\t});\n\n\t/**\n\t * @event module:cart#cart:saved:add:assets\n\t * @param {array} cartIds Cart ids\n\t * @param {array} assetIds Asset ids\n\t * @fires module:cart#cart:saved:add:assets:confirmed\n\t */\n\tdispatcher.on('cart:saved:add:assets', function (cartIds, assetIds) {\n\t\tdispatcher.trigger('cart:saved:add:assets:confirmed', cartIds, assetIds);\n\t});\n\t/**\n\t * @event module:cart#cart:saved:add:assets:confirmed\n\t * @param {array} ids Saved cart ids\n\t * @param {array} assetIds Asset ids\n\t * @fires module:cart#cart:saved:add:assets:error\n\t * @fires module:cart#cart:saved:add:assets:success\n\t */\n\tdispatcher.on('cart:saved:add:assets:confirmed', function (\n\t\tcartIds,\n\t\tassetIds,\n\t) {\n\t\tNS.saved.all.addAssets(cartIds, assetIds).then(\n\t\t\tfunction (savedCarts) {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:saved:add:assets:success',\n\t\t\t\t\tsavedCarts,\n\t\t\t\t\tassetIds,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'cart:saved:add:assets:error',\n\t\t\t\t\terr,\n\t\t\t\t\tcartIds,\n\t\t\t\t\tassetIds,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * Load a saved cart (does not replace current cart)\n\t * @event module:cart#cart:saved:routed\n\t * @param {number} id The id of the saved cart\n\t * @fires module:app#cart:routed\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t */\n\tdispatcher.on('cart:saved', function (id, page) {\n\t\tid = parseInt(id);\n\n\t\tif (!NS.saved.all.get(id)) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'cart:saved:routed:error',\n\t\t\t\tnew Error(i18n.t('i18n.noSuchCart', {id})),\n\t\t\t\tid,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tdispatcher.trigger('asset:gallery:show', {\n\t\t\tconditions: convertToRules(createCartRule(id)),\n\t\t\tpage: parseInt(page) || 1,\n\t\t});\n\t});\n\n\t/**\n\t * Add all assets in a saved cart to the current cart (this does not clear current cart's assets)\n\t * @event module:cart#cart:saved:add:to:current:cart\n\t * @param {number} id Saved cart id\n\t * @fires module:cart#cart:addAll\n\t * @see module:cart#cart:addAll:error\n\t * @see module:cart#cart:addAll:success\n\t */\n\tdispatcher.on('cart:saved:add:to:current:cart', function (id) {\n\t\tdispatcher.trigger(\n\t\t\t'cart:addAll',\n\t\t\tnew AssetSearchRulesCollection([\n\t\t\t\t{\n\t\t\t\t\telementType: 10, // search type \"cart\"\n\t\t\t\t\telementValue1: parseInt(id), // id of selected cart\n\t\t\t\t},\n\t\t\t]),\n\t\t);\n\t});\n\t/**\n\t * Deleting a saved cart -- not deleting any of the assets in that cart, just forgetting the cart exists.\n\t * @event module:cart#cart:saved:delete\n\t * @param {number|Netx.Collections.SavedCarts|module:cart/models/savedCart} thing SavedCart collection, model or id\n\t * @fires module:app#app:confirm:delete\n\t */\n\tdispatcher.on('cart:saved:delete', function (thing) {\n\t\tvar cartId;\n\n\t\tif (thing.isCollection || thing.isModel) {\n\t\t\tcartId = thing.id;\n\t\t} else if (_.isNumeric(thing)) {\n\t\t\tcartId = parseInt(thing);\n\t\t}\n\n\t\tif (!cartId) {\n\t\t\tthrow new Error('Undefined cart');\n\t\t}\n\n\t\tNS.saved.all.getCart(cartId).then(function (savedCart) {\n\t\t\tdispatcher.trigger('app:confirm:delete', {\n\t\t\t\tmessage: i18n.t('i18n.confirmDeleteSavedCart'),\n\t\t\t\teventStr: 'cart:saved:delete',\n\t\t\t\targs: [savedCart],\n\t\t\t});\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:saved:deleimgx.Models.SavedCart} model Saved cart\n\t * @fires module:cart#cart:saved:delete:error\n\t * @fires module:cart#cart:saved:delete:success\n\t */\n\tdispatcher.on('cart:saved:delete:confirmed', function (model) {\n\t\tmodel.destroy({wait: true}).then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('cart:saved:delete:success', model);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:saved:delete:error', err, model);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * UI handler for saved-cart delete errors\n\t * @event module:cart#cart:saved:delete:error\n\t * @param {string} error Error string\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:delete:error',\n\t\tfunction (error, model) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI handler for saved-cart delete succes\n\t * @event module:cart#cart:saved:delete:success\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:delete:success',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\ttitle: i18n.t('i18n.cartsUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullyDeleted'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t\t// if our route is on this (now nonexistent) cart, jump back.\n\t\t\tvar pat = new RegExp('#cart-assets/' + model.id + '$');\n\t\t\tif (window.location.hash.match(pat)) {\n\t\t\t\tNetx.router.back();\n\t\t\t}\n\t\t},\n\t\twindow,\n\t);\n\n\t//============================================\n\t//\tCart Saved Expiration (assets)\n\t//============================================\n\n\t/**\n\t * @event module:cart#cart:saved:manage:assets:expire:show\n\t * @param {object} viewOptions View options\n\t * @fires moudle:app#app:showOptions\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:manage:assets:expire:show',\n\t\tfunction (viewOptions) {\n\t\t\tdispatcher.trigger('app:showOptions', viewOptions);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:manage:assets:expire\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:cart#cart:saved:manage:assets:expire:show\n\t * @see module:cart#cart:saved:assets:expire\n\t * @see module:cart#cart:saved:assets:unexpire\n\t */\n\tdispatcher.on('cart:saved:manage:assets:expire', function (model) {\n\t\t// Show\n\t\tdispatcher.trigger('cart:saved:manage:assets:expire:show', {\n\t\t\tmenu: Netx.Menus.savedCartExpirationActions,\n\t\t\tdata: {model: model},\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets:expire:show\n\t * @param {object} viewOption View options\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:expire:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-cartAssetsSetExpiration\" */ './views/cartAssetsSetExpirationView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:saved:assets:expire:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:assets:expire\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:cart#cart:saved:assets:expire:show\n\t * @see module:cart#cart:saved:assets:expire:confirmed\n\t */\n\tdispatcher.on('cart:saved:assets:expire', function (model) {\n\t\t// Show\n\t\tdispatcher.trigger('cart:saved:assets:expire:show', {\n\t\t\tmodel: model,\n\t\t\teventStr: 'cart:saved:assets:expire',\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets:expire:confirmed\n\t * @param {object} data Form data\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:cart#cart:saved:assets:expire:error\n\t * @fires module:cart#cart:saved:assets:expire:success\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:saved:assets:expire\n\t * @see module:cart#cart:saved:assets:expire:succeeded\n\t */\n\tdispatcher.on('cart:saved:assets:expire:confirmed', function (data, model) {\n\t\tif (!data || !data.expirationDate) {\n\t\t\treturn dispatcher.trigger(\n\t\t\t\t'cart:saved:assets:expire:error',\n\t\t\t\tnew Error(i18n.t('i18n.noExpirationDateProvided')),\n\t\t\t);\n\t\t}\n\t\tvar date = data.expirationDate;\n\t\tmodel.expireAssets(date).then(\n\t\t\tfunction (uuid) {\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: [model.id],\n\t\t\t\t\ttitle: i18n.t('i18n.savedCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.expiringAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [model, date],\n\t\t\t\t\t\teventStr: 'cart:saved:assets:expire',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:saved:assets:expire:success', date);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:saved:assets:expire:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets:expire:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:cart#cart:saved:assets:expire:confirmed\n\t */\n\tdispatcher.on('cart:saved:assets:expire:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets:expire:success\n\t * @param {string} date Date string\n\t * @see module:cart#cart:saved:assets:expire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:expire:success',\n\t\tfunction (date) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:cart#cart:saved:assets:expire:succeeded\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @param {string} date Date string\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:saved:assets:expire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:expire:succeeded',\n\t\tfunction (model, date) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: [model.id],\n\t\t\t\ttitle: i18n.t('i18n.savedCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullySetAssetExpiration'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:saved:assets:unexpire\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @see module:cart#cart:saved:assets:unexpire:confirmed\n\t */\n\tdispatcher.on('cart:saved:assets:unexpire', function (model) {\n\t\tdispatcher.trigger('app:confirm', {\n\t\t\tmessage: i18n.t('i18n.confirmSavedCartAssetsUnexpire'),\n\t\t\ttitle: i18n.t('i18n.unexpireCartAssets'),\n\t\t\targs: [model],\n\t\t\teventStr: 'cart:saved:assets:unexpire',\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets:unexpire:confirmed\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:cart#cart:saved:assets:unexpire:error\n\t * @fires module:cart#cart:saved:assets:unexpire:success\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:saved:assets:unexpire:error\n\t * @see module:cart#cart:saved:assets:unexpire:success\n\t * @see module:cart#cart:saved:assets:unexpire:succeeded\n\t * @see module:cart#cart:saved:assets:unexpire\n\t */\n\tdispatcher.on('cart:saved:assets:unexpire:confirmed', function (model) {\n\t\tmodel.unexpireAssets().then(\n\t\t\tfunction (uuid) {\n\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\tids: [model.id],\n\t\t\t\t\ttitle: i18n.t('i18n.savedCartUpdating'),\n\t\t\t\t\tdescription: i18n.t('i18n.unexpiringAssets'),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tprogressTask: {\n\t\t\t\t\t\targs: [model],\n\t\t\t\t\t\teventStr: 'cart:saved:assets:unexpire',\n\t\t\t\t\t\tuuid: uuid,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tdispatcher.trigger('cart:saved:assets:unexpire:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:saved:assets:unexpire:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:saved:assets:unexpire:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:cart#cart:saved:assets:unexpire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:unexpire:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI\n\t * @event module:cart#cart:saved:assets:unexpire:success\n\t * @see module:cart#cart:saved:assets:unexpire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:unexpire:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * UI\n\t * @event module:cart#cart:saved:assets:unexpire:succeeded\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:saved:assets:unexpire:confirmed\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:assets:unexpire:succeeded',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'cart',\n\t\t\t\tids: [model.id],\n\t\t\t\ttitle: i18n.t('i18n.savedCartUpdated'),\n\t\t\t\tdescription: i18n.t('i18n.cartSuccessfullySetAssetUnexpiration'),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t//============================================\n\t//\t!Cart Saved Expiration (assets)\n\t//============================================\n\n\t/**\n\t * @event module:cart#cart:saved:landing:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:landing:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-savedCartLanding\" */ './views/savedCartLandingView'\n\t\t\t).then((View) => {\n\t\t\t\tappViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['cart:saved:landing:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * Saved carts landing routed\n\t * @event module:cart#cart:saved:landing:routed\n\t * @fires module:cart#cart:saved:landing\n\t */\n\tdispatcher.on('cart:saved:landing:routed', function () {\n\t\tdispatcher.trigger('cart:saved:landing');\n\t});\n\t/**\n\t * Saved carts landing\n\t * @event module:cart#cart:saved:landing\n\t * @fires module:cart#cart:saved:landing:show\n\t */\n\tdispatcher.on('cart:saved:landing', function () {\n\t\tdispatcher.trigger('cart:saved:landing:show', {\n\t\t\tcollection: NS.saved.all.deepClone(),\n\t\t});\n\t});\n\n\t/**\n\t * loading a saved cart (replaces current cart)\n\t * @event module:cart#cart:saved:load\n\t * @param {number|Netx.Collections.SavedCarts|module:cart/models/savedCart} thing SavedCart collection, model or id\n\t * @fires module:app#app:confirm\n\t * @fires module:cart#cart:saved:load:confirmed\n\t */\n\tdispatcher.on('cart:saved:load', function (thing) {\n\t\tvar cartId;\n\n\t\t// TODO: this is so ugly - we need to use our wrappers or something - this being a model, collection or number is just silly\n\t\tif (thing.isCollection || thing.isModel) {\n\t\t\tcartId = thing.id;\n\t\t} else if (_.isNumeric(thing)) {\n\t\t\tcartId = parseInt(thing);\n\t\t}\n\n\t\tvar savedCart = cartId && NS.saved.all.get(cartId);\n\t\tif (!savedCart) {\n\t\t\tthrow new Error('Undefined cart');\n\t\t}\n\n\t\tif (NS.current.assetCount()) {\n\t\t\t// make sure the user is okay with discarding their current cart.\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t('i18n.confirmSavedCartReplaceCurrent'),\n\t\t\t\teventStr: 'cart:saved:load',\n\t\t\t\targs: [savedCart],\n\t\t\t});\n\t\t} else {\n\t\t\tdispatcher.trigger('cart:saved:load:confirmed', savedCart);\n\t\t}\n\t});\n\t/**\n\t * @event module:cart#cart:saved:load:confirmed\n\t * @param {module:cart/models/savedCart} model Saved cart\n\t * @fires module:cart#cart:saved:load:error\n\t * @fires module:cart#cart:saved:load:success\n\t */\n\tdispatcher.on('cart:saved:load:confirmed', function (model) {\n\t\t// step 1: clear current cart\n\t\tNS.current.empty().then(\n\t\t\tfunction () {\n\t\t\t\t// step 2: add contents of saved cart to current cart\n\t\t\t\tNS.current\n\t\t\t\t\t.addSearch(\n\t\t\t\t\t\tnew AssetSearchRulesCollection([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\telementType: 10, // search type \"cart\"\n\t\t\t\t\t\t\t\telementValue1: model.id, // id of selected cart\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]),\n\t\t\t\t\t)\n\t\t\t\t\t.then(function (addedIds) {\n\t\t\t\t\t\tdispatcher.trigger('cart:saved:load:success', addedIds, NS.current);\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('cart:saved:load:error', err, NS.saved);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:saved:load:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:load:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:saved:routed\n\t * @param {number} id The id of the saved cart\n\t * @fires module:cart#cart:routed\n\t * @fires module:cart#cart:saved\n\t * @fires module:cart#cart:saved:routed:error\n\t */\n\tdispatcher.on('cart:saved:routed', function (id, page) {\n\t\t// Ensure page\n\t\tpage = page || 1;\n\n\t\tid = parseInt(id);\n\n\t\t// Ensure number\n\t\tif (isNaN(id)) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'cart:saved:routed:error',\n\t\t\t\tnew TypeError(i18n.t('i18n.idMustBeNumeric')),\n\t\t\t\tid,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (id === 0) {\n\t\t\t// zero is the active cart.\n\t\t\treturn dispatcher.trigger('cart:routed');\n\t\t}\n\n\t\tdispatcher.trigger('cart:saved', id, page);\n\t});\n\t/**\n\t * UI handler for saved cart routing errors -- ie, bad cart IDs.\n\t * @event module:cart#cart:saved:routed:error\n\t * @param {string} error Error string\n\t * @param {number} id Saved cart id\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:routed:error',\n\t\tfunction (error, id) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:saved:search\n\t * @param {Netx.Colelctions.SavedCarts} collection Saved carts collection\n\t * @param {string} str Search string\n\t */\n\tdispatcher.on('cart:saved:search', function (collection, str) {\n\t\tcollection.setFilterStr(str);\n\t});\n\t/**\n\t * @event module:cart#cart:saved:clear\n\t * @param {Netx.Colelctions.SavedCarts} collection Saved carts collection\n\t */\n\tdispatcher.on('cart:saved:search:clear', function (collection) {\n\t\tcollection.setFilterStr('');\n\t});\n\n\t//============================================\n\t//\t!Cart save/d\n\t//============================================\n\n\t//=================================\n\t//\tCART SHARING\n\t//=================================\n\t/**\n\t * Punt to share:menu\n\t * @event module:cart#cart:current:share:menu\n\t * @fires module:share#share:menu\n\t */\n\tdispatcher.on('cart:current:share:menu', function () {\n\t\tdispatcher.trigger('share:menu', NS.current);\n\t});\n\t/**\n\t * @event module:cart#cart:saved:share:menu\n\t * @param {number} id Cart id\n\t * @fires module:share#share:menu\n\t */\n\tdispatcher.on('cart:saved:share:menu', function (id) {\n\t\tNS.saved.all.getCart(id).then(function (savedCart) {\n\t\t\tdispatcher.trigger('share:menu', savedCart);\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:current:share:metadata\n\t * @fires module:share#share:assetSet:menu\n\t */\n\tdispatcher.on('cart:current:share:metadata', function () {\n\t\tvar assetSet = NS.current.toAssetSet();\n\n\t\t// Only display metadata options\n\t\tassetSet.displayedDownloadOptionTypes = ['metadata'];\n\t\tassetSet.downloadOptions.set({type: 'metadata'});\n\n\t\tdispatcher.trigger('share:assetSet:menu', assetSet);\n\t});\n\t//=================================\n\t//\t!CART SHARING\n\t//=================================\n\n\t//=================================\n\t//\tCART TMS OBJECT\n\t//=================================\n\t/**\n\t * @event module:cart#cart:create:tmsObjectPackage\n\t * @param {Netx.Collections.CartAssets} collection Cart assets collection\n\t * @fires module:app#app:confirm\n\t * @see module:cart#cart:create:tmsObjectPackage:confirmed\n\t */\n\tdispatcher.on('cart:create:tmsObjectPackage', function (collection) {\n\t\tdispatcher.trigger('app:confirm', {\n\t\t\tmessage: Netx.getPreference('tms.actionMessage'),\n\t\t\ttitle: i18n.t('i18n.createObjectPackageInTMS'),\n\t\t\tnoLabel: false,\n\t\t\tyesLabel: i18n.t('i18n.create'),\n\t\t\teventStr: 'cart:create:tmsObjectPackage',\n\t\t\targs: [collection],\n\t\t});\n\t});\n\t/**\n\t * @event module:cart#cart:create:tmsObjectPackage:confirmed\n\t * @param {Netx.Collections.CartAssets} collection Cart assets collection\n\t * @fires module:cart#cart:create:tmsObjectPackage:error\n\t * @fires module:cart#cart:create:tmsObjectPackage:success\n\t * @see module:cart#cart:create:tmsObjectPackage\n\t */\n\tdispatcher.on('cart:create:tmsObjectPackage:confirmed', function (\n\t\tcollection,\n\t) {\n\t\tcollection.createObjectPackage().then(\n\t\t\tfunction (result) {\n\t\t\t\t// TODO: the call returns a boolean - what should w esayi nthe event of a `false` return?\n\t\t\t\t// unknown error occured?\n\t\t\t\tif (result) {\n\t\t\t\t\tdispatcher.trigger('cart:create:tmsObject:success', collection);\n\t\t\t\t} else {\n\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t'cart:create:tmsObjectPackage:error',\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\ti18n.t('i18n.unknownErrorWhileCreatingObjectPackageInTMS'),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('cart:create:tmsObjectPackage:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:cart#cart:create:tmsObjectPackage:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:cart#cart:create:tmsObjectPackage:confirmed\n\t */\n\tdispatcher.on('cart:create:tmsObjectPackage:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\t/**\n\t * @event module:cart#cart:create:tmsObjectPackage:success\n\t * @param {Netx.Collections.CartAssets} collection Cart assets collection\n\t * @fires module:notification#notification\n\t * @see module:cart#cart:create:tmsObjectPackage:confirmed\n\t */\n\tdispatcher.on('cart:create:tmsObjectPackage:success', function (collection) {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'cart',\n\t\t\ttitle: i18n.t('i18n.tmsObjectPackage'),\n\t\t\tdescription: i18n.t('i18n.tmsObjectPackageSuccessfullyCreated'),\n\t\t\ttype: 'success',\n\t\t});\n\t});\n\t//=================================\n\t//\t!CART TMS OBJECT\n\t//=================================\n\n\t//============================================\n\t//\tCart visibility\n\t//============================================\n\n\t/**\n\t * @event module:cart#cart:visibility:visible\n\t * @fires module#cart:visibility:visible:success\n\t * @fires module#cart:visibility:visible:error\n\t */\n\tdispatcher.on('cart:visibility:visible', function () {\n\t\tNS.current.toggleVisibility('visible').then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('cart:visibility:visible:success');\n\t\t\t},\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('cart:visibility:visible:error');\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:cart#cart:visibility:visible:success\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on('cart:visibility:visible:success', function () {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'cart',\n\t\t\ttitle: i18n.t('i18n.visibility'),\n\t\t\tdescription: i18n.t('i18n.assetsSuccessfullySetToVisible'),\n\t\t\ttype: 'success',\n\t\t});\n\t});\n\n\t/**\n\t * @event module:cart#cart:visibility:visible:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('cart:visibility:visible:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\n\t/**\n\t * @event module:cart#cart:visibility:hidden\n\t * @fires module#cart:visibility:hidden:success\n\t * @fires module#cart:visibility:hidden:error\n\t */\n\tdispatcher.on('cart:visibility:hidden', function () {\n\t\tNS.current.toggleVisibility('hidden').then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('cart:visibility:hidden:success');\n\t\t\t},\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('cart:visibility:hidden:error');\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:cart#cart:visibility:hidden:success\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on('cart:visibility:hidden:success', function () {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'cart',\n\t\t\ttitle: i18n.t('i18n.visibility'),\n\t\t\tdescription: i18n.t('i18n.assetsSuccessfullySetToHidden'),\n\t\t\ttype: 'success',\n\t\t});\n\t});\n\n\t/**\n\t * @event module:cart#cart:visibility:hidden:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('cart:visibility:hidden:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\n\t//============================================\n\t//\t!Cart visibility\n\t//============================================\n\n\t//=================================\n\t//\t!EVENT LISTENERS\n\t//=================================\n\n\tdispatcher.trigger('cart:current:fetch');\n\n\t$.when.apply(this, NS.bootstrap).then(function () {\n\t\tdelete NS.bootstrap;\n\t\tdispatcher.trigger('cart:extend', NS);\n\t\tdispatcher.trigger('cart:initialized', NS);\n\t});\n});\n\nexport default {\n\tinitialize(opts) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdispatcher.once('cart:initialized', () => {\n\t\t\t\tresolve(routes);\n\t\t\t});\n\t\t\tdispatcher.trigger('cart:init');\n\t\t});\n\t},\n};\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryView';\nimport Template from '../templates/cartGalleryView.html';\n\nexport default class CartGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'assets-view flex-column-grid';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.currentCart');\n\t\topts.id = opts.id || 'cart-gallery-view';\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CartGalleryView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryHeaderView';\nimport Template from '../templates/cartGalleryHeaderView.html';\n\nexport default class CartGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.currentCart');\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CartGalleryHeaderView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryView';\nimport Template from '../templates/savedCartGalleryView.html';\n\nexport default class SavedCartGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'assets-view flex-column-grid';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.savedCart');\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.id = opts.id || 'saved-cart-gallery-view';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SavedCartGalleryView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/savedCartActionsBar.html';\n\nimport {faBolt} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaBolt,\n});\n\nexport default class SavedCartActionsBar extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'savedCartActionsBar';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-cart/views/savedCartGalleryView';\nimport SavedCartActionsBar from './savedCartActionsBar';\n\nexport default class SavedCartGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\tsuper(opts);\n\n\t\t// SAVED CART ACTIONS BAR\n\t\tthis.savedCartBarView = this.addSubView(\n\t\t\tnew SavedCartActionsBar({\n\t\t\t\tcollection: this.collection,\n\t\t\t\tmodel: this.model,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// cache\n\t\tthis.$cartTitle = this.$('.nx-title');\n\t\tthis.$savedCartBar = this.$('[data-nx-control=\"saved-cart-bar\"]');\n\n\t\tif (Modernizr.touch || window.innerWidth < 500) {\n\t\t\t// mobile layout\n\t\t\tthis.toggleFacetsOff();\n\t\t} else {\n\t\t\tthis.toggleFacetsOn();\n\t\t}\n\n\t\tthis.$savedCartBar.append(this.savedCartBarView.render().$el);\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryHeaderView';\nimport Template from '../templates/savedCartGalleryHeaderView.html';\n\nexport default class SavedCartGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(\n\t\t\tthis.model,\n\t\t\t'change sync',\n\t\t\t_.debounce(this.updateTitle, 50),\n\t\t);\n\t}\n\n\t/**\n\t * @override\n\t * @return {string}\n\t */\n\tgetHeaderTitle() {\n\t\tthis.headerTitle = _.escape(this.model.get('title'));\n\t\treturn this.headerTitle;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'SavedCartGalleryHeaderView';\n\t}\n}\n","export {default} from '@netx/core-cart/controller';\n\nimport AccessTokenModel from '@netx/core-share/models/accessToken';\nimport CartGalleryView from '@netx/core-cart/views/cartGalleryView';\nimport DownloadOptionsCollection from '@netx/core-share/collections/downloadOptions';\n\nimport AssetListView from '@netx/core-asset/views/assetListView';\nimport AssetListViewTypeManagerView from '@netx/core-asset/views/assetListViewTypeManager';\nimport CartGalleryHeaderView from './views/cartGalleryHeaderView';\nimport SavedCartGalleryView from './views/savedCartGalleryView';\nimport SavedCartGalleryHeaderView from './views/savedCartGalleryHeaderView';\nimport SearchFacetsView from '@netx/core-search/views/searchFacetsView';\n\nimport assetCustomConfig from '@netx/core-asset/config';\n\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\nimport {expirationTypes} from '@netx/core-share/properties/accessToken';\n\n/**\n * Cart Module Extensions\n * @event module:cart#cart:extend\n */\ndispatcher.once('cart:extend', function (NS) {\n\t// Use faceted search\n\t// Filter mode is driven by the property `search.facet.filterMode` - default is quite literally \"DEFAULT\"\n\t// See Netx.Collections.SearchFacets\n\tNS.gallery.useFacetedSearch(true);\n\n\t//=================================\n\t//\tEVENT LISTENERS\n\t//=================================\n\n\t/**\n\t * @event module:cart#cart:current:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on('cart:current:show', function (viewOptions) {\n\t\tNetx.app.appViews.add({\n\t\t\tviewClass: CartGalleryView,\n\t\t\tshowActions: ['cart:current:show'],\n\t\t\tviewOptions: viewOptions,\n\t\t});\n\t});\n\n\tdispatcher.off('cart:current');\n\n\t// THEM-1603 - client side selection for the public user\n\tif (_.isPublicUser()) {\n\t\t/**\n\t\t * @event module:cart#cart:current\n\t\t * @param {number} page Page number\n\t\t * @fires module:cart#cart:current:show\n\t\t * @fires module:asset#asset:cursor:cacheFetch\n\t\t */\n\t\tdispatcher.on('cart:current', function (page) {\n\t\t\tNS.current.loadPage(page);\n\n\t\t\t// Show\n\t\t\tdispatcher.trigger('cart:current:show', {\n\t\t\t\tcollection: NS.current,\n\t\t\t\tNS: NS,\n\t\t\t\tviews: {\n\t\t\t\t\t// No facets!\n\t\t\t\t\theader: {\n\t\t\t\t\t\tviewClass: CartGalleryHeaderView,\n\t\t\t\t\t\tcollection: NS.current,\n\t\t\t\t\t},\n\t\t\t\t\tassets: {\n\t\t\t\t\t\tviewClass: assetCustomConfig.LIST_TYPES_ENABLED\n\t\t\t\t\t\t\t? AssetListViewTypeManagerView\n\t\t\t\t\t\t\t: AssetListView,\n\t\t\t\t\t\tcollection: NS.current,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t\t/**\n\t\t * @event module:cart#cart:toggle\n\t\t * @param {Netx.Models.Asset} asset Asset model\n\t\t * @param {event} e jQuery event\n\t\t * @fires module:cart#cart:add\n\t\t * @fires module:cart#cart:remove\n\t\t */\n\t\tdispatcher.off('cart:toggle');\n\t\tdispatcher.on('cart:toggle', function (asset, e) {\n\t\t\tvar inCart = Netx.cart && Netx.cart.current.isInCart(asset.id);\n\t\t\tdispatcher.trigger(inCart ? 'cart:remove' : 'cart:add', asset, e);\n\t\t});\n\t\t/**\n\t\t * Add assets to cart\n\t\t * @event module:cart#cart:addAssets\n\t\t * @param {array} ids Assets ids\n\t\t */\n\t\tdispatcher.off('cart:addAssets');\n\t\tdispatcher.on('cart:addAssets', function (ids) {\n\t\t\tNS.current.addLocalAssets(ids);\n\t\t});\n\n\t\t/**\n\t\t * @event module:cart#cart:addAll\n\t\t * @param {Netx.Collections.Assets|Netx.Collections.SearchRules} collection Assets collection or selection\n\t\t * @fires module:app#app:progress\n\t\t */\n\t\tdispatcher.off('cart:addAll');\n\t\tdispatcher.on('cart:addAll', function (collection) {\n\t\t\t// Show\n\t\t\tdispatcher.trigger('app:progress', {\n\t\t\t\tcollection: collection,\n\t\t\t\teventStr: 'cart:addAll',\n\t\t\t\theaderTitle: i18n.t('cart:i18n.addingToCart', {\n\t\t\t\t\tdefaultValue: 'Adding to selection...',\n\t\t\t\t}),\n\t\t\t\tmessage: '',\n\t\t\t});\n\n\t\t\tcollection.getAssetIds().then(function (assetIdArr) {\n\t\t\t\tNetx.cart.current.addLocalAssets(assetIdArr).then(function () {\n\t\t\t\t\tdispatcher.trigger('cart:addAll:success', collection);\n\n\t\t\t\t\tdispatcher.trigger('cart:added', assetIdArr);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t/**\n\t\t * @event module:cart#cart:removeAssets\n\t\t * @param {array} ids Asset ids\n\t\t */\n\t\tdispatcher.off('cart:removeAssets');\n\t\tdispatcher.on('cart:removeAssets', function (ids) {\n\t\t\tNS.current.removeLocalAssets(ids);\n\t\t});\n\t} else {\n\t\t// Core is undergoing a react overhaul and we do not yet have all the information\n\t\t// needed/time to rectify the portal atm\n\t\t// Moving this code over from core pre-react gallery\n\t\t/**\n\t\t * @event module:cart#cart:current\n\t\t * @param {number} page Page number\n\t\t * @fires module:cart#cart:current:show\n\t\t * @fires module:asset#asset:cursor:cacheFetch\n\t\t */\n\t\tdispatcher.on('cart:current', function (page) {\n\t\t\tif (NS.saved.all.lastCartRoute !== window.location.hash) {\n\t\t\t\tpage = parseInt(page) || 1;\n\t\t\t\t// Sets the last cart route\n\t\t\t\tNS.current.lastCartRoute = window.location.hash;\n\t\t\t\t// Fetches the desired page and insures that the correct page is shown after entering and exiting asset detail.\n\t\t\t\tNS.current.fetchCurrentCart(page, {\n\t\t\t\t\t// Cache the selection after we're done\n\t\t\t\t\tcacheSelection: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Cache the selection now.\n\t\t\t\tdispatcher.trigger('asset:cursor:cacheFetch', NS.current);\n\t\t\t}\n\t\t\t// Show\n\t\t\tdispatcher.trigger('cart:current:show', {\n\t\t\t\tcollection: NS.current,\n\t\t\t\tNS: NS,\n\t\t\t\tviews: {\n\t\t\t\t\t// No facets!\n\t\t\t\t\theader: {\n\t\t\t\t\t\tviewClass: CartGalleryHeaderView,\n\t\t\t\t\t\tcollection: NS.current,\n\t\t\t\t\t},\n\t\t\t\t\tassets: {\n\t\t\t\t\t\tviewClass: assetCustomConfig.LIST_TYPES_ENABLED\n\t\t\t\t\t\t\t? AssetListViewTypeManagerView\n\t\t\t\t\t\t\t: AssetListView,\n\t\t\t\t\t\tcollection: NS.current,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t}\n\n\t//============================================\n\t//\tCart save/d\n\t//============================================\n\t/**\n\t * @event module:cart#cart:saved:removeAssets\n\t */\n\tdispatcher.on('cart:saved:removeAssets', function (cartAssets, assets) {\n\t\tif (cartAssets && cartAssets.id) {\n\t\t\t// make the call to remove the assets\n\t\t\tcartAssets.removeAssets(assets).then(\n\t\t\t\tfunction (assetIdAr) {\n\t\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\t\ttitle: i18n.t('asset:i18n.cartUpdating', {\n\t\t\t\t\t\t\tdefaultValue: 'Collection updating',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tdescription: i18n.t('asset:i18n.removedFromSavedCart', {\n\t\t\t\t\t\t\tdefaultValue: 'Removed from collection',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('notification', {\n\t\t\t\t\t\tmodule: 'cart',\n\t\t\t\t\t\ttitle: i18n.t('asset:i18n.cartUpdating', {\n\t\t\t\t\t\t\tdefaultValue: 'Collection updating',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tdescription: i18n.t('asset:i18n.cartUpdateError', {\n\t\t\t\t\t\t\tdefaultValue: 'Collection update failed',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttype: 'danger',\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t});\n\n\t/**\n\t * @event module:cart#cart:saved:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'cart:saved:show',\n\t\tfunction (viewOptions) {\n\t\t\tNetx.app.appViews.add({\n\t\t\t\tviewClass: SavedCartGalleryView,\n\t\t\t\tshowActions: ['cart:saved:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * Load a saved cart (does not replace current cart)\n\t * @event module:cart#cart:saved:routed\n\t * @param {number} id The id of the saved cart\n\t * @fires module:app#cart:routed\n\t * @fires module:asset#asset:cursor:cacheFetch\n\t * @todo Do not touch views like this - the view should be perfectly capable of updating the headerTitle based on its model/collection\n\t */\n\tdispatcher.off('cart:saved');\n\tdispatcher.on('cart:saved', function (id, page) {\n\t\tvar hash = window.location.hash,\n\t\t\tpromises = [],\n\t\t\tsavedCart = NS.saved.all.get(id);\n\n\t\tif (NS.saved.lastCartRoute !== hash) {\n\t\t\tNS.saved.lastCartRoute = hash;\n\t\t\t// Fetch saved cart into gallery\n\t\t\tpromises.push(\n\t\t\t\tNS.gallery\n\t\t\t\t\t.fetchSavedCart(id, page, {\n\t\t\t\t\t\t// avoid gridlock\n\t\t\t\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\t\t\t\t// cache the selection when done\n\t\t\t\t\t\tcacheSelection: true,\n\t\t\t\t\t})\n\t\t\t\t\t.then(function () {\n\t\t\t\t\t\t// if this saved cart is new it will have 'cache': true,\n\t\t\t\t\t\t// if the counts don't match, the dam is still creating it, use the cached models\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// This looks precarious.... the gallery isn't guaranteed to have more than a page of assets, so the count could be off.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsavedCart.get('cache') &&\n\t\t\t\t\t\t\tsavedCart.get('count') !== NS.gallery.length\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tNS.gallery.add(savedCart.collection.models);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\t// Cache the selection now\n\t\t\tdispatcher.trigger('asset:cursor:cacheFetch', NS.gallery);\n\t\t\tdispatcher.trigger('search:facet:onOff', NS.gallery);\n\t\t\t// search facets get wonky if the cart doens't trigger\n\t\t\tdispatcher.trigger('search:facets:refresh');\n\t\t}\n\n\t\tif (savedCart) {\n\t\t\tdispatcher.trigger('cart:saved:show', {\n\t\t\t\tmodel: savedCart,\n\t\t\t\tcollection: NS.gallery,\n\t\t\t\tviews: {\n\t\t\t\t\theader: {\n\t\t\t\t\t\tviewClass: SavedCartGalleryHeaderView,\n\t\t\t\t\t\tmodel: savedCart,\n\t\t\t\t\t\tcollection: NS.gallery,\n\t\t\t\t\t},\n\t\t\t\t\tassets: {\n\t\t\t\t\t\tviewClass: AssetListView,\n\t\t\t\t\t\tcollection: NS.gallery,\n\t\t\t\t\t},\n\t\t\t\t\tfacets: {\n\t\t\t\t\t\tviewClass: SearchFacetsView,\n\t\t\t\t\t\tcollection: NS.gallery.selection.searchFacets,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t});\n\n\t// a way to share current cart by email with just one form\n\tdispatcher.on('share:cart:current:email', function (menuView, e) {\n\t\tvar assetSet = Netx.cart.current.toAssetSet();\n\t\tassetSet.getDownloadOptions().then(function (downloadOptions) {\n\t\t\t// data for a downloadOptions collection\n\t\t\tdownloadOptions = _.filter(downloadOptions, function (option) {\n\t\t\t\treturn option.type == 'original' || option.type == 'metadata';\n\t\t\t});\n\t\t\tdownloadOptions = new DownloadOptionsCollection(downloadOptions);\n\t\t\tvar token = new AccessTokenModel({\n\t\t\t\taccessType: assetSetTypes.assetSet,\n\t\t\t\tsources: [assetSet],\n\t\t\t\toptions: downloadOptions,\n\t\t\t\ttitle: assetSet.get('label') || i18n.t('i18n.sharedAssets'),\n\t\t\t\t// The expiration date should be 24 hours.\n\t\t\t\texpirationType: expirationTypes.date,\n\t\t\t});\n\t\t\tdispatcher.trigger.apply(\n\t\t\t\tdispatcher,\n\t\t\t\t[\n\t\t\t\t\t'share:assetSet:justify:check',\n\t\t\t\t\tassetSet,\n\t\t\t\t\t'token:edit',\n\t\t\t\t\tdownloadOptions,\n\t\t\t\t\ttoken,\n\t\t\t\t].concat([]),\n\t\t\t);\n\t\t});\n\t});\n\n\tdispatcher.on('cart:addAll:success', function (collection) {\n\t\tdispatcher.trigger('search:facet:onOff', collection);\n\t});\n\n\t/**\n\t * UI handler for saved-cart delete succes\n\t * @event module:cart#cart:saved:delete:success\n\t * @param {Netx.Models.SavedCart} model Saved cart\n\t */\n\tdispatcher.off('cart:saved:delete:success');\n\tdispatcher.on(\n\t\t'cart:saved:delete:success',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('app:passiveAlert', {\n\t\t\t\tmessage: i18n.t('i18n.cartSuccessfullyDeleted'),\n\t\t\t\tclassName: 'alert alert-success',\n\t\t\t});\n\t\t\t// if our route is on this (now nonexistent) cart, go to saved carts.\n\t\t\tvar pat = new RegExp('#cart-assets/' + model.id + '$');\n\t\t\tif (window.location.hash.match(pat)) {\n\t\t\t\tNetx.router.navigate('#cart/saved/all', {trigger: true});\n\t\t\t}\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:cart#cart:save:current:success\n\t * @param {Netx.Models.SavedCart} savedCart Saved cart\n\t * @fires module:notification#notification\n\t * @todo pass the saved cart id\n\t */\n\tdispatcher.on(\n\t\t'cart:save:current:success',\n\t\tfunction (savedCart) {\n\t\t\tvar title = savedCart.get('title');\n\t\t\tdispatcher.trigger('app:passiveAlert', {\n\t\t\t\tmessage: i18n.t('cart:i18n.cartSuccessfullySaved', {cart: title}),\n\t\t\t\tclassName: 'alert alert-success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t//=================================\n\t//\t!EVENT LISTENERS\n\t//=================================\n}); // cart:extend\n","/**\n * Cart module\n */\n\nimport actions from './actions';\nimport menus from './menus';\nimport controller from './controller';\nimport Search from '@netx/core-search';\n\n// Call on this function to load everything needed for the module prior to initialization\nfunction loadDependencies() {\n\treturn new Promise((resolve, reject) => {\n\t\tdispatcher.trigger('netx:load:module', Search, {\n\t\t\terror: reject,\n\t\t\tinitialized: resolve,\n\t\t});\n\t});\n}\n\n/**\n * @property {object} exports - Our module exports\n * @property {string} exports.namespace - Module namespace\n * @property {function} exports.initialize - Module initializer\n */\nexport default {\n\tnamespace: 'cart',\n\tinitialize() {\n\t\treturn loadDependencies().then(() => {\n\t\t\t// Register actions\n\t\t\tNetx.Actions.Register(actions);\n\t\t\t// Extend menus\n\t\t\tNetx.addMenus(menus);\n\n\t\t\treturn controller.initialize();\n\t\t});\n\t},\n};\n","/**\n * @classdesc\n * AdBuilder Template Block: a configurable, customizable section of a template.\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\n\nexport default class ABBlock extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {string} defaults.id - string ID of the block (as defined in template)\n\t * @property {string} defaults.defaultValue - for text blocks, some default text\n\t * @property {string} defaults.description - information to help inform the user of the block's expected input\n\t * @property {string} defaults.label - user-friendly name for the block's form field\n\t * @property {string} defaults.restriction - visibility restriction -- one of adBuilder/properties/adBuilder#restrictions\n\t * @property {number} defaults.sourceCategoryId - for category blocks, the catId\n\t * @property {number} defaults.sourceCategoryName - for category blocks, the category name\n\t * @property {string} defaults.textType - for text blocks, type of form input -- one of adBuilder/properties/adBuilder#textTypes\n\t * @property {string} defaults.type - one of adBuilder/properties/adBuilder#blockTypes\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t// DO NOT default the idAttribute. .isNew() will give false negatives if you do.\n\t\t\t// id : '',\n\t\t\tdefaultValue: '',\n\t\t\tdescription: '',\n\t\t\tlabel: '',\n\t\t\trestriction: '',\n\t\t\tsourceCategoryId: 0,\n\t\t\tsourceCategoryName: '',\n\t\t\t////////////\n\t\t\t// DEVNOTE: if the server isn't going to use these type-specific fields, they could all live in a goo field:\n\t\t\t//////////\n\t\t\ttextType: '',\n\t\t\ttype: '',\n\t\t\tvalue: '',\n\t\t\tformLocked: false,\n\t\t\tviewCid: '',\n\t\t};\n\t}\n\n\t/**\n\t * @method\n\t * @param {string} cid cid\n\t */\n\tsetCid(cid) {\n\t\tthis.stopListening(\n\t\t\tdispatcher,\n\t\t\t`adBuilder:asset:selected:${this.get('viewCid')}`,\n\t\t)\n\t\t\t.set('viewCid', cid)\n\t\t\t.listenTo(\n\t\t\t\tdispatcher,\n\t\t\t\t`adBuilder:asset:selected:${cid}`,\n\t\t\t\t(val, assetCollection) => {\n\t\t\t\t\tthis.set('value', val);\n\t\t\t\t},\n\t\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABBlock';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/ABBlock';\n\nexport default class ABBlocks extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\t}\n\n\t/** @override */\n\tupdateCustomization(customizationModel) {\n\t\tif (!customizationModel || !customizationModel.get('blocks')) {\n\t\t\t// new customization, reset blocks\n\t\t\tthis.each((block) => {\n\t\t\t\tblock.set({value: block.get('defaultValue')}).trigger('change');\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = {\n\t\t\tblocks: this.models,\n\t\t\tcustValues: customizationModel,\n\t\t};\n\n\t\tconst locked = customizationModel.get('locked');\n\t\t_.each(customizationModel.get('blocks'), (custBlock) => {\n\t\t\tdata.blocks.forEach((block) => {\n\t\t\t\tif (custBlock.id != block.id) return;\n\n\t\t\t\tblock.set({\n\t\t\t\t\tvalue: custBlock.value,\n\t\t\t\t\tformLocked: locked,\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABBlocks';\n\t}\n}\n","export const blockTypes = {\n\timage: 'Image',\n\ttext: 'Text',\n};\n\nexport const textTypes = {\n\tbox: 'Text Box',\n\tarea: 'Text Area',\n};\n\nexport const outputTypes = {\n\tindd: 'indd',\n\tjpg: 'jpg',\n\tpdf: 'pdf',\n\tpng: 'png',\n};\n\nexport const restrictions = {\n\treadOnly: 'Read Only',\n\thidden: 'Hidden',\n\tnone: 'None',\n};\n\nexport default {\n\tblockTypes: blockTypes,\n\toutputTypes: outputTypes,\n\trestrictions: restrictions,\n\ttextTypes: textTypes,\n};\n","/**\n * Contains some template properties & a sub-collection of template blocks.\n * @class\n */\nimport Base from '@netx/core/lib/netx-model';\nimport ABCustomizationModel from './ABCustomization';\nimport ABBlocksCollection from '../collections/ABBlocks';\n\nimport {blockTypes, restrictions, textTypes} from '../properties/adBuilder';\n\nexport default class ABTemplate extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {string} */\n\tget idAttribute() {\n\t\treturn 'assetId';\n\t}\n\n\t/**\n\t * @property {object} defaults - The default attribute values\n\t * @property {number} defaults.assetId - Template id\n\t * @property {array} defaults.blocks - Array of block objects -- converted to/from blocks collection\n\t * @property {boolean} defaults.customizable - Template is configured & ready to build ads.\n\t * @property {array} defaults.outputs - Set of file formats this template can generate ads in\n\t */\n\tget defaults() {\n\t\treturn {\n\t\t\t// DO NOT default the idAttribute. .isNew() will give false negatives if you do.\n\t\t\t// assetId: 0,\n\t\t\tblocks: [],\n\t\t\tcustomizable: false,\n\t\t\toutputs: [],\n\t\t\tcustomization: null,\n\t\t\tabTitle: '',\n\t\t};\n\t}\n\n\t/**\n\t * RPC methods:\n\t * @rpcs\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\t/** @method fetch */\n\t\t\tread: ['getAdBuilderTemplate', 'id'],\n\t\t};\n\t}\n\n\t// TODO: Address on the server instead of here: https://jira.netx.net/browse/DAM-8271\n\tget parsers() {\n\t\treturn {\n\t\t\tread(results, opts) {\n\t\t\t\tconst customization = this.get('customization');\n\t\t\t\tif (customization) {\n\t\t\t\t\tresults.locked = customization.get('locked');\n\t\t\t\t}\n\n\t\t\t\tresults.blocks.forEach((block) => {\n\t\t\t\t\tblock.formLocked = this.get('locked');\n\t\t\t\t\tif (block.type != blockTypes.image) return;\n\n\t\t\t\t\t// convert undefined/empty to the string \"none\" so we can i18n it.\n\t\t\t\t\tif (!block.restriction) {\n\t\t\t\t\t\tblock.restriction = restrictions.none;\n\t\t\t\t\t}\n\t\t\t\t\t// default unset textType to textbox\n\t\t\t\t\tif (!block.textType) {\n\t\t\t\t\t\tblock.textType = textTypes.box;\n\t\t\t\t\t}\n\t\t\t\t\tif (_.isNull(block.defaultValue)) {\n\t\t\t\t\t\tblock.defaultValue = '';\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// I'd sure love to refactor all this crap with react\n\t\t\t\tthis.blockCollection.updateCustomization(this.get('customization'));\n\n\t\t\t\t// TODO: address empty outputs[] array?\n\t\t\t\treturn results;\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(attrs = {}, opts = {}) {\n\t\tattrs.customization = new ABCustomizationModel();\n\t\tsuper(attrs, opts);\n\n\t\t// this model is in charge of an abblocks collection\n\t\tthis.blockCollection = new ABBlocksCollection(this.get('blocks'));\n\n\t\tthis.on('change:id', (m, id, opts) => {\n\t\t\tif (!id) return;\n\t\t\tthis.blockCollection.reset();\n\t\t\tthis.fetch();\n\t\t})\n\t\t\t.on('change:blocks', (templateModel, blocks) => {\n\t\t\t\tthis.blockCollection.set(blocks);\n\t\t\t})\n\t\t\t// when the customization changes, tell our blockCollection to set it's models to default values\n\t\t\t.on('change:customization', (templateModel, customizationModel) => {\n\t\t\t\tthis.blockCollection.updateCustomization(customizationModel);\n\t\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean}\n\t */\n\tcanPublish() {\n\t\t// At least one output must be configured.\n\t\tif (!this.get('outputs').length) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// believe in the best in people ... and templates ...\n\t\tlet result = true;\n\t\tconst blockTypes = blockTypes;\n\t\tconst templateBlocks = this.templateBlocks;\n\t\tfor (let i = 0, c = templateBlocks.length, templateBlock; i < c; i++) {\n\t\t\tconst templateBlock = templateBlocks[i];\n\t\t\tif (templateBlock.get('type') === blockTypes.image) {\n\t\t\t\tresult = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABTemplate';\n\t}\n}\n","export const ABTemplateIsActive = v => {\n\tif (!v.model) return false;\n\treturn v.model.get('template');\n};\n\nexport const ABTemplateIsNotActive = v => {\n\tif (!v.model) return false;\n\treturn !v.model.get('template');\n};\n\nexport const assetCanBeABTemplate = v => {\n\tif (!v.model) return false;\n\treturn v.model.get('templatable');\n};\n","import ABTemplateModel from './models/ABTemplate';\nimport AssetModel from '@netx/core-asset/models/asset';\n\nimport {\n\tABTemplateIsActive,\n\tABTemplateIsNotActive,\n\tassetCanBeABTemplate,\n} from './enablers';\n\nexport default [\n\t/////////\n\t// Activate actions:\n\t/////////\n\t/**\n\t * Attempt to activate a single asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'adBuilder:activate:asset:confirmed',\n\t\tlabel: i18n.t('i18n.activateTemplate'),\n\t\tuserLevel: 9,\n\t\tenableTest: [assetCanBeABTemplate, ABTemplateIsNotActive],\n\t\tmatrix: 'modify',\n\t\twrapper(v) {\n\t\t\treturn [v.model];\n\t\t},\n\t},\n\n\t/**\n\t * Deactivate a single asset\n\t * @action\n\t */\n\t{\n\t\tevent: 'adBuilder:deactivate:asset:confirmed',\n\t\tlabel: i18n.t('i18n.deactivateTemplate'),\n\t\tuserLevel: 9,\n\t\tenableTest: ABTemplateIsActive,\n\t\tmatrix: 'modify',\n\t\twrapper(v) {\n\t\t\treturn [v.model];\n\t\t},\n\t},\n\n\t/** @action */\n\t{\n\t\tevent: 'adBuilder:template:edit',\n\t\tlabel: i18n.t('i18n.edit'),\n\t\tenableTest: ABTemplateIsActive,\n\t\tmatrix: 'modify',\n\t\tuserLevel: 9,\n\t\twrapper(v) {\n\t\t\treturn [v.model];\n\t\t},\n\t\troute(m) {\n\t\t\treturn 'system/adbuilder/template/' + m.id;\n\t\t},\n\t},\n\t////////////////\n\t// publish actions\n\t///////////////\n\t{\n\t\tevent: 'adBuilder:template:togglePublished',\n\t\tlabel: i18n.t('togglePublished'),\n\t\tuserLevel: 9,\n\t\twrapper(v, e) {\n\t\t\tvar newState;\n\t\t\tif (v.model instanceof AssetModel) {\n\t\t\t\tnewState = !v.model.get('templateCustomizable');\n\t\t\t} else if (v.model instanceof ABTemplateModel) {\n\t\t\t\tnewState = !v.model.get('customizable');\n\t\t\t} else {\n\t\t\t\t// read the box itself? this doesn't always work.\n\t\t\t\t// TODO: No actions should not be searching through dom elements\n\t\t\t\tnewState =\n\t\t\t\t\t$(e.target)\n\t\t\t\t\t\t.closest('tr')\n\t\t\t\t\t\t.find('input')\n\t\t\t\t\t\t.val() == 'on';\n\t\t\t}\n\t\t\treturn [v.model, newState];\n\t\t},\n\t},\n];\n","import actions from '@netx/core-ad-builder/actions';\n\nimport {icon} from '@fortawesome/fontawesome-svg-core';\nimport {faPencilAlt, faTrashAlt} from '@fortawesome/pro-solid-svg-icons';\nconst iconOpts = {classes: ['fa-fw']};\nconst icons = {\n\tfaPencilAlt: icon(faPencilAlt, iconOpts).html,\n\tfaTrashAlt: icon(faTrashAlt, iconOpts).html,\n};\n// New actions\nlet newActions = actions.concat([\n\t/** @action */\n\t{\n\t\tevent: 'adBuilder:templates:route',\n\t\tlabel: i18n.t('i18n.templates'),\n\t\troute: 'templates',\n\t\tenableTest(v) {\n\t\t\treturn Netx.getPreference('adbuilder.enabled');\n\t\t},\n\t\tdisabledClass: 'hide',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'adBuilder:template:customize',\n\t\tenableTest(v) {\n\t\t\treturn v.model.get('templateCustomizable');\n\t\t},\n\t\tdisabledClass: 'hide',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'adBuilder:template:customize:edit',\n\t\ticon: icons.faPencilAlt,\n\t\tlabel: i18n.t('i18n.edit'),\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'adBuilder:template:customize:list',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'adBuilder:template:customize:blocks',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'adBuilder:template:customize:delete',\n\t\ticon: icons.faTrashAlt,\n\t\tlabel: i18n.t('i18n.delete'),\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'adBuilder:customization:new',\n\t\tenableTest(v) {\n\t\t\treturn true; //!_.isUndefined(v.model.get('customization'))\n\t\t},\n\t},\n]);\n\nexport default newActions;\n","import Menu from '@netx/core/lib/netx-menu';\n\nexport default {};\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/ABTemplatePreviewView.html';\n\nimport {faExpandArrows} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaExpandArrows,\n});\n\nexport default class ABTemplatePreviewView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = {\n\t\t\t'click .zoom': 'quickZoom',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.template = opts.template || Template;\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'change sync', this.render);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\t\tconst customization = model.get('customization');\n\t\t// Additional template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tcacheBuster: Netx.asset.current.cacheBuster(),\n\t\t\tcustPreview:\n\t\t\t\tcustomization && customization.get('previewUrl')\n\t\t\t\t\t? customization.get('previewUrl')\n\t\t\t\t\t: model.get('previewUrl'),\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @fires module:asset#asset:quickzoom\n\t */\n\tquickZoom() {\n\t\tconst model = this.model;\n\t\tdispatcher.trigger('asset:quickzoom', model.get('customization') || model);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABTemplatePreviewView';\n\t}\n}\n","/**\n * Displays a single asset to be selected from an asset list\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetSelectListItemView.html';\n\nimport {faCheck} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaCheck,\n});\n\nexport default class AssetSelectListItemView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = {\n\t\t\t'keydown label.control-label': 'onKeyDown',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.template = opts.template || Template;\n\t\topts.icons = {...icons, ...opts.icons};\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additonal template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\telementName: this.collection.blockId,\n\t\t\tisChecked: this.collection.length === 1 ? 'checked=\"checked\"' : '',\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Additonal template vars\n\t\tthis.$el.toggleClass('single', this.collection.length == 1);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `keydown` event\n\t * It's not pretty, but\n\t * it finds this view's radio button\n\t * and checks it\n\t *\n\t * todo: remove with react\n\t */\n\tonKeyDown(e) {\n\t\tconst code = e.which;\n\t\t// space or enter\n\t\tif (code === 32 || code === 13) {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\n\t\t\tconst radio = $(e.currentTarget).siblings('input[type=\"radio\"]');\n\t\t\tradio.prop('checked', true).trigger('change');\n\t\t}\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetSelectListItemView';\n\t}\n}\n","/**\n * @class\n */\n\nimport Base from '@netx/core-category/collections/categoryAssets';\n\nimport Model from '../models/ABBlock';\nimport PagerModel from '@netx/core-app/models/pager';\n\nexport default class ABCategoryAssets extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\n\t\tthis.pager = new PagerModel(\n\t\t\t{\n\t\t\t\tpageSize: 30,\n\t\t\t\tpagesToDisplay: 10,\n\t\t\t\troutesToPage: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcollection: this,\n\t\t\t},\n\t\t);\n\t\tthis.addSubModel(this.pager);\n\t}\n\n\t/**\n\t * @method\n\t * @param {number|string} catId Category id\n\t */\n\tgetABAssets(catId) {\n\t\t// TODO: remove route-mgt code from models/collections\n\t\tthis.routeContext = 'category/' + catId;\n\n\t\t// Ensure number\n\t\tcatId = parseInt(catId) || this.categoryId;\n\t\t// Set selection\n\n\t\tthis.setSort('name', 0);\n\n\t\tthis.chunkSize = 30;\n\t\tthis.pageSize = 30;\n\t\tthis.selection.at(0).set({elementValue1: catId});\n\t\tthis.setCategoryId(catId);\n\n\t\t// Get assets\n\t\treturn this.fetch({\n\t\t\tduplicateQueryPolicy: 'abort',\n\t\t\tcacheSelection: true,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABCategoryAssets';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/ABBlockView.html';\nimport AssetModel from '@netx/core-asset/models/asset';\n\nimport ChildView from '@netx/core-asset/views/assetSelectListItemView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nimport ABCategoryAssetsCollection from '@netx/core-ad-builder/collections/ABCategoryAssets';\n\nexport default class ABBlockView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\tconst childViewCollection = new ABCategoryAssetsCollection([], {\n\t\t\tcategoryId: opts.model.get('sourceCategoryId'),\n\t\t});\n\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\n\t\topts.childView = {\n\t\t\tviewClass: ChildView,\n\t\t\ttarget: '.nx-childviews:first',\n\t\t\tcollection: childViewCollection,\n\t\t\toptions: {\n\t\t\t\tclassName: 'asset',\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.events = {\n\t\t\t'click [data-nx-control=\"reset-childviews\"]': 'resetChildviews',\n\t\t\t'change [type=\"radio\"]': 'radioChange',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tchildViewCollection.blockId = this.cid;\n\n\t\t/*\n\t\t\tsharing our cid with our model so it can listen to\n\t\t\t'adBuilder:asset:selected:' + cid\n\t\t\tand update itself when an asset is selected\n\n\t\t\talso using it as form element name since the unique key\n\t\t\tin the database is a varchar possibly with spaces and special characters\n\n\t\t\tprobably could loop though models in a controller\n\t\t*/\n\t\tthis.model.setCid(this.cid);\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\n\t\treturn this.listenTo(this.model, 'change', this.render);\n\t}\n\n\t/**\n\t * @override\n\t * @fires module:adBuilder#adBuilder:asset:selected\n\t */\n\tpreRender() {\n\t\tconst model = this.model;\n\n\t\tconst catId = model.get('sourceCategoryId');\n\n\t\t// if it's an asset from a category\n\t\tif (model.get('type') === 'Image' && catId > 0) {\n\t\t\tconst childViewCollection = this.getChildViewCollection();\n\t\t\tconst assetId = parseInt(model.get('value'));\n\t\t\t// if an asset is selected, just load the asset\n\t\t\tif (assetId > 0) {\n\t\t\t\tconst asset = new AssetModel({assetId: assetId});\n\t\t\t\tasset.fetch().then((asset) => {\n\t\t\t\t\t// Success\n\t\t\t\t\t// give the collection the asset for a list of 1\n\t\t\t\t\tchildViewCollection.reset(asset);\n\t\t\t\t\tdispatcher.trigger('adBuilder:asset:selected');\n\t\t\t\t});\n\t\t\t} else if (!childViewCollection.isSyncing) {\n\t\t\t\t// otherwise if not syncing load the category's assets\n\t\t\t\tchildViewCollection.getABAssets(catId).then(() => {\n\t\t\t\t\tdispatcher.trigger('adBuilder:asset:deselected');\n\t\t\t\t\tthis.updateModelValue();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tsuper.preRender();\n\n\t\t// Additonal template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tvalue: model.get('value') || model.get('defaultValue'),\n\t\t\treadonly:\n\t\t\t\tmodel.get('restriction') == 'Read Only' || model.get('formLocked')\n\t\t\t\t\t? ' readonly'\n\t\t\t\t\t: '',\n\t\t\thidden: model.get('restriction') == 'Hidden' ? ' hide' : '',\n\t\t\tviewCid: this.cid,\n\t\t});\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `change` event\n\t */\n\tradioChange(e) {\n\t\tdispatcher.trigger(\n\t\t\t`adBuilder:asset:selected:${this.cid}`,\n\t\t\tparseInt(e.currentTarget.value),\n\t\t\tthis.childView.collection,\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @fires module:adBuilder#adBuilder:asset:selected\n\t */\n\tresetChildviews(e) {\n\t\tthis.showLoading();\n\n\t\tconst childViewCollection = this.getChildViewCollection();\n\t\t// TODO: Fetching in the view is troublseome\n\t\tchildViewCollection.reset();\n\t\tchildViewCollection.getABAssets().then(() => {\n\t\t\tdispatcher.trigger('adBuilder:asset:deselected');\n\t\t\tthis.updateModelValue();\n\t\t\tthis.showLoaded();\n\t\t});\n\n\t\tdispatcher.trigger(`adBuilder:asset:selected:${this.cid}`, 0);\n\t}\n\n\t/** @method */\n\tupdateModelValue() {\n\t\tconst childViewCollection = this.getChildViewCollection();\n\t\t// THEM-1224 if the block of folder assets only has one asset, it will be selected automatically\n\t\t// but the block model doesn't know that\n\t\tif (childViewCollection.length == 1) {\n\t\t\tthis.model.set('value', this.childView.collection.pluck('assetId')[0]);\n\t\t}\n\t\tif (this.model.get('type') === 'Image') {\n\t\t\tthis.addPagerView(childViewCollection);\n\t\t}\n\t}\n\n\t/** @override */\n\tunbindModelEvents() {\n\t\tsuper.unbindModelEvents();\n\n\t\tconst childViewCollection = this.getChildViewCollection();\n\t\treturn this.stopListening(childViewCollection, this.updateModelValue);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABBlockView';\n\t}\n}\n\n// Functionality\nChildViews(ABBlockView);\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/ABBlocksView.html';\nimport ChildView from './ABBlockView';\n\nimport ChildViews from '@netx/core/functionality/childViews';\nimport Form from '@netx/core/functionality/form';\n\nimport {outputTypes} from '../properties/adBuilder';\n\nexport default class ABBlocksView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = {\n\t\t\tviewClass: ChildView,\n\t\t\ttarget: '.nx-childviews:first',\n\t\t\toptions: {\n\t\t\t\tclassName: 'abBlock pod block-asset-list',\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.className = opts.className || 'container';\n\t\topts.eventStr = opts.eventStr || 'adBuilder:template:customize';\n\t\topts.events = {\n\t\t\t'click [data-nx-control=\"publish\"]': 'publish',\n\t\t\t...opts.events,\n\t\t};\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.configureTemplate');\n\t\topts.id = opts.id || 'ad-builder-customize-template-view';\n\t\topts.requiresChanges = opts.requiresChanges === true;\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// Make sure child formViews send our parent template as an argument\n\t\tthis.childView = {...this.childView};\n\t\tObject.assign(this.childView.options, {\n\t\t\targs: [this.model],\n\t\t});\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tdispatcher,\n\t\t\t'adBuilder:asset:selected adBuilder:asset:deselected adBuilder:template:name:cancel',\n\t\t\t() => {\n\t\t\t\tthis.checkForm();\n\t\t\t},\n\t\t).listenTo(dispatcher, 'adBuilder:template:customize:success', () => {\n\t\t\t// reset our classes and enable publish button\n\t\t\tthis.render();\n\t\t});\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'sync change:customization', () => {\n\t\t\tthis.render();\n\t\t});\n\t}\n\t/** @override */\n\tbindCollectionEvents() {\n\t\tsuper.bindCollectionEvents();\n\n\t\treturn this.listenTo(this.collection, 'sync', this.debouncedRender);\n\t}\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tObject.assign(this.templateVars, {\n\t\t\toutputTypes: outputTypes,\n\t\t\treadonly: '',\n\t\t\tlocked: false,\n\t\t});\n\t\tconst customization = this.model.get('customization');\n\t\tif (customization) {\n\t\t\tObject.assign(this.templateVars, {\n\t\t\t\treadonly: customization.get('locked') ? ' readonly' : '',\n\t\t\t\tlocked: customization.get('locked'),\n\t\t\t});\n\t\t}\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\tconst customization = this.model.get('customization');\n\t\tif (customization && customization.id) {\n\t\t\t// if these blocks are locked, add the class so everyone knows\n\t\t\tthis.$el.toggleClass(\n\t\t\t\t'customization-locked',\n\t\t\t\tcustomization.locked === true || customization.get('locked') === true,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.$el.toggleClass('customization-locked', false);\n\t\t}\n\n\t\tthis.$el\n\t\t\t.find('[data-nx-control=\"publish\"]')\n\t\t\t.prop('disabled', !(customization && customization.id));\n\t\tthis.formChanged = false;\n\t}\n\n\t/**\n\t * Parse blocks\n\t * @override\n\t */\n\tformValues() {\n\t\tconst values = super.formValues();\n\n\t\tthis.collection.each((model, idx, all) => {\n\t\t\tvalues[model.id] = values[model.get('viewCid')];\n\t\t\tdelete values[model.get('viewCid')];\n\t\t});\n\n\t\tvalues.blocks = _.map(values.block, (block, idx) =>\n\t\t\tObject.assign(block, {id: idx}),\n\t\t);\n\t\tdelete values.block;\n\n\t\tvalues.outputs = _.compact(\n\t\t\t_.map(values.outputs, (bool, output) => (bool ? output : null)),\n\t\t);\n\n\t\treturn values;\n\t}\n\n\t/** @override */\n\tsubmitReady() {\n\t\tlet ready = this.formChanged;\n\n\t\t// dynamic radio asset lists are too slow, collect them\n\t\tthis.cacheQueries();\n\n\t\tconst inputs = this.inputs;\n\t\t// TODO: what about form validation (is it not working for some reason)?\n\t\t// if any of the inputs are required but have no value, return false\n\t\tfor (let key in inputs) {\n\t\t\tif (inputs.hasOwnProperty(key)) {\n\t\t\t\tlet input = inputs[key][0];\n\t\t\t\tif (input.required && input.value == '') {\n\t\t\t\t\tready = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// asset select blocks currently return a value regardless in the block above\n\t\t// so if any of the asset select block models don't have a value, return false\n\t\tif (ready) {\n\t\t\tconst models = this.collection.models;\n\t\t\tfor (let i = 0, c = models.length, model; i < c; i++) {\n\t\t\t\tmodel = models[i];\n\t\t\t\tif (model.get('type') == 'Image' && model.get('value') == '') {\n\t\t\t\t\tready = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customization = this.model.get('customization');\n\t\tthis.$el\n\t\t\t.find('[data-nx-control=\"publish\"]')\n\t\t\t.prop('disabled', !(customization && customization.id && !ready));\n\n\t\t// DAM-19588 - don't allow changes if it's been published / 'locked'\n\t\treturn ready && (!customization || !customization.get('locked'));\n\t}\n\n\t/**\n\t * @method\n\t * @fires module:adBuilder#adBuilder:customization:publish\n\t */\n\tpublish() {\n\t\tdispatcher.trigger('adBuilder:customization:publish', this.model);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABBlocksView';\n\t}\n}\n\n// Functionality\nChildViews(ABBlocksView);\nForm(ABBlocksView);\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/ABCustomizationsListView.html';\n\nimport Table from '@netx/core/functionality/table';\nimport {faLock} from '@fortawesome/pro-solid-svg-icons';\nconst icons = Base.initializeIcons({\n\tfaLock,\n});\n\nexport default class ABCustomizationsListView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.id = opts.id || 'saved-customizations';\n\t\topts.template = opts.template || Template;\n\t\topts.eventStr = 'adBuilder:template:customize';\n\t\tsuper(opts);\n\t}\n\n\t/** @method */\n\tdefineColumns() {\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: 'previewUrl',\n\t\t\t\tclassName: 'previewUrl',\n\t\t\t\tlabel: i18n.t('i18n.preview'),\n\t\t\t\tcell: 'html',\n\t\t\t\tformatter: {\n\t\t\t\t\t...Backgrid.CellFormatter.prototype,\n\t\t\t\t\tfromRaw(raw, model) {\n\t\t\t\t\t\treturn `<img alt=\"${model.get('label')}\" src=\"${raw}\">`;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'label',\n\t\t\t\tclassName: 'abLabel',\n\t\t\t\tlabel: i18n.t('i18n.name'),\n\t\t\t\tcell: 'string',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'description',\n\t\t\t\tlabel: i18n.t('i18n.description'),\n\t\t\t\tcell: 'string',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'locked',\n\t\t\t\tlabel: i18n.t('i18n.locked'),\n\t\t\t\tcell: 'html',\n\t\t\t\tformatter: {\n\t\t\t\t\t...Backgrid.CellFormatter.prototype,\n\t\t\t\t\tfromRaw(raw, model) {\n\t\t\t\t\t\treturn raw ? icons.faLock : '';\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'controls',\n\t\t\t\tlabel: '',\n\t\t\t\tcell: 'control',\n\t\t\t\tactions: [\n\t\t\t\t\t'adBuilder:template:customize:edit',\n\t\t\t\t\t'adBuilder:template:customize:delete',\n\t\t\t\t],\n\t\t\t},\n\t\t];\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Add a pager\n\t\tthis.addPagerView();\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABCustomizationsListView';\n\t}\n}\n\n// Functionality\nTable(ABCustomizationsListView);\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-tabView';\nimport Template from '../templates/ABTemplateTabsView.html';\n\nimport ABBlocksView from './ABBlocksView';\nimport ABCustomizationsListView from './ABCustomizationsListView';\n\nexport default class ABTemplateTabsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\t// opts.className = opts.className || 'container';\n\t\topts.defaultTab = opts.defaultTab || 'edit';\n\t\topts.id = opts.id || 'adBuilder-template-tabs-view';\n\t\topts.template = opts.template || Template;\n\t\t// opts.removeOnHide = true;\n\t\t// opts.removeOnSimpleHide = true;\n\n\t\topts.automaticallySetTabs = true;\n\t\topts.instantiateOnAdd = true;\n\t\topts.renderOnInstatiate = true;\n\t\topts.showOnAdd = true;\n\n\t\tsuper(opts);\n\t}\n\n\t// /** @override */\n\t// bindModelEvents() {\n\t// \treturn this.listenTo(\n\t// \t\tthis.model,\n\t// \t\t'change:customization',\n\t// \t\t(model, customization) => {\n\t// \t\t\t// unique show action for ABBlocksView, see above\n\t// \t\t\tdispatcher.trigger('adBuilder:template:customize:blocks');\n\t// \t\t\t// template name and customization name need to be refreshed\n\t// \t\t\tthis.render();\n\t// \t\t},\n\t// \t);\n\t// }\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// const customization = this.model.get('customization');\n\t\t// // Additional template vars\n\t\t// Object.assign(this.templateVars, {\n\t\t// \tabLabel: customization ? customization.get('label') : '',\n\t\t// \tabDescription: customization ? customization.get('description') : '',\n\t\t// });\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\t// this.$el\n\t\t// \t.find('[data-nx-control=\"templatePreview\"]')\n\t\t// \t.append(this.templatePreview.render().$el);\n\n\t\tsuper.postRender();\n\t}\n\n\t// /** @override */\n\t// remove() {\n\t// \t$('#wrapper').off(`scroll.${this.cid}`);\n\t// \tsuper.remove();\n\t// }\n\t//\n\t// /** @override */\n\t// submit(e) {\n\t// \t// this is not the form view you are looking for\n\t// \t// try ABCustomBlocksView\n\t// \te.stopPropagation();\n\t// \te.preventDefault();\n\t// }\n\n\t/** @override */\n\ttabs() {\n\t\tconst adBuilder = Netx.adBuilder;\n\t\tconst currentTemplate = adBuilder.currentTemplate;\n\t\treturn [\n\t\t\t{\n\t\t\t\tviewClass: ABBlocksView,\n\t\t\t\tlabel: i18n.t('i18n.edit'),\n\t\t\t\tname: 'edit',\n\t\t\t\tuniqueShowAction: 'adBuilder:template:customize:blocks',\n\t\t\t\tviewOptions: {\n\t\t\t\t\tcollection: currentTemplate.blockCollection,\n\t\t\t\t\tmodel: currentTemplate,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tviewClass: ABCustomizationsListView,\n\t\t\t\tlabel: i18n.t('i18n.saved'),\n\t\t\t\tname: 'saved',\n\t\t\t\tuniqueShowAction: 'adBuilder:template:customize:list',\n\t\t\t\tviewOptions: {\n\t\t\t\t\tcollection: adBuilder.userCustomizations,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABTemplateTabsView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/ABTemplateView.html';\n\nimport ABTemplatePreviewView from './ABTemplatePreviewView';\nimport ABTemplateTabsView from './ABTemplateTabsView';\n\nexport default class ABTemplateView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'container';\n\t\topts.id = opts.id || 'adBuilder-template-view';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// add template preview, this way we don't have to rerender this entire tabview and break ie11 THEM-1094\n\t\tthis.templatePreview = this.addSubView(\n\t\t\tnew ABTemplatePreviewView({\n\t\t\t\tmodel: this.model,\n\t\t\t}),\n\t\t);\n\t\tthis.templateTabs = this.addSubView(\n\t\t\tnew ABTemplateTabsView({\n\t\t\t\tmodel: this.model,\n\t\t\t}),\n\t\t);\n\n\t\t// docks preveiw image & customBlocksView header\n\t\t$('#wrapper')\n\t\t\t.off('scroll')\n\t\t\t.on(`scroll.${this.cid}`, (e) => {\n\t\t\t\tthis.$el.toggleClass('scrolled', $(e.currentTarget).scrollTop() > 128);\n\t\t\t});\n\t}\n\n\t/** @override */\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\t\treturn this.listenTo(this.model, 'sync', () => this.debouncedRender)\n\t\t\t.listenTo(this.model, 'change:abTitle', (abTemplateModel, abTitle) => {\n\t\t\t\tthis.$abTitle.html(abTitle);\n\t\t\t})\n\t\t\t.listenTo(\n\t\t\t\tthis.model,\n\t\t\t\t'change:customization',\n\t\t\t\t(abTemplateModel, abCustomizationModel) => {\n\t\t\t\t\t// dispatcher.trigger('adBuilder:template:customize:blocks');\n\t\t\t\t\tthis.$abLabel.html(\n\t\t\t\t\t\t(abCustomizationModel && abCustomizationModel.get('label')) || '',\n\t\t\t\t\t);\n\t\t\t\t\tthis.$abDescription.html(\n\t\t\t\t\t\t(abCustomizationModel && abCustomizationModel.get('description')) ||\n\t\t\t\t\t\t\t'',\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst customization = this.model.get('customization');\n\t\t// Additional template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tabLabel: customization ? customization.get('label') : '',\n\t\t\tabDescription: customization ? customization.get('description') : '',\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tthis.$abTitle = this.$('.ab-title');\n\t\tthis.$abLabel = this.$('.ab-label');\n\t\tthis.$abDescription = this.$('.ab-description');\n\n\t\tthis.$el\n\t\t\t.find('[data-nx-control=\"templatePreview\"]')\n\t\t\t.append(this.templatePreview.render().$el);\n\t\tthis.$el\n\t\t\t.find('[data-nx-control=\"templateTabs\"]')\n\t\t\t.append(this.templateTabs.render().$el);\n\n\t\tsuper.postRender();\n\t}\n\n\t/** @override */\n\tremove() {\n\t\t$('#wrapper').off(`scroll.${this.cid}`);\n\t\tsuper.remove();\n\t}\n\n\t/** @override */\n\tsubmit(e) {\n\t\t// this is not the form view you are looking for\n\t\t// try ABCustomBlocksView\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABTemplateView';\n\t}\n}\n","/**\n * @class\n */\n// import Base from '@netx/core/lib/netx-view';\nimport Base from '@netx/core-asset/views/assetListView';\n// import Base from '@netx/core-app/views/appGalleryView';\nimport Template from '@netx/core-ad-builder/templates/ABAssetTemplatesView.html';\nimport ChildView from '@netx/core-asset/views/assetListItemView';\n\nimport ChildViews from '@netx/core/functionality/childViews';\n\nexport default class ABAssetTemplatesView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = {\n\t\t\tviewClass: ChildView,\n\t\t\ttarget: '.nx-childviews:first',\n\t\t\toptions: {\n\t\t\t\tclassName: 'abBlock pod',\n\t\t\t},\n\t\t\t...opts.childView,\n\t\t};\n\t\topts.className = 'assets-view'; //opts.className || 'container';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.configureTemplate');\n\t\topts.id = opts.id || 'ad-builder-asset-templates-view';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABAssetTemplatesView';\n\t}\n}\n\n// Functionality\nChildViews(ABAssetTemplatesView);\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/ABCustomizationDownloadView.html';\nimport Selectpicker from '@netx/core/functionality/selectpicker';\nimport Form from '@netx/core/functionality/form';\n\nexport default class ABCustomizationDownloadView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.eventStr = opts.eventStr || 'adBuilder:customization:publish';\n\t\topts.hideOnSubmit = opts.hideOnSubmit !== false;\n\t\topts.removeOnHide = opts.removeOnHide !== false;\n\t\topts.template = opts.template || Template;\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.downloadCustomization');\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Additional template vars\n\t\tObject.assign(this.templateVars, {\n\t\t\tformats: this.model.get('outputs'),\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABCustomizationDownloadView';\n\t}\n}\n\n// Functionality\nForm(ABCustomizationDownloadView);\nSelectpicker(ABCustomizationDownloadView);\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/promptView';\nimport Template from '../templates/ABCustomizationNameView.html';\n\nexport default class ABCustomizationNameView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.eventStr = opts.eventStr || 'adBuilder:template:name';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.newCustomization');\n\t\topts.prompt = opts.prompt || i18n.t('i18n.enterTitleAndDescription');\n\t\t// opts.requiresChanges = opts.requiresChanges === true;\n\t\topts.template = opts.template || Template;\n\t\topts.id = opts.id || 'customizationNameView';\n\t\topts.events = {\n\t\t\t'click [data-nx-control=\"cancel\"]': 'cancelCustomizationSave',\n\t\t\t...opts.events,\n\t\t};\n\t\tsuper(opts);\n\t}\n\n\t/** @override */\n\tsubmitReady() {\n\t\treturn (\n\t\t\t(!this.validator.enabled ||\n\t\t\t\t!this.validator.plugin ||\n\t\t\t\tthis.validator.plugin.isValid() === true ||\n\t\t\t\t(this.validator.plugin.isValid === null &&\n\t\t\t\t\tthis.$el.find('[required]').length === 0)) &&\n\t\t\t(!this.requiresChanges || this.formChanged)\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * DAM-20359 - re-enable save button on cancel, form.js disables on submit\n\t */\n\tcancelCustomizationSave() {\n\t\tdispatcher.trigger(`${this.eventStr}:cancel`);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABCustomizationNameView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/ABCustomization';\n\nimport PagerModel from '@netx/core-app/models/pager';\n\nexport default class ABCustomizations extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/**\n\t * @property {object} methods - Methods for this collection\n\t * @property {method} methods.getAdBuilderCustomizations - Get adBuilder customization\n\t */\n\tget methods() {\n\t\treturn {\n\t\t\tread() {\n\t\t\t\treturn [\n\t\t\t\t\t'getAdBuilderCustomizations',\n\t\t\t\t\tthis.assetIds,\n\t\t\t\t\tthis.pager.getPageDTO(),\n\t\t\t\t];\n\t\t\t},\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Paging model\n\t\t * @memberOf Netx.Collections.Users\n\t\t * @alias pager\n\t\t * @type {Netx.Models.Pager}\n\t\t */\n\t\tthis.pager = new PagerModel(\n\t\t\t{\n\t\t\t\tpageSize: 10,\n\t\t\t\tpagesToDisplay: 10,\n\t\t\t\troutesToPage: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcollection: this,\n\t\t\t},\n\t\t);\n\n\t\tthis.assetIds = opts.assetIds || [];\n\t\tthis.templateModel = opts.templateModel;\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tthis.templateModel,\n\t\t\t'change:assetId',\n\t\t\t(model, assetId, opts) => {\n\t\t\t\t//console.log('this is going to work');\n\t\t\t\tif (!assetId) return;\n\t\t\t\tthis.pager.set({currentPage: 1}, {silent: true});\n\t\t\t\tthis.assetIds = [assetId];\n\t\t\t\tthis.fetch();\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @param {array} ids IDs\n\t */\n\tsetTemplates(...ids) {\n\t\tthis.assetIds = [...ids];\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABCustomizations';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-search/collections/searchAssets';\nimport PagerModel from '@netx/core-app/models/pager';\n\nexport default class ABAssets extends Base {\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.pageSize = 30;\n\t\topts.chunkSize = 30;\n\t\topts.routeContext = opts.routeContext || 'templates';\n\t\tsuper(models, opts);\n\n\t\t/**\n\t\t * Paging model\n\t\t * @memberOf Netx.Collections.Users\n\t\t * @alias pager\n\t\t * @type {Netx.Models.Pager}\n\t\t */\n\t\tthis.pager = new PagerModel(\n\t\t\t{\n\t\t\t\tpageSize: 30,\n\t\t\t\tpagesToDisplay: 10,\n\t\t\t\troutesToPage: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcollection: this,\n\t\t\t},\n\t\t);\n\t\tthis.pagerRoutes = true;\n\t\tthis.addSubModel(this.pager);\n\n\t\tthis.resetSearchParams();\n\t\tthis.selection.initProperties();\n\t\tthis.selection.set([\n\t\t\t{\n\t\t\t\telementType: 28,\n\t\t\t\telementSubType1: 0,\n\t\t\t\telementValue1: 'activeTemplates',\n\t\t\t},\n\t\t]);\n\t}\n\n\tfetchTemplates(page) {\n\t\tthis.curPage = page || 1;\n\n\t\tthis.pager.set('currentPage', page);\n\n\t\tthis.setStartPosition();\n\n\t\treturn this.fetch();\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABAssets';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryHeaderView';\nimport {faSlidersH} from '@fortawesome/pro-solid-svg-icons';\nimport Template from '../templates/ABGalleryHeaderView.html';\n\nconst icons = Base.initializeIcons({\n\tfaSlidersH,\n});\n\nexport default class ABGalleryHeaderView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.icons = {...icons, ...opts.icons};\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t\tthis.i18nCountStr = null;\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-app/views/appGalleryView';\nimport Template from '../templates/ABGalleryView.html';\n\nexport default class ABGalleryView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.className = opts.className || 'assets-view flex-column-grid';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.templates');\n\t\topts.id = opts.id || 'ab-templates';\n\t\topts.loadingClassObjects = opts.loadingClassObjects || ['collection'];\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ABGalleryView';\n\t}\n}\n","/**\n * @module adBuilder/config\n */\n\nexport default {};\n","export default {};\n","import routes from '@netx/core-ad-builder/routes';\n\n_.extend(routes, {\n\t'templates(/page/:page)'(page) {\n\t\tdispatcher.trigger('adBuilder:templates:routed', page);\n\t},\n\t/**\n\t * reroute #template/:id to #asset/:id\n\t * @route\n\t * @param {number|string} id Asset id\n\t * @fires module:adBuilder#adBuilder:template:routed\n\t */\n\t'template/:id'(id) {\n\t\tdispatcher.trigger('adBuilder:template:routed', id);\n\t},\n\t/** @route */\n\t'customization/:id/quickzoom'(id) {\n\t\tdispatcher.trigger('adbuilder:quickzoom:routed', id);\n\t},\n});\n\nexport default routes;\n","// TODO: Why is core's controller so out of line with clean?\n\nimport ABTemplateView from './views/ABTemplateView';\nimport ABAssetTemplatesView from './views/ABAssetTemplatesView';\nimport ABTemplateModel from './models/ABTemplate';\nimport ABCustomizationModel from './models/ABCustomization';\nimport ABCustomizationDownloadView from './views/ABCustomizationDownloadView';\nimport ABCustomizationNameView from './views/ABCustomizationNameView';\nimport ABCustomizationsCollection from './collections/ABCustomizations';\nimport AssetModel from '@netx/core-asset/models/asset';\nimport AssetSetModel from '@netx/core-asset/models/assetSet';\nimport ABAssetsCollection from './collections/ABAssets';\nimport AssetListView from '@netx/core-asset/views/assetListView';\nimport DownloadOptionsCollection from '@netx/core-share/collections/downloadOptions';\nimport AppView from '@netx/core-app/views/appView';\n\nimport PromptView from '@netx/core-app/views/promptView';\n\nimport ABGalleryHeaderView from './views/ABGalleryHeaderView';\nimport SearchFacetsView from '@netx/core-search/views/searchFacetsView';\nimport ABGalleryView from './views/ABGalleryView';\n\nimport customConfig from './config';\nimport routes from './routes';\n\nimport {types as downloadOptionTypes} from '@netx/core-share/properties/downloadOptions';\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\n\ndispatcher.once('adBuilder:init', function (options) {\n\tvar NS = (Netx.adBuilder = {});\n\tNS.options = options = _.extend({}, customConfig, options);\n\n\tdownloadOptionTypes.templateCustomization = 'templateCustomization';\n\n\tif (Netx.getPreference('adbuilder.enabled')) {\n\t\tdispatcher.trigger('adBuilder:extend', NS);\n\t}\n\n\t// Tell the module loader we're initialized.\n\tdispatcher.trigger('adBuilder:initialized', NS);\n});\n\ndispatcher.once('adBuilder:extend', function () {\n\t/**\n\t * Setup adbuilder for business\n\t * currentTemplate model gets template data and blocks array\n\t * userCustomizations collection gets all saved customizations for user for template\n\t */\n\tif (_.isUndefined(Netx.adBuilder.currentTemplate)) {\n\t\tNetx.adBuilder.currentTemplate = new ABTemplateModel();\n\t}\n\tif (_.isUndefined(Netx.adBuilder.userCustomizations)) {\n\t\tNetx.adBuilder.userCustomizations = new ABCustomizationsCollection([], {\n\t\t\ttemplateModel: Netx.adBuilder.currentTemplate,\n\t\t});\n\t}\n\n\t/**\n\t * a simple asset list view showing only active customizable templates\n\t */\n\tdispatcher.on('adBuilder:templates:routed', function (page) {\n\t\tpage = parseInt(page) || 1;\n\t\tvar NS = Netx.adBuilder;\n\n\t\tif (_.isUndefined(NS.templateAssets)) {\n\t\t\tNS.templateAssets = new ABAssetsCollection();\n\t\t\tNS.templateAssets.useFacetedSearch(true);\n\t\t}\n\t\tconst assets = NS.templateAssets;\n\n\t\tdispatcher.trigger('adBuilder:templates:show', {\n\t\t\tcollection: assets,\n\t\t\tviews: {\n\t\t\t\theader: {\n\t\t\t\t\tviewClass: ABGalleryHeaderView,\n\t\t\t\t\tcollection: assets,\n\t\t\t\t},\n\t\t\t\tassets: {\n\t\t\t\t\tviewClass: ABAssetTemplatesView,\n\t\t\t\t\tcollection: assets,\n\t\t\t\t},\n\t\t\t\tfacets: {\n\t\t\t\t\tviewClass: SearchFacetsView,\n\t\t\t\t\tcollection: assets.selection.searchFacets,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\tassets.fetchTemplates(page);\n\t});\n\tdispatcher.on(\n\t\t'adBuilder:templates:show',\n\t\tfunction (viewOptions) {\n\t\t\tviewOptions = viewOptions || {};\n\n\t\t\tNetx.app.appViews.add({\n\t\t\t\tviewClass: ABGalleryView,\n\t\t\t\tshowActions: ['adBuilder:templates:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * main template interface\n\t * ABTemplateView - a tab view with a previewView added on\n\t * tab ABBlocksView - a form view\n\t * tab ABCustomizationsListView\n\t */\n\tdispatcher.on(\n\t\t'adBuilder:template:show',\n\t\tfunction (viewOptions) {\n\t\t\tNetx.app.appViews.add({\n\t\t\t\tviewClass: ABTemplateView,\n\t\t\t\tshowActions: ['adBuilder:template:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\tdispatcher.on('adBuilder:template:routed', function (id) {\n\t\t// todo: probably already have this model\n\t\tAssetModel.Load(id).then(\n\t\t\tfunction (asset) {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('adBuilder:template:customize', asset);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t},\n\t\t);\n\t});\n\tdispatcher.on('adBuilder:template:customize:edit', function (v, e) {\n\t\t//console.log('ugh');\n\t\tif (v.model.get('blocks')) {\n\t\t\tdispatcher.trigger('adBuilder:template:customize', null, v.model);\n\t\t} else {\n\t\t\t// gross\n\t\t\tdispatcher.trigger(\n\t\t\t\t'adBuilder:template:routed',\n\t\t\t\tv.model.get('view').model.get('assetId'),\n\t\t\t);\n\t\t}\n\t});\n\n\tdispatcher.on('adBuilder:customization:new', function (v) {\n\t\tif (v.model.get('customization')) {\n\t\t\tv.model.set('customization', null);\n\t\t}\n\n\t\tAssetModel.Load(v.model.get('assetId')).then(\n\t\t\tfunction (asset) {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('adBuilder:template:customize', asset);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t},\n\t\t);\n\t});\n\n\tdispatcher.on('adBuilder:template:customize', function (\n\t\tassetModel,\n\t\tcustomizationModel,\n\t) {\n\t\tvar NS = Netx.adBuilder;\n\t\t// if #template/[assetId] has changed\n\t\tif (\n\t\t\tassetModel &&\n\t\t\t(assetModel.id !== NS.currentTemplate.get('assetId') ||\n\t\t\t\t!customizationModel)\n\t\t) {\n\t\t\tNS.currentTemplate.clear({silent: true});\n\t\t\t// Netx.Models.ABTemplate\n\t\t\tNS.currentTemplate.set({\n\t\t\t\tid: assetModel.get('assetId'),\n\t\t\t\tabTitle: assetModel.get('name'),\n\t\t\t\tpreviewUrl: assetModel.get('previewUrl'),\n\t\t\t\tcacheBuster: assetModel.cacheBuster(),\n\t\t\t\tlocked: false,\n\t\t\t});\n\t\t}\n\n\t\t// if we are changing customizations\n\t\tif (customizationModel) {\n\t\t\tNS.currentTemplate.unset('customization', {silent: true});\n\t\t\tNS.currentTemplate.set({\n\t\t\t\tcustomization: customizationModel,\n\t\t\t\tlocked: customizationModel.get('locked'),\n\t\t\t});\n\t\t} else {\n\t\t\t// or creating new customization\n\t\t\tNS.currentTemplate.set({\n\t\t\t\tcustomization: null,\n\t\t\t\tlocked: false,\n\t\t\t});\n\t\t}\n\n\t\t// launch ABTemplateView\n\t\tdispatcher.trigger('adBuilder:template:show', {\n\t\t\tmodel: NS.currentTemplate,\n\t\t\tattributes: {\n\t\t\t\t'data-layer': '',\n\t\t\t},\n\t\t});\n\n\t\tdispatcher.trigger('adBuilder:template:customize:blocks');\n\t});\n\n\t/**\n\t * user done editing a template customization, new or used\n\t * @event module:asset#asset:submit:confirmed\n\t * @param {object} values Asset data\n\t * @param {Netx.Models.Asset} model Asset model\n\t * @fires module:adBuilder#adBuilder:template:customize:save\n\t */\n\tdispatcher.on('adBuilder:template:customize:confirmed', function (\n\t\tvalues,\n\t\tmodel,\n\t) {\n\t\tmodel.set('abValues', values);\n\n\t\tif (model.get('customization')) {\n\t\t\tdispatcher.trigger('adBuilder:template:name:confirmed', values, model);\n\t\t} else {\n\t\t\tdispatcher.trigger('adBuilder:template:name:show', {\n\t\t\t\tmodel: model,\n\t\t\t});\n\t\t}\n\t});\n\tdispatcher.on('adBuilder:template:name:show', (viewOptions) => {\n\t\tNetx.app.modalViews.add({\n\t\t\tviewClass: ABCustomizationNameView,\n\t\t\tshowActions: ['adBuilder:template:name:show'],\n\t\t\tviewOptions: viewOptions,\n\t\t});\n\t});\n\n\t// TODO:\n\n\tdispatcher.on('adBuilder:template:name:confirmed', function (values, model) {\n\t\tvar customTemplate = model.get('customization');\n\n\t\t// if there's a customization on the model then we're saving an existing one\n\t\tif (!customTemplate) {\n\t\t\tcustomTemplate = new ABCustomizationModel({\n\t\t\t\tassetId: model.get('assetId'),\n\t\t\t\tlabel: values.abLabel,\n\t\t\t\tdescription: values.abDescription,\n\t\t\t\tblocks: [],\n\t\t\t\tlocked: false,\n\t\t\t});\n\t\t\tmodel.set('customization', customTemplate);\n\n\t\t\t//dismiss promptView\n\t\t\tdispatcher.trigger('adBuilder:template:name:success');\n\t\t}\n\n\t\tcustomTemplate.set('blocks', []);\n\t\t_.each(\n\t\t\tmodel.get('blocks'),\n\t\t\tfunction (block, idx, all) {\n\t\t\t\t// creates an array of AdBuilderCustomizationBlockDTO objects for Javlandia\n\t\t\t\tthis.customTemplate.get('blocks').push({\n\t\t\t\t\tid: block.id,\n\t\t\t\t\tvalue: this.values[block.id],\n\t\t\t\t});\n\t\t\t},\n\t\t\t{values: model.get('abValues'), customTemplate: customTemplate},\n\t\t);\n\n\t\tdispatcher.trigger('adBuilder:template:customize:save', customTemplate);\n\t});\n\t/**\n\t * @event module:adBuilder#adBuilder:template:customize:save\n\t * @param {Netx.Models.ABCustomization} customTemplate Asset model\n\t * @fires module:adBuilder#adBuilder:template:customize:success\n\t * @fires module:adBuilder#adBuilder:template:customize:error\n\t */\n\n\tdispatcher.on('adBuilder:template:customize:save', function (customTemplate) {\n\t\tcustomTemplate.save().then(\n\t\t\tfunction (saveResult) {\n\t\t\t\tthis.set({\n\t\t\t\t\tid: saveResult.customization.id,\n\t\t\t\t});\n\n\t\t\t\tNetx.ShareWays.download\n\t\t\t\t\t.waitForDam(saveResult.progressUuid)\n\t\t\t\t\t.then(function (result) {\n\t\t\t\t\t\tdispatcher.trigger('adBuilder:template:customize:success', result);\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('adBuilder:template:customize:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:adBuilder#('adBuilder:template:customize:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on('adBuilder:template:customize:error', function (error) {\n\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t});\n\n\t/**\n\t * @event module:adBuilder#adBuilder:template:customize:success\n\t * @param {Netx.Models.Asset} model Asset model\n\t */\n\tdispatcher.on('adBuilder:template:customize:success', function (result) {\n\t\t// nice work ad builder, way to succeed\n\t\tNetx.adBuilder.currentTemplate.set({\n\t\t\tpreviewUrl: result.completeUrl,\n\t\t});\n\t\t// Netx.adBuilder.currentTemplate.get('customization').set('zoomUrl', result.completeUrl.split('preveiw').join('zoom'));\n\t\tNetx.adBuilder.userCustomizations.fetch().then(\n\t\t\tfunction (fetchResult) {\n\t\t\t\tvar cust = this.where({\n\t\t\t\t\tid: Netx.adBuilder.currentTemplate.get('customization').id,\n\t\t\t\t});\n\t\t\t\tif (cust.length) {\n\t\t\t\t\tNetx.adBuilder.currentTemplate.set('customization', cust.pop());\n\t\t\t\t}\n\t\t\t\t// refresh\n\t\t\t\tNetx.adBuilder.currentTemplate.trigger('sync');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t//dispatcher.trigger('adBuilder:template:customize:error', err);\n\t\t\t},\n\t\t);\n\n\t\tdispatcher.trigger('app:passiveAlert', i18n.t('i18n.customizationSaved'));\n\t});\n\n\t/**\n\t * @event module:adBuilder#adBuilder:customization:publish\n\t * @param {Netx.Models.ABCustomTemplate} templateModel model\n\t * @fires module:adBuilder#adBuilder:customization:publish:error\n\t */\n\n\tdispatcher.on('adBuilder:customization:publish', function (templateModel) {\n\t\tvar customization = templateModel.get('customization');\n\t\tif (customization && customization.id) {\n\t\t\tvar assetSet = new AssetSetModel({\n\t\t\t\ttype: assetSetTypes.asset,\n\t\t\t\tids: [customization.get('assetId')],\n\t\t\t});\n\n\t\t\ttemplateModel.set('assetSet', assetSet);\n\n\t\t\tassetSet.getDownloadOptions().then(\n\t\t\t\t(options) => {\n\t\t\t\t\t//options = new Netx.Collections.DownloadOptions(options);\n\t\t\t\t\tvar csOptions = options.find({\n\t\t\t\t\t\ttype: downloadOptionTypes.templateCustomization,\n\t\t\t\t\t});\n\n\t\t\t\t\t//requiresJustification\n\n\t\t\t\t\ttemplateModel.set('downloadOptions', [csOptions]);\n\n\t\t\t\t\tif (csOptions) {\n\t\t\t\t\t\tNetx.app.modalViews.add({\n\t\t\t\t\t\t\tviewClass: ABCustomizationDownloadView,\n\t\t\t\t\t\t\tviewOptions: {\n\t\t\t\t\t\t\t\tmodel: templateModel,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t\t\t'adBuilder:customization:publish:error',\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t'There are no download options available for this template.',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttemplateModel,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\tdispatcher.trigger('adBuilder:customization:publish:error', err);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t});\n\t/**\n\t * @event module:adBuilder#adBuilder:customization:publish:confirmed\n\t * @param {object} data Form data\n\t * @param {Netx.Models.ABCustomTemplate} templateModel model\n\t * @fires module:adBuilder#adBuilder:customization:publish:success\n\t * @fires module:adBuilder#adBuilder:template:customize:download:error\n\t * @fires module:adBuilder#adBuilder:template:customize:download:success\n\t * @fires module:share#share:simpleDownload\n\t */\n\tdispatcher.on('adBuilder:customization:publish:confirmed', function (\n\t\tdata,\n\t\ttemplateModel,\n\t) {\n\t\tvar assetSet = templateModel.get('assetSet'),\n\t\t\tcustomization = templateModel.get('customization'),\n\t\t\tdownloadOption = templateModel.get('downloadOptions')[0];\n\t\tdownloadOption.set({\n\t\t\tid: customization.id,\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tlabel: 'output',\n\t\t\t\t\tvalue: data.process,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t\tassetSet.downloadOptions = new DownloadOptionsCollection(downloadOption);\n\n\t\tdispatcher.trigger('share:download:justify:check', assetSet);\n\n\t\tdispatcher.trigger(\n\t\t\t'adBuilder:customization:publish:success',\n\t\t\ttemplateModel,\n\t\t);\n\t\tdispatcher.once('share:download:success', function () {\n\t\t\tdispatcher.trigger('adBuilder:customization:download:success');\n\t\t});\n\t});\n\n\t/**\n\t * @event module:adBuilder#adBuilder:customization:publish:error\n\t * @param {string} error Error string\n\t * @param {Netx.Models.ABCustomTemplate} templateModel model\n\t * @fires module:app#app:alert\n\t * @see module:asset#adBuilder:template:customize:download:confirmed\n\t */\n\tdispatcher.on(\n\t\t'adBuilder:customization:publish:error',\n\t\tfunction (error, templateModel) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'app:alert',\n\t\t\t\terror,\n\t\t\t\ti18n.t('asset:i18n.error', {defaultValue: 'Error'}),\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:adBuilder#adBuilder:template:publish:success\n\t * @param {Netx.Models.AssetSet} assetSet model\n\t * @param {object} data Form data\n\t */\n\tdispatcher.on(\n\t\t'adBuilder:customization:download:success',\n\t\tfunction () {\n\t\t\tNetx.adBuilder.userCustomizations.fetch().then(function () {\n\t\t\t\tNetx.adBuilder.currentTemplate.fetch();\n\t\t\t});\n\t\t\t//Netx.adBuilder.currentTemplate.fetch();\n\n\t\t\tdispatcher.trigger(\n\t\t\t\t'app:passiveAlert',\n\t\t\t\ti18n.t('adBuilder:i18n.customizationDownloaded', {\n\t\t\t\t\tdefaultValue: 'Customization downloaded.',\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#adbuilder:quickzoom:routed\n\t * @param {number|string} id customization id\n\t * @fires module:adBuilder#quickzoom:zoom\n\t */\n\tdispatcher.on('adbuilder:quickzoom:routed', function (id) {\n\t\tvar cust = Netx.adBuilder.currentTemplate.get('customization');\n\t\tdispatcher.trigger('asset:quickzoom', cust || Netx.asset.current);\n\t});\n\n\t/**\n\t * Delete adBuilder video clip constituent\n\t * @event module:asset#adBuilder:template:customize:delete\n\t * @param {Netx.Models.AssetConsitutent_clip|number} clip Constituent (clip) model / or id\n\t * @fires module:app#app:confirm\n\t * @see module:asset#adBuilder:template:customize:delete:confirmed\n\t */\n\tdispatcher.on('adBuilder:template:customize:delete', function (tableRow, e) {\n\t\t// Must be producer at least\n\t\tif (Netx.user.profile.get('type') < 4) return;\n\n\t\tif (tableRow.model) {\n\t\t\tdispatcher.trigger('app:confirm', {\n\t\t\t\tmessage: i18n.t('asset:i18n.confirmAdBuilderCustomizationDelete', {\n\t\t\t\t\tdefaultValue:\n\t\t\t\t\t\t'Are you sure you want to delete this template customization?',\n\t\t\t\t}),\n\t\t\t\teventStr: 'adBuilder:template:customize:delete',\n\t\t\t\ttemplateName: 'confirmView-deleteWarning',\n\t\t\t\tclasses: 'confirm-delete',\n\t\t\t\targs: [tableRow.model],\n\t\t\t});\n\t\t} else {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'adBuilder:template:customize:delete:error',\n\t\t\t\tnew Error(\n\t\t\t\t\ti18n.t('asset:i18n.invalidCustomization', {\n\t\t\t\t\t\tdefaultValue: 'Invalid customization',\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t});\n\n\t/**\n\t * Delete asset video clip constituent\n\t * @event module:asset#adBuilder:template:customize:delete:confirmed\n\t * @param {Netx.Models.AssetConsitutent_clip} clip Constituent (clip) model\n\t * @fires module:asset#adBuilder:template:customize:delete:error\n\t * @fires module:asset#adBuilder:template:customize:delete:success\n\t * @see module:asset#adBuilder:template:customize:delete\n\t */\n\tdispatcher.on('adBuilder:template:customize:delete:confirmed', function (\n\t\tcustomization,\n\t) {\n\t\t// Must be producer at least\n\t\tif (Netx.user.profile.get('type') < 4) return;\n\t\t//var cust = new Netx.Models.ABCustomization({ 'id': customization.id });\n\t\tcustomization.destroy().then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'adBuilder:template:customize:delete:success',\n\t\t\t\t\tcustomization,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'adBuilder:template:customize:delete:error',\n\t\t\t\t\terr,\n\t\t\t\t\tcustomization,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\n\t/**\n\t * @event module:asset#adBuilder:template:customize:delete:error\n\t * @param {string} error Error string\n\t * @param {Netx.Models.AssetConstitutent_clip} clip Consitutent (clip) model\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'adBuilder:template:customize:delete:error',\n\t\tfunction (error, customization) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'app:alert',\n\t\t\t\terror,\n\t\t\t\ti18n.t('asset:i18n.error', {defaultValue: 'Error'}),\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:asset#adBuilder:template:customize:delete:success\n\t * @param {Netx.Models.AssetConstitutent_clip} clip Consitutent (clip) model\n\t * @fires module:notification#notification\n\t * @see module:asset#adBuilder:template:customize:delete\n\t */\n\tdispatcher.on('adBuilder:template:customize:delete:success', function (\n\t\tcustomization,\n\t) {\n\t\t// good job ad builder, way to take out the trash.\n\t\tdispatcher.trigger(\n\t\t\t'app:passiveAlert',\n\t\t\ti18n.t('adBuilder:i18n.customizationDeleted', {\n\t\t\t\tdefaultValue: 'Customization deleted.',\n\t\t\t}),\n\t\t);\n\t});\n\t/**\n\t * @event module:asset#asset:quickzoom\n\t * show em 2000px worth of asset\n\t */\n\t// dispatcher.off('asset:quickzoom');\n\t// dispatcher.on('asset:quickzoom', function( model ){\n\n\t// \tNetx.View.ShowView('AssetQuickzoomView', 'modal', {\n\t// \t\tmodel: model,\n\t// \t\tid: 'asset-quickzoom'\n\t// \t}, {\n\t// \t\treuse: false\n\t// \t});\n\n\t// });\n});\n\nexport default {\n\tinitialize(opts) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdispatcher.once('adBuilder:initialized', () => {\n\t\t\t\tresolve(routes);\n\t\t\t});\n\t\t\tdispatcher.trigger('adBuilder:init');\n\t\t});\n\t},\n};\n","/**\n * Ad Builder module\n */\n\nimport actions from './actions';\nimport menus from './menus';\nimport controller from './controller';\n\n/**\n * @property {object} exports - Our module exports\n * @property {string} exports.namespace - Module namespace\n * @property {function} exports.initialize - Module initializer\n */\nexport default {\n\tnamespace: 'ad-builder',\n\tinitialize() {\n\t\t// Register actions\n\t\tNetx.Actions.Register(actions);\n\t\t// Extend menus\n\t\tNetx.addMenus(menus);\n\n\t\treturn controller.initialize();\n\t},\n};\n","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nexport var cssClasses = {\n LABEL_FLOAT_ABOVE: 'mdc-floating-label--float-above',\n LABEL_SHAKE: 'mdc-floating-label--shake',\n ROOT: 'mdc-floating-label',\n};\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses } from './constants';\nvar MDCFloatingLabelFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCFloatingLabelFoundation, _super);\n function MDCFloatingLabelFoundation(adapter) {\n var _this = _super.call(this, tslib_1.__assign({}, MDCFloatingLabelFoundation.defaultAdapter, adapter)) || this;\n _this.shakeAnimationEndHandler_ = function () { return _this.handleShakeAnimationEnd_(); };\n return _this;\n }\n Object.defineProperty(MDCFloatingLabelFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCFloatingLabelFoundation, \"defaultAdapter\", {\n /**\n * See {@link MDCFloatingLabelAdapter} for typing information on parameters and return types.\n */\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n addClass: function () { return undefined; },\n removeClass: function () { return undefined; },\n getWidth: function () { return 0; },\n registerInteractionHandler: function () { return undefined; },\n deregisterInteractionHandler: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n MDCFloatingLabelFoundation.prototype.init = function () {\n this.adapter_.registerInteractionHandler('animationend', this.shakeAnimationEndHandler_);\n };\n MDCFloatingLabelFoundation.prototype.destroy = function () {\n this.adapter_.deregisterInteractionHandler('animationend', this.shakeAnimationEndHandler_);\n };\n /**\n * Returns the width of the label element.\n */\n MDCFloatingLabelFoundation.prototype.getWidth = function () {\n return this.adapter_.getWidth();\n };\n /**\n * Styles the label to produce a shake animation to indicate an error.\n * @param shouldShake If true, adds the shake CSS class; otherwise, removes shake class.\n */\n MDCFloatingLabelFoundation.prototype.shake = function (shouldShake) {\n var LABEL_SHAKE = MDCFloatingLabelFoundation.cssClasses.LABEL_SHAKE;\n if (shouldShake) {\n this.adapter_.addClass(LABEL_SHAKE);\n }\n else {\n this.adapter_.removeClass(LABEL_SHAKE);\n }\n };\n /**\n * Styles the label to float or dock.\n * @param shouldFloat If true, adds the float CSS class; otherwise, removes float and shake classes to dock the label.\n */\n MDCFloatingLabelFoundation.prototype.float = function (shouldFloat) {\n var _a = MDCFloatingLabelFoundation.cssClasses, LABEL_FLOAT_ABOVE = _a.LABEL_FLOAT_ABOVE, LABEL_SHAKE = _a.LABEL_SHAKE;\n if (shouldFloat) {\n this.adapter_.addClass(LABEL_FLOAT_ABOVE);\n }\n else {\n this.adapter_.removeClass(LABEL_FLOAT_ABOVE);\n this.adapter_.removeClass(LABEL_SHAKE);\n }\n };\n MDCFloatingLabelFoundation.prototype.handleShakeAnimationEnd_ = function () {\n var LABEL_SHAKE = MDCFloatingLabelFoundation.cssClasses.LABEL_SHAKE;\n this.adapter_.removeClass(LABEL_SHAKE);\n };\n return MDCFloatingLabelFoundation;\n}(MDCFoundation));\nexport { MDCFloatingLabelFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCFloatingLabelFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCFloatingLabelFoundation } from './foundation';\nvar MDCFloatingLabel = /** @class */ (function (_super) {\n tslib_1.__extends(MDCFloatingLabel, _super);\n function MDCFloatingLabel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCFloatingLabel.attachTo = function (root) {\n return new MDCFloatingLabel(root);\n };\n /**\n * Styles the label to produce the label shake for errors.\n * @param shouldShake If true, shakes the label by adding a CSS class; otherwise, stops shaking by removing the class.\n */\n MDCFloatingLabel.prototype.shake = function (shouldShake) {\n this.foundation_.shake(shouldShake);\n };\n /**\n * Styles the label to float/dock.\n * @param shouldFloat If true, floats the label by adding a CSS class; otherwise, docks it by removing the class.\n */\n MDCFloatingLabel.prototype.float = function (shouldFloat) {\n this.foundation_.float(shouldFloat);\n };\n MDCFloatingLabel.prototype.getWidth = function () {\n return this.foundation_.getWidth();\n };\n MDCFloatingLabel.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n addClass: function (className) { return _this.root_.classList.add(className); },\n removeClass: function (className) { return _this.root_.classList.remove(className); },\n getWidth: function () { return _this.root_.scrollWidth; },\n registerInteractionHandler: function (evtType, handler) { return _this.listen(evtType, handler); },\n deregisterInteractionHandler: function (evtType, handler) { return _this.unlisten(evtType, handler); },\n };\n // tslint:enable:object-literal-sort-keys\n return new MDCFloatingLabelFoundation(adapter);\n };\n return MDCFloatingLabel;\n}(MDCComponent));\nexport { MDCFloatingLabel };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar cssClasses = {\n LINE_RIPPLE_ACTIVE: 'mdc-line-ripple--active',\n LINE_RIPPLE_DEACTIVATING: 'mdc-line-ripple--deactivating',\n};\nexport { cssClasses };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses } from './constants';\nvar MDCLineRippleFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCLineRippleFoundation, _super);\n function MDCLineRippleFoundation(adapter) {\n var _this = _super.call(this, tslib_1.__assign({}, MDCLineRippleFoundation.defaultAdapter, adapter)) || this;\n _this.transitionEndHandler_ = function (evt) { return _this.handleTransitionEnd(evt); };\n return _this;\n }\n Object.defineProperty(MDCLineRippleFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCLineRippleFoundation, \"defaultAdapter\", {\n /**\n * See {@link MDCLineRippleAdapter} for typing information on parameters and return types.\n */\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n addClass: function () { return undefined; },\n removeClass: function () { return undefined; },\n hasClass: function () { return false; },\n setStyle: function () { return undefined; },\n registerEventHandler: function () { return undefined; },\n deregisterEventHandler: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n MDCLineRippleFoundation.prototype.init = function () {\n this.adapter_.registerEventHandler('transitionend', this.transitionEndHandler_);\n };\n MDCLineRippleFoundation.prototype.destroy = function () {\n this.adapter_.deregisterEventHandler('transitionend', this.transitionEndHandler_);\n };\n MDCLineRippleFoundation.prototype.activate = function () {\n this.adapter_.removeClass(cssClasses.LINE_RIPPLE_DEACTIVATING);\n this.adapter_.addClass(cssClasses.LINE_RIPPLE_ACTIVE);\n };\n MDCLineRippleFoundation.prototype.setRippleCenter = function (xCoordinate) {\n this.adapter_.setStyle('transform-origin', xCoordinate + \"px center\");\n };\n MDCLineRippleFoundation.prototype.deactivate = function () {\n this.adapter_.addClass(cssClasses.LINE_RIPPLE_DEACTIVATING);\n };\n MDCLineRippleFoundation.prototype.handleTransitionEnd = function (evt) {\n // Wait for the line ripple to be either transparent or opaque\n // before emitting the animation end event\n var isDeactivating = this.adapter_.hasClass(cssClasses.LINE_RIPPLE_DEACTIVATING);\n if (evt.propertyName === 'opacity') {\n if (isDeactivating) {\n this.adapter_.removeClass(cssClasses.LINE_RIPPLE_ACTIVE);\n this.adapter_.removeClass(cssClasses.LINE_RIPPLE_DEACTIVATING);\n }\n }\n };\n return MDCLineRippleFoundation;\n}(MDCFoundation));\nexport { MDCLineRippleFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCLineRippleFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCLineRippleFoundation } from './foundation';\nvar MDCLineRipple = /** @class */ (function (_super) {\n tslib_1.__extends(MDCLineRipple, _super);\n function MDCLineRipple() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCLineRipple.attachTo = function (root) {\n return new MDCLineRipple(root);\n };\n /**\n * Activates the line ripple\n */\n MDCLineRipple.prototype.activate = function () {\n this.foundation_.activate();\n };\n /**\n * Deactivates the line ripple\n */\n MDCLineRipple.prototype.deactivate = function () {\n this.foundation_.deactivate();\n };\n /**\n * Sets the transform origin given a user's click location.\n * The `rippleCenter` is the x-coordinate of the middle of the ripple.\n */\n MDCLineRipple.prototype.setRippleCenter = function (xCoordinate) {\n this.foundation_.setRippleCenter(xCoordinate);\n };\n MDCLineRipple.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n addClass: function (className) { return _this.root_.classList.add(className); },\n removeClass: function (className) { return _this.root_.classList.remove(className); },\n hasClass: function (className) { return _this.root_.classList.contains(className); },\n setStyle: function (propertyName, value) { return _this.root_.style.setProperty(propertyName, value); },\n registerEventHandler: function (evtType, handler) { return _this.listen(evtType, handler); },\n deregisterEventHandler: function (evtType, handler) { return _this.unlisten(evtType, handler); },\n };\n // tslint:enable:object-literal-sort-keys\n return new MDCLineRippleFoundation(adapter);\n };\n return MDCLineRipple;\n}(MDCComponent));\nexport { MDCLineRipple };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2018 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar strings = {\n NOTCH_ELEMENT_SELECTOR: '.mdc-notched-outline__notch',\n};\nvar numbers = {\n // This should stay in sync with $mdc-notched-outline-padding * 2.\n NOTCH_ELEMENT_PADDING: 8,\n};\nvar cssClasses = {\n NO_LABEL: 'mdc-notched-outline--no-label',\n OUTLINE_NOTCHED: 'mdc-notched-outline--notched',\n OUTLINE_UPGRADED: 'mdc-notched-outline--upgraded',\n};\nexport { cssClasses, numbers, strings };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses, numbers, strings } from './constants';\nvar MDCNotchedOutlineFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCNotchedOutlineFoundation, _super);\n function MDCNotchedOutlineFoundation(adapter) {\n return _super.call(this, tslib_1.__assign({}, MDCNotchedOutlineFoundation.defaultAdapter, adapter)) || this;\n }\n Object.defineProperty(MDCNotchedOutlineFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCNotchedOutlineFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCNotchedOutlineFoundation, \"numbers\", {\n get: function () {\n return numbers;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCNotchedOutlineFoundation, \"defaultAdapter\", {\n /**\n * See {@link MDCNotchedOutlineAdapter} for typing information on parameters and return types.\n */\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n addClass: function () { return undefined; },\n removeClass: function () { return undefined; },\n setNotchWidthProperty: function () { return undefined; },\n removeNotchWidthProperty: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Adds the outline notched selector and updates the notch width calculated based off of notchWidth.\n */\n MDCNotchedOutlineFoundation.prototype.notch = function (notchWidth) {\n var OUTLINE_NOTCHED = MDCNotchedOutlineFoundation.cssClasses.OUTLINE_NOTCHED;\n if (notchWidth > 0) {\n notchWidth += numbers.NOTCH_ELEMENT_PADDING; // Add padding from left/right.\n }\n this.adapter_.setNotchWidthProperty(notchWidth);\n this.adapter_.addClass(OUTLINE_NOTCHED);\n };\n /**\n * Removes notched outline selector to close the notch in the outline.\n */\n MDCNotchedOutlineFoundation.prototype.closeNotch = function () {\n var OUTLINE_NOTCHED = MDCNotchedOutlineFoundation.cssClasses.OUTLINE_NOTCHED;\n this.adapter_.removeClass(OUTLINE_NOTCHED);\n this.adapter_.removeNotchWidthProperty();\n };\n return MDCNotchedOutlineFoundation;\n}(MDCFoundation));\nexport { MDCNotchedOutlineFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCNotchedOutlineFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCFloatingLabelFoundation } from '@material/floating-label/foundation';\nimport { cssClasses, strings } from './constants';\nimport { MDCNotchedOutlineFoundation } from './foundation';\nvar MDCNotchedOutline = /** @class */ (function (_super) {\n tslib_1.__extends(MDCNotchedOutline, _super);\n function MDCNotchedOutline() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCNotchedOutline.attachTo = function (root) {\n return new MDCNotchedOutline(root);\n };\n MDCNotchedOutline.prototype.initialSyncWithDOM = function () {\n this.notchElement_ = this.root_.querySelector(strings.NOTCH_ELEMENT_SELECTOR);\n var label = this.root_.querySelector('.' + MDCFloatingLabelFoundation.cssClasses.ROOT);\n if (label) {\n label.style.transitionDuration = '0s';\n this.root_.classList.add(cssClasses.OUTLINE_UPGRADED);\n requestAnimationFrame(function () {\n label.style.transitionDuration = '';\n });\n }\n else {\n this.root_.classList.add(cssClasses.NO_LABEL);\n }\n };\n /**\n * Updates classes and styles to open the notch to the specified width.\n * @param notchWidth The notch width in the outline.\n */\n MDCNotchedOutline.prototype.notch = function (notchWidth) {\n this.foundation_.notch(notchWidth);\n };\n /**\n * Updates classes and styles to close the notch.\n */\n MDCNotchedOutline.prototype.closeNotch = function () {\n this.foundation_.closeNotch();\n };\n MDCNotchedOutline.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n addClass: function (className) { return _this.root_.classList.add(className); },\n removeClass: function (className) { return _this.root_.classList.remove(className); },\n setNotchWidthProperty: function (width) { return _this.notchElement_.style.setProperty('width', width + 'px'); },\n removeNotchWidthProperty: function () { return _this.notchElement_.style.removeProperty('width'); },\n };\n // tslint:enable:object-literal-sort-keys\n return new MDCNotchedOutlineFoundation(adapter);\n };\n return MDCNotchedOutline;\n}(MDCComponent));\nexport { MDCNotchedOutline };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar cssClasses = {\n ROOT: 'mdc-text-field-character-counter',\n};\nvar strings = {\n ROOT_SELECTOR: \".\" + cssClasses.ROOT,\n};\nexport { strings, cssClasses };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses, strings } from './constants';\nvar MDCTextFieldCharacterCounterFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTextFieldCharacterCounterFoundation, _super);\n function MDCTextFieldCharacterCounterFoundation(adapter) {\n return _super.call(this, tslib_1.__assign({}, MDCTextFieldCharacterCounterFoundation.defaultAdapter, adapter)) || this;\n }\n Object.defineProperty(MDCTextFieldCharacterCounterFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldCharacterCounterFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldCharacterCounterFoundation, \"defaultAdapter\", {\n /**\n * See {@link MDCTextFieldCharacterCounterAdapter} for typing information on parameters and return types.\n */\n get: function () {\n return {\n setContent: function () { return undefined; },\n };\n },\n enumerable: true,\n configurable: true\n });\n MDCTextFieldCharacterCounterFoundation.prototype.setCounterValue = function (currentLength, maxLength) {\n currentLength = Math.min(currentLength, maxLength);\n this.adapter_.setContent(currentLength + \" / \" + maxLength);\n };\n return MDCTextFieldCharacterCounterFoundation;\n}(MDCFoundation));\nexport { MDCTextFieldCharacterCounterFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTextFieldCharacterCounterFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCTextFieldCharacterCounterFoundation } from './foundation';\nvar MDCTextFieldCharacterCounter = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTextFieldCharacterCounter, _super);\n function MDCTextFieldCharacterCounter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTextFieldCharacterCounter.attachTo = function (root) {\n return new MDCTextFieldCharacterCounter(root);\n };\n Object.defineProperty(MDCTextFieldCharacterCounter.prototype, \"foundation\", {\n get: function () {\n return this.foundation_;\n },\n enumerable: true,\n configurable: true\n });\n MDCTextFieldCharacterCounter.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n var adapter = {\n setContent: function (content) {\n _this.root_.textContent = content;\n },\n };\n return new MDCTextFieldCharacterCounterFoundation(adapter);\n };\n return MDCTextFieldCharacterCounter;\n}(MDCComponent));\nexport { MDCTextFieldCharacterCounter };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { ALWAYS_FLOAT_TYPES, cssClasses, numbers, strings, VALIDATION_ATTR_WHITELIST } from './constants';\nvar POINTERDOWN_EVENTS = ['mousedown', 'touchstart'];\nvar INTERACTION_EVENTS = ['click', 'keydown'];\nvar MDCTextFieldFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTextFieldFoundation, _super);\n /**\n * @param adapter\n * @param foundationMap Map from subcomponent names to their subfoundations.\n */\n function MDCTextFieldFoundation(adapter, foundationMap) {\n if (foundationMap === void 0) { foundationMap = {}; }\n var _this = _super.call(this, tslib_1.__assign({}, MDCTextFieldFoundation.defaultAdapter, adapter)) || this;\n _this.isFocused_ = false;\n _this.receivedUserInput_ = false;\n _this.isValid_ = true;\n _this.useNativeValidation_ = true;\n _this.helperText_ = foundationMap.helperText;\n _this.characterCounter_ = foundationMap.characterCounter;\n _this.leadingIcon_ = foundationMap.leadingIcon;\n _this.trailingIcon_ = foundationMap.trailingIcon;\n _this.inputFocusHandler_ = function () { return _this.activateFocus(); };\n _this.inputBlurHandler_ = function () { return _this.deactivateFocus(); };\n _this.inputInputHandler_ = function () { return _this.handleInput(); };\n _this.setPointerXOffset_ = function (evt) { return _this.setTransformOrigin(evt); };\n _this.textFieldInteractionHandler_ = function () { return _this.handleTextFieldInteraction(); };\n _this.validationAttributeChangeHandler_ = function (attributesList) { return _this.handleValidationAttributeChange(attributesList); };\n return _this;\n }\n Object.defineProperty(MDCTextFieldFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldFoundation, \"numbers\", {\n get: function () {\n return numbers;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldFoundation.prototype, \"shouldAlwaysFloat_\", {\n get: function () {\n var type = this.getNativeInput_().type;\n return ALWAYS_FLOAT_TYPES.indexOf(type) >= 0;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldFoundation.prototype, \"shouldFloat\", {\n get: function () {\n return this.shouldAlwaysFloat_ || this.isFocused_ || Boolean(this.getValue()) || this.isBadInput_();\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldFoundation.prototype, \"shouldShake\", {\n get: function () {\n return !this.isFocused_ && !this.isValid() && Boolean(this.getValue());\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldFoundation, \"defaultAdapter\", {\n /**\n * See {@link MDCTextFieldAdapter} for typing information on parameters and return types.\n */\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n addClass: function () { return undefined; },\n removeClass: function () { return undefined; },\n hasClass: function () { return true; },\n registerTextFieldInteractionHandler: function () { return undefined; },\n deregisterTextFieldInteractionHandler: function () { return undefined; },\n registerInputInteractionHandler: function () { return undefined; },\n deregisterInputInteractionHandler: function () { return undefined; },\n registerValidationAttributeChangeHandler: function () { return new MutationObserver(function () { return undefined; }); },\n deregisterValidationAttributeChangeHandler: function () { return undefined; },\n getNativeInput: function () { return null; },\n isFocused: function () { return false; },\n activateLineRipple: function () { return undefined; },\n deactivateLineRipple: function () { return undefined; },\n setLineRippleTransformOrigin: function () { return undefined; },\n shakeLabel: function () { return undefined; },\n floatLabel: function () { return undefined; },\n hasLabel: function () { return false; },\n getLabelWidth: function () { return 0; },\n hasOutline: function () { return false; },\n notchOutline: function () { return undefined; },\n closeOutline: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n MDCTextFieldFoundation.prototype.init = function () {\n var _this = this;\n if (this.adapter_.isFocused()) {\n this.inputFocusHandler_();\n }\n else if (this.adapter_.hasLabel() && this.shouldFloat) {\n this.notchOutline(true);\n this.adapter_.floatLabel(true);\n }\n this.adapter_.registerInputInteractionHandler('focus', this.inputFocusHandler_);\n this.adapter_.registerInputInteractionHandler('blur', this.inputBlurHandler_);\n this.adapter_.registerInputInteractionHandler('input', this.inputInputHandler_);\n POINTERDOWN_EVENTS.forEach(function (evtType) {\n _this.adapter_.registerInputInteractionHandler(evtType, _this.setPointerXOffset_);\n });\n INTERACTION_EVENTS.forEach(function (evtType) {\n _this.adapter_.registerTextFieldInteractionHandler(evtType, _this.textFieldInteractionHandler_);\n });\n this.validationObserver_ =\n this.adapter_.registerValidationAttributeChangeHandler(this.validationAttributeChangeHandler_);\n this.setCharacterCounter_(this.getValue().length);\n };\n MDCTextFieldFoundation.prototype.destroy = function () {\n var _this = this;\n this.adapter_.deregisterInputInteractionHandler('focus', this.inputFocusHandler_);\n this.adapter_.deregisterInputInteractionHandler('blur', this.inputBlurHandler_);\n this.adapter_.deregisterInputInteractionHandler('input', this.inputInputHandler_);\n POINTERDOWN_EVENTS.forEach(function (evtType) {\n _this.adapter_.deregisterInputInteractionHandler(evtType, _this.setPointerXOffset_);\n });\n INTERACTION_EVENTS.forEach(function (evtType) {\n _this.adapter_.deregisterTextFieldInteractionHandler(evtType, _this.textFieldInteractionHandler_);\n });\n this.adapter_.deregisterValidationAttributeChangeHandler(this.validationObserver_);\n };\n /**\n * Handles user interactions with the Text Field.\n */\n MDCTextFieldFoundation.prototype.handleTextFieldInteraction = function () {\n var nativeInput = this.adapter_.getNativeInput();\n if (nativeInput && nativeInput.disabled) {\n return;\n }\n this.receivedUserInput_ = true;\n };\n /**\n * Handles validation attribute changes\n */\n MDCTextFieldFoundation.prototype.handleValidationAttributeChange = function (attributesList) {\n var _this = this;\n attributesList.some(function (attributeName) {\n if (VALIDATION_ATTR_WHITELIST.indexOf(attributeName) > -1) {\n _this.styleValidity_(true);\n return true;\n }\n return false;\n });\n if (attributesList.indexOf('maxlength') > -1) {\n this.setCharacterCounter_(this.getValue().length);\n }\n };\n /**\n * Opens/closes the notched outline.\n */\n MDCTextFieldFoundation.prototype.notchOutline = function (openNotch) {\n if (!this.adapter_.hasOutline()) {\n return;\n }\n if (openNotch) {\n var isDense = this.adapter_.hasClass(cssClasses.DENSE);\n var labelScale = isDense ? numbers.DENSE_LABEL_SCALE : numbers.LABEL_SCALE;\n var labelWidth = this.adapter_.getLabelWidth() * labelScale;\n this.adapter_.notchOutline(labelWidth);\n }\n else {\n this.adapter_.closeOutline();\n }\n };\n /**\n * Activates the text field focus state.\n */\n MDCTextFieldFoundation.prototype.activateFocus = function () {\n this.isFocused_ = true;\n this.styleFocused_(this.isFocused_);\n this.adapter_.activateLineRipple();\n if (this.adapter_.hasLabel()) {\n this.notchOutline(this.shouldFloat);\n this.adapter_.floatLabel(this.shouldFloat);\n this.adapter_.shakeLabel(this.shouldShake);\n }\n if (this.helperText_) {\n this.helperText_.showToScreenReader();\n }\n };\n /**\n * Sets the line ripple's transform origin, so that the line ripple activate\n * animation will animate out from the user's click location.\n */\n MDCTextFieldFoundation.prototype.setTransformOrigin = function (evt) {\n var touches = evt.touches;\n var targetEvent = touches ? touches[0] : evt;\n var targetClientRect = targetEvent.target.getBoundingClientRect();\n var normalizedX = targetEvent.clientX - targetClientRect.left;\n this.adapter_.setLineRippleTransformOrigin(normalizedX);\n };\n /**\n * Handles input change of text input and text area.\n */\n MDCTextFieldFoundation.prototype.handleInput = function () {\n this.autoCompleteFocus();\n this.setCharacterCounter_(this.getValue().length);\n };\n /**\n * Activates the Text Field's focus state in cases when the input value\n * changes without user input (e.g. programmatically).\n */\n MDCTextFieldFoundation.prototype.autoCompleteFocus = function () {\n if (!this.receivedUserInput_) {\n this.activateFocus();\n }\n };\n /**\n * Deactivates the Text Field's focus state.\n */\n MDCTextFieldFoundation.prototype.deactivateFocus = function () {\n this.isFocused_ = false;\n this.adapter_.deactivateLineRipple();\n var isValid = this.isValid();\n this.styleValidity_(isValid);\n this.styleFocused_(this.isFocused_);\n if (this.adapter_.hasLabel()) {\n this.notchOutline(this.shouldFloat);\n this.adapter_.floatLabel(this.shouldFloat);\n this.adapter_.shakeLabel(this.shouldShake);\n }\n if (!this.shouldFloat) {\n this.receivedUserInput_ = false;\n }\n };\n MDCTextFieldFoundation.prototype.getValue = function () {\n return this.getNativeInput_().value;\n };\n /**\n * @param value The value to set on the input Element.\n */\n MDCTextFieldFoundation.prototype.setValue = function (value) {\n // Prevent Safari from moving the caret to the end of the input when the value has not changed.\n if (this.getValue() !== value) {\n this.getNativeInput_().value = value;\n }\n this.setCharacterCounter_(value.length);\n var isValid = this.isValid();\n this.styleValidity_(isValid);\n if (this.adapter_.hasLabel()) {\n this.notchOutline(this.shouldFloat);\n this.adapter_.floatLabel(this.shouldFloat);\n this.adapter_.shakeLabel(this.shouldShake);\n }\n };\n /**\n * @return The custom validity state, if set; otherwise, the result of a native validity check.\n */\n MDCTextFieldFoundation.prototype.isValid = function () {\n return this.useNativeValidation_\n ? this.isNativeInputValid_() : this.isValid_;\n };\n /**\n * @param isValid Sets the custom validity state of the Text Field.\n */\n MDCTextFieldFoundation.prototype.setValid = function (isValid) {\n this.isValid_ = isValid;\n this.styleValidity_(isValid);\n var shouldShake = !isValid && !this.isFocused_;\n if (this.adapter_.hasLabel()) {\n this.adapter_.shakeLabel(shouldShake);\n }\n };\n /**\n * Enables or disables the use of native validation. Use this for custom validation.\n * @param useNativeValidation Set this to false to ignore native input validation.\n */\n MDCTextFieldFoundation.prototype.setUseNativeValidation = function (useNativeValidation) {\n this.useNativeValidation_ = useNativeValidation;\n };\n MDCTextFieldFoundation.prototype.isDisabled = function () {\n return this.getNativeInput_().disabled;\n };\n /**\n * @param disabled Sets the text-field disabled or enabled.\n */\n MDCTextFieldFoundation.prototype.setDisabled = function (disabled) {\n this.getNativeInput_().disabled = disabled;\n this.styleDisabled_(disabled);\n };\n /**\n * @param content Sets the content of the helper text.\n */\n MDCTextFieldFoundation.prototype.setHelperTextContent = function (content) {\n if (this.helperText_) {\n this.helperText_.setContent(content);\n }\n };\n /**\n * Sets the aria label of the leading icon.\n */\n MDCTextFieldFoundation.prototype.setLeadingIconAriaLabel = function (label) {\n if (this.leadingIcon_) {\n this.leadingIcon_.setAriaLabel(label);\n }\n };\n /**\n * Sets the text content of the leading icon.\n */\n MDCTextFieldFoundation.prototype.setLeadingIconContent = function (content) {\n if (this.leadingIcon_) {\n this.leadingIcon_.setContent(content);\n }\n };\n /**\n * Sets the aria label of the trailing icon.\n */\n MDCTextFieldFoundation.prototype.setTrailingIconAriaLabel = function (label) {\n if (this.trailingIcon_) {\n this.trailingIcon_.setAriaLabel(label);\n }\n };\n /**\n * Sets the text content of the trailing icon.\n */\n MDCTextFieldFoundation.prototype.setTrailingIconContent = function (content) {\n if (this.trailingIcon_) {\n this.trailingIcon_.setContent(content);\n }\n };\n /**\n * Sets character counter values that shows characters used and the total character limit.\n */\n MDCTextFieldFoundation.prototype.setCharacterCounter_ = function (currentLength) {\n if (!this.characterCounter_) {\n return;\n }\n var maxLength = this.getNativeInput_().maxLength;\n if (maxLength === -1) {\n throw new Error('MDCTextFieldFoundation: Expected maxlength html property on text input or textarea.');\n }\n this.characterCounter_.setCounterValue(currentLength, maxLength);\n };\n /**\n * @return True if the Text Field input fails in converting the user-supplied value.\n */\n MDCTextFieldFoundation.prototype.isBadInput_ = function () {\n // The badInput property is not supported in IE 11 💩.\n return this.getNativeInput_().validity.badInput || false;\n };\n /**\n * @return The result of native validity checking (ValidityState.valid).\n */\n MDCTextFieldFoundation.prototype.isNativeInputValid_ = function () {\n return this.getNativeInput_().validity.valid;\n };\n /**\n * Styles the component based on the validity state.\n */\n MDCTextFieldFoundation.prototype.styleValidity_ = function (isValid) {\n var INVALID = MDCTextFieldFoundation.cssClasses.INVALID;\n if (isValid) {\n this.adapter_.removeClass(INVALID);\n }\n else {\n this.adapter_.addClass(INVALID);\n }\n if (this.helperText_) {\n this.helperText_.setValidity(isValid);\n }\n };\n /**\n * Styles the component based on the focused state.\n */\n MDCTextFieldFoundation.prototype.styleFocused_ = function (isFocused) {\n var FOCUSED = MDCTextFieldFoundation.cssClasses.FOCUSED;\n if (isFocused) {\n this.adapter_.addClass(FOCUSED);\n }\n else {\n this.adapter_.removeClass(FOCUSED);\n }\n };\n /**\n * Styles the component based on the disabled state.\n */\n MDCTextFieldFoundation.prototype.styleDisabled_ = function (isDisabled) {\n var _a = MDCTextFieldFoundation.cssClasses, DISABLED = _a.DISABLED, INVALID = _a.INVALID;\n if (isDisabled) {\n this.adapter_.addClass(DISABLED);\n this.adapter_.removeClass(INVALID);\n }\n else {\n this.adapter_.removeClass(DISABLED);\n }\n if (this.leadingIcon_) {\n this.leadingIcon_.setDisabled(isDisabled);\n }\n if (this.trailingIcon_) {\n this.trailingIcon_.setDisabled(isDisabled);\n }\n };\n /**\n * @return The native text input element from the host environment, or an object with the same shape for unit tests.\n */\n MDCTextFieldFoundation.prototype.getNativeInput_ = function () {\n // this.adapter_ may be undefined in foundation unit tests. This happens when testdouble is creating a mock object\n // and invokes the shouldShake/shouldFloat getters (which in turn call getValue(), which calls this method) before\n // init() has been called from the MDCTextField constructor. To work around that issue, we return a dummy object.\n var nativeInput = this.adapter_ ? this.adapter_.getNativeInput() : null;\n return nativeInput || {\n disabled: false,\n maxLength: -1,\n type: 'input',\n validity: {\n badInput: false,\n valid: true,\n },\n value: '',\n };\n };\n return MDCTextFieldFoundation;\n}(MDCFoundation));\nexport { MDCTextFieldFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTextFieldFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar cssClasses = {\n HELPER_TEXT_PERSISTENT: 'mdc-text-field-helper-text--persistent',\n HELPER_TEXT_VALIDATION_MSG: 'mdc-text-field-helper-text--validation-msg',\n ROOT: 'mdc-text-field-helper-text',\n};\nvar strings = {\n ARIA_HIDDEN: 'aria-hidden',\n ROLE: 'role',\n ROOT_SELECTOR: \".\" + cssClasses.ROOT,\n};\nexport { strings, cssClasses };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses, strings } from './constants';\nvar MDCTextFieldHelperTextFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTextFieldHelperTextFoundation, _super);\n function MDCTextFieldHelperTextFoundation(adapter) {\n return _super.call(this, tslib_1.__assign({}, MDCTextFieldHelperTextFoundation.defaultAdapter, adapter)) || this;\n }\n Object.defineProperty(MDCTextFieldHelperTextFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldHelperTextFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldHelperTextFoundation, \"defaultAdapter\", {\n /**\n * See {@link MDCTextFieldHelperTextAdapter} for typing information on parameters and return types.\n */\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n addClass: function () { return undefined; },\n removeClass: function () { return undefined; },\n hasClass: function () { return false; },\n setAttr: function () { return undefined; },\n removeAttr: function () { return undefined; },\n setContent: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Sets the content of the helper text field.\n */\n MDCTextFieldHelperTextFoundation.prototype.setContent = function (content) {\n this.adapter_.setContent(content);\n };\n /**\n * @param isPersistent Sets the persistency of the helper text.\n */\n MDCTextFieldHelperTextFoundation.prototype.setPersistent = function (isPersistent) {\n if (isPersistent) {\n this.adapter_.addClass(cssClasses.HELPER_TEXT_PERSISTENT);\n }\n else {\n this.adapter_.removeClass(cssClasses.HELPER_TEXT_PERSISTENT);\n }\n };\n /**\n * @param isValidation True to make the helper text act as an error validation message.\n */\n MDCTextFieldHelperTextFoundation.prototype.setValidation = function (isValidation) {\n if (isValidation) {\n this.adapter_.addClass(cssClasses.HELPER_TEXT_VALIDATION_MSG);\n }\n else {\n this.adapter_.removeClass(cssClasses.HELPER_TEXT_VALIDATION_MSG);\n }\n };\n /**\n * Makes the helper text visible to the screen reader.\n */\n MDCTextFieldHelperTextFoundation.prototype.showToScreenReader = function () {\n this.adapter_.removeAttr(strings.ARIA_HIDDEN);\n };\n /**\n * Sets the validity of the helper text based on the input validity.\n */\n MDCTextFieldHelperTextFoundation.prototype.setValidity = function (inputIsValid) {\n var helperTextIsPersistent = this.adapter_.hasClass(cssClasses.HELPER_TEXT_PERSISTENT);\n var helperTextIsValidationMsg = this.adapter_.hasClass(cssClasses.HELPER_TEXT_VALIDATION_MSG);\n var validationMsgNeedsDisplay = helperTextIsValidationMsg && !inputIsValid;\n if (validationMsgNeedsDisplay) {\n this.adapter_.setAttr(strings.ROLE, 'alert');\n }\n else {\n this.adapter_.removeAttr(strings.ROLE);\n }\n if (!helperTextIsPersistent && !validationMsgNeedsDisplay) {\n this.hide_();\n }\n };\n /**\n * Hides the help text from screen readers.\n */\n MDCTextFieldHelperTextFoundation.prototype.hide_ = function () {\n this.adapter_.setAttr(strings.ARIA_HIDDEN, 'true');\n };\n return MDCTextFieldHelperTextFoundation;\n}(MDCFoundation));\nexport { MDCTextFieldHelperTextFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTextFieldHelperTextFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCTextFieldHelperTextFoundation } from './foundation';\nvar MDCTextFieldHelperText = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTextFieldHelperText, _super);\n function MDCTextFieldHelperText() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTextFieldHelperText.attachTo = function (root) {\n return new MDCTextFieldHelperText(root);\n };\n Object.defineProperty(MDCTextFieldHelperText.prototype, \"foundation\", {\n get: function () {\n return this.foundation_;\n },\n enumerable: true,\n configurable: true\n });\n MDCTextFieldHelperText.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n addClass: function (className) { return _this.root_.classList.add(className); },\n removeClass: function (className) { return _this.root_.classList.remove(className); },\n hasClass: function (className) { return _this.root_.classList.contains(className); },\n setAttr: function (attr, value) { return _this.root_.setAttribute(attr, value); },\n removeAttr: function (attr) { return _this.root_.removeAttribute(attr); },\n setContent: function (content) {\n _this.root_.textContent = content;\n },\n };\n // tslint:enable:object-literal-sort-keys\n return new MDCTextFieldHelperTextFoundation(adapter);\n };\n return MDCTextFieldHelperText;\n}(MDCComponent));\nexport { MDCTextFieldHelperText };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar strings = {\n ICON_EVENT: 'MDCTextField:icon',\n ICON_ROLE: 'button',\n};\nvar cssClasses = {\n ROOT: 'mdc-text-field__icon',\n};\nexport { strings, cssClasses };\n//# sourceMappingURL=constants.js.map","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCFoundation } from '@material/base/foundation';\nimport { cssClasses, strings } from './constants';\nvar INTERACTION_EVENTS = ['click', 'keydown'];\nvar MDCTextFieldIconFoundation = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTextFieldIconFoundation, _super);\n function MDCTextFieldIconFoundation(adapter) {\n var _this = _super.call(this, tslib_1.__assign({}, MDCTextFieldIconFoundation.defaultAdapter, adapter)) || this;\n _this.savedTabIndex_ = null;\n _this.interactionHandler_ = function (evt) { return _this.handleInteraction(evt); };\n return _this;\n }\n Object.defineProperty(MDCTextFieldIconFoundation, \"strings\", {\n get: function () {\n return strings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldIconFoundation, \"cssClasses\", {\n get: function () {\n return cssClasses;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextFieldIconFoundation, \"defaultAdapter\", {\n /**\n * See {@link MDCTextFieldIconAdapter} for typing information on parameters and return types.\n */\n get: function () {\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n getAttr: function () { return null; },\n setAttr: function () { return undefined; },\n removeAttr: function () { return undefined; },\n setContent: function () { return undefined; },\n registerInteractionHandler: function () { return undefined; },\n deregisterInteractionHandler: function () { return undefined; },\n notifyIconAction: function () { return undefined; },\n };\n // tslint:enable:object-literal-sort-keys\n },\n enumerable: true,\n configurable: true\n });\n MDCTextFieldIconFoundation.prototype.init = function () {\n var _this = this;\n this.savedTabIndex_ = this.adapter_.getAttr('tabindex');\n INTERACTION_EVENTS.forEach(function (evtType) {\n _this.adapter_.registerInteractionHandler(evtType, _this.interactionHandler_);\n });\n };\n MDCTextFieldIconFoundation.prototype.destroy = function () {\n var _this = this;\n INTERACTION_EVENTS.forEach(function (evtType) {\n _this.adapter_.deregisterInteractionHandler(evtType, _this.interactionHandler_);\n });\n };\n MDCTextFieldIconFoundation.prototype.setDisabled = function (disabled) {\n if (!this.savedTabIndex_) {\n return;\n }\n if (disabled) {\n this.adapter_.setAttr('tabindex', '-1');\n this.adapter_.removeAttr('role');\n }\n else {\n this.adapter_.setAttr('tabindex', this.savedTabIndex_);\n this.adapter_.setAttr('role', strings.ICON_ROLE);\n }\n };\n MDCTextFieldIconFoundation.prototype.setAriaLabel = function (label) {\n this.adapter_.setAttr('aria-label', label);\n };\n MDCTextFieldIconFoundation.prototype.setContent = function (content) {\n this.adapter_.setContent(content);\n };\n MDCTextFieldIconFoundation.prototype.handleInteraction = function (evt) {\n var isEnterKey = evt.key === 'Enter' || evt.keyCode === 13;\n if (evt.type === 'click' || isEnterKey) {\n this.adapter_.notifyIconAction();\n }\n };\n return MDCTextFieldIconFoundation;\n}(MDCFoundation));\nexport { MDCTextFieldIconFoundation };\n// tslint:disable-next-line:no-default-export Needed for backward compatibility with MDC Web v0.44.0 and earlier.\nexport default MDCTextFieldIconFoundation;\n//# sourceMappingURL=foundation.js.map","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { MDCTextFieldIconFoundation } from './foundation';\nvar MDCTextFieldIcon = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTextFieldIcon, _super);\n function MDCTextFieldIcon() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTextFieldIcon.attachTo = function (root) {\n return new MDCTextFieldIcon(root);\n };\n Object.defineProperty(MDCTextFieldIcon.prototype, \"foundation\", {\n get: function () {\n return this.foundation_;\n },\n enumerable: true,\n configurable: true\n });\n MDCTextFieldIcon.prototype.getDefaultFoundation = function () {\n var _this = this;\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = {\n getAttr: function (attr) { return _this.root_.getAttribute(attr); },\n setAttr: function (attr, value) { return _this.root_.setAttribute(attr, value); },\n removeAttr: function (attr) { return _this.root_.removeAttribute(attr); },\n setContent: function (content) {\n _this.root_.textContent = content;\n },\n registerInteractionHandler: function (evtType, handler) { return _this.listen(evtType, handler); },\n deregisterInteractionHandler: function (evtType, handler) { return _this.unlisten(evtType, handler); },\n notifyIconAction: function () { return _this.emit(MDCTextFieldIconFoundation.strings.ICON_EVENT, {} /* evtData */, true /* shouldBubble */); },\n };\n // tslint:enable:object-literal-sort-keys\n return new MDCTextFieldIconFoundation(adapter);\n };\n return MDCTextFieldIcon;\n}(MDCComponent));\nexport { MDCTextFieldIcon };\n//# sourceMappingURL=component.js.map","/**\n * @license\n * Copyright 2016 Google Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport * as tslib_1 from \"tslib\";\nimport { MDCComponent } from '@material/base/component';\nimport { applyPassive } from '@material/dom/events';\nimport * as ponyfill from '@material/dom/ponyfill';\nimport { MDCFloatingLabel } from '@material/floating-label/component';\nimport { MDCLineRipple } from '@material/line-ripple/component';\nimport { MDCNotchedOutline } from '@material/notched-outline/component';\nimport { MDCRipple } from '@material/ripple/component';\nimport { MDCRippleFoundation } from '@material/ripple/foundation';\nimport { MDCTextFieldCharacterCounter, } from './character-counter/component';\nimport { MDCTextFieldCharacterCounterFoundation } from './character-counter/foundation';\nimport { cssClasses, strings } from './constants';\nimport { MDCTextFieldFoundation } from './foundation';\nimport { MDCTextFieldHelperText, } from './helper-text/component';\nimport { MDCTextFieldHelperTextFoundation } from './helper-text/foundation';\nimport { MDCTextFieldIcon } from './icon/component';\nvar MDCTextField = /** @class */ (function (_super) {\n tslib_1.__extends(MDCTextField, _super);\n function MDCTextField() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n MDCTextField.attachTo = function (root) {\n return new MDCTextField(root);\n };\n MDCTextField.prototype.initialize = function (rippleFactory, lineRippleFactory, helperTextFactory, characterCounterFactory, iconFactory, labelFactory, outlineFactory) {\n if (rippleFactory === void 0) { rippleFactory = function (el, foundation) { return new MDCRipple(el, foundation); }; }\n if (lineRippleFactory === void 0) { lineRippleFactory = function (el) { return new MDCLineRipple(el); }; }\n if (helperTextFactory === void 0) { helperTextFactory = function (el) { return new MDCTextFieldHelperText(el); }; }\n if (characterCounterFactory === void 0) { characterCounterFactory = function (el) { return new MDCTextFieldCharacterCounter(el); }; }\n if (iconFactory === void 0) { iconFactory = function (el) { return new MDCTextFieldIcon(el); }; }\n if (labelFactory === void 0) { labelFactory = function (el) { return new MDCFloatingLabel(el); }; }\n if (outlineFactory === void 0) { outlineFactory = function (el) { return new MDCNotchedOutline(el); }; }\n this.input_ = this.root_.querySelector(strings.INPUT_SELECTOR);\n var labelElement = this.root_.querySelector(strings.LABEL_SELECTOR);\n this.label_ = labelElement ? labelFactory(labelElement) : null;\n var lineRippleElement = this.root_.querySelector(strings.LINE_RIPPLE_SELECTOR);\n this.lineRipple_ = lineRippleElement ? lineRippleFactory(lineRippleElement) : null;\n var outlineElement = this.root_.querySelector(strings.OUTLINE_SELECTOR);\n this.outline_ = outlineElement ? outlineFactory(outlineElement) : null;\n // Helper text\n var helperTextStrings = MDCTextFieldHelperTextFoundation.strings;\n var nextElementSibling = this.root_.nextElementSibling;\n var hasHelperLine = (nextElementSibling && nextElementSibling.classList.contains(cssClasses.HELPER_LINE));\n var helperTextEl = hasHelperLine && nextElementSibling && nextElementSibling.querySelector(helperTextStrings.ROOT_SELECTOR);\n this.helperText_ = helperTextEl ? helperTextFactory(helperTextEl) : null;\n // Character counter\n var characterCounterStrings = MDCTextFieldCharacterCounterFoundation.strings;\n var characterCounterEl = this.root_.querySelector(characterCounterStrings.ROOT_SELECTOR);\n // If character counter is not found in root element search in sibling element.\n if (!characterCounterEl && hasHelperLine && nextElementSibling) {\n characterCounterEl = nextElementSibling.querySelector(characterCounterStrings.ROOT_SELECTOR);\n }\n this.characterCounter_ = characterCounterEl ? characterCounterFactory(characterCounterEl) : null;\n this.leadingIcon_ = null;\n this.trailingIcon_ = null;\n var iconElements = this.root_.querySelectorAll(strings.ICON_SELECTOR);\n if (iconElements.length > 0) {\n if (iconElements.length > 1) { // Has both icons.\n this.leadingIcon_ = iconFactory(iconElements[0]);\n this.trailingIcon_ = iconFactory(iconElements[1]);\n }\n else {\n if (this.root_.classList.contains(cssClasses.WITH_LEADING_ICON)) {\n this.leadingIcon_ = iconFactory(iconElements[0]);\n }\n else {\n this.trailingIcon_ = iconFactory(iconElements[0]);\n }\n }\n }\n this.ripple = this.createRipple_(rippleFactory);\n };\n MDCTextField.prototype.destroy = function () {\n if (this.ripple) {\n this.ripple.destroy();\n }\n if (this.lineRipple_) {\n this.lineRipple_.destroy();\n }\n if (this.helperText_) {\n this.helperText_.destroy();\n }\n if (this.characterCounter_) {\n this.characterCounter_.destroy();\n }\n if (this.leadingIcon_) {\n this.leadingIcon_.destroy();\n }\n if (this.trailingIcon_) {\n this.trailingIcon_.destroy();\n }\n if (this.label_) {\n this.label_.destroy();\n }\n if (this.outline_) {\n this.outline_.destroy();\n }\n _super.prototype.destroy.call(this);\n };\n /**\n * Initializes the Text Field's internal state based on the environment's\n * state.\n */\n MDCTextField.prototype.initialSyncWithDOM = function () {\n this.disabled = this.input_.disabled;\n };\n Object.defineProperty(MDCTextField.prototype, \"value\", {\n get: function () {\n return this.foundation_.getValue();\n },\n /**\n * @param value The value to set on the input.\n */\n set: function (value) {\n this.foundation_.setValue(value);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"disabled\", {\n get: function () {\n return this.foundation_.isDisabled();\n },\n /**\n * @param disabled Sets the Text Field disabled or enabled.\n */\n set: function (disabled) {\n this.foundation_.setDisabled(disabled);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"valid\", {\n get: function () {\n return this.foundation_.isValid();\n },\n /**\n * @param valid Sets the Text Field valid or invalid.\n */\n set: function (valid) {\n this.foundation_.setValid(valid);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"required\", {\n get: function () {\n return this.input_.required;\n },\n /**\n * @param required Sets the Text Field to required.\n */\n set: function (required) {\n this.input_.required = required;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"pattern\", {\n get: function () {\n return this.input_.pattern;\n },\n /**\n * @param pattern Sets the input element's validation pattern.\n */\n set: function (pattern) {\n this.input_.pattern = pattern;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"minLength\", {\n get: function () {\n return this.input_.minLength;\n },\n /**\n * @param minLength Sets the input element's minLength.\n */\n set: function (minLength) {\n this.input_.minLength = minLength;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"maxLength\", {\n get: function () {\n return this.input_.maxLength;\n },\n /**\n * @param maxLength Sets the input element's maxLength.\n */\n set: function (maxLength) {\n // Chrome throws exception if maxLength is set to a value less than zero\n if (maxLength < 0) {\n this.input_.removeAttribute('maxLength');\n }\n else {\n this.input_.maxLength = maxLength;\n }\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"min\", {\n get: function () {\n return this.input_.min;\n },\n /**\n * @param min Sets the input element's min.\n */\n set: function (min) {\n this.input_.min = min;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"max\", {\n get: function () {\n return this.input_.max;\n },\n /**\n * @param max Sets the input element's max.\n */\n set: function (max) {\n this.input_.max = max;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"step\", {\n get: function () {\n return this.input_.step;\n },\n /**\n * @param step Sets the input element's step.\n */\n set: function (step) {\n this.input_.step = step;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"helperTextContent\", {\n /**\n * Sets the helper text element content.\n */\n set: function (content) {\n this.foundation_.setHelperTextContent(content);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"leadingIconAriaLabel\", {\n /**\n * Sets the aria label of the leading icon.\n */\n set: function (label) {\n this.foundation_.setLeadingIconAriaLabel(label);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"leadingIconContent\", {\n /**\n * Sets the text content of the leading icon.\n */\n set: function (content) {\n this.foundation_.setLeadingIconContent(content);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"trailingIconAriaLabel\", {\n /**\n * Sets the aria label of the trailing icon.\n */\n set: function (label) {\n this.foundation_.setTrailingIconAriaLabel(label);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"trailingIconContent\", {\n /**\n * Sets the text content of the trailing icon.\n */\n set: function (content) {\n this.foundation_.setTrailingIconContent(content);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MDCTextField.prototype, \"useNativeValidation\", {\n /**\n * Enables or disables the use of native validation. Use this for custom validation.\n * @param useNativeValidation Set this to false to ignore native input validation.\n */\n set: function (useNativeValidation) {\n this.foundation_.setUseNativeValidation(useNativeValidation);\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Focuses the input element.\n */\n MDCTextField.prototype.focus = function () {\n this.input_.focus();\n };\n /**\n * Recomputes the outline SVG path for the outline element.\n */\n MDCTextField.prototype.layout = function () {\n var openNotch = this.foundation_.shouldFloat;\n this.foundation_.notchOutline(openNotch);\n };\n MDCTextField.prototype.getDefaultFoundation = function () {\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = tslib_1.__assign({}, this.getRootAdapterMethods_(), this.getInputAdapterMethods_(), this.getLabelAdapterMethods_(), this.getLineRippleAdapterMethods_(), this.getOutlineAdapterMethods_());\n // tslint:enable:object-literal-sort-keys\n return new MDCTextFieldFoundation(adapter, this.getFoundationMap_());\n };\n MDCTextField.prototype.getRootAdapterMethods_ = function () {\n var _this = this;\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n addClass: function (className) { return _this.root_.classList.add(className); },\n removeClass: function (className) { return _this.root_.classList.remove(className); },\n hasClass: function (className) { return _this.root_.classList.contains(className); },\n registerTextFieldInteractionHandler: function (evtType, handler) { return _this.listen(evtType, handler); },\n deregisterTextFieldInteractionHandler: function (evtType, handler) { return _this.unlisten(evtType, handler); },\n registerValidationAttributeChangeHandler: function (handler) {\n var getAttributesList = function (mutationsList) {\n return mutationsList\n .map(function (mutation) { return mutation.attributeName; })\n .filter(function (attributeName) { return attributeName; });\n };\n var observer = new MutationObserver(function (mutationsList) { return handler(getAttributesList(mutationsList)); });\n var config = { attributes: true };\n observer.observe(_this.input_, config);\n return observer;\n },\n deregisterValidationAttributeChangeHandler: function (observer) { return observer.disconnect(); },\n };\n // tslint:enable:object-literal-sort-keys\n };\n MDCTextField.prototype.getInputAdapterMethods_ = function () {\n var _this = this;\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n return {\n getNativeInput: function () { return _this.input_; },\n isFocused: function () { return document.activeElement === _this.input_; },\n registerInputInteractionHandler: function (evtType, handler) {\n return _this.input_.addEventListener(evtType, handler, applyPassive());\n },\n deregisterInputInteractionHandler: function (evtType, handler) {\n return _this.input_.removeEventListener(evtType, handler, applyPassive());\n },\n };\n // tslint:enable:object-literal-sort-keys\n };\n MDCTextField.prototype.getLabelAdapterMethods_ = function () {\n var _this = this;\n return {\n floatLabel: function (shouldFloat) { return _this.label_ && _this.label_.float(shouldFloat); },\n getLabelWidth: function () { return _this.label_ ? _this.label_.getWidth() : 0; },\n hasLabel: function () { return Boolean(_this.label_); },\n shakeLabel: function (shouldShake) { return _this.label_ && _this.label_.shake(shouldShake); },\n };\n };\n MDCTextField.prototype.getLineRippleAdapterMethods_ = function () {\n var _this = this;\n return {\n activateLineRipple: function () {\n if (_this.lineRipple_) {\n _this.lineRipple_.activate();\n }\n },\n deactivateLineRipple: function () {\n if (_this.lineRipple_) {\n _this.lineRipple_.deactivate();\n }\n },\n setLineRippleTransformOrigin: function (normalizedX) {\n if (_this.lineRipple_) {\n _this.lineRipple_.setRippleCenter(normalizedX);\n }\n },\n };\n };\n MDCTextField.prototype.getOutlineAdapterMethods_ = function () {\n var _this = this;\n return {\n closeOutline: function () { return _this.outline_ && _this.outline_.closeNotch(); },\n hasOutline: function () { return Boolean(_this.outline_); },\n notchOutline: function (labelWidth) { return _this.outline_ && _this.outline_.notch(labelWidth); },\n };\n };\n /**\n * @return A map of all subcomponents to subfoundations.\n */\n MDCTextField.prototype.getFoundationMap_ = function () {\n return {\n characterCounter: this.characterCounter_ ? this.characterCounter_.foundation : undefined,\n helperText: this.helperText_ ? this.helperText_.foundation : undefined,\n leadingIcon: this.leadingIcon_ ? this.leadingIcon_.foundation : undefined,\n trailingIcon: this.trailingIcon_ ? this.trailingIcon_.foundation : undefined,\n };\n };\n MDCTextField.prototype.createRipple_ = function (rippleFactory) {\n var _this = this;\n var isTextArea = this.root_.classList.contains(cssClasses.TEXTAREA);\n var isOutlined = this.root_.classList.contains(cssClasses.OUTLINED);\n if (isTextArea || isOutlined) {\n return null;\n }\n // DO NOT INLINE this variable. For backward compatibility, foundations take a Partial<MDCFooAdapter>.\n // To ensure we don't accidentally omit any methods, we need a separate, strongly typed adapter variable.\n // tslint:disable:object-literal-sort-keys Methods should be in the same order as the adapter interface.\n var adapter = tslib_1.__assign({}, MDCRipple.createAdapter(this), { isSurfaceActive: function () { return ponyfill.matches(_this.input_, ':active'); }, registerInteractionHandler: function (evtType, handler) { return _this.input_.addEventListener(evtType, handler, applyPassive()); }, deregisterInteractionHandler: function (evtType, handler) {\n return _this.input_.removeEventListener(evtType, handler, applyPassive());\n } });\n // tslint:enable:object-literal-sort-keys\n return rippleFactory(this.root_, new MDCRippleFoundation(adapter));\n };\n return MDCTextField;\n}(MDCComponent));\nexport { MDCTextField };\n//# sourceMappingURL=component.js.map","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/assetOptionsView.html';\n\nimport {types as assetSetTypes} from '@netx/core-asset/properties/assetSets';\n\nexport default class AssetOptionsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'change [data-nx-control=\"original\"]': 'originalToggled',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.id = opts.id || 'asset-options-view';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tthis.type = opts.type;\n\t\tthis.tokenModel = opts.tokenModel;\n\t\tthis.filters = opts.filters || {};\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst stickyPref = Netx.getPreference('share.assetOptions.original');\n\t\tconst proxyOpts = this.filters.proxyOptions;\n\n\t\t// Check if any proxys are selected\n\t\tlet proxySelected = false;\n\t\tfor (let i = 0, c = proxyOpts.length; i < c; i++) {\n\t\t\tif (proxyOpts[i].get('selected')) {\n\t\t\t\tproxySelected = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Additional template vars\n\t\t_.extend(\n\t\t\tthis.templateVars,\n\t\t\t{\n\t\t\t\toriginalSticky: !proxySelected && stickyPref,\n\t\t\t\tisCategory: this.type === assetSetTypes.category,\n\t\t\t\tincludeSubFolders: this.tokenModel.get('includeSubFolders'),\n\t\t\t\tshareMessage: Netx.getPreference('share.message') || false,\n\t\t\t},\n\t\t\tthis.filters,\n\t\t);\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$originalOption = this.$('[data-nx-control=\"original\"]');\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e Change event\n\t * @fires module:share#share:asset:options:original:sticky\n\t */\n\toriginalToggled(e) {\n\t\tdispatcher.trigger(\n\t\t\t'share:asset:options:original:sticky',\n\t\t\tthis.$originalOption.is(':checked'),\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'AssetOptionsView';\n\t}\n}\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-share/views/assetOptionsView';\nimport MaterialCheckboxes from '@netx/core/functionality/materialCheckboxes';\nexport default class AssetOptionsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'keydown .checkbox label': 'labelKeyed',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\tsuper(opts);\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `keydown` event\n\t * on enter/space\n\t * just click the label\n\t *\n\t * todo: refactor with react\n\t * please ditch fancy checkboxes\n\t */\n\tlabelKeyed(e) {\n\t\tconst code = e.which;\n\t\t// space or enter\n\t\tif (code === 13 || code === 32) {\n\t\t\t$(e.currentTarget).click();\n\t\t}\n\t}\n}\nMaterialCheckboxes(AssetOptionsView);\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/createPDFTemplateItemView.html';\n\nimport {contactSheet as pdfDownloadOption} from '../properties/downloadOptions';\n\nexport default class CreatePDFTemplateItemView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\tthis.contactSheet = opts.contactSheet;\n\n\t\t// Hey, listen!\n\t\tthis.listenTo(\n\t\t\tthis.contactSheet,\n\t\t\t'change:engine',\n\t\t\t_.debounce(this.render, 50),\n\t\t);\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst contactSheet = this.contactSheet;\n\t\tconst model = this.model;\n\n\t\tconst selected = contactSheet.get('name');\n\t\tconst name = model.get('name');\n\n\t\tlet maxAttributes;\n\t\t// Logic goes here for hard coding the amount of attributes per template - should we be using default templates\n\t\tif (contactSheet.get('engine') === pdfDownloadOption.defaultEngine) {\n\t\t\tconst defaultTemplate = pdfDownloadOption.defaultTemplates[name];\n\t\t\tif (defaultTemplate) {\n\t\t\t\tmaxAttributes = defaultTemplate.maxAttributes;\n\t\t\t}\n\t\t}\n\n\t\t// Additional template vars\n\t\t_.extend(this.templateVars, {\n\t\t\tselected:\n\t\t\t\tselected === name ||\n\t\t\t\t(!selected && model.collection.indexOf(model) === 0),\n\t\t\tuniqueIdentifier: _.uniqueId(`${_.toCamelCase(name)}-`),\n\t\t\tmaxAttributes: maxAttributes,\n\t\t});\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CreatePDFTemplateItemView';\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core-share/views/createPDFTemplateItemView';\n\nexport default class CreatePDFTemplateItemView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'click label': 'labelClicked',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\tsuper(opts);\n\t}\n\n\t/**\n\t * IE11 doesn't like images in labels\n\t * @method\n\t */\n\tlabelClicked() {\n\t\tif (!Modernizr.smil) {\n\t\t\tthis.$('input').click();\n\t\t}\n\t}\n}\n","/**\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/createPDFTemplateItemsView.html';\n\nimport ChildView from './createPDFTemplateItemView';\nimport ChildViews from '@netx/core/functionality/childViews';\n\nexport default class CreatePDFTemplateItemsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.childView = _.extend(\n\t\t\t{\n\t\t\t\tviewClass: ChildView,\n\t\t\t\toptions: {\n\t\t\t\t\tcontactSheet: opts.model,\n\t\t\t\t},\n\t\t\t},\n\t\t\topts.childView,\n\t\t);\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CreatePDFTemplateItemsView';\n\t}\n}\n\n// Functionality\nChildViews(CreatePDFTemplateItemsView);\n","/**\n * CreatePDFOptionsView\n * This view cannot stand alone - it is part of Netx.Views.DownloadOptionsView\n * @class\n * @todo this view has a lot of the same logic as {module:share/views/exportMetadataView#updateSet}\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/createPDFOptionsView.html';\n\nimport AssetAttributesSelectReactView from '@netx/core-asset/views/assetAttributesSelectReactView';\nimport CreatePDFTemplateItemsView from './createPDFTemplateItemsView';\n\nimport {contactSheet} from '../properties/downloadOptions';\n\n// Resize listener\nimport 'core-libs/jquery.resize';\n\nexport default class CreatePDFOptionsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\t// Show an attribute set menu in metadata mode:\n\t\topts.collection = opts.collection || Netx.asset.attributeSets;\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'change [data-nx-control=\"toggle-pdf-options\"] input':\n\t\t\t\t\t'togglePDFOptions',\n\t\t\t\t'change [data-nx-control=\"maxLength\"]': 'changeAttributeSetMaxLength',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.id = opts.id || 'create-pdf-options-view';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t// Make a copy of the attributes collection\n\t\t// assetAttrs = Netx.getAttributesByObjectType('asset').clone();\n\t\tconst attributeIds = this.model.get('attributeIds') || [];\n\n\t\tthis.assetAttributes = opts.assetAttributes || Netx.asset.attributes;\n\t\tthis.defaultTitle = opts.defaultTitle != null ? opts.defaultTitle : '';\n\n\t\t// Take asset attributes and clone so that they can be used in a set list view\n\t\tconst assetAttrs = this.assetAttributes.clone();\n\n\t\t/**\n\t\t * @memberOf Netx.Views.ExportMetadataView\n\t\t * @alias selectedAttrSet\n\t\t * @type {Netx.Models.AttributeSet}\n\t\t */\n\t\tthis.selectedAttrSet = this.selectedAttrSet || this.collection.get('all');\n\n\t\t// Create our set list view - it takes something that can not be passed in data-nx-view code\n\t\tthis.setListView = this.addSubView(\n\t\t\tnew AssetAttributesSelectReactView({\n\t\t\t\tcollection: assetAttrs,\n\t\t\t\twithSetSelection: true,\n\t\t\t\tmax: 10,\n\t\t\t\tchildCollection: new assetAttrs.constructor(\n\t\t\t\t\tattributeIds.length > 0\n\t\t\t\t\t\t? assetAttrs.filter((attr) => attributeIds.indexOf(attr.id) > -1)\n\t\t\t\t\t\t: [],\n\t\t\t\t),\n\t\t\t}),\n\t\t);\n\n\t\t// PDF Template selection view\n\t\tthis.templateListView = this.addSubView(\n\t\t\tnew CreatePDFTemplateItemsView({\n\t\t\t\tcollection: this.model.get('templates'),\n\t\t\t\tmodel: this.model,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** @override **/\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\n\t\tconst opts = model.get('options') || {};\n\t\tconst titleOb = _.findWhere(opts, {label: 'title'}) || {};\n\t\tconst templateName = model.get('name');\n\t\tconst usingDefaultTemplates =\n\t\t\tmodel.get('engine') === contactSheet.defaultEngine;\n\n\t\t// Additional template vars\n\t\t_.extend(this.templateVars, {\n\t\t\texportOptions: model.get('exportOptions'),\n\t\t\tcontactSheetName: titleOb.value || this.defaultTitle,\n\t\t\tisSelected: model.get('name').length > 0,\n\t\t\tusingDefaultTemplates: usingDefaultTemplates,\n\t\t\tshareMessage: Netx.getPreference('share.message') || false,\n\t\t\ttemplateName,\n\t\t\twithSetSelection: true,\n\t\t});\n\t}\n\n\t/** @override **/\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$setListView = this.$('.nx-setListView');\n\t\tthis.$templateListView = this.$('[data-nx-control=\"templateListView\"]');\n\t\tthis.$toggleContainer = this.$('[data-nx-control=\"toggle-pdf-options\"]');\n\t\tthis.$toggle = this.$('[name=\"type-contact-sheet\"]');\n\t\tthis.$pdfOptions = this.$('[data-nx-control=\"pdf-options\"]');\n\n\t\t// Inject this.setListView\n\t\tthis.setListView.setElement(this.$setListView).render();\n\n\t\t// Inject this.templateListView\n\t\tthis.templateListView.setElement(this.$templateListView).render();\n\n\t\t// Cache after templates list has rendered\n\t\tthis.$maxLength = this.$('[data-nx-control=\"maxLength\"]');\n\n\t\tconst opts = this.model.get('options') || [];\n\t\tif (opts.length) {\n\t\t\t// this sets the checkbox for contact sheet display labels\n\t\t\tconst displayLabels = _.findWhere(opts, {label: 'displayLabels'}) || {};\n\t\t\tif (displayLabels?.value === 'true') {\n\t\t\t\tthis.$el\n\t\t\t\t\t.find('#download-option-contact-sheet-display-labels')\n\t\t\t\t\t.prop('checked', true);\n\t\t\t}\n\n\t\t\tconst highRes = _.findWhere(opts, {label: 'highRes'}) || {};\n\t\t\tif (highRes?.value === 'true') {\n\t\t\t\tthis.$el\n\t\t\t\t\t.find('#download-option-contact-sheet-high-res')\n\t\t\t\t\t.prop('checked', true);\n\t\t\t}\n\t\t}\n\t\t// If we are the only model - no need for a toggle, pdfOptions are just on\n\t\tif (this.model.collection && this.model.collection.length == 1) {\n\t\t\t// Hide toggle\n\t\t\tthis.$toggleContainer.hide();\n\t\t\t// Select PDF mode in the form (this will trigger this.togglePDFOptions)\n\t\t\tthis.$toggle.prop('checked', true).trigger('change');\n\t\t}\n\n\t\tthis.Plugins.Initialize('resizeListener', this.$el);\n\t}\n\n\t/** @override **/\n\tbindModelEvents() {\n\t\tsuper.bindModelEvents();\n\n\t\treturn this.listenTo(\n\t\t\tthis.model.get('exportOptions'),\n\t\t\t'add remove reset',\n\t\t\tthis.debouncedRender,\n\t\t)\n\t\t\t.listenTo(\n\t\t\t\tthis.model.get('templates'),\n\t\t\t\t'add remove reset',\n\t\t\t\tthis.debouncedRender,\n\t\t\t)\n\t\t\t.listenTo(this.model, 'change:engine', this.debouncedRender);\n\t}\n\n\t/**\n\t * Whenever we make a new selection (with default templates) we must update the max selectable attributes amount\n\t * @method\n\t * @param {event} e Change event\n\t */\n\tchangeAttributeSetMaxLength(e) {\n\t\tthis.setListView.updateMax(parseInt($(e.target).nxVal()));\n\t}\n\n\t/**\n\t * Retrieve selected attribute ids\n\t * @method\n\t * @return number[]\n\t */\n\tgetSelectedAttributes() {\n\t\treturn this.setListView.getSelected();\n\t}\n\n\t/**\n\t * We want to limit the selection area to the height of this view\n\t * so the add button is always within view when modifying selection\n\t * @method\n\t */\n\tresize() {\n\t\tthis.$setListView?.css('max-height', this.$el.height() - 40);\n\t}\n\n\t/**\n\t * We hide/show the PDF options fieldset of the form, [data-nx-control=\"pdf-options\"], by the state of the checkbox\n\t * @method\n\t * @param {event} e Change event\n\t */\n\ttogglePDFOptions(e) {\n\t\tif (this.$toggle.is(':checked')) {\n\t\t\tthis.$pdfOptions.show();\n\t\t\t// DAM-5828\n\t\t\t// So our maxlength is up to date\n\t\t\tthis.$maxLength.filter(':checked').trigger('change');\n\t\t} else {\n\t\t\tthis.$pdfOptions.hide();\n\t\t}\n\t}\n\n\t/** @override **/\n\tunbindModelEvents() {\n\t\tsuper.unbindModelEvents();\n\n\t\treturn this.stopListening(this.model.get('exportOptions')).stopListening(\n\t\t\tthis.model.get('templates'),\n\t\t);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'CreatePDFOptionsView';\n\t}\n}\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-share/views/createPDFOptionsView';\n\nimport MaterialCheckboxes from '@netx/core/functionality/materialCheckboxes';\nimport MaterialTextFields from '@netx/core/functionality/materialTextFields';\n\nimport Selectpicker from '@netx/core/functionality/selectpicker';\n\nexport default class createPDFOptionsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'keydown label[tabindex=\"0\"]': 'labelKeyed',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\tsuper(opts);\n\t\tthis.setListView.withSetSelection = false;\n\t}\n\n\t/**\n\t * @method\n\t * @param {event} e `keydown` event\n\t * on enter/space\n\t * just click the label\n\t *\n\t * todo: refactor with react\n\t * please ditch fancy checkboxes\n\t */\n\tlabelKeyed(e) {\n\t\tconst code = e.which;\n\t\t// space or enter\n\t\tif (code === 13 || code === 32) {\n\t\t\t$(e.currentTarget).click();\n\t\t}\n\t}\n}\nMaterialCheckboxes(createPDFOptionsView);\nMaterialTextFields(createPDFOptionsView);\nSelectpicker(createPDFOptionsView);\n","/**\n * ExportMetadataView manages the selection of some attributes for export.\n * it uses a setListView to handle the attr-by-attr stuff, but if metadata manager\n * is enable it also provides an attributeSet menu, and then mediates between those\n * two ways of selecting.\n *\n * @class\n */\nimport Base from '@netx/core/lib/netx-view';\nimport Template from '../templates/exportMetadataView.html';\n\nimport {assetAttributes as assetAttributesSingleton} from '@netx/core-asset/collections/singleton/attributes';\n\nimport AssetAttributeSetSelectionView from '@netx/core-asset/views/assetAttributeSetSelectionView';\nimport AttributesCollection from '@netx/core-asset/collections/attributes';\nimport AssetAttributesSelectReactView from '@netx/core-asset/views/assetAttributesSelectReactView';\n\nexport default class ExportMetadataView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\t// Show an attribute set menu in metadata mode:\n\t\topts.collection = opts.collection || Netx.asset.attributeSets;\n\t\topts.events = _.extend(\n\t\t\t{\n\t\t\t\t'change .nx-toggle-metadata-options input': 'toggleAttributeOptions',\n\t\t\t\t'change .nx-toggle-embed-metadata input': 'toggleEmbedOptions',\n\t\t\t},\n\t\t\topts.events,\n\t\t);\n\t\topts.id = opts.id || 'export-metadata-view';\n\t\topts.template = opts.template || Template;\n\t\tsuper(opts);\n\n\t\t/**\n\t\t * @memberOf Netx.Views.ExportMetadataView\n\t\t * @alias assetAttributes\n\t\t * @type {module:asset/collections/attributes}\n\t\t */\n\t\tthis.assetAttributes = opts.assetAttributes || assetAttributesSingleton;\n\n\t\tthis.displayedDownloadOptionTypes = opts.displayedDownloadOptionTypes || [];\n\n\t\t/**\n\t\t * @memberOf Netx.Views.ExportMetadataView\n\t\t * @alias metadataMaps\n\t\t * @type {Netx.Collections.MetadataMaps}\n\t\t */\n\t\tthis.metadataMaps = opts.metadataMaps || Netx.asset.metadataMaps;\n\n\t\t// Show embed UI if user has the permission and there is at least one map defined:\n\t\tthis.embedAvailable =\n\t\t\tNetx.getPreference('share.metadata.enabled', true) &&\n\t\t\tNetx.getPreference('share.metadata.userLevel') <= Netx.getUserLevel();\n\t\t// Automatically select the default embed map if a default has been set:\n\t\tthis.embedSelected =\n\t\t\tthis.embedAvailable && Netx.getPreference('share.metadata.defaultMap');\n\n\t\t// Take asset attributes and clone so that they can be used in a set list view\n\t\tconst assetAttrs = this.assetAttributes.clone();\n\n\t\tlet selectedAttributes = [];\n\t\tif (this.model) {\n\t\t\tconst attributeIds = this.model.get('attributeIds') || [];\n\t\t\tselectedAttributes = attributeIds\n\t\t\t\t.map((id) => assetAttrs.get(id))\n\t\t\t\t.filter((attr) => attr != null);\n\t\t}\n\n\t\t/**\n\t\t * @memberof module:share/views/exportMetadataView\n\t\t * @alias selectedAttributes\n\t\t * @type {module:asset/collections/attributes}\n\t\t */\n\t\tthis.selectedAttributes = new AttributesCollection(selectedAttributes, {\n\t\t\tcomparator: null,\n\t\t});\n\n\t\t/**\n\t\t * @memberOf Netx.Views.ExportMetadataView\n\t\t * @alias selectedAttrSet\n\t\t * @type {Netx.Models.AttributeSet}\n\t\t */\n\t\tthis.selectedAttrSet =\n\t\t\topts.selectedAttrSet ||\n\t\t\tthis.selectedAttributes.length === this.assetAttributes.length\n\t\t\t\t? this.collection.get('all')\n\t\t\t\t: null;\n\n\t\t/**\n\t\t * Create our set list view - it takes something that can not be passed in data-nx-view code\n\t\t * @memberOf Netx.Views.ExportMetadataView\n\t\t * @alias setListView\n\t\t * @type {module:@netx/core-asset/views/assetAttributesSelectReactView}\n\t\t */\n\t\tthis.setListView = this.addSubView(\n\t\t\tnew AssetAttributesSelectReactView({\n\t\t\t\tcollection: assetAttrs,\n\t\t\t\tchildCollection: this.selectedAttributes,\n\t\t\t\tonChange: this.handleAttributeSelectionChange.bind(this),\n\t\t\t\twithSetSelection: true,\n\t\t\t}),\n\t\t);\n\n\t\t// TODO: This is a bandaid to get embed to enable - we need to rethink this whole setup of checking for derivatives selected and all that\n\t\t// Prior to this we did not support manual repurpose in this workflow\n\t\tthis.hasManualRepurpose = this.model.collection.hasManualRepurposeOptions();\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\tconst model = this.model;\n\n\t\t// Cleanup\n\t\tthis.$derivativesSelected &&\n\t\t\tthis.$derivativesSelected.off('change.exportMetadataView');\n\n\t\tconst historicalAvailable = model.collection.hasOption('historical');\n\t\tconst metadataMaps = this.metadataMaps.toJSON();\n\n\t\t// is this an \"Export attributes\" action\n\t\tconst onlyExportAttributes =\n\t\t\tthis.displayedDownloadOptionTypes.length === 1 &&\n\t\t\tthis.displayedDownloadOptionTypes[0] === 'metadata';\n\n\t\t// Additional template vars\n\t\t_.extend(this.templateVars, {\n\t\t\texportSelected:\n\t\t\t\tmodel.get('attributeIds').length > 0 || onlyExportAttributes, // replacement with meaningful name.\n\t\t\tembedSelected: this.embedSelected,\n\t\t\t// Only show toggle if we have matadata to embed or the user is an admin\n\t\t\tembedAvailable:\n\t\t\t\tthis.embedAvailable &&\n\t\t\t\t(metadataMaps.length || Netx.getUserLevel() === 9) &&\n\t\t\t\t!onlyExportAttributes,\n\t\t\t// Deprecate?\n\t\t\tderivativesSelected: this.derivativesSelected(),\n\t\t\thistoricalAvailable: historicalAvailable,\n\t\t\tmetadataMaps: metadataMaps,\n\t\t\tshareMessage: Netx.getPreference('share.message') || false,\n\t\t});\n\t}\n\n\t/** @override */\n\tpostRender() {\n\t\tsuper.postRender();\n\n\t\t// Cache\n\t\tthis.$attributeCheckbox = this.$('.nx-download-metadata');\n\t\tthis.$attributeSets = this.$('.nx-attribute-sets-selection');\n\t\tthis.$embedCheckbox = this.$('.nx-embed-metadata');\n\t\tthis.$attributeOptions = this.$('.nx-metadata-options');\n\t\tthis.$embedOptions = this.$('.nx-embed-options');\n\n\t\t// HACK:\n\t\t// One of our form fields needs to be toggled by a field in another tab, in a different view.\n\t\t// And this view doesn't always even exist when that field in that view is changed.\n\t\t//\n\t\t// The backbone-correct way to do this ... maybe have the parent tab-view do some complicated logic,\n\t\t// where it first checks that this tab exists, then calls some method in this view ... while\n\t\t// also making sure that the other tab passes along a change event ...\n\t\t//\n\t\t// The simpler solution is for this view to overstep its bounds a little bit & test the state of a\n\t\t// form field outside of this.el. It's still within the current form. This solution depends\n\t\t// very little on the behavior of the other views or their templates. We only need to know the field name.\n\t\tthis.$derivativesSelected = this.$el\n\t\t\t.closest('form')\n\t\t\t.find('#asset-options-view input');\n\n\t\t// However, we can't use the standard .events approach to set up a listener, so we must do it manually.\n\t\tthis.$derivativesSelected.on(\n\t\t\t'change.exportMetadataView',\n\t\t\t_.bind(this.toggleEmbedAllowed, this),\n\t\t);\n\n\t\t// Inject this.setListView\n\t\tthis.$('.nx-setListView').append(this.setListView.render().$el);\n\t\tthis.$setListPanel = this.$('.nx-setListView-panel');\n\n\t\t// Show/hide the attribute export options\n\t\tthis.toggleAttributeOptions();\n\t\tthis.toggleEmbedOptions();\n\t\tthis.toggleEmbedAllowed();\n\n\t\tthis.Plugins.Initialize('resizeListener', this.$el);\n\t}\n\n\t/** @override */\n\tremove() {\n\t\t// Cleanup\n\t\tthis.$derivativesSelected &&\n\t\t\tthis.$derivativesSelected.off('change.exportMetadataView');\n\n\t\tsuper.remove();\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean}\n\t */\n\tderivativesSelected() {\n\t\treturn (\n\t\t\tthis.$derivativesSelected && this.$derivativesSelected.is(':checked')\n\t\t);\n\t}\n\n\t/**\n\t * Retrieve selected attribute ids\n\t * @method\n\t * @return number[]\n\t */\n\tgetSelectedAttributes() {\n\t\treturn this.setListView.getSelected();\n\t}\n\n\t/**\n\t * @method\n\t * @param {number[]} selectedIds Selected attribute ids\n\t * @param {boolean} changed Changed\n\t */\n\thandleAttributeSelectionChange(selectedIds, changed) {\n\t\tthis.$el.trigger('nx-selection-change');\n\t}\n\n\t/**\n\t * We want to limit the selection area to the height of this view\n\t * so the add button is always within view when modifying selection\n\t * @method\n\t */\n\tresize() {\n\t\tthis.$setListPanel?.css(\n\t\t\t'max-height',\n\t\t\tMath.max(this.$el.height() - 40, 450),\n\t\t);\n\t}\n\n\t/**\n\t * @method\n\t * @return {boolean}\n\t */\n\tsubmitReady() {\n\t\tlet submitReady = true;\n\t\t// We must have some attributes selected if we have not selected a specific set\n\t\tif (this.$attributeCheckbox && this.$attributeCheckbox.is(':checked')) {\n\t\t\tsubmitReady = !!this.getSelectedAttributes().length;\n\t\t}\n\t\treturn submitReady;\n\t}\n\n\t/**\n\t * Show/hide the export-metadata fieldset of the form by the state of its checkbox\n\t * @method\n\t * @param {event} e Change event\n\t */\n\ttoggleAttributeOptions(e) {\n\t\tthis.$attributeOptions &&\n\t\t\tthis.$attributeOptions.toggle(this.$attributeCheckbox.is(':checked'));\n\t}\n\n\t/**\n\t * Show/hide the embed-metadata fieldset of the form by the state of its checkbox\n\t * @method\n\t * @param {event} e Change event\n\t */\n\ttoggleEmbedOptions(e) {\n\t\tthis.$embedOptions &&\n\t\t\tthis.$embedOptions.toggle(this.$embedCheckbox.is(':checked'));\n\t}\n\n\t/**\n\t * Show/hide the embed-metadata fieldset of the form by the state of its checkbox\n\t * @method\n\t * @param {event} e Change event\n\t */\n\ttoggleEmbedAllowed(e) {\n\t\tconst userPrefs = Netx.user.prefs;\n\t\t// See note in intialize\n\t\tif (this.derivativesSelected() || this.hasManualRepurpose) {\n\t\t\tthis.$embedCheckbox.enable();\n\t\t\tif (\n\t\t\t\tuserPrefs.isTrue('share.metadata.enabled') &&\n\t\t\t\tuserPrefs.getPreference('share.metadata.defaultMap')\n\t\t\t) {\n\t\t\t\tthis.$embedCheckbox.prop('checked', true);\n\t\t\t\tthis.$embedOptions.show();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.$embedCheckbox.disable().prop('checked', false);\n\t\t\tthis.$embedOptions.hide();\n\t\t}\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'ExportMetadataView';\n\t}\n}\n","/**\n * @class\n * @override\n */\nimport Base from '@netx/core-share/views/exportMetadataView';\n\nimport MaterialCheckboxes from '@netx/core/functionality/materialCheckboxes';\nimport Selectpicker from '@netx/core/functionality/selectpicker';\n\nexport default class exportMetadataView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\tsuper(opts);\n\t\tthis.setListView.withSetSelection = false;\n\t}\n}\n\nMaterialCheckboxes(Base);\nSelectpicker(Base);\n","/**\n * Download options form\n * @class\n */\nimport Base from '@netx/core/lib/netx-tabView';\nimport Template from '../templates/downloadOptionsView.html';\n\nimport Form from '@netx/core/functionality/form';\n\nimport AssetOptionsView from './assetOptionsView';\nimport CreatePDFOptionsView from './createPDFOptionsView';\nimport ExportMetadataView from './exportMetadataView';\n\nimport {organizeByTypes} from '@netx/core-asset/properties/assetSets';\nimport {\n\tcontactSheet,\n\ttypes as downloadOptionTypes,\n} from '../properties/downloadOptions';\n\nexport default class DownloadOptionsView extends Base {\n\t/** @override */\n\tconstructor(opts = {}) {\n\t\topts.events = {\n\t\t\t'nx-selection-change'() {\n\t\t\t\tthis.checkForm();\n\t\t\t},\n\t\t\t...opts.events,\n\t\t};\n\t\topts.eventStr = opts.eventStr || 'share:assetSet:options';\n\t\topts.headerTitle = opts.headerTitle || i18n.t('i18n.downloadOptions');\n\t\topts.hideOnSubmit = opts.hideOnSubmit !== false;\n\t\topts.id = opts.id || 'download-options-view';\n\t\topts.removeOnHide = opts.removeOnHide !== false;\n\t\topts.requiresChanges = opts.requiresChanges === true;\n\t\topts.template = opts.template || Template;\n\n\t\t// DAM-16015 - Download options needs default form fields rendered when available\n\t\topts.instantiateOnAdd = true;\n\t\topts.renderOnInstatiate = true;\n\n\t\tsuper(opts);\n\n\t\tthis.args = opts.args;\n\t\tthis.tokenModel = opts.args[0];\n\t\tthis.assetSet = opts.assetSet;\n\t\tthis.submitLabel = opts.submitLabel;\n\n\t\t// Listen for any changes our underlying tabs want to notify us about\n\t\tthis.listenTo(this.viewCollection, 'view:nx:changed', (view) => {\n\t\t\tthis.checkForm();\n\t\t});\n\t}\n\n\t/** @override */\n\tpreRender() {\n\t\tsuper.preRender();\n\n\t\t// Filter down tabs and modify templateVars if needed\n\t\tif (this.collection.length === 1) {\n\t\t\tswitch (this.collection.at(0).get('type')) {\n\t\t\t\t// Create PDF only\n\t\t\t\tcase downloadOptionTypes.contactSheet:\n\t\t\t\t\t// Update title\n\t\t\t\t\tthis.headerTitle = i18n.t('i18n.createPDF');\n\t\t\t\t\t// Update submit label\n\t\t\t\t\tthis.templateVars.submitLabel = i18n.t('i18n.create');\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Additonal tmeplate vars\n\t\t_.extend(this.templateVars, {\n\t\t\toptionCount: this.collection.length,\n\t\t\tsubmitLabel: this.submitLabel || i18n.t('i18n.download'),\n\t\t});\n\t}\n\n\t/**\n\t * @override\n\t * @returns {array} Tabs\n\t */\n\ttabs() {\n\t\tconst collection = this.collection;\n\t\tconst original = collection.findWhere({type: 'original'});\n\t\tconst proxy = collection.findWhere({type: 'proxy'});\n\t\tconst presetProcess = collection.findWhere({type: 'presetProcess'});\n\t\tconst contactSheetModel = collection.findWhere({type: 'contactSheet'});\n\t\tconst metadataModel = collection.findWhere({type: 'metadata'});\n\t\tconst tabs = [];\n\n\t\tif (original || proxy || presetProcess) {\n\t\t\tthis.defaultTab = 'assetOptions';\n\t\t\ttabs.push({\n\t\t\t\tviewClass: AssetOptionsView,\n\t\t\t\tlabel: i18n.t('i18n.assetOptions'),\n\t\t\t\tname: 'assetOptions',\n\t\t\t\tviewOptions: {\n\t\t\t\t\tfilters: collection.filterTypes(),\n\t\t\t\t\t// Attaching tokenModel so we can check if we are editing options on an existing model and prevent toggling original\n\t\t\t\t\ttokenModel: this.tokenModel,\n\t\t\t\t\t// passing in assetSet type so we can give a recursive option for categories\n\t\t\t\t\ttype: this.assetSet.get('type'),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\t// Ensure that contact sheet exists before creating tab\n\t\tif (contactSheetModel) {\n\t\t\t// If up to this point we have not defined any tabs - this is our default\n\t\t\tif (!tabs.length) {\n\t\t\t\tthis.defaultTab = 'pdf';\n\t\t\t}\n\t\t\ttabs.push({\n\t\t\t\tviewClass: CreatePDFOptionsView,\n\t\t\t\tlabel: i18n.t('i18n.pdf'),\n\t\t\t\tname: 'pdf',\n\t\t\t\tviewOptions: {\n\t\t\t\t\tdefaultTitle: this.tokenModel.get('title'),\n\t\t\t\t\tmodel: contactSheetModel,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tif (Netx.getUserLevel() >= 2 && metadataModel) {\n\t\t\t// If up to this point we have not defined any tabs - this is our default\n\t\t\tif (!tabs.length) {\n\t\t\t\tthis.defaultTab = 'attributeInfo';\n\t\t\t}\n\t\t\ttabs.push({\n\t\t\t\tviewClass: ExportMetadataView,\n\t\t\t\tlabel: i18n.t('i18n.attributeInfo'),\n\t\t\t\tname: 'attributeInfo',\n\t\t\t\tviewOptions: {\n\t\t\t\t\tmodel: metadataModel,\n\t\t\t\t\tdisplayedDownloadOptionTypes: this.assetSet\n\t\t\t\t\t\t.displayedDownloadOptionTypes,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn tabs;\n\t}\n\n\t/**\n\t * Organize the form output more handily for the controller.\n\t * @override\n\t * @returns {object}\n\t */\n\tformValues() {\n\t\tconst results = super.formValues();\n\n\t\t// Formatted values to return\n\t\tconst formatted = {\n\t\t\tcontactSheet: false,\n\t\t\tmetadata: false,\n\t\t\toriginal: false,\n\t\t\tembedMetadata: undefined, // ID of a metadata map for embedding metadata in the download\n\t\t\tprocesses: [],\n\t\t\tproxies: [],\n\t\t\trecursive: false,\n\t\t\tviews: [],\n\t\t};\n\n\t\t//\n\t\t// Utility function to parse multiselect & multiple checkbox form inputs.\n\t\t//\n\t\tconst formatTypeOptions = (type, types, val, name) => {\n\t\t\t// views are listed by name, sometimes the names are the same, cid appended, removing it here\n\t\t\tval = val.split('-cidc')[0];\n\n\t\t\t// If the form element is a multi-select with a single name and many values\n\t\t\t// Replace quotes and split on commas pushing the result into the appropriate array (views[], proxies[])\n\t\t\tif (name === `type-${type}`) {\n\t\t\t\t!formatted[types].includes(val) && formatted[types].push(val);\n\t\t\t}\n\t\t\t// Else if the form is a checkbox with mutliple names and values\n\t\t\t// Push the values into the appropriate array (views[], proxies[])\n\t\t\telse {\n\t\t\t\tconst ex = new RegExp(`type-${type}-(.+)$`);\n\t\t\t\tname = name.match(ex);\n\t\t\t\tif (name[1]) {\n\t\t\t\t\tformatted[types].push(name[1]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t_.each(results, (val, name) => {\n\t\t\tif (!val) return;\n\n\t\t\tif (name.includes('type-process')) {\n\t\t\t\tval &&\n\t\t\t\t\tformatTypeOptions(\n\t\t\t\t\t\t'process',\n\t\t\t\t\t\t'processes',\n\t\t\t\t\t\tname.replace('type-process-', ''),\n\t\t\t\t\t\t'type-process',\n\t\t\t\t\t);\n\t\t\t} else if (name.includes('type-view')) {\n\t\t\t\tval &&\n\t\t\t\t\tformatTypeOptions(\n\t\t\t\t\t\t'view',\n\t\t\t\t\t\t'views',\n\t\t\t\t\t\tname.replace('type-view-', ''),\n\t\t\t\t\t\t'type-view',\n\t\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tswitch (name) {\n\t\t\t\t\tcase 'recursive':\n\t\t\t\t\t\tformatted.recursive = val;\n\t\t\t\t\t\t// DAM-14019\n\t\t\t\t\t\tif (formatted.recursive) {\n\t\t\t\t\t\t\tformatted.organizeContentsBy = organizeByTypes.folderPath.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'organizeContentsBy':\n\t\t\t\t\t\tformatted.organizeContentsBy = Number(val);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'embed-metadata-map':\n\t\t\t\t\t\tif (val && results['embed-metadata']) {\n\t\t\t\t\t\t\tformatted.embedMetadata = val;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'type-historical':\n\t\t\t\t\t\tif (val && results['type-historical']) {\n\t\t\t\t\t\t\tformatted.historical = val;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'type-original':\n\t\t\t\t\t\tformatted.original = results['type-original'];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'type-proxy-thumb':\n\t\t\t\t\t\tformatted.proxies.push('thumb');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'type-proxy-preview':\n\t\t\t\t\t\tformatted.proxies.push('preview');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t// TODO: when the formView parsing stuff gets merged we can name our inputs like so:\n\t\t\t\t\t// Then our names match our attributes and we would get back an object in our formValues of { ..., contactSheet: { highRes: true } }\n\t\t\t\t\t// We could also probably rework the input names and do away with the formatTypeOptions above and have whate we need for views and processes\n\t\t\t\t\t// contactSheet[displayLabels]\n\t\t\t\t\t// contactSheet[highRes]\n\t\t\t\t\t// etc\n\t\t\t\t\tcase 'type-contact-sheet':\n\t\t\t\t\t\tif (results['type-contact-sheet']) {\n\t\t\t\t\t\t\tconst contactSheetModel = this.collection.findWhere({\n\t\t\t\t\t\t\t\ttype: 'contactSheet',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst usingIndesign =\n\t\t\t\t\t\t\t\tcontactSheetModel.get('engine') !== contactSheet.defaultEngine;\n\n\t\t\t\t\t\t\tconst view = this.getViewByName('pdf');\n\t\t\t\t\t\t\t// Setup contactSheet values\n\t\t\t\t\t\t\t// Convert our attribute object to a flat array of ids (as numbers)\n\t\t\t\t\t\t\tlet attrIds = view.getSelectedAttributes();\n\t\t\t\t\t\t\t// If no attributes were provided, default to `name`\n\t\t\t\t\t\t\tif (!attrIds.length) {\n\t\t\t\t\t\t\t\tattrIds = [-100];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tformatted.contactSheet = {\n\t\t\t\t\t\t\t\tselected: val,\n\t\t\t\t\t\t\t\t// All selected attribute ids\n\t\t\t\t\t\t\t\tattributeIds: attrIds,\n\t\t\t\t\t\t\t\t// Template name\n\t\t\t\t\t\t\t\tname: results.pdfTemplate,\n\t\t\t\t\t\t\t\t// Title\n\t\t\t\t\t\t\t\ttitle: results['contact-sheet-name'],\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// InDesign PDF export preset\n\t\t\t\t\t\t\tif (usingIndesign) {\n\t\t\t\t\t\t\t\t// Setup contactSheet values\n\t\t\t\t\t\t\t\tformatted.contactSheet = _.extend(formatted.contactSheet, {\n\t\t\t\t\t\t\t\t\t// Flex passes true\n\t\t\t\t\t\t\t\t\thighRes: true,\n\t\t\t\t\t\t\t\t\tpdfExportPreset: results['contact-sheet-export-preset'],\n\t\t\t\t\t\t\t\t\ttemplateName: results.pdfTemplate,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Default\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tformatted.contactSheet = _.extend(\n\t\t\t\t\t\t\t\t\tformatted.contactSheet,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t// Display names?\n\t\t\t\t\t\t\t\t\t\tdisplayLabels: results['contact-sheet-display-labels'],\n\t\t\t\t\t\t\t\t\t\t// High res?\n\t\t\t\t\t\t\t\t\t\thighRes: results['contact-sheet-high-res'],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t_.pick(\n\t\t\t\t\t\t\t\t\t\tresults,\n\t\t\t\t\t\t\t\t\t\t'portrait',\n\t\t\t\t\t\t\t\t\t\t'attribute-1',\n\t\t\t\t\t\t\t\t\t\t'attribute-2',\n\t\t\t\t\t\t\t\t\t\t'attribute-3',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'type-metadata': {\n\t\t\t\t\t\tconst view = this.getViewByName('attributeInfo');\n\t\t\t\t\t\tformatted.metadata = {\n\t\t\t\t\t\t\tselected: val,\n\t\t\t\t\t\t\tsetId: results['attribute-set-select'],\n\t\t\t\t\t\t\t// Get selected attributes (convert to number)\n\t\t\t\t\t\t\tattributeIds: view.getSelectedAttributes(),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn formatted;\n\t}\n\n\t/** @override */\n\tsubmitArgs() {\n\t\tconst args = super.submitArgs();\n\t\t// We do not want the model or collection returned\n\t\targs.splice(1, 1);\n\t\treturn args;\n\t}\n\n\t/** @override */\n\tviewAfterShown(view) {\n\t\tsuper.viewAfterShown(view);\n\n\t\t// check to see if submit should be enabled\n\t\t// AFTER the form elements are in the form\n\t\tview.rendered.then(() => {\n\t\t\tthis.checkForm();\n\t\t});\n\t}\n\n\t/**\n\t * submitReady() tests if the form can be submitted yet.\n\t * @override\n\t * @return {boolean} Status of the submit action: ready or not.\n\t */\n\tsubmitReady() {\n\t\t// Get forma values\n\t\tconst formValues = this.formValues();\n\n\t\t// Check if any of our tabs want to block the submit\n\t\tconst tabBlockingSubmit = this.viewCollection.models.find((viewSpec) => {\n\t\t\tconst view = viewSpec.get('view');\n\t\t\tif (view && view.submitReady && !view.submitReady()) return viewSpec;\n\t\t});\n\t\tif (tabBlockingSubmit) return false;\n\n\t\t// Our context options\n\t\tconst contextOpts = this.assetSet.contextOptions || {};\n\n\t\t// Do we need to enforce anything?\n\t\tconst enforcedOption = this.collection.filter((opt) => {\n\t\t\tconst type = opt.get('type');\n\t\t\treturn (\n\t\t\t\ttype === 'original' || type === 'proxy' || type === 'presetProcess'\n\t\t\t);\n\t\t});\n\n\t\tif (enforcedOption.length) {\n\t\t\t// If this is a preset process deal then enforce only the preset process selection\n\t\t\tif (contextOpts.context === 'presetProcess') {\n\t\t\t\treturn formValues.processes.length > 0;\n\t\t\t} else {\n\t\t\t\treturn (\n\t\t\t\t\tformValues.contactSheet ||\n\t\t\t\t\tformValues.historical ||\n\t\t\t\t\tformValues.metadata ||\n\t\t\t\t\tformValues.original ||\n\t\t\t\t\tformValues.processes.length ||\n\t\t\t\t\tformValues.proxies.length ||\n\t\t\t\t\tformValues.views.length\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Just enable\n\t\treturn true;\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'DownloadOptionsView';\n\t}\n}\n\n// Functionality\nForm(DownloadOptionsView);\n","/*\n * NOTE: we haven't added 'category' public link to the share system yet, and we haven't done the category context menu yet,\n * but those things should happen in concert.\n *\n */\nexport default [\n\t{\n\t\tevent: 'publicLink:add',\n\t\tlabel: i18n.t('i18n.makePublicLink'),\n\t\tuserLevel: 9, // not allowed since 8.5 ; use access tokens (share module) instead.\n\t},\n\t{\n\t\tevent: 'publicLink:delete',\n\t\tlabel: i18n.t('i18n.deletePublicLink'),\n\t\tuserLevel: 3,\n\t},\n\t{\n\t\tevent: 'publicLink:add:cart',\n\t\tlabel: i18n.t('i18n.makePublicLink'),\n\t\tuserLevel: 9, // not allowed since 8.5 ; use access tokens (share module) instead.\n\t\twrapper(view, e) {\n\t\t\tvar id, hash, thing, promise;\n\t\t\thash = window.location.hash;\n\t\t\tif (hash.includes('cart-assets')) {\n\t\t\t\tpromise = Netx.cart.saved.all.getCart(id);\n\t\t\t} else if (view.model) {\n\t\t\t\tthing = view.model;\n\t\t\t} else {\n\t\t\t\tthing = Netx.cart.current;\n\t\t\t}\n\t\t\treturn thing\n\t\t\t\t? [thing, e]\n\t\t\t\t: promise.then(function(savedCart) {\n\t\t\t\t\t\treturn [savedCart, e];\n\t\t\t\t });\n\t\t},\n\t},\n];\n","import Menu from '@netx/core/lib/netx-menu';\n\nexport default {};\n","/**\n * Public links collection\n * @class\n */\nimport Base from '@netx/core/lib/netx-collection';\nimport Model from '../models/publicLink';\n\nexport default class PublicLinks extends Base {\n\t/**\n\t * @type {Netx.Rpc}\n\t * @private\n\t */\n\tget rpc() {\n\t\treturn true;\n\t}\n\t/**\n\t * @type {Netx.URL}\n\t * @private\n\t */\n\tget url() {\n\t\treturn Netx.URL.api;\n\t}\n\n\t/** @type {boolean} */\n\tget xhrTrackProgress() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @type {object}\n\t */\n\tget xhrLoadingMessages() {\n\t\treturn {\n\t\t\tgetUserPublicLinkObjects: 'Loading shared links',\n\t\t};\n\t}\n\n\t/**\n\t * @type {object}\n\t */\n\tget xhrLoadedMessages() {\n\t\treturn {\n\t\t\tgetUserPublicLinkObjects: 'Loaded shared links',\n\t\t};\n\t}\n\n\tget methods() {\n\t\treturn {\n\t\t\tread: ['getUserPublicLinkObjects'],\n\t\t\treadAll: ['getAllPublicLinkObjects'],\n\t\t};\n\t}\n\n\t/** @override */\n\tconstructor(models, opts = {}) {\n\t\topts.model = opts.model || Model;\n\t\tsuper(models, opts);\n\t}\n\n\t/** @type {string} */\n\tstatic get __name__() {\n\t\treturn 'PublicLinks';\n\t}\n}\n","export default {\n\t/**\n\t * Container for our view\n\t * @const\n\t * @type {number}\n\t * @default\n\t */\n\tCONTAINER_ID: 'public-link',\n};\n","export default {\n\t/**\n\t * publicLink route. (Lowercased.) Keep routes simple; they should just fire events handled elsewhere.\n\t * @route\n\t * @param {number} id\n\t */\n\t'public-link'() {\n\t\t// used by various download options\n\t\tdispatcher.trigger('publicLink:publicLinks:routed');\n\t},\n};\n","/**\n * Public Link module\n *\n * @module publicLink\n */\nimport PublicLinkModel from './models/publicLink';\nimport PublicLinksCollection from './collections/publicLinks';\n\nimport customConfig from './config';\nimport routes from './routes';\n\nimport {linkTypes} from './properties/publicLink';\n\n// MODULE INITIALIZATION\n// =====================\n// All collection and model instances and event listeners\n// are created when the module is initialized.\n\n/**\n * Init handler\n * @event {@link module:publicLink#publicLink:init|publicLink:init}\n * @param {object} options Normally undefined, but a manual init trigger may override properties of Netx.custom.publicLink here.\n */\ndispatcher.once('publicLink:init', function(options) {\n\t// Each module has its own namespace on the global Netx object\n\tvar NS = (Netx.publicLink = {});\n\t// Check for module options\n\tNS.options = options = _.extend({}, customConfig, options);\n\n\tvar fsViews = Netx.app.fsViews,\n\t\tappViews = Netx.app.appViews,\n\t\tmodalViews = Netx.app.modalViews;\n\n\t// PUBLIC MODELS & COLLECTIONS\n\t// =========================\n\t// Object initializations, etc, go here.\n\n\tNetx.publicLink.mine = new PublicLinksCollection();\n\n\tif (typeof Netx.asset.publicLinks === 'undefined') {\n\t\tNetx.asset.publicLinks = new PublicLinksCollection();\n\n\t\t// We want to know when Netx.publicLink.mine has synced\n\t\t// We will filter it down to Netx.asset.publicLinks for the current asset\n\t\tNetx.publicLink.mine.on('sync', function() {\n\t\t\tdispatcher.trigger('publicLink:get:asset');\n\t\t});\n\n\t\t// Netx.asset.current has changed\n\t\t// We will filter it down to Netx.asset.publicLinks for the current asset\n\t\tNetx.asset.current.on('change:assetId', function() {\n\t\t\tdispatcher.trigger('publicLink:get:asset');\n\t\t});\n\t}\n\n\t// BEGIN DISPATCHER EVENT LISTENERS\n\t// =========================\n\t// All other module event listeners are added here, inside the init handler.\n\n\t/**\n\t * @event module:publicLink#publicLink:publicLinks:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'publicLink:publicLinks:show',\n\t\tfunction(viewOptions) {\n\t\t\timport(/* webpackChunkName: \"view-publicLinks\" */ './views/publicLinksView').then(\n\t\t\t\tView => {\n\t\t\t\t\tappViews.add({\n\t\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\t\tshowActions: ['publicLink:publicLinks:show'],\n\t\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * handles /publicLink routes\n\t * @event module:publicLink#publicLink:publicLinks:routed\n\t * @fires module:publicLink#publicLink:publicLinks\n\t */\n\tdispatcher.on('publicLink:publicLinks:routed', function() {\n\t\tdispatcher.trigger('publicLink:publicLinks');\n\t});\n\n\t/**\n\t * @event module:publicLink#publicLink:publicLinks\n\t * @fires module:publicLink#publicLink:publicLinks:show\n\t */\n\tdispatcher.on('publicLink:publicLinks', function() {\n\t\tdispatcher.on('publicLink:publicLinks:show', {\n\t\t\tcollection: Netx.publicLink.mine,\n\t\t});\n\t\tNetx.publicLink.mine.fetch();\n\t});\n\n\t/**\n\t * @event module:publicLink#publicLink:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'publicLink:edit:show',\n\t\tfunction(viewOptions) {\n\t\t\timport(/* webpackChunkName: \"view-publicLinkEdit\" */ './views/publicLinkEditView').then(\n\t\t\t\tView => {\n\t\t\t\t\tmodalViews.add({\n\t\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\t\tshowActions: ['publicLink:edit:show'],\n\t\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:publicLink#publicLink:edit\n\t * @param {number} id PublicLinkBean id\n\t * @fires module:publicLink#publicLink:edit:show\n\t */\n\tdispatcher.on('publicLink:edit', function(id) {\n\t\tif (Netx.getUserLevel() > 8) {\n\t\t\tdispatcher.trigger('publicLink:edit:show', {\n\t\t\t\tmodel: Netx.publicLink.mine.get(id) || new PublicLinkModel(),\n\t\t\t});\n\t\t}\n\t});\n\n\t//\n\t// show the public links editor as a modal:\n\t//\n\tdispatcher.on('publicLink:showEditor', function(m) {\n\t\tif (Netx.getUserLevel() > 8) {\n\t\t\tdispatcher.trigger('publicLink:edit:show', {\n\t\t\t\tmodel: m || new PublicLinkModel(),\n\t\t\t});\n\t\t}\n\t});\n\n\t//\n\t// get all the public links for an asset\n\t// if id is undefined then Netx.asset.current.id will be used\n\t//\n\tdispatcher.on('publicLink:get:asset', function(id) {\n\t\tNetx.asset.publicLinks.reset(\n\t\t\tNetx.publicLink.mine.where({\n\t\t\t\ttype: 1,\n\t\t\t\tobjectId: id || Netx.asset.current.id,\n\t\t\t}),\n\t\t\t{silent: true},\n\t\t);\n\t\tNetx.asset.publicLinks.trigger('sync', Netx.asset.publicLinks);\n\t});\n\n\t//\n\t// get all the public links for an category\n\t// if id is undefined then Netx.category.current.id will be used\n\t//\n\tdispatcher.on('publicLink:get:category', function(id) {\n\t\tNetx.asset.publicLinks.reset(\n\t\t\tNetx.publicLink.mine.where({\n\t\t\t\ttype: 2,\n\t\t\t\tobjectId: id || Netx.category.current.id,\n\t\t\t}),\n\t\t);\n\t});\n\n\t//\n\t// get all the public links for an saved cart\n\t//\n\tdispatcher.on('publicLink:get:cart', function(id) {\n\t\tif (!id) return console.error(new Error('id must be defined'));\n\t\tNetx.asset.publicLinks.reset(\n\t\t\tNetx.publicLink.mine.where({type: 4, objectId: id}),\n\t\t);\n\t});\n\n\t//\n\t// get all the public links for an saved search\n\t//\n\tdispatcher.on('publicLink:get:search', function(id) {\n\t\tif (!id) return console.error(new Error('id must be defined'));\n\t\tNetx.asset.publicLinks.reset(\n\t\t\tNetx.publicLink.mine.where({type: 3, objectId: id}),\n\t\t);\n\t});\n\n\t//\n\t// Submit handler for the public links editor.\n\t//\n\tdispatcher.on('publicLink:save:confirmed', function(values, plink) {\n\t\tvar isNew = plink.isNew();\n\n\t\t// set these values directly on the model.\n\t\tplink.set(\n\t\t\t_.pick(\n\t\t\t\tvalues,\n\t\t\t\t'accessCount',\n\t\t\t\t'expirationDate',\n\t\t\t\t'expirationType',\n\t\t\t\t'includeSubFolders',\n\t\t\t\t'password',\n\t\t\t\t'securityType',\n\t\t\t\t'title',\n\t\t\t\t'type',\n\t\t\t),\n\t\t);\n\n\t\t// set object ID based on type.\n\t\tplink.set({\n\t\t\tobjectId:\n\t\t\t\tvalues[\n\t\t\t\t\t'objectId-' +\n\t\t\t\t\t\t_.object(_.pluck(linkTypes, 'value'), _.pluck(linkTypes, 'name'))[\n\t\t\t\t\t\t\tvalues.type\n\t\t\t\t\t\t]\n\t\t\t\t],\n\t\t});\n\n\t\t// set userID to my own\n\t\tplink.set({userId: Netx.getUser().id});\n\n\t\tvar handleErr = function(err) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'publicLink:' + (isNew ? 'add' : 'edit') + ':error',\n\t\t\t\terr,\n\t\t\t\tplink,\n\t\t\t);\n\t\t};\n\n\t\t// sync!\n\t\tplink.save().then(function() {\n\t\t\tNetx.publicLink.mine.fetch().then(function() {\n\t\t\t\tplink = Netx.publicLink.mine.get(plink.id);\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'publicLink:' + (isNew ? 'add' : 'edit') + ':success',\n\t\t\t\t\tplink,\n\t\t\t\t);\n\t\t\t}, handleErr);\n\t\t}, handleErr);\n\t});\n\n\t/**\n\t * UI handler for add success:\n\t * @event module:publicLink#publicLink:edit:success\n\t * @param {Netx.Models.PublicLink} model PublicLink model\n\t * @param {boolean} isNew Whether link is new or not\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'publicLink:edit:success',\n\t\tfunction(model, isNew) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'publicLink',\n\t\t\t\ttitle: i18n.t('i18n.publicLinkSaved', {\n\t\t\t\t\tdefaultValue: 'Public link saved',\n\t\t\t\t}),\n\t\t\t\tdescription: i18n.t('i18n.publicLinkSuccessfullySaved', {\n\t\t\t\t\tdefaultValue: 'Public link successfully saved',\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * publicLink:delete is an action handler, but it expects to be handed an array of ids;\n\t * Use an actionWrapper in your view to build that array.\n\t *\n\t * @param {array} ids List of link IDs to delete.\n\t * @event\n\t * @fires module:publicLink#app:confirm:delete\n\t */\n\tdispatcher.on('publicLink:delete', function(ids) {\n\t\tif (!_.isArray(ids))\n\t\t\tthrow new Error('Bad argument to publicLink:delete : ' + ids);\n\n\t\tif (ids.length === 0)\n\t\t\tthrow new Error('Empty array passed to publicLink:delete');\n\n\t\tdispatcher.trigger(\n\t\t\t'app:confirm:delete',\n\t\t\t{\n\t\t\t\tmessage:\n\t\t\t\t\tids.length > 1\n\t\t\t\t\t\t? i18n.t('i18n.deleteLinksConfirm', {\n\t\t\t\t\t\t\t\tcount: ids.length,\n\t\t\t\t\t\t })\n\t\t\t\t\t\t: i18n.t('i18n.deleteLinkConfirm'),\n\t\t\t\teventStr: 'publicLink:delete',\n\t\t\t},\n\t\t\tids,\n\t\t);\n\t});\n\n\tdispatcher.on('publicLink:delete:confirmed', function(ids) {\n\t\t// promises\n\t\tvar p = [];\n\t\tids.forEach(function(id) {\n\t\t\tp.push(Netx.publicLink.mine.get(id).destroy());\n\t\t});\n\t\t$.when.apply($, p).then(\n\t\t\tfunction() {\n\t\t\t\tdispatcher.trigger('publicLink:delete:success', ids);\n\t\t\t},\n\t\t\tfunction(err) {\n\t\t\t\tdispatcher.trigger('publicLink:delete:error', err);\n\t\t\t},\n\t\t);\n\t});\n\n\tdispatcher.on('publicLink:delete:error', function(error) {\n\t\tdispatcher.trigger('app:alert', error, 'Danger');\n\t});\n\n\tdispatcher.on('publicLink:delete:success', function(ids) {\n\t\tdispatcher.trigger('notification', {\n\t\t\tmodule: 'publicLink',\n\t\t\ttitle: i18n.t('i18n.publicLinksDeleted', {\n\t\t\t\tdefaultValue: 'Public links deleted',\n\t\t\t}),\n\t\t\tdescription:\n\t\t\t\tids.length > 1\n\t\t\t\t\t? i18n.t('i18n.linksSuccessfullyDeleted', {\n\t\t\t\t\t\t\tdefaultValue: '__count__ links successfully deleted.',\n\t\t\t\t\t\t\tcount: ids.length,\n\t\t\t\t\t })\n\t\t\t\t\t: i18n.t('i18n.linkSuccessfullyDeleted', {\n\t\t\t\t\t\t\tdefaultValue: 'Link successfully deleted',\n\t\t\t\t\t }),\n\t\t\ttype: 'success',\n\t\t});\n\t});\n\n\t// END DISPATCHER EVENT LISTENERS\n\n\t// LAST STEPS:\n\t// non-core extensions may listen on this event to hook into the init process:\n\tdispatcher.trigger('publicLink:extend', NS);\n\n\t// Tell the module loader we're initialized.\n\tdispatcher.trigger('publicLink:initialized', NS);\n});\n\nexport default {\n\tinitialize(opts) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdispatcher.once('publicLink:initialized', () => {\n\t\t\t\tresolve(routes);\n\t\t\t});\n\t\t\tdispatcher.trigger('publicLink:init');\n\t\t});\n\t},\n};\n","/**\n * PublicLink module\n */\n\nimport actions from './actions';\nimport menus from './menus';\nimport controller from './controller';\n\n/**\n * @property {object} exports - Our module exports\n * @property {string} exports.namespace - Module namespace\n * @property {function} exports.initialize - Module initializer\n */\nexport default {\n\tnamespace: 'publicLink',\n\tinitialize() {\n\t\t// Register actions\n\t\tNetx.Actions.Register(actions);\n\t\t// Extend menus\n\t\tNetx.addMenus(menus);\n\n\t\treturn controller.initialize();\n\t},\n};\n","import {allowsDelete, readOnly} from '@netx/core/lib/netx-enablers';\n\nexport default [\n\t// ===============\n\t// ATTRIBUTE SETS\n\t// ===============\n\t/** @action */\n\t{\n\t\tevent: 'user:attributeSet:delete',\n\t\tlabel: i18n.t('i18n.deleteAttributeSet'),\n\t\tenableTest: allowsDelete,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\n\t/** @action */\n\t{\n\t\tevent: 'user:attributeSet:edit',\n\t\tlabel: i18n.t('i18n.editAttributeSet'),\n\t\tmatrix: 'write',\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'user:attributeSet:new',\n\t\tlabel: i18n.t('i18n.newAttributeSet'),\n\t\twrapper(view, e) {\n\t\t\treturn [Netx.getUser()];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'user:attributeSet:view',\n\t\tlabel: i18n.t('i18n.viewAttributeSet'),\n\t\tenableTest: readOnly,\n\t\twrapper(view, e) {\n\t\t\treturn [view.model];\n\t\t},\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'user:attributeSets:route',\n\t\tlabel: i18n.t('i18n.attributeSets'),\n\t\troute: 'user/attributeSets',\n\t},\n\t// ===============\n\t// !ATTRIBUTE SETS\n\t// ===============\n\n\t// ===============\n\t// PROFILE\n\t// ===============\n\t/** @action */\n\t{\n\t\tevent: 'user:profile',\n\t\tlabel: i18n.t('i18n.profile'),\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'user:profile:route',\n\t\tlabel: i18n.t('i18n.profile'),\n\t\troute: 'user/profile',\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'user:profile:edit',\n\t\tlabel: i18n.t('i18n.editProfile'),\n\t},\n\t/** @action */\n\t{\n\t\tevent: 'user:profile:edit:route',\n\t\tlabel: i18n.t('i18n.editProfile'),\n\t\troute: 'user/profile',\n\t},\n\t// ===============\n\t// !PROFILE\n\t// ===============\n\n\t// ===============\n\t// SELECTOR\n\t// ===============\n\t{\n\t\tevent: 'user:selector:remove',\n\t\tlabel: i18n.t('i18n.delete'),\n\t},\n\t// ===============\n\t// !SELECTOR\n\t// ===============\n\n\t// ===============\n\t// SETTINGS\n\t// ===============\n\t/** @action */\n\t{\n\t\tevent: 'user:settings:edit',\n\t\tlabel: i18n.t('i18n.settings'),\n\t},\n\t{\n\t\tevent: 'user:settings:route',\n\t\tlabel: i18n.t('i18n.settings'),\n\t\troute: 'user/settings',\n\t},\n\t{\n\t\tevent: 'user:integrations:route',\n\t\tlabel: i18n.t('i18n.integrations'),\n\t\troute: 'user/integrations',\n\t},\n\t// ===============\n\t// !SETTINGS\n\t// ===============\n];\n","import Menu from '@netx/core/lib/netx-menu';\n\nexport default {\n\t// used?\n\tuserPrefs: new Menu({\n\t\tactions: ['user:profile:hide'],\n\t}),\n\n\t// used?\n\tuserProfile: new Menu({\n\t\tactions: ['user:profile:hide'],\n\t}),\n};\n","export default {\n\tCONTAINER_ID: 'user-profile',\n\tPREFS_ID: 'user-prefs',\n\tSHOW_USERS_AS_TEXT: false,\n};\n","export default {\n\t/**\n\t * User attribute sets\n\t * @route\n\t * @fires module:user#user:attributesSets:routed\n\t */\n\t'user/attributeSets'() {\n\t\tdispatcher.trigger('user:attributeSets:routed');\n\t},\n\t/**\n\t * User profile\n\t * @route\n\t * @fires module:user#user:profile:routed\n\t */\n\t'user/profile'() {\n\t\tdispatcher.trigger('user:profile:routed');\n\t},\n\t/**\n\t * User preferences\n\t * @route\n\t * @fires module:user#user:settings:routed\n\t */\n\t'user/settings'() {\n\t\tdispatcher.trigger('user:settings:routed');\n\t},\n\t/**\n\t * @route\n\t * @fires module:user#user:load:integrations\n\t */\n\t'user/integrations(/*anything)'() {\n\t\tdispatcher.trigger('user:load:integrations');\n\t},\n\t/**\n\t * @route\n\t * @fires module:user#user:load:integrations\n\t */\n\t'access/*string'(string) {\n\t\tdispatcher.trigger('user:load:integrations', string);\n\t},\n};\n","/**\n * The user module handles user profile UI, and user data for the current user only\n *\n * @module user\n */\n\n// Models\nimport UserAssetAttributeSetModel from '@netx/core-asset/models/assetAttributeSet_user';\nimport UserProfileModel from './models/userProfile';\n\n// Collections\nimport CategoryAssetsCollection from '@netx/core-category/collections/categoryAssets';\nimport CustomFormCollection from '@netx/core-app/collections/customForm';\nimport GroupsCollection from './collections/groups';\nimport UsersCollection from './collections/users';\n\nimport customConfig from './config';\nimport routes from './routes';\n\nimport themeProperties from '@netx/core-app/properties/theme';\n\n/**\n * @event module:user#user:init\n */\ndispatcher.once('user:init', function (options) {\n\t// Netx.user[prefs|profile] should be created at startup, but just in case ...\n\tvar NS = (Netx.user = Netx.user || {});\n\tNS.options = options = _.extend({}, customConfig, options);\n\n\tNS.bootstrap = [];\n\n\tvar fsViews = Netx.app.fsViews,\n\t\tappViews = Netx.app.appViews,\n\t\tmodalViews = Netx.app.modalViews;\n\n\t//=================================\n\t//\tCREATE MODELS AND COLLECTIONS\n\t//=================================\n\t// Don't ever fetch. This collection is specifically used for getting the \"Uploads\" number for a user\n\tNS.assets = new CategoryAssetsCollection([]);\n\n\t// We sometimes initialize the user module before authentication, in\n\t// order to use it for new user registration. In those cases, none of this is necessary,\n\t// and in fact it causes problems.\n\t//\n\t// Therefore, only fetch the following data if we're already authenticated:\n\t//\n\t// TODO: when we move away from cookies in 8.6, check that this is still the right test.\n\tif (Netx.session.getKey()) {\n\t\tNS.bootstrap.push(NS.prefs.fetch({silent: true}));\n\t\tNS.bootstrap.push(NS.profile.fetch());\n\t\tNS.bootstrap.push(NS.profile.getUserUploadCategory());\n\t}\n\n\t// Don't fetch until needed, but this is where a list of all users can be found.\n\tNS.allUsers = new UsersCollection([]);\n\t// Ditto groups.\n\tNS.allGroups = new GroupsCollection([]);\n\t//=================================\n\t//\t!CREATE MODELS AND COLLECTIONS\n\t//=================================\n\n\t//=================================\n\t//\tEVENT LISTENERS\n\t//=================================\n\n\tNS.assets.on('counted', function (count) {\n\t\tdispatcher.trigger('user:uploads:count', count);\n\t});\n\n\tNS.profile.on('sync', function () {\n\t\tvar assets = NS.assets;\n\t\tassets.categoryId = -1;\n\t\t// Default category search is for ID\n\t\t// This one wants path\n\t\tassets.selection.at(0).set({\n\t\t\telementType: 5,\n\t\t\telementValue1: 'Users/' + Netx.getUser('login'),\n\t\t});\n\t});\n\n\t/**\n\t * Override in theme to prompt for confirmation\n\t * @event module:user#user:attributeSet:delete\n\t * @param {module:asset/models/assetAttributeSet_user} attributeSet User attribute set\n\t * @fires module:user#user:attributeSet:delete:confirmed\n\t */\n\tdispatcher.on('user:attributeSet:delete', function (attributeSet) {\n\t\tdispatcher.trigger('user:attributeSet:delete:confirmed', attributeSet);\n\t});\n\t/**\n\t * @event module:user#user:attributeSet:delete:confirmed\n\t * @param {module:asset/models/assetAttributeSet_user} attributeSet User attribute set\n\t * @fires module:user#user:attributeSet:delete:error\n\t * @fires module:user#user:attributeSet:delete:success\n\t */\n\tdispatcher.on('user:attributeSet:delete:confirmed', function (attributeSet) {\n\t\tattributeSet.destroy({wait: true}).then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('user:attributeSet:delete:success', attributeSet);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('user:attributeSet:delete:error', err, attributeSet);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:user#user:attributeSet:delete:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/assetAttributeSet_user} attributeSet User attribute set\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'user:attributeSet:delete:error',\n\t\tfunction (error, attributeSet) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:attributeSet:delete:success\n\t * @param {module:asset/models/assetAttributeSet_user} attributeSet User attribute set\n\t */\n\tdispatcher.on(\n\t\t'user:attributeSet:edit:success',\n\t\tfunction (attributeSet) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:user#user:attributeSet:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'user:attributeSet:edit:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-userAttributeSetEdit\" */ './views/userAttributeSetEditView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['user:attributeSet:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:attributeSet:edit\n\t * @param {module:asset/models/assetAttributeSet_user} attributeSet User attribute set\n\t * @fires module:user#user:attributeSet:edit:error\n\t * @fires module:user#user:attributeSet:edit:show\n\t */\n\tdispatcher.on('user:attributeSet:edit', function (attributeSet) {\n\t\t$.when(!attributeSet.isNew() ? attributeSet.fetchBean() : true).then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('user:attributeSet:edit:show', {\n\t\t\t\t\tmodel: attributeSet,\n\t\t\t\t});\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('user:attributeSet:edit:error', err, attributeSet);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:user#user:attributeSet:edit:confirmed\n\t * @param {object} data Form data\n\t * @param {module:asset/models/assetAttributeSet_user} attributeSet User attribute set\n\t * @fires module:user#user:attributeSet:edit:error\n\t * @fires module:user#user:attributeSet:edit:success\n\t */\n\tdispatcher.on('user:attributeSet:edit:confirmed', function (\n\t\tdata,\n\t\tattributeSet,\n\t) {\n\t\tvar isNew = attributeSet.isNew();\n\n\t\t// Get the values as numbers\n\t\t// var attributeIds = _.map(\n\t\t// \tObject.values(data['attribute-template-item'] || {}),\n\t\t// \tNumber,\n\t\t// );\n\t\tattributeSet.set({\n\t\t\tname: data.name || i18n.t('i18n.new'),\n\t\t\tattributeIds: data.attributeIds,\n\t\t\tuserId: Netx.getUser().id,\n\t\t});\n\t\tattributeSet.save().then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger(\n\t\t\t\t\t'user:attributeSet:edit:success',\n\t\t\t\t\tattributeSet,\n\t\t\t\t\tisNew,\n\t\t\t\t);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('user:attributeSet:edit:error', err, attributeSet);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:user#user:attributeSet:edit:error\n\t * @param {string} error Error string\n\t * @param {module:asset/models/assetAttributeSet_user} attributeSet User attribute set\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'user:attributeSet:edit:error',\n\t\tfunction (error, attributeSet) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:attributeSet:edit:success\n\t * @param {module:asset/models/assetAttributeSet_user} attributeSet User attribute set\n\t * @param {boolean} isNew New attribute set\n\t */\n\tdispatcher.on(\n\t\t'user:attributeSet:edit:success',\n\t\tfunction (attributeSet, isNew) {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:user#user:attributeSet:new\n\t * @fires module:user#user:attributeSet:edit\n\t */\n\tdispatcher.on('user:attributeSet:new', function () {\n\t\tdispatcher.trigger(\n\t\t\t'user:attributeSet:edit',\n\t\t\tnew UserAssetAttributeSetModel(),\n\t\t);\n\t});\n\n\t/**\n\t * @event module:user#user:attributeSet:view:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on('user:attributeSet:view:show', function (viewOptions) {\n\t\timport(\n\t\t\t/* webpackChunkName: \"view-userAttributeSet\" */ './views/userAttributeSetView'\n\t\t).then((View) => {\n\t\t\tmodalViews.add({\n\t\t\t\tviewClass: View.default,\n\t\t\t\tshowActions: ['user:attributeSet:view:show'],\n\t\t\t\tviewOptions: viewOptions,\n\t\t\t});\n\t\t});\n\t});\n\t/**\n\t * @event module:user#user:attributeSet:view\n\t * @param {module:asset/models/assetAttributeSet_user} attributeSet Attribute set\n\t * @fires module:user#user:attributeSet:view:show\n\t */\n\tdispatcher.on('user:attributeSet:view', function (attributeSet) {\n\t\tif (_.isNumeric(attributeSet)) {\n\t\t\tattributeSet = new UserAssetAttributeSetModel({id: attributeSet});\n\t\t}\n\t\tattributeSet.fetchBean().then(function () {\n\t\t\tdispatcher.trigger('user:attributeSet:view:show', {\n\t\t\t\tmodel: attributeSet,\n\t\t\t\tcollection: attributeSet.attributeTemplates,\n\t\t\t});\n\t\t});\n\t});\n\n\t/**\n\t * @event module:user#user:attributeSets:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'user:attributeSets:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-userAttributeSets\" */ './views/userAttributeSetsView'\n\t\t\t).then((View) => {\n\t\t\t\tappViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['user:attributeSets:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:attributeSets:routed\n\t * @fires module:user#user:attributeSets\n\t */\n\tdispatcher.on('user:attributeSets:routed', function () {\n\t\tdispatcher.trigger('user:attributeSets');\n\t});\n\t/**\n\t * @event module:user#user:attributeSets\n\t * @fires module:user#user:attributeSets:show\n\t */\n\tdispatcher.on('user:attributeSets', function () {\n\t\t//var attributeSets = new UserAssetAttributeSetsCollection([]);\n\t\t//attributeSets.fetch();\n\t\t// Show\n\t\tdispatcher.trigger('user:attributeSets:show', {\n\t\t\tcollection: Netx.asset.attributeSets.user,\n\t\t});\n\t});\n\n\t// TODO: document\n\tdispatcher.on('asset:category:moved', function (aId, fromId, toId, a) {\n\t\tif (parseInt(fromId, 10) === Netx.getUser('category')) {\n\t\t\tdispatcher.trigger('user:uploads:count', 'remove');\n\t\t}\n\t\tif (parseInt(toId, 10) === Netx.getUser('category')) {\n\t\t\tdispatcher.trigger('user:uploads:count', 'add');\n\t\t}\n\t});\n\n\tdispatcher.on('asset:category:removed', function (aId, catId, a) {\n\t\tif (parseInt(catId, 10) === Netx.getUser('category')) {\n\t\t\tdispatcher.trigger('user:uploads:count', 'remove');\n\t\t}\n\t});\n\n\tdispatcher.on('asset:deleted', function () {\n\t\tif (Netx.category.current.get('categoryid') === Netx.getUser('category')) {\n\t\t\tdispatcher.trigger('user:uploads:count', 'remove');\n\t\t}\n\t});\n\n\tdispatcher.on('cart:categorize:succeeded', function () {\n\t\tNS.assets.fetchAssetCount();\n\t});\n\n\t/**\n\t * @event module:user#upload:import:imported\n\t * @param {object} uploader Uploader instance\n\t * @param {object} file File instance\n\t * @param {module:asset/models/asset} asset Asset\n\t * @fires module:user#user:uploads:count\n\t */\n\tdispatcher.on('upload:import:imported', function (uploader, file, asset) {\n\t\tif (asset != null && asset.get('categoryid') === 0) {\n\t\t\tdispatcher.trigger('user:uploads:count', 'add');\n\t\t}\n\t});\n\n\t// This event takes a single arguement as a number or a string\n\t// if a number is passed it will be used as the count\n\t// if passed the string \"add\" the count is incremented by one\n\t// if passed the string \"remove\" the count is decremented by one\n\tdispatcher.on('user:uploads:count', function (i) {\n\t\tif (_.isUndefined(i)) {\n\t\t\tthrow new Error('No argument passed with user:uploads:count event');\n\t\t}\n\t\tif (_.isNumber(i)) {\n\t\t\tNetx.user.assets.count = i;\n\t\t}\n\t\tif (i === 'add') {\n\t\t\tNetx.user.assets.count++;\n\t\t}\n\t\tif (i === 'remove') {\n\t\t\tNetx.user.assets.count--;\n\t\t}\n\t\tdispatcher.trigger('user:uploads:counted', Netx.user.assets.count);\n\t});\n\n\t//=================================\n\t//\tUSER PREFS\n\t//=================================\n\t/**\n\t * @event module:user#user:prefs:set\n\t * @param {string} preference [dot seperated] preference key\n\t * @param {array|number|object|string} value Value to set on preference\n\t * @fires module:user#user:prefs:set:confirmed\n\t */\n\tdispatcher.on('user:prefs:set', function (preference, value) {\n\t\t// Maybe intercept this with a confirm dialogue\n\t\t// Keep the pattern of confirmed before any success/erro\n\t\tdispatcher.trigger('user:prefs:set:confirmed', preference, value);\n\t});\n\t/**\n\t * @event module:user#user:prefs:set:confirmed\n\t * @param {string} preference [dot seperated] preference key\n\t * @param {array|number|object|string} value Value to set on preference\n\t * @fires module:user#user:prefs:set:error\n\t * @fires module:user#user:prefs:set:success\n\t * @see module:user#user:prefs:set\n\t */\n\tdispatcher.on('user:prefs:set:confirmed', function (preference, value) {\n\t\tNetx.setPreference(preference, value).then(\n\t\t\tfunction () {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('user:prefs:set:success', preference, value);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('user:prefs:set:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:user#user:prefs:set:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:user#user:prefs:set:confirmed\n\t */\n\tdispatcher.on(\n\t\t'user:prefs:set:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'app:alert',\n\t\t\t\terror,\n\t\t\t\ti18n.t('i18n.error', {defaultValue: 'Error'}),\n\t\t\t);\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:prefs:set:success\n\t * @see module:user#user:prefs:set:confirmed\n\t */\n\tdispatcher.on(\n\t\t'user:prefs:set:success',\n\t\tfunction () {\n\t\t\t//\n\t\t},\n\t\twindow,\n\t);\n\t//=================================\n\t//\t!USER PREFS\n\t//=================================\n\n\t//=================================\n\t//\tUSER PROFILE\n\t//=================================\n\t/**\n\t * @event module:user#user:profile:routed\n\t * @fires module:user#user:profile\n\t */\n\tdispatcher.on('user:profile:routed', function () {\n\t\tdispatcher.trigger('user:profile');\n\t});\n\t/**\n\t * @event module:user#user:profile\n\t * @fires module:user#user:profile:edit\n\t */\n\tdispatcher.on('user:profile', function () {\n\t\tdispatcher.trigger('user:profile:edit');\n\t});\n\t/**\n\t * @event module:user#user:profile:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'user:profile:edit:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-userProfile\" */ './views/userProfileView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['user:profile:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:profile:edit\n\t * @fires module:user#user:profile:edit:show\n\t * @see module:user#user:profile:edit:confirmed\n\t */\n\tdispatcher.on('user:profile:edit', function () {\n\t\t// console.log( 'user:profile:edit' );\n\t\t// Need that\n\t\tif (!NS.profile.id) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'user:profile:edit:error',\n\t\t\t\tnew Error(\n\t\t\t\t\ti18n.t('i18n.invalidUserProfile', {\n\t\t\t\t\t\tdefaultValue: 'Invalid user profile',\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tvar user = Netx.getUser();\n\n\t\t// custom registration data\n\t\t// read only becuase neither setUser nor modifyCurrentUserData sets propertyNames and propertyValues\n\t\tvar customForm = new CustomFormCollection([], {\n\t\t\tformName: 'register',\n\t\t\tuserValues: user.getPropertyObject(),\n\t\t\tduplicateKeys: _.keys(user.attributes),\n\t\t\treadOnly: true,\n\t\t});\n\t\tcustomForm.fetch().then(function () {\n\t\t\tdispatcher.trigger('user:profile:edit:show', {\n\t\t\t\tmodel: user,\n\t\t\t\tcollection: customForm,\n\t\t\t\tisRouted: true,\n\t\t\t});\n\t\t});\n\t});\n\t/**\n\t * @event module:user#user:profile:edit:confirmed\n\t */\n\tdispatcher.on('user:profile:edit:confirmed', function (values, model) {\n\t\t// Vars\n\t\tvar isNew, modelValues;\n\n\t\tisNew = model.isNew() || !model.id;\n\n\t\tmodelValues = _.pick(values, _.keys(UserProfileModel.GetDefaults()));\n\n\t\t// No point in setting this here\n\t\t// neither setUser nor modifyCurrentUserData sets propertyNames and propertyValues\n\t\t// set custom user data if any\n\t\t//model.setPropertyArrays(values);\n\n\t\t// Adjust notify boolean to int\n\t\tmodelValues.notify = modelValues.notify ? 1 : 0;\n\n\t\t// Password has not changed\n\t\tif (\n\t\t\t!values.autogeneratePassword &&\n\t\t\t(modelValues.password1 === '' || modelValues.password2 === '')\n\t\t) {\n\t\t\tmodelValues = _.omit(modelValues, 'password1', 'password2');\n\t\t}\n\t\t// Autogenerate password (send empty strings to server)\n\t\telse if (values.autogeneratePassword) {\n\t\t\tmodelValues.password1 = modelValues.password2 = '';\n\t\t}\n\n\t\t// Set it\n\t\tmodel.set(modelValues);\n\n\t\t// user propertyNames/propertyValues are currently read-only\n\t\t// Jason hinted that in a future release we'll need to be able to set them\n\t\t// model.setPropertyArrays(values);\n\n\t\t// Self registration?\n\t\tif (isNew) {\n\t\t\tmodel.userSelfRegistration();\n\t\t} else {\n\t\t\t// Save it\n\t\t\tmodel.save().then(\n\t\t\t\tfunction () {\n\t\t\t\t\t// Success\n\t\t\t\t\tdispatcher.trigger('user:profile:edit:success', model, isNew);\n\t\t\t\t},\n\t\t\t\tfunction (err) {\n\t\t\t\t\t// Error\n\t\t\t\t\tdispatcher.trigger('user:profile:edit:error', err, model);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t});\n\t/**\n\t * @event module:user#user:profile:edit:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t * @see module:user#user:profile:edit:confirmed\n\t */\n\tdispatcher.on(\n\t\t'user:profile:edit:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:profile:edit:success\n\t * @fires module:notification#notification\n\t * @see module:user#user:profile:edit:confirmed\n\t */\n\tdispatcher.on(\n\t\t'user:profile:edit:success',\n\t\tfunction () {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'user',\n\t\t\t\ttitle: i18n.t('i18n.profileUpdated', {\n\t\t\t\t\tdefaultValue: 'Profile updated',\n\t\t\t\t}),\n\t\t\t\tdescription: i18n.t('i18n.profileSuccessfullyUpdated', {\n\t\t\t\t\tdefaultValue: 'Profile successfully updated',\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t//=================================\n\t//\t!USER PROFILE\n\t//=================================\n\n\t//=================================\n\t//\tUSER SETTINGS\n\t//=================================\n\t/**\n\t * @event module:user#user:settings:routed\n\t * @fires module:user#user:settings\n\t */\n\tdispatcher.on('user:settings:routed', function () {\n\t\tdispatcher.trigger('user:settings');\n\t});\n\t/**\n\t * @event module:user#user:settings\n\t * @fires module:user#user:settings:edit\n\t */\n\tdispatcher.on('user:settings', function () {\n\t\tdispatcher.trigger('user:settings:edit');\n\t});\n\t/**\n\t * @event module:user#user:settings:edit:show\n\t * @param {object} viewOptions View options\n\t */\n\tdispatcher.on(\n\t\t'user:settings:edit:show',\n\t\tfunction (viewOptions) {\n\t\t\timport(\n\t\t\t\t/* webpackChunkName: \"view-userSettingsEdit\" */ './views/userSettingsEditView'\n\t\t\t).then((View) => {\n\t\t\t\tmodalViews.add({\n\t\t\t\t\tviewClass: View.default,\n\t\t\t\t\tshowActions: ['user:settings:edit:show'],\n\t\t\t\t\tviewOptions: viewOptions,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:settings:edit\n\t * @see module:user#user:settings:edit:confirmed\n\t * @fires module:user#user:settings:edit:show\n\t */\n\tdispatcher.on('user:settings:edit', function () {\n\t\t// Need that\n\t\tif (!Netx.user.profile.id) {\n\t\t\tdispatcher.trigger(\n\t\t\t\t'user:profile:edit:error',\n\t\t\t\tnew Error(\n\t\t\t\t\ti18n.t('i18n.invalidUserProfile', {\n\t\t\t\t\t\tdefaultValue: 'Invalid user profile',\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\t// Show\n\t\tdispatcher.trigger('user:settings:edit:show', {\n\t\t\tmodel: NS.prefs,\n\t\t});\n\t});\n\t/**\n\t * @event module:user#user:settings:edit:confirmed\n\t * @param {object} data Preference data\n\t * @param {Netx.Models.UserPrefs} model UserPrefs model\n\t * @fires module:user#user:settings:edit:error\n\t * @fires module:user#user:settings:edit:success\n\t */\n\tdispatcher.on('user:settings:edit:confirmed', function (data, model) {\n\t\tvar locale = data.locale.split('-'),\n\t\t\tlocales = model.getAvailableLocales(),\n\t\t\tcountry = locale[1],\n\t\t\tlanguage = locale[0];\n\n\t\t// User prefs to update:\n\t\tvar prefs = {\n\t\t\tuserCountry: country,\n\t\t\tuserLanguage: language,\n\t\t};\n\n\t\tmodel.setUserPreferences(prefs).then(\n\t\t\tfunction (data) {\n\t\t\t\tvar locale = data.userLanguage + '-' + data.userCountry;\n\t\t\t\t// Compare the current locale to the user's preferences\n\t\t\t\tif (i18n.language !== locale) {\n\t\t\t\t\t// Set the locale cookie\n\t\t\t\t\ti18n.changeLanguage(locale);\n\t\t\t\t\t// reload only if locale pref changed\n\t\t\t\t\t_.delay(function () {\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t}, 1000);\n\t\t\t\t}\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('user:settings:edit:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\t// Error\n\t\t\t\tdispatcher.trigger('user:settings:edit:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:user#user:settings:edit:error\n\t * @param {string} error Error string\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'user:settings:edit:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:settings:edit:success\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'user:settings:edit:success',\n\t\tfunction () {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'user',\n\t\t\t\ttitle: i18n.t('i18n.preferencesUpdated', {\n\t\t\t\t\tdefaultValue: 'Preferences updated',\n\t\t\t\t}),\n\t\t\t\tdescription: i18n.t('i18n.preferencesSuccessfullyUpdated', {\n\t\t\t\t\tdefaultValue: 'Preferences successfully updated',\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t// Selection\n\t// TODO: DAM-13422 - Commenting this for NetX 8.12 release\n\t// We need to look into implementing this feature in NetX 9\n\t// /**\n\t// * @event module:user#user:settings:edit:cart:confirmed\n\t// * @param {object} data Form data for user cart preferences\n\t// * @param {Netx.Models.UserPrefs} model NetX user preferences model\n\t// * @fires module:user#user:settings:edit:cart:error\n\t// * @fires module:user#user:settings:edit:cart:success\n\t// */\n\t// dispatcher.on('user:settings:edit:cart:confirmed', function(data, model) {\n\t// \tmodel.setUserPreferences(data).then(\n\t// \t\tfunction(data) {\n\t// \t\t\t// Success\n\t// \t\t\tdispatcher.trigger('user:settings:edit:cart:success');\n\t// \t\t},\n\t// \t\tfunction(err) {\n\t// \t\t\tdispatcher.trigger('user:settings:edit:cart:error', err);\n\t// \t\t},\n\t// \t);\n\t// });\n\t// /**\n\t// * @event module:user#user:settings:edit:cart:error\n\t// * @param {object} error Error object\n\t// * @fires module:app#app:alert\n\t// */\n\t// dispatcher.on(\n\t// \t'user:settings:edit:cart:error',\n\t// \tfunction(error) {\n\t// \t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t// \t},\n\t// \twindow,\n\t// );\n\t// /**\n\t// * @event module:user#user:settings:edit:cart:success\n\t// */\n\t// dispatcher.on(\n\t// \t'user:settings:edit:cart:success',\n\t// \tfunction() {\n\t// \t\tdispatcher.trigger('notification', {\n\t// \t\t\tmodule: 'user',\n\t// \t\t\ttitle: i18n.t('i18n.preferencesUpdated', {\n\t// \t\t\t\tdefaultValue: 'Preferences updated',\n\t// \t\t\t}),\n\t// \t\t\tdescription: i18n.t('i18n.preferencesSuccessfullyUpdated', {\n\t// \t\t\t\tdefaultValue: 'Preferences successfully updated',\n\t// \t\t\t}),\n\t// \t\t\ttype: 'success',\n\t// \t\t});\n\t// \t},\n\t// \twindow,\n\t// );\n\n\t/**\n\t * @event module:user#user:settings:edit:email:confirmed\n\t * @param {object} data Form data for user email preferences\n\t * @param {Netx.Models.UserPrefs} model NetX user preferences model\n\t * @fires module:user#user:settings:edit:email:error\n\t * @fires module:user#user:settings:edit:email:success\n\t */\n\tdispatcher.on('user:settings:edit:email:confirmed', function (data, model) {\n\t\tmodel.setUserPreferences(data).then(\n\t\t\tfunction (data) {\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('user:settings:edit:email:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('user:settings:edit:email:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:user#user:settings:edit:email:error\n\t * @param {object} error Error object\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'user:settings:edit:email:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:settings:edit:email:success\n\t */\n\tdispatcher.on(\n\t\t'user:settings:edit:email:success',\n\t\tfunction () {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'user',\n\t\t\t\ttitle: i18n.t('i18n.preferencesUpdated', {\n\t\t\t\t\tdefaultValue: 'Preferences updated',\n\t\t\t\t}),\n\t\t\t\tdescription: i18n.t('i18n.preferencesSuccessfullyUpdated', {\n\t\t\t\t\tdefaultValue: 'Preferences successfully updated',\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:settings:edit:language:confirmed\n\t * @param {object} data Form data for user language preferences\n\t * @param {Netx.Models.UserPrefs} model NetX user preferences model\n\t * @fires module:user#user:settings:edit:language:error\n\t * @fires module:user#user:settings:edit:language:success\n\t */\n\tdispatcher.on('user:settings:edit:language:confirmed', function (\n\t\tdata,\n\t\tmodel,\n\t) {\n\t\tvar locale = data.locale.split('-'),\n\t\t\tlocales = model.getAvailableLocales(),\n\t\t\tcountry = locale[1],\n\t\t\tlanguage = locale[0];\n\n\t\t// User prefs to update:\n\t\tvar prefs = {\n\t\t\tuserCountry: country,\n\t\t\tuserLanguage: language,\n\t\t};\n\n\t\tmodel.setUserPreferences(prefs).then(\n\t\t\tfunction (data) {\n\t\t\t\tvar locale = data.userLanguage + '-' + data.userCountry;\n\t\t\t\t// Compare the current locale to the user's preferences\n\t\t\t\tif (i18n.language !== locale) {\n\t\t\t\t\t// Set the locale cookie\n\t\t\t\t\ti18n.changeLanguage(locale);\n\t\t\t\t\t// reload only if locale pref changed\n\t\t\t\t\t_.delay(function () {\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t}, 1000);\n\t\t\t\t}\n\t\t\t\t// Success\n\t\t\t\tdispatcher.trigger('user:settings:edit:language:success');\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('user:settings:edit:language:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:user#user:settings:edit:language:error\n\t * @param {object} error Error object\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'user:settings:edit:language:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:settings:edit:language:success\n\t */\n\tdispatcher.on(\n\t\t'user:settings:edit:language:success',\n\t\tfunction () {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'user',\n\t\t\t\ttitle: i18n.t('i18n.preferencesUpdated', {\n\t\t\t\t\tdefaultValue: 'Preferences updated',\n\t\t\t\t}),\n\t\t\t\tdescription: i18n.t('i18n.preferencesSuccessfullyUpdated', {\n\t\t\t\t\tdefaultValue: 'Preferences successfully updated',\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\n\t/**\n\t * @event module:user#user:settings:edit:theme:confirmed\n\t * @param {object} values Values\n\t * @param {module:user/models/userPrefs} model User preferences\n\t * @fires module:user#user:settings:edit:theme:error\n\t * @fires module:user#user:settings:edit:theme:success\n\t */\n\tdispatcher.on('user:settings:edit:theme:confirmed', function (data, model) {\n\t\tconst mode = data.mode;\n\t\tmodel.setUserPreference(themeProperties.userPref, mode).then(\n\t\t\tfunction (data) {\n\t\t\t\tNetx.setThemeMode(mode);\n\t\t\t\tdispatcher.trigger('user:settings:edit:theme:success', model);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('user:settings:edit:theme:error', err);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:user#user:settings:edit:theme:error\n\t * @param {object} error Error\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'user:settings:edit:theme:error',\n\t\tfunction (error) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:settings:edit:theme:success\n\t * @param {module:user/models/userPrefs} model User preferences\n\t * @fires module:notification#notification\n\t */\n\tdispatcher.on(\n\t\t'user:settings:edit:theme:success',\n\t\tfunction (model) {\n\t\t\tdispatcher.trigger('notification', {\n\t\t\t\tmodule: 'user',\n\t\t\t\ttitle: i18n.t('i18n.preferencesUpdated', {\n\t\t\t\t\tdefaultValue: 'Preferences updated',\n\t\t\t\t}),\n\t\t\t\tdescription: i18n.t('i18n.preferencesSuccessfullyUpdated', {\n\t\t\t\t\tdefaultValue: 'Preferences successfully updated',\n\t\t\t\t}),\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t},\n\t\twindow,\n\t);\n\t//=================================\n\t//\t!USER SETTINGS\n\t//=================================\n\n\t//=================================\n\t//\tUSER SELECTORS\n\t//=================================\n\t/**\n\t * @event module:user#user:selector:fetch\n\t * @param {Netx.Model.UserSelector} userSelector User selector\n\t * @fires module:user#user:selectors:fetch:error\n\t */\n\tdispatcher.on('user:selector:fetch', function (userSelector) {\n\t\tuserSelector.fetch().then(\n\t\t\tfunction () {\n\t\t\t\tdispatcher.trigger('user:selectors:fetch:success', userSelector);\n\t\t\t},\n\t\t\tfunction (err) {\n\t\t\t\tdispatcher.trigger('user:selectors:fetch:error', err, userSelector);\n\t\t\t},\n\t\t);\n\t});\n\t/**\n\t * @event module:user#user:selectors:fetch:error\n\t * @param {Netx.Model.UserSelector} userSelector User selector\n\t * @fires module:app#app:alert\n\t */\n\tdispatcher.on(\n\t\t'user:selector:fetch:error',\n\t\tfunction (error, userSelector) {\n\t\t\tdispatcher.trigger('app:alert', error, i18n.t('i18n.error'));\n\t\t},\n\t\twindow,\n\t);\n\t/**\n\t * @event module:user#user:selector:reset\n\t * @param {Netx.Models.UserSelector} userSelector User selector\n\t * @param {object} userSelectorObject User selector object\n\t * @fires module:user#user:selectors:reset:error\n\t */\n\tdispatcher.on('user:selector:reset', function (\n\t\tuserSelector,\n\t\tuserSelectorObject,\n\t) {\n\t\tuserSelector.reset(userSelectorObject);\n\t});\n\t/**\n\t * @event module:user#user:selector:toggle\n\t * @param {Netx.Model.UserSelectors} userSelector User selector\n\t * @param {number} id Id of user to toggle\n\t * @param {string} type Selector type (user/group)\n\t * @fires module:user#user:selector:toggle:error\n\t */\n\tdispatcher.on('user:selector:toggle:member', function (\n\t\tuserSelector,\n\t\tid,\n\t\ttype,\n\t) {\n\t\tuserSelector.toggleMember(id, type);\n\t});\n\t/**\n\t * @event module:user#user:selector:toggle:all\n\t * @param {Netx.Model.UserSelectors} userSelector User selector\n\t * @param {boolean} all All selected\n\t */\n\tdispatcher.on('user:selector:toggle:all', function (userSelector, all) {\n\t\tall ? userSelector.selectAll() : userSelector.deselectAll();\n\t});\n\t//=================================\n\t//\t!USER SELECTORS\n\t//=================================\n\n\t//=================================\n\t//\t!EVENT LISTENERS\n\t//=================================\n\n\t// Wait for all boostrap loads to complete.\n\t$.when.apply($, NS.bootstrap).then(function () {\n\t\tdelete NS.bootstrap;\n\t\tdispatcher.trigger('user:extend', NS);\n\t\tdispatcher.trigger('user:initialized', NS);\n\t});\n});\n\nexport default {\n\tinitialize(opts) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tdispatcher.once('user:initialized', () => {\n\t\t\t\tresolve(routes);\n\t\t\t});\n\t\t\tdispatcher.trigger('user:init');\n\t\t});\n\t},\n};\n","/**\n * User module\n */\n\nimport actions from './actions';\nimport menus from './menus';\nimport controller from './controller';\n\n/**\n * @property {object} exports - Our module exports\n * @property {string} exports.namespace - Module namespace\n * @property {function} exports.initialize - Module initializer\n */\nexport default {\n\tnamespace: 'user',\n\tinitialize() {\n\t\t// Register actions\n\t\tNetx.Actions.Register(actions);\n\t\t// Extend menus\n\t\tNetx.addMenus(menus);\n\n\t\treturn controller.initialize();\n\t},\n};\n","import { generateUtilityClass, generateUtilityClasses } from '@mui/base';\nexport function getSwitchUtilityClass(slot) {\n return generateUtilityClass('MuiSwitch', slot);\n}\nconst switchClasses = generateUtilityClasses('MuiSwitch', ['root', 'edgeStart', 'edgeEnd', 'switchBase', 'colorPrimary', 'colorSecondary', 'sizeSmall', 'sizeMedium', 'checked', 'disabled', 'input', 'thumb', 'track']);\nexport default switchClasses;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"className\", \"color\", \"edge\", \"size\", \"sx\"];\n// @inheritedComponent IconButton\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { refType } from '@mui/utils';\nimport { unstable_composeClasses as composeClasses } from '@mui/base';\nimport { alpha, darken, lighten } from '@mui/system';\nimport capitalize from '../utils/capitalize';\nimport SwitchBase from '../internal/SwitchBase';\nimport useThemeProps from '../styles/useThemeProps';\nimport styled from '../styles/styled';\nimport switchClasses, { getSwitchUtilityClass } from './switchClasses';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n edge,\n size,\n color,\n checked,\n disabled\n } = ownerState;\n const slots = {\n root: ['root', edge && `edge${capitalize(edge)}`, `size${capitalize(size)}`],\n switchBase: ['switchBase', `color${capitalize(color)}`, checked && 'checked', disabled && 'disabled'],\n thumb: ['thumb'],\n track: ['track'],\n input: ['input']\n };\n const composedClasses = composeClasses(slots, getSwitchUtilityClass, classes);\n return _extends({}, classes, composedClasses);\n};\n\nconst SwitchRoot = styled('span', {\n name: 'MuiSwitch',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.edge && styles[`edge${capitalize(ownerState.edge)}`], styles[`size${capitalize(ownerState.size)}`]];\n }\n})(({\n ownerState\n}) => _extends({\n display: 'inline-flex',\n width: 34 + 12 * 2,\n height: 14 + 12 * 2,\n overflow: 'hidden',\n padding: 12,\n boxSizing: 'border-box',\n position: 'relative',\n flexShrink: 0,\n zIndex: 0,\n // Reset the stacking context.\n verticalAlign: 'middle',\n // For correct alignment with the text.\n '@media print': {\n colorAdjust: 'exact'\n }\n}, ownerState.edge === 'start' && {\n marginLeft: -8\n}, ownerState.edge === 'end' && {\n marginRight: -8\n}, ownerState.size === 'small' && {\n width: 40,\n height: 24,\n padding: 7,\n [`& .${switchClasses.thumb}`]: {\n width: 16,\n height: 16\n },\n [`& .${switchClasses.switchBase}`]: {\n padding: 4,\n [`&.${switchClasses.checked}`]: {\n transform: 'translateX(16px)'\n }\n }\n}));\nconst SwitchSwitchBase = styled(SwitchBase, {\n name: 'MuiSwitch',\n slot: 'SwitchBase',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.switchBase, {\n [`& .${switchClasses.input}`]: styles.input\n }, ownerState.color !== 'default' && styles[`color${capitalize(ownerState.color)}`]];\n }\n})(({\n theme\n}) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 1,\n // Render above the focus ripple.\n color: theme.vars ? theme.vars.palette.Switch.defaultColor : `${theme.palette.mode === 'light' ? theme.palette.common.white : theme.palette.grey[300]}`,\n transition: theme.transitions.create(['left', 'transform'], {\n duration: theme.transitions.duration.shortest\n }),\n [`&.${switchClasses.checked}`]: {\n transform: 'translateX(20px)'\n },\n [`&.${switchClasses.disabled}`]: {\n color: theme.vars ? theme.vars.palette.Switch.defaultDisabledColor : `${theme.palette.mode === 'light' ? theme.palette.grey[100] : theme.palette.grey[600]}`\n },\n [`&.${switchClasses.checked} + .${switchClasses.track}`]: {\n opacity: 0.5\n },\n [`&.${switchClasses.disabled} + .${switchClasses.track}`]: {\n opacity: theme.vars ? theme.vars.opacity.switchTrackDisabled : `${theme.palette.mode === 'light' ? 0.12 : 0.2}`\n },\n [`& .${switchClasses.input}`]: {\n left: '-100%',\n width: '300%'\n }\n}), ({\n theme,\n ownerState\n}) => _extends({\n '&:hover': {\n backgroundColor: theme.vars ? `rgba(${theme.vars.palette.action.activeChannel} / ${theme.vars.palette.action.hoverOpacity})` : alpha(theme.palette.action.active, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n}, ownerState.color !== 'default' && {\n [`&.${switchClasses.checked}`]: {\n color: (theme.vars || theme).palette[ownerState.color].main,\n '&:hover': {\n backgroundColor: theme.vars ? `rgba(${theme.vars.palette[ownerState.color].mainChannel} / ${theme.vars.palette.action.hoverOpacity})` : alpha(theme.palette[ownerState.color].main, theme.palette.action.hoverOpacity),\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n },\n [`&.${switchClasses.disabled}`]: {\n color: theme.vars ? theme.vars.palette.Switch[`${ownerState.color}DisabledColor`] : `${theme.palette.mode === 'light' ? lighten(theme.palette[ownerState.color].main, 0.62) : darken(theme.palette[ownerState.color].main, 0.55)}`\n }\n },\n [`&.${switchClasses.checked} + .${switchClasses.track}`]: {\n backgroundColor: (theme.vars || theme).palette[ownerState.color].main\n }\n}));\nconst SwitchTrack = styled('span', {\n name: 'MuiSwitch',\n slot: 'Track',\n overridesResolver: (props, styles) => styles.track\n})(({\n theme\n}) => ({\n height: '100%',\n width: '100%',\n borderRadius: 14 / 2,\n zIndex: -1,\n transition: theme.transitions.create(['opacity', 'background-color'], {\n duration: theme.transitions.duration.shortest\n }),\n backgroundColor: theme.vars ? theme.vars.palette.common.onBackground : `${theme.palette.mode === 'light' ? theme.palette.common.black : theme.palette.common.white}`,\n opacity: theme.vars ? theme.vars.opacity.switchTrack : `${theme.palette.mode === 'light' ? 0.38 : 0.3}`\n}));\nconst SwitchThumb = styled('span', {\n name: 'MuiSwitch',\n slot: 'Thumb',\n overridesResolver: (props, styles) => styles.thumb\n})(({\n theme\n}) => ({\n boxShadow: (theme.vars || theme).shadows[1],\n backgroundColor: 'currentColor',\n width: 20,\n height: 20,\n borderRadius: '50%'\n}));\nconst Switch = /*#__PURE__*/React.forwardRef(function Switch(inProps, ref) {\n const props = useThemeProps({\n props: inProps,\n name: 'MuiSwitch'\n });\n\n const {\n className,\n color = 'primary',\n edge = false,\n size = 'medium',\n sx\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const ownerState = _extends({}, props, {\n color,\n edge,\n size\n });\n\n const classes = useUtilityClasses(ownerState);\n\n const icon = /*#__PURE__*/_jsx(SwitchThumb, {\n className: classes.thumb,\n ownerState: ownerState\n });\n\n return /*#__PURE__*/_jsxs(SwitchRoot, {\n className: clsx(classes.root, className),\n sx: sx,\n ownerState: ownerState,\n children: [/*#__PURE__*/_jsx(SwitchSwitchBase, _extends({\n type: \"checkbox\",\n icon: icon,\n checkedIcon: icon,\n ref: ref,\n ownerState: ownerState\n }, other, {\n classes: _extends({}, classes, {\n root: classes.switchBase\n })\n })), /*#__PURE__*/_jsx(SwitchTrack, {\n className: classes.track,\n ownerState: ownerState\n })]\n });\n});\nprocess.env.NODE_ENV !== \"production\" ? Switch.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * If `true`, the component is checked.\n */\n checked: PropTypes.bool,\n\n /**\n * The icon to display when the component is checked.\n */\n checkedIcon: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The color of the component.\n * It supports both default and custom theme colors, which can be added as shown in the\n * [palette customization guide](https://mui.com/material-ui/customization/palette/#adding-new-colors).\n * @default 'primary'\n */\n color: PropTypes\n /* @typescript-to-proptypes-ignore */\n .oneOfType([PropTypes.oneOf(['default', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), PropTypes.string]),\n\n /**\n * The default checked state. Use when the component is not controlled.\n */\n defaultChecked: PropTypes.bool,\n\n /**\n * If `true`, the component is disabled.\n */\n disabled: PropTypes.bool,\n\n /**\n * If `true`, the ripple effect is disabled.\n */\n disableRipple: PropTypes.bool,\n\n /**\n * If given, uses a negative margin to counteract the padding on one\n * side (this is often helpful for aligning the left or right\n * side of the icon with content above or below, without ruining the border\n * size and shape).\n * @default false\n */\n edge: PropTypes.oneOf(['end', 'start', false]),\n\n /**\n * The icon to display when the component is unchecked.\n */\n icon: PropTypes.node,\n\n /**\n * The id of the `input` element.\n */\n id: PropTypes.string,\n\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps: PropTypes.object,\n\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: refType,\n\n /**\n * Callback fired when the state is changed.\n *\n * @param {React.ChangeEvent<HTMLInputElement>} event The event source of the callback.\n * You can pull out the new value by accessing `event.target.value` (string).\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: PropTypes.func,\n\n /**\n * If `true`, the `input` element is required.\n */\n required: PropTypes.bool,\n\n /**\n * The size of the component.\n * `small` is equivalent to the dense switch styling.\n * @default 'medium'\n */\n size: PropTypes\n /* @typescript-to-proptypes-ignore */\n .oneOfType([PropTypes.oneOf(['medium', 'small']), PropTypes.string]),\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),\n\n /**\n * The value of the component. The DOM API casts this to a string.\n * The browser uses \"on\" as the default value.\n */\n value: PropTypes.any\n} : void 0;\nexport default Switch;"],"sourceRoot":""}