{"version":3,"sources":["components/ProgressModal/ProgressModal.module.css","components/UploadVersionModal/UploadVersionModal.module.css","components/ItemFlowsModal/ItemFlowsModal.module.css","components/RasterMapManagerModal/LayersEditor.module.css","components/RasterMapManagerModal/RasterMapModal.module.css","components/ReminderManagerModal/ReminderManagerModal.module.css","components/ExtraAttributes/ViewerControl/EnumViewerControl.module.css","containers/QueryMatch.js","components/ArchiveTargets/ArchiveTargetList/index.js","components/ArchiveTargets/ArchiveTargetList/uppyFileMatchUtils.js","components/ArchiveTargets/ArchiveTargetHeader/index.js","components/ArchiveTargets/ArchiveTargetList/ArchiveTargetCards.js","components/ArchiveTargets/ArchiveTargetList/ArchiveTargetHomeCards.js","components/ArchiveTargets/ArchiveTargetList/ArchiveTargetSearchFormCards.js","components/ArchiveTargets/ArchiveTargetSearchForm/index.js","components/ArchiveTargets/ArchiveTargetSearchItem/index.js","containers/ArchiveTargetList.js","views/upload/index.js","components/ExtraAttributes/AttributeLabel.js","data/logging.js","components/SplitPanes/Pane.js","data/utils.js","data/reducers/searchReducer.js","components/Attributes/SummaryAttribute/SummaryAttribute.module.css","components/ExtraAttributes/ViewerControl/ViewerControlBase.js","components/FilterBar/SearchBucket/SearchBucket.module.css","data/extensions.js","data/reducers/userReducer.js","components/Divider/index.js","components/Activities/Activity.module.css","containers/SettingValue/index.js","data/actions/index.js","components/ExtraAttributes/EditorControl/DateEditorControl.js","components/ExtraAttributes/EditorControl/NumberEditorControl.js","data/apiError.js","components/DocListSimple/RowResult.module.css","data/reducers/networkSelectors.js","data/reducers/selectors.js","components/AbsoluteDropdown/index.js","components/User/Avatar.js","components/FolderTree/FolderTree.module.css","__i18n/moment lazy /^/.*$/ groupOptions: {} namespace object","data/reducers/formReducer.js","__i18n/uppy lazy /^/.*$/ groupOptions: {} namespace object","components/Attributes/SummaryAttribute/ValueFacePile.js","components/Attributes/SummaryAttribute/ValueUser.js","components/Attributes/SummaryAttribute/ValueProgress.js","components/Attributes/SummaryAttribute/ValueVisualRules.js","components/Attributes/SummaryAttribute/ValueEnum.js","components/Attributes/SummaryAttribute/ValueTextLink.js","components/Attributes/SummaryAttribute/ValueFilesize.js","components/Attributes/SummaryAttribute/ValueFactory.js","views/minipicker/index.js","components/PickerModal/index.js","../node_modules/leaflet-geosearch/lib/providers lazy /^/.*/.js$/ groupOptions: {} namespace object","components/Reminder/ReminderItem.module.css","components/PageStatus/inPoint_192.png","data/toast.js","data/offline/serviceWorkerRegistration.js","index.js","containers/ActionPanel_shouldBeVisible.js","data/reducers/breadcrumbReducer.js","data/api.js","data/reducers/loginReducer.js","components/ModalCloseButton/index.js","data/history.js","containers/StickyToggle/index.js","containers/StickyToggle/style.js","containers/OfflineHandler.js","components/Attributes/SummaryAttribute/index.js","components/Attributes/index.js","components/MapModal/PlaceInput.js","components/MapModal/index.js","containers/TogglesHandler/index.js","data/reducers/treeReducer.js","data/types.js","containers/SplitPanes/index.js","components/Loader/Loading.js","components/Status/Loading.js","components/Loader/index.js","data/offline/offlineQueue.js","components/ExtraAttributes/EditorControl/TextEditorControl.js","components/UploadImage/UploadImage.module.css","components/DocList/CellContent.module.css","components/SearchResultGrid/CellContent.module.css","components/Rename/index.js","components/Searchcrumb/index.js","containers/Searchcrumb.js","components/MainLayout/CrumbSelector.js","components/ToggleBar/index.js","containers/ToggleBar.js","components/MainLayout/index.js","components/MainLayout/usePendingOfflineChanges.js","components/ItemActionPanel/index.js","components/Modal/index.js","components/ExtraAttributes/ViewerControl/LinkViewerControl.js","components/DocListSimple/Thumbnail.js","containers/Moment.js","data/integrationTestUtils.js","components/ExtraAttributes/ViewerControl/UserIdViewerControl.js","components/Form/utils.js","components/Form/index.js","components/ExtraAttributes/EditorControl/HiddenEditorControl.js","components/FormEdit/FieldEdit.js","components/NavigationBlock/index.js","components/FormEdit/index.js","components/FormEditHeader/index.js","containers/Form.js","components/Breadcrumb/BreadcrumbPart.js","components/Breadcrumb/BreadcrumbFavorite.js","components/Breadcrumb/Breadcrumb.js","components/Breadcrumb/index.js","components/ContextMenu/Handler.js","containers/Breadcrumb.js","components/ExtraAttributes/ViewerControl/StaticViewerControl.js","data/ApiCatalog.js","data/ApiManagerBase.js","components/Status/Overlay.js","components/Status/index.js","components/LockInfo/LockInfo.module.css","data/ApiManagerOffline.js","data/ApiManager.js","data/reducers/serviceWorkerReducer.js","components/ActionPanel/ActionsButton.js","hooks/AbortController.js","hooks/Broadcast.js","hooks/NetworkStatus.js","hooks/PostMessage/Handler.js","hooks/PostMessage/index.js","components/GeoPointActionPanel/index.js","hooks/PersistSetting.js","hooks/LocalStore.js","hooks/Moment.js","hooks/Uppy.js","hooks/PdfHighlight.js","hooks/OfflineHandler.js","hooks/ArrowNavigation.js","components/UploadSelection/index.js","data/panes.js","components/GeoPointInput/GeoPointInput.module.css","components/SearchForm/AttributeSearch.module.css","components/ArchiveTargets/ArchiveTargetSearchForm/ArchiveTargetSearchForm.module.css","data/storeHelper.js","hooks/PostMessage/Utils.js","components/ExtraAttributes/ViewerControl/ImageViewerControl.js","data/reducers/workflowReducer.js","data/reducers/docsLayoutReducer.js","data/reducers/settingsReducer.js","data/reducers/currentItemReducer.js","data/reducers/searchFormsReducer.js","data/reducers/offlineReducer.js","components/ExtraAttributes/EditorControl/MemoEditorControl.js","components/FilterBar/SearchBucket/Name.js","components/FilterBar/SearchBucket/Header.js","components/FilterBar/SearchBucket/AllItem.js","components/FilterBar/SearchBucket/MenuItem.js","components/FilterBar/SearchBucket/Button.js","components/FilterBar/SearchBucket/Icon.js","components/FilterBar/SearchBucket/index.js","components/ExtraAttributes/EAForm.js","components/LocalContactInfo/index.js","components/Header/index.js","components/User/UserGroup.js","components/User/PrincipalAvatar.js","components/NativeSelect/NativeSelect.module.css","components/DocListSimple/RowResultByLayout.module.css","components/Divider/Divider.module.css","components/CommandActions/itemViews/itemView_docListGallery.module.css","components/CommandActions/itemViews/itemView_workflow.module.css","components/ShareModal/EditorControl/SharePrincipal.module.css","data/bowser.js","components/GeoRasterInput/GeoRasterInput.module.css","components/Header/Header.module.css","components/RasterMapManagerModal/RasterLayer.module.css","components/ExtraAttributes/GridEditorControl/GridUtils.js","data/reducers/cardsReducer.js","data/reducers/thumbnailsReducer.js","data/reducers/favoritesReducer.js","data/reducers/commandActionReducer.js","components/CommandActions/searchResult_form.geoLocation.js","components/BarcodeModal/index.js","components/CommandActions/searchResult_form.barcode.js","data/barcode.js","components/CommandActions/searchResult_form.js","components/ShareModal/ViewerControl/ExternalUser.module.css","components/LocalContactInfo/LocalContactInfo.module.css","components/GeoAreaInput/GeoAreaInput.module.css","components/TreeFilter/TreeFilter.module.css","components/SearchResultCalendar/Toolbar.module.css","data/constants.js","containers/FileDropHandler/index.js","components/NativeSelect/index.js","components/SearchResult/FolderResult.js","components/SearchResult/DocumentResult.js","components/SearchResult/RowResult.js","components/SearchResult/index.js","components/SearchResultMap/index.js","components/SearchResultCalendar/Toolbar.js","components/SearchResultCalendar/index.js","components/SearchResultGrid/CellContent.js","components/SearchResultGrid/index.js","data/FilterBar.js","containers/SearchResult.js","components/ItemUriLink/index.js","data/loginFlow.js","components/CardList/index.js","data/reducers/togglesReducer.js","data/reducers/panesReducer.js","data/reducers/globalSearchReducer.js","data/reducers/globalEventsReducer.js","data/reducers/notificationReducer.js","data/queryString.js","components/ExtraAttributes/EditorControl/LookupEditorControl.js","components/ExternalLinkModal/index.js","components/NoteInput/index.js","components/Activities/Activity.js","components/Activities/ActivityList.js","components/Activities/CleanupKeepInfo.js","components/Activities/RetentionInfo.js","components/Activities/index.js","containers/Activities.js","components/GeoAreaInput/index.js","components/ExtraAttributes/EditorControl/GeoAreaEditorControl.js","data/reducers/index.js","components/ConflictModal/index.js","components/SearchResultActionPanel/index.js","components/ActionPanel/ActionCategory.js","components/ItemStatusIcons/index.js","components/Attributes/SimpleAttribute.js","components/ExtraAttributes/AttributeLabel.module.css","components/LockInfo/index.js","components/uppy-restrictions/index.js","data/context.js","components/MapButton/index.js","components/MapViewer/index.js","components/GeoPlaceInput/index.js","components/CommandActions/doc_print.js","components/LoadingIframe/index.js","components/CardList/CardItem.js","containers/FilterBar.js","components/DocListFilterModal/RelativeDatePicker.js","components/LocatorButton/geoLocatorOptions.js","components/ProgressModal/index.js","data/ApiCacheManager.js","data/ApiManagerMakeAvailableOffline.js","data/sagas/offlineSaga.js","data/sagas/userSaga.js","data/sagas/favoritesSaga.js","data/sagas/cardsSaga.js","data/sagas/workflowSaga.js","data/sagas/treeSaga.js","data/sagas/docsSaga.js","data/sagas/docsLayoutSaga.js","data/sagas/currentItemSaga.js","data/sagas/searchSaga.js","data/sagas/thumbnailsSaga.js","data/sagas/notificationsSaga.js","data/sagas/toastSaga.js","data/sagas/commandActionSaga.js","data/sagas/rootSaga.js","components/ActionPanel/ItemAction.js","components/DocListSimple/RowResultByLayout.js","components/CommandActions/itemViews/itemView_docListGallery.js","components/CommandActions/itemViews/itemView_docList.js","components/CommandActions/itemViews/itemView_activityList.js","components/CommandActions/itemViews/itemView_workflow.js","components/Reminder/EnumIcon.js","components/Reminder/ReminderItem.js","components/CommandActions/itemViews/itemView_reminder.js","components/CommandActions/itemViews/itemView_filter.js","components/CommandActions/itemViews/Factory.js","components/ActionPanel/ItemActions.js","components/ActionPanel/index.js","containers/ActionPanel.js","data/itemActions.js","components/FilterBar/ViewModesMenu.js","components/FilterBar/ViewModesButtons.js","components/FilterBar/ViewModes.js","data/actionMenus.js","components/ActionsMenu/Render.js","components/ActionsMenu/index.js","components/DocListSimple/RowResult.js","components/DocListSimple/index.js","components/NoDocs/OpenFiltersButton.js","components/NoDocs/index.js","components/SearchFormHeader/ToggleMode.js","components/SearchFormHeader/index.js","components/Status/Status.module.css","data/toast.module.css","components/Modal/Modal.module.css","components/ActionPanel/ItemAction.module.css","components/CommandActions/itemViews/itemView_docList.module.css","containers/StickyToggle/StickyToggle.module.css","components/NoteInput/NoteInput.module.css","components/Activities/Activities.module.css","components/ItemActionPanel/ItemActionPanel.module.css","components/MapModal/PlaceInput.module.css","components/GeoRadiusInput/GeoRadiusInput.module.css","components/FormModal/FormModal.module.css","components/PageStatus/index.js","data/store.js","data/persistTransforms.js","hooks/PostMessage/Actions/ArrowNavigation.js","hooks/PostMessage/Actions/PdfHighlight.js","hooks/PostMessage/Actions/PdfSignature.js","hooks/PostMessage/Actions/PdfPrint.js","hooks/PostMessage/Actions/Modal.js","hooks/PostMessage/Actions/Notification.js","hooks/NetworkStatus.module.css","components/ActionPanel/ItemActions.module.css","components/NoData/index.js","components/FilterBar/ViewModes.module.css","components/User/UserGroup.module.css","components/ActionPanel/ActionCategory.module.css","components/ExtraAttributes/Error.module.css","components/ExtraAttributes/EditorControl/PrincipalEditorControl.module.css","components/ShareModal/ViewerControl/Attachments.module.css","components/ShareModal/ShareModal.module.css","components/MapModal/MapModal.module.css","components/MapViewer/utils.js","components/PageStatus/PageStatus.module.css","components/SearchOperators/SearchOperators.module.css","components/SearchResult/SearchResult.module.css","components/ArchiveTargets/ArchiveTargetSearchItem/ArchiveTargetSearchItem.module.css","components/CommandActions/itemFlows/itemFlow_document.module.css","data/storage.js","components/MultiSelectionActionPanel/index.js","containers/LayoutLoader/index.js","components/DocListFilterBar/index.js","components/DocList/CellContent.js","components/DocList/index.js","components/DocListFilterModal/Operators.js","components/DocListFilterModal/DatePicker.js","components/DocListFilterModal/FilterDateValue.js","components/DocListFilterModal/BoolPicker.js","components/DocListFilterModal/FilterValue.js","components/DocListFilterModal/index.js","containers/UploadHandler/index.js","containers/DocList.js","containers/MultiSelection/Bucket.js","containers/MultiSelection/Checkbox.js","containers/MultiSelection/index.js","containers/SuggestionHandler/index.js","components/ExtraAttributes/Error.js","components/ExtraAttributes/EditorControl/FormsyEditorBase.js","components/ExtraAttributes/ViewerControl/EmailViewerControl.js","components/ExtraAttributes/ViewerControl/TelViewerControl.js","containers/ViewerKeysHandler/index.js","components/TreeFilter/index.js","components/DocViewer/HandleSignedPdf.js","components/DocViewer/HandlePdfPrint.js","components/DocViewer/ViewerUrl.js","components/DocViewer/PdfArrowNavigation.js","components/DocViewer/index.js","components/InlineViewer/index.js","containers/DocViewer.js","components/NarrowToggle/index.js","components/FilterBar/CombinedFiltersMenu.js","components/FilterBar/index.js","components/FolderTree/index.js","containers/FolderTree.js","components/MapViewer/providerSupport.js","components/CommandActions/ip_commandAction.js","components/CommandActions/ip_archive.js","components/CommandActions/ip_browse.js","components/CommandActions/ip_edit.js","components/CommandActions/ip_properties.js","components/CommandActions/folder_delete.js","components/CommandActions/folder_editClassification.js","components/ExtraAttributes/EditorControl/EnumEditorControl.js","components/ShareModal/ShareActionForm.js","components/ShareModal/EditorControl/ShareAction.js","components/ExtraAttributes/EditorControl/PrincipalEditorControl.js","components/ShareModal/SharePrincipalForm.js","components/ShareModal/EditorControl/SharePrincipal.js","components/ShareModal/ViewerControl/ExternalUser.js","components/ShareModal/Utils.js","components/ShareModal/ViewerControl/ShareAction.js","components/ShareModal/ViewerControl/Attachments.js","components/ShareModal/ShareForm.js","components/ShareModal/index.js","components/CommandActions/share.js","components/CommandActions/folder_emailLink.js","components/CommandActions/folder_preview.js","components/CommandActions/search_favorite.js","components/CommandActions/search_preview.js","components/CommandActions/doclist_resetFilters.js","components/CommandActions/doclist_exportCsv.js","components/CommandActions/doc_download.js","components/CommandActions/doc_delete.js","components/ModalFullscreenButton/index.js","components/DocModal/index.js","components/CommandActions/doc_preview.js","components/CommandActions/doc_related.js","components/UploadModal/index.js","components/CommandActions/doc_upload.js","components/UploadVersionModal/index.js","components/CommandActions/doc_uploadVersion.js","components/CommandActions/doc_emailLink.js","components/CommandActions/doc_emailAttachment.js","components/CommandActions/doc_editClassification.js","components/CommandActions/doc_editWebDav.js","components/CommandActions/doc_editCloud.js","components/CommandActions/favorite.js","components/CommandActions/link.js","components/CommandActions/lock.js","components/CommandActions/unlock.js","components/CommandActions/subscribe.js","components/CommandActions/unsubscribe.js","components/CommandActions/share_web.js","components/NameModal/index.js","components/CommandActions/createFolder_template.js","components/ListWorkflowsModal/index.js","components/CommandActions/wf_start.js","components/ItemFlowsList/FlowCardImage.js","components/ItemFlowsList/index.js","views/itemFlows/CategoryFilter.js","components/CommandActions/itemFlows/itemFlow_custom.js","components/CommandActions/itemFlows/Form.js","components/CommandActions/itemFlows/itemFlow_folder.js","components/CommandActions/itemFlows/CustomUploadSelection.js","components/CommandActions/itemFlows/DocumentSelection.js","components/CommandActions/itemFlows/itemFlow_document.js","components/CommandActions/itemFlows/itemFlow_docTemplate.js","components/CommandActions/itemFlows/itemFlow_folderTemplate.js","components/CommandActions/itemFlows/Factory.js","views/itemFlows/index.js","containers/ItemFlows.js","components/ItemFlowsModal/index.js","components/CommandActions/itemFlows.js","components/CommandActions/transfer.js","components/CommandActions/recyclebin_docClear.js","components/CommandActions/recyclebin_docRestore.js","components/CommandActions/recyclebin_folderClear.js","components/CommandActions/recyclebin_folderRestore.js","components/FormModal/index.js","components/CommandActions/editClassification.js","components/CommandActions/clipboard_copyItemUri.js","components/CommandActions/clipboard_copyItemLink.js","components/RasterMapManagerModal/RasterLayer.js","components/RasterMapManagerModal/LayersEditor.js","components/RasterMapManagerModal/index.js","components/CommandActions/raster_manage.js","components/ExtraAttributes/ViewerControl/EnumViewerControl.js","components/Reminder/ReminderForm.js","components/ReminderManagerModal/index.js","components/CommandActions/reminder_manage.js","components/CommandActions/offline_add.js","components/CommandActions/offline_delete.js","components/CommandActions/offline_syncItem.js","components/CommandActions/index.js","components/uppy-exif/index.js","data/uppy.js","components/ConfirmModal/index.js","components/CommandActions/CommandActionButton.js","components/DocListFilterModal/Utils.js","data/actions/actionTypes.js","data/reducers/docsReducer.js","components/CountBadge/index.js","components/DocModal/TopRowExtras.js","views/document/index.js","data/toggles.js","components/ExtraAttributes/ViewerControl/LocationViewerControl.js","components/ExtraAttributes/ViewerControl/GeoRasterViewerControl.js","components/ExtraAttributes/EditorControl/LoadableGeoPointEditorControl.js","components/SearchResult/RowResult.module.css","components/Tree/index.js","containers/LocalStore.js","components/GeoRadiusInput/index.js","components/SearchOperators/index.js","components/SearchForm/toSearchEditor.js","components/SearchForm/toBetweenEditor.js","components/SearchForm/GeoRadiusEditorControl.js","components/SearchForm/RelativeDateEditorControl.js","components/SearchForm/AttributeSearch.js","components/SearchForm/index.js","containers/SearchForm.js","components/UploadImage/cropImage.js","components/UploadImage/rotation.js","components/UploadImage/clampInRange.js","components/UploadImage/zoom.js","components/UploadImage/ImageEditorModal.js","components/UploadImage/index.js","components/ExtraAttributes/EditorControl/ImageEditorControl.js","components/LocatorButton/target.svg","components/LocatorButton/index.js","components/GeoPointInput/index.js","components/GeoRasterInput/index.js","components/ExtraAttributes/EditorControl/GeoRasterEditorControl.js","components/Status/Overlay.module.css","components/ConfirmModal/ConfirmModal.module.css","components/AbsoluteDropdown/AbsoluteDropdown.module.css","components/NoData/NoData.module.css","components/DocListSimple/DocListSimple.module.css","components/User/Avatar.module.css","components/ExtraAttributes/ViewerControl/LinkViewer.module.css","components/DocListSimple/Thumbnail.module.css","components/ActionsMenu/ActionsMenu.module.css","components/ShareModal/EditorControl/ShareAction.module.css","components/ShareModal/ViewerControl/ShareAction.module.css","components/GeoPlaceInput/GeoPlaceInput.module.css","components/ExtraAttributes/EditorControl/LookupEditorControl.module.css","components/UploadImage/ImageEditorModal.module.css","containers/GlobalEventsHandler/index.js","components/PickerModal/PickerModal.module.css","components/Tree/Tree.module.css","components/DocListFilterModal/DocListFilterModal.module.css","components/SearchFormHeader/SearchFormHeader.module.css","containers/SearchResult.module.css"],"names":["module","exports","QueryMatchRoute","location","query","render","qs","queryString","parse","search","isMatch","Object","keys","length","every","key","displayName","QueryMatch","children","React","Children","map","child","index","type","cloneElement","console","error","Route","createLink","archiveTarget","uri","searchItem","id","searchType","SearchItemType","Form","filterArchiveTargets","archiveTargets","pendingUploads","globalSites","filter","at","info","name","extras","fileTypes","file","ext","getFileExtension","toLowerCase","some","indexOf","match","replace","isFileTypeMatch","fileTags","tag","prototype","hasOwnProperty","call","ArchiveTargetList","history","usePendingUploads","globalSitesAreaSelector","onCardClick","stringify","mode","push","onMoreClick","card","a","openPickerModal","pickerType","PickerType","Folder","scopeBreadcrumb","itemUri","helpText","loc","t","CardList","status","Constants","OK","cards","filterText","toggles","CardType","Rec","Fav","Action","showOnMoreClick","itemtype","CardItemType","onClick","withRouter","ArchiveTargetHeader","onCancel","onFilterTextChange","Header","image","description","isFav","isRecent","centerComponent","borderless","placeholder","onChange","value","ArchiveTargetCards","PureComponent","state","_onFilterTextChange","this","setState","_getFilteredCards","props","c","cardType","itemtypes","Search","ArchiveTargetHomeCards","dispatch","NONE","getCardsAction","connect","ownProps","s","ArchiveTargetSearchFormCards","getSearchFormListAction","sf","count","ArchiveTargetSearchForm","_onSearch","_onSearchFormSetTarget","activeRowIndex","row","onTargetItemUri","breadcrumb","parts","className","getClassNames","styles","wrapper","fSplit","data-test","searchPanel","SearchForm","searchLabel","searchEnabled","onSearch","searchResult","SearchResult","isBreadcrumbReadonly","showFilterBar","onSetActiveRowIndex","onAutoBrowseToItem","isMoreHidden","componentDidMount","splitView","Split","sizes","direction","minSize","gutterSize","elementStyle","dimension","size","gutterStyle","componentDidUpdate","prevProps","prevState","setSizes","updateFilesPlaceholders","filters","String","forEach","newValue","tokenize","fixSearchFilterName","ArchiveTargetSearchItem","useSelector","uppyPendingFilesMetaSelector","newSearchItem","useAsync","createSearchItemAsync","onSearchFormSetTarget","useCallback","SearchFormHeader","searchForm","loading","Status","LOADING","ERROR","ArchiveTargetListContainer","targetItemUri","_fetch","getArchiveTargets","isOnline","catch","err","then","result","produces","draft","getLocalizedText","_setTargetItemUri","_onCardClick","cardItem","_onSearchFormClick","_onCancel","show","NoData","locContext","params","sfid","assign","startsWith","warn","viewName","Upload","constructor","super","_updateUppyOptions","formatId","defaults","getDefaultsConfig","setUppyRestrictions","uppy","upload","_updateFormToggle","uppyHasPendingUploads","toggle","isDisabled","isSelected","setToggles","isMultiple","_maybeResetArchiveTarget","noItemUri","_getWebDavNameHint","firstFile","getFiles","find","f","meta","_getDefaultValues","WebDavName","isEmpty","_onSaveNew","model","keepOriginalFilename","files","isFormButtonEnabled","newModel","produce","ip","replaceFileExtension","extension","setFileMeta","UploadMode","CreateDocument","JSON","failed","reset","_onClose","onClose","backupCurrentItemAction","setCurrentItemAction","componentWillUnmount","restoreCurrentItemAction","MainLayout","breadcrumbReadonly","topRowEnd","Pane","dataTest","UploadSelection","isEditMode","onSaveNew","saveLabel","savingLabel","defaultValues","newFormType","NewFormType","Document","onSaveReturnAllFields","compose","uppyHasPendingUploadsSelector","TogglesHandler","SplitPanes","paneIds","toggleIds","AttributeLabel","label","style","labelWidth","useContext","LabelSizeContext","width","trim","title","setupLogging","JL","createAjaxAppender","setOptions","batchSize","bufferSize","storeInBufferLevel","level","window","CONFIG","browserLoggingLevel","sendWithBufferLevel","url","host","basename","general","api","beforeSend","xhr","setRequestHeader","CustomHttpHeader","Authorization","accessToken","CorrelationId","correlationId","consoleAppender","createConsoleAppender","hasConsole","sendLogItems","logItems","successCallback","logItem","item","m","l","getDebugLevel","debug","n","msg","getInfoLevel","getWarnLevel","e","appenders","useState","height","dimensions","setDimensions","whitelist","onMeasure","measure","measureRef","ref","Provider","isListed","list","fileName","slice","lastIndexOf","filename","newExt","substr","hasSomeParentTheClass","element","parentNode","getAttribute","split","text","context","isValidItemUri","getFolderUri","substring","input","data","b","r","mapValues","o","entries","reduce","moveArrayItem","arr","from","to","clone","Array","splice","hasCacheSupport","performanceTester","fn","log","Error","t0","performance","now","asyncFilter","predicate","memo","asyncEvery","sleep","ms","Promise","resolve","setTimeout","classNames","join","closeMenuOnScroll","target","getValue","param","initialState","undefined","totalCount","totalTime","aggregations","form","changes","searchRequest","searchReducer","action","actionTypes","SEARCH_RESET","SEARCH_FAVRENAME_REQUEST","SEARCH_FAVRENAME_RESULT","SEARCH_FETCH_REQUEST","SEARCH_FETCH_RESULT","SEARCH_ITEM_SAVE","SEARCH_FORM_CHANGES","payload","SEARCH_FORM_FETCH_REQUEST","SEARCH_FORM_FETCH_RESULT","SEARCH_FORM_RESET","SEARCH_COUNT_REQUEST","SEARCH_COUNT_RESULT","PERSIST_PURGE","searchStatusSelector","searchErrorSelector","searchResultSelector","searchResultTotalCountSelector","searchRequestSelector","searchTermsSelector","terms","searchItemSelector","searchFormStatusSelector","searchFormResultSelector","searchFormIdSelector","searchFormChangesSelector","searchCountStatusSelector","searchCountResultSelector","searchCountAggregationsSelector","ViewerControlBase","ctx","PaneSizeContext","computedStyle","useMemo","maxWidth","Date","toLocalJSON","pad","number","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","toFixed","crypto","require","randomUUID","getRandomValues","Uint8Array","toString","sites","mainNavigation","isWfEnabled","isAdmin","avatar","hasOfflineItems","itemActions","categories","actions","userReducer","USER_FETCH_REQUESTED","USER_FETCH_RESULT","rest","favorites","USER_SITES_RESULT","LOGIN_SIGNOUT","userIdSelector","user","userStatusSelector","userCorrelationIdSelector","userSitesSelector","userMainNavigationSelector","userIsAdminSelector","userIsWfEnabledSelector","userLanguageSelector","language","userDecimalSeparator","decimalSeparator","userThousandSeparator","thousandSeparator","userItemActionsSelector","userHasOfflineItemsSelector","Divider","header","hideHR","defaultExpanded","expanded","expandedFromProps","unmountOnExit","mountOnEnter","usePersistSetting","defaultValue","setExpanded","useEffect","main","aria-expanded","textNoHR","fa","fixedWidth","hr","in","SettingValue","namespace","WrappedComponent","PP","_setValue","setSettingAction","extraProps","setValue","getDisplayName","currentValue","togglesChangeAction","TOGGLES_CHANGE","persistTogglesAction","TOGGLES_PERSIST","togglesUpdateCounterAction","counts","TOGGLES_UPDATECOUNTER","getUserAction","getUserResultAction","message","receivedAt","setSitesAction","setLoginResultAction","idToken","expiresOn","expiresIn","LOGIN_RESULT","loginSignoutAction","getGlobalSearchDefaultAction","GLOBALDEFAULTSEARCH_FETCH_REQUEST","globalSearchDefaultResultAction","options","GLOBALDEFAULTSEARCH_FETCH_RESULT","getFavoritesAction","FAVORITES_FETCH_REQUEST","getFavoritesResultAction","FAVORITES_FETCH_RESULT","getWorkflowCards","WF_FETCH_REQUESTED","getWorkflowCardsResult","WF_FETCH_RESULT","CARDS_FETCH_REQUESTED","getCardsResultAction","CARDS_FETCH_RESULT","getTreeAction","deep","all","TREE_FETCH_REQUEST","getTreeResultAction","tree","TREE_FETCH_RESULT","nodes","items","isRoot","isBrowsable","searchResetAction","SEARCH_FORM_LIST_FETCH_REQUEST","getSearchFormListResultAction","SEARCH_FORM_LIST_FETCH_RESULT","setSearchFormChangesAction","getSearchFormAction","getSearchFormResultAction","searchFormResetAction","setSearchItemAction","getSearchAction","getSearchResultAction","getSearchCountAction","getSearchCountResultAction","renameSearchFavoriteAction","renameSearchFavoriteResultAction","docThumbnailRequestAction","DOCS_THUMBNAIL_REQUEST","docThumbnailResultAction","DOCS_THUMBNAIL_RESULT","setDocListViewModeAction","viewMode","SETTINGS_DOCLIST_VIEWMODE","exportDocsToCsvAction","DOCS_EXPORT_CSV","getDocsAction","pageNum","sorts","DOCS_FETCH_REQUEST","getDocsResultAction","DOCS_FETCH_RESULT","SETTINGS_SET","setSplitPanesAction","view","SPLITPANES_SET","persistSplitPanesAction","SPLITPANES_PERSIST","setSidebarMini","mini","SETTINGS_SIDEBAR_MINI","setCurrentBreadcrumb","CURRENT_BREADCRUMB","CURRENTITEM_SET","CURRENTITEM_BAK","CURRENTITEM_RESTORE","setDocsLayoutAction","layout","DOCS_LAYOUT_SET","requestDocsLayoutAction","allowPreFetch","DOCS_LAYOUT_REQUEST","setDocFilterTextAction","valueType","operator","DOCS_FILTERTEXT_SET","resetDocFilters","DOCS_FILTERS_RESET","setDocFilterByRef","docContextClick","resetValues","DOCS_FILTERS_SETBYREF","setDocFilterByName","DOCS_FILTERS_SETBYNAME","saveCurrentItemAction","persist","CURRENTITEM_SAVE","currentItemLoadedAction","CURRENTITEM_LOADED","formSetDefaultsAction","FORM_DEFAULTS_SET","formSetEditModeAction","FORM_EDITMODE_SET","extraAttributesSetTabIndexAction","tabIndex","EA_TABINDEX_SET","extraAttributesClearAction","EA_CLEAR","extraAttributesSetDetailViewAction","values","EA_DETAILVIEW_SET","extraAttributesSetField","ns","EA_FIELD_SET","extraAttributesAuditLogUpdateRow","seqId","EA_AUDITLOG_UPDATE","extraAttributesAuditLogDeleteRow","EA_AUDITLOG_DEL","extraAttributesAuditLogClearRow","EA_AUDITLOG_CLEAR","extraAttributesAuditLogInsertRow","rowIndex","EA_AUDITLOG_INSERT","extraAttributesGridSetCurrentRow","EA_GRID_CURRENTROW","serverEventAction","evt","GLOBALEVENTS_SERVER","startOfflineSyncAction","OFFLINE_SYNC_REQUEST","offlineSyncStartedAction","OfflineSyncStatus","Syncing","OFFLINE_SYNC_STARTED","offlineSyncDoneAction","Synced","OFFLINE_SYNC_DONE","offlineSyncUpdateAction","OFFLINE_SYNC_UPDATE","setOfflineItemSyncStatusAction","took","OFFLINEITEM_SYNC_STATUS","removeOfflineItemAction","OFFLINEITEM_REMOVE","setOfflineItemDepsMapAction","depsMap","OFFLINEITEM_DEPSMAP_RESULT","serviceWorkerInitializedAction","registration","SW_INIT","serviceWorkerUpdatedAction","SW_UPDATE","notificationUpsertAction","NOTIFICATION_UPSERT","notificationDelAction","notificationId","NOTIFICATION_DEL","notificationStatusAction","NOTIFICATION_STATUS","notificationClearAction","NOTIFICATION_CLEAR","notificationToastAction","NOTIFICATION_TOAST","commandActionRequestAction","COMMANDACTION_REQUEST","guid","commandActionQueueAddAction","COMMANDACTION_QUEUE_ADD","commandActionQueueRemoveAction","COMMANDACTION_QUEUE_REMOVE","commandActionRemoveAction","COMMANDACTION_REMOVE","commandActionLogAction","COMMANDACTION_LOG","commandActionStatusAction","COMMANDACTION_STATUS","commandActionItemStatusAction","COMMANDACTION_ITEM_STATUS","DatePickerReference","forwardRef","inputProps","inputRef","multi","onChangeWithRawEvent","DatePickerPopper","onFocus","onBlur","createPortal","modifiers","preventOverflow","enabled","boundariesElement","keepTogether","positionFixed","placement","zIndex","overlay","data-placement","document","getElementById","DateEditorControl","_getFormat","DateTimeFormat","Time","moment","localeData","longDateFormat","LongTime","DateTime","DateLongTime","JsonDate","JsonDateEnd","JsonDateTime","_getDate","day","time","format","_onDayChange","dayPickerInput","changeValue","getInput","typedValue","dateValue","getValueAsDate","currentTarget","shouldRenderTime","timeValue","invalidate","errorValue","_ref","isRequired","_onTimeChange","event","toDate","isNaN","shouldRenderSeconds","shouldRenderDate","includes","valueFormat","getValidValue","required","isValid","disabled","isReadonly","container","overlayWrapper","formatDate","parseDate","dayPickerProps","showWeekNumbers","numberOfMonths","firstDayOfWeek","locale","userLanguage","localeUtils","LocaleUtils","fixedWeeks","todayButton","onDayChange","component","overlayComponent","inputType","step","flexGrow","dt","HTML5_FMT","defaultProps","Moment","IMaskNumberDefault","decimalScale","mask","Number","scale","signed","normalizeZeros","thousandsSeparator","padFractionalZeros","radix","mapToRadix","currency","maskProps","numberProps","blocks","num","IMaskCurrencyDefault","borderRadius","validations","notEmptyMask","rawValue","IMask","pipe","definitions","A","9","C","PIPE_TYPE","MASKED","UNMASKED","validationErrors","HTTP_ERROR_CONFLICT","_log","ApiErrorContainer","response","captureStackTrace","ApiError","args","isError","ApiNetworkError","statusCode","statusText","ApiConflictError","ApiNetworkOfflineError","detail","eventId","notifyOnError","extra","notify","get","email","handleClick","copy","onCopy","clipboardData","toastActionResult","toastStyled","toastTypes","failure","autoClose","details","bsSize","bsStyle","href","rel","isApiOnlineSelector","network","isNavigatorOnlineSelector","isNavigatorOnline","isOnlineSelector","hasDetectedNetworkStatus","hasDetectedNetworkStatusSelector","itemUriSelector","AbsoluteDropdown","isOpen","_toggleIsOpen","_handleRootClose","onRootClose","Dropdown","Toggle","chrome","chromedToggle","noCaret","Menu","removeOnDestroy","arrowProps","display","maxHeight","overflowY","bowser","is","openMenuOnHover","Avatar","imgUrl","encodeURIComponent","avatarStyle","backgroundImage","alt","webpackAsyncContext","req","__webpack_require__","code","ids","detailView","formReducer","isNew","immutable","merge","parseSeqId","del","isGridRowDeleted","auditLog","set","_state","deletedIds","lastChange","docmodal","folder","alert","formDetailViewSelector","formLastChangeSelector","formAuditLogSelector","formGridRowIndexSelector","formGridRowSeqIdSelector","formDefaultsSelector","formIsEditModeSelector","formTabIndexSelector","ValueFacePile","pile","p","PrincipalAvatar","$type","total","onMoreCommand","CommandActionHandler","facePileMore","ValueUser","renderName","userText","ValueProgress","progress","marginBottom","ValueVisualRules","caption","color","icon","iconSize","loader","pulse","src","iconUrl","ValueEnum","renderEnumValue","enumValue","isMulti","enum","stopPropagation","ValueTextLink","link","ValueFilesize","SummaryAttributeValueFactory","useDefaultStyle","SummaryAttributeValueType","FacePile","VisualRules","Enum","TextLink","Filesize","User","Progress","ReactElement","SimpleAttribute","Picker","_onBreadcrumbPartClick","treeFilter","activeItemUri","treeNodeId","isTreeFocused","onBreadcrumbPartClick","_onTreeClick","activeDocIndex","onFolderSingleClick","_onTreeExpand","_onTreeFilterChange","includeSubfolders","_showDoc","newWindow","_onIconClick","preventDefault","doNewWindow","ctrlKey","altKey","_onDocSingleClick","onDocSingleClick","treeAvailable","treeIsBrowsable","treeTotalCount","actionsDisabled","breadcrumbScopeFromLevel","backgroundColor","treeStatus","TreeFilter","allowSubfolders","marginTop","FolderTree","focused","activeTreeNodeId","onExpand","DocList","showAddDocument","onIconClick","onSingleClick","onDoubleClick","onDocDoubleClick","PickerContainer","LocalStoreHandler","treeIsRoot","isMini","GlobalEventsHandler","ServerEventItemType","ServerEventActionType","delete","refreshMode","RefreshMode","Originator","refreshMessage","refreshRoute","File","Any","PickerModal","open","close","onSelect","additionalActions","selectButton","currentRootItemUri","setCurrentRootItemUri","currentItemUri","setCurrentItemUri","currentRootItemUriLevels","setCurrentItemUriLevels","selectFolder","selectDoc","setRootItemUri","abortController","useAbortController","fetchBreadcrumb","signal","bc","fetchData","Modal","ModalSize","Small","fullscreen","enforceFocus","onHide","dialogClassName","picker","headerSize","footerSize","Body","Footer","aria-label","padding","onToggle","pullRight","i","eventKey","createModal","toastPosition","toast","POSITION","toastId","PdfJs","NetworkStatus","NoNetwork","OfflineChanges","ServiceWorker","ServiceWorkerOfflineQueue","UppyInfo","UppyRecovered","UppySuccess","refresh","NotificationStyle","Info","btnToast","success","Success","partial","Warning","uppyComplete","uppyError","uppyRecovered","isRouted","uppyInfo","uppyResuming","pdfSignature","position","TOP_CENTER","swReady","globalloc","cache","done","swFailed","swReload","reload","swOfflineQueueAdd","swOfflineQueueAddFile","offlinePendingChanges","Toast","RoutedToast","NotificationStatusFlag","New","timestamp","dismissToast","notification","getNotification","settingValue","NotificationType","API","dismiss","locPrefix","locParams","isLocalhost","Boolean","hostname","registerValidSW","swUrl","config","navigator","serviceWorker","register","trace","activeWorker","active","onSuccess","onstatechange","onupdatefound","installingWorker","installing","controller","onUpdate","fatalException","onFailure","sagaMiddleware","run","rootSaga","Root","Loader","browserCheck","satisfies","edge","firefox","safari","opera","android","iOS","samsung_internet","blackberry","electron","isFeatureOn","Feature","offline","URL","origin","install","fetch","headers","contentType","ready","unregister","checkValidServiceWorker","addEventListener","serviceWorkerRegistration","store","process","JEST_WORKER_ID","ReactDOM","applyAnySelectionContext","cb","contextProps","check_isMultiSelection","check_isDoc","isDoc","check_isSpecialFolder","SpecialFoldersItemURIs","check_isSyncEnabled","def","inPointSyncIntegration","check_isWindows","check_hasContext","check_api","apiMethod","check_licenseAllowEdit","licenseAllowEdit","check_isSyncForced","uploadProvider","UploadProvider","Sync","check_isSyncUpload","check_hasItemStatus","itemStatus","ItemStatuses","Nothing","multiple","checkMapping","getState","isFolder","isSpecialFolder","isSyncEnabled","isSyncForced","isSyncUpload","isWindows","isMiniView","hasSiteType","siteType","SiteType","NotSet","hasContext","hasFeature","check_hasFeature","hasBrowser_webShareApi","share","canShare","isCreateAllowed","hasItemStatus","isRecycleBin","hasSearchType","parseInt","isCustom","isWorkflowEnabled","isAnyOnlineStatus","isAnySelection","isMultiSelection","hasExtension","toUpperCase","hasRowAndColId","columnIndex","shouldBeVisible","expr","negate","conditionName","func","breadcrumbReducer","isArray","breadcrumbIsFavSelector","breadcrumbItemUriSelector","breadcrumbNameSelector","breadcrumbLevelsCountSelector","breadcrumbVersionSelector","version","breadcrumbFormatIdSelector","breadcrumbSiteTypeSelector","nameof","fetchSites","fetchUser","fetchUserSettings","saveUserSettings","fetchCards","fetchNews","fetchFavorites","addFavorite","delFavorite","addSearchFavorite","delFavoriteLink","linkId","sendMail","sendMailAttachments","fetchTree","createFolder","elementType","createFolderFromTemplate","template","targetFolderName","createFolderTemplateGetItemUri","jobId","fetchItemFlows","dir","fetchItemFlowForm","formType","templateId","templateType","delItemUri","fetchSearchFormList","fetchNewForm","fetchForm","fetchSearchForm","fetchFormLookup","keyword","lookupType","fetchFormLookupDependencies","currentLookupValues","fetchExtraAttributesEmbeddedGrid","sortColumn","sortDirection","saveForm","etag","saveNewDocFromTemplate","validateForm","validateWebdavName","fetchDocInfo","fetchActivities","fetchItemNote","noteId","addItemNote","updateItemNote","deleteItemNote","delDocVersion","restoreDocVersion","fetchDocCount","fetchDocsCsv","fetchDocs","cols","fetchDownloadToken","downloadDocToken","token","inline","pdf","stream","bridge","downloadDocUri","fetchThumbnail","fetchRelatedDocs","itemLinkType","getSource","getWebDavHttpLink","webDavName","getCloudInfo","lock","unlock","subscribe","isSubscribed","unsubscribeByItemUri","unsubscribeById","linkID","fetchWorkflowCards","fetchNewWorkflows","fetchWorkflowInfo","provider","wfId","delDefiniteItemUri","restoreItemUri","fetchRasterMapLayers","rasterMapIdSelector","create","saveRasterMapLayers","fetchSAYT","fetchSearchCount","fetchSearchResult","fetchSearchPrincipal","includeUsers","includeGroups","fetchSearchSuggestion","fetchReminders","upsertReminder","deleteReminder","reminderId","fetchShare","createShare","shareRequest","updateShare","deleteShare","checkShareName","itemUris","webDavNames","fetchShareContext","formatIds","fetchOfflineItems","addOfflineItem","delOfflineItem","transfer","transferRequest","itemContexts","ItemContextsFlags","All","loginReducer","loginStatusSelector","login","loginIdTokenSelector","loginAccessTokenSelector","loginExpiresOnSelector","loginExpiresInSelector","ModalCloseButton","aria-hidden","createBrowserHistory","DEFAULT_CONFIG","renderDiv","usePortal","portalTargetSelector","portalTargetSelectionMethod","getStyle","node","transform","top","getBoundingClientRect","y","left","innerWidth","rowIndexProp","isActiveProp","isHoveredProp","actionsHandlerProp","actionsDisabledProp","shouldRender","withStickyToggle","HOC","onMouseEnter","onMouseLeave","MultiSelectionContext","divRef","useRef","actionsHandler","isActive","isHovered","isHandheld","setShow","handleMouseEnter","handleMouseLeave","wrapperProps","calculatedStyle","current","opacity","getPortalTarget","querySelectorAll","portalTarget","setPortalTarget","button","StickyToggleStyle","List","minHeight","GridList","outer","closest","inner","rect","rgb","borderColor","scrollbarWidth","scrollTop","scrollLeft","minWidth","justifyContent","background","borderLeft","borderBottom","withOfflineHandler","offlineHandler","useOfflineHandler","SummaryAttribute","attribute","ValueFactory","AttributeFactory","Attributes","attributes","whiteSpace","PlaceInput","_onChangePlace","latlng","ParseLocation","inputGroup","Addon","iconWrapper","GeoPlaceInput","MapModal","_onSet","mapRef","editLocation","GetEditLocationResult","onSet","_onChangeFromPlaceInput","SetCenterMarker","_showGeoInput","usePlaceInput","SupportGeoPlaceInput","useMarker","locations","allowEdit","_onViewerLoad","viewerLoaded","closeButton","Title","MapViewer","mapProvider","radius","onLoad","footer","setButtonLabel","btnSet","createRef","openMapModal","_handleTogglesFromProps","_handleToggles","_handleTogglesFromQueryString","availableToggles","validToggles","isEqual","selectedToggles","newToggles","_getTogglesBySelected","_updateSelectedToggles","getToggles","treeReducer","treeNodesSelector","treeStatusSelector","treeErrorSelector","treeIsRootSelector","treeIsBrowsableSelector","treeTotalCountSelector","HttpMethod","GET","PUT","DELETE","POST","HEAD","ContentType","AUTO","BLOB","TEXT","CacheStrategy","None","StaleWhileRevalidate","CacheFirst","NetworkFirst","NetworkOnly","CacheOnly","DEFAULT_CACHE_NAME","CacheKey","CustomAuthorization","SecureParams","MiniView","OfflineItemUri","OfflineApiName","OfflineSync","OfflineQueueItemType","ApiCall","UppyFile","GlobalSites","MySites","SharedSites","RecycleBin","MailBox","AUSites","ViewNameType","flat","mailbox","SystemWebDavName","GlobalSite","MySite","SharedSite","SidebarItemSource","System","Custom","Offline","NavigationItemType","Home","News","Report","Wf","CommandAction","Group","PrincipalType","SharePrincipalType","Share","Unknown","SyncedWithErrors","Conflict","SharedDocumentsUri","RecycledDocumentsUri","RecycleBinUri","Reminder","Relation","PDF","WFReport","Note","Link","MailHasAttachment","MailReplied","MailForwarded","Locked","Template","Subscribed","CloudSync","Deleted","ParentDeleted","ListViewMode","Thumbnails","Grid","Map","Calendar","DocListFilterOperators","Equals","NotEquals","LessThan","LessThanOrEqualsTo","GreaterThan","GreaterThanOrEqualsTo","Contains","DoesNotContain","StartsWith","DoesNotStartWith","EndsWith","DoesNotEndWith","Between","NotBetween","DateRelative","DocListColumnType","StringValue","FileSize","IntValue","BooleanValue","LongValue","ShortValue","DoubleValue","DecimalValue","SingleValue","DateTimeValue","DateTimeOffsetValue","ByteValue","ObjectValue","DocsFlags","ForceDocListSimple","IsDocEditAllowed","IsDocDownloadAllowed","IsDocAssignmentAllowed","IsFolderClassificationEditAllowed","IsDocClassificationEditAllowed","IsDocSendByEmailAllowed","SortDirectionOptions","Ascending","Descending","ActivityType","modifyContent","modifyField","comment","locked","ItemNoteType","Default","PdfHighlight","ItemNoteTypeIcon","default","pdfHighlight","CleanupKeepVersionType","Last","PerDay","PerUser","RetentionType","Forever","FormLookupType","ea_lookup","ea_ftlookup","sf_ftlookup","ExtraAttributeEmbeddedGridRowStatus","Updated","Added","ItemLinkType","Manual","WorkflowReport","Shortcut","WorkflowProvider","inPointWorkflow","AxonIvy","WorkflowType","Routing","Process","SearchOperator","Contextor","From","To","FromTo","FromToWithTime","FromWithTime","ToWithTime","EqualsWithTime","RelativeDate","FromRelative","ToRelative","GeoRadius","GeoArea","GeoRadiusIntersect","GeoRadiusWithin","GeoAreaIntersect","GeoAreaWithin","GeoAreaPoint","ContextorContains","SearchNodeType","AllNodes","LeafNode","CustomNode","Auto","SearchScope","AllSites","AllFolders","CurrentFolder","SearchValueType","ItemType","Decimal","GeoPoint","StringFieldOnly","DecimalFieldOnly","SearchRequestType","Favorite","Recent","Freetext","Url","Task","Doc","ArchiveTarget","ModifyDocument","activity","task","favorite","subscription","notSet","add","modify","edit","Self","ItemFlowDirection","out","ItemFlowTemplateType","DocTemplate","FolderTemplate","Uppy","LoadingType","RasterMapLayerEditAction","none","rename","LocalDateStringOption","DateTimeLong","year","month","hour","minute","second","ReminderPriority","High","Normal","Low","ReminderTypeFlags","Mail","CustomAction","CustomActionState","NotStarted","Retry","Done","Abort","ReminderTypeFlagsEnumValues","ReminderPriorityEnumValues","AllowedShareActionFlags","Web","Attachment","Pdf","Anonym","ShareType","ShareAccessControlListType","View","Edit","Delete","SORT_BUCKET_NAME","GridListConstant","ExtensionIcon","IconItemStatus","ItemUri","ItemStatus","ResultFlags","Extension","TransferType","Copy","Move","Read","Pending","PriorityType","Intermediate","CommandActionStatusFlag","Loading","Partial","paneIdx","split1","split2","panes","onDragEnd","getSizes","selected","master","panesDefaultState","slave","setSplitSizes","isLoading","pastDelay","modules","opts","loadingType","Loadable","delay","timeout","StatusLoading","getDefaltsByLoadingType","addToOfflineQueue","dbKey","offlineQueueStorage","setItem","anyPendingChanges","keyPrefix","keysStartingWith","replayOfflineQueue","ApiManager","getAllItems","allItems","offlineQueueItem","_replayApiCall","_replayUppyUpload","queueItem","qi","removeItem","retries","_handleConflict","openConflictModal","currentEtag","addFile","retryUpload","TextEditorControl","Rename","_startEditing","editing","_txt","txt","focus","setSelectionRange","_onChange","_onBlur","_onKeyDown","which","onKeyDown","Searchcrumb","favStatus","favOnClick","onRename","ok","Item","SearchcrumbContainer","_parse","favOnRename","bind","CustomBreadcrumb","fontSize","CrumbSelector","scopeFromLevel","isFavorable","Breadcrumb","renderStatus","ToggleBar","isHidden","noop","CountBadge","ToggleBarContainer","toggleState","browser","greaterThanOrEqual","medium","_selected","otherProps","stateProps","dispatchProps","newtoggles","ToggleBarComponent","topRowClassName","topRowBefore","onAction","onActionShouldBeVisible","breadcrumbIsRecycleBin","usePendingOfflineChanges","ActionsButton","openItemActionPanel","ActionsMenu","onShouldBeVisible","RowTitle","FileExt","marginRight","RowBody","thumbnail","category","targetView","parsedName","parsedTitle","parsedTitleOrName","parseTitle","openActionPanel","body","ModalHeader","ModalBody","Large","Medium","historyUnlisten","listen","_search","closeRequested","_onResizeDebounced","capture","passive","removeEventListener","_onResize","fs","_shouldFullscreen","vh","_getHeight","docked","debounce","_getWidth","isIOS","documentElement","clientWidth","margin","clientHeight","innerHeight","_renderChildren","_renderChild","scroll","onKeyPress","animation","modal","renderValue","linkType","isIconLast","LinkViewer","comparableValue","getRoute","useAnchorProps","nolink","LinkViewerControl","isGridCell","textAlign","Thumbnail","_onLoad","MomentLocale","useMomentLocale","removeSpaces","UserIdViewerControl","userid","marginLeft","findCustomField","fields","getFieldType","field","Component","ImageViewerControl","creatorIdField","modifiedIdField","StaticViewerControl","LocationViewerControl","marker","GeoRasterViewerControl","T","TelViewerControl","EmailViewerControl","hidden","MyForm","isNoDataError","getFields","fieldsLength","hasEA","onSubmit","EAForm","formTitle","layoutXml","LocalContactInfo","HiddenEditorControl","FormsyEditorBase","isAdditionalRender","getValidationErrors","customErrors","isDefaultRequiredValue","FieldEdit","formPrefix","ImageEditorControl","ro","isNotInvalid","LookupEditorControl","NumberEditorControl","maxLength","max","isFilename","isPathname","MemoEditorControl","isEmail","matchRegexp","GeoPointValidationRegex","showLabel","GeoAreaEditorControl","GeoAreaValidationRegex","GeoRasterEditorControl","NavigationBlock","isDirty","onbeforeunload","Prompt","when","MyFormEdit","_prepForm","changed","defaultValueKey","defaultAttributeKey","idx","findIndex","ea","defaultFieldKey","_setupValidations","addValidationRule","range","min","test","_onInvalid","canSubmit","_onValid","_onSubmit","resetForm","invalidateForm","isValidating","onValidate","isSubmitting","onSave","_onFieldChange","splittedName","_isDirty","_getSaveButtonLabel","_formsySubmit","_formsyRef","submit","confirmLabel","toolbar","isEditAllowed","onValidSubmit","onValid","onInvalid","buttonToolbarPortal","FormEditHeader","FormContainer","_isMounted","paramUri","_updateToggleLoading","factory","onFormLoad","_handleKeepFilename","onContextProps","e2","keepFilename","_isWebDavNameHidden","_ignoreWebDavName","hiddenWebDavName","_maybeAddDefaultWebDavName","_onValidate","AbortController","locErrors","k","_onSave","renderKeepFilename","controlId","flexDirection","alignItems","checked","abort","refreshId","isOfflineAllowed","adjustedItemUri","showHeader","defaultFormTitle","defaultFormIcon","FormEdit","isLocked","LockInfo","lockInfo","center","partTitle","isLast","bctext","BreadcrumbPart","symbolName","onMeasured","localizedText","bi","findDOMNode","measureWidth","onPartClick","BreadcrumbFavorite","MyBreadcrumb","leafActive","showParts","hiddenCount","Site","verticalAlign","part","ResponsiveBreadcrumb","_onMeasured","__calcVisible","knownState","reduceRight","previousValue","calculated","_calcVisible","throttle","leading","trailing","knownWidth","mybc","bounds","EventHandler","componentClass","onContextMenu","onTouchEnd","onTouchStart","onTouchMove","onMouseDown","onMouseUp","handler","handleAdd","autoToggleRow","setAutoToggleRow","handleTouchStart","handleTouchMove","handleTouchEnd","handleMouseDown","handleMouseUp","createElement","toggleFavorite","logger","BreadcrumbContainer","initialLoading","_maybeGetNewAbortController","isRefreshing","htmlValue","v","dangerouslySetInnerHTML","__html","ApiCatalog","strategy","method","transformer","isOfflineItem","keyParams","depsAnalyzer","depsApis","getGeoRasterProvider","scope","showToast","hasMore","rowCount","rows","rowKey","isPdf","canPdf","fetchDocument","treeNode","flows","flow","commandAction","depsApi","ApiManagerBase","_callReturnContext","request","urlEnd","_pipeline","_encodeData","prefix","_getFullCacheKey","cacheKey","_getHeaders","Headers","append","auth","useCustomAuthHeader","secure_params","_networkError","apiContext","BeforeFetch","OnFetch","AfterFetch","CheckLicense","DecodeBody","CheckCustomError","EOL","apiTook","urlParams","credentials","signinRedirect","_getErrorData","contentHeader","json","lic","isLegacyResponseClone","cloneDeep","blob","Overlay","okStyle","REFRESH","QueuedOfflineStatusText","ApiManagerOffline","_handleOfflineRequest","caches","_handleOfflineSave","_handleOfflineTransformer","resultBody","Response","initialized","updated","serviceWorkerReducer","isSwInitializedSelector","sw","isSwFailedSelector","isSwUpdatedSelector","swRegistrationSelector","abortControllerInstance","useBroadcast","channelName","channel","BroadcastChannel","onmessage","postMessage","useNetworkStatus","useUpdateEffect","usePostMessageHandler","handlers","parentWindow","parent","handleMessage","source","useEvent","isTrusted","useDefaultPostMessageHandler","searchRouteWithItem","openSearchResultActionPanel","check_isView","views","longitude","latitude","openGeoPointActionPanel","exec","actionId","useDispatch","useLocalStore","storeName","createSagaMiddleware","middlewares","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","createStore","appReducers","responsiveStoreEnhancer","applyMiddleware","localRootSaga","getStore","getMomentLocale","setStatus","locales","useUppy","uppyId","uppyProps","events","setReady","createUppy","addUppyPlugins","addUppyEvents","getUppyLocale","i18n","finally","removeUppyEvents","setPendingUploads","uppyPendingUploads","useDeepCompareEffect","usePdfHighlight","createGlobalState","usePdfHighlightActions","createPostMessage","postMessageTo","handleLoad","PdfHighlightAction","Load","handleUpsert","Upsert","handleHighlight","Highlight","handleDelete","handleSelect","Select","usePdfHighlightActivityList","userId","setEdit","highlight","setHighlight","activityId","what","pdfHighlights","targetHighlight","usePdfHighlightInput","handleNoteExtras","noteRef","clearableInput","scrollIntoView","block","useDismissNetworkToast","setError","setDismiss","handleDismissClick","handleEnableOffline","fetchRequest","OfflineHandlerFactory","useArrowNavigationTransmitter","targetData","setCurrentIndex","ArrowNavigationAction","Ready","Paginate","qsParam","currentIndex","pathname","useArrowNavigationReceiver","postMessageProps","setPostMessageProps","setMaxCount","Reload","SetIndex","docRoute","openBrowseDialog","openCamera","onAddFile","plugin","getPlugin","hideAllPanels","getElementsByClassName","click","showPanel","toggleAddFilesPanel","plugins","uppyLexmark","hideUploadButton","hideRetryButton","hidePauseResumeButton","hideCancelButton","showLinkToFileUploadResult","showProgressDetails","disableInformer","disableThumbnailGenerator","metaFields","proudlyDisplayPoweredByUppy","minipicker","miniflat","itemflows","docsItemUri","docsFlagsIsDocAssignmentAllowed","sitesSelector","defaultFallbackImage","heightStyle","widthStyle","parsedValue","border","objectFit","workflowReducer","workflowStatusSelector","workflow","workflowCardsSelector","workflowPendingCountSelector","docsReducer","docsLayoutFiltersSelector","docsLayout","docsLayoutSortsSelector","docListViewMode","settingsReducer","sidebarMiniSelector","settings","docListViewModeSelector","settingValueSelector","currentItemReducer","saved","currentItemUriSelector","currentNameSelector","currentStatusSelector","searchFormsReducer","searchFormListStatusSelector","searchForms","searchFormListResultSelector","searchFormListCountSelector","offlineReducer","offlineItemsSelector","resize","overflow","paddingTop","paddingLeft","paddingBottom","boxShadow","maxRows","Name","selectedValue","getSelected","parseSelectedValue","bucket","buckets","findBucketValue","hideName","Icon","AllItem","MenuItem","badge","Button","fontWeight","fontStyle","SearchBucket","hideMenu","hideAllReset","localContactInfo","btn","rightComponent","right","cancel","UserGroup","group","Bowser","getParser","userAgent","BROWSER_MAP","getGridRowDefaultValues","gridName","grid","getGrid","columns","col","seqIdColumn","convertSeqIdToIndex","convertIndexToSeqId","mapGridRowToColumns","isGridRowUpdated","updatedRows","cardsReducer","cardsStatusSelector","cardsCardsSelector","thumbnailsReducer","thumbnailStatusSelector","thumbnails","thumbnailResultSelector","favoritesReducer","favoritesStatusSelector","favoritesFavoritesSelector","commandActionReducer","unshift","j","commandActionRequestSelector","getGeoLocation","onLocation","openProgressModal","doWork","geolocator","locate","geoLocatorOptions","LocationToString","coords","BarcodeModal","legacy","_onScan","_onUpload","openImageDialog","_onError","mediaDevices","onError","onScan","legacyMode","openBarcodeModal","getBarcode","onBarcode","re","RegExp","lastIndex","getBarcodeMatch","runSearchItem","showFilterbar","fb","vm","createSearchItem","onSearchItemCreated","geoFilter","strLoc","geolocation","barcodeFilter","barcode","reject","searchResult_form","execute","found","exactItemUri","globalDefaults","searchStatistics","searchAsYouType","searchFacets","searchCalendar","homeActions","noteService","mailService","rasterMapService","reminderService","shareService","templateService","workflowService","d","xs","x","isSecureParams","isDragDropSupported","getDroppedFiles","FileDropHandler","_registerHandler","_unregisterHandler","allowDrop","_dropzone","onDrop","onDragOver","onDragLeave","clearTimeout","_timeout","dataTransfer","dropEffect","isFileDrag","addedCount","filesDTO","fileDTO","relativePath","addFilesToUppy","isRestriction","types","isDragover","_timedDragLeave","DropHandler","dragOverText","componentProps","DownChevron","components","NativeSelect","so","valueKey","_getValue","wrapperClassName","selectRef","option","labelKey","FolderResult","renderCheckbox","checkbox","ElementType","FolderResultWithStickyToggle","DocumentResult","article","summary","DocumentResultWithStickyToggle","RowResult","useEffectOnce","combinedClassNames","hovered","word","foundTerms","term","exclude","_cache","clearAll","_isRowLoaded","_loadMoreRows","startIndex","stopIndex","pageSize","pagesStatus","Math","floor","loadMoreRows","nextRows","handleMoreRowsLoaded","_rowRenderer","isScrolling","hoveredRowIndex","CellMeasurerCache","maxTotal","scrollToRow","_list","scrollToPosition","flex","isRowLoaded","onRowsRendered","registerChild","deferredMeasurementCache","overscanRowCount","rowHeight","rowRenderer","noRowsRenderer","scrollToIndex","scrollToAlignment","handleWidth","handleHeight","onResize","SearchResultMap","totalLoaded","isLoadingNextPage","hasMorePages","_firstPage","_getLocationsFromResult","onlyRaster","isRaster","_getLocations","attr","point","area","ParseArea","ParseRaster","_loadNextPage","nextLocations","concat","onCountOfGeoResults","bottom","WithContext","Views","week","agenda","Toolbar","calendarRef","currentView","projections","currentProjection","onProjectionChange","nextPageButton","projColor","proName","getApi","prev","today","next","changeView","lessThan","colorArray","SearchResultCalendar","_getEventsFromResult","_getEvents","start","date","allDay","extendedProps","projection","mom","nextEvents","_onEventRender","el","_onEventClick","jsEvent","_onViewChange","calendarView","_onProjectionChange","_getProjectedEvents","_onDatesRender","_calendar","formatDate_Date","formatDate_Time","allLocales","defaultView","noEventsMessage","nowIndicator","businessHours","eventLimit","bootstrapPlugin","dayGridPlugin","timeGridPlugin","listPlugin","themeSystem","eventRender","eventClick","viewSkeletonRender","datesRender","CellContentWithStickyToggle","cell","content","desktop","useDefaultStyles","containerClassName","mark","SearchResultGrid","onContextClick","onFilterBarSelect","isRowActive","rowsFromResult","setRows","setPagesStatus","parseCellColumnTitle","isColumnFiltered","isColumnSorted","sort","getColumnSortDirection","handleLoadMoreRows","handleCellClick","handleCellMoreClick","handleCellContextClick","handleHeaderFilterClick","handleHeaderClick","canSort","getColumnWidth","getCell","columnCount","CellContent","ContextMenuHandler","parseCellHeaderCaption","canColumnFilter","rowStartIndexUpdated","onCellClick","onCellDoubleClick","onCellMoreClick","onHeaderClick","onHeaderFilterClick","headerFilterTitle","GetDefaultSearchBuckets","visible","SearchResultContainer","_maybeChangeViewMode","_prepSearchRequest","searchText","extraFilters","nodeType","fakeUris","bucketFilters","hasMapViewMode","viewModeSetting","_updateToggleCounter","_handleMoreRowsLoaded","_onFilterBarSelect","newSelected","newSearchRequest","selectIndex","filterIndex","newFilter","newSort","sortSetting","_onFilterBarClear","_isDocument","_getNextDocumentIndex","_getDocument","_getPrevDocumentIndex","documents","multiSelection","activeRows","_updateArrowNavigationRows","reducedDocuments","_getDocModalProps","isNext","documentIndex","getActiveRowItemUri","setTarget","setDocuments","_onClick","prevRowIndex","showViewer","shiftKey","handleToggle","endIndex","disable","searchTerm","_onMoreClick","openMultiSelectionActionPanel","mapper","newViewMode","fallbackViewMode","SupportGeoMapViewer","_onViewModeChange","_getAvailableViewModes","viewModes","_onCountOfGeoResults","updateTotalCount","additionalState","availableRows","setAvailableRows","_isRowActive","activeState","autoBrowseToItem","aggregationsFromResult","nameA","nameB","hideLoading","FilterBar","onClear","onViewModeChange","onMapClick","withMultiSelection","inPointAction","browse","preview","properties","archive","inPointActionLink","additionalProps","uris","sp","ClientLink","getClientLinkHtml","ReactDOMServer","renderToStaticMarkup","shortItemUri","externalLink","print","sortKey","searchRouteWithKeyword","searchRouteWithKeywordAndMore","folderRoute","mailRoute","viewNameTypeRouteMapping","cfg","sitesOrdered","orderedIndex","orderedSite","orderedIndex2","BrowserLink","getBrowserLinkHtml","BrowserDragLink","functions","randomGuid","guidHolder","hex","guidResponse","random","getAuthCallback","urlLocation","hash","qr","expires_in","id_token","access_token","signout","persistor","pause","flush","purge","endSessionEndpoint","id_token_hint","post_logout_redirect_uri","logoutRedirectUrl","signinFromLocation","client_id","clientId","redirect_uri","redirectUrl","response_type","responseType","nonce","resource","forceLogin","prompt","forceLoginPrompt","authorizeEndpoint","getAuthUrl","togglesReducer","state2","selectedTogglesSelector","panesReducer","panesViewSelector","globalSearchReducer","globalSearchOptionsSelector","globalSearch","globalEventsReducer","notificationReducer","priority","notificationSelector","_queryString","object","skipNull","skipEmptyString","Option","shouldComponentUpdate","nextProps","nextState","loadIndex","inputValue","getParentAsFilters","parentName","parentLookupCommonName","op","getCurrentDependentLookupValues","lookupValues","getValueByOperator","fetchLookup","loadedOptions","additional","val","boostLeafNode","formId","_fixValue","_handleDependenciesUpdate","_handleLookupValue","_prepareOtherValueFor","useKeys","K","others","O","shift","dependentLookups","lookup","_lookup","_onInputChange","_valueRenderer","toLocaleString","valueWithIcon","_optionRenderer","innerProps","onMouseMove","onMouseOver","newProps","ValueComponent","selectProps","menuPortalTarget","menuPlacement","classNamePrefix","provided","control","valueContainer","dropdownIndicator","indicatorSeparator","clearIndicator","menu","menuPortal","textShadow","cursor","isFocused","loadOptions","debounceTimeout","cacheUniqs","onMenuClose","getOptionLabel","getOptionValue","filterOption","createFilter","ignoreAccents","isClearable","openMenuOnFocus","onInputChange","delimiter","useContains","openExternalLinkModal","ModalAction","Close","CloseLegacy","frameBorder","allowFullScreen","getNoteType","NoteInput","onEnter","onAbort","noteExtras","setNoteExtras","handleEnter","handleAbort","noteContainer","noteWrapper","noteInput","getCommentIconString","Activity","showDetails","showActions","isEdit","isHighlighted","isLastVersion","actionMenu","renderWhatIcon","renderWhat","on","renderChange","change","newVal","oldVal","renderChanges","condensed","table","tbody","activityRef","renderText","userName","toggleComponent","ActivityList","showNotes","showHistory","currentVersion","isReadOnly","commentType","setCommentType","handleAction","itemCommentType","filterType","lastVersionId","totalVersions","accumulator","CleanupKeepInfo","RetentionInfo","months","Activities","cleanupKeepInfo","retentionInfo","showAddNote","showRetentionInfo","ActivitiesContainer","_setActivityListDefaults","activityList","_onAddNote","_canUserUpdateOrDelete","_onUpdateNote","_onDeleteNote","abs","openConfirmModal","confirmButton","confirmed","deleted","_toggleDetails","_onAction","itemUriWithVersion","onShowVersion","restoreVersion","deleteVersion","keep","retention","GeoAreaInput","_setAreaManually","getGeoAreaProvider","editLocationResult","onManualArea","AreaToString","showIcon","buttonsWrapper","SupportGeoAreaEdit","combineReducers","docs","docsLayoutReducer","globalEvents","networkReducer","createResponsiveStateReducer","extraFields","greaterThan","mediaType","uppyRedux","reducer","cancelButton","requireSelection","ActionCategory","catActions","renderHeader","itemStatusMapping","Icons","Notes","Email","Replied","Forwarded","Cloud","getPropsForItemStatus","onlineEditor","ItemStatusIcons","iconStyle","bit","ItemStatusComponent","SimpleAttributeValue","LockInfoOn","useToggle","noshow","lockedById","lockedByName","lockedDate","uppyRef","restrictions","updatedRestrictions","maxNumberOfFiles","maxFileSize","deniedFileTypes","allowedFileTypes","UppyRestrictions","Plugin","onRestrictionFailed","onBeforeUpload","_updateRestrictions","restrictedFileIDs","fileID","_checkRestrictions","restrictedFiles","old_onBeforeUpload","onBeforeFileAdded","old_onBeforeFileAdded","beforeUpload","uninstall","off","createContext","CurrentItemContext","MapButton","getGeoMapViewerProvider","_iframe","contentWindow","setCenterMarker","_fetchRasterLayers","mapLayers","layers","fetchError","_callOnLoad","_frameLoaded","showLocations","searchRadius","_addLocationsToMap","showMoreLocations","_getMapUrl","providerName","geo","providerKey","lang","Consumer","_initProvider","osm","google","bing","esri","getGeoPlacesProvider","_geoCodingProvider","places","getSAYT","gpi","textOverflow","IndicatorSeparator","DropdownIndicator","cacheOptions","loadingMessage","noOptionsMessage","refreshIndex","doc_print","PdfPrintAction","LoadingIframe","setLoading","marginHeight","marginWidth","CardSubTypeIcon","cardtype","onlyName","itemType","cardColor","CardItem","bcText","desc","liRef","isValidElement","FilterBarContainer","_prep","_onSelect","aggregation","filterTextPlaceholder","showClear","renderFilter","disableFilter","RelativeDatePicker","autoFocus","relDate","custom","enableHighAccuracy","maximumWait","maximumAge","desiredAccuracy","fallbackToIP","addressLookup","timezone","staticMap","ProgressModal","ApiCacheManager","OpenCache","DeleteCache","CacheExists","LogEstimates","cachedRequests","getStorageEstimate","estimate","usageInGb","quotaInGb","percentUsed","ApiManagerMakeAvailableOffline","offlineItem","_callWithDeps","_offlineItem","_apiCache","_runTransformer","cacheBody","_addToCache","put","defaultCache","updateUser","startSync","preFetchGlobals","preFetchFolder","fetchDeps","removeOfflineItem","checkOfflineItems","watchOfflineSync","getDepsMap","watchNetworkStatus","offlineSaga","checkServerConnectivity","APIs","getAPI","isSyncing","promptedForPersistentStorage","anyOfflineItemSyncErrors","select","storeItems","storeItem","_collapsed","timeLog","timeEnd","apiGlobal","childMapRef","rootDep","dep","deps","round","isSuccess","currentOffline","storage","persistent","itemsToSync","spawn","currentOfflineItem","lastUpdate","race","take","networkActionTypes","persistNetworkStatus","takeLatest","OFFLINEITEM_DEPSMAP_REQUEST","fork","pingUrl","networkActions","startWatchNetworkStatus","Request","getUser","logoutUser","userSaga","web_version","provider_fileVersion","provider_serviceVersion","features","getFavorites","checkIsFav","refreshFavorites","favoritesSaga","breadcrumbSelector","stateFavoritesStatus","favoritesFetched","stateFavorites","takeEvery","getCards","refreshCards","cardsSaga","lib","cancelled","workflowSaga","getTree","treeSaga","getDocs","exportToCsv","docsSaga","FileSaver","saveAs","resetFilters","setFilterByRef","setFilterByName","getDocsLayout","setFilterText","resultSelector","currentItemSelector","formatIdSelector","ResetFilters","GetDefaults","colName","newfilters","newfilter","GetFilterValueAsString","newFilters","currentItemLoaded","currentItem","docsresult","loadSettings","calcCurrentItem","saveCurrentItem","currentItemSaga","togglesSelector","panesSelector","ignoredViews","isIgnoredView","currentItemName","getName","getKey","shouldPersist","viewStorage","cacheStorage","togglename","getSearchResult","getSearchCountResult","renameSearchFavorite","updateResultToggle","resetResultToggle","resetSearch","updateSearchFormToggles","getSearchFormList","getSearchForm","getGlobalDefault","searchSaga","forms","thumbnailsSaga","getThumbnail","actionChannel","buffers","expanding","requestChan","getToken","notificationLoop","actionLoop","notificationsSaga","createSocket","HubConnectionBuilder","withAutomaticReconnect","nextRetryDelayInMilliseconds","retryContext","elapsedMilliseconds","configureLogging","withUrl","accessTokenFactory","build","signalChannel","connection","eventChannel","emit","onreconnecting","ping","onreconnected","connectionId","onclose","chan","triggerNotificationAPI","toastSaga","Notification","triggerReactToastify","notificationType","handleCommandActionRequest","updateCommandActionStatus","handleQueueRequest","executeCommandAction","abortCommandAction","removeCommandAction","handleCommandActionQueueAction","pauseQueue","rebuildQueue","watchCommandActionQueue","commandActionSaga","actionHandler","actionMappings","queueMultiple","getToastType","getToastMessage","identifier","report","COMMANDACTION_ABORT","COMMANDACTION_QUEUE_PAUSE","COMMANDACTION_QUEUE_START","requests","docsLayoutSaga","ItemAction","RowResultByLayout","colIndexes","colIdx","extensionColIndex","nameColIndex","_onSingleClick","colIndex","colNameIndex","lastcell","Thumbs","thumb","ItemView_DocListGallery","stripRef","goLeft","goRight","useSwipeable","onSwipeLeft","onSwipeRight","strip","nav","stripInner","ItemView_DocList","onItemUriAction","setViewMode","ViewModes","DocListSimple","minRowHeight","RenderRowComponentClass","setSorting","requestShowFilter","showThumbnails","ItemView_ActivityList","WorkflowActions","workflowActions","page","ItemView_Workflow","wfid","wfs","wf","progressBadge","EnumIcon","enumValues","ReminderItem","reminder","customAction","onEdit","onDelete","reminderTypeEnumValues","CustomActionReminder","reason","readonly","toLocaleDateString","recipient","getLocContextFor","ItemView_Reminder","reminders","setReminders","_reminders","handleSave","_reminder","creator","handleEdit","handleReadOnly","filterByValue","filterAddValue","filterRemove","getActionArgs","opType","ItemView_Filter","showAction","onActionClick","viewMappings","itemView_docList","itemView_activityList","itemView_workflow","itemView_reminder","itemView_filter","Factory","ItemActions","itemView","ActionPanel","shouldRenderItem","itemUriRegex","check_itemUriRegex","check_formatId","backwardsCompatibleShouldBeVisible","rule","endsWith","getContextProps","ActionPanelContainer","allContextProps","useAsyncMemo","folderItemUri","mergeItemActionsConfig","MemoActionPanelContainer","targetViewOrCurrent","negatedViews","defaultViews","userActions","triggerPrint","triggerEditMode","flowId","asModal","mergePartialConfig","unionBy","sysActions","userAction","sysIndex","sa","sysAction","ViewModesMenu","ViewModeIcon","ViewModesButtons","large","ActionMenus","docactivity_context","docactivity_readonly_context","RenderActionMenuItem","menuName","onGetActionTextArguments","divider","RenderActionsMenu","actionMenus","showThumbnail","isMultiSelected","handleSingleClick","handleDoubleClick","handleIconClick","statusColIndex","sizeColIndex","below","attrs","RowResultWithStickyToggle","_initCellMeasurerCache","handleRowMoreClick","handleRowContextMenu","_cellOnContextMenu","handleRowMouseEnter","NoDocs","OpenFiltersButton","hasActiveFilter","IsFiltered","CommandActionButton","ToggleMode","showSearchOperators","clearEnabled","PageStatus","transforms","reducerName","loginInitialState","createTransform","inboundState","outboundState","persistConfig","persistStorage","autoRehydrate","persistReducer","persistStore","PdfSignatureAction","NotificationAction","Show","Hide","Clear","nodata","TrimLocation","pos","parseFloat","rasterId","ParseRadius","RadiusToString","NotAvailable","extendPrototype","localForage","NoStorageDriver","_driver","_initStorage","getItem","clear","iterate","defineDriver","createInstance","driver","INDEXEDDB","LOCALSTORAGE","usage","quota","db","docCount","folderCount","itemKey","LayoutLoader","showDocs","DocListFilterBar","quickFilter","prepFilters","filterBuckets","sortBucket","_getQuickFilterConfig","quickFilterCol","_findCol","defaultFilters","hasFilter","filterCaption","_getFilterDisplay","_getValueOrValues","nameCol","icons","boolean","readOnly","rawData","sectionRendered","section","rowStartIndex","operatorsPerType","Operators","currentYear","fromMonth","toMonth","YearMonthForm","handleChange","getMonths","years","DatePicker","handleYearMonthChange","handleDayChange","valueIndex","utc","startOf","toJSON","Manager","disabledDays","before","captionElement","FilterDateValue","BoolPicker","FilterValue","DocListFilterModal","_onFilter","onFilter","_onOperatorChange","_onValueChange","_resetValues","_resetSelect","_onKeyPress","_getFocusColumnIndex","focusOnFilterName","focusColumnIndex","horizontal","ControlLabel","sm","dropup","UploadHandler","itemUriIndex","indexOrUndefined","docTracker","currentRow","setCurrentRow","refreshEvent","newState","_maybeSetActiveRow","DocListContainer","_loadMoreRowsSimple","_setSorting","_onFilterClose","onFilterClose","_requestShowFilter","_rowStartIndexUpdated","_onContextClick","prevNotInitialFilters","isLayoutChanged","notDefaultFilters","GetDefaultFilters","doclist","reqPageNum","showFilter","breadcrumbName","forceDocListSimple","Bucket","enable","handleSelectAll","handleDeselectAll","handleInvert","Checkbox","isTouchEvent","touches","setMultiple","setActiveRows","handleRemove","handleEsc","keyCode","renderedBucket","SuggestionHandler","docSearchProvider","itemUriFromLocation","errorDetail","setErrorDetail","setItemUri","pSplit","isSearchParam","errorMessage","showValidationBelow","_changeValue","_onFocus","_renderField","baseClassName","validationState","afterHeaderComponentClass","additionalRender","FormsyEditorBaseContainer","withFormsy","ViewerKeysHandler","onNext","onPrev","handleKeyDown","classList","contains","tagName","charCode","persisted_includeSubfolders","persisted_setIncludeSubfolders","changeFilter","toggleSubfolders","placeholderText","toggleTitle","toggleGroup","buttonDeep","si","useHandleSignedPdf","toastRef","useUnmount","useHandlePdfPrint","handleTriggerPrint","useViewerUrl","getDocUrl","usePdfArrowNavigation","iframe","onPdfReady","allowNav","PDFViewerApplication","pdfViewer","isHorizontalScrollbarEnabled","createEvent","initEvent","dispatchEvent","DocViewer","viewerUrl","InlineViewer","isDocDownloadAllowed","MediaViewer","ImageViewer","DocViewerContainer","currentViewer","customViewerUrl","onDocInfoResult","_getUsableViewer","docViewer","flags","imageViewerExtensions","mediaViewerExtensions","hasPdf","NarrowToggle","toggled","narrow","isToggled","setIsToggled","CombinedFiltersMenu","setHeight","setMaxWidth","isNarrow","setIsNarrow","onLoadMore","NoDataContent","_hasMore","_renderRow","isVisible","listGroupItem","treeItem","localizedWebDavName","listGroupItemActive","listLeft","numberOfChildren","expand","noexpand","elementIcon","listName","treeCount","_getActiveTreeNodeIndex","Tree","unfocused","totalItems","renderRow","onScroll","treeNodes","setAll","_onExpand","_onLoadMore","SupportGeoPointEdit","getGeoPointProvider","SupportGeoRadiusEdit","getGeoRadiusProvider","ip_commandAction","ip_archive","ip_browse","ip_edit","ip_properties","folder_delete","folder_editClassification","EnumRenderer","ButtonGroup","activeLabels","EnumEditorControl","handleFlagsChange","Fragment","EnumRenderComponent","ShareActionForm","onConfirm","shareAction","handleShareAsChange","nameAndIndex","indexValue","shareAs","handleConfirmedChange","typeEnumValues","aclEnumValues","expires","acl","isGreaterThanNow","ShareActionEditorControl","bsClass","PrincipalEditorControl","localNewUserIdRef","createUser","createGroup","newUserIdRef","setKeyword","getNewId","AsyncCreatable","Async","createOptionPosition","isValidNewOption","selectValue","selectOptions","principal","validationRules","getNewOptionData","optionLabel","handleInputChange","handleSearchAsYouType","optionRenderer","defaultOptions","SharePrincipalForm","onRemove","sharePrincipal","aclEnumValuesWithDefault","aclEnumValuesOrEmpty","withDefault","defaultAcl","SharePrincipalEditorControl","currentPrincipal","currentIdx","principals","empty","noBorder","ExternalUserViewerControl","getShareDate","getBytes","bytes","pow","getMailLink","getActionKey","getEnumIcon","ShareActionViewerControl","AttachmentsViewerControl","attachments","showBytes","attachment","ShareForm","setCanSubmit","handleConfirm","isAdvanced","setIsAdvanced","allowedShareActionFlags","disableSubmit","enableSubmit","isActionEdit","setIsActionEdit","oldAdvanced","setOldAdvanced","toggleFlag","flag","setFlag","newUserId","changedPrincipals","externalUsers","handleUserRemove","ShareAction","SharePrincipal","ExternalUser","Attachments","getShare","shareType","allowedFlags","ShareModal","canEdit","allowedShareActionFlagsFromProps","shareTypeFromProps","isAdvancedFromSettings","persistIsAdvancedToSettings","shareTypeFromSettings","persistShareTypeToSettings","isPersisted","persistIsPersisted","setShare","setShareAs","setIsSubmitting","setAllowedShareActionFlags","openShareModal","shareTypeKey","changeShareType","newShareTypeKey","handlePersistSettings","upsertShare","webLinks","syncLinks","getMailSyncLink","getMailWebLink","SHARE","subject","web","sync","proposedShareAs","proposed","getAttachment","getModalProps","allowedActions","allowedAcl","shareTypeFromContext","folder_emailAttachment","folder_preview","folderUri","search_favorite","endpoint","search_preview","searchResultUrl","doc_resetFilters","doc_exportCsv","doc_download","temporaryDownloadLink","setAttribute","appendChild","removeChild","doc_delete","ExpandButton","viewBox","CompressButton","ModalFullscreenButton","isFullscreen","openDocModal","activeRowIndexFromProps","onReopenWith","setActiveRowIndex","minCount","setMinCount","maxCount","fullScreenHandle","useFullScreenHandle","isNextDisabled","isPrevDisabled","handleDeletedWhileOpen","nextRowIndex","toggleFullscreen","exit","enter","handle","allowTogglesFromQueryString","TopRowExtras","prevDisabled","nextDisabled","doc_preview","docModalProps","doc_related","relatedDocsProps","UploadModal","handleCancel","openUploadModal","doc_upload","UploadVersionModal","cancelAll","_onFileAdded","_onUploadSuccess","resp","uploadURL","callback","openUploadVersionModal","doc_uploadVersion","doc_emailLink","doc_emailAttachment","doc_editClassification","doc_editWebDav","webDavUrl","SupportedExtensions","doc_editCloud","webEditUrl","specs","useFormTokens","encodedContext","rawValues","tokenizedUrl","lockApi","unlockApi","subscribeApi","unsubscribe","handleUnsubscribe","confirm","getFileNameFromContentDisposition","contentDisposition","matches","decodeURI","share_web","isDocSendByEmailAllowed","NameModal","_isValid","newName","validationMessage","_validationState","validation","okButton","nameLabel","openNameModal","ValidateTemplate","newTargetFolderName","$NAME$","CheckJobStatus","times","interval","setInterval","clearInterval","newTargetItemUri","createFolder_template","workflows","ListWorkflowsModal","aria-labelledby","startLink","openListWorkflowsModal","wf_start","FlowCardImage","ItemFlowsList","selectedFlow","suggested","isSuggested","renderCardItem","flexWrap","CategoryFilter","CustomItemFlow","setDefaultValues","nameField","onCreate","previewNewItem","onCreated","CustomUploadSelection","iframeRef","cbAddFile","isRemote","DocumentSelection","onFileAdded","onFileRemoved","openCustomUrl","numOfFiles","setOpen","DocumentSelectionWithRef","setFiles","_updateFiles","_onCreate","flowsMappings","itemFlow_custom","itemFlow_document","itemFlow_docTemplate","itemFlow_folder","itemFlow_folderTemplate","ComponentClass","ItemFlows","_updateToggles","_getTotalCount","filteredFlows","_filterList","_getFilteredList","_onFilterTypeChange","_onFormCancel","_onCreated","onDone","selectedCategory","ItemFlowsContainer","setSelectedFlow","setSelectedCategory","visibleFlowIds","categoryId","ItemFlowsModal","openItemFlowsModal","itemFlows","transferApi","recyclebin_docClear","recyclebin_docRestore","recyclebin_folderClear","recyclebin_folderRestore","FormModal","formProps","footerRef","setEditAllowed","formmodal","notAuthorizedWrapper","notAuthorizedIcon","openFormModal","editClassification","clipboard_copyItemUri","clipboard_copyItemLink","RasterLayer","layer","onMoveUp","onMoveDown","layerContainer","arrows","btnDelete","LayersEditor","onMapEdit","removeLayer","renameLayer","newMap","editAction","moveUp","moveDown","RasterMapManagerModal","setMap","addLayer","selectedItemUri","saveMap","openRasterMapManagerModal","raster_manage","EnumViewerControl","renderedValue","ReminderForm","allowReminderTypeEdit","hasFlag","getReminder","setDate","ReminderManagerModal","reminderFromProps","setReminder","setIsDirty","handleCanSubmit","openReminderManagerModal","reminder_manage","offline_add","offline_delete","offline_syncItem","folder_emailLink","doclist_resetFilters","doclist_exportCsv","appInsights","trackEvent","UppyExif","extractExif","reader","FileReader","readyState","parser","metadata","tags","readAsArrayBuffer","uppyPendingUploadsCountSelector","DEFAULT_UPPY_ID","pendingCount","fileId","uploadComplete","uppyIsResumingUploadsSelector","currentUploads","uploadStarted","mapToUppyLocale","bg","cs","de","en","es","fr","hu","it","ru","sk","uk","lt","autoProceed","allowMultipleUploads","_uppy","authorization","use","Tus","withCredentials","resume","autoRetry","limit","retryDelays","removeFingerprintOnSuccess","Webcam","facingMode","countdown","modes","mirror","Lexmark","UppyLexmark","ThumbnailGenerator","thumbnailWidth","localStorage","GoldenRetriever","DOMException","UppyMsg","isNetworkError","exists","removeFile","ConfirmModal","confirmStyle","locId","getItemActionLocalizationIdentifier","len","filterDef","GetDefaultOperatorForType","docsItemUriSelector","docsStatusSelector","docsErrorSelector","docsColsSelector","docsRowsSelector","docsTotalCountSelector","docsFiltersSelector","docsSortsSelector","docsFlagsSelector","docsFlagsIsDocEditAllowedSelector","docsFlagsIsDocAssignmentAllowedSelector","docsFlagsIsFolderClassificationEditAllowedSelector","docsFlagsIsDocClassificationEditAllowedSelector","abbrNum","decPlaces","abbrev","PrevDocButton","NextDocButton","onFullscreen","_uploadVersion","_maybeTriggerEditMode","isDocClassificationEditAllowed","_onDocInfoResult","isFlatAU","isDocEditAllowed","_isRecycleBin","_onCancelForm","_onShowVersion","currentVersionItemUri","_isDeleted","_isParentDeleted","docName","formInEditMode","mapStateToProps","onWindows","DocumentWithoutHash","Toggles","home","news","searchresult","isCallback","flexShrink","wrapperStyle","forceUpdateGrid","LocalStore","localStore","GeoRadiusInput","_parseFromString","radiusIn","locRadius","_displayUnit","meter","_fireChangedValue","_onRadiusChange","_onManualLocation","onManualLocation","dropdownButton","InputGroup","unit","UNSAFE_componentWillReceiveProps","SearchValueTypeOperatorsMapping","SearchOperators","operators","getOperatorsForField","toSearchEditor","upstreamOnChange","_onChangeValue","_onChangeOperator","searchOperator","toBetweenEditor","WrappedComponent1","WrappedComponent2","value1","value2","_onChangeValue1","_onChangeValue2","GeoRadiusEditorControl","RelativeDateEditorControl","SearchLookupEditorControl","SearchTextEditorControl","SearchNumberEditorControl","SearchDateEditorControl","RelativeDateSearchControl","GeoSearchRadiusEditorControl","GeoSearchAreaEditorControl","SearchBetweenNumberEditorControl","SearchBetweenDateEditorControl","AttributeSearch","searchTextEditor","searchRelativeDataEditor","EASearchForm","fieldComponentClass","setIsValid","isChanged","setIsChanged","_onValidChanged","valid","onValidated","currentValues","SearchFormContainer","_hasChanged","ind","_onValidated","oldValue","_clear","curr","_toFilterValue","changedField","keywordField","customId","getRadianAngle","degreeValue","PI","createImage","Image","getCroppedImg","imageSrc","pixelCrop","rotation","canvas","getContext","translate","rotate","drawImage","getImageData","putImageData","toDataURL","degrees","Rotation","onRotate","setRotation","array","clampInRange","Zoom","maxZoom","onZoom","ImageEditorModal","_onDone","croppedAreaPixels","croppedImage","_onCropChange","crop","_onCropComplete","croppedArea","_onZoomChange","zoom","_onRotationChange","aspect","cropShape","minZoom","onCropChange","onCropComplete","onZoomChange","onRotationChange","openImageEditorModal","UploadImage","_onDrop","_validateFile","_processFile","_onBrowse","_input","_onBrowseChange","accept","readAsDataURL","_onEdit","_parseValueAsImageResultDTO","fallback","hideEdit","viewer","middle","_path","_extends","arguments","apply","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","SvgTarget","svgRef","titleId","xmlns","xmlnsXlink","enableBackground","xmlSpace","ForwardRef","LocatorButton","onSetLocation","_buttonStatus","ariaLabel","GeoPointInput","changeValueFromPlace","_setCurrentLocation","_setLocationManually","_supportGeoPointEdit","onTriangulate","onSetLocationManually","GeoRasterInput","_refreshId","_refreshRoute","parentItemUri","doRefresh"],"mappings":"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ACpDoE,EAAM+S,MAAQ/S,EAAM+S,KAAKnX,IAAmC,MAA1BoE,EAAM+S,KAAKnX,GAAM2mB,MAC7CviB,EAAM+S,KAAKnX,GAAM2mB,OAChB,EACEsR,EAAwB7zB,GAAkBA,EAAM+S,KAAK7L,SACrD4sB,EAAyB,CAAC9zB,EAAepE,OAClDoE,EAAM+S,OAAQ/S,EAAM+S,KAAK1I,WAAWzO,KAC9BoE,EAAM+S,KAAK1I,WAAWzO,GAEnBm4B,EAAuB,CAChC/zB,EACApE,EACAiC,IAEAmC,EAAM+S,MACN/S,EAAM+S,KAAK,WACX/S,EAAM+S,KAAK,UAAUlV,IACrBmC,EAAM+S,KAAK,UAAUlV,GAASjC,GACxBoE,EAAM+S,KAAK,UAAUlV,GAASjC,GAAMgmB,UACnC,G,qBCrNX,IAAIvnB,EAAM,CACT,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,IAED,iBAAkB,CACjB,KACA,EACA,IAED,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,IAED,iBAAkB,CACjB,KACA,EACA,IAED,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,IAED,iBAAkB,CACjB,KACA,EACA,IAED,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,IAED,iBAAkB,CACjB,KACA,EACA,IAED,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,IAED,iBAAkB,CACjB,KACA,EACA,IAED,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,IAED,iBAAkB,CACjB,KACA,EACA,IAED,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,IAED,iBAAkB,CACjB,KACA,EACA,IAED,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,IAED,iBAAkB,CACjB,KACA,EACA,IAED,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,IAED,iBAAkB,CACjB,KACA,EACA,IAED,UAAW,CACV,KACA,EACA,IAED,aAAc,CACb,KACA,EACA,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","file":"static/js/main.df6ede20.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"ProgressModal_modal__1ZVkJ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"UploadVersionModal_modal__2h70W\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"itemflows\":\"ItemFlowsModal_itemflows__1RW_r\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"LayersEditor_wrapper__3Fsse\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"RasterMapModal_modal__m_kKJ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"reminder\":\"ReminderManagerModal_reminder__3jeJJ\",\"modal\":\"ReminderManagerModal_modal__3LBpC\",\"button\":\"ReminderManagerModal_button__X91LK\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"enum\":\"EnumViewerControl_enum__1YC5A\"};","// @flow\r\nimport React, { type Node } from \"react\";\r\nimport queryString from \"data/queryString\";\r\nimport { Location } from \"history\";\r\n\r\nconst QueryMatchRoute = ({\r\n location,\r\n query,\r\n render,\r\n}: {\r\n location: Location,\r\n query: Object,\r\n render: (params: Object) => React.Element,\r\n}) => {\r\n // parse current URL\r\n const qs = queryString.parse(location.search);\r\n // when no required query parameters it will match only when no other URL parameters\r\n let isMatch = query == null && Object.keys(qs).length === 0;\r\n if (!isMatch) {\r\n isMatch =\r\n // no query but other URL parameters?\r\n query == null\r\n ? false // -> no match\r\n : Object.keys(query).every((key) => {\r\n // check each required URL parameter\r\n // required parameter can be anything -> make sure it's just there\r\n if (query[key] === null) return qs[key] != null;\r\n // required parameters needs to match a value -> make sure it's the same\r\n return qs[key] != null && qs[key] === query[key];\r\n });\r\n }\r\n // if matched then render component, otherwise null\r\n return isMatch ? render(qs) : null;\r\n};\r\nQueryMatchRoute.displayName = \"QueryMatchRoute\";\r\n\r\nconst QueryMatch = ({\r\n location,\r\n children,\r\n}: {\r\n location: Location,\r\n children: Node,\r\n}) =>\r\n React.Children.map(children, (child, index) => {\r\n // console.log(child);\r\n if (child.type === QueryMatchRoute) {\r\n return React.cloneElement(child, { location });\r\n } else {\r\n console.error(\r\n `Unsupported child of type ${child.type} for QueryMatch!`\r\n );\r\n }\r\n });\r\nQueryMatch.displayName = \"QueryMatch\";\r\n\r\nQueryMatch.Route = QueryMatchRoute;\r\nexport default QueryMatch;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { usePendingUploads } from \"hooks\";\r\nimport {\r\n type CardItemResultDTO,\r\n CardType,\r\n CardItemType,\r\n SearchItemType,\r\n type SidebarItemDTO,\r\n} from \"data/types\";\r\nimport { type uppyFile } from \"data/uppy\";\r\nimport CardList from \"components/CardList\";\r\nimport { History } from \"history\";\r\nimport { withRouter } from \"react-router\";\r\nimport { isFileTypeMatch, isFileTagMatch } from \"./uppyFileMatchUtils\";\r\nimport queryString from \"data/queryString\";\r\nimport Constants from \"data/constants\";\r\nimport { globalSitesAreaSelector } from \"data/storeHelper\";\r\nimport \"./index.css\";\r\nimport { openPickerModal, PickerType } from \"components/PickerModal\";\r\nimport loc from \"i18next\";\r\n\r\nfunction createLink(archiveTarget: CardItemResultDTO): string {\r\n switch (archiveTarget.uri) {\r\n case \"at-fav\":\r\n case \"at-rec\":\r\n case \"at-search\":\r\n case \"at-picker\":\r\n return archiveTarget.uri;\r\n // return `at-sf/${archiveTarget.searchItem.id}`;\r\n\r\n default:\r\n // pre-defined searchform?\r\n if (\r\n archiveTarget.searchItem &&\r\n archiveTarget.searchItem.id !== -1\r\n ) {\r\n if (archiveTarget.searchItem.searchType === SearchItemType.Form)\r\n return \"sf-custom\";\r\n else return \"sf\";\r\n }\r\n return \"uri\"; //just open the card\r\n }\r\n}\r\n\r\n/**\r\n * will check if an archiveTargets should be visible, e.g. defined extras.fileTypes or extra.fileTags when it's supposed to be visible\r\n * by matching it with the first pending file upload, or hide with disabled Globalsites Area\r\n * @param {Array} archiveTargets\r\n * @param {?Array} pendingUploads\r\n * @param {?Array} globalSites\r\n */\r\nconst filterArchiveTargets = (\r\n archiveTargets: Array,\r\n pendingUploads: ?Array,\r\n globalSites: ?Array\r\n) =>\r\n archiveTargets.filter((at) => {\r\n // check if GlobalSites Area is disabled\r\n if (at.uri === \"at-picker\" && globalSites == null) {\r\n console.info(\r\n `ArchiveTarget '${at.name}' skipped due to disabled GlobalSites Area (inPoint.Standalone > Admin > GeneralSettings > show/hide Globalsites)`\r\n );\r\n return false;\r\n }\r\n /* istanbul ignore if */\r\n if (pendingUploads == null || pendingUploads.length === 0) return true;\r\n /* istanbul ignore if */\r\n if (at.extras == null || at.extras.length === 0) return true;\r\n\r\n // check for any fileType match\r\n /* istanbul ignore else */\r\n if (at.extras.fileTypes && at.extras.fileTypes.length > 0) {\r\n let result = isFileTypeMatch(\r\n pendingUploads[0],\r\n at.extras.fileTypes\r\n );\r\n /* istanbul ignore else */\r\n if (!result) {\r\n console.info(\r\n `ArchiveTarget '${at.name}' skipped due to .fileTypes requirement`,\r\n at.extras.fileTypes\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n // check all required file tags\r\n /* istanbul ignore else */\r\n if (at.extras.fileTags && at.extras.fileTags.length > 0) {\r\n let result = isFileTagMatch(pendingUploads[0], at.extras.fileTags);\r\n /* istanbul ignore else */\r\n if (!result) {\r\n console.info(\r\n `ArchiveTarget '${at.name}' skipped due to .fileTags requirement`,\r\n at.extras.fileTags\r\n );\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n\r\ntype Props = {\r\n /** list of archiveTargets to display */\r\n archiveTargets: Array,\r\n /** React-Router withRouter History object */\r\n history: History,\r\n};\r\n\r\n/**\r\n * render the main archiveTargets as defined in appsettings.json\r\n */\r\nexport const ArchiveTargetList = ({ archiveTargets = [], history }: Props) => {\r\n const pendingUploads = usePendingUploads();\r\n const globalSites = globalSitesAreaSelector();\r\n\r\n const onCardClick = (archiveTarget: CardItemResultDTO, uri?: string) => {\r\n const qs = uri\r\n ? queryString.stringify({\r\n mode: \"uri-custom\",\r\n uri,\r\n })\r\n : queryString.stringify({\r\n id: archiveTarget.id,\r\n mode: createLink(archiveTarget),\r\n });\r\n history.push({\r\n search: \"?\" + qs,\r\n });\r\n };\r\n\r\n const showOnMoreClick = (card) =>\r\n card.type === CardType.Action && card.itemtype === CardItemType.Folder;\r\n\r\n const onMoreClick = async (card) => {\r\n const uri = await openPickerModal({\r\n pickerType: PickerType.Folder,\r\n scopeBreadcrumb: true,\r\n itemUri: card.uri,\r\n helpText: loc.t(\"upload:at-picker.description\"),\r\n });\r\n if (uri === false) return false;\r\n onCardClick(card, uri);\r\n };\r\n\r\n return (\r\n onCardClick(card)}\r\n />\r\n );\r\n};\r\n\r\nArchiveTargetList.displayName = \"ArchiveTargetList\";\r\nexport default withRouter(ArchiveTargetList);\r\n","// @flow\r\nimport { getFileExtension } from \"data/utils\";\r\nimport { type uppyFile } from \"data/uppy\";\r\nimport match from \"mime-match\";\r\n\r\nexport /**\r\n * will match an uppyFile to a list of allowed fileTypes (extension or media types)\r\n *\r\n * @param {uppyFile} file\r\n * @param {?Array} fileTypes\r\n * @returns {boolean} true if no fileTypes configured or a match, otherwise false if not matched\r\n */\r\nconst isFileTypeMatch = (\r\n file: uppyFile,\r\n fileTypes: ?Array\r\n): boolean => {\r\n if (fileTypes == null) return true;\r\n const ext = getFileExtension(file.name).toLowerCase();\r\n const isFileType = fileTypes.some((type) => {\r\n // is this is a mime-type\r\n if (type.indexOf(\"/\") > -1) {\r\n /* istanbul ignore next */\r\n if (!file.type) return false;\r\n return match(file.type.replace(/;.*?$/, \"\"), type);\r\n }\r\n\r\n // otherwise this is likely an extension\r\n /* istanbul ignore else */\r\n if (type[0] === \".\") {\r\n return ext === type.toLowerCase();\r\n }\r\n return false;\r\n });\r\n return isFileType;\r\n};\r\n\r\nexport /**\r\n * will validate that all fileTags are specified in uppyFile\r\n *\r\n * @param {uppyFile} file\r\n * @param {?Array} fileTags\r\n * @returns {boolean} true if no fileTags configured or all exist, otherwise false if any missing\r\n */\r\nconst isFileTagMatch = (file: uppyFile, fileTags: ?Array): boolean => {\r\n if (fileTags == null) return true;\r\n return fileTags.every((tag) =>\r\n Object.prototype.hasOwnProperty.call(file, tag)\r\n );\r\n};\r\n","// @flow\r\nimport React from \"react\";\r\nimport { type CardItemResultDTO } from \"data/types\";\r\nimport Header from \"components/Header\";\r\nimport SearchInput from \"@hs/search-input\";\r\n\r\ntype Props = {\r\n /** current ArchiveTarget */\r\n archiveTarget: CardItemResultDTO,\r\n /** callback when user clicks Cancel */\r\n onCancel: () => void,\r\n /** callback when user types anything into filter text\r\n * @param {string} filterText filterText to apply\r\n */\r\n onFilterTextChange?: (filterText: string) => void,\r\n /** current filterText value */\r\n filterText?: string,\r\n};\r\n\r\n/**\r\n * renders an ArchiveTarget panel header\r\n */\r\nconst ArchiveTargetHeader = ({\r\n archiveTarget,\r\n onCancel,\r\n onFilterTextChange,\r\n filterText,\r\n}: Props) => (\r\n \r\n }\r\n />\r\n);\r\n\r\nArchiveTargetHeader.displayName = \"ArchiveTargetHeader\";\r\nexport default ArchiveTargetHeader;\r\n","// @flow\r\nimport React from \"react\";\r\nimport {\r\n type CardItemResultDTO,\r\n type CardItemDTO,\r\n type CardTypeEnum,\r\n CardItemType,\r\n} from \"data/types\";\r\nimport ArchiveTargetHeader from \"components/ArchiveTargets/ArchiveTargetHeader\";\r\nimport CardList from \"components/CardList\";\r\nimport { type ConstantsEnum } from \"data/constants\";\r\n\r\ntype Props = {\r\n /** callback when user cancels */\r\n onCancel: () => void,\r\n /** callback when user clicks a card */\r\n onClick: (card: CardItemDTO) => void,\r\n /** current ArchiveTarget */\r\n archiveTarget: CardItemResultDTO,\r\n /** current cards loading status */\r\n status: ConstantsEnum,\r\n /** list of cards */\r\n cards: Array,\r\n /** filter by CardType */\r\n cardType: CardTypeEnum,\r\n};\r\n\r\ntype State = {\r\n filterText: string,\r\n};\r\n\r\nclass ArchiveTargetCards extends React.PureComponent {\r\n state = { filterText: \"\" };\r\n\r\n _onFilterTextChange = (filterText: ?string) =>\r\n this.setState({\r\n filterText: filterText || \"\",\r\n });\r\n\r\n _getFilteredCards = () =>\r\n this.props.cards.filter(\r\n (c) =>\r\n this.state.filterText.length === 0 ||\r\n c.name.toLowerCase().indexOf(this.state.filterText) >= 0\r\n );\r\n\r\n render() {\r\n const {\r\n onCancel,\r\n onClick,\r\n archiveTarget,\r\n status,\r\n cardType,\r\n } = this.props;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ArchiveTargetCards;\r\n","// @flow\r\nimport React from \"react\";\r\nimport {\r\n type CardItemResultDTO,\r\n type CardItemDTO,\r\n type CardTypeEnum,\r\n} from \"data/types\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport ArchiveTargetCards from \"./ArchiveTargetCards\";\r\nimport { getCardsAction } from \"data/actions\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\ntype Props = {\r\n /** which card type to show - CardType.Rec or CardType.Fav */\r\n cardType: CardTypeEnum,\r\n /** current ArchiveTarget */\r\n archiveTarget: CardItemResultDTO,\r\n /** callback when user selects a Recent card */\r\n onClick: (card: CardItemDTO) => void,\r\n /** callback when user clicks Cancel */\r\n onCancel: () => void,\r\n /** Redux home cards loading status */\r\n status: ConstantsEnum,\r\n /** Redux home cards */\r\n cards: Array,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n};\r\n\r\nexport const ArchiveTargetHomeCards = ({\r\n cardType,\r\n archiveTarget,\r\n onClick,\r\n onCancel,\r\n status,\r\n cards,\r\n dispatch,\r\n}: Props) => {\r\n if (status === Constants.NONE) {\r\n dispatch(getCardsAction());\r\n }\r\n return (\r\n \r\n );\r\n};\r\nArchiveTargetHomeCards.displayName = \"ArchiveTargetHomeCards\";\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n status: s.cardsStatusSelector(state),\r\n cards: s.cardsCardsSelector(state) || [],\r\n ...ownProps,\r\n});\r\nexport default connect(mapStateToProps)(ArchiveTargetHomeCards);\r\n","// @flow\r\nimport React from \"react\";\r\nimport {\r\n type CardItemResultDTO,\r\n type CardItemDTO,\r\n CardType,\r\n CardItemType,\r\n SearchItemType,\r\n type SearchFormInfoDTO,\r\n} from \"data/types\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport ArchiveTargetCards from \"./ArchiveTargetCards\";\r\nimport { getSearchFormListAction } from \"data/actions\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\ntype Props = {\r\n /** current ArchiveTarget */\r\n archiveTarget: CardItemResultDTO,\r\n /** callback when user selects a Recent card */\r\n onClick: (card: CardItemDTO) => void,\r\n /** callback when user clicks Cancel */\r\n onCancel: () => void,\r\n /** Redux searchForms loading status */\r\n status: ConstantsEnum,\r\n /** Redux searchForms */\r\n cards: Array,\r\n /** Redux Dispatch */\r\n dispatch: Dispatch,\r\n};\r\n\r\nexport const ArchiveTargetSearchFormCards = ({\r\n archiveTarget,\r\n onClick,\r\n onCancel,\r\n status,\r\n cards,\r\n dispatch,\r\n}: Props) => {\r\n if (status === Constants.NONE) {\r\n dispatch(getSearchFormListAction());\r\n }\r\n\r\n return (\r\n ({\r\n id: `sf-${sf.id}`,\r\n searchItem: {\r\n name: sf.name,\r\n id: sf.id,\r\n searchType: SearchItemType.Form,\r\n },\r\n type: CardType.Fav,\r\n itemtype: CardItemType.Search,\r\n name: sf.name,\r\n image: null,\r\n uri: null,\r\n count: -1,\r\n }))}\r\n onClick={onClick}\r\n onCancel={onCancel}\r\n />\r\n );\r\n};\r\nArchiveTargetSearchFormCards.displayName = \"ArchiveTargetSearchFormCards\";\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n status: s.searchFormListStatusSelector(state),\r\n cards: s.searchFormListResultSelector(state) || [],\r\n ...ownProps,\r\n});\r\nexport default connect(mapStateToProps)(ArchiveTargetSearchFormCards);\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport SearchForm from \"containers/SearchForm\";\r\nimport { type SearchItemDTO, type SearchResultRowDTO } from \"data/types\";\r\nimport loc from \"i18next\";\r\nimport SearchResultContainer from \"containers/SearchResult\";\r\nimport Split from \"split.js\";\r\nimport styles from \"./ArchiveTargetSearchForm.module.css\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** searchForm id to render */\r\n id: number,\r\n /** callback when target found\r\n * @param {string} targetItemUri target's itemUri to archive onto\r\n */\r\n onTargetItemUri: (targetItemUri: string) => void,\r\n /** callback when user clicks the Cancel button */\r\n onCancel: () => void,\r\n};\r\n\r\ntype State = {\r\n searchItem: ?SearchItemDTO,\r\n};\r\n\r\nexport class ArchiveTargetSearchForm extends PureComponent {\r\n splitView: Split;\r\n state = {\r\n searchItem: null,\r\n };\r\n\r\n componentDidMount() {\r\n this.splitView = Split(\r\n [`.${styles.searchPanel}`, `.${styles.searchResult}`],\r\n {\r\n sizes: [100, 0],\r\n direction: \"vertical\",\r\n minSize: 0,\r\n gutterSize: 10,\r\n elementStyle: /* istanbul ignore next */ (\r\n dimension,\r\n size,\r\n gutterSize\r\n ) => {\r\n return {\r\n \"flex-basis\":\r\n \"calc(\" + size + \"% - \" + gutterSize + \"px)\",\r\n };\r\n },\r\n gutterStyle: /* istanbul ignore next */ (\r\n dimension,\r\n gutterSize\r\n ) => {\r\n return { \"flex-basis\": gutterSize + \"px\" };\r\n },\r\n }\r\n );\r\n }\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n if (this.props.id !== prevProps.id) {\r\n this.setState({ searchItem: null });\r\n }\r\n if (this.state.searchItem !== prevState.searchItem) {\r\n if (this.state.searchItem == null) {\r\n this.splitView.setSizes([0, 100]);\r\n } else {\r\n this.splitView.setSizes([30, 70]);\r\n }\r\n }\r\n }\r\n\r\n _onSearch = (searchItem: SearchItemDTO) => this.setState({ searchItem });\r\n\r\n _onSearchFormSetTarget = (\r\n activeRowIndex: number,\r\n row?: SearchResultRowDTO\r\n ) => {\r\n if (activeRowIndex !== -1 && row != null) {\r\n this.setState({ searchItem: null });\r\n /* istanbul ignore else */\r\n if (typeof this.props.onTargetItemUri === \"function\")\r\n this.props.onTargetItemUri(\r\n // take itemUri without EID\r\n row.breadcrumb.parts[row.breadcrumb.parts.length - 1]\r\n .itemUri\r\n );\r\n }\r\n return false;\r\n };\r\n\r\n render = () => (\r\n
\r\n
\r\n \r\n
\r\n
\r\n {this.state.searchItem && (\r\n \r\n )}\r\n
\r\n
\r\n );\r\n}\r\nexport default ArchiveTargetSearchForm;\r\n","// @flow\r\nimport React, { useCallback } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { useAsync } from \"hooks\";\r\nimport {\r\n type SearchItemDTO,\r\n type SearchResultRowDTO,\r\n SearchItemType,\r\n} from \"data/types\";\r\nimport SearchResultContainer from \"containers/SearchResult\";\r\nimport styles from \"./ArchiveTargetSearchItem.module.css\";\r\nimport SearchFormHeader from \"components/SearchFormHeader\";\r\nimport {\r\n createSearchItemAsync,\r\n fixSearchFilterName,\r\n} from \"components/CommandActions/searchResult_form\";\r\nimport Status from \"components/Status\";\r\nimport Constants from \"data/constants\";\r\nimport { type uppyFile, uppyPendingFilesMetaSelector } from \"data/uppy\";\r\nimport { tokenize } from \"data/utils\";\r\n\r\nconst updateFilesPlaceholders = (\r\n searchItem: SearchItemDTO,\r\n pendingUploads: Array\r\n) => {\r\n if (pendingUploads == null || pendingUploads.length === 0) return;\r\n if (searchItem.filters && searchItem.filters.length > 0) {\r\n searchItem.filters\r\n // process only filters actually including tokens/placeholders wrapped in {}\r\n .filter(\r\n (filter) =>\r\n filter.value &&\r\n String(filter.value).length > 0 &&\r\n filter.value.indexOf(\"{\") !== -1\r\n )\r\n .forEach((filter) => {\r\n // replace any tokens\r\n const newValue = tokenize(filter.value, pendingUploads[0]);\r\n // only if anything replaced set value\r\n if (newValue !== filter.value) {\r\n filter.value = newValue;\r\n filter.name = fixSearchFilterName(filter.name); //only overwrite value (see SearchQueryConversion.cs)\r\n }\r\n });\r\n }\r\n};\r\n\r\ntype Props = {\r\n /** searchItem to render */\r\n searchItem: SearchItemDTO,\r\n /** callback when target found\r\n * @param {string} targetItemUri target's itemUri to archive onto\r\n */\r\n onTargetItemUri: (targetItemUri: string) => void,\r\n /** callback when user clicks the Cancel button */\r\n onCancel: () => void,\r\n};\r\n\r\nconst ArchiveTargetSearchItem = ({\r\n searchItem,\r\n onTargetItemUri,\r\n onCancel,\r\n}: Props) => {\r\n const pendingUploads = useSelector(uppyPendingFilesMetaSelector);\r\n const newSearchItem = useAsync(async () => {\r\n if (searchItem.searchType === SearchItemType.Form) {\r\n // process {geolocation}/{barcode} tokens requiring async operations\r\n const newSearchItem = await createSearchItemAsync(searchItem);\r\n updateFilesPlaceholders(newSearchItem, pendingUploads);\r\n return newSearchItem;\r\n } else {\r\n // only searchItem.id provided\r\n return searchItem;\r\n }\r\n }, [searchItem]);\r\n\r\n const onSearchFormSetTarget = useCallback(\r\n (activeRowIndex: number, row?: SearchResultRowDTO) => {\r\n /* istanbul ignore else */\r\n if (\r\n activeRowIndex !== -1 &&\r\n row != null &&\r\n typeof onTargetItemUri === \"function\"\r\n ) {\r\n onTargetItemUri(\r\n // take itemUri without EID\r\n row.breadcrumb.parts[row.breadcrumb.parts.length - 1]\r\n .itemUri\r\n );\r\n }\r\n return false;\r\n },\r\n [onTargetItemUri]\r\n );\r\n\r\n return (\r\n
\r\n \r\n {newSearchItem.loading && }\r\n {newSearchItem.error && }\r\n {!newSearchItem.loading &&\r\n !newSearchItem.error &&\r\n newSearchItem.value && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default ArchiveTargetSearchItem;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { History, Location } from \"history\";\r\nimport { withRouter } from \"react-router\";\r\nimport { Dispatch } from \"react-redux\";\r\nimport QueryMatch from \"containers/QueryMatch\";\r\nimport produces from \"immer\";\r\n\r\nimport ArchiveTargetList from \"components/ArchiveTargets/ArchiveTargetList\";\r\nimport ArchiveTargetHomeCards from \"components/ArchiveTargets/ArchiveTargetList/ArchiveTargetHomeCards\";\r\nimport ArchiveTargetSearchFormCards from \"components/ArchiveTargets/ArchiveTargetList/ArchiveTargetSearchFormCards\";\r\nimport ArchiveTargetSearchForm from \"components/ArchiveTargets/ArchiveTargetSearchForm\";\r\nimport ArchiveTargetSearchItem from \"components/ArchiveTargets/ArchiveTargetSearchItem\";\r\nimport { openPickerModal, PickerType } from \"components/PickerModal\";\r\nimport { type ApiError, CardType, CardItemType } from \"data/types\";\r\nimport { getArchiveTargets /*, submitArchiveForm*/ } from \"data/api\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport NoData from \"components/NoData\";\r\nimport { globalSitesAreaSelector } from \"data/storeHelper\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** whether to show list of archive targets */\r\n show: boolean,\r\n /** callback when target found\r\n * @param {string} targetItemUri target's itemUri to archive onto\r\n */\r\n onTargetItemUri: (targetItemUri: string) => void,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** React-Router history object */\r\n history: History,\r\n /** redux isOnline */\r\n isOnline: boolean,\r\n location: Location,\r\n};\r\n\r\ntype State = {\r\n status: ConstantsEnum,\r\n targetItemUri: ?string,\r\n archiveTargets: ?Array,\r\n};\r\n\r\nexport class ArchiveTargetListContainer extends PureComponent {\r\n state = {\r\n targetItemUri: null,\r\n status: Constants.LOADING,\r\n archiveTargets: null,\r\n };\r\n\r\n componentDidMount = () => this._fetch();\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n if (this.props.isOnline !== prevProps.isOnline) {\r\n this._fetch();\r\n }\r\n }\r\n\r\n _fetch = () => {\r\n this.setState({ status: Constants.LOADING });\r\n getArchiveTargets(!this.props.isOnline)\r\n .catch((err: ApiError) => {\r\n this.setState({ status: Constants.ERROR });\r\n return null;\r\n })\r\n .then((result) => {\r\n if (result != null) {\r\n // TODO only one archiveForm -> preselect it - as long as we do not have suggestions, search, browse...\r\n this.setState({\r\n status: Constants.OK,\r\n archiveTargets: result.map((card) =>\r\n produces(card, (draft) => {\r\n draft[\"name\"] = getLocalizedText(draft[\"name\"]);\r\n draft[\"desc\"] = getLocalizedText(draft[\"desc\"]);\r\n })\r\n ),\r\n });\r\n }\r\n });\r\n };\r\n\r\n _setTargetItemUri = (targetItemUri: string) => {\r\n /* istanbul ignore else */\r\n if (targetItemUri != null) {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onTargetItemUri === \"function\") {\r\n this.props.onTargetItemUri(targetItemUri);\r\n }\r\n }\r\n };\r\n\r\n _onCardClick = (cardItem: CardItemDTO) => {\r\n if (cardItem.itemtype === CardItemType.Search) {\r\n this.props.history.push(\"/upload?mode=si\", {\r\n searchItem: cardItem.searchItem,\r\n });\r\n } else {\r\n // direct folder itemUri, use it!\r\n this._setTargetItemUri(cardItem.uri);\r\n }\r\n };\r\n\r\n _onSearchFormClick = (cardItem: CardItemDTO) =>\r\n this.props.history.push(\r\n `/upload?mode=sfid&sfid=${cardItem.searchItem.id}`\r\n );\r\n\r\n _onCancel = () => this.props.history.push(\"/upload\");\r\n\r\n render() {\r\n // #1.....list ready?\r\n if (this.props.show === false) {\r\n return null;\r\n }\r\n\r\n // fetch pending...\r\n if (this.state.archiveTargets == null) {\r\n return ;\r\n }\r\n\r\n // no configured archiveTargets\r\n if (this.state.archiveTargets.length === 0) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n {/* show list of archiveTargets */}\r\n (\r\n \r\n )}\r\n />\r\n {/* Recents */}\r\n (\r\n \r\n )}\r\n />\r\n {/* Favorites */}\r\n (\r\n \r\n )}\r\n />\r\n {/* List searchForms */}\r\n (\r\n \r\n )}\r\n />\r\n {/* when a searchForm is directly configured as a ArchiveTarget with searchType=FreeText */}\r\n (\r\n \r\n )}\r\n />\r\n {/* when clicking a searchForm from within the searchForms list */}\r\n (\r\n \r\n )}\r\n />\r\n {/* when a searchForm is directly configured as a ArchiveTarget with searchType=Form and filters */}\r\n (\r\n \r\n )}\r\n />\r\n {/* when clicking a Recent searchResult (=searchItem) */}\r\n {\r\n if (this.props.location.state == null) {\r\n // missing state - make sure to return to \"base\" if user refreshed browser\r\n this._onCancel();\r\n return ;\r\n } else {\r\n return (\r\n \r\n );\r\n }\r\n }}\r\n />\r\n {/* when a folder's itemUri is directly configured as a ArchiveTarget */}\r\n {\r\n const archiveTarget =\r\n this.state.archiveTargets[params.id];\r\n /* istanbul ignore else */\r\n if (String(archiveTarget.uri).startsWith(\"pam-item\")) {\r\n // make sure to return to \"base\" if user cancelled form submission\r\n this._onCancel();\r\n // let parent know they can now move forward\r\n this._setTargetItemUri(archiveTarget.uri);\r\n }\r\n\r\n return ;\r\n }}\r\n />\r\n {/* when a custom itemUri is passed by the picker */}\r\n {\r\n // istanbul ignore else\r\n if (String(params.uri).startsWith(\"pam-item\")) {\r\n // make sure to return to \"base\" if user cancelled form submission\r\n this._onCancel();\r\n // let parent know they can now move forward\r\n this._setTargetItemUri(params.uri);\r\n }\r\n\r\n return ;\r\n }}\r\n />\r\n\r\n {/* show Picker to choose target */}\r\n {\r\n // find GlobalSites root itemUri\r\n const globalSites = globalSitesAreaSelector();\r\n /* istanbul ignore next */\r\n if (globalSites == null) {\r\n console.warn(\r\n \"Could not figure out root GlobalSites for picker!\"\r\n );\r\n // make sure to return to \"base\" on error\r\n this._onCancel();\r\n return ;\r\n }\r\n // let user pick folder or doc\r\n openPickerModal({\r\n itemUri: globalSites.itemUri,\r\n pickerType: PickerType.Folder,\r\n helpText: loc.t(\"upload:at-picker.description\"),\r\n }).then((itemUri) => {\r\n // user clicked Cancel? Abort\r\n // make sure to return to \"base\" if user cancelled form submission\r\n this._onCancel();\r\n /* istanbul ignore else */\r\n if (itemUri !== false)\r\n // let parent know they can now move forward\r\n this._setTargetItemUri(itemUri);\r\n });\r\n return ;\r\n }}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n isOnline: s.isOnlineSelector(state),\r\n ...ownProps,\r\n});\r\n\r\nexport default withRouter(connect(mapStateToProps)(ArchiveTargetListContainer));\r\n","// @flow\r\n//#region imports\r\nimport React, { PureComponent, type Node } from \"react\";\r\nimport { History } from \"history\";\r\nimport TogglesHandler from \"containers/TogglesHandler\";\r\nimport \"./index.css\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport MainLayout from \"components/MainLayout\";\r\nimport ArchiveTargetListContainer from \"containers/ArchiveTargetList\";\r\nimport FormContainer from \"containers/Form\";\r\nimport UploadSelection from \"components/UploadSelection\";\r\nimport {\r\n setCurrentItemAction,\r\n backupCurrentItemAction,\r\n restoreCurrentItemAction,\r\n} from \"data/actions\";\r\nimport {\r\n type ToggleDTO,\r\n type ToggleItemDTO,\r\n NewFormType,\r\n UploadMode,\r\n} from \"data/types\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { getDefaultsConfig } from \"data/constants\";\r\nimport SplitPanes from \"containers/SplitPanes\";\r\nimport loc from \"i18next\";\r\n// import FloatingBar from \"components/FloatingBar\";\r\nimport uppy, { uppyHasPendingUploadsSelector, type uppyFile } from \"data/uppy\";\r\nimport isEmpty from \"lodash/isEmpty\";\r\nimport { replaceFileExtension } from \"data/utils\";\r\nimport produce from \"immer\";\r\nimport { setUppyRestrictions } from \"components/uppy-restrictions\";\r\nimport Pane from \"components/SplitPanes/Pane\";\r\n//#endregion\r\n\r\nexport const viewName = \"upload\";\r\n\r\n//#region flow types\r\ntype Props = {\r\n /** react-router History */\r\n history: History,\r\n /** whether shown as Modal or full View page */\r\n asModal?: boolean,\r\n /** React Node to show before toolbar */\r\n topRowBefore?: Node,\r\n /** React Node to show after toolbar */\r\n topRowEnd?: Node,\r\n /** callback when closing Modal dialog */\r\n onClose?: () => void,\r\n // from TogglesHandler\r\n /** TogglesHandler callback to set toggles */\r\n setToggles: Function,\r\n /** TogglesHandler this view's toggles definitions */\r\n toggles: ?ToggleDTO,\r\n // from redux\r\n /** current itemUri (or if {@link asModal} = true) */\r\n itemUri: string,\r\n /** current formatId */\r\n formatId: number,\r\n /** whether archive form should be displayed */\r\n noItemUri: boolean,\r\n /** current viewName */\r\n viewName: string,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** which toggles are currently selected */\r\n selectedToggles: Array,\r\n /** whether there are any pending uploads */\r\n uppyHasPendingUploads: boolean,\r\n /** SplitPanes callback to set split sizes */\r\n setSplitSizes: Function,\r\n /** Redux formDefaults */\r\n defaults: ?Object,\r\n};\r\n\r\ntype State = {\r\n itemUri: ?string,\r\n isFormButtonEnabled: boolean,\r\n};\r\n//#endregion\r\n\r\nexport class Upload extends PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n itemUri: props.itemUri,\r\n isFormButtonEnabled: true,\r\n };\r\n this._updateUppyOptions(props.itemUri, props.formatId);\r\n }\r\n\r\n componentDidMount() {\r\n const { dispatch, itemUri, viewName } = this.props;\r\n dispatch(backupCurrentItemAction());\r\n dispatch(setCurrentItemAction({ name: viewName, itemUri }));\r\n this._updateFormToggle(this.props.uppyHasPendingUploads);\r\n this._maybeResetArchiveTarget(this.props.uppyHasPendingUploads);\r\n }\r\n\r\n componentWillUnmount() {\r\n const { dispatch } = this.props;\r\n dispatch(restoreCurrentItemAction());\r\n }\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n const { dispatch, viewName, itemUri, uppyHasPendingUploads, formatId } =\r\n this.props;\r\n /* istanbul ignore else */\r\n if (prevProps.itemUri !== itemUri) {\r\n this.setState({ itemUri });\r\n // this.setState({ isFlatAU: undefined, formInEditMode: false });\r\n dispatch(\r\n setCurrentItemAction({\r\n name: viewName,\r\n itemUri,\r\n })\r\n );\r\n this._updateUppyOptions(itemUri, formatId);\r\n }\r\n /* istanbul ignore else */\r\n if (prevState.itemUri !== this.state.itemUri) {\r\n this._updateUppyOptions(this.state.itemUri, formatId);\r\n }\r\n /* istanbul ignore else */\r\n if (prevProps.uppyHasPendingUploads !== uppyHasPendingUploads) {\r\n // reset currently shown breadcrumb\r\n if (uppyHasPendingUploads === false) {\r\n this.setState({ itemUri });\r\n this._updateUppyOptions(itemUri, formatId);\r\n }\r\n this._updateFormToggle(uppyHasPendingUploads);\r\n this._maybeResetArchiveTarget(uppyHasPendingUploads);\r\n }\r\n }\r\n\r\n _updateUppyOptions = (itemUri: string, formatId: ?number) => {\r\n const defaults = getDefaultsConfig(\r\n itemUri || \"pam-item://\",\r\n formatId || -1\r\n );\r\n /* istanbul ignore else */\r\n if (defaults) setUppyRestrictions(uppy, defaults.upload);\r\n };\r\n\r\n _updateFormToggle = (uppyHasPendingUploads: boolean) => {\r\n /* istanbul ignore if */\r\n if (this.props.toggles == null) return;\r\n // form toggles visibility\r\n const toggles = this.props.toggles.toggles.map(\r\n (toggle: ToggleItemDTO) => {\r\n toggle.isDisabled =\r\n toggle.value === \"form\" && !uppyHasPendingUploads;\r\n toggle.isSelected =\r\n toggle.value === \"files\" ||\r\n (toggle.value === \"form\" && uppyHasPendingUploads);\r\n return toggle;\r\n }\r\n );\r\n /* istanbul ignore else */\r\n if (toggles != null) {\r\n this.props.setToggles({\r\n name: viewName,\r\n isMultiple: true,\r\n toggles,\r\n });\r\n }\r\n };\r\n\r\n _maybeResetArchiveTarget = (uppyHasPendingUploads: boolean) => {\r\n /* istanbul ignore else */\r\n // Reset upload if archive target can be set, and history is available\r\n if (\r\n this.props.noItemUri &&\r\n this.props.history &&\r\n !uppyHasPendingUploads\r\n ) {\r\n this.props.history.push(\"/upload\");\r\n }\r\n };\r\n\r\n // _onActionShouldBeVisible = (action: { id: string }): boolean => {\r\n // return true;\r\n // };\r\n\r\n // _onAction = (actionId: string): void => {\r\n // const { itemUri } = this.props;\r\n\r\n // switch (actionId) {\r\n // /* istanbul ignore next */\r\n // default:\r\n // console.warn(actionId + \": \" + itemUri);\r\n // break;\r\n // }\r\n // };\r\n\r\n /**\r\n * will try to get the first filename available\r\n * @returns {string} filename or null if nothing found\r\n * @memberof Upload\r\n */\r\n _getWebDavNameHint = () => {\r\n const files: Array = uppy.getFiles();\r\n const firstFile = files.find((f) => f.meta && f.meta.itemUri == null);\r\n return firstFile ? firstFile.meta.name : null;\r\n };\r\n\r\n /**\r\n * will return defaultValues to pass on to form\r\n * @returns defaultValues or null if no filename found\r\n * @memberof Upload\r\n */\r\n _getDefaultValues = () => {\r\n const defaults = Object.assign({}, this.props.defaults);\r\n const WebDavName = this._getWebDavNameHint();\r\n if (WebDavName) defaults[\"$NAME$\"] = WebDavName;\r\n if (!isEmpty(defaults)) return defaults;\r\n else return null;\r\n };\r\n\r\n /**\r\n * called when user clicks on Save in {@link FormContainer}\r\n * @async\r\n * @param {Object} model the form's values\r\n * @memberof Upload\r\n * @returns {boolean} true if success, false otherwise\r\n */\r\n _onSaveNew = async (\r\n model: Object,\r\n keepOriginalFilename: boolean = false\r\n ): Promise => {\r\n const files: Array = uppy.getFiles();\r\n if (files.length === 0) {\r\n // alert(\"No Files to archive!\");\r\n return;\r\n }\r\n this.setState({ isFormButtonEnabled: false });\r\n\r\n files.forEach((file) => {\r\n // has itemUri set (from previous failure?)\r\n if (file.meta.itemUri == null) {\r\n // #46997 let's fix the file extension\r\n // HACK\r\n const newModel = produce(model, (draft) => {\r\n draft.ip[\"$NAME$\"] = replaceFileExtension(\r\n model.ip[\"$NAME$\"], // first filename\r\n file.extension // current real extension\r\n );\r\n });\r\n\r\n // attach classification form (ip/ea) to each file's metadata (managed server-side by TusMiddleware.cs)\r\n uppy.setFileMeta(file.id, {\r\n itemUri: this.state.itemUri,\r\n mode: UploadMode.CreateDocument,\r\n model: JSON.stringify(newModel),\r\n keepOriginalFilename,\r\n });\r\n }\r\n });\r\n\r\n try {\r\n const result = await uppy.upload();\r\n this.setState({ isFormButtonEnabled: true });\r\n if (result && result.failed && result.failed.length === 0) {\r\n // all success -> reset uppy, close and refresh\r\n uppy.reset();\r\n /* istanbul ignore else */\r\n if (typeof this._onClose === \"function\") this._onClose();\r\n return true;\r\n }\r\n } catch (err) {\r\n /* istanbul ignore next */\r\n console.warn(\"Upload returned error: \", err);\r\n }\r\n this.setState({ isFormButtonEnabled: true });\r\n return false;\r\n };\r\n\r\n /**\r\n * called when user clicks Cancel in {@link FormContainer}\r\n * @memberof Upload\r\n */\r\n _onClose = () => {\r\n //#59285 Remove file from queue on Cancel\r\n uppy.reset();\r\n if (typeof this.props.onClose === \"function\") {\r\n this.props.onClose();\r\n } else {\r\n this.setState({ itemUri: null, formatId: -1 });\r\n }\r\n };\r\n\r\n render() {\r\n const { noItemUri, toggles, viewName, uppyHasPendingUploads } =\r\n this.props;\r\n const { itemUri } = this.state;\r\n return (\r\n \r\n {/* {this._renderFloatingBar()} */}\r\n \r\n \r\n \r\n \r\n {uppyHasPendingUploads && noItemUri && itemUri == null && (\r\n \r\n this.setState({ itemUri })\r\n }\r\n />\r\n )}\r\n {uppyHasPendingUploads && itemUri && (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => {\r\n return {\r\n noItemUri: ownProps.onClose == null, //whether archive form should be displayed\r\n itemUri:\r\n ownProps.onClose == null\r\n ? null\r\n : ownProps.itemUri || s.itemUriSelector(ownProps),\r\n formatId: s.breadcrumbFormatIdSelector(state, viewName),\r\n uppyHasPendingUploads: uppyHasPendingUploadsSelector(state),\r\n defaults: s.formDefaultsSelector(state),\r\n //onWindows: bowser.windows,\r\n viewName,\r\n ...ownProps,\r\n };\r\n};\r\n\r\nexport default compose(\r\n connect(mapStateToProps),\r\n TogglesHandler({\r\n viewName,\r\n }),\r\n SplitPanes({\r\n viewName,\r\n paneIds: [\"#docFilesPanel\", \"#docformPanel\"],\r\n toggleIds: [\"files\", \"form\"],\r\n direction: \"horizontal\",\r\n })\r\n)(Upload);\r\n","// @flow\r\nimport React, { useContext } from \"react\";\r\nimport { LabelSizeContext } from \"data/context\";\r\nimport ControlLabel from \"react-bootstrap/lib/ControlLabel\";\r\nimport styles from \"./AttributeLabel.module.css\";\r\n\r\ntype Props = {\r\n /** the field's label to display */\r\n label?: ?string,\r\n /** optional CSS Styles to apply */\r\n style?: CSSStyleDeclaration,\r\n};\r\n\r\nconst AttributeLabel = ({ label, style = {} }: Props) => {\r\n const labelWidth = useContext(LabelSizeContext);\r\n if (labelWidth) style.width = labelWidth;\r\n // NOTE: to hide the labels one space will be used in the ExtraAttributeDefinition\r\n if (label && String(label.trim()).length > 1)\r\n return (\r\n \r\n {label}\r\n \r\n );\r\n return null;\r\n};\r\nAttributeLabel.displayName = \"AttributeLabel\";\r\nexport default AttributeLabel;\r\n","import { CustomHttpHeader } from \"data/types\";\r\nimport { hasConsole } from \"data/bowser\";\r\nimport { correlationId, accessToken } from \"data/storeHelper\";\r\nimport { JL } from \"jsnlog\";\r\n\r\nexport { JL };\r\n\r\nexport /* istanbul ignore next */ const setupLogging = () => {\r\n // configure jsnLog\r\n // http://jsnlog.com/Documentation/JSNLogJs/AjaxAppender/SetOptions\r\n const serverAppender = JL.createAjaxAppender(\"mainappender\");\r\n serverAppender.setOptions({\r\n batchSize: 20,\r\n bufferSize: 20,\r\n storeInBufferLevel: 1000,\r\n level: window.CONFIG.browserLoggingLevel || 4000,\r\n sendWithBufferLevel: 6000,\r\n url: `${window.CONFIG.host.basename}${window.CONFIG.general.api}/jsnlog.logger`,\r\n // #54890: Add CorrelationId to JsnLogs\r\n beforeSend: (xhr) => {\r\n xhr.setRequestHeader(\r\n CustomHttpHeader.Authorization,\r\n `Bearer ${accessToken()}`\r\n );\r\n xhr.setRequestHeader(\r\n CustomHttpHeader.CorrelationId,\r\n correlationId()\r\n );\r\n },\r\n });\r\n const consoleAppender = JL.createConsoleAppender(\"consoleAppender\");\r\n if (hasConsole()) {\r\n // https://github.com/mperdeck/jsnlog.js/issues/2\r\n // logs in devtools a serialized string instead of structured logs...\r\n consoleAppender.sendLogItems = (logItems, successCallback) => {\r\n for (const logItem of logItems) {\r\n try {\r\n const item = logItem.m.startsWith(\"{\")\r\n ? JSON.parse(logItem.m)\r\n : logItem.m;\r\n\r\n if (logItem.l <= JL.getDebugLevel()) {\r\n console.debug(\r\n \"[%s] %s\",\r\n logItem.n,\r\n item.msg || \"\",\r\n item\r\n );\r\n } else if (logItem.l <= JL.getInfoLevel()) {\r\n console.info(\r\n \"[%s] %s\",\r\n logItem.n,\r\n item.msg || \"\",\r\n item\r\n );\r\n } else if (logItem.l <= JL.getWarnLevel()) {\r\n console.warn(\r\n \"[%s] %s\",\r\n logItem.n,\r\n item.msg || \"\",\r\n item\r\n );\r\n } else {\r\n console.error(\r\n \"[%s] %s\",\r\n logItem.n,\r\n item.msg || \"\",\r\n item\r\n );\r\n }\r\n } catch (e) {}\r\n }\r\n if (typeof successCallback === \"function\") successCallback();\r\n };\r\n }\r\n consoleAppender.setOptions({\r\n level: window.CONFIG.browserLoggingLevel || 4000,\r\n });\r\n JL().setOptions({\r\n appenders: [consoleAppender /*, serverAppender*/],\r\n });\r\n};\r\n","// @flow\r\nimport React, { useState } from \"react\";\r\nimport Measure from \"react-measure\";\r\nimport { PaneSizeContext } from \"data/context\";\r\n\r\ntype Props = {\r\n /** html id attribute */\r\n id: string,\r\n /** html class attribute */\r\n className: string,\r\n /** Components Children */\r\n children: Children,\r\n};\r\n\r\nconst Pane = ({ id, className, children, dataTest }: Props) => {\r\n const [dimensions, setDimensions] = useState({\r\n width: 0,\r\n height: 0,\r\n });\r\n return (\r\n \r\n setDimensions({\r\n width: measure.width,\r\n height: measure.height,\r\n })\r\n }\r\n >\r\n {({ measureRef }) => (\r\n
\r\n \r\n {children}\r\n \r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Pane;\r\n","// @flow\r\nimport loc from \"i18next\";\r\nimport { type SummaryAttributeValue } from \"data/types\";\r\n// import template from \"lodash/template\";\r\n\r\n/**\r\n * checks if value is included in list (case-insensitive)\r\n *\r\n * @param {string} value to search for in list\r\n * @param {Array} list of string to search\r\n */\r\nexport const isListed = (value: string, list: Array): boolean =>\r\n list.some((l) => l.toLowerCase() === value.toLowerCase());\r\n\r\n/** returns file extension (with .)\r\n * @param {string} fileName the filename (without path)\r\n */\r\nexport const getFileExtension = (fileName: string): string =>\r\n fileName.slice(((fileName.lastIndexOf(\".\") - 1) >>> 0) + 1);\r\n\r\n/**\r\n * will replace the file extension in filename with newExt\r\n *\r\n * @param {string} filename the filename (without path) to fix\r\n * @param {string} newExt new file extension to assign (without .)\r\n * @returns {string} filename with the new extension\r\n * @memberof Upload\r\n */\r\nexport const replaceFileExtension = (\r\n filename: ?string,\r\n newExt: string\r\n): string =>\r\n (filename || \"\").substr(\r\n 0,\r\n (((filename || \"\").lastIndexOf(\".\") - 1) >>> 0) + 1\r\n ) +\r\n \".\" +\r\n newExt;\r\n\r\n/** returns true if any of element's DOM parent has the className */\r\nexport const hasSomeParentTheClass = (\r\n element: any,\r\n className: string\r\n): boolean => {\r\n //\r\n // If we are here we didn't find the searched class in any parents node\r\n //\r\n if (!element.parentNode) return false;\r\n //\r\n // If the current node has the class return true, otherwise we will search\r\n // it in the parent node\r\n /* istanbul ignore next */\r\n if (\r\n String(element.getAttribute(\"class\")).split(\" \").indexOf(className) >= 0\r\n )\r\n return true;\r\n return hasSomeParentTheClass(element.parentNode, className);\r\n};\r\n\r\n/**\r\n * will check if text starts with $ signaling our own internal i18next localization id\r\n * @param {string} text freetext or $loc.id\r\n * @returns {string} localized text\r\n */\r\nexport const getLocalizedText = (text: ?string, context?: any): ?string => {\r\n if (text && text.startsWith(\"$\")) {\r\n return loc.t(text.substr(1), context);\r\n }\r\n return text;\r\n};\r\n\r\nexport /**\r\n * @returns {boolean} true if itemUri starts with pam-item://\r\n * @param {string} itemUri to validate\r\n */\r\nconst isValidItemUri = (itemUri: string = \"\") =>\r\n itemUri.startsWith(\"pam-item://\");\r\n\r\nexport /**\r\n * converts a document's itemUri into a folder itemUri\r\n * @param {string} itemUri full itemUri (either for folder or document)\r\n * @returns {string} folder's itemUri\r\n */\r\nconst getFolderUri = (itemUri: string) =>\r\n itemUri.indexOf(\"@eid\") === -1\r\n ? itemUri\r\n : itemUri.substring(0, itemUri.indexOf(\"@eid\"));\r\n\r\nexport /**\r\n * simple js string templates\r\n * https://gist.github.com/pbroschwitz/3891293\r\n * @param {string} input source string including reference variables enclosed in single {}\r\n * @param {Object} data object defining the variables\r\n * @returns result after replacing tokens\r\n */\r\nconst tokenize = (input: string, data: Object) =>\r\n input.replace(/{([^{}]*)}/g, (a, b) => {\r\n let r = data[b];\r\n return typeof r === \"string\" || typeof r === \"number\" ? r : a;\r\n });\r\n\r\n// export /**\r\n// * js string templating\r\n// * @note although lodash.template is very powerful, there is no way to disable javascript execution - to avoid XSS cross script attacks!\r\n// * @param {string} input source string including reference variables\r\n// * @param {Object} data object defining the variables\r\n// * @returns compiled template result\r\n// */\r\n// const interpolate = (input: string, data: Object) => {\r\n// // https://lodash.com/docs/4.17.15#template\r\n// const compiled = template(input, {\r\n// evaluate: null,\r\n// imports: null,\r\n// escape: /{-([\\s\\S]+?)}/g,\r\n// interpolate: /{([\\s\\S]+?)}/g\r\n// });\r\n// return compiled(data);\r\n// };\r\n\r\nexport /**\r\n * map an object by changing it's values\r\n * @note although lodash.mapValues exists, it's 26KB big!\r\n * @param {Object} o input object\r\n * @param {(value: any) => any} f value transformation callback function\r\n * @returns {Object} transformed object with the same keys\r\n */\r\nconst mapValues = (o: Object, f: (value: any) => any) =>\r\n Object.entries(o).reduce((a, [key, value]) => {\r\n a[key] = f(value);\r\n return a;\r\n }, {});\r\n\r\nexport /**\r\n * Moves an item in an array to a new position\r\n * @returns {Array} cloned array with updated item's position\r\n */\r\nconst moveArrayItem = (arr: Array, from: number, to: number) => {\r\n const clone = [...arr];\r\n Array.prototype.splice.call(\r\n clone,\r\n to,\r\n 0,\r\n Array.prototype.splice.call(clone, from, 1)[0]\r\n );\r\n return clone;\r\n};\r\n\r\nexport /** checks if browser support Caching */\r\nconst hasCacheSupport = () => \"caches\" in window;\r\n\r\nexport /** executes fn() and logs performance statistics */\r\nconst performanceTester = async (\r\n fn: () => Promise,\r\n log: (ms: number) => void\r\n): any | null => {\r\n /* istanbul ignore if */\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"performanceTester function not defined!\");\r\n const t0 = performance.now();\r\n const result = await fn();\r\n log(performance.now() - t0);\r\n return result;\r\n};\r\n\r\n// export const calcSha256 = async (message) => {\r\n// // encode as UTF-8\r\n// const msgBuffer = new TextEncoder().encode(message);\r\n\r\n// // hash the message\r\n// const hashBuffer = await crypto.subtle.digest(\"SHA-256\", msgBuffer);\r\n\r\n// // convert ArrayBuffer to Array\r\n// const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n\r\n// // convert bytes to hex string\r\n// const hashHex = hashArray\r\n// .map((b) => (\"00\" + b.toString(16)).slice(-2))\r\n// .join(\"\");\r\n// return hashHex;\r\n// };\r\n\r\n// https://advancedweb.hu/how-to-use-async-functions-with-array-filter-in-javascript/\r\nexport const asyncFilter = async (arr, predicate) =>\r\n arr.reduce(\r\n async (memo, e) => ((await predicate(e)) ? [...(await memo), e] : memo),\r\n []\r\n );\r\n\r\n// https://advancedweb.hu/how-to-use-async-functions-with-array-some-and-every-in-javascript/\r\nexport const asyncEvery = async (arr, predicate) => {\r\n for (let e of arr) {\r\n if (!(await predicate(e))) return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport /* istanbul ignore next */ const sleep = (ms) =>\r\n new Promise((resolve) => setTimeout(resolve, ms));\r\n\r\nexport const getClassNames = (...classNames) =>\r\n classNames.filter((className) => className).join(\" \");\r\n\r\nexport /* istanbul ignore next */ const closeMenuOnScroll = (e: Event) =>\r\n e.target &&\r\n !(\r\n e.target.getAttribute(\"class\") &&\r\n e.target.getAttribute(\"class\").match(/__menu-list/)\r\n );\r\n\r\nexport /*istanbul ignore next */ const getValue = (value, param = \"value\") =>\r\n value != null && Object.prototype.hasOwnProperty.call(value, \"$type\")\r\n ? value[param] || value.value\r\n : value;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\nimport { type searchResultState } from \"./types\";\r\n\r\nexport const initialState: searchResultState = {\r\n status: Constants.NONE,\r\n error: undefined,\r\n result: undefined,\r\n count: {\r\n status: Constants.NONE,\r\n totalCount: -1,\r\n totalTime: -1,\r\n aggregations: [],\r\n },\r\n form: {\r\n id: -1,\r\n status: Constants.NONE,\r\n result: undefined,\r\n },\r\n changes: {},\r\n searchRequest: undefined,\r\n searchItem: undefined,\r\n};\r\n\r\nconst searchReducer = (state: searchResultState = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.SEARCH_RESET:\r\n return {\r\n ...state,\r\n status: Constants.NONE,\r\n result: undefined,\r\n count: {\r\n status: Constants.NONE,\r\n totalCount: -1,\r\n totalTime: -1,\r\n aggregations: [],\r\n },\r\n searchRequest: undefined,\r\n searchItem: undefined,\r\n };\r\n\r\n case actionTypes.SEARCH_FAVRENAME_REQUEST:\r\n case actionTypes.SEARCH_FAVRENAME_RESULT:\r\n case actionTypes.SEARCH_FETCH_REQUEST:\r\n case actionTypes.SEARCH_FETCH_RESULT:\r\n case actionTypes.SEARCH_ITEM_SAVE:\r\n case actionTypes.SEARCH_FORM_CHANGES:\r\n return {\r\n ...state,\r\n ...action.payload,\r\n };\r\n\r\n case actionTypes.SEARCH_FORM_FETCH_REQUEST:\r\n return {\r\n ...state,\r\n form: Object.assign({}, state.form, {\r\n status: Constants.LOADING,\r\n id: action.payload.id,\r\n }),\r\n };\r\n\r\n case actionTypes.SEARCH_FORM_FETCH_RESULT:\r\n return {\r\n ...state,\r\n form: Object.assign({}, action.payload, {\r\n id: state.form && state.form.id,\r\n }),\r\n };\r\n case actionTypes.SEARCH_FORM_RESET:\r\n return {\r\n ...state,\r\n form: { ...initialState.form },\r\n changes: {},\r\n };\r\n\r\n case actionTypes.SEARCH_COUNT_REQUEST:\r\n return {\r\n ...state,\r\n count: { status: Constants.LOADING },\r\n };\r\n\r\n case actionTypes.SEARCH_COUNT_RESULT:\r\n return {\r\n ...state,\r\n count: action.payload,\r\n };\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default searchReducer;\r\n\r\nexport const searchStatusSelector = (state: Object) => state.search.status;\r\nexport const searchErrorSelector = (state: Object) => state.search.error;\r\nexport const searchResultSelector = (state: Object) => state.search.result;\r\nexport const searchResultTotalCountSelector = (state: Object) =>\r\n state.search.status === Constants.OK && state.search.result\r\n ? state.search.result.totalCount\r\n : -1;\r\nexport const searchRequestSelector = (state: Object) =>\r\n state.search.searchRequest;\r\nexport const searchTermsSelector = (state: Object) => state.search.terms;\r\nexport const searchItemSelector = (state: Object) => state.search.searchItem;\r\nexport const searchFormStatusSelector = (state: Object) =>\r\n state.search.form.status;\r\nexport const searchFormResultSelector = (state: Object) =>\r\n state.search.form.result;\r\nexport const searchFormIdSelector = (state: Object) => state.search.form.id;\r\nexport const searchFormChangesSelector = (state: Object) =>\r\n state.search.changes;\r\nexport const searchCountStatusSelector = (state: Object) =>\r\n state.search.count.status;\r\nexport const searchCountResultSelector = (state: Object) => state.search.count;\r\nexport const searchCountAggregationsSelector = (state: Object) =>\r\n state.search.count.aggregations;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"SummaryAttribute_container__2SVTU\",\"wrapper\":\"SummaryAttribute_wrapper__vowL8\",\"caption\":\"SummaryAttribute_caption__xkbEO\",\"value\":\"SummaryAttribute_value__1onpP\",\"user\":\"SummaryAttribute_user__2Fvgr\",\"facePileMore\":\"SummaryAttribute_facePileMore__1-b9g\",\"userText\":\"SummaryAttribute_userText__6cakt\",\"avatar\":\"SummaryAttribute_avatar__2LLNl\",\"link\":\"SummaryAttribute_link__2yzxB\"};","// @flow\r\nimport React, { useMemo, useContext } from \"react\";\r\nimport { PaneSizeContext } from \"data/context\";\r\ntype Props = {\r\n /** html style attribute */\r\n style: CSSStyleDeclaration,\r\n /** html class attribute */\r\n className: string,\r\n /** Components Children */\r\n children: Children,\r\n};\r\n\r\nconst ViewerControlBase = ({\r\n className = \"form-group\",\r\n style = {},\r\n children,\r\n}: Props) => {\r\n const margins = 30;\r\n let width;\r\n const ctx = useContext(PaneSizeContext);\r\n if (ctx != null) {\r\n width = ctx.width;\r\n }\r\n const computedStyle: CSSStyleDeclaration = useMemo(() => {\r\n const styles = { ...style };\r\n if (width != null) {\r\n styles.maxWidth = width - margins;\r\n }\r\n return styles;\r\n }, [style, width]);\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};\r\n\r\nexport default ViewerControlBase;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"icon\":\"SearchBucket_icon__2JAIn\",\"value\":\"SearchBucket_value__brB2H\",\"margin\":\"SearchBucket_margin__3eJZx\",\"badge\":\"SearchBucket_badge__3cSnH\"};","/* istanbul ignore next */\r\nif (!Date.prototype.toLocalJSON) {\r\n //Use local Timezone (not UTC) for JSON\r\n (function () {\r\n function pad(number) {\r\n return number < 10 ? `0${number}` : number;\r\n }\r\n // eslint-disable-next-line\r\n Date.prototype.toLocalJSON = function () {\r\n return `${this.getFullYear()}-${pad(this.getMonth() + 1)}-${pad(\r\n this.getDate()\r\n )}T${pad(this.getHours())}:${pad(this.getMinutes())}:${pad(\r\n this.getSeconds()\r\n )}.${(this.getMilliseconds() / 1000).toFixed(3).slice(2, 5)}`;\r\n };\r\n })();\r\n}\r\n\r\n/* istanbul ignore next */\r\nif (typeof window.crypto === \"undefined\") {\r\n window.crypto = require(\"crypto\");\r\n}\r\n\r\n/* istanbul ignore next */\r\nif (typeof window.crypto.randomUUID !== \"function\") {\r\n window.crypto.randomUUID = function () {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\r\n (\r\n c ^\r\n (window.crypto.getRandomValues(new Uint8Array(1))[0] &\r\n (15 >> (c / 4)))\r\n ).toString(16)\r\n );\r\n };\r\n}\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\n\r\nexport const initialState = {\r\n displayName: \"N/A\",\r\n id: -1,\r\n status: Constants.NONE,\r\n sites: [],\r\n mainNavigation: [],\r\n isWfEnabled: false,\r\n isAdmin: false,\r\n avatar: undefined,\r\n hasOfflineItems: false,\r\n itemActions: [\r\n {\r\n categories: [],\r\n actions: [],\r\n },\r\n ],\r\n};\r\n\r\nconst userReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.USER_FETCH_REQUESTED:\r\n return { ...state, ...action.payload };\r\n case actionTypes.USER_FETCH_RESULT:\r\n const { favorites, ...rest } = action.payload;\r\n return { ...state, ...rest };\r\n case actionTypes.USER_SITES_RESULT:\r\n return { ...state, ...action.payload };\r\n case actionTypes.LOGIN_SIGNOUT:\r\n return initialState;\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default userReducer;\r\n\r\nexport const userIdSelector = (state: Object) => state.user.id;\r\nexport const userStatusSelector = (state: Object) => state.user.status;\r\nexport const userCorrelationIdSelector = (state: Object) =>\r\n window.CONFIG.correlationId;\r\nexport const userSitesSelector = (state: Object) => state.user.sites;\r\nexport const userMainNavigationSelector = (state: Object) =>\r\n state.user.mainNavigation;\r\nexport const userIsAdminSelector = (state: Object) =>\r\n state.user.status === Constants.OK ? state.user.isAdmin : false;\r\nexport const userIsWfEnabledSelector = (state: Object) =>\r\n state.user.status === Constants.OK ? state.user.isWfEnabled : false;\r\nexport const userLanguageSelector = (state: Object) =>\r\n state.user.status === Constants.OK ? state.user.language : undefined;\r\nexport const userDecimalSeparator = (state: Object) =>\r\n state.user.status === Constants.OK ? state.user.decimalSeparator : \".\";\r\nexport const userThousandSeparator = (state: Object) =>\r\n state.user.status === Constants.OK ? state.user.thousandSeparator : \",\";\r\nexport const userItemActionsSelector = (state: Object) =>\r\n state.user.itemActions;\r\nexport const userHasOfflineItemsSelector = (state: Object) =>\r\n state.user.status === Constants.OK ? state.user.hasOfflineItems : false;\r\n","import React, { type Node, useEffect } from \"react\";\r\nimport { usePersistSetting } from \"hooks\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Collapse from \"react-bootstrap/lib/Collapse\";\r\nimport styles from \"./Divider.module.css\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** optional CSS classname to apply */\r\n className?: string,\r\n /** caption to show on top left */\r\n header: string | Node,\r\n /** setting name (for persistance) */\r\n name?: string,\r\n /** whether to hide HorizontalRow */\r\n hideHR?: boolean,\r\n /** whether per default it should be expanded */\r\n defaultExpanded?: boolean,\r\n /** prop to control expanded state */\r\n expanded?: boolean,\r\n /** for Collapse: whether per default child component unmounts on exit */\r\n unmountOnExit?: boolean,\r\n /** for Collapse: whether component is mounted on enter */\r\n mountOnEnter?: boolean,\r\n};\r\n\r\nconst Divider = ({\r\n className,\r\n header,\r\n name,\r\n hideHR,\r\n defaultExpanded,\r\n children,\r\n expanded: expandedFromProps,\r\n unmountOnExit = true,\r\n mountOnEnter = false,\r\n}: Props) => {\r\n const [expanded, setExpanded] = usePersistSetting({\r\n name: name || \"NA\",\r\n defaultValue: defaultExpanded != null ? defaultExpanded : true,\r\n });\r\n useEffect(() => {\r\n setExpanded(expandedFromProps);\r\n }, [setExpanded, expandedFromProps]);\r\n return (\r\n <>\r\n {\r\n name && setExpanded(!expanded);\r\n }}\r\n className={getClassNames(styles.main, className)}\r\n aria-expanded={expanded}\r\n >\r\n {children ? (\r\n \r\n \r\n <>{header}\r\n \r\n ) : (\r\n <>{header}\r\n )}\r\n {hideHR !== true &&
}\r\n \r\n {children && (\r\n \r\n {children}\r\n \r\n )}\r\n \r\n );\r\n};\r\nDivider.displayName = \"Divider\";\r\nexport default Divider;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"Activity_container__uejwU\",\"table\":\"Activity_table__1XxiZ\",\"tbody\":\"Activity_tbody__nfvxC\",\"text\":\"Activity_text__5hnjX\",\"row\":\"Activity_row__3T3BS\",\"header\":\"Activity_header__3IuAV\",\"avatar\":\"Activity_avatar__26j0D\",\"what\":\"Activity_what__1n8dn\",\"actions\":\"Activity_actions__1y-L9\",\"version\":\"Activity_version__2UEbe\",\"article\":\"Activity_article__2O__4\",\"icon\":\"Activity_icon__3HvXO\"};","// @flow\r\nimport React, { PureComponent, type ComponentType } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { getDisplayName } from \"data/constants\";\r\nimport { setSettingAction } from \"data/actions\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\ntype Config = {\r\n /** setting name in store */\r\n name: string,\r\n /** namespace for props */\r\n namespace: string,\r\n /** defaultValue to assign when not found in storage */\r\n defaultValue?: ?Object,\r\n};\r\n\r\ntype Props = {\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n};\r\n\r\nexport type SettingValueProps = {\r\n value: ?Object,\r\n setValue: (value: Object) => void,\r\n};\r\n\r\n/** will return the current setting's value and dispatch an action on change\r\n * @deprecated please use hooks/usePersistSetting\r\n */\r\nconst SettingValue =\r\n ({ name, namespace, defaultValue }: Config) =>\r\n (WrappedComponent: ComponentType) => {\r\n class PP extends PureComponent {\r\n static displayName = `SettingValue(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n\r\n _setValue = (value: Object) =>\r\n this.props.dispatch(setSettingAction(name, value));\r\n\r\n render() {\r\n const extraProps = {\r\n [namespace]: {\r\n value: this.props[namespace].value,\r\n setValue: this._setValue,\r\n },\r\n };\r\n\r\n return ;\r\n }\r\n }\r\n\r\n const mapStateToProps = (state, ownProps) => {\r\n const currentValue = s.settingValueSelector(name, state);\r\n return {\r\n [namespace]: {\r\n value:\r\n /*istanbul ignore next */ currentValue == null\r\n ? defaultValue\r\n : currentValue,\r\n },\r\n ...ownProps,\r\n };\r\n };\r\n\r\n return connect(mapStateToProps)(PP);\r\n };\r\n\r\nexport default SettingValue;\r\n","// @flow\r\nimport actionTypes from \"./actionTypes\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport type {\r\n ApiErrorResult,\r\n Dictionary,\r\n UserInfoResultDTO,\r\n CardItemResultDTO,\r\n SAYTOptionDTO,\r\n DocListFilterRequestDTO,\r\n DocListFilterOperatorsEnum,\r\n BreadcrumbResultDTO,\r\n DocListSortRequestDTO,\r\n TreeDTO,\r\n DocsResultDTO,\r\n DocListLayout,\r\n SearchRequestDTO,\r\n SearchResultDTO,\r\n ListViewModeEnum,\r\n ToggleItemDTO,\r\n SearchFormResultDTO,\r\n SearchFormInfoDTO,\r\n SearchItemDTO,\r\n SearchCountResultDTO,\r\n SearchValueTypeEnum,\r\n OfflineSyncStatusEnum,\r\n OfflineItemDTO,\r\n NotificationDTO,\r\n NotificationId,\r\n NotificationStatusFlagEnum,\r\n GUID,\r\n CommandActionLog,\r\n CommandActionStatusFlagEnum,\r\n} from \"data/types\";\r\nimport { OfflineSyncStatus } from \"data/types\";\r\nimport { type actionResult } from \"./types\";\r\nimport { docFilterText } from \"data/reducers/types\";\r\n\r\n//#region Toggles\r\n// called to set but not persist toggle\r\nexport const togglesChangeAction = (\r\n name: string,\r\n toggles: Array\r\n): actionResult => ({\r\n type: actionTypes.TOGGLES_CHANGE,\r\n payload: { name, toggles },\r\n});\r\n\r\n// called by containers/ToggleBarContainer to switch a toggle\r\nexport const persistTogglesAction = (\r\n name: string,\r\n toggles: Array\r\n): actionResult => ({\r\n type: actionTypes.TOGGLES_PERSIST,\r\n payload: { name, toggles },\r\n});\r\n\r\n// update toggle counters\r\n// counts: { name: count, name: count, ... }\r\n// status: { name: status, name: status, ... }\r\n// use status=Constants.LOADING to show spinner\r\nexport const togglesUpdateCounterAction = ({\r\n name,\r\n counts,\r\n status,\r\n}: {\r\n name: string,\r\n counts: Dictionary,\r\n status?: Dictionary,\r\n}): actionResult => ({\r\n type: actionTypes.TOGGLES_UPDATECOUNTER,\r\n payload: { name, counts, status },\r\n});\r\n//#endregion\r\n\r\n//#region USER\r\n\r\n// called by containers/UserContainer to load current user's info\r\nexport const getUserAction = (status?: ConstantsEnum): actionResult => ({\r\n type: actionTypes.USER_FETCH_REQUESTED,\r\n payload: { status: status || Constants.LOADING },\r\n});\r\n\r\n// called by sagas/userSaga to load current user's info\r\nexport const getUserResultAction = ({\r\n status,\r\n message,\r\n info,\r\n}: {\r\n status: ConstantsEnum,\r\n message?: string,\r\n info?: UserInfoResultDTO,\r\n}): actionResult => ({\r\n type: actionTypes.USER_FETCH_RESULT,\r\n payload: { status, message, ...info },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const setSitesAction = (sites: Array) => ({\r\n type: actionTypes.USER_SITES_RESULT,\r\n payload: { sites },\r\n});\r\n\r\nexport const setLoginResultAction = ({\r\n idToken,\r\n accessToken,\r\n expiresOn,\r\n expiresIn,\r\n status,\r\n message,\r\n}: {\r\n idToken: string,\r\n accessToken: string,\r\n expiresOn?: number,\r\n expiresIn?: number,\r\n status: ConstantsEnum,\r\n message?: string,\r\n}): actionResult => ({\r\n type: actionTypes.LOGIN_RESULT,\r\n payload: { status, message, idToken, accessToken, expiresOn, expiresIn },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const loginSignoutAction = (): actionResult => ({\r\n type: actionTypes.LOGIN_SIGNOUT,\r\n payload: {},\r\n});\r\n//#endregion\r\n\r\n//#region GlobalSearch\r\n\r\nexport const getGlobalSearchDefaultAction = (): actionResult => ({\r\n type: actionTypes.GLOBALDEFAULTSEARCH_FETCH_REQUEST,\r\n payload: {},\r\n});\r\n\r\nexport const globalSearchDefaultResultAction = ({\r\n status,\r\n message,\r\n options,\r\n}: {\r\n status: ConstantsEnum,\r\n message?: string,\r\n options: Array,\r\n}): actionResult => ({\r\n type: actionTypes.GLOBALDEFAULTSEARCH_FETCH_RESULT,\r\n payload: {\r\n status,\r\n message,\r\n options,\r\n },\r\n receivedAt: Date.now(),\r\n});\r\n\r\n//#endregion\r\n\r\n//#region Favorites\r\n\r\nexport const getFavoritesAction = (status?: ConstantsEnum): actionResult => ({\r\n type: actionTypes.FAVORITES_FETCH_REQUEST,\r\n payload: { status: status || Constants.LOADING },\r\n});\r\n\r\nexport const getFavoritesResultAction = ({\r\n status,\r\n message,\r\n favorites,\r\n}: {\r\n status: ConstantsEnum,\r\n message?: string,\r\n favorites: Array,\r\n}): actionResult => ({\r\n type: actionTypes.FAVORITES_FETCH_RESULT,\r\n payload: {\r\n status,\r\n message,\r\n favorites,\r\n },\r\n receivedAt: Date.now(),\r\n});\r\n\r\n//#endregion\r\n\r\n//#region Cards\r\n\r\nexport const getWorkflowCards = (status?: ConstantsEnum): actionResult => ({\r\n type: actionTypes.WF_FETCH_REQUESTED,\r\n payload: { status: status || Constants.LOADING },\r\n});\r\n\r\nexport const getWorkflowCardsResult = ({\r\n status,\r\n cards,\r\n message,\r\n}: {\r\n status: ConstantsEnum,\r\n cards: Array,\r\n message?: string,\r\n}): actionResult => ({\r\n type: actionTypes.WF_FETCH_RESULT,\r\n payload: {\r\n status,\r\n message,\r\n cards,\r\n },\r\n receivedAt: Date.now(),\r\n});\r\n\r\n// called by sagas/cardsSaga to load current user's home cards\r\nexport const getCardsAction = (status?: ConstantsEnum): actionResult => ({\r\n type: actionTypes.CARDS_FETCH_REQUESTED,\r\n payload: { status: status || Constants.LOADING },\r\n});\r\n\r\nexport const getCardsResultAction = ({\r\n status,\r\n cards,\r\n message,\r\n}: {\r\n status: ConstantsEnum,\r\n cards: Array,\r\n message?: string,\r\n}): actionResult => ({\r\n type: actionTypes.CARDS_FETCH_RESULT,\r\n payload: {\r\n status,\r\n message,\r\n cards,\r\n },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const getTreeAction = ({\r\n itemUri,\r\n filter,\r\n deep,\r\n all,\r\n}: {\r\n itemUri: string,\r\n filter: ?string,\r\n deep: boolean,\r\n all: boolean,\r\n}): actionResult => ({\r\n type: actionTypes.TREE_FETCH_REQUEST,\r\n payload: { itemUri, filter, deep, all, status: Constants.LOADING },\r\n});\r\n\r\nexport const getTreeResultAction = ({\r\n status,\r\n tree,\r\n error,\r\n}: {\r\n status: ConstantsEnum,\r\n tree: TreeDTO,\r\n error?: Error,\r\n}): actionResult => ({\r\n type: actionTypes.TREE_FETCH_RESULT,\r\n payload: {\r\n status,\r\n error,\r\n nodes:\r\n tree && Object.prototype.hasOwnProperty.call(tree, \"items\")\r\n ? tree.items\r\n : [],\r\n isRoot:\r\n tree && Object.prototype.hasOwnProperty.call(tree, \"isRoot\")\r\n ? tree.isRoot\r\n : false,\r\n isBrowsable:\r\n tree && Object.prototype.hasOwnProperty.call(tree, \"isBrowsable\")\r\n ? tree.isBrowsable\r\n : true,\r\n totalCount: (tree && tree.totalCount) || 0,\r\n },\r\n receivedAt: Date.now(),\r\n});\r\n\r\n//#endregion\r\n\r\n//#region Search\r\n\r\nexport const searchResetAction = (): actionResult => ({\r\n type: actionTypes.SEARCH_RESET,\r\n payload: {},\r\n});\r\n\r\nexport const getSearchFormListAction = (): actionResult => ({\r\n type: actionTypes.SEARCH_FORM_LIST_FETCH_REQUEST,\r\n payload: { status: Constants.LOADING },\r\n});\r\n\r\nexport const getSearchFormListResultAction = ({\r\n status,\r\n result,\r\n message,\r\n}: {\r\n status: ConstantsEnum,\r\n result: Array,\r\n message?: string,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_FORM_LIST_FETCH_RESULT,\r\n payload: { status, result, message },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const setSearchFormChangesAction = (changes: Object): actionResult => ({\r\n type: actionTypes.SEARCH_FORM_CHANGES,\r\n payload: { changes },\r\n});\r\n\r\nexport const getSearchFormAction = ({\r\n id,\r\n model,\r\n}: {\r\n id: number,\r\n model: Object,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_FORM_FETCH_REQUEST,\r\n payload: { id, model, status: Constants.LOADING },\r\n});\r\n\r\nexport const getSearchFormResultAction = ({\r\n status,\r\n result,\r\n message,\r\n}: {\r\n status: ConstantsEnum,\r\n result: SearchFormResultDTO,\r\n message?: string,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_FORM_FETCH_RESULT,\r\n payload: { status, result, message },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const searchFormResetAction = (): actionResult => ({\r\n type: actionTypes.SEARCH_FORM_RESET,\r\n});\r\n\r\nexport const setSearchItemAction = ({\r\n searchItem,\r\n}: {\r\n searchItem: SearchItemDTO,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_ITEM_SAVE,\r\n payload: { searchItem },\r\n});\r\n\r\nexport const getSearchAction = ({\r\n searchRequest,\r\n}: {\r\n searchRequest: SearchRequestDTO,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_FETCH_REQUEST,\r\n payload: { searchRequest, status: Constants.LOADING },\r\n});\r\n\r\nexport const getSearchResultAction = ({\r\n status,\r\n result,\r\n terms,\r\n error,\r\n}: {\r\n status: ConstantsEnum,\r\n result: SearchResultDTO,\r\n terms: Array,\r\n error?: ApiErrorResult,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_FETCH_RESULT,\r\n payload: { status, error, result, terms },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const getSearchCountAction = ({\r\n searchRequest,\r\n}: {\r\n searchRequest: SearchRequestDTO,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_COUNT_REQUEST,\r\n payload: { searchRequest, status: Constants.LOADING },\r\n});\r\n\r\nexport const getSearchCountResultAction = ({\r\n status,\r\n result,\r\n message,\r\n}: {\r\n status: ConstantsEnum,\r\n result: SearchCountResultDTO,\r\n message?: string,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_COUNT_RESULT,\r\n payload: { status, message, ...result },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const renameSearchFavoriteAction = ({\r\n name,\r\n}: {\r\n name: string,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_FAVRENAME_REQUEST,\r\n payload: { name },\r\n});\r\n\r\nexport const renameSearchFavoriteResultAction = ({\r\n status,\r\n searchRequest,\r\n message,\r\n}: {\r\n status: ConstantsEnum,\r\n searchRequest: SearchRequestDTO,\r\n message?: string,\r\n}): actionResult => ({\r\n type: actionTypes.SEARCH_FAVRENAME_RESULT,\r\n payload: { status, message, searchRequest },\r\n receivedAt: Date.now(),\r\n});\r\n\r\n//#endregion\r\n\r\n//#region Documents\r\n\r\nexport const docThumbnailRequestAction = (itemUri: string): actionResult => ({\r\n type: actionTypes.DOCS_THUMBNAIL_REQUEST,\r\n payload: { itemUri },\r\n});\r\n\r\nexport const docThumbnailResultAction = ({\r\n itemUri,\r\n result,\r\n status,\r\n message,\r\n}: {\r\n itemUri: string,\r\n result: string,\r\n status: ConstantsEnum,\r\n message?: string,\r\n}): actionResult => ({\r\n type: actionTypes.DOCS_THUMBNAIL_RESULT,\r\n payload: { itemUri, result, status, message },\r\n});\r\n\r\nexport const setDocListViewModeAction = (\r\n viewMode: ListViewModeEnum\r\n): actionResult => ({\r\n type: actionTypes.SETTINGS_DOCLIST_VIEWMODE,\r\n payload: { viewMode },\r\n});\r\n\r\nexport const exportDocsToCsvAction = (): actionResult => ({\r\n type: actionTypes.DOCS_EXPORT_CSV,\r\n});\r\n\r\nexport const getDocsAction = ({\r\n itemUri,\r\n pageNum,\r\n sorts,\r\n filters,\r\n}: {\r\n itemUri: string,\r\n pageNum?: number,\r\n sorts?: Array,\r\n filters?: Array,\r\n}): actionResult => ({\r\n type: actionTypes.DOCS_FETCH_REQUEST,\r\n payload: { itemUri, pageNum, filters, sorts, status: Constants.LOADING },\r\n});\r\n\r\nexport const getDocsResultAction = ({\r\n status,\r\n result,\r\n error,\r\n totalCount,\r\n}: {\r\n status: ConstantsEnum,\r\n result: DocsResultDTO,\r\n error?: Error,\r\n totalCount?: number,\r\n}): actionResult => ({\r\n type: actionTypes.DOCS_FETCH_RESULT,\r\n payload: {\r\n status,\r\n error,\r\n result,\r\n totalCount,\r\n },\r\n receivedAt: Date.now(),\r\n});\r\n\r\n//#endregion\r\n\r\n//#region Settings\r\n\r\nexport const setSettingAction = (\r\n name: string,\r\n value: Object\r\n): actionResult => ({\r\n type: actionTypes.SETTINGS_SET,\r\n payload: { name, value },\r\n});\r\n\r\nexport const setSplitPanesAction = ({\r\n view,\r\n name,\r\n dimensions,\r\n}: {\r\n view: string,\r\n name: string,\r\n dimensions: Array,\r\n}): actionResult => ({\r\n type: actionTypes.SPLITPANES_SET,\r\n payload: { view, name, dimensions },\r\n});\r\n\r\nexport const persistSplitPanesAction = ({\r\n view,\r\n name,\r\n dimensions,\r\n}: {\r\n view: string,\r\n name: string,\r\n dimensions: Array,\r\n}): actionResult => ({\r\n type: actionTypes.SPLITPANES_PERSIST,\r\n payload: { view, name, dimensions },\r\n});\r\n\r\nexport const setSidebarMini = (mini: boolean): actionResult => ({\r\n type: actionTypes.SETTINGS_SIDEBAR_MINI,\r\n payload: { mini },\r\n});\r\n\r\nexport const setCurrentBreadcrumb = ({\r\n breadcrumb,\r\n isFav,\r\n viewName,\r\n}: {\r\n breadcrumb: BreadcrumbResultDTO,\r\n isFav?: boolean,\r\n viewName: string,\r\n}): actionResult => ({\r\n type: actionTypes.CURRENT_BREADCRUMB,\r\n payload: { isFav, breadcrumb, viewName },\r\n});\r\n\r\nexport const setCurrentItemAction = (payload: Object): actionResult => ({\r\n type: actionTypes.CURRENTITEM_SET,\r\n payload,\r\n});\r\n\r\nexport const backupCurrentItemAction = (): actionResult => ({\r\n type: actionTypes.CURRENTITEM_BAK,\r\n});\r\n\r\nexport const restoreCurrentItemAction = (): actionResult => ({\r\n type: actionTypes.CURRENTITEM_RESTORE,\r\n});\r\n\r\nexport const setDocsLayoutAction = (layout?: DocListLayout): actionResult => ({\r\n type: actionTypes.DOCS_LAYOUT_SET,\r\n payload: {\r\n status: Constants.OK,\r\n ...layout,\r\n },\r\n});\r\n\r\nexport const requestDocsLayoutAction = (\r\n itemUri: string,\r\n allowPreFetch?: boolean\r\n): actionResult => ({\r\n type: actionTypes.DOCS_LAYOUT_REQUEST,\r\n payload: { itemUri, allowPreFetch, status: Constants.LOADING },\r\n});\r\n\r\nexport const setDocFilterTextAction = ({\r\n name,\r\n value,\r\n valueType,\r\n operator,\r\n}: docFilterText): actionResult => ({\r\n type: actionTypes.DOCS_FILTERTEXT_SET,\r\n payload: { name, value, valueType, operator },\r\n});\r\n\r\nexport const resetDocFilters = (): actionResult => ({\r\n type: actionTypes.DOCS_FILTERS_RESET,\r\n payload: {},\r\n});\r\n\r\nexport const setDocFilterByRef = (\r\n docContextClick: {\r\n rowIndex: number,\r\n columnIndex: number,\r\n },\r\n resetValues: boolean\r\n): actionResult => ({\r\n type: actionTypes.DOCS_FILTERS_SETBYREF,\r\n payload: { docContextClick, resetValues },\r\n});\r\n\r\nexport const setDocFilterByName = ({\r\n name,\r\n valueType,\r\n value,\r\n operator,\r\n}: {\r\n name: string,\r\n valueType: SearchValueTypeEnum,\r\n value: any,\r\n operator?: DocListFilterOperatorsEnum,\r\n}): actionResult => ({\r\n type: actionTypes.DOCS_FILTERS_SETBYNAME,\r\n payload: { name, valueType, operator, value },\r\n});\r\n\r\n// persist=>TRUE save in long storage,\r\n// parise=>FALSE save only in session cache\r\nexport const saveCurrentItemAction = ({\r\n name,\r\n key,\r\n value,\r\n persist,\r\n}: {\r\n name: string,\r\n key: string,\r\n value: Object,\r\n persist: boolean,\r\n}): actionResult => ({\r\n type: actionTypes.CURRENTITEM_SAVE,\r\n payload: { name, key, value, persist },\r\n});\r\n\r\nexport const currentItemLoadedAction = (value?: Object): actionResult => ({\r\n type: actionTypes.CURRENTITEM_LOADED,\r\n payload: { status: Constants.OK, ...value },\r\n});\r\n\r\n//#endregion\r\n\r\n//#region Forms\r\n\r\nexport const formSetDefaultsAction = (defaults: Object): actionResult => ({\r\n type: actionTypes.FORM_DEFAULTS_SET,\r\n payload: { defaults },\r\n});\r\n\r\nexport const formSetEditModeAction = (\r\n name: string,\r\n isEditMode: boolean\r\n): actionResult => ({\r\n type: actionTypes.FORM_EDITMODE_SET,\r\n payload: { name, isEditMode },\r\n});\r\n\r\nexport const extraAttributesSetTabIndexAction = ({\r\n name,\r\n itemUri,\r\n tabIndex,\r\n}: {\r\n name: string,\r\n itemUri: string,\r\n tabIndex: number,\r\n}): actionResult => ({\r\n type: actionTypes.EA_TABINDEX_SET,\r\n payload: { name, itemUri, tabIndex },\r\n});\r\n\r\nexport const extraAttributesClearAction = (): actionResult => ({\r\n type: actionTypes.EA_CLEAR,\r\n payload: {},\r\n});\r\n\r\nexport const extraAttributesSetDetailViewAction = (\r\n values?: Object\r\n): actionResult => ({\r\n type: actionTypes.EA_DETAILVIEW_SET,\r\n payload: values,\r\n});\r\n\r\nexport const extraAttributesSetField = (\r\n ns: string,\r\n name: string,\r\n value: Object\r\n): actionResult => ({\r\n type: actionTypes.EA_FIELD_SET,\r\n payload: { ns, name, value },\r\n});\r\n\r\nexport const extraAttributesAuditLogUpdateRow = (\r\n name: string,\r\n seqId: string,\r\n values: Array\r\n): actionResult => ({\r\n type: actionTypes.EA_AUDITLOG_UPDATE,\r\n payload: { name, seqId: String(seqId), values },\r\n});\r\n\r\nexport const extraAttributesAuditLogDeleteRow = (\r\n name: string,\r\n seqId: string\r\n): actionResult => ({\r\n type: actionTypes.EA_AUDITLOG_DEL,\r\n payload: { name, seqId: String(seqId) },\r\n});\r\n\r\nexport const extraAttributesAuditLogClearRow = (\r\n name: string,\r\n seqId: string,\r\n values: Array\r\n): actionResult => ({\r\n type: actionTypes.EA_AUDITLOG_CLEAR,\r\n payload: { name, seqId: String(seqId), values },\r\n});\r\n\r\nexport const extraAttributesAuditLogInsertRow = (\r\n name: string,\r\n rowIndex: number,\r\n values: Array\r\n): actionResult => ({\r\n type: actionTypes.EA_AUDITLOG_INSERT,\r\n payload: { name, rowIndex, values },\r\n});\r\n\r\nexport const extraAttributesGridSetCurrentRow = (\r\n name: string,\r\n rowIndex: number,\r\n seqId: string\r\n): actionResult => ({\r\n type: actionTypes.EA_GRID_CURRENTROW,\r\n payload: { name, rowIndex, seqId: String(seqId) },\r\n});\r\n\r\n//#endregion\r\n\r\n//#region ServerSentEvents\r\n\r\nexport const serverEventAction = (evt: any): actionResult => ({\r\n type: actionTypes.GLOBALEVENTS_SERVER,\r\n payload: evt,\r\n receivedAt: Date.now(),\r\n});\r\n\r\n//#endregion\r\n\r\n//#region Offline\r\n\r\nexport /* istanbul ignore next */ const startOfflineSyncAction = (\r\n items?: Array\r\n): actionResult => ({\r\n type: actionTypes.OFFLINE_SYNC_REQUEST,\r\n payload: { items },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const offlineSyncStartedAction = (\r\n {\r\n status,\r\n message,\r\n }: {\r\n status?: OfflineSyncStatusEnum,\r\n message?: string,\r\n } = { status: OfflineSyncStatus.Syncing }\r\n): actionResult => ({\r\n type: actionTypes.OFFLINE_SYNC_STARTED,\r\n payload: { status, message },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const offlineSyncDoneAction = (\r\n {\r\n status,\r\n message,\r\n }: {\r\n status: OfflineSyncStatusEnum,\r\n message?: string,\r\n } = { status: OfflineSyncStatus.Synced }\r\n): actionResult => ({\r\n type: actionTypes.OFFLINE_SYNC_DONE,\r\n payload: { status, message },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport /*istanbul ignore next */ const offlineSyncUpdateAction =\r\n (): actionResult => ({\r\n type: actionTypes.OFFLINE_SYNC_UPDATE,\r\n });\r\n\r\nexport const setOfflineItemSyncStatusAction = ({\r\n item,\r\n status,\r\n took,\r\n message,\r\n}: {\r\n item: OfflineItemStatus,\r\n status: OfflineSyncStatusEnum,\r\n took: number,\r\n message?: string,\r\n}): actionResult => ({\r\n type: actionTypes.OFFLINEITEM_SYNC_STATUS,\r\n payload: { status, item, took, message },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const removeOfflineItemAction = (\r\n item: OfflineItemStatus\r\n): actionResult => ({\r\n type: actionTypes.OFFLINEITEM_REMOVE,\r\n payload: { item },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport /* istanbul ignore next */ const getOfflineItemDepsMapAction = (\r\n item: OfflineItemStatus\r\n): actionResult => ({\r\n type: actionTypes.OFFLINEITEM_DEPSMAP_REQUEST,\r\n payload: { item },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const setOfflineItemDepsMapAction = (\r\n item: OfflineItemStatus,\r\n depsMap: Object\r\n): actionResult => ({\r\n type: actionTypes.OFFLINEITEM_DEPSMAP_RESULT,\r\n payload: { item, depsMap },\r\n receivedAt: Date.now(),\r\n});\r\n//#endregion\r\n\r\n//#region ServiceWorker\r\nexport const serviceWorkerInitializedAction = ({\r\n registration,\r\n error,\r\n}: {\r\n registration?: ServiceWorkerRegistration,\r\n error?: Error,\r\n}): actionResult => ({\r\n type: actionTypes.SW_INIT,\r\n payload: { registration, error },\r\n receivedAt: Date.now(),\r\n});\r\n\r\nexport const serviceWorkerUpdatedAction = ({\r\n registration,\r\n}: {\r\n registration: ServiceWorkerRegistration,\r\n}): actionResult => ({\r\n type: actionTypes.SW_UPDATE,\r\n payload: { registration },\r\n receivedAt: Date.now(),\r\n});\r\n//#endregion\r\n\r\n//#region Notification\r\nexport const notificationUpsertAction = (\r\n payload: NotificationDTO\r\n): actionResult => ({\r\n type: actionTypes.NOTIFICATION_UPSERT,\r\n payload,\r\n});\r\n\r\nexport const notificationDelAction = (\r\n notificationId: NotificationId\r\n): actionResult => ({\r\n type: actionTypes.NOTIFICATION_DEL,\r\n payload: { notificationId },\r\n});\r\n\r\nexport const notificationStatusAction = (\r\n status: NotificationStatusFlagEnum,\r\n notificationId: NotificationId,\r\n replace: boolean = false\r\n): actionResult => ({\r\n type: actionTypes.NOTIFICATION_STATUS,\r\n payload: { notificationId, status, replace },\r\n});\r\n\r\nexport const notificationClearAction = (\r\n payload: NotificationDTO\r\n): actionResult => ({\r\n type: actionTypes.NOTIFICATION_CLEAR,\r\n payload,\r\n});\r\n\r\nexport const notificationToastAction = (\r\n payload: NotificationDTO\r\n): actionResult => ({\r\n type: actionTypes.NOTIFICATION_TOAST,\r\n payload,\r\n});\r\n//#endregion\r\n\r\n//#region CommandAction\r\nexport const commandActionRequestAction = (\r\n payload: CommandActionRequestDTO\r\n): actionResult => ({\r\n type: actionTypes.COMMANDACTION_REQUEST,\r\n payload: { guid: window.crypto.randomUUID(), ...payload },\r\n});\r\n\r\nexport const commandActionQueueAddAction = (payload): actionResult => ({\r\n type: actionTypes.COMMANDACTION_QUEUE_ADD,\r\n payload,\r\n});\r\nexport const commandActionQueueRemoveAction = (guid: GUID): actionResult => ({\r\n type: actionTypes.COMMANDACTION_QUEUE_REMOVE,\r\n payload: { guid },\r\n});\r\nexport const commandActionQueuePauseAction = (): actionResult => ({\r\n type: actionTypes.COMMANDACTION_QUEUE_PAUSE,\r\n});\r\nexport const commandActionQueueStartAction = (): actionResult => ({\r\n type: actionTypes.COMMANDACTION_QUEUE_START,\r\n});\r\n\r\nexport const commandActionRemoveAction = (guid: GUID): actionResult => ({\r\n type: actionTypes.COMMANDACTION_REMOVE,\r\n payload: { guid },\r\n});\r\n\r\nexport const commandActionAbortAction = (guid: GUID): actionResult => ({\r\n type: actionTypes.COMMANDACTION_ABORT,\r\n payload: { guid },\r\n});\r\n\r\nexport const commandActionLogAction = (\r\n guid: GUID,\r\n log: CommandActionLog\r\n): actionResult => ({\r\n type: actionTypes.COMMANDACTION_LOG,\r\n payload: { guid, log },\r\n});\r\n\r\nexport const commandActionStatusAction = (\r\n guid: GUID,\r\n status: CommandActionStatusFlagEnum,\r\n replace: boolean = false\r\n): actionResult => ({\r\n type: actionTypes.COMMANDACTION_STATUS,\r\n payload: { guid, status, replace },\r\n});\r\n\r\nexport const commandActionItemStatusAction = (\r\n guid: GUID,\r\n itemUri: string,\r\n status: ConstantsEnum\r\n): actionResult => ({\r\n type: actionTypes.COMMANDACTION_ITEM_STATUS,\r\n payload: { guid, itemUri, status },\r\n});\r\n//#endregion\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { Manager, Reference, Popper } from \"react-popper\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\nimport moment from \"moment\";\r\nimport Moment from \"containers/Moment\";\r\nimport LocaleUtils, { formatDate, parseDate } from \"react-day-picker/moment\";\r\nimport DayPickerInput from \"react-day-picker/DayPickerInput\";\r\nimport \"react-day-picker/lib/style.css\";\r\nimport loc from \"i18next\";\r\nimport { DateTimeFormat, type DateTimeFormatValues } from \"data/types\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\nimport ClearableInput from \"@hs/clearable-input\";\r\n\r\ntype Props = {\r\n /** Field name */\r\n name: string,\r\n /** Field value */\r\n value: ?string,\r\n /** whether this field is required */\r\n isRequired: boolean,\r\n /** whether this field is readonly */\r\n isReadonly: boolean,\r\n /** how to render component */\r\n type: DateTimeFormatValues,\r\n};\r\n\r\ntype State = {\r\n day: Date,\r\n time: Date,\r\n dateValue: string,\r\n timeValue: string,\r\n};\r\n\r\n/* istanbul ignore next */\r\nexport const DatePickerReference = React.forwardRef((inputProps, inputRef) => (\r\n \r\n {({ ref }) => (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n));\r\n\r\n/* istanbul ignore next */\r\nexport const DatePickerPopper = ({\r\n children,\r\n classNames,\r\n onFocus,\r\n onBlur,\r\n tabIndex,\r\n}) =>\r\n createPortal(\r\n \r\n {({ ref, style, placement }) => (\r\n \r\n {children}\r\n \r\n )}\r\n ,\r\n document.getElementById(\"root\")\r\n );\r\n\r\nexport class DateEditorControl extends PureComponent {\r\n format: string;\r\n\r\n static defaultProps = {\r\n value: \"\",\r\n isRequired: false,\r\n isReadonly: false,\r\n type: DateTimeFormat.Date,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n // set user's locale for parsing/formatting\r\n moment.locale(userLanguage());\r\n // full date&time format\r\n this.format = this._getFormat(props);\r\n // parse pristine value or set NOW\r\n if (props.value != null && String(props.value).length > 0) {\r\n const dt = moment(props.value, this.format);\r\n this.state = {\r\n day: dt.toDate(),\r\n time: dt.toDate(),\r\n dateValue: this.getValueAsDate(props.value),\r\n timeValue: this.getValueAsDate(\r\n props.value,\r\n moment.HTML5_FMT[\r\n props.type.toLowerCase().includes(\"long\")\r\n ? \"TIME_SECONDS\"\r\n : \"TIME\"\r\n ]\r\n ),\r\n };\r\n } else {\r\n this.state = { day: new Date(), time: new Date() };\r\n }\r\n }\r\n\r\n _getFormat = (props) => {\r\n switch (props.type) {\r\n case DateTimeFormat.Time:\r\n return moment.localeData().longDateFormat(\"LT\");\r\n case DateTimeFormat.LongTime:\r\n return moment.localeData().longDateFormat(\"LTS\");\r\n case DateTimeFormat.DateTime:\r\n return `${moment.localeData().longDateFormat(\"L\")} ${moment\r\n .localeData()\r\n .longDateFormat(\"LT\")}`;\r\n case DateTimeFormat.DateLongTime:\r\n return `${moment.localeData().longDateFormat(\"L\")} ${moment\r\n .localeData()\r\n .longDateFormat(\"LTS\")}`;\r\n case DateTimeFormat.Date:\r\n return moment.localeData().longDateFormat(\"L\");\r\n case DateTimeFormat.JsonDate:\r\n return `YYYY-MM-DD[T]00:00:00.000`;\r\n case DateTimeFormat.JsonDateEnd:\r\n return `YYYY-MM-DD[T]23:59:59.000`;\r\n case DateTimeFormat.JsonDateTime:\r\n return `YYYY-MM-DD[T]HH:mm:ss.SSS`;\r\n default:\r\n console.error(\r\n \"Wrong DateTimeFormat provided. Defaulting to DatetimeFormat.Date\"\r\n );\r\n return moment.localeData().longDateFormat(\"L\");\r\n }\r\n };\r\n\r\n _getDate = () => {\r\n const { day, time } = this.state;\r\n const m = moment(\r\n new Date(\r\n day.getFullYear(),\r\n day.getMonth(),\r\n day.getDate(),\r\n time.getHours(),\r\n time.getMinutes(),\r\n time.getSeconds()\r\n )\r\n );\r\n return m.format(this.format);\r\n };\r\n\r\n _onDayChange = (\r\n day: ?Date,\r\n modifiers: Object,\r\n dayPickerInput: DayPickerInput,\r\n changeValue: Function\r\n ) => {\r\n const input = dayPickerInput.getInput();\r\n const value =\r\n input.getValue() === '' &&\r\n dayPickerInput.state.value !== '' &&\r\n dayPickerInput.state.typedValue === '' ?\r\n dayPickerInput.state.value :\r\n input.getValue()\r\n\r\n if (day != null) {\r\n this.setState(\r\n {\r\n day,\r\n dateValue: this.getValueAsDate(value, undefined, \"L\"),\r\n },\r\n () =>\r\n changeValue({\r\n currentTarget: {\r\n value:\r\n !this.shouldRenderTime() ||\r\n this.getValueAsDate(this.state.timeValue) !== \"\"\r\n ? this._getDate()\r\n : this.invalidate(value),\r\n },\r\n })\r\n );\r\n } else {\r\n // typedValue should be the right property, but this callback\r\n // is called before setState is finished, so we have to access\r\n // the current value ourselfs by using input._ref.value\r\n //\r\n // if typedValue is empty => field is cleared\r\n // if typedValue is filled it is an invalid value\r\n const errorValue = input._ref?.value === '' ? '' : value\r\n if (errorValue.trim().length === 0 && !this.shouldRenderTime()) {\r\n changeValue({\r\n currentTarget: { value: null },\r\n });\r\n this.setState({ dateValue: null });\r\n }\r\n else {\r\n if (!this.props.isRequired && this.state.timeValue === '__INVALID__' && errorValue.trim().length === 0) {\r\n changeValue({\r\n currentTarget: {\r\n value: null\r\n }\r\n });\r\n this.setState({\r\n dateValue: null\r\n });\r\n } else {\r\n changeValue({\r\n currentTarget: {\r\n value: this.invalidate(errorValue),\r\n },\r\n });\r\n this.setState({ dateValue: this.invalidate(errorValue) });\r\n }\r\n }\r\n }\r\n };\r\n\r\n _onTimeChange = (event: SyntheticInputEvent<*>, changeValue: Function) => {\r\n const value = event.currentTarget.value;\r\n const time = moment(value, \"LTS\").toDate();\r\n if (\r\n value.trim().length > 0 &&\r\n !isNaN(time) &&\r\n (!this.shouldRenderSeconds() || value.match(/:/g).length === 2) //HACK: do validate long time correctly\r\n ) {\r\n this.setState({ time, timeValue: value }, () =>\r\n changeValue({\r\n currentTarget: {\r\n value:\r\n !this.shouldRenderDate() ||\r\n this.getValueAsDate(this.state.dateValue) !== \"\"\r\n ? this._getDate()\r\n : this.invalidate(value),\r\n },\r\n })\r\n );\r\n } else {\r\n if (value.trim().length === 0 && !this.shouldRenderDate()) {\r\n changeValue({\r\n currentTarget: { value: null },\r\n });\r\n this.setState({ timeValue: null });\r\n } else {\r\n if (!this.props.isRequired && this.state.dateValue === '__INVALID__' && value.trim().length === 0) {\r\n changeValue({\r\n currentTarget: { value: null },\r\n });\r\n this.setState({ timeValue: null });\r\n } else {\r\n changeValue({\r\n currentTarget: {\r\n value: this.invalidate(value),\r\n },\r\n });\r\n this.setState({ timeValue: this.invalidate(value) });\r\n }\r\n }\r\n }\r\n };\r\n\r\n shouldRenderDate = () => this.props.type.toLowerCase().includes(\"date\");\r\n shouldRenderTime = () => this.props.type.toLowerCase().includes(\"time\");\r\n shouldRenderSeconds = () => this.props.type.toLowerCase().includes(\"long\");\r\n\r\n invalidate = (value: string): string => `__INVALID__${value}`;\r\n\r\n /* istanbul ignore next */\r\n getValueAsDate = (\r\n value: ?string,\r\n format: string = \"L\",\r\n valueFormat: string = this.format\r\n ) =>\r\n value &&\r\n String(value).length > 0 &&\r\n !String(value).startsWith(\"__INVALID__\")\r\n ? moment(value, valueFormat).format(format)\r\n : \"\";\r\n\r\n getValidValue = (value: ?string): any =>\r\n value && typeof value === \"string\"\r\n ? value.replace(\"__INVALID__\", \"\")\r\n : value;\r\n\r\n render = () => (\r\n void,\r\n isValid: boolean\r\n ) => (\r\n \r\n {this.shouldRenderDate() && (\r\n \r\n this._onDayChange(\r\n day,\r\n modifiers,\r\n dayPickerInput,\r\n changeValue\r\n )\r\n }\r\n placeholder={moment\r\n .localeData()\r\n .longDateFormat(\"L\")}\r\n format={\"L\"}\r\n component={DatePickerReference}\r\n overlayComponent={DatePickerPopper}\r\n />\r\n )}\r\n {this.shouldRenderTime() && (\r\n \r\n this._onTimeChange(event, changeValue)\r\n }\r\n style={{\r\n flexGrow: 0\r\n }}\r\n className=\"TimePickerInput form-control\"\r\n />\r\n )}\r\n \r\n )}\r\n {...this.props}\r\n />\r\n );\r\n}\r\n\r\nexport default Moment(DateEditorControl);\r\n","// @flow\r\nimport React, { useMemo } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\nimport MaskedInput from \"@hs/masked-input\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { getClassNames } from \"data/utils\";\r\nimport IMask from \"imask\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** precision - how many digits */\r\n decimalScale: number,\r\n /** currency identifier */\r\n currency?: string,\r\n /** localization setting for Thousands separator */\r\n thousandSeparator: string,\r\n /** localization setting for Decimal separator */\r\n decimalSeparator: string,\r\n /** whether field is readonly (disabled) */\r\n isReadonly: boolean,\r\n /** whether field is required (validation) */\r\n isRequired: boolean,\r\n /** placeholder text to display when @see {value} is empty */\r\n placeholder?: string,\r\n /** CSS Style to apply */\r\n style?: Object,\r\n /** CSS Classname to apply */\r\n className?: string,\r\n};\r\n\r\nconst IMaskNumberDefault = ({\r\n decimalScale,\r\n thousandSeparator,\r\n decimalSeparator,\r\n}) => {\r\n const props = {\r\n mask: Number,\r\n scale: decimalScale,\r\n signed: false,\r\n normalizeZeros: true,\r\n thousandsSeparator: thousandSeparator,\r\n padFractionalZeros: false,\r\n radix: \"\\u200B\", //HACK: Use zero-width space as commaseparator to enforce integer\r\n mapToRadix: [],\r\n };\r\n if (decimalScale > 0) {\r\n props.padFractionalZeros = true;\r\n props.radix = decimalSeparator;\r\n props.mapToRadix = [decimalSeparator];\r\n }\r\n return props;\r\n};\r\n\r\nconst IMaskCurrencyDefault = ({ currency, ...numberProps }) => ({\r\n mask: `${currency} num`,\r\n blocks: {\r\n num: { ...IMaskNumberDefault(numberProps) },\r\n },\r\n});\r\n\r\nexport const NumberEditorControl = ({\r\n mask,\r\n currency,\r\n decimalScale,\r\n thousandSeparator,\r\n decimalSeparator,\r\n ...props\r\n}: Props) => {\r\n const maskProps = useMemo(() => {\r\n if (mask) {\r\n return { mask };\r\n }\r\n if (currency) {\r\n return IMaskCurrencyDefault({\r\n currency,\r\n decimalScale,\r\n thousandSeparator,\r\n decimalSeparator,\r\n });\r\n }\r\n return IMaskNumberDefault({\r\n decimalScale,\r\n thousandSeparator,\r\n decimalSeparator,\r\n });\r\n }, [mask, currency, decimalScale, thousandSeparator, decimalSeparator]);\r\n return (\r\n (\r\n \r\n )}\r\n {...props}\r\n validations={{\r\n ...props.validations,\r\n notEmptyMask: /*istanbul ignore next*/ (values, value) => {\r\n if (!props.isRequired) return true;\r\n const rawValue = IMask.pipe(\r\n value ?? \"\",\r\n {\r\n ...maskProps,\r\n definitions: {\r\n \"#\": /[0-9]/,\r\n \"&\": /./,\r\n A: /[0-9a-zA-Z]/,\r\n a: /[0-9a-zA-Z]/,\r\n 9: /[0-9]/,\r\n C: /./,\r\n \"?\": /./,\r\n n: /[0-9]/,\r\n },\r\n },\r\n IMask.PIPE_TYPE.MASKED,\r\n IMask.PIPE_TYPE.UNMASKED\r\n );\r\n return String(rawValue) !== \"\";\r\n },\r\n }}\r\n validationErrors={{\r\n ...props.validationErrors,\r\n notEmptyMask: loc.t(\"common:validation.required\"),\r\n }}\r\n />\r\n );\r\n};\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n thousandSeparator: s.userThousandSeparator(state),\r\n decimalSeparator: s.userDecimalSeparator(state),\r\n ...ownProps,\r\n});\r\n\r\nexport default connect(mapStateToProps)(NumberEditorControl);\r\n","import React from \"react\";\r\nimport { ApiErrorResult } from \"data/types\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport ButtonGroup from \"react-bootstrap/lib/ButtonGroup\";\r\nimport { get } from \"data/constants\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport { toastActionResult, toastStyled, toastTypes } from \"data/toast\";\r\nimport copy from \"copy-to-clipboard\";\r\nimport { JL } from \"data/logging\";\r\n\r\nexport const HTTP_ERROR_CONFLICT = 412;\r\n\r\nconst _log = JL(\"apiError\");\r\nexport class ApiErrorContainer extends Error {\r\n data: ApiErrorResult;\r\n\r\n constructor(response: ApiErrorResult) {\r\n super(response.message);\r\n /* istanbul ignore else */\r\n if (Error.captureStackTrace)\r\n Error.captureStackTrace(this, ApiErrorContainer);\r\n this.data = response;\r\n }\r\n}\r\n\r\nexport class ApiError extends ApiErrorContainer {\r\n constructor(...args) {\r\n super({\r\n message: args.length > 0 ? args[0] : \"Unknown\",\r\n isError: true,\r\n });\r\n }\r\n}\r\n\r\nexport class ApiNetworkError extends ApiErrorContainer {\r\n constructor(...args) {\r\n const response: Response = args[0];\r\n super({\r\n ...(args.length > 1 ? args[1] : {}),\r\n statusCode: response.status,\r\n statusText: response.statusText,\r\n isError: true,\r\n });\r\n }\r\n}\r\n\r\nexport class ApiConflictError extends ApiNetworkError {}\r\n\r\nexport class ApiNetworkOfflineError extends ApiErrorContainer {\r\n constructor(...args) {\r\n super({\r\n message: args[0],\r\n detail: args.length > 1 ? args[1] : null,\r\n isError: true,\r\n eventId: { id: 0, name: \"OFFLINE\" },\r\n });\r\n }\r\n}\r\n\r\nexport const notifyOnError = (response) => {\r\n _log.error(() => ({\r\n msg: \"Fetch.Api.Error\",\r\n response,\r\n }));\r\n\r\n if (!response.extra || response.extra.notify !== true) {\r\n return;\r\n }\r\n\r\n const { extra, isError, ...rest } = response;\r\n /* istanbul ignore next */\r\n const {\r\n email = false,\r\n text = \"\",\r\n url = false,\r\n } = get(window.CONFIG, [\"general\", \"localContactInfo\"], {});\r\n const message = getLocalizedText(\"$fetch.clipboard_copy.message\");\r\n const handleClick = () =>\r\n copy(JSON.stringify(rest), {\r\n message,\r\n format: \"text/plain\",\r\n onCopy: /* istanbul ignore next */ (clipboardData: Object) =>\r\n toastActionResult(true, \"fetch.clipboard_copy\"),\r\n });\r\n\r\n const details = () => (\r\n \r\n {email && (\r\n \r\n )}\r\n {url && (\r\n \r\n {url}\r\n \r\n )}\r\n \r\n \r\n );\r\n\r\n toastStyled({\r\n ...toastTypes.failure,\r\n autoClose: false,\r\n details,\r\n message: getLocalizedText(response.extra.loc || \"$fetch.error\", {\r\n text,\r\n }),\r\n });\r\n};\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"row\":\"RowResult_row__XIpu8\",\"multi\":\"RowResult_multi__VKNpr\",\"ext\":\"RowResult_ext__2okQw\",\"thumbnail\":\"RowResult_thumbnail__2-QGf\",\"active\":\"RowResult_active__kpxqP\",\"hovered\":\"RowResult_hovered__1Iq4t\",\"below\":\"RowResult_below__2auZK\",\"name\":\"RowResult_name__21RYa\",\"attrs\":\"RowResult_attrs__2Tbfn\",\"checkbox\":\"RowResult_checkbox__3VzO7\"};","// https://github.com/EventMobi/redux-saga-network-status/blob/master/src/reducer.js\r\n\r\n// // True when we have been online at least once\r\n// hasBeenOnline: false,\r\n// // Whether we have pinged the server at least once\r\n// hasDetectedNetworkStatus: false,\r\n// // Whether the browser is connected to a network\r\n// isNavigatorOnline: false,\r\n// // Whether the server is reachable over the network\r\n// isOnline: false,\r\n// // Whether we are currently pinging the server\r\n// isPinging: false,\r\n// // Number of milliseconds until the next ping attempt\r\n// msUntilNextPing: 0,\r\n// // The most recent ping error\r\n// pingError: null,\r\n\r\nexport const isApiOnlineSelector = (state) => state.network.isOnline;\r\nexport const isNavigatorOnlineSelector = (state) =>\r\n state.network.isNavigatorOnline;\r\nexport const hasDetectedNetworkStatusSelector = (state) =>\r\n state.network.hasDetectedNetworkStatus;\r\nexport const hasBeenOnlineSelector = (state) => state.network.hasBeenOnline;\r\n\r\nexport const isOnlineSelector = (state) =>\r\n hasDetectedNetworkStatusSelector(state)\r\n ? isNavigatorOnlineSelector(state) && isApiOnlineSelector(state)\r\n : isNavigatorOnlineSelector(state); // do not block even if not ping'ed api yet\r\n","// export all selectors at once to make imports easier\r\nimport queryString from \"data/queryString\";\r\nimport { Location } from \"history\";\r\nimport {\r\n favoritesStatusSelector,\r\n favoritesFavoritesSelector,\r\n} from \"./favoritesReducer\";\r\nimport {\r\n userIdSelector,\r\n userStatusSelector,\r\n userCorrelationIdSelector,\r\n userSitesSelector,\r\n userMainNavigationSelector,\r\n userLanguageSelector,\r\n userDecimalSeparator,\r\n userThousandSeparator,\r\n userItemActionsSelector,\r\n userHasOfflineItemsSelector,\r\n userIsWfEnabledSelector,\r\n userIsAdminSelector,\r\n} from \"./userReducer\";\r\nimport {\r\n loginStatusSelector,\r\n loginIdTokenSelector,\r\n loginAccessTokenSelector,\r\n loginExpiresOnSelector,\r\n loginExpiresInSelector,\r\n} from \"./loginReducer\";\r\nimport {\r\n treeStatusSelector,\r\n treeErrorSelector,\r\n treeNodesSelector,\r\n treeIsRootSelector,\r\n treeIsBrowsableSelector,\r\n treeTotalCountSelector,\r\n} from \"./treeReducer\";\r\nimport {\r\n docsItemUriSelector,\r\n docsStatusSelector,\r\n docsErrorSelector,\r\n docsColsSelector,\r\n docsRowsSelector,\r\n docsTotalCountSelector,\r\n docsFiltersSelector,\r\n docsSortsSelector,\r\n docsFlagsSelector,\r\n docsFlagsForceDocListSimpleSelector,\r\n docsFlagsIsDocEditAllowedSelector,\r\n docsFlagsIsDocDownloadAllowedSelector,\r\n docsFlagsIsDocSendByEmailAllowedSelector,\r\n docsFlagsIsDocAssignmentAllowedSelector,\r\n docsFlagsInPointSyncIntegrationSelector,\r\n docsFlagsIsFolderClassificationEditAllowedSelector,\r\n docsFlagsIsDocClassificationEditAllowedSelector,\r\n docsFilterTextSelector,\r\n} from \"./docsReducer\";\r\nimport {\r\n thumbnailStatusSelector,\r\n thumbnailResultSelector,\r\n} from \"./thumbnailsReducer\";\r\nimport {\r\n docsLayoutStatusSelector,\r\n docsLayoutFiltersSelector,\r\n docsLayoutSortsSelector,\r\n} from \"./docsLayoutReducer\";\r\nimport { cardsStatusSelector, cardsCardsSelector } from \"./cardsReducer\";\r\nimport {\r\n workflowStatusSelector,\r\n workflowCardsSelector,\r\n workflowPendingCountSelector,\r\n} from \"./workflowReducer\";\r\nimport {\r\n breadcrumbIsFavSelector,\r\n breadcrumbItemUriSelector,\r\n breadcrumbNameSelector,\r\n breadcrumbLevelsCountSelector,\r\n breadcrumbVersionSelector,\r\n breadcrumbFormatIdSelector,\r\n breadcrumbSiteTypeSelector,\r\n} from \"./breadcrumbReducer\";\r\nimport {\r\n currentStatusSelector,\r\n currentItemUriSelector,\r\n currentNameSelector,\r\n} from \"./currentItemReducer\";\r\nimport {\r\n sidebarMiniSelector,\r\n docListViewModeSelector,\r\n settingValueSelector,\r\n} from \"./settingsReducer\";\r\nimport {\r\n formDetailViewSelector,\r\n formLastChangeSelector,\r\n formAuditLogSelector,\r\n formGridRowIndexSelector,\r\n formGridRowSeqIdSelector,\r\n formDefaultsSelector,\r\n formIsEditModeSelector,\r\n formTabIndexSelector,\r\n} from \"./formReducer\";\r\nimport { selectedTogglesSelector } from \"./togglesReducer\";\r\nimport { panesViewSelector } from \"./panesReducer\";\r\nimport { globalSearchOptionsSelector } from \"./globalSearchReducer\";\r\nimport {\r\n searchStatusSelector,\r\n searchErrorSelector,\r\n searchResultSelector,\r\n searchResultTotalCountSelector,\r\n searchRequestSelector,\r\n searchTermsSelector,\r\n searchItemSelector,\r\n searchFormStatusSelector,\r\n searchFormChangesSelector,\r\n searchFormResultSelector,\r\n searchFormIdSelector,\r\n searchCountStatusSelector,\r\n searchCountResultSelector,\r\n searchCountAggregationsSelector,\r\n} from \"./searchReducer\";\r\nimport {\r\n searchFormListStatusSelector,\r\n searchFormListResultSelector,\r\n searchFormListCountSelector,\r\n} from \"./searchFormsReducer\";\r\nimport {\r\n offlineSyncStatusSelector,\r\n offlineItemsSelector,\r\n offlineItemDepsMapSelector,\r\n} from \"./offlineReducer\";\r\nimport { globalEventsSelector } from \"./globalEventsReducer\";\r\nimport {\r\n isOnlineSelector,\r\n isApiOnlineSelector,\r\n isNavigatorOnlineSelector,\r\n hasDetectedNetworkStatusSelector,\r\n hasBeenOnlineSelector,\r\n} from \"./networkSelectors\";\r\nimport {\r\n isSwInitializedSelector,\r\n isSwFailedSelector,\r\n isSwUpdatedSelector,\r\n swRegistrationSelector,\r\n} from \"./serviceWorkerReducer\";\r\n\r\nimport { notificationSelector } from \"./notificationReducer\";\r\n\r\nimport {\r\n commandActionRequestSelector,\r\n commandActionRequestItemSelector,\r\n} from \"./commandActionReducer\";\r\n\r\nexport const itemUriSelector = (props: Object & { location: Location }) =>\r\n \"pam-item://\" + queryString.parse(props.location.search).uri;\r\n\r\n// export const urlParamSelector = (\r\n// paramName: string,\r\n// props: Object & { location: Location }\r\n// ) => queryString.parse(props.location.search)[paramName];\r\n\r\nexport {\r\n isOnlineSelector,\r\n isApiOnlineSelector,\r\n isNavigatorOnlineSelector,\r\n hasDetectedNetworkStatusSelector,\r\n hasBeenOnlineSelector,\r\n favoritesStatusSelector,\r\n favoritesFavoritesSelector,\r\n userIdSelector,\r\n userStatusSelector,\r\n userSitesSelector,\r\n userMainNavigationSelector,\r\n userLanguageSelector,\r\n userCorrelationIdSelector,\r\n userDecimalSeparator,\r\n userThousandSeparator,\r\n userItemActionsSelector,\r\n userHasOfflineItemsSelector,\r\n userIsWfEnabledSelector,\r\n userIsAdminSelector,\r\n loginStatusSelector,\r\n loginIdTokenSelector,\r\n loginAccessTokenSelector,\r\n loginExpiresOnSelector,\r\n loginExpiresInSelector,\r\n treeStatusSelector,\r\n treeErrorSelector,\r\n treeNodesSelector,\r\n treeIsRootSelector,\r\n treeIsBrowsableSelector,\r\n treeTotalCountSelector,\r\n docsItemUriSelector,\r\n docsStatusSelector,\r\n docsErrorSelector,\r\n docsColsSelector,\r\n docsRowsSelector,\r\n docsTotalCountSelector,\r\n docsFiltersSelector,\r\n docsSortsSelector,\r\n docsFlagsSelector,\r\n thumbnailStatusSelector,\r\n thumbnailResultSelector,\r\n docsFlagsForceDocListSimpleSelector,\r\n docsFlagsIsDocEditAllowedSelector,\r\n docsFlagsIsDocDownloadAllowedSelector,\r\n docsFlagsIsDocSendByEmailAllowedSelector,\r\n docsFlagsIsDocAssignmentAllowedSelector,\r\n docsFlagsInPointSyncIntegrationSelector,\r\n docsFlagsIsFolderClassificationEditAllowedSelector,\r\n docsFlagsIsDocClassificationEditAllowedSelector,\r\n docsFilterTextSelector,\r\n docsLayoutStatusSelector,\r\n docsLayoutFiltersSelector,\r\n docsLayoutSortsSelector,\r\n cardsStatusSelector,\r\n cardsCardsSelector,\r\n workflowStatusSelector,\r\n workflowCardsSelector,\r\n workflowPendingCountSelector,\r\n breadcrumbIsFavSelector,\r\n breadcrumbItemUriSelector,\r\n breadcrumbNameSelector,\r\n breadcrumbLevelsCountSelector,\r\n breadcrumbVersionSelector,\r\n breadcrumbFormatIdSelector,\r\n breadcrumbSiteTypeSelector,\r\n currentStatusSelector,\r\n currentItemUriSelector,\r\n currentNameSelector,\r\n sidebarMiniSelector,\r\n docListViewModeSelector,\r\n settingValueSelector,\r\n formDetailViewSelector,\r\n formLastChangeSelector,\r\n formAuditLogSelector,\r\n formGridRowIndexSelector,\r\n formGridRowSeqIdSelector,\r\n formDefaultsSelector,\r\n formIsEditModeSelector,\r\n formTabIndexSelector,\r\n selectedTogglesSelector,\r\n panesViewSelector,\r\n globalSearchOptionsSelector,\r\n searchStatusSelector,\r\n searchErrorSelector,\r\n searchResultSelector,\r\n searchResultTotalCountSelector,\r\n searchRequestSelector,\r\n searchTermsSelector,\r\n searchItemSelector,\r\n searchCountStatusSelector,\r\n searchCountResultSelector,\r\n searchCountAggregationsSelector,\r\n searchFormStatusSelector,\r\n searchFormResultSelector,\r\n searchFormIdSelector,\r\n searchFormChangesSelector,\r\n searchFormListStatusSelector,\r\n searchFormListResultSelector,\r\n searchFormListCountSelector,\r\n globalEventsSelector,\r\n offlineSyncStatusSelector,\r\n offlineItemsSelector,\r\n offlineItemDepsMapSelector,\r\n isSwInitializedSelector,\r\n isSwFailedSelector,\r\n isSwUpdatedSelector,\r\n swRegistrationSelector,\r\n notificationSelector,\r\n commandActionRequestSelector,\r\n commandActionRequestItemSelector,\r\n};\r\n","// @flow\r\nimport React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport bowser from \"data/bowser\";\r\nimport Dropdown from \"react-bootstrap/lib/Dropdown\";\r\nimport RootCloseWrapper from \"react-overlays/lib/RootCloseWrapper\";\r\nimport styles from \"./AbsoluteDropdown.module.css\";\r\nimport { Manager, Reference, Popper } from \"react-popper\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** TODO whether to open the menu on mouse hover (only on desktop)\r\n * @default true\r\n */\r\n openMenuOnHover?: boolean,\r\n /** Dropdown children */\r\n children: React.ElementType,\r\n /** button's tooltip */\r\n title?: string,\r\n /** CSS class to apply to top container */\r\n className?: string,\r\n /** whether to render toggle button as disabled */\r\n disabled?: boolean,\r\n};\r\n\r\ntype State = {\r\n isOpen: boolean,\r\n};\r\n\r\n/**\r\n * wrapper around DropdownToggle which will absolute position the menu based on screen restrictions\r\n */\r\nclass AbsoluteDropdown extends React.PureComponent {\r\n // https://github.com/reactstrap/reactstrap/issues/1088\r\n //const [isOpen, updateIsOpen] = useState(false);\r\n state = { isOpen: false };\r\n\r\n static defaultProps = {\r\n openMenuOnHover: true,\r\n };\r\n\r\n _toggleIsOpen = () =>\r\n this.setState((prevState: State) => ({ isOpen: !prevState.isOpen }));\r\n\r\n _handleRootClose = () => this.setState({ isOpen: false });\r\n\r\n render = () => (\r\n \r\n \r\n \r\n {React.Children.map(this.props.children, (child, index) => {\r\n if (child.type === Dropdown.Toggle) {\r\n return (\r\n \r\n {({ ref }) => (\r\n \r\n {child.props.children}\r\n {!(\r\n child.props.noCaret === true\r\n ) && (\r\n <>\r\n {\" \"}\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n } else if (child.type === Dropdown.Menu) {\r\n if (this.state.isOpen === false) return null;\r\n return createPortal(\r\n \r\n {({\r\n ref,\r\n style,\r\n placement,\r\n arrowProps,\r\n }) => (\r\n \r\n {child.props.children}\r\n {/* */}\r\n \r\n )}\r\n ,\r\n document.getElementById(\"root\")\r\n );\r\n } else {\r\n return new Error(\r\n `Unsupported child of type ${child.type.name} for AbsoluteDropdown!`\r\n );\r\n }\r\n })}\r\n \r\n \r\n \r\n );\r\n}\r\nexport default AbsoluteDropdown;\r\n","// @flow\r\nimport React, { type Node, useMemo } from \"react\";\r\nimport styles from \"./Avatar.module.css\";\r\nimport { useSelector } from \"react-redux\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n id: number,\r\n style?: StyleSheet | Object,\r\n title?: string,\r\n className?: string,\r\n children?: Node,\r\n};\r\n\r\nconst Avatar = ({ id, style, title, className, children }: Props) => {\r\n const isOnline = useSelector(s.isOnlineSelector);\r\n const correlationId = useSelector(s.userCorrelationIdSelector);\r\n\r\n const imgUrl = useMemo(() => {\r\n let result = `${window.CONFIG.host.basename}${window.CONFIG.general.api}/user/avatar/${id}`;\r\n if (isOnline)\r\n result += `?correlationId=${encodeURIComponent(correlationId)}`;\r\n return result;\r\n }, [id, isOnline, correlationId]);\r\n\r\n const avatarStyle = useMemo(\r\n () =>\r\n Object.assign(\r\n {},\r\n {\r\n backgroundImage: `url(${imgUrl})`,\r\n },\r\n style\r\n ),\r\n [imgUrl, style]\r\n );\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\nAvatar.displayName = \"Avatar\";\r\nexport default Avatar;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"expand\":\"FolderTree_expand__1mzmT\",\"noexpand\":\"FolderTree_noexpand__388Tp\",\"listLeft\":\"FolderTree_listLeft__3a5E-\",\"listGroupItem\":\"FolderTree_listGroupItem__3RbNs\",\"treeCount\":\"FolderTree_treeCount__HQ7wx\",\"listGroupItemActive\":\"FolderTree_listGroupItemActive__1zjWs\",\"unfocused\":\"FolderTree_unfocused__hOH3r\",\"elementIcon\":\"FolderTree_elementIcon__3XY-Q\",\"listName\":\"FolderTree_listName__1B74y\",\"hasMore\":\"FolderTree_hasMore__37Bgu\"};","var map = {\n\t\"./bg\": [\n\t\t1027,\n\t\t0\n\t],\n\t\"./bg.js\": [\n\t\t1027,\n\t\t0\n\t],\n\t\"./cs\": [\n\t\t1028,\n\t\t1\n\t],\n\t\"./cs.js\": [\n\t\t1028,\n\t\t1\n\t],\n\t\"./de\": [\n\t\t1031,\n\t\t2\n\t],\n\t\"./de-at\": [\n\t\t1029,\n\t\t3\n\t],\n\t\"./de-at.js\": [\n\t\t1029,\n\t\t3\n\t],\n\t\"./de-ch\": [\n\t\t1030,\n\t\t4\n\t],\n\t\"./de-ch.js\": [\n\t\t1030,\n\t\t4\n\t],\n\t\"./de.js\": [\n\t\t1031,\n\t\t2\n\t],\n\t\"./en-gb\": [\n\t\t1032,\n\t\t5\n\t],\n\t\"./en-gb.js\": [\n\t\t1032,\n\t\t5\n\t],\n\t\"./es\": [\n\t\t1033,\n\t\t6\n\t],\n\t\"./es.js\": [\n\t\t1033,\n\t\t6\n\t],\n\t\"./fr\": [\n\t\t1034,\n\t\t7\n\t],\n\t\"./fr.js\": [\n\t\t1034,\n\t\t7\n\t],\n\t\"./hr\": [\n\t\t1035,\n\t\t8\n\t],\n\t\"./hr.js\": [\n\t\t1035,\n\t\t8\n\t],\n\t\"./hu\": [\n\t\t1036,\n\t\t9\n\t],\n\t\"./hu.js\": [\n\t\t1036,\n\t\t9\n\t],\n\t\"./it\": [\n\t\t1037,\n\t\t10\n\t],\n\t\"./it.js\": [\n\t\t1037,\n\t\t10\n\t],\n\t\"./lt\": [\n\t\t1038,\n\t\t11\n\t],\n\t\"./lt.js\": [\n\t\t1038,\n\t\t11\n\t],\n\t\"./ru\": [\n\t\t1039,\n\t\t12\n\t],\n\t\"./ru.js\": [\n\t\t1039,\n\t\t12\n\t],\n\t\"./sk\": [\n\t\t1040,\n\t\t13\n\t],\n\t\"./sk.js\": [\n\t\t1040,\n\t\t13\n\t],\n\t\"./uk\": [\n\t\t1041,\n\t\t14\n\t],\n\t\"./uk.js\": [\n\t\t1041,\n\t\t14\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__.t(id, 7);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 1596;\nmodule.exports = webpackAsyncContext;","import actionTypes from \"../actions/actionTypes\";\r\nimport immutable from \"object-path-immutable\";\r\nimport {\r\n parseSeqId,\r\n isGridRowDeleted,\r\n} from \"components/ExtraAttributes/GridEditorControl/GridUtils\";\r\n\r\nexport const initialState = {\r\n detailView: {},\r\n defaults: {},\r\n isEditMode: {},\r\n \"ea.tab\": {},\r\n};\r\n\r\nconst formReducer = (state = initialState, action) => {\r\n let isNew, seqId;\r\n switch (action.type) {\r\n case actionTypes.EA_AUDITLOG_UPDATE:\r\n return {\r\n ...immutable.merge(\r\n state,\r\n [\r\n action.payload.name,\r\n \"auditLog\",\r\n \"updatedRows\",\r\n action.payload.seqId,\r\n ],\r\n action.payload.values\r\n ),\r\n };\r\n\r\n case actionTypes.EA_AUDITLOG_DEL:\r\n [isNew, seqId] = parseSeqId(action.payload.seqId);\r\n if (isNew) {\r\n return {\r\n ...immutable.del(state, [\r\n action.payload.name,\r\n \"auditLog\",\r\n \"newRows\",\r\n seqId,\r\n ]),\r\n };\r\n }\r\n if (\r\n state[action.payload.name] &&\r\n isGridRowDeleted(state[action.payload.name].auditLog, seqId)\r\n ) {\r\n return state;\r\n }\r\n return {\r\n ...immutable.push(\r\n state,\r\n [action.payload.name, \"auditLog\", \"deletedIds\"],\r\n seqId\r\n ),\r\n };\r\n case actionTypes.EA_AUDITLOG_INSERT:\r\n return {\r\n ...immutable.merge(\r\n state,\r\n [\r\n action.payload.name,\r\n \"auditLog\",\r\n \"newRows\",\r\n action.payload.rowIndex,\r\n ],\r\n action.payload.values\r\n ),\r\n };\r\n\r\n case actionTypes.EA_AUDITLOG_CLEAR:\r\n [isNew, seqId] = parseSeqId(action.payload.seqId);\r\n if (isNew) {\r\n return {\r\n ...immutable.set(\r\n state,\r\n [action.payload.name, \"auditLog\", \"newRows\", seqId],\r\n action.payload.values\r\n ),\r\n };\r\n }\r\n // Clear Updates\r\n let _state = immutable.del(state, [\r\n action.payload.name,\r\n \"auditLog\",\r\n \"updatedRows\",\r\n action.payload.seqId,\r\n ]);\r\n // Clear Deletes\r\n if (\r\n state[action.payload.name] &&\r\n isGridRowDeleted(state[action.payload.name].auditLog, seqId)\r\n ) {\r\n _state = immutable.del(_state, [\r\n action.payload.name,\r\n \"auditLog\",\r\n \"deletedIds\",\r\n state[action.payload.name].auditLog.deletedIds.indexOf(\r\n seqId\r\n ),\r\n ]);\r\n }\r\n return {\r\n ..._state,\r\n };\r\n\r\n case actionTypes.EA_GRID_CURRENTROW:\r\n return {\r\n ...immutable.merge(state, [action.payload.name], {\r\n rowIndex: action.payload.rowIndex,\r\n seqId: action.payload.seqId,\r\n }),\r\n };\r\n\r\n case actionTypes.EA_DETAILVIEW_SET:\r\n if (action.payload == null) {\r\n return { ...state, detailView: {} };\r\n } else {\r\n return {\r\n ...immutable.merge(state, \"detailView\", action.payload),\r\n };\r\n }\r\n\r\n case actionTypes.EA_FIELD_SET:\r\n if (action.payload == null) {\r\n return state;\r\n } else {\r\n return {\r\n ...state,\r\n lastChange: action.payload,\r\n };\r\n }\r\n\r\n case actionTypes.EA_TABINDEX_SET:\r\n return {\r\n ...immutable.merge(\r\n state,\r\n [\"ea.tab\", action.payload.itemUri, action.payload.name],\r\n { tabIndex: action.payload.tabIndex }\r\n ),\r\n };\r\n\r\n case actionTypes.EA_CLEAR:\r\n // make sure not to clear the default form values (set by containers/DefaultValuesHandler)\r\n return {\r\n ...initialState,\r\n defaults: state.defaults,\r\n isEditMode: state.isEditMode,\r\n \"ea.tab\": state[\"ea.tab\"],\r\n };\r\n\r\n case actionTypes.FORM_DEFAULTS_SET:\r\n return { ...initialState, defaults: action.payload.defaults };\r\n\r\n case actionTypes.FORM_EDITMODE_SET:\r\n // if (state.current && state.current.name)\r\n let isEditMode = {};\r\n // HACK tricky to get called to pass in viewName, so we set everything here\r\n if (action.payload.name === \"doc\") {\r\n isEditMode.docmodal = action.payload.isEditMode;\r\n isEditMode.document = action.payload.isEditMode;\r\n } else {\r\n /* istanbul ignore else */ if (\r\n action.payload.name === \"folder\"\r\n ) {\r\n isEditMode.folder = action.payload.isEditMode;\r\n } else alert(\"Unknown form named \" + action.payload.name);\r\n }\r\n return {\r\n ...initialState,\r\n isEditMode,\r\n \"ea.tab\": state[\"ea.tab\"],\r\n };\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default formReducer;\r\n\r\nexport const formDetailViewSelector = (state: Object) => state.form.detailView;\r\nexport const formLastChangeSelector = (state: Object) => state.form.lastChange;\r\nexport const formAuditLogSelector = (state: Object, name: string) =>\r\n state.form && state.form[name] != null && state.form[name].auditLog != null\r\n ? state.form[name].auditLog\r\n : null;\r\nexport const formGridRowIndexSelector = (state: Object, name: string) =>\r\n state.form && state.form[name] && state.form[name].rowIndex != null\r\n ? state.form[name].rowIndex\r\n : -1;\r\nexport const formGridRowSeqIdSelector = (state: Object, name: string) =>\r\n state.form && state.form[name] && state.form[name].seqId != null\r\n ? state.form[name].seqId\r\n : -1;\r\nexport const formDefaultsSelector = (state: Object) => state.form.defaults;\r\nexport const formIsEditModeSelector = (state: Object, name: string) =>\r\n state.form && state.form.isEditMode[name]\r\n ? state.form.isEditMode[name]\r\n : false;\r\nexport const formTabIndexSelector = (\r\n state: Object,\r\n name: string,\r\n itemUri: string\r\n) =>\r\n state.form &&\r\n state.form[\"ea.tab\"] &&\r\n state.form[\"ea.tab\"][itemUri] &&\r\n state.form[\"ea.tab\"][itemUri][name]\r\n ? state.form[\"ea.tab\"][itemUri][name].tabIndex\r\n : -1;\r\n","var map = {\n\t\"./bg_BG\": [\n\t\t1042,\n\t\t7,\n\t\t15\n\t],\n\t\"./bg_BG.js\": [\n\t\t1042,\n\t\t7,\n\t\t15\n\t],\n\t\"./bg_BG.js.map\": [\n\t\t1760,\n\t\t9,\n\t\t53\n\t],\n\t\"./cs_CZ\": [\n\t\t1043,\n\t\t7,\n\t\t16\n\t],\n\t\"./cs_CZ.js\": [\n\t\t1043,\n\t\t7,\n\t\t16\n\t],\n\t\"./cs_CZ.js.map\": [\n\t\t1761,\n\t\t9,\n\t\t54\n\t],\n\t\"./de_DE\": [\n\t\t1044,\n\t\t7,\n\t\t17\n\t],\n\t\"./de_DE.js\": [\n\t\t1044,\n\t\t7,\n\t\t17\n\t],\n\t\"./de_DE.js.map\": [\n\t\t1762,\n\t\t9,\n\t\t55\n\t],\n\t\"./en_US\": [\n\t\t1045,\n\t\t7,\n\t\t18\n\t],\n\t\"./en_US.js\": [\n\t\t1045,\n\t\t7,\n\t\t18\n\t],\n\t\"./en_US.js.map\": [\n\t\t1763,\n\t\t9,\n\t\t56\n\t],\n\t\"./es_ES\": [\n\t\t1046,\n\t\t7,\n\t\t19\n\t],\n\t\"./es_ES.js\": [\n\t\t1046,\n\t\t7,\n\t\t19\n\t],\n\t\"./es_ES.js.map\": [\n\t\t1764,\n\t\t9,\n\t\t57\n\t],\n\t\"./fr_FR\": [\n\t\t1047,\n\t\t7,\n\t\t20\n\t],\n\t\"./fr_FR.js\": [\n\t\t1047,\n\t\t7,\n\t\t20\n\t],\n\t\"./fr_FR.js.map\": [\n\t\t1765,\n\t\t9,\n\t\t58\n\t],\n\t\"./hr_HR\": [\n\t\t1048,\n\t\t7,\n\t\t21\n\t],\n\t\"./hr_HR.js\": [\n\t\t1048,\n\t\t7,\n\t\t21\n\t],\n\t\"./hr_HR.js.map\": [\n\t\t1766,\n\t\t9,\n\t\t59\n\t],\n\t\"./hu_HU\": [\n\t\t1049,\n\t\t7,\n\t\t22\n\t],\n\t\"./hu_HU.js\": [\n\t\t1049,\n\t\t7,\n\t\t22\n\t],\n\t\"./hu_HU.js.map\": [\n\t\t1767,\n\t\t9,\n\t\t60\n\t],\n\t\"./it_IT\": [\n\t\t1050,\n\t\t7,\n\t\t23\n\t],\n\t\"./it_IT.js\": [\n\t\t1050,\n\t\t7,\n\t\t23\n\t],\n\t\"./it_IT.js.map\": [\n\t\t1768,\n\t\t9,\n\t\t61\n\t],\n\t\"./ru_RU\": [\n\t\t1051,\n\t\t7,\n\t\t24\n\t],\n\t\"./ru_RU.js\": [\n\t\t1051,\n\t\t7,\n\t\t24\n\t],\n\t\"./ru_RU.js.map\": [\n\t\t1769,\n\t\t9,\n\t\t62\n\t],\n\t\"./sk_SK\": [\n\t\t1052,\n\t\t7,\n\t\t25\n\t],\n\t\"./sk_SK.js\": [\n\t\t1052,\n\t\t7,\n\t\t25\n\t],\n\t\"./sk_SK.js.map\": [\n\t\t1770,\n\t\t9,\n\t\t63\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[2]).then(function() {\n\t\treturn __webpack_require__.t(id, ids[1])\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 1649;\nmodule.exports = webpackAsyncContext;","import React from \"react\";\r\nimport styles from \"./SummaryAttribute.module.css\";\r\nimport Badge from \"react-bootstrap/lib/Badge\";\r\nimport PrincipalAvatar from \"components/User/PrincipalAvatar\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport loc from \"i18next\";\r\n\r\nimport { type SummaryAttributeValueFacePile } from \"data/types\";\r\n\r\nconst ValueFacePile = ({ value }: { value: SummaryAttributeValueFacePile }) => (\r\n \r\n {value.pile.map((p, index) => (\r\n \r\n \r\n \r\n ))}\r\n {value.total != null && value.total > value.pile.length && (\r\n \r\n value.onMoreCommand != null &&\r\n CommandActionHandler(\r\n value.onMoreCommand.name,\r\n value.onMoreCommand.props\r\n )\r\n }\r\n >\r\n \r\n +{value.total - value.pile.length}\r\n \r\n \r\n )}\r\n \r\n);\r\nValueFacePile.displayName = \"AttributeSummaryValue.FacePile\";\r\nexport default ValueFacePile;\r\n","import React from \"react\";\r\nimport styles from \"./SummaryAttribute.module.css\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Avatar from \"components/User/Avatar\";\r\n\r\nimport { type SummaryAttributeValuePrincipal } from \"data/types\";\r\n\r\nconst ValueUser = ({ value }: { value: SummaryAttributeValuePrincipal }) => {\r\n const renderName = () => (\r\n <>\r\n \r\n {value.displayName}\r\n
\r\n {value.description}\r\n
\r\n \r\n \r\n );\r\n\r\n if (value.displayName == null) return null;\r\n if (value.email == null) return renderName();\r\n\r\n return (\r\n \r\n {renderName()}\r\n \r\n );\r\n};\r\nValueUser.displayName = \"AttributeSummaryValue.User\";\r\nexport default ValueUser;\r\n","import React from \"react\";\r\nimport styles from \"./SummaryAttribute.module.css\";\r\nimport ProgressBar from \"react-bootstrap/lib/ProgressBar\";\r\n\r\nimport { type SummaryAttributeValueProgress } from \"data/types\";\r\n\r\nconst ValueProgress = ({ value }: { value: SummaryAttributeValueProgress }) => {\r\n if (value.progress) {\r\n return (\r\n \r\n \r\n {value.progress.map((p, index) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n};\r\nValueProgress.displayName = \"AttributeSummaryValue.Progress\";\r\nexport default ValueProgress;\r\n","import React, { useMemo } from \"react\";\r\nimport Img from \"react-image\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\n\r\nexport const ValueVisualRules = ({\r\n className,\r\n caption,\r\n value,\r\n}: {\r\n className: string,\r\n caption: string,\r\n value: SummaryAttributeValueVisualRules,\r\n}) => {\r\n const [style, icon] = useMemo(() => {\r\n const style = value.color ? { color: value.color } : undefined;\r\n const icon = value.icon ? (\r\n }\r\n src={value.icon.iconUrl}\r\n alt={caption}\r\n />\r\n ) : null;\r\n return [style, icon];\r\n }, [value, caption]);\r\n return (\r\n \r\n {icon != null && icon} {value.value}\r\n \r\n );\r\n};\r\nValueVisualRules.displayName = \"SummaryAttribute.Value.VisualRules\";\r\n\r\nexport default ValueVisualRules;\r\n","import React, { useCallback } from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { getLocalizedText } from \"data/utils\";\r\n\r\nexport const ValueEnum = ({\r\n className,\r\n caption,\r\n value,\r\n}: {\r\n className: string,\r\n caption: string,\r\n value: SummaryAttributeValueEnum,\r\n}) => {\r\n const renderEnumValue = useCallback(\r\n (enumValue: EnumValue) =>\r\n enumValue ? (\r\n \r\n {enumValue.icon && }{\" \"}\r\n {getLocalizedText(enumValue.label)}\r\n \r\n ) : null,\r\n [caption]\r\n );\r\n return (\r\n \r\n {value.isMulti\r\n ? value.enum\r\n .filter((e) => (value.value & e.value) > 0)\r\n .map((e) => renderEnumValue(e))\r\n : renderEnumValue(\r\n value.enum.find((e) => e.value === value.value)\r\n )}\r\n \r\n );\r\n};\r\nValueEnum.displayName = \"SummaryAttribute.Value.Enum\";\r\n\r\nexport default ValueEnum;\r\n","import React from \"react\";\r\nimport { LinkViewer } from \"components/ExtraAttributes/ViewerControl/LinkViewerControl\";\r\nimport { type SummaryAttributeValueTextLink } from \"data/types\";\r\nimport styles from \"./SummaryAttribute.module.css\";\r\n\r\n/* istanbul ignore next */\r\nconst handleClick = (e: SyntheticEvent) => {\r\n e.stopPropagation();\r\n};\r\n\r\nexport const ValueTextLink = ({\r\n className,\r\n value,\r\n}: {\r\n className: string,\r\n value: SummaryAttributeValueTextLink,\r\n}) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\nValueTextLink.displayName = \"SummaryAttribute.Value.TextLink\";\r\n\r\nexport default ValueTextLink;\r\n","import React from \"react\";\r\nimport { type SummaryAttributeValueFilesize } from \"data/types\";\r\n\r\nexport const ValueFilesize = ({\r\n className,\r\n value,\r\n}: {\r\n className: string,\r\n value: SummaryAttributeValueFilesize,\r\n}) => {\r\n return {value.value};\r\n};\r\nValueFilesize.displayName = \"SummaryAttribute.Value.Filesize\";\r\n\r\nexport default ValueFilesize;\r\n","import React from \"react\";\r\nimport {\r\n type SummaryAttributeValue,\r\n SummaryAttributeValueType,\r\n} from \"data/types\";\r\nimport styles from \"./SummaryAttribute.module.css\";\r\n\r\nimport ValueFacePile from \"./ValueFacePile\";\r\nimport ValueUser from \"./ValueUser\";\r\nimport ValueProgress from \"./ValueProgress\";\r\nimport ValueVisualRules from \"./ValueVisualRules\";\r\nimport ValueEnum from \"./ValueEnum\";\r\nimport ValueTextLink from \"./ValueTextLink\";\r\nimport ValueFilesize from \"./ValueFilesize\";\r\nimport { SimpleAttributeValue } from \"../SimpleAttribute\";\r\n\r\nconst SummaryAttributeValueFactory = ({\r\n value,\r\n useDefaultStyle,\r\n}: {\r\n value: SummaryAttributeValue,\r\n useDefaultStyle: boolean,\r\n}) => {\r\n switch (value.$type) {\r\n case SummaryAttributeValueType.FacePile:\r\n return ;\r\n\r\n // case SummaryAttributeValueType.Group:\r\n // break;\r\n\r\n case SummaryAttributeValueType.VisualRules:\r\n return ;\r\n\r\n case SummaryAttributeValueType.Enum:\r\n return ;\r\n\r\n case SummaryAttributeValueType.TextLink:\r\n return ;\r\n\r\n case SummaryAttributeValueType.Filesize:\r\n return ;\r\n\r\n case SummaryAttributeValueType.User:\r\n return ;\r\n\r\n case SummaryAttributeValueType.Progress:\r\n return ;\r\n\r\n // for internal use - will never be passed from the Server\r\n case SummaryAttributeValueType.ReactElement:\r\n return value.element;\r\n\r\n default:\r\n return (\r\n \r\n );\r\n }\r\n};\r\nSummaryAttributeValueFactory.displayName = \"SummaryAttribute.ValueFactory\";\r\nexport default SummaryAttributeValueFactory;\r\n","// @flow\r\n//#region imports\r\nimport React, { PureComponent } from \"react\";\r\nimport TogglesHandler from \"containers/TogglesHandler\";\r\nimport \"./index.css\";\r\nimport { connect } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport MainLayout from \"components/MainLayout\";\r\nimport {\r\n RefreshMode,\r\n ServerEventItemType,\r\n ServerEventActionType,\r\n type TreeItemDTO,\r\n type ToggleDTO,\r\n} from \"data/types\";\r\nimport TreeFilter from \"components/TreeFilter\";\r\nimport FolderTreeContainer from \"containers/FolderTree\";\r\nimport loc from \"i18next\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport DocListContainer from \"containers/DocList\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport SplitPanes from \"containers/SplitPanes\";\r\nimport GlobalEventsHandler from \"containers/GlobalEventsHandler\";\r\nimport CloseButton from \"components/ModalCloseButton\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport { LocalStoreHandler } from \"containers/LocalStore\";\r\nimport Pane from \"components/SplitPanes/Pane\";\r\n//#endregion\r\n\r\nexport const viewName = \"minipicker\";\r\n\r\n//#region flow types\r\ntype Props = {\r\n /** whether shown as Modal */\r\n asModal?: boolean,\r\n /** callback when closing Modal dialog */\r\n onClose?: () => void,\r\n\r\n // from TogglesHandler\r\n /** TogglesHandler: current toggles */\r\n toggles: ?ToggleDTO,\r\n\r\n /** DocList: callback on Document single click\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onDocSingleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** DocList: callback on Document double click\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onDocDoubleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n\r\n /** FolderTree callback on Folder single click */\r\n onFolderSingleClick: (itemUri: string, treeNodeId: number) => void,\r\n\r\n /** optional breadcrumbPart click event instead of history.push */\r\n onBreadcrumbPartClick?: (itemUri: string) => void,\r\n\r\n // from redux\r\n /** folders fetch status */\r\n treeStatus: ConstantsEnum,\r\n /** folders data rows */\r\n tree: Array,\r\n /** is folder root */\r\n treeIsRoot: boolean,\r\n /** is folder browsable */\r\n treeIsBrowsable: boolean,\r\n /** total number of results available */\r\n treeTotalCount: number,\r\n /** current itemUri */\r\n itemUri: string,\r\n /** whether running in Mini view mode */\r\n isMini: boolean,\r\n /** whether to limit breadcrumb scope */\r\n breadcrumbScopeFromLevel?: number,\r\n /** TogglesHandler: whether multiple toggles are allowed */\r\n isMultiple: boolean,\r\n /** TogglesHandler: currently selected toggles' names */\r\n selectedToggles: Array,\r\n};\r\n\r\ntype State = {\r\n /** the real itemUri currently selected */\r\n activeItemUri: ?string,\r\n activeDocIndex: number,\r\n treeNodeId: number,\r\n /** current tree name filter */\r\n treeFilter: string,\r\n includeSubfolders: boolean,\r\n isTreeFocused: boolean,\r\n};\r\n//#endregion\r\n\r\nexport class Picker extends PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n activeItemUri: props.itemUri,\r\n activeDocIndex: -1,\r\n treeNodeId: null,\r\n treeFilter: \"\",\r\n includeSubfolders: false,\r\n isTreeFocused: false,\r\n };\r\n }\r\n\r\n //#region React\r\n componentDidUpdate(prevProps: Props) {\r\n if (prevProps.itemUri !== this.props.itemUri) {\r\n this.setState((state) => ({\r\n treeFilter: \"\",\r\n activeItemUri: this.props.itemUri,\r\n isTreeFocused: false,\r\n }));\r\n }\r\n }\r\n //#endregion\r\n\r\n _onBreadcrumbPartClick = (itemUri: string): void => {\r\n this.setState({\r\n treeFilter: \"\",\r\n activeItemUri: itemUri,\r\n treeNodeId: null,\r\n isTreeFocused: false,\r\n });\r\n /* istanbul ignore else */\r\n if (typeof this.props.onBreadcrumbPartClick === \"function\")\r\n this.props.onBreadcrumbPartClick(itemUri);\r\n };\r\n\r\n //#region Tree\r\n\r\n _onTreeClick = (itemUri: string, treeNodeId: number): void => {\r\n this.setState({\r\n activeItemUri: itemUri,\r\n treeNodeId,\r\n activeDocIndex: -1,\r\n isTreeFocused: true,\r\n });\r\n /* istanbul ignore else */\r\n if (typeof this.props.onFolderSingleClick === \"function\")\r\n this.props.onFolderSingleClick(itemUri, treeNodeId);\r\n };\r\n\r\n _onTreeExpand = (itemUri: string): void => {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onBreadcrumbPartClick === \"function\") {\r\n this.setState({\r\n treeNodeId: null,\r\n activeDocIndex: -1,\r\n isTreeFocused: true,\r\n });\r\n this.props.onBreadcrumbPartClick(itemUri);\r\n }\r\n };\r\n\r\n _onTreeFilterChange = (value: ?string, includeSubfolders: boolean): void =>\r\n this.setState({\r\n treeFilter: value || \"\",\r\n includeSubfolders,\r\n isTreeFocused: true,\r\n });\r\n\r\n //#endregion\r\n\r\n _showDoc = (itemUri: string, newWindow: boolean) =>\r\n CommandActionHandler(\"doc_preview\", {\r\n itemUri,\r\n newWindow,\r\n });\r\n\r\n _onIconClick = (\r\n e: SyntheticMouseEvent<*>,\r\n itemUri: string,\r\n rowIndex: number\r\n ) => {\r\n e.preventDefault();\r\n this.setState({\r\n activeDocIndex: rowIndex,\r\n isTreeFocused: false,\r\n });\r\n const doNewWindow = e.ctrlKey || e.altKey;\r\n this._showDoc(itemUri, doNewWindow);\r\n };\r\n\r\n _onDocSingleClick = (\r\n e: SyntheticMouseEvent<*>,\r\n itemUri: string,\r\n rowIndex: number\r\n ) => {\r\n this.setState({\r\n activeDocIndex: rowIndex,\r\n isTreeFocused: false,\r\n });\r\n /* istanbul ignore else */\r\n if (typeof this.props.onDocSingleClick === \"function\")\r\n this.props.onDocSingleClick(e, itemUri, rowIndex);\r\n };\r\n\r\n render() {\r\n const { activeItemUri, includeSubfolders } = this.state;\r\n const treeAvailable =\r\n this.props.treeIsBrowsable === true &&\r\n (this.props.treeTotalCount > 0 || this.state.treeFilter.length > 0);\r\n return (\r\n }\r\n breadcrumbScopeFromLevel={this.props.breadcrumbScopeFromLevel}\r\n >\r\n \r\n {treeAvailable ? (\r\n \r\n ) : (\r\n
\r\n )}\r\n \r\n \r\n \r\n {activeItemUri && (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n//#region redux\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n treeStatus: s.treeStatusSelector(state),\r\n tree: s.treeNodesSelector(state),\r\n treeIsRoot: s.treeIsRootSelector(state),\r\n treeIsBrowsable: s.treeIsBrowsableSelector(state),\r\n treeTotalCount: s.treeTotalCountSelector(state),\r\n isMini: true,\r\n ...ownProps,\r\n});\r\n//#endregion\r\n\r\nconst PickerContainer = compose(\r\n LocalStoreHandler({ name: viewName }),\r\n connect(mapStateToProps),\r\n TogglesHandler({ viewName }),\r\n GlobalEventsHandler({\r\n items: [ServerEventItemType.folder],\r\n actions: [ServerEventActionType.delete],\r\n refreshMode: RefreshMode.Originator,\r\n refreshMessage: loc.t(\"globalEvents:folder.delete\"),\r\n refreshRoute: true,\r\n }),\r\n SplitPanes({\r\n viewName,\r\n paneIds: [\"#picker_treePanel\", \"#picker_docListPanel\"],\r\n toggleIds: [\"tree\", \"doclist\"],\r\n direction: \"horizontal\",\r\n })\r\n)(Picker);\r\n\r\nexport default PickerContainer;\r\n","// @flow\r\nimport React, { useState, useCallback, useEffect } from \"react\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport styles from \"./PickerModal.module.css\";\r\nimport MiniPicker from \"views/minipicker\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport SplitButton from \"react-bootstrap/lib/SplitButton\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport loc from \"i18next\";\r\nimport HelpBlock from \"react-bootstrap/lib/HelpBlock\";\r\nimport { fetchBreadcrumb } from \"data/api\";\r\nimport { useAbortController } from \"hooks\";\r\n\r\nexport const PickerType = {\r\n Folder: 0,\r\n File: 1,\r\n Any: 2,\r\n};\r\ntype PickerTypeEnum = $Values;\r\n\r\ntype PickerActionDTO = {\r\n label: string,\r\n eventKey: string,\r\n};\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** current folder's itemUri */\r\n itemUri: string,\r\n /** type of picker\r\n * @default {PickerTypeEnum} PickerType.File\r\n */\r\n pickerType: PickerTypeEnum,\r\n /** optional help text to display the user */\r\n helpText?: string,\r\n /** optional breadcrumb scoping */\r\n scopeBreadcrumb?: boolean,\r\n /** optional selectButton string */\r\n selectButton?: string,\r\n /** callback for additional actions */\r\n onSelect: (eventKey) => void,\r\n /** additional actions */\r\n additionalActions?: Array,\r\n};\r\n\r\n/** allows user to pick a Folder or Document */\r\nexport const PickerModal = ({\r\n open,\r\n close,\r\n itemUri,\r\n pickerType,\r\n helpText,\r\n scopeBreadcrumb,\r\n onSelect,\r\n additionalActions,\r\n selectButton = loc.t(\"minipicker:selectButton\"),\r\n}: Props) => {\r\n // remember the currently shown folder itemUri\r\n const [currentRootItemUri, setCurrentRootItemUri] = useState(itemUri);\r\n // remember the currently selected itemUri (folder/doc)\r\n const [currentItemUri, setCurrentItemUri] = useState(null);\r\n const [currentRootItemUriLevels, setCurrentItemUriLevels] = useState(-1);\r\n\r\n const selectFolder = useCallback(\r\n (itemUri, treeNodeId) =>\r\n pickerType !== PickerType.File && setCurrentItemUri(itemUri),\r\n [pickerType]\r\n );\r\n const selectDoc = useCallback(\r\n (e, itemUri, index) =>\r\n pickerType !== PickerType.Folder && setCurrentItemUri(itemUri),\r\n [pickerType]\r\n );\r\n const setRootItemUri = useCallback(\r\n (itemUri: string) => {\r\n setCurrentRootItemUri(itemUri);\r\n if (pickerType !== PickerType.File) {\r\n selectFolder(itemUri);\r\n } else {\r\n setCurrentItemUri(null);\r\n }\r\n },\r\n [pickerType, selectFolder]\r\n );\r\n const abortController = useAbortController();\r\n useEffect(() => {\r\n async function fetchData() {\r\n if (scopeBreadcrumb) {\r\n const bc = await fetchBreadcrumb(\r\n itemUri,\r\n abortController(true).signal\r\n );\r\n setCurrentItemUriLevels(bc.parts.length - 1);\r\n }\r\n }\r\n fetchData();\r\n }, [scopeBreadcrumb, itemUri, abortController]);\r\n\r\n return (\r\n close(false)}\r\n dialogClassName={styles.picker}\r\n headerSize={0}\r\n footerSize={0}\r\n >\r\n \r\n close(false)}\r\n onDocSingleClick={selectDoc}\r\n onDocDoubleClick={(e, itemUri) =>\r\n pickerType !== PickerType.Folder && close(itemUri)\r\n }\r\n onFolderSingleClick={selectFolder}\r\n onBreadcrumbPartClick={setRootItemUri}\r\n breadcrumbScopeFromLevel={currentRootItemUriLevels}\r\n />\r\n \r\n \r\n {helpText && (\r\n {helpText}\r\n )}\r\n {additionalActions == null || additionalActions.length === 0 ? (\r\n close(currentItemUri)}\r\n bsStyle=\"primary\"\r\n style={{ padding: \"6px 30px\" }}\r\n >\r\n {selectButton}\r\n \r\n ) : (\r\n {\r\n e.stopPropagation(); // HACK: prevent closing of Menu within Modal.Footer\r\n }}\r\n onClick={(e) => {\r\n close(currentItemUri);\r\n }}\r\n bsStyle=\"primary\"\r\n title={selectButton}\r\n style={{ padding: \"6px 30px\" }}\r\n pullRight\r\n >\r\n {additionalActions.map((action, i) => (\r\n {\r\n onSelect(action.eventKey);\r\n close(currentItemUri);\r\n }}\r\n >\r\n {action.label}\r\n \r\n ))}\r\n \r\n )}\r\n {/* */}\r\n \r\n \r\n );\r\n};\r\nPickerModal.displayName = \"PickerModal\";\r\nPickerModal.defaultProps = {\r\n pickerType: PickerType.File,\r\n};\r\nexport const openPickerModal = createModal(PickerModal);\r\n","var map = {\n\t\"./algoliaProvider.js\": [\n\t\t1751,\n\t\t81\n\t],\n\t\"./bingProvider.js\": [\n\t\t1759,\n\t\t82\n\t],\n\t\"./esriProvider.js\": [\n\t\t1752,\n\t\t83\n\t],\n\t\"./geoApiFrProvider.js\": [\n\t\t1753,\n\t\t84\n\t],\n\t\"./geocodeEarthProvider.js\": [\n\t\t1754,\n\t\t79\n\t],\n\t\"./googleProvider.js\": [\n\t\t1755,\n\t\t85\n\t],\n\t\"./hereProvider.js\": [\n\t\t1771,\n\t\t86\n\t],\n\t\"./index.js\": [\n\t\t1772,\n\t\t76\n\t],\n\t\"./locationIQProvider.js\": [\n\t\t1756,\n\t\t80\n\t],\n\t\"./mapBoxProvider.js\": [\n\t\t1758,\n\t\t87\n\t],\n\t\"./openCageProvider.js\": [\n\t\t1757,\n\t\t88\n\t],\n\t\"./openStreetMapProvider.js\": [\n\t\t1750,\n\t\t89\n\t],\n\t\"./peliasProvider.js\": [\n\t\t1749,\n\t\t90\n\t],\n\t\"./provider.js\": [\n\t\t1748,\n\t\t91\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 1672;\nmodule.exports = webpackAsyncContext;","// extracted by mini-css-extract-plugin\nmodule.exports = {\"reminder\":\"ReminderItem_reminder__2qE4d\",\"date\":\"ReminderItem_date__kKrtv\",\"actions\":\"ReminderItem_actions__hX4vX\",\"avatar\":\"ReminderItem_avatar__SFNdD\",\"reason\":\"ReminderItem_reason__1Vn30\",\"icon\":\"ReminderItem_icon__1nG6x\",\"customAction\":\"ReminderItem_customAction__3j_0d\",\"readonly\":\"ReminderItem_readonly__2Dy5i\",\"error\":\"ReminderItem_error__3O7NC\"};","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH4QkLDxA7O0g7vwAAFPRJREFUeNrtnWlwHOWZx/99zYxmdEu2bGTLluULbIONMYdxgIIQAgvL1pLsEkK2SJHy7tayqWw2tQdJtnLVLpXUpipZtqh1UqQSSMGHQAiQZTGHOW0M2Pg+sWxJ1j2yNJp7+nj3Q09LPaMendPTPdPPr+pVj2ak6Wd6nv/zPu/ZAEEQBEEQhOfgSnmynTt3Wp2vkA0ltY2oGFih33ft2pX/mv1OZuH03AzHktlGVCTM4pjznFkItjlZnuObnXy6YmUTCYGYDSzvsVG0vGOOCIruXBaOby686Wj1eDohEMRMGCLQTEXNFvNzEyIQi3XmaRyfNxXBdBRMv5tLvhDyIWEQBlb5PsOk0yvZIpseAyYRLFgAs3B8w9HF/PJpQ0tzT01TR8QfXJMWxTaFFxarHN+ocVyIgZPAQXD6ChNlBcv+YAAYUzW2pb7q6avf3/0rAOns3ygwtQkWJACT8xdyfMPZpWzx7V2+bmN/TcNNMcl/gywIazWOb3L6qhEVCq9CFIR2AFXIbRMsrAaYo+P7APhfWH/tl8cCwXsygnjlfM9LEHOFV1UeugBU5LYH5icAC+fPd3wj2vsB+DsbWpZ+snTll0aqav7a6YtBeA9eU33QBZDJFhmmNuacBJDn/FaO78uWQELyV7/WceUD4aqar6g8v9jpC0F4E07TfAACAJLQ/dToaAEwBwFYOL/RuJ1IcwAEfnfF9X87WhX6OwbO7/SHJwiOaQJ0/zScf+4CKOD8IkyO31/TsOiN9o0/TEj+O5z+0ARhwDFm+KrR5Z7TzT6jAKZxfn+2BE8uWrZqf+vq/8wI4ianPzBB5MAsx5gmmG0KZBX5AwCCRxe3rfu4teO/ZF5od/qzEoQF5hkIUwZRpxVANvqbe3uMfCoAIHimaemqj1s7Hpd5YaXTn5IgrGHTvsoXeqFA6mN0bwaHQnUt+5av/Sk5P1EGFJw+w8/iHw0BmFOf0OurNn0/LUgbnP5kBLEQLAUwU/R/Yf22r8V8gducNp4g5siUmoCf4Y+ton9wOFRLo7pERTBFANNEfx+AqpQo1TFwPqcNJ4hiUKgGyI/+RvpTtWflxvucNpogikWOAGYY8a3qr25Y0l/TcL/TRhNEsbCqAayifwBA1UetHV9UeL7BaaMJolhMCGCG6B/43zVbvjhQXf+g0wYTRDHJrwHyR32N3D8QDtbe5bSxBFFsCqVAOenPkZYVV6RFaa3TxhJEseGBmac7d9c172CgBepE5WGuAfInvk0IIBIIXuO0oQRhB1ZtgJwaYChY25wSJJrqTFQkVjVAzjrfntqmVSrP1zptKEHYQaFeoAkBjAZCFP2JisUQgNX+PiIAMSH5W502kiDsolAbYCINSgtis9NGEoRdTNcLxAMQFF6g/J+oWKYbCBMACCrHhZw2kiDsolAjeKImYBwnOW0kQdjFTOsBptunnyDKnvxeIPNjcn6i4pnNmmCCqFis2gAE4RnceaMKxgCNLfx97ILjAN7mWKFp+nVwFZwpUeZyj2WKuwTAGKCokPw+XFYbgMDNtG9X6eEAXEpnMJpI6k8I9swSb6utRkgUocEdItAYwBhDXFGQ0TQkFRUJRQHUrFA1LXuBssGB58tCHO4RgKbBL4r4+ub1eGB1G9bUVbtWAOFUGnv6hvDjw6dxdHAEkIp/GZ++9Tp8ZkkzVBfUAhwAlQEMDDFZQVrVEFcUxGQFkYyM3ngSF+NJ9MQSOBuJ4UIsjp5YAol0RheIKOiCcCGFvrnS3quXMYQkEc/evh13ty11+prMSGuoCg+uWYE725bivt178XbPgP4lFxExm2IJLomiujkcGv0zbwklaxp6YkmciUSxf/gS/vvoWQzHk3ot4TIxuKMGUFV8Y+sVZeH8Zpr8Puy66Rpc9/vXMJaSi9ou0FwQ+eeLxPNYVRvCqtoQPr98Cf7m8lX4YHAEL1zow+6eAfSNx/TQKjrvfs5bwBiCAT++unal05bMi7V11bhtWQueO90F8M5fTjfSUhXAvStbce/KVlxKZ/ByVx9+eaoT7/YO67WCDSnkbHG+LlI1tNdWY0VN+U45Wl9X68IeG3fS6Pfhr9auxDt/eitevecW3NZ2GaCoenEA5wXA0YibV/ncsha8fs/NePaOG7G2sQ7IyCUPJM4LQBBwbHAE/7T/iNOWzIsjlyL4+dEzjlbj5c5fdizH6fvvBHvkATx12/WoLXKHwnQ4LwAAEAU8fuQMfnP2gtOWzInuWAIPv/UhoqlMWfR5lwMPrm7D7rtvAWSlJOdzR9jiOGQ0hof2fIQ3e4fw0Lp2bG6qh2T3aOs86Y0n8XJXP35+7Cy6xqJF7wL1OtctbsT6pnqcGhmzvWZ1hwAAgOfAGMOvj5/Dr09fQEuoCqJLo+qldAbJZFrvzybnt4WX7/oMbn/5bZy3OcC4RwCAnkZIIsCAwVjCaWtmtpOwjY7aajx/x4249cU9GE1lAMGebN0dbYB8OOjR1a3FpTVTpbG5qR6/uOVavYfQpt4hdwqAILLc196Kr29eZ1ujmARAuJ4fbduI9YsbbRksIwEQrqdaFPGT66+y5b3dLQDG3FmIknN321Lc0d5a9FTIfQJQVP1DMqY3Nt1YzDYSJePRLevBFbk3yD19eYwBqobtrYvxlbUrsLmpHqILF8SA0wfCXurqwzNnu5HIZGxbFWYXneMx7Hz3ADgAksBbzMPiIPEcRI6HxPMIigJCkoBGvw/bFjVifX0NVtVWl3z+1k1LFuHmZS14q7u/aFOp3SMAjeHfrt2E71x9OSQXLZiw4prmBty74jI8tG4l7n9tH3qjCdv6qe0gkpHxxvle5KzxnRaGiZWZAo+AT8KGhjrc3bYUX1i1DBsb60pm+87LO/BWV3/R3s95ATAGkeex9wu3Y9uiRqetmRM7Wppx8cF7cOsf38aerv6yGRXmJwbyZiuAXFKqhgPhURwIj+L7B44DsoJQwI/HbrgKj2xYbavtX+pYjtc3rsGTx84A0sI3LXQ+bGkaVtaGsKmEUaTYbG1umFwU7jU4DvBJiCsK/v6tj/Dvh07Zfso/WbG0aIORzguAASFRhJ8vj+hpRbDM2gC2wPOAIODb+w7hlZ4BW0+1fXET6oJVRdk6x3kB8Dy6YwkMJFNOWzJvLkTjTpvgDngOYAzf+uAwkjau8FoSDOjtjiLUui4QAIfReBLPnb/otCXzYjiVxht9Q2WT/9uOKOLE4CX8oavP1tMUK+10XgAAwHP44YHj+CQ85rQlc0IDwz/uO4zesairtvpwHA54+myXrafY3FRflHW07vjWeB5DsSTueuUdPHn6PCIZ2WmLZuRAeBR/vnsvnjrZSVOj8xF47BscQTiVse0Ua+qqs2MBC2sHuOebEwUMxJN4+M39+F7dCWxoqEWVC9MKDkBPPIlD4VHIGdkVe9u4Do7HpWQKx0cjuHnpIltOsSwURFASkZCVBdUE7vr2smlEz3gMPaPjTltTGI7TB77I+a3hAMgqTo1FbRNAU8CHep8PiYy8oC5Rd36DxsIToqzptLF3LCgKaK7yoS8aW9D7kJcR9sBxGLSxa1vgONT5pIU2AUgAhH1E0vY1ggF9ncBCZ+SSAAjbSKn2Tg/xF2EE3n1tAI0BqjP7RM4axvRGME2BmBbR5nacvoV8pXSDAoCioj4YwGeXtWDbokb4XTrF+Hw0jjcuDuJYeJR2iZiGRr+9t5iWNYaFjoa5RwCygjvaW/Gz7Vuwrr7GaWtmJKmoeOLEOfzLB4f1L8Klu9g5BmNYFgraeoqksvDlke4QgKJi22WL8NznbkTIhYNfVlSJAr555VpwHPDN9w4CKA+7SwbHYW1dta2niMrKgmtfd+QYPIfvbr2ibJzfzCMbVuPKxY3ub7eUEsbASaI+X8cm0qqGkVR6wfOBnBeApmF5bTVuWbrYaUvmhcTzuHnJIv1mcISOpmFNXQ3W19fadopxWcZwKgMscN24CwTAsLjKj5oynlDWHPA7bYK7UDXc1bbU1k6M3ngS4xm5AmoAnsNAIoXxTGn2g7eDwVT5LuYpOoxB8El4aO0KW09zbjwGVV7YPCDAFQLg0RuN4+2BIactmRcZTcO7/WEaEzCQFdzXsRxX2Zj/A8DB8FiFLIkEAMbwvY+P6636MuNnR8/i6PClstoWxTY0DTXBAH50zQbbT/Xh8KWijL+441sTBBzsD+PPXn0Px0cjTlszK+KKgscOncKj+4/QzFVgYmOzn964BWvq7B3HGUll9NWDFTUVQhLxZvcAbhh+EzcuaUZ7TQg+l0bV4WQaB8KjOD0yRiPBgO78soJ/vW4Tvrau3fbT7RsawUgsUZR12O4RAACIAqJpGf/XedHd+25y3MQ2IJ5HUQEO+MH2Lfju1ZeX5JR/uNCbXRBfaQIA9CkFdMd1W2FA1oEsdoZjeb8YvxsBiTFAErGpsQ5fXdeOhy9vR20RdmibLU+d7cIvj54FfMU5J3maB/HxPFqqg+DBQTDNYWLQt00UskXkOfh4HgFBQLUkosEv4bOtLdja3IAtzfUl38OVAXjixLmippwkAA+yrr4GJ/7i8/qt2LhcARjP8Zx+lDg+O+3YeXZfHMC+vuGi7sHkTgEwtuClbiWBQ1k2gAWOQ6Pf57QZc4IB+MHBk3rqVsTOEdcJgANQ45PAlYFjZVQNSZoEVxKeOtuFvT0DRd+DyV0C0BjqAj68c+cOLApI2QUP7qRKkvDkmQv4532Hi7JNN1GYoWQaj+4/ast4i7sEAL0GaKnyYXHA72oBSD4JddLCdyUgZuYb+w6hd2y8aD0/ZlwnAEBf6iZrmrsFoGlQ3TxWUSE8cbITz5zstMX5AbdMhSAIC/b0D+Mf3jto6zwrEgDhSg6PjOH+3XuRVhRb51qRAAhXcs8r72IonrR9ugkJgHAd7w6E0TMeK8lNR1zZCCa8R0SW8Z39R/H4kTP6fLAS7bxNAiAc58WuPnx7/xEcG7qkD3SVcBCUBEA4xvsDYfz48Gm82Nmjj6fY1NU5HSQAoqSkVQ2v9w5i18lzePlCHzRF1dMdh2a+kAAI25E1DYdGxvBSVx+eP9+L4+FRfUG7KDh+fzUSAGELMVnB+Wgcn4RH8dih0zg5Ng5k5MldtV2ymI4EQMyJtKohoahIKAoSiopxWcZoOoO+eApdsTi6YwmcjsTQFY3jYjwJLSNnV/nxjuT4M0EC8CCRjIw/dvcjqagYzWSQUjUkFRUpNVsUbfKxqiGtqkgqKpKqirG0jJQ6+XpSVvQ5+oxN7tNjbBTAc46nODPhbusIW+gcj+HLr74HsOyaYKtJfdzEj7zHpnXEHKc/X8abA5AAPAjPGQNNnGO9L26BpkIQnoYEQHgaEgDhaUgAhKchARCehgRAeBoSAOFpSACEpyEBEJ6GBEB4GhIA4WlIAISnIQEQnoYEQHgaEgDhaUgAhKchARCehgRAeBoSAOFpSACEpyEBEJ6GBEB4GhIA4WlIAISnIQEQnoYEQHgaEgDhaUgAhKchARCehgRAeBoSAOFpSACEpyEBEJ6GBEB4GhIA4Wlcd48wDkCdT4LkkyBpbMHvZxuihKBo383hamy8u2KtC29X6hTuEgDHIaGq+NZHxxEUeKhO2zMNEs/j0EjEtjsk/sehU2gNVtny3sPJdPYOj4TLBACkVA3/c+xT61t3ug2eB2yqBZ49ed6+a8C5//69pcKdV4G+HLoG9jAlolAjmPA0JADC05AACC9QsDFFAiAqGo6xaTsTSQBERcNpWgZ6DWCUHEgAREUjKHIcuc6fIwISAFHR+NKpUeTWADk1AQmAqGRYIB4NA9CyxRz9GUACICoYUVOjwfHRMAAVuSKgGoCofPyqEg5GIxHkCkAz/w0JgKhYajKp8wAU6AIwRJDTDiABEBVLSzxyAoCMSRFQCkR4A0HTEh1jQyehC8AQwZR2AAmAqEhq08kzzYloGEAGuWkQ1QBE5bN8PLwPQBq6AAwRUCOYqHw6Rgdfuv7i2fcBpKCLwJwCUSOYqFwkVY1e3df5NoBkthgCoBSIqHxWRIb3NKTiQwASKFwDTEACICqGKjkztL3nzOvQnT+BqTXARAq0a9cuSoGIyuKqwa7nA0pmDEAcuvOnkNsAnjIlmgRAVAxXDnZ9At3586M/CYCobEJyuhu685sFkN/9yQDASH8AEgBRAYiaGtvRfeoXmBRAfvSf0vtjQAIgyhqeMXlb37lfrRgbPofJ6G/k/kbjd8L5zdEfIAEQZQzHmLp54MJvNw12HwQQRW7jt2DPjxnafowoS3jG5C0D55/Z2tf5PoBxADFMCsAy+ltRSACWC4gJwg1Imhrf1vvp0xuHeg4AGAMQwWQNYKQ/OavArKI/QDUAUWZUZ1IXd3Sf+m1bJPwpdMePYLIGMPf8GAKYFhIA4XpCcnr4qoGu1zYOdR+F7ugx6E5vOH8UuY3fnH7/QtEfmCqA/FXzlAIRjuFXlejKsaEPr7346XtVkyO8MegObz5O2+8/HVY1gHm66KzehCCKzbqRvjc3D1z4oC6VCGOye9No6JqLecpDfs8Ppov+wKQA8qO94fwqA0cCIEqCpKnJ+lT8QlskfHhrX+dH0J3e7OzG78ZUZ8Px8/P+WTk/YJ0CaZicO61omuaH6uabFRFlCvOpSjygyJH6dKKvJR7pXDE+cq4xGQtjcjan4fDm2Z0pTHX8Ket9Z+P8QK4AzGmPCr06Se+QtN+rotLKa5qf0zQfx5gIMB4MHPR72sF0JAiDHAfkGNN4TZUFRU74UsmoPxEbC8Sjo4FEbBxZX8sWI7qbnT7f8Y0pDuaoP6fIb1CoBlCyJ0quPrzveQB1AKoBBAH4s//HAzkiIIh8zONJ+QFWhe5nMiajeRq6kyfzjsbaXmOHB/M+PzmzPOfi/MDUNoBhnIJJNQrZ1zLQFenLPmcIgCCmw3BIw1GtBJAvAnMpFPGN95o4x1ydH7BOgSbSH+hOzrInTkF3fiP6G/OISAREIWaqAcwiMNcGMnL381FM/zdll+f5OL5BfgqkQXdoowYwBJGBXhuIoOhPzJ18ARjFLALjqOQ9Z/77ojm+wYQT79y508jnjeguWhTjNavcnwRBANbjRvk1gWZR1AKPLff1L4bzA4UbwUButSNjeucniJnIv0uL2bk1i+dsdXyDHEfO1gLG8+YagcsrBDEfmMUx38ktb2dUbMc3+H/+1xbPi7WQewAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNy0wOS0xMVQxNToxNjo1OSswMjowMNPs2F4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDktMTFUMTU6MTY6NTkrMDI6MDCisWDiAAAAV3pUWHRSYXcgcHJvZmlsZSB0eXBlIGlwdGMAAHic4/IMCHFWKCjKT8vMSeVSAAMjCy5jCxMjE0uTFAMTIESANMNkAyOzVCDL2NTIxMzEHMQHy4BIoEouAOoXEXTyQjWVAAAAAElFTkSuQmCC\"","import React from \"react\";\r\nimport { toast } from \"react-toastify\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport styles from \"./toast.module.css\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport { withRouter } from \"react-router\";\r\nimport loc from \"i18next\";\r\nimport {\r\n settingValue,\r\n isOnline,\r\n dispatch,\r\n getNotification,\r\n} from \"data/storeHelper\";\r\nimport {\r\n NotificationType,\r\n ToastProps,\r\n ToastType,\r\n NotificationStyle,\r\n NotificationStatusFlag,\r\n} from \"data/types\";\r\nimport { notificationToastAction } from \"data/actions\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport globalloc from \"data/i18n.global\";\r\n\r\nexport const toastPosition = toast.POSITION;\r\n\r\nexport const toastId = {\r\n PdfJs: \"pdfjs\",\r\n NetworkStatus: \"network-status\",\r\n NoNetwork: \"offline\",\r\n OfflineChanges: \"offline-changes\",\r\n ServiceWorker: \"sw\",\r\n ServiceWorkerOfflineQueue: \"swoq\",\r\n UppyInfo: \"uppy-info\",\r\n UppyRecovered: \"uppy-recovered\",\r\n UppySuccess: \"uppy-success\",\r\n};\r\n\r\nexport const toastTypes: Object = {\r\n refresh: {\r\n icon: \"refresh\",\r\n style: NotificationStyle.Info,\r\n autoClose: false,\r\n details: /* istanbul ignore next */ ({ handleClick }) => (\r\n \r\n {loc.t(\"globalEvents:refresh.button\")}\r\n \r\n ),\r\n toastId: \"refresh\",\r\n },\r\n success: {\r\n icon: \"check\",\r\n style: NotificationStyle.Success,\r\n },\r\n partial: {\r\n icon: \"exclamation-circle\",\r\n style: NotificationStyle.Warning,\r\n },\r\n failure: {\r\n icon: \"warning\",\r\n style: NotificationStyle.Error,\r\n },\r\n uppyComplete: {\r\n message: \"$upload:complete\",\r\n icon: \"check\",\r\n style: NotificationStyle.Success,\r\n toastId: toastId.UppySuccess,\r\n },\r\n uppyError: {\r\n icon: \"warning\",\r\n style: NotificationStyle.Error,\r\n toastId: toastId.UppyInfo,\r\n },\r\n uppyRecovered: {\r\n icon: \"upload\",\r\n style: NotificationStyle.Info,\r\n toastId: toastId.UppyRecovered,\r\n isRouted: true,\r\n },\r\n uppyInfo: {\r\n icon: \"upload\",\r\n style: NotificationStyle.Info,\r\n toastId: toastId.UppyInfo,\r\n },\r\n uppyResuming: {\r\n message: \"$upload:resuming\",\r\n icon: \"upload\",\r\n style: NotificationStyle.Info,\r\n },\r\n pdfSignature: {\r\n icon: \"warning\",\r\n toastId: toastId.PdfJs,\r\n style: NotificationStyle.Warning,\r\n autoClose: false,\r\n position: toast.POSITION.TOP_CENTER,\r\n },\r\n swReady: {\r\n message: globalloc.cache.done,\r\n toastId: toastId.ServiceWorker,\r\n icon: \"cloud-download\",\r\n style: NotificationStyle.Info,\r\n },\r\n swFailed: {\r\n message: globalloc.cache.failed,\r\n toastId: toastId.ServiceWorker,\r\n icon: \"warning\",\r\n style: NotificationStyle.Error,\r\n },\r\n swReload: {\r\n message: globalloc.cache.reload,\r\n toastId: toastId.ServiceWorker,\r\n icon: \"cloud-download\",\r\n style: NotificationStyle.Info,\r\n },\r\n swOfflineQueueAdd: {\r\n toastId: toastId.ServiceWorkerOfflineQueue,\r\n icon: \"cloud-download\",\r\n style: NotificationStyle.Info,\r\n autoClose: true,\r\n message: \"$common:offline.add\",\r\n },\r\n swOfflineQueueAddFile: {\r\n toastId: toastId.ServiceWorkerOfflineQueue,\r\n icon: \"cloud-download\",\r\n style: NotificationStyle.Info,\r\n autoClose: true,\r\n message: \"$common:offline.addFile\",\r\n },\r\n offlinePendingChanges: {\r\n message: \"$common:offline.pending\",\r\n icon: \"hourglass-2\",\r\n style: NotificationStyle.Info,\r\n toastId: toastId.OfflineChanges,\r\n },\r\n};\r\n\r\nexport const Toast = ({\r\n message,\r\n icon,\r\n details,\r\n handleClick,\r\n style,\r\n ...rest\r\n}: ToastProps) => (\r\n
\r\n {icon && }\r\n {message}\r\n {typeof details === \"function\" && (\r\n
{details({ handleClick })}
\r\n )}\r\n
\r\n);\r\n\r\nexport const RoutedToast = withRouter(Toast);\r\n\r\n/**\r\n * will toast a message depending on @see {ToastType}\r\n *\r\n * @param {ToastType} toastType\r\n */\r\nexport const toastStyled = ({\r\n message,\r\n style,\r\n icon,\r\n status = NotificationStatusFlag.New,\r\n ...toast\r\n}: ToastType): Notification | string => {\r\n dispatch(\r\n notificationToastAction({\r\n notificationId: toast?.toastId,\r\n icon,\r\n message: getLocalizedText(message),\r\n timestamp: Date.now(),\r\n style,\r\n status,\r\n toast,\r\n })\r\n );\r\n};\r\n\r\nexport const dismissToast = (toastId: ToastId) => {\r\n const { toast: notification } = getNotification(toastId);\r\n settingValue(\"notificationType\") === NotificationType.API\r\n ? notification?.close()\r\n : toast.dismiss(toastId);\r\n};\r\n\r\n/**\r\n * will toast a success/failure message depending on @see {success}\r\n *\r\n * @param {boolean} success\r\n * @param {string} locPrefix localization name prefix (will append .success or .failure accordingly)\r\n * @param {any} locParams localization parameters\r\n */\r\nexport const toastActionResult = (\r\n success: boolean,\r\n locPrefix: string,\r\n locParams?: any,\r\n toastId?: string\r\n): void => {\r\n //#56010 in case of success+!isOnline there should be no toast\r\n if (success && !isOnline()) return;\r\n const message = success\r\n ? loc.t(locPrefix + \".success\", locParams)\r\n : loc.t(locPrefix + \".failure\", locParams);\r\n const type = toastTypes[success ? \"success\" : \"failure\"];\r\n toastStyled({ ...type, message, toastId });\r\n};\r\n","import { JL } from \"data/logging\";\r\n\r\n/* istanbul ignore next */ const _log = JL(\"serviceWorkerRegistration\");\r\n\r\n/* istanbul ignore next */\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === \"localhost\" ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === \"[::1]\" ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport /* istanbul ignore next */ function register(config, now) {\r\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\r\n // Basename should be here instead of \".\" otherwise the serviceWorker scope is wrong so /mini/ wont work!\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n window.CONFIG.host.basename || \"/\" /*process.env.PUBLIC_URL*/,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n const install = () => {\r\n // Basename should be here instead of \".\" otherwise the serviceWorker scope is wrong so /mini/ wont work!\r\n const swUrl = `${\r\n window.CONFIG.host.basename || \"\" /*process.env.PUBLIC_URL*/\r\n }/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n _log.info(() => \"Service-Worker is ready!\");\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n };\r\n\r\n if (now === true) install();\r\n else window.addEventListener(\"load\", install);\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then((registration) => {\r\n _log.trace(\"after register\", registration);\r\n const activeWorker = registration.active;\r\n if (activeWorker != null) {\r\n if (activeWorker.state === \"activated\") {\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n } else {\r\n activeWorker.onstatechange = () => {\r\n _log.trace(() => ({\r\n msg: \"activeWorker.state\",\r\n state: activeWorker.state,\r\n }));\r\n if (activeWorker.state === \"activated\") {\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n };\r\n }\r\n }\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n _log.trace(() => ({\r\n msg: \"installingWorker.state\",\r\n state: installingWorker.state,\r\n }));\r\n if (installingWorker.state === \"installed\") {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n _log.info(\r\n () =>\r\n \"New content is available and will be used when all \" +\r\n \"tabs for this page are closed.\"\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n _log.info(\r\n () => \"Content is cached for offline use.\"\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch((error) => {\r\n _log.fatalException(\r\n \"Error during service worker registration\",\r\n error\r\n );\r\n if (config && config.onFailure) {\r\n config.onFailure(error);\r\n }\r\n });\r\n}\r\n\r\n/* istanbul ignore next */\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { \"Service-Worker\": \"script\" },\r\n })\r\n .then((response) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get(\"content-type\");\r\n if (\r\n response.status === 404 ||\r\n (contentType != null &&\r\n contentType.indexOf(\"javascript\") === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n _log.info(\r\n () =>\r\n \"No internet connection found. App is running in offline mode.\"\r\n );\r\n });\r\n}\r\n\r\nexport /* istanbul ignore next */ function unregister() {\r\n if (\"serviceWorker\" in navigator) {\r\n navigator.serviceWorker.ready\r\n .then((registration) => {\r\n registration.unregister();\r\n })\r\n .catch((error) => {\r\n _log.fatalException(\r\n \"While un-registering serviceWorker\",\r\n error\r\n );\r\n });\r\n }\r\n}\r\n","import \"core-js/stable\";\r\nimport \"data/extensions\"; // Extension methods for vanilla js objects\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport Loader from \"components/Loader\";\r\nimport bowser from \"data/bowser\";\r\nimport \"font-awesome-animation/css/font-awesome-animation.css\";\r\nimport \"@hs/clearable-input/build/ClearableInput.css\";\r\nimport \"@hs/search-input/build/SearchInput.css\";\r\nimport \"./index.css\";\r\nimport \"bootstrap-no-fonts-no-js/css/bootstrap.css\";\r\nimport \"bootstrap-no-fonts-no-js/css/bootstrap-theme.css\";\r\nimport store, { sagaMiddleware } from \"data/store\";\r\nimport { Provider } from \"react-redux\";\r\nimport {\r\n serviceWorkerInitializedAction,\r\n serviceWorkerUpdatedAction,\r\n} from \"data/actions\";\r\nimport * as serviceWorkerRegistration from \"data/offline/serviceWorkerRegistration\";\r\nimport { isFeatureOn, Feature } from \"data/constants\";\r\nimport rootSaga from \"data/sagas/rootSaga\";\r\n\r\n// run the rootSaga which forks all the others\r\nsagaMiddleware.run(rootSaga);\r\n\r\n// import reportWebVitals from \"./reportWebVitals\";\r\n\r\n/* istanbul ignore next */\r\nconst Root = Loader({\r\n loader: () => import(\"containers/Root\" /* webpackChunkName: \"Root\" */),\r\n});\r\n\r\nexport function browserCheck() {\r\n // Browser detection\r\n //console.log(`Browser ${bowser.getBrowserName()} v${bowser.getBrowserVersion()}`, bowser);\r\n // Browser/OS mappings: https://github.com/lancedikson/bowser/blob/master/src/constants.js\r\n /* istanbul ignore next */\r\n if (\r\n !bowser.satisfies({\r\n chrome: \">41\",\r\n edge: \">90\",\r\n firefox: \">89\",\r\n safari: \">13\",\r\n opera: \">76\",\r\n android: \">7\",\r\n iOS: \">13\",\r\n samsung_internet: \">13\",\r\n blackberry: \">10\",\r\n electron: \">10\",\r\n })\r\n ) {\r\n window.alert(\r\n \"Sorry, your Browser or Version is unsupported - see Browser Requirements\"\r\n );\r\n window.location.assign(\r\n \"https://serviceportal.hs.ag/docs/inPoint.Web/docs/admin-gettingstarted.html#client\"\r\n );\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/* istanbul ignore next */\r\nif (browserCheck()) {\r\n if (isFeatureOn(Feature.offline)) {\r\n serviceWorkerRegistration.register({\r\n onSuccess: (registration) => {\r\n store.dispatch(\r\n serviceWorkerInitializedAction({ registration })\r\n );\r\n },\r\n onUpdate: (registration) => {\r\n store.dispatch(serviceWorkerUpdatedAction({ registration }));\r\n },\r\n onFailure: (error) => {\r\n store.dispatch(serviceWorkerInitializedAction({ error }));\r\n },\r\n });\r\n } else {\r\n serviceWorkerRegistration.unregister();\r\n }\r\n\r\n // If you want to start measuring performance in your app, pass a function\r\n // to log results (for example: reportWebVitals(console.log))\r\n // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\n // reportWebVitals(console.log);\r\n if (process.env.JEST_WORKER_ID === undefined) {\r\n ReactDOM.render(\r\n // \r\n \r\n \r\n ,\r\n // ,\r\n document.getElementById(\"root\")\r\n );\r\n }\r\n}\r\n","import store from \"data/store\";\r\nimport {\r\n getDefaultsConfig,\r\n isMiniView,\r\n isFeatureOn,\r\n type FeatureEnum,\r\n} from \"data/constants\";\r\nimport { isValidItemUri, asyncEvery } from \"data/utils\";\r\nimport bowser from \"data/bowser\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport {\r\n ItemStatuses,\r\n UploadProvider,\r\n SpecialFoldersItemURIs,\r\n SiteType,\r\n type ItemActionConfigBase,\r\n} from \"data/types\";\r\nimport { get } from \"data/constants\";\r\nimport API from \"data/ApiManager\";\r\n\r\n/**\r\n * Apply any selection context (itemUri, formatId and isDoc) to existing callback (check_*) function\r\n *\r\n * @param {Function} cb check_* function to apply any selection context to\r\n */\r\nexport const applyAnySelectionContext =\r\n (cb: Function): Function =>\r\n (args: any): boolean => {\r\n const { contextProps } = args;\r\n return check_isMultiSelection(args)\r\n ? contextProps?.items.every((item) =>\r\n cb({\r\n ...args,\r\n ...item,\r\n contextProps: { ...args.contextProps, ...item },\r\n })\r\n )\r\n : cb(args);\r\n };\r\n\r\nexport const check_isFavorite = ({ itemUri }: { itemUri: string }) =>\r\n s.favoritesFavoritesSelector(store.getState()).includes(itemUri);\r\n\r\nexport const check_isDoc = ({ contextProps: { isDoc = false } }) =>\r\n isDoc === true;\r\n\r\nexport const check_isSpecialFolder = ({ itemUri }) =>\r\n Object.values(SpecialFoldersItemURIs).includes(itemUri);\r\n\r\nexport const check_isAdmin = () => s.userIsAdminSelector(store.getState());\r\n\r\nexport const check_isValidItemUri = ({ itemUri }) => isValidItemUri(itemUri);\r\n\r\nexport const check_isSyncEnabled = ({\r\n itemUri,\r\n formatId,\r\n}: {\r\n itemUri?: string,\r\n formatId?: number,\r\n}) => {\r\n const def = getDefaultsConfig(itemUri, formatId);\r\n if (def && def.inPointSyncIntegration === false) return false;\r\n return true;\r\n};\r\n\r\nexport const check_isOnline = () => s.isOnlineSelector(store.getState());\r\n\r\nexport const check_isWindows = () => bowser.is(\"windows\");\r\n\r\nexport const check_isMiniView = () => isMiniView(window.location);\r\n\r\nexport const check_hasSiteType = ({ contextProps, params }) => {\r\n const siteType = SiteType[params];\r\n if (siteType == null) {\r\n console.warn(`Unknown SiteType: ${params}`);\r\n }\r\n return (\r\n siteType ===\r\n ((contextProps && contextProps.siteType) || SiteType.NotSet)\r\n );\r\n};\r\n\r\n/** returns a property from the contextProps (boolean) */\r\nexport const check_hasContext = ({ contextProps, params }) =>\r\n get(contextProps, params.split(\".\"), false);\r\n\r\n/**\r\n * @param {object} contextProps itemUri, name, isDoc, formatId, etc...\r\n * @param {string} params api method name\r\n */\r\nexport const check_api = async ({\r\n contextProps: { itemUri },\r\n params: apiMethod,\r\n}) => {\r\n try {\r\n return await API.call(apiMethod, { params: { itemUri } });\r\n } catch (e) {\r\n console.error(\"While shouldBeVisible check_api\", e);\r\n }\r\n return false;\r\n};\r\n\r\nexport const check_licenseAllowEdit = () => window.CONFIG.licenseAllowEdit;\r\n\r\nexport const check_isSyncForced = () =>\r\n window.CONFIG.general.uploadProvider === UploadProvider.Sync;\r\n\r\nexport const check_isSyncUpload = (\r\n /* istanbul ignore next */ {\r\n itemUri,\r\n formatId,\r\n }: { itemUri?: string, formatId?: number } = {}\r\n) =>\r\n check_isWindows() &&\r\n check_isSyncForced() &&\r\n check_isSyncEnabled({ itemUri, formatId });\r\n\r\nexport const check_isWorkflowEnabled = () =>\r\n s.userIsWfEnabledSelector(store.getState());\r\n\r\nexport const check_hasItemStatus = ({\r\n contextProps: { itemStatus = ItemStatuses.Nothing },\r\n params,\r\n}) => itemStatus & ItemStatuses[params];\r\n\r\nexport const check_hasSearchType = ({\r\n contextProps: { searchRequest },\r\n params,\r\n}) => {\r\n if (!searchRequest) return false;\r\n return (\r\n searchRequest.searchType === parseInt(params, 10) &&\r\n !searchRequest.isCustom\r\n );\r\n};\r\n\r\n// whether browser supports WebShareAPI (used by CommandActions/share_web)\r\nexport const check_browser_webShareApi = () =>\r\n navigator.share !== undefined && navigator.canShare !== undefined;\r\n\r\nexport const check_hasFeature = ({ name }: { name: FeatureEnum }) =>\r\n isFeatureOn(name);\r\n\r\nexport const check_isMultiSelection = ({ contextProps: { multiple } }) =>\r\n !!multiple;\r\n\r\nexport const check_hasExtension = ({ contextProps: { ext }, params }) =>\r\n String(\r\n ext && ext.startsWith(\".\") ? ext.substring(1) : ext || \"\"\r\n ).toUpperCase() === params.toUpperCase();\r\n\r\nconst checkMapping = {\r\n isOnline: check_isOnline,\r\n isAdmin: check_isAdmin,\r\n isFav: applyAnySelectionContext(check_isFavorite),\r\n isDoc: applyAnySelectionContext(check_isDoc),\r\n isFolder: applyAnySelectionContext((props) => !check_isDoc(props)),\r\n isSpecialFolder: applyAnySelectionContext(check_isSpecialFolder),\r\n isValidItemUri: applyAnySelectionContext(check_isValidItemUri),\r\n isSyncEnabled: check_isSyncEnabled,\r\n isSyncForced: check_isSyncForced,\r\n isSyncUpload: check_isSyncUpload,\r\n isWindows: check_isWindows,\r\n isMiniView: check_isMiniView,\r\n hasSiteType: check_hasSiteType,\r\n api: check_api,\r\n hasContext: check_hasContext,\r\n hasFeature: (props) => check_hasFeature({ name: props.params }),\r\n hasBrowser_webShareApi: check_browser_webShareApi,\r\n isCreateAllowed: (props) =>\r\n check_hasContext({ ...props, params: \"isEditAllowed\" }) ||\r\n check_hasContext({ ...props, params: \"isDocAssignmentAllowed\" }),\r\n hasItemStatus: check_hasItemStatus,\r\n isRecycleBin: (props) =>\r\n check_hasItemStatus({ ...props, params: \"Deleted\" }) ||\r\n check_hasItemStatus({ ...props, params: \"ParentDeleted\" }),\r\n hasSearchType: check_hasSearchType,\r\n licenseAllowEdit: check_licenseAllowEdit,\r\n isWorkflowEnabled: check_isWorkflowEnabled,\r\n isAnyOnlineStatus: () => true,\r\n isAnySelection: () => true,\r\n isMultiSelection: check_isMultiSelection,\r\n hasExtension: check_hasExtension,\r\n hasRowAndColId: ({ contextProps }) =>\r\n contextProps.columnIndex != null && contextProps.rowIndex != null,\r\n};\r\n\r\nexport const shouldBeVisible = async ({\r\n item,\r\n itemUri,\r\n contextProps,\r\n}: {\r\n item: ItemActionConfigBase,\r\n itemUri: string,\r\n contextProps: ?Object,\r\n}): Promise =>\r\n await asyncEvery(item.shouldBeVisible || [], async (expr) => {\r\n let negate = false;\r\n const split = expr.split(\":\");\r\n let conditionName = split[0];\r\n if (conditionName.startsWith(\"!\")) {\r\n negate = true;\r\n conditionName = conditionName.substr(1);\r\n }\r\n const func = checkMapping[conditionName];\r\n if (func == null) {\r\n console.warn(\"Unknown shouldBeVisible expression: \" + expr);\r\n return false;\r\n }\r\n const result = await func({ itemUri, params: split[1], contextProps });\r\n // console.log(\r\n // \"shouldBeVisible\",\r\n // conditionName,\r\n // JSON.parse(JSON.stringify(result))\r\n // );\r\n return negate ? !result : result;\r\n });\r\n","import actionTypes from \"../actions/actionTypes\";\r\nimport { SiteType } from \"data/types\";\r\n\r\nexport const initialState = {};\r\n\r\nconst breadcrumbReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.CURRENT_BREADCRUMB:\r\n const { parts } = action.payload.breadcrumb;\r\n return {\r\n ...state,\r\n [action.payload.viewName]: {\r\n ...action.payload.breadcrumb,\r\n isFav: action.payload.isFav,\r\n //viewName: action.payload.viewName,\r\n itemUri:\r\n parts == null ||\r\n !Array.isArray(parts) ||\r\n parts.length === 0\r\n ? undefined\r\n : parts[parts.length - 1].itemUri,\r\n },\r\n };\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default breadcrumbReducer;\r\n\r\nexport const breadcrumbIsFavSelector = (state: Object, name: string) =>\r\n (state.breadcrumb[name] && state.breadcrumb[name].isFav) || false;\r\nexport const breadcrumbItemUriSelector = (state: Object, name: string) =>\r\n state.breadcrumb[name] && state.breadcrumb[name].itemUri;\r\nexport const breadcrumbNameSelector = (state: Object, name: string) =>\r\n state.breadcrumb[name] && state.breadcrumb[name].parts\r\n ? state.breadcrumb[name].parts[state.breadcrumb[name].parts.length - 1]\r\n .text\r\n : \"\";\r\nexport const breadcrumbLevelsCountSelector = (state: Object, name: string) =>\r\n state.breadcrumb[name] && state.breadcrumb[name].parts\r\n ? state.breadcrumb[name].parts.length\r\n : -1;\r\nexport const breadcrumbVersionSelector = (state: Object, name: string) =>\r\n state.breadcrumb[name] && state.breadcrumb[name].version;\r\nexport const breadcrumbFormatIdSelector = (state: Object, name: string) =>\r\n state.breadcrumb[name] && state.breadcrumb[name].formatId;\r\nexport const breadcrumbSiteTypeSelector = (state: Object, name: string) =>\r\n (state.breadcrumb[name] && state.breadcrumb[name].siteType) ||\r\n SiteType.NotSet;\r\n","// @flow\r\n//#region imports\r\nimport type {\r\n UserInfoResultDTO,\r\n CardItemResultDTO,\r\n TreeDTO,\r\n BreadcrumbResultDTO,\r\n FormResultDTO,\r\n SearchFormResultDTO,\r\n DocInfoResultDTO,\r\n DocInfoResultWithTokenDTO,\r\n DocListFilterRequestDTO,\r\n DocListSortRequestDTO,\r\n DocsResultDTO,\r\n WorkflowDTO,\r\n WorkflowInfoDTO,\r\n WorkflowProviderEnum,\r\n SAYTOptionDTO,\r\n SearchResultDTO,\r\n SearchCountResultDTO,\r\n SearchRequestDTO,\r\n SearchFilterDTO,\r\n UserPrincipalDTO,\r\n GroupPrincipalDTO,\r\n ExtraAttributesEmbeddedGridDTO,\r\n SortDirectionEnum,\r\n ItemLinkTypeEnum,\r\n ActivitiesDTO,\r\n NewFormTypeEnum,\r\n LookupValuesResultDTO,\r\n FormLookupTypeEnum,\r\n NewsFeedDTO,\r\n SubscribeResponseDTO,\r\n UserSettingsResultDTO,\r\n SearchFormInfoDTO,\r\n UserSettingsDTO,\r\n ItemFlowsConfigDTO,\r\n ItemFlowDirectionEnum,\r\n NewItemResultDTO,\r\n RasterMapResultDTO,\r\n ReminderDTO,\r\n ItemContextResponseDTO,\r\n TransferItemRequestDTO,\r\n // SearchValueTypeEnum\r\n} from \"data/types\";\r\nimport { ItemContextsFlags } from \"data/types\";\r\nimport API from \"./ApiManager\";\r\nimport { correlationId, isOnline } from \"data/storeHelper\";\r\nimport qs from \"data/queryString\";\r\n//#endregion\r\n\r\n//#region AbortSignal\r\n// https://github.com/flow-typed/flow-typed/issues/1652\r\n// translation of https://dom.spec.whatwg.org/#abortcontroller\r\ndeclare interface AbortSignal extends EventTarget {\r\n +aborted: boolean;\r\n onabort: EventHandler;\r\n}\r\ndeclare class AbortController {\r\n +signal: AbortSignal;\r\n abort: () => void;\r\n}\r\n//#endregion\r\n\r\n// helper\r\nconst nameof = (o) => Object.keys(o)[0];\r\n\r\n//#region SiteItems\r\nexport const fetchSites = (): Promise> =>\r\n API.call(nameof({ fetchSites }));\r\n//#endregion\r\n\r\n//#region UserInfo\r\n\r\n// retrieves the user's info object from WebApi\r\nexport const fetchUser = (): Promise =>\r\n API.call(nameof({ fetchUser }));\r\n//#endregion\r\n//#region UserSettings\r\n\r\nexport const fetchUserSettings = (): Promise =>\r\n API.call(nameof({ fetchUserSettings }));\r\n\r\nexport const saveUserSettings = (params: UserSettingsDTO): Promise =>\r\n API.call(nameof({ saveUserSettings }), { params });\r\n//#endregion\r\n//#region Cards\r\n\r\n// retrieves the user's home cards from WebApi\r\n/* istanbul ignore next */\r\nexport const fetchCards = (\r\n signal?: AbortController\r\n): Promise> =>\r\n API.call(nameof({ fetchCards }), { signal });\r\n//#endregion\r\n//#region Favorites\r\n\r\nexport const fetchNews = (): Promise =>\r\n API.call(nameof({ fetchNews }));\r\n\r\nexport const fetchFavorites = (): Promise> =>\r\n API.call(nameof({ fetchFavorites }));\r\n\r\nexport const addFavorite = (itemUri: string, name: string): Promise =>\r\n API.call(nameof({ addFavorite }), { params: { itemUri, name } });\r\n\r\nexport const delFavorite = (itemUri: string): Promise =>\r\n API.call(nameof({ delFavorite }), { params: { itemUri } });\r\n\r\nexport const addSearchFavorite = (params: SearchRequestDTO): Promise =>\r\n API.call(nameof({ addSearchFavorite }), {\r\n params,\r\n });\r\n\r\nexport const delFavoriteLink = (linkId: number): Promise =>\r\n API.call(nameof({ delFavoriteLink }), {\r\n params: { linkId },\r\n });\r\n//#endregion\r\n//#region Mails\r\n\r\nexport /* istanbul ignore next */ const sendMail = (\r\n params: SendNotificationRequestDTO\r\n): Promise =>\r\n API.call(nameof({ sendMail }), {\r\n params,\r\n });\r\n\r\nexport /* istanbul ignore next */ const sendMailAttachments = (\r\n params: SendDocumentsRequestDTO\r\n): Promise =>\r\n API.call(nameof({ sendMailAttachments }), {\r\n params,\r\n });\r\n//#endregion\r\n//#region Folder's Tree\r\n\r\nexport /* istanbul ignore next */ const fetchTree = ({\r\n itemUri,\r\n filter = \"\",\r\n deep = false,\r\n all = false,\r\n signal,\r\n}: {\r\n itemUri: string,\r\n filter: string,\r\n deep: boolean,\r\n all: boolean,\r\n signal?: AbortSignal,\r\n}): Promise =>\r\n API.call(nameof({ fetchTree }), {\r\n params: {\r\n itemUri,\r\n filter,\r\n deep,\r\n all,\r\n },\r\n signal,\r\n });\r\n//#endregion\r\n//#region Folder\r\n\r\nexport const createFolder = ({\r\n itemUri,\r\n formatId,\r\n elementType,\r\n values,\r\n}: {\r\n itemUri: string,\r\n formatId: number,\r\n elementType?: number,\r\n values: Object,\r\n}): Promise =>\r\n API.call(nameof({ createFolder }), {\r\n params: {\r\n itemUri,\r\n formatId,\r\n elementType,\r\n values,\r\n },\r\n });\r\n\r\nexport const createFolderFromTemplate = (\r\n template: string,\r\n itemUri: string,\r\n targetFolderName: string\r\n) =>\r\n API.call(nameof({ createFolderFromTemplate }), {\r\n params: { template, itemUri, targetFolderName },\r\n });\r\n\r\nexport const createFolderTemplateGetItemUri = (jobId: number) =>\r\n API.call(nameof({ createFolderTemplateGetItemUri }), {\r\n params: { jobId },\r\n });\r\n//#endregion\r\n//#region ItemFlows\r\n\r\nexport const fetchItemFlows = (\r\n itemUri: string,\r\n dir: ItemFlowDirectionEnum\r\n): Promise =>\r\n API.call(nameof({ fetchItemFlows }), {\r\n params: {\r\n itemUri,\r\n dir,\r\n },\r\n });\r\n\r\nexport const fetchItemFlowForm = ({\r\n formType,\r\n itemUri,\r\n templateId,\r\n templateType,\r\n}: {\r\n formType: NewFormTypeEnum,\r\n itemUri: string,\r\n templateId: string,\r\n templateType: string,\r\n}): Promise =>\r\n API.call(nameof({ fetchItemFlowForm }), {\r\n params: {\r\n formType,\r\n itemUri,\r\n templateId,\r\n templateType,\r\n },\r\n });\r\n\r\n//#endregion\r\n//#region Breadcrumb\r\n\r\nexport const fetchBreadcrumb = (\r\n itemUri: string,\r\n signal?: AbortSignal\r\n): Promise =>\r\n API.call(nameof({ fetchBreadcrumb }), { params: { itemUri }, signal });\r\n//#endregion\r\n//#region Item\r\nexport const delItemUri = (itemUri: string): Promise =>\r\n API.call(nameof({ delItemUri }), { params: { itemUri } });\r\n//#endregion\r\n//#region Form\r\nexport const fetchSearchFormList = (): Promise> =>\r\n API.call(nameof({ fetchSearchFormList }));\r\n\r\nexport const fetchNewForm = (\r\n formType: NewFormTypeEnum,\r\n itemUri: string\r\n): Promise =>\r\n API.call(nameof({ fetchNewForm }), {\r\n params: { itemUri },\r\n });\r\n\r\nexport const fetchForm = (itemUri: string): Promise =>\r\n API.call(nameof({ fetchForm }), { params: { itemUri } });\r\n\r\nexport const fetchSearchForm = (\r\n id: number,\r\n values: Object\r\n): Promise =>\r\n API.call(nameof({ fetchSearchForm }), {\r\n params: { id, values },\r\n });\r\n\r\nexport const fetchFormLookup = ({\r\n keyword,\r\n pageNum,\r\n isDoc,\r\n formatId,\r\n name,\r\n lookupType,\r\n id,\r\n filters,\r\n itemUri,\r\n}: {\r\n keyword: string,\r\n pageNum: number,\r\n isDoc: boolean,\r\n formatId: number,\r\n name: string,\r\n lookupType: FormLookupTypeEnum,\r\n id: ?number,\r\n filters: Array,\r\n itemUri: string,\r\n}): Promise =>\r\n API.call(nameof({ fetchFormLookup }), {\r\n params: {\r\n keyword,\r\n pageNum,\r\n isDoc,\r\n formatId,\r\n name,\r\n lookupType,\r\n id,\r\n filters,\r\n itemUri,\r\n },\r\n });\r\n\r\nexport const fetchFormLookupDependencies = ({\r\n isDoc,\r\n formatId,\r\n name,\r\n lookupType,\r\n currentLookupValues,\r\n itemUri,\r\n}: {\r\n isDoc: boolean,\r\n formatId: number,\r\n name: string,\r\n lookupType: FormLookupTypeEnum,\r\n currentLookupValues: Array,\r\n itemUri: string,\r\n}) =>\r\n API.call(nameof({ fetchFormLookupDependencies }), {\r\n params: {\r\n isDoc,\r\n formatId,\r\n name,\r\n lookupType,\r\n currentLookupValues,\r\n itemUri,\r\n },\r\n });\r\n\r\nexport const fetchExtraAttributesEmbeddedGrid = (\r\n itemUri: string,\r\n name: string,\r\n filter: string,\r\n pageNum: number,\r\n sortColumn: string,\r\n sortDirection: SortDirectionEnum,\r\n signal?: AbortController\r\n): Promise =>\r\n API.call(nameof({ fetchExtraAttributesEmbeddedGrid }), {\r\n params: {\r\n itemUri,\r\n name,\r\n filter,\r\n pageNum,\r\n sortColumn,\r\n sortDirection,\r\n },\r\n signal,\r\n });\r\n\r\nexport const saveForm = (\r\n itemUri: string,\r\n values: Object,\r\n etag: string\r\n): Promise =>\r\n API.call(nameof({ saveForm }), {\r\n params: {\r\n itemUri,\r\n values,\r\n etag,\r\n },\r\n });\r\n\r\nexport const saveNewDocFromTemplate = ({\r\n templateId,\r\n itemUri,\r\n values,\r\n}: {\r\n templateId: string,\r\n itemUri: string,\r\n values: Object,\r\n}) =>\r\n API.call(nameof({ saveNewDocFromTemplate }), {\r\n params: {\r\n templateId,\r\n itemUri,\r\n values,\r\n },\r\n });\r\n\r\n/**\r\n * Will call the server to Validate a form's values\r\n * @export\r\n * @param {boolean} isNew create or update form?\r\n * @param {boolean} isDoc document or folder?\r\n * @param {string} itemUri if create then parent's itemUri, if update then item's itemUri\r\n * @param {boolean} validateWebdavName validate WebdavName?\r\n * @param {Object} values\r\n * @param {AbortController} [signal] AbortController's signal for cancelling\r\n * @returns {Promise} validationErrors - any resource names to localize will start with $\r\n */\r\nexport const validateForm = (\r\n isNew: boolean,\r\n isDoc: boolean,\r\n itemUri: string,\r\n validateWebdavName: boolean,\r\n values: Object,\r\n signal?: AbortSignal\r\n): Promise =>\r\n API.call(nameof({ validateForm }), {\r\n params: {\r\n isNew,\r\n isDoc,\r\n itemUri,\r\n validateWebdavName,\r\n values,\r\n },\r\n signal,\r\n });\r\n\r\nexport const getArchiveTargets = (\r\n offline?: boolean\r\n): Promise> =>\r\n API.call(nameof({ getArchiveTargets }), {\r\n params: { offline },\r\n });\r\n//#endregion\r\n//#region DocInfo\r\n\r\nexport const fetchDocInfo = (itemUri: string): Promise =>\r\n API.call(nameof({ fetchDocInfo }), {\r\n params: { itemUri },\r\n });\r\n//#endregion\r\n//#region Documents\r\n\r\nexport const fetchActivities = (\r\n itemUri: string\r\n): Promise> =>\r\n API.call(nameof({ fetchActivities }), {\r\n params: { itemUri },\r\n });\r\n\r\nexport /* istanbul ignore next */ const fetchItemNote = (\r\n itemUri: string,\r\n noteId: number\r\n): Promise =>\r\n API.call(nameof({ fetchItemNote }), {\r\n params: { itemUri, noteId },\r\n });\r\n\r\nexport const addItemNote = (params: ActivityDTO): Promise =>\r\n API.call(nameof({ addItemNote }), {\r\n params,\r\n });\r\n\r\nexport const updateItemNote = (params: ActivityDTO): Promise =>\r\n API.call(nameof({ updateItemNote }), {\r\n params,\r\n });\r\n\r\nexport const deleteItemNote = (itemUri: string, noteId: number): Promise =>\r\n API.call(nameof({ deleteItemNote }), {\r\n params: { itemUri, noteId },\r\n });\r\n\r\nexport const delDocVersion = (\r\n itemUri: string,\r\n version: number\r\n): Promise =>\r\n API.call(nameof({ delDocVersion }), {\r\n params: { itemUri, version },\r\n });\r\n\r\nexport const restoreDocVersion = (\r\n itemUri: string,\r\n version: number\r\n): Promise =>\r\n API.call(nameof({ restoreDocVersion }), {\r\n params: { itemUri, version },\r\n });\r\n\r\nexport const fetchDocCount = (\r\n itemUri: string,\r\n filters?: Array,\r\n signal?: AbortController\r\n): Promise =>\r\n API.call(nameof({ fetchDocCount }), {\r\n params: {\r\n itemUri,\r\n pageNum: 0,\r\n filters,\r\n },\r\n signal,\r\n });\r\n\r\nexport const fetchDocsCsv = (\r\n itemUri: string,\r\n sorts?: DocListSortRequestDTO | Array,\r\n filters?: Array\r\n): Promise /* istanbul ignore next */ =>\r\n API.call(nameof({ fetchDocsCsv }), {\r\n params: {\r\n itemUri,\r\n sorts,\r\n filters,\r\n },\r\n });\r\n\r\nexport const fetchDocs = (\r\n itemUri: string,\r\n pageNum?: number,\r\n sorts?: DocListSortRequestDTO | Array,\r\n filters?: Array,\r\n cols?: Array,\r\n signal?: AbortSignal\r\n): Promise /* istanbul ignore next */ =>\r\n API.call(nameof({ fetchDocs }), {\r\n params: { itemUri, pageNum, sorts, filters, cols },\r\n signal,\r\n });\r\n\r\n/* istanbul ignore next */\r\nexport const fetchDownloadToken = (\r\n itemUri: string\r\n): Promise /* istanbul ignore next */ =>\r\n API.call(nameof({ fetchDownloadToken }), {\r\n params: { itemUri },\r\n });\r\n\r\n/* istanbul ignore next */\r\nexport function downloadDocToken(\r\n token: string,\r\n inline: ?boolean,\r\n pdf: ?boolean,\r\n stream: ?boolean\r\n): string /* istanbul ignore next */ {\r\n let data = { token };\r\n if (isOnline()) data.correlationId = correlationId();\r\n if (inline === true) data.inline = true;\r\n if (pdf === true) data.pdf = true;\r\n if (stream === true) data.stream = true;\r\n\r\n // if (uri !== undefined) {\r\n // return `${uri}?${qs.stringify(data)}`;\r\n // } else {\r\n const host =\r\n window.CONFIG.host.bridge ||\r\n `${window.CONFIG.host.basename}${window.CONFIG.general.api}`;\r\n return `${host}/doc/download?${qs.stringify(data)}`;\r\n // }\r\n}\r\n\r\n/* istanbul ignore next */\r\nconst downloadDocUri = (\r\n itemUri: string,\r\n inline: ?boolean,\r\n pdf: ?boolean\r\n): Promise =>\r\n fetchDownloadToken(itemUri).then((result: DocInfoResultWithTokenDTO) =>\r\n downloadDocToken(result.token, inline, pdf)\r\n );\r\n\r\nexport { downloadDocUri };\r\n\r\nexport const fetchThumbnail = (\r\n itemUri: string,\r\n signal?: AbortSignal\r\n): Promise =>\r\n API.call(nameof({ fetchThumbnail }), {\r\n params: { itemUri },\r\n signal,\r\n });\r\n\r\nexport const fetchRelatedDocs = (\r\n itemUri: string,\r\n itemLinkType: ItemLinkTypeEnum,\r\n getSource: ?boolean\r\n): Promise> =>\r\n API.call(nameof({ fetchRelatedDocs }), {\r\n params: { itemUri, itemLinkType, getSource },\r\n });\r\n\r\n/* istanbul ignore next */\r\nexport const getWebDavHttpLink = (\r\n itemUri: string,\r\n webDavName: string\r\n): Promise =>\r\n API.call(nameof({ getWebDavHttpLink }), {\r\n params: { itemUri, webDavName },\r\n });\r\n\r\n/* istanbul ignore next */\r\nexport const getCloudInfo = (\r\n itemUri: string,\r\n webDavName: string\r\n): Promise> =>\r\n API.call(nameof({ getCloudInfo }), { params: { itemUri, webDavName } });\r\n\r\n//#endregion\r\n//#region (Un)lock\r\n\r\nexport const lock = (itemUri: string): Promise =>\r\n API.call(nameof({ lock }), {\r\n params: { itemUri },\r\n });\r\n\r\nexport const unlock = (itemUri: string): Promise =>\r\n API.call(nameof({ unlock }), {\r\n params: { itemUri },\r\n });\r\n//#endregion\r\n//#region (Un)subscribe\r\n\r\nexport const subscribe = (itemUri: string, name: string): Promise =>\r\n API.call(nameof({ subscribe }), {\r\n params: { itemUri, name },\r\n });\r\n\r\nexport const isSubscribed = (itemUri: string): Promise =>\r\n API.call(nameof({ isSubscribed }), {\r\n params: { itemUri },\r\n });\r\n\r\nexport const unsubscribeByItemUri = (itemUri: string): Promise =>\r\n API.call(nameof({ unsubscribeByItemUri }), {\r\n params: { itemUri },\r\n });\r\n\r\nexport const unsubscribeById = ({\r\n linkID,\r\n itemUri,\r\n}: {\r\n linkID: number,\r\n itemUri: string,\r\n}): Promise =>\r\n API.call(nameof({ unsubscribeById }), {\r\n params: { linkID, itemUri },\r\n });\r\n//#endregion\r\n//#region Workflow\r\nexport const fetchWorkflowCards = (\r\n signal?: AbortController\r\n): Promise> =>\r\n API.call(nameof({ fetchWorkflowCards }), {\r\n signal,\r\n });\r\n\r\nexport const fetchNewWorkflows = (\r\n itemUri: string,\r\n signal?: AbortSignal\r\n): Promise> =>\r\n API.call(nameof({ fetchNewWorkflows }), {\r\n params: { itemUri },\r\n signal,\r\n });\r\nexport const fetchWorkflowInfo = ({\r\n provider,\r\n wfId,\r\n itemUri,\r\n signal,\r\n}: {\r\n provider: WorkflowProviderEnum,\r\n wfId?: string,\r\n itemUri?: string,\r\n signal?: AbortSignal,\r\n}): Promise> =>\r\n API.call(nameof({ fetchWorkflowInfo }), {\r\n params: { provider, wfId, itemUri },\r\n signal,\r\n });\r\n\r\n//#endregion\r\n//#region Recycle Bin\r\nexport const delDefiniteItemUri = (itemUri: string): Promise =>\r\n API.call(nameof({ delDefiniteItemUri }), {\r\n params: { itemUri },\r\n });\r\n\r\nexport const restoreItemUri = (itemUri: string): Promise =>\r\n API.call(nameof({ restoreItemUri }), {\r\n params: { itemUri },\r\n });\r\n\r\n//#endregion\r\n//#region Raster maps\r\nexport const fetchRasterMapLayers = ({\r\n itemUri,\r\n rasterMapIdSelector,\r\n create,\r\n}: {\r\n itemUri: string,\r\n rasterMapIdSelector: ?string,\r\n create?: boolean,\r\n}): Promise =>\r\n API.call(nameof({ fetchRasterMapLayers }), {\r\n params: { itemUri, rasterMapIdSelector, create },\r\n });\r\n\r\nexport const saveRasterMapLayers = ({\r\n map,\r\n}: {\r\n map: RasterMapSaveRequestDTO,\r\n}): Promise =>\r\n API.call(nameof({ saveRasterMapLayers }), {\r\n params: map,\r\n });\r\n//#endregion\r\n//#region Search\r\n\r\nexport const fetchSAYT = (\r\n keyword: ?string,\r\n itemUri: ?string\r\n): Promise> /* istanbul ignore next */ =>\r\n API.call(nameof({ fetchSAYT }), {\r\n params: { keyword, itemUri },\r\n });\r\n\r\nexport const fetchSearchCount = (\r\n params: SearchRequestDTO,\r\n signal?: AbortSignal\r\n): Promise /* istanbul ignore next */ =>\r\n API.call(nameof({ fetchSearchCount }), {\r\n params,\r\n signal,\r\n });\r\n\r\nexport const fetchSearchResult = (\r\n params: SearchRequestDTO\r\n): Promise /* istanbul ignore next */ =>\r\n API.call(nameof({ fetchSearchResult }), {\r\n params,\r\n });\r\n\r\n/* istanbul ignore next */\r\nexport const fetchSearchPrincipal = (\r\n keyword: string,\r\n includeUsers: boolean = true,\r\n includeGroups: boolean = false,\r\n signal?: AbortSignal\r\n): Promise> =>\r\n API.call(nameof({ fetchSearchPrincipal }), {\r\n params: { keyword, includeUsers, includeGroups },\r\n signal,\r\n });\r\n\r\nexport const fetchSearchSuggestion = (\r\n provider: string,\r\n filters: Array\r\n): Promise =>\r\n API.call(nameof({ fetchSearchSuggestion }), {\r\n params: { provider, filters },\r\n });\r\n//#endregion\r\n//#region Reminder\r\nexport const fetchReminders = (\r\n itemUri: string,\r\n signal?: AbortSignal\r\n): Promise> =>\r\n API.call(nameof({ fetchReminders }), {\r\n params: { itemUri },\r\n signal,\r\n });\r\n\r\nexport const upsertReminder = (\r\n params: ReminderDTO,\r\n signal?: AbortSignal\r\n): int =>\r\n API.call(nameof({ upsertReminder }), {\r\n params,\r\n signal,\r\n });\r\n\r\nexport const deleteReminder = (\r\n reminderId: number,\r\n itemUri: string,\r\n signal?: AbortSignal\r\n): int =>\r\n API.call(nameof({ deleteReminder }), {\r\n params: { reminderId, itemUri },\r\n signal,\r\n });\r\n//#endregion\r\n//#region Share\r\n\r\nexport const fetchShare = (\r\n itemUri: string,\r\n signal?: AbortSignal\r\n): Promise =>\r\n API.call(nameof({ fetchShare }), { params: { itemUri }, signal });\r\n\r\nexport const createShare = (\r\n shareRequest: ShareDTO,\r\n signal?: AbortSignal\r\n): Promise =>\r\n API.call(nameof({ createShare }), { params: shareRequest }, signal);\r\n\r\nexport const updateShare = (\r\n shareRequest: ShareDTO,\r\n signal?: AbortSignal\r\n): Promise =>\r\n API.call(nameof({ updateShare }), { params: shareRequest }, signal);\r\n\r\nexport const deleteShare = (\r\n itemUri: string,\r\n signal?: AbortSignal\r\n): Promise =>\r\n API.call(nameof({ deleteShare }), { params: { itemUri }, signal });\r\n\r\nexport const checkShareName = (\r\n itemUris: Array,\r\n webDavNames: Array,\r\n signal?: AbortSignal\r\n): Promise =>\r\n API.call(nameof({ checkShareName }), {\r\n params: { itemUris, webDavNames },\r\n signal,\r\n });\r\n\r\nexport const fetchShareContext = (\r\n itemUris: Array,\r\n formatIds: Array,\r\n signal?: AbortSignal\r\n): Promise =>\r\n API.call(nameof({ fetchShareContext }), {\r\n params: { itemUris, formatIds },\r\n signal,\r\n });\r\n\r\n//#endregion\r\n//#region Offline\r\n\r\nexport const fetchOfflineItems = (): Promise> =>\r\n API.call(nameof({ fetchOfflineItems }));\r\n\r\nexport const addOfflineItem = (itemUri: string): Promise =>\r\n API.call(nameof({ addOfflineItem }), {\r\n params: { itemUri },\r\n });\r\n\r\nexport const delOfflineItem = (itemUri: string): Promise =>\r\n API.call(nameof({ delOfflineItem }), {\r\n params: { itemUri },\r\n });\r\n\r\n// called directly by service-worker.custom.js\r\n// export const fetchOfflinePrecache = (): Promise> =>\r\n// API.call(nameof({ fetchOfflinePrecache }));\r\n//#endregion\r\n\r\n//#region transfer\r\nexport const transfer = (\r\n transferRequest: TransferItemRequestDTO\r\n): Promise =>\r\n API.call(nameof({ transfer }), { params: transferRequest });\r\n//#endregion\r\n\r\n//#region context\r\nexport const context = (\r\n itemUris,\r\n formatIds,\r\n /* istanbul ignore next */\r\n itemContexts = ItemContextsFlags.All\r\n): Promise =>\r\n API.call(nameof({ context }), {\r\n params: { itemUris, formatIds, itemContexts },\r\n });\r\n//#endregion\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\n\r\nexport const initialState = {\r\n idToken: null,\r\n accessToken: null,\r\n status: Constants.NONE,\r\n expiresOn: null,\r\n};\r\n\r\nconst loginReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.LOGIN_RESULT:\r\n return {\r\n ...state,\r\n ...action.payload,\r\n };\r\n case actionTypes.LOGIN_SIGNOUT:\r\n /* istanbul ignore next */\r\n // eslint-disable-next-line no-fallthrough\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loginReducer;\r\n\r\nexport const loginStatusSelector = (state: Object) => state.login.status;\r\nexport const loginIdTokenSelector = (state: Object) =>\r\n state.login.status === Constants.OK\r\n ? state.login.idToken\r\n : /* istanbul ignore next */ null;\r\nexport const loginAccessTokenSelector = (state: Object) =>\r\n state.login.status === Constants.OK\r\n ? state.login.accessToken\r\n : /* istanbul ignore next */ null;\r\nexport const loginExpiresOnSelector = (state: Object) => state.login.expiresOn;\r\nexport const loginExpiresInSelector = (state: Object) => state.login.expiresIn;\r\n","// @flow\r\nimport React from \"react\";\r\nimport loc from \"i18next\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\nconst ModalCloseButton = ({\r\n onClick,\r\n className,\r\n title = loc.t(\"common:close\"),\r\n}: {\r\n onClick: Function,\r\n className?: string,\r\n}) => (\r\n \r\n ×\r\n {title}\r\n \r\n);\r\nModalCloseButton.displayName = \"ModalCloseButton\";\r\nexport default ModalCloseButton;\r\n","// https://github.com/ReactTraining/react-router/blob/master/FAQ.md#how-do-i-access-the-history-object-outside-of-components\r\nimport { createBrowserHistory } from \"history\";\r\nimport { get } from \"data/constants\";\r\n\r\nexport default createBrowserHistory({\r\n basename: get(window.CONFIG, [\"host\", \"basename\"], \"\"),\r\n});\r\n","//@flow\r\nimport React, {\r\n useState,\r\n useCallback,\r\n useMemo,\r\n useRef,\r\n useEffect,\r\n useContext,\r\n} from \"react\";\r\nimport { MultiSelectionContext } from \"data/context\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { getDisplayName } from \"data/constants\";\r\nimport ActionsButton from \"components/ActionPanel/ActionsButton\";\r\nimport styles from \"./StickyToggle.module.css\";\r\nimport { isHandheld } from \"data/bowser\";\r\n\r\ntype Config = {\r\n // Wheather to render a DIV tag (e.g. if the wrapped component does not support a ref or mouse events)\r\n renderDiv: boolean,\r\n usePortal: boolean,\r\n portalTargetSelector: string,\r\n portalTargetSelectionMethod: \"pop\" | \"shift\",\r\n //\r\n getStyle: ({\r\n node: React.DOMElement,\r\n isActive: boolean,\r\n isHovered: boolean,\r\n }) => CSStyleDefinition,\r\n rowIndexProp: number,\r\n isActiveProp: string,\r\n isHoveredProp: string,\r\n // props name for onClick callback of ActionsButton\r\n actionsHandlerProp: string,\r\n // props name for disabled boolean of ActionsButton\r\n actionsDisabledProp: string,\r\n // Callback to check if item should be rendered at all; defaults to true\r\n shouldRender: () => boolean,\r\n};\r\n\r\nconst DEFAULT_CONFIG = {\r\n renderDiv: true,\r\n usePortal: true,\r\n portalTargetSelector: \"#root\",\r\n portalTargetSelectionMethod: \"pop\",\r\n getStyle: /* istanbul ignore next*/ ({ node }) => ({\r\n position: \"absolute\",\r\n transform: \"translateX(-100%)\",\r\n zIndex: 99,\r\n top: node?.getBoundingClientRect().y,\r\n left: window.innerWidth,\r\n }),\r\n rowIndexProp: \"index\",\r\n isActiveProp: \"isActive\",\r\n isHoveredProp: \"isHovered\",\r\n actionsHandlerProp: \"onMoreClick\",\r\n actionsDisabledProp: \"actionsDisabled\",\r\n shouldRender: () => true,\r\n};\r\n\r\ntype Props = {\r\n style?: CSStyleDefinition,\r\n onMoreClick: () => void,\r\n};\r\n\r\nconst withStickyToggle =\r\n ({\r\n renderDiv = DEFAULT_CONFIG.renderDiv,\r\n usePortal = DEFAULT_CONFIG.usePortal,\r\n portalTargetSelector = DEFAULT_CONFIG.portalTargetSelector,\r\n portalTargetSelectionMethod = DEFAULT_CONFIG.portalTargetSelectionMethod,\r\n getStyle = DEFAULT_CONFIG.getStyle,\r\n rowIndexProp = DEFAULT_CONFIG.rowIndexProp,\r\n isActiveProp = DEFAULT_CONFIG.isActiveProp,\r\n isHoveredProp = DEFAULT_CONFIG.isHoveredProp,\r\n actionsHandlerProp = DEFAULT_CONFIG.actionsHandlerProp,\r\n actionsDisabledProp = DEFAULT_CONFIG.actionsDisabledProp,\r\n shouldRender = DEFAULT_CONFIG.shouldRender,\r\n }: Config = DEFAULT_CONFIG) =>\r\n (WrappedComponent: ComponentType) => {\r\n const HOC = ({\r\n style,\r\n onMouseEnter,\r\n onMouseLeave,\r\n ...props\r\n }: Props) => {\r\n /* istanbul ignore next */\r\n const { multiple, isSelected } = useContext(\r\n MultiSelectionContext\r\n ) || {\r\n multiple: false,\r\n isSelected: (index: number) => false,\r\n };\r\n const divRef = useRef(null);\r\n const actionsHandler = props[actionsHandlerProp];\r\n const actionsDisabled = props[actionsDisabledProp];\r\n const isActive = multiple\r\n ? isSelected(props[rowIndexProp])\r\n : props[isActiveProp];\r\n const isHovered = props[isHoveredProp];\r\n const [show, setShow] = useState(isHandheld());\r\n const handleMouseEnter = useCallback(\r\n (...p) => {\r\n setShow(true);\r\n /* istanbul ignore else */\r\n if (typeof onMouseEnter === \"function\") {\r\n onMouseEnter(...p);\r\n }\r\n },\r\n [onMouseEnter]\r\n );\r\n\r\n const handleMouseLeave = useCallback(\r\n (...p) => {\r\n setShow(isHandheld());\r\n /* istanbul ignore else */\r\n if (typeof onMouseLeave === \"function\") {\r\n onMouseLeave(...p);\r\n }\r\n },\r\n [onMouseLeave]\r\n );\r\n\r\n const handleClick = useCallback(\r\n (...p) => {\r\n const [event] = p;\r\n event.stopPropagation();\r\n /* istanbul ignore else */\r\n if (typeof actionsHandler === \"function\") {\r\n actionsHandler(...p);\r\n }\r\n },\r\n [actionsHandler]\r\n );\r\n const wrapperProps = useMemo(\r\n () => ({\r\n divRef: renderDiv ? null : divRef,\r\n onMouseEnter: handleMouseEnter,\r\n onMouseLeave: handleMouseLeave,\r\n }),\r\n [handleMouseEnter, handleMouseLeave]\r\n );\r\n\r\n const calculatedStyle = Object.assign(\r\n getStyle({\r\n node: divRef.current,\r\n isActive,\r\n isHovered,\r\n }),\r\n {\r\n opacity: show ? 1 : 0,\r\n },\r\n style\r\n );\r\n\r\n // Get Target from DOM\r\n const getPortalTarget = useCallback(\r\n () =>\r\n [...document.querySelectorAll(portalTargetSelector)]?.[\r\n portalTargetSelectionMethod\r\n ](),\r\n []\r\n );\r\n\r\n // Handle Portal Target (if DOM is not rendered yet)\r\n const [portalTarget, setPortalTarget] = useState(getPortalTarget());\r\n useEffect(() => {\r\n /* istanbul ignore next */\r\n if (portalTarget == null) {\r\n setPortalTarget(getPortalTarget);\r\n }\r\n }, [portalTarget, getPortalTarget]);\r\n\r\n return (\r\n <>\r\n \r\n {renderDiv && (\r\n \r\n )}\r\n {shouldRender(props) &&\r\n show &&\r\n typeof actionsHandler === \"function\" &&\r\n (usePortal ? (\r\n /*istanbul ignore next */ portalTarget &&\r\n createPortal(\r\n ,\r\n portalTarget\r\n )\r\n ) : (\r\n \r\n ))}\r\n \r\n );\r\n };\r\n HOC.displayName = `withStickyToggle(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n return HOC;\r\n };\r\n\r\nexport default withStickyToggle;\r\n","import { isHandheld } from \"data/bowser\";\r\n\r\nconst GridList = ({ node, isActive, isHovered }) => {\r\n const config = {\r\n outer: \".ReactVirtualized__Grid\",\r\n inner: \".ReactVirtualized__Grid__innerScrollContainer\",\r\n };\r\n const outer = node?.closest(config.outer);\r\n const inner = node?.closest(config.inner);\r\n const rect = {\r\n current: node?.getBoundingClientRect(),\r\n outer: outer?.getBoundingClientRect(),\r\n inner: inner?.getBoundingClientRect(),\r\n };\r\n const rgb = isActive\r\n ? \"0,152,170\"\r\n : isHovered\r\n ? \"245,245,245\"\r\n : \"255,255,255\";\r\n const borderColor = isActive\r\n ? `rgb(${rgb})`\r\n : isHovered\r\n ? \"#ededed\"\r\n : \"#ededed\";\r\n const scrollbarWidth = !isHandheld() ? 17 : 0;\r\n const style = {\r\n position: \"absolute\",\r\n transform: \"translateX(-100%)\",\r\n zIndex: 99,\r\n // Scroll container\r\n top: rect.current?.y + 1 - (rect.outer?.y - outer?.scrollTop),\r\n left:\r\n rect.outer?.width < rect.inner?.width + scrollbarWidth\r\n ? rect.outer?.width +\r\n outer?.scrollLeft -\r\n (rect.outer?.height < rect.inner?.height ? scrollbarWidth : 0)\r\n : rect.inner?.width,\r\n // Root\r\n // top: rect.current?.y + 1,\r\n // left:\r\n // rect.outer?.x +\r\n // (rect.outer?.width < rect.inner?.width\r\n // ? rect.outer?.width -\r\n // (rect.outer?.height < rect.inner?.height && !isHandheld()\r\n // ? 17\r\n // : 0)\r\n // : rect.inner?.width),\r\n minHeight: 40,\r\n color: isActive ? \"white\" : \"black\",\r\n // Box Layout\r\n /*minWidth: 37,\r\n background: `rgb(${rgb})`,\r\n borderLeft: `1px solid ${borderColor}`,\r\n borderBottom: `1px solid ${borderColor}`,*/\r\n // Gradient Layout\r\n minWidth: 42,\r\n justifyContent: \"flex-end\",\r\n background: `linear-gradient(90deg, rgba(${rgb},0) 0%, rgba(${rgb},1) 50%)`,\r\n };\r\n if (isHandheld()) {\r\n style.transform = \"translate(-100%, -1px) translateX(-1px)\";\r\n style.minWidth = undefined;\r\n style.background = `rgb(${rgb})`;\r\n style.borderLeft = `1px solid ${borderColor}`;\r\n style.borderBottom = `1px solid ${borderColor}`;\r\n style.minHeight = 42;\r\n }\r\n return style;\r\n};\r\n\r\nconst List = ({ node, isActive, isHovered }) => {\r\n return {\r\n position: \"absolute\",\r\n transform: \"translateX(-100%)\",\r\n zIndex: 99,\r\n top: 1,\r\n left: \"100%\",\r\n color: isActive ? \"white\" : \"black\",\r\n minHeight: 32,\r\n };\r\n};\r\n\r\nconst StickyToggleStyle = {\r\n List,\r\n GridList,\r\n};\r\nexport default StickyToggleStyle;\r\n","import { getDisplayName } from \"data/constants\";\r\nimport { useOfflineHandler } from \"hooks\";\r\n\r\nconst withOfflineHandler = (WrappedComponent) => {\r\n const HOC = (props) => {\r\n const offlineHandler = useOfflineHandler({\r\n itemUri: props.itemUri,\r\n name: props.name,\r\n });\r\n return ;\r\n };\r\n HOC.displayName = `withOfflineHandler(${getDisplayName(WrappedComponent)})`;\r\n return HOC;\r\n};\r\n\r\nexport default withOfflineHandler;\r\n","import React from \"react\";\r\nimport styles from \"./SummaryAttribute.module.css\";\r\nimport { type SummaryAttributeDTO } from \"data/types\";\r\nimport ValueFactory from \"./ValueFactory\";\r\n\r\nconst SummaryAttribute = ({\r\n attribute,\r\n useDefaultStyle = false,\r\n}: {\r\n attribute: SummaryAttributeDTO,\r\n useDefaultStyle: boolean,\r\n}) => {\r\n /* istanbul ignore if */\r\n if (attribute == null || attribute.value == null) return null;\r\n return (\r\n \r\n \r\n {attribute.caption}\r\n {\" \"}\r\n \r\n \r\n );\r\n};\r\nSummaryAttribute.displayName = \"SummaryAttribute\";\r\nexport default SummaryAttribute;\r\n","import React, { useMemo } from \"react\";\r\nimport {\r\n type SummaryAttributeDTO,\r\n SummaryAttributeValueType,\r\n} from \"data/types\";\r\nimport SimpleAttribute from \"./SimpleAttribute\";\r\nimport SummaryAttribute from \"./SummaryAttribute\";\r\n\r\nexport const AttributeFactory = ({\r\n attribute,\r\n}: {\r\n attribute: SummaryAttributeDTO | Array,\r\n}) => {\r\n const useDefaultStyle = useMemo(() => {\r\n if (\r\n Array.isArray(attribute) ||\r\n /* istanbul ignore next */\r\n attribute == null ||\r\n /* istanbul ignore next */\r\n attribute.value == null\r\n ) {\r\n return true;\r\n }\r\n switch (attribute.value.$type) {\r\n case SummaryAttributeValueType.FacePile:\r\n // fall through\r\n // case SummaryAttributeValueType.Group:\r\n // fall through\r\n case SummaryAttributeValueType.User:\r\n // fall through\r\n case SummaryAttributeValueType.Progress:\r\n return false;\r\n case SummaryAttributeValueType.Enum:\r\n // fall through\r\n case SummaryAttributeValueType.VisualRules:\r\n // fall through\r\n case SummaryAttributeValueType.TextLink:\r\n // fall through\r\n case SummaryAttributeValueType.Filesize:\r\n // fall through\r\n case SummaryAttributeValueType.ReactElement:\r\n // fall through\r\n default:\r\n return true;\r\n }\r\n }, [attribute]);\r\n return Array.isArray(attribute) ? (\r\n \r\n ) : (\r\n \r\n );\r\n};\r\nAttributeFactory.displayName = \"AttributeFactory\";\r\n\r\nconst Attributes = ({\r\n attributes,\r\n className,\r\n style,\r\n}: {\r\n attributes: Array>,\r\n className?: string,\r\n style?: CSStyleDefinition,\r\n}) => (\r\n
\r\n {attributes.map((attribute, index) => (\r\n \r\n ))}\r\n
\r\n);\r\nAttributes.displayName = \"Attributes\";\r\nexport default Attributes;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport loc from \"i18next\";\r\nimport { ParseLocation } from \"components/MapViewer/utils\";\r\nimport GeoPlaceInput from \"components/GeoPlaceInput\";\r\nimport FormGroup from \"react-bootstrap/lib/FormGroup\";\r\nimport InputGroup from \"react-bootstrap/lib/InputGroup\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport styles from \"./PlaceInput.module.css\";\r\n\r\ntype Props = {\r\n /** callback when user sets location */\r\n onChange: (location: Location) => void,\r\n};\r\n\r\n/**\r\n * MapModal's Places search input\r\n */\r\nclass PlaceInput extends PureComponent {\r\n _onChangePlace = (location: string) => {\r\n if (typeof this.props.onChange === \"function\") {\r\n const latlng = ParseLocation(location);\r\n if (latlng != null) {\r\n this.props.onChange(latlng);\r\n }\r\n }\r\n };\r\n\r\n render = () => (\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n );\r\n}\r\nexport default PlaceInput;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport Modal from \"components/Modal\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport {\r\n type MapLocationInfo,\r\n type Location,\r\n type MapEditLocationResult,\r\n} from \"data/types\";\r\nimport loc from \"i18next\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport { SupportGeoPlaceInput } from \"components/MapViewer/providerSupport\";\r\nimport MapViewer from \"components/MapViewer\";\r\nimport PlaceInput from \"./PlaceInput\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport styles from \"./MapModal.module.css\";\r\n\r\ntype Props = {\r\n /** current itemUri */\r\n itemUri: string,\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** name of provider to use\r\n * @default null retrieve default mapProvider from config.general.geo.name\r\n */\r\n mapProvider: ?string,\r\n /** callback when the user clicks the Set button\r\n * @param {MapEditLocationResult} editLocationResult latitude and longitude (or Radius, or Area) of user editing\r\n */\r\n onSet: ?(editLocationResult: MapEditLocationResult) => void,\r\n /** label to show on Button\r\n * @default common:map.setPosition\r\n */\r\n setButtonLabel?: string,\r\n /** list of locations (markers / areas) to show on the map */\r\n locations: ?Array,\r\n /** whether to render a \"center\" draggable pin marker\r\n * @default false\r\n */\r\n useMarker?: boolean,\r\n /** the current radius circle (in meters) - used by GeoRadiusInput */\r\n radius?: number,\r\n /** whether to show place input box (geocoding) */\r\n usePlaceInput?: boolean,\r\n /** optional modal title\r\n * @default {string} common:map.title\r\n */\r\n title?: string,\r\n};\r\n\r\ntype State = {\r\n viewerLoaded: boolean,\r\n};\r\n\r\nclass MapModal extends PureComponent {\r\n mapRef: { current: null | MapViewer };\r\n\r\n static defaultProps = {\r\n usePlaceInput: true,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.mapRef = React.createRef();\r\n this.state = {\r\n viewerLoaded: false,\r\n };\r\n }\r\n\r\n _onSet = () => {\r\n /* istanbul ignore else */\r\n if (this.mapRef != null && this.mapRef.current != null) {\r\n const editLocation = this.mapRef.current.GetEditLocationResult();\r\n /* istanbul ignore else */\r\n if (typeof this.props.onSet === \"function\")\r\n this.props.onSet(editLocation);\r\n this.props.close();\r\n }\r\n };\r\n\r\n _onChangeFromPlaceInput = (location: Location) =>\r\n this.mapRef.current.SetCenterMarker(location);\r\n\r\n _showGeoInput = (): boolean =>\r\n this.props.usePlaceInput === true &&\r\n SupportGeoPlaceInput() &&\r\n this.props.useMarker === true &&\r\n this.props.locations != null &&\r\n this.props.locations.length > 0 &&\r\n this.props.locations[0].allowEdit !== false;\r\n\r\n _onViewerLoad = (success: boolean) =>\r\n this.setState({ viewerLoaded: success });\r\n\r\n render = () => (\r\n \r\n \r\n \r\n {\" \"}\r\n {this.props.title || loc.t(\"common:map.title\")}\r\n \r\n \r\n \r\n \r\n \r\n {this.state.viewerLoaded && typeof this.props.onSet === \"function\" && (\r\n \r\n {this._showGeoInput() && (\r\n \r\n )}\r\n \r\n {this.props.setButtonLabel ||\r\n loc.t(\"common:map.setPosition\")}\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\nMapModal.displayName = \"MapModal\";\r\nexport default MapModal;\r\nexport const openMapModal = createModal(MapModal);\r\n","import React, { PureComponent, type Node } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { togglesChangeAction, persistTogglesAction } from \"data/actions\";\r\nimport { getDisplayName } from \"data/constants\";\r\nimport { type ToggleDTO } from \"data/types\";\r\nimport getToggles from \"data/toggles.js\";\r\nimport immutable from \"object-path-immutable\";\r\nimport queryString from \"data/queryString\";\r\nimport isEqual from \"lodash/isEqual\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\ntype Props = {\r\n /** Current URL location */\r\n location?: Location,\r\n /** Selected Toggles from props */\r\n toggles?: Array,\r\n /** Selected Toggles from Redux */\r\n selectedToggles?: Array,\r\n /** Dispatch Redux actions */\r\n dispatch: Dispatch,\r\n /** Viewname from props */\r\n viewName?: string,\r\n};\r\n\r\ntype State = {\r\n toggles: ?ToggleDTO,\r\n};\r\n\r\ntype Config = {\r\n viewName?: string,\r\n};\r\n\r\n// will manage initially loading default localized toggles\r\n// and changing local state based on selectedToggles\r\nconst TogglesHandler =\r\n ({ viewName }: Config): Node =>\r\n (WrappedComponent: ReactClass) => {\r\n class PP extends PureComponent {\r\n static displayName = `TogglesHandler(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n toggles: getToggles(viewName || props.viewName),\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n // if first time (selectedTogglesSelector has empty state)\r\n /* istanbul ignore else */\r\n if (\r\n this.props.selectedToggles === undefined &&\r\n this.state.toggles !== undefined\r\n ) {\r\n this.props.dispatch(\r\n togglesChangeAction(\r\n viewName || this.props.viewName,\r\n this.state.toggles.toggles\r\n )\r\n );\r\n }\r\n\r\n this._handleTogglesFromProps();\r\n this._handleTogglesFromQueryString();\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (\r\n !isEqual(\r\n prevProps.selectedToggles,\r\n this.props.selectedToggles\r\n ) &&\r\n this.props.selectedToggles != null\r\n ) {\r\n this._updateSelectedToggles(this.props.selectedToggles);\r\n }\r\n }\r\n\r\n _handleTogglesFromProps = () =>\r\n this.props.toggles && this._handleToggles(this.props.toggles);\r\n\r\n _handleTogglesFromQueryString = () => {\r\n /* istanbul ignore else */\r\n if (!this.props.location) {\r\n return;\r\n }\r\n const qs = queryString.parse(this.props.location.search);\r\n /* istanbul ignore else */\r\n if (qs.toggles) {\r\n this._handleToggles(qs.toggles.split(\",\"));\r\n }\r\n };\r\n\r\n _handleToggles = (toggles: Array) => {\r\n const availableToggles = this.state.toggles.toggles.map(\r\n (t) => t.value\r\n );\r\n const validToggles = toggles.filter((t) =>\r\n availableToggles.includes(t)\r\n );\r\n if (validToggles.length < 1) {\r\n const msg =\r\n \"[TogglesHandler] Invalid toggle names provided. Please read the docs to setup properly.\";\r\n alert(msg);\r\n console.error(\r\n msg,\r\n \"https://serviceportal.hs.ag/docs/inPoint.Web/docs/feature-integration-miniviews.html#view-toggles\"\r\n );\r\n } else {\r\n /* istanbul ignore else */\r\n if (validToggles.length !== toggles.length) {\r\n console.warn(\r\n \"[TogglesHandler] Not all provided toggles can be set\",\r\n \"https://serviceportal.hs.ag/docs/inPoint.Web/docs/feature-integration-miniviews.html#view-toggles\"\r\n );\r\n }\r\n /* istanbul ignore else */\r\n if (!isEqual(this.props.selectedToggles, validToggles)) {\r\n //this._updateSelectedToggles(validToggles);\r\n const newToggles =\r\n this._getTogglesBySelected(validToggles);\r\n this.props.dispatch(\r\n persistTogglesAction(\r\n viewName || this.props.viewName,\r\n newToggles\r\n )\r\n );\r\n }\r\n }\r\n };\r\n\r\n _getTogglesBySelected = (selectedToggles: Array) => {\r\n const { toggles } = this.state;\r\n if (\r\n toggles === null ||\r\n toggles === undefined ||\r\n toggles.toggles === null\r\n )\r\n return;\r\n\r\n return toggles.toggles.map((toggle) => {\r\n return immutable.set(\r\n toggle,\r\n \"isSelected\",\r\n selectedToggles.includes(toggle.value)\r\n );\r\n });\r\n };\r\n\r\n setToggles = (toggles: ?ToggleDTO) => {\r\n this.setState({ toggles }, () => {\r\n if (toggles !== undefined && toggles !== null)\r\n this.props.dispatch(\r\n persistTogglesAction(\r\n viewName || this.props.viewName,\r\n toggles.toggles\r\n )\r\n );\r\n });\r\n };\r\n\r\n _updateSelectedToggles = (selectedToggles: Array) => {\r\n const newToggles = this._getTogglesBySelected(selectedToggles);\r\n if (newToggles == null) return;\r\n const { toggles } = this.state;\r\n this.setState({\r\n toggles: immutable.set(toggles, \"toggles\", newToggles),\r\n });\r\n };\r\n\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n }\r\n\r\n const mapStateToProps = (state, ownProps) => ({\r\n selectedToggles: s.selectedTogglesSelector(\r\n state,\r\n viewName || ownProps.viewName\r\n ),\r\n ...ownProps,\r\n });\r\n\r\n return connect(mapStateToProps)(PP);\r\n };\r\n\r\nexport default TogglesHandler;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\n\r\nconst initialState = {\r\n nodes: [],\r\n status: Constants.NONE,\r\n error: undefined,\r\n isRoot: undefined,\r\n isBrowsable: undefined,\r\n totalCount: 0,\r\n};\r\n\r\nconst treeReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.TREE_FETCH_REQUEST:\r\n return {\r\n ...state,\r\n itemUri: action.payload.itemUri,\r\n status: action.payload.status,\r\n // ...action.payload,\r\n };\r\n case actionTypes.TREE_FETCH_RESULT:\r\n return { ...state, ...action.payload };\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default treeReducer;\r\n\r\n// ------ selectors\r\n\r\nexport const treeNodesSelector = (state: Object) => state.tree.nodes;\r\nexport const treeStatusSelector = (state: Object) => state.tree.status;\r\nexport const treeErrorSelector = (state: Object) => state.tree.error;\r\nexport const treeIsRootSelector = (state: Object) => !!state.tree.isRoot;\r\nexport const treeIsBrowsableSelector = (state: Object) =>\r\n state.tree.isBrowsable;\r\nexport const treeTotalCountSelector = (state: Object) => state.tree.totalCount;\r\n","// @flow\r\nimport { type ConstantsEnum } from \"./constants\";\r\nimport { toast } from \"react-toastify\";\r\n\r\nexport type Dictionary = { [key: K]: T };\r\n\r\n// --------- ApiCatalog\r\n\r\nexport const HttpMethod = {\r\n GET: \"GET\", // default\r\n PUT: \"PUT\",\r\n DELETE: \"DELETE\",\r\n POST: \"POST\",\r\n HEAD: \"HEAD\",\r\n};\r\nexport type HttpMethodEnum = $Values;\r\n\r\nexport const ContentType = {\r\n NONE: -1,\r\n AUTO: 0, // default (identify json / text by Response.ContentType)\r\n JSON: 1,\r\n BLOB: 2,\r\n TEXT: 3,\r\n};\r\nexport type ContentTypeEnum = $Values;\r\n\r\n// https://developers.google.com/web/tools/workbox/modules/workbox-strategies\r\nexport const CacheStrategy = {\r\n None: -1,\r\n StaleWhileRevalidate: 0,\r\n CacheFirst: 1,\r\n NetworkFirst: 2,\r\n NetworkOnly: 3,\r\n CacheOnly: 4,\r\n};\r\nexport type CacheStrategyEnum = $Values;\r\n\r\n/** Default Cache Name used by service-worker */\r\nexport const DEFAULT_CACHE_NAME = \"api\";\r\n\r\nexport type OfflineSettings = {\r\n /**\r\n * Whether offline editing is allowed. Will then be by data/offline/offlineQueue.js\r\n * @default {boolean} false\r\n */\r\n allowEdit?: boolean,\r\n /**\r\n * Whether to show user a toast that item has been queued\r\n * @default {boolean} false\r\n */\r\n showToast?: boolean,\r\n /**\r\n * Result object to return when called offline\r\n */\r\n transformer?: (params: Object) => Object,\r\n};\r\n\r\nexport type CacheSettings = {\r\n /**\r\n * Workbox Cache strategy to use\r\n * @description https://developers.google.com/web/tools/workbox/modules/workbox-strategies\r\n * @default CacheStrategy.NetworkOnly\r\n * @type {CacheStrategyEnum}\r\n */\r\n strategy?: CacheStrategyEnum,\r\n\r\n /**\r\n * Specify which params to use when creating the cacheKey\r\n */\r\n keyParams?: (params) => Object,\r\n\r\n // ApiManagerMakeAvailableOffline will transform result before caching\r\n transformer?: (data: Object) => Object,\r\n\r\n depsAnalyzer: (data: FormResultDTO, params: Object) => Array,\r\n};\r\n\r\nexport type ApiMethod = {\r\n url: string,\r\n /**\r\n * @default HttpMethod.GET\r\n * @type {HttpMethodEnum}\r\n */\r\n method?: HttpMethodEnum,\r\n params?: Object,\r\n contentType: ContentTypeEnum,\r\n cache?: boolean | CacheSettings,\r\n offline?: OfflineSettings,\r\n};\r\n\r\nexport type ApiMethodRef = {\r\n name: string,\r\n params?: Object,\r\n signal?: AbortSignal,\r\n};\r\n\r\n// const OperationTypeEnum = {\r\n// ReadOnly: 0,\r\n// WriteOnly: 1,\r\n// WriteResilient: 2,\r\n// }\r\n// when resilient -> connect to which Readonly method should return it (+transformer)\r\n\r\nexport const CustomHttpHeader = {\r\n /** name of HTTP header for CacheStrategy passed by ApiManager and parsed by service-worker.js */\r\n CacheStrategy: \"X-WB-CACHE-STRATEGY\",\r\n /** name of HTTP header for custom CacheKey passed by ApiManager and parsed by service-worker.js */\r\n CacheKey: \"X-WB-CACHE-KEY\",\r\n /** used by the server to correlate logging events (in Root.js) */\r\n CorrelationId: \"x-correlation-id\",\r\n /** Bearer token */\r\n Authorization: \"authorization\",\r\n /** instead not using standard Authorization header */\r\n CustomAuthorization: \"X-inPoint-Auth\",\r\n /** used to pass original secureParams token */\r\n SecureParams: \"X-SECURE-PARAMS\",\r\n /** \"1\"=running /mini/ view, \"0\"=full */\r\n MiniView: \"X-MINI-VIEW\",\r\n /** itemUri when storing in offline queue */\r\n OfflineItemUri: \"x-wb-api-uri\",\r\n /** apiCatalog.name ref when storing in offline queue */\r\n OfflineApiName: \"x-wb-api-name\",\r\n /** used by the server/Controllers to identify offline requests; \"true\" when online */\r\n OfflineSync: \"x-wb-sync\",\r\n};\r\n\r\n// --------- Offline\r\n\r\nexport type OfflineQueueItem = {\r\n name: string,\r\n params?: any,\r\n retries?: number,\r\n error?: any,\r\n};\r\n\r\nexport const OfflineQueueItemType = {\r\n ApiCall: \"api\",\r\n UppyFile: \"uppy\",\r\n};\r\nexport type OfflineQueueItemTypeEnum = $Values;\r\n\r\n// --------- Toggles\r\n\r\nexport type ToggleItemDTO = {\r\n value: string,\r\n text: string,\r\n icon?: string,\r\n count?: number,\r\n status?: string,\r\n isSelected: boolean,\r\n isHidden?: boolean,\r\n isDisabled?: boolean,\r\n};\r\n\r\nexport type ToggleDTO = {\r\n name: string,\r\n isMultiple: boolean,\r\n toggles: Array,\r\n};\r\n\r\n// --------- SiteItems\r\n\r\nexport const SiteType = {\r\n NotSet: 0,\r\n GlobalSites: 1,\r\n MySites: 2,\r\n SharedSites: 3,\r\n RecycleBin: 4,\r\n MailBox: 5,\r\n AUSites: 6,\r\n};\r\nexport type SiteTypeEnum = $Values;\r\n\r\nexport const ViewNameType = {\r\n folder: 0,\r\n flat: 1,\r\n mailbox: 2,\r\n};\r\nexport type ViewNameTypeEnum = $Values;\r\n\r\nexport const SystemWebDavName = {\r\n GlobalSite: \"GLOBALSITE\",\r\n MySite: \"MYSITE\",\r\n SharedSite: \"SHARESITE\",\r\n MailBox: \"MAILBOX\",\r\n RecycleBin: \"RECYCLEBIN\",\r\n};\r\nexport type SystemWebDavNameEnum = $Values;\r\n\r\nexport const SidebarItemSource = {\r\n System: 0,\r\n Custom: 1,\r\n User: 2,\r\n Offline: 3,\r\n};\r\nexport type SidebarItemSourceEnum = $Values;\r\n\r\nexport type SidebarItemDTO = {\r\n id?: string,\r\n source: SidebarItemSourceEnum,\r\n webDavName: SystemWebDavNameEnum | string,\r\n caption: string,\r\n itemUri: string,\r\n mini: boolean,\r\n siteType: SiteTypeEnum,\r\n viewName: ViewNameTypeEnum,\r\n shouldBeVisible?: Array,\r\n};\r\n\r\n// --------- Breadcrumb\r\n\r\nexport type BreadcrumbPartDTO = {\r\n text: string,\r\n itemUri: string,\r\n};\r\n\r\nexport type BreadcrumbResultDTO = {\r\n text: string,\r\n siteType: SiteTypeEnum,\r\n parts: Array,\r\n text: string,\r\n itemUri?: string,\r\n version?: number,\r\n formatId: number,\r\n};\r\n\r\n// --------- NavigationItems\r\n\r\nexport const NavigationItemType = {\r\n Home: \"home\",\r\n News: \"news\",\r\n Report: \"report\",\r\n Search: \"search\",\r\n SearchResult: \"searchResult\",\r\n Wf: \"wf\",\r\n Upload: \"upload\",\r\n CommandAction: \"commandAction\",\r\n};\r\nexport type NavigationItemTypeEnum = $Values;\r\n\r\nexport type CommandActionPropsDTO = {\r\n name: string,\r\n props?: Object,\r\n};\r\n\r\nexport type NavigationItemDTO = {\r\n id: string,\r\n type: NavigationItemTypeEnum,\r\n icon: ?string,\r\n title: ?string,\r\n description: ?string,\r\n href: ?string,\r\n commandAction: ?CommandActionPropsDTO,\r\n shouldBeVisible?: Array,\r\n};\r\n\r\n// ------ Attributes\r\n\r\nexport const SummaryAttributeValueType = {\r\n FacePile: \"face-pile\",\r\n Group: \"group\",\r\n User: \"user\",\r\n Progress: \"progress\",\r\n VisualRules: \"visual-rules\",\r\n Enum: \"enum\",\r\n TextLink: \"text-link\",\r\n Filesize: \"filesize\",\r\n ReactElement: \"react-element\",\r\n};\r\n\r\nexport type SummaryAttributeValueTypeEnum = $Values<\r\n typeof SummaryAttributeValueType\r\n>;\r\nexport type SummaryAttributeValue = {\r\n type: SummaryAttributeValueTypeEnum,\r\n};\r\n\r\nexport type SummaryAttributeDTO = {\r\n caption: string,\r\n name?: string,\r\n value: SummaryAttributeValue,\r\n format?: string,\r\n};\r\n\r\nexport const PrincipalType = {\r\n User: \"user\",\r\n Group: \"group\",\r\n};\r\n\r\nexport type PrincipalTypeEnum = $Values;\r\n\r\nexport const SharePrincipalType = {\r\n User: \"user\",\r\n Group: \"group\",\r\n Share: \"share\",\r\n};\r\nexport type SharePrincipalTypeEnum = $Values;\r\n\r\ntype IPrincipalDTO = {\r\n $type: PrincipalTypeEnum,\r\n id: int,\r\n displayName: string,\r\n};\r\n\r\ntype ISharePrincipalDTO = {\r\n $type: SharePrincipalTypeEnum,\r\n};\r\n\r\nexport type GroupPrincipalDTO = IPrincipalDTO & ISharePrincipalDTO;\r\n\r\nexport type UserPrincipalDTO = IPrincipalDTO &\r\n ISharePrincipalDTO & {\r\n description?: string,\r\n email?: string,\r\n };\r\n\r\nexport type SummaryAttributeValuePrincipal =\r\n | UserPrincipalDTO\r\n | GroupPrincipalDTO;\r\n\r\nexport type SummaryAttributeValueProgress = SummaryAttributeValue & {\r\n progress: Array,\r\n};\r\n\r\nexport type SummaryAttributeValueFacePile = SummaryAttributeValue & {\r\n total?: number,\r\n onMoreCommand?: CommandActionPropsDTO,\r\n pile: Array,\r\n};\r\n\r\nexport type SummaryAttributeValueTextLink = SummaryAttributeValue & {\r\n value: string,\r\n rawValue?: string,\r\n caption?: string,\r\n};\r\n\r\nexport type SummaryAttributeValueFilesize = SummaryAttributeValue & {\r\n value: string,\r\n rawValue?: string,\r\n};\r\n\r\nexport type SummaryAttributeValueReactElement = SummaryAttributeValue & {\r\n element: React.ReactElement,\r\n};\r\n\r\n// export type SummaryAttributeValueUser = SummaryAttributeValuePrincipal & {\r\n// }\r\n\r\n// export type SummaryAttributeValueGroup = SummaryAttributeValuePrincipal & {\r\n// }\r\n\r\nexport type IconDTO = {\r\n iconUrl: string,\r\n iconSize?: Array,\r\n};\r\n\r\nexport type MarkerDTO = IconDTO & {\r\n iconAnchor?: Array,\r\n};\r\nexport type SummaryAttributeValueVisualRules = {\r\n $type: SummaryAttributeValueTypeEnum,\r\n value: any,\r\n icon?: IconDTO,\r\n marker?: MarkerDTO,\r\n color?: string,\r\n};\r\n\r\n// --------- UserInfo\r\n\r\n// what we actually received from Server.IOfflineService\r\nexport type OfflineItemDTO = {\r\n id: string,\r\n itemUri: string,\r\n isDoc: boolean,\r\n lastUpdate: ?Date,\r\n breadcrumb: BreadcrumbResultDTO,\r\n};\r\n\r\nexport const OfflineSyncStatus = {\r\n Unknown: \"Unknown\",\r\n Synced: \"Synced\",\r\n SyncedWithErrors: \"SyncedWithErrors\",\r\n Syncing: \"Syncing\",\r\n Conflict: \"Conflict\",\r\n Error: \"Error\",\r\n};\r\nexport type OfflineSyncStatusEnum = $Values;\r\n\r\n// what we actually store in our Redux-Store\r\nexport type OfflineItemStatus = OfflineItemDTO & {\r\n status: OfflineSyncStatusEnum,\r\n took?: number,\r\n at: Date,\r\n};\r\n\r\nexport type UserInfoResultDTO = {\r\n id: number,\r\n displayName: number,\r\n isAdmin: boolean,\r\n language: string,\r\n status: ConstantsEnum,\r\n wfEnabled: boolean,\r\n features: Array,\r\n sites: Array,\r\n favorites: Array,\r\n decimalSeparator: string,\r\n thousandSeparator: string,\r\n avatar: string,\r\n hasOfflineItems: boolean,\r\n};\r\n\r\n// --------- UserSettings\r\n\r\nexport type UserSettingsDTO = {\r\n language: string,\r\n};\r\n\r\nexport const NotificationType = {\r\n Toast: 0,\r\n API: 1,\r\n};\r\n\r\nexport type NotificationTypeEnum = $Values;\r\n\r\nexport type UserSettingsResultDTO = {\r\n current: UserSettingsDTO,\r\n allLanguages: Array<{ name: string, code: string }>,\r\n notification?: NotificationTypeEnum,\r\n identityChangePasswordUri?: string,\r\n identity2FaUri?: string,\r\n};\r\n\r\n// --------- Folder's Tree\r\n\r\nexport type TreeItemDTO = {\r\n elementType: number,\r\n id: number,\r\n itemUri: string,\r\n numberOfChildren: number,\r\n webDavName: string,\r\n bc?: string,\r\n};\r\n\r\nexport type TreeDTO = {\r\n isRoot: boolean,\r\n isBrowsable: boolean,\r\n totalCount: number,\r\n items: Array,\r\n};\r\n\r\nexport const SpecialFoldersItemURIs = {\r\n SharedDocumentsUri: \"shareddocuments\",\r\n RecycledDocumentsUri: \"recycleddocuments\",\r\n RecycleBinUri: \"recyclebin\",\r\n};\r\n\r\nexport type SpecialFoldersItemURIsEnum = $Values;\r\n// --------- Item Status\r\n\r\n/** @enum {number} */\r\nexport const ItemStatuses = {\r\n /** Nothing set */\r\n Nothing: 0,\r\n /** There is an reminder on this item. */\r\n Reminder: 1,\r\n /** This item is shared. */\r\n Share: 2,\r\n /** This item has a relation to another item. */\r\n Relation: 4,\r\n /** This item has a converted PDF of itself. */\r\n PDF: 8,\r\n /** This item has at least one Workflow-Report */\r\n WFReport: 16,\r\n /** This item has a note */\r\n Note: 32,\r\n /** This item has a link to another item. (Shortcut) */\r\n Link: 64,\r\n /** When this item is an msg and it has some attachments. */\r\n MailHasAttachment: 128,\r\n /** When this item is an msg and it was replied to someone. */\r\n MailReplied: 256,\r\n /** When this item is an msg and it was forwarded to someone. */\r\n MailForwarded: 512,\r\n /** When this item is checked out. */\r\n Locked: 1024,\r\n /** When this item is has a DocTemplate applied. */\r\n Template: 2048,\r\n /** There is a subscription on this item. */\r\n Subscribed: 4096,\r\n /** This item managed via CloudSync. */\r\n CloudSync: 8192,\r\n /** This item is marked for deletion. */\r\n Deleted: 16384,\r\n /** Any of this items parents is marked for deletion. */\r\n ParentDeleted: 32768,\r\n /** This item is marked for offline access. */\r\n //Offline: TBD,\r\n};\r\n\r\nexport type ItemStatusesDTO = $Values;\r\n\r\n// --------- DocInfo\r\n\r\nexport type DocInfoResultDTO = {\r\n name: string,\r\n ext: string,\r\n size: number,\r\n hasPdf: boolean,\r\n isPdf: boolean,\r\n canPdf: boolean,\r\n isFlatAU: boolean,\r\n flags: number,\r\n itemStatus: ItemStatusesDTO,\r\n // workflow: any,\r\n};\r\n\r\nexport type DocInfoResultWithTokenDTO = DocInfoResultDTO & {\r\n token: string,\r\n};\r\n\r\n// --------- Documents\r\n\r\nexport const ListViewMode = {\r\n Thumbnails: \"Thumbnails\",\r\n List: \"List\",\r\n Grid: \"Grid\",\r\n Map: \"Map\",\r\n Calendar: \"Calendar\",\r\n};\r\nexport type ListViewModeEnum = $Keys;\r\n\r\nexport const DocListFilterOperators = {\r\n None: \"None\",\r\n Equals: \"Equals\",\r\n NotEquals: \"NotEquals\",\r\n LessThan: \"LessThan\",\r\n LessThanOrEqualsTo: \"LessThanOrEqualsTo\",\r\n GreaterThan: \"GreaterThan\",\r\n GreaterThanOrEqualsTo: \"GreaterThanOrEqualsTo\",\r\n Contains: \"Contains\",\r\n DoesNotContain: \"DoesNotContain\",\r\n //Like: \"Like\",\r\n //NotLike: \"NotLike\",\r\n StartsWith: \"StartsWith\",\r\n DoesNotStartWith: \"DoesNotStartWith\",\r\n EndsWith: \"EndsWith\",\r\n DoesNotEndWith: \"DoesNotEndWith\",\r\n Between: \"Between\",\r\n NotBetween: \"NotBetween\",\r\n DateRelative: \"DateRelative\",\r\n};\r\n\r\nexport type DocListFilterOperatorsEnum = $Keys;\r\n\r\nexport const DocListColumnType = {\r\n StringValue: \"StringValue\",\r\n WebDavName: \"WebDavName\",\r\n FileSize: \"FileSize\",\r\n IntValue: \"IntValue\",\r\n BooleanValue: \"BooleanValue\",\r\n LongValue: \"LongValue\",\r\n ShortValue: \"ShortValue\",\r\n DoubleValue: \"DoubleValue\",\r\n DecimalValue: \"DecimalValue\",\r\n SingleValue: \"SingleValue\",\r\n DateTimeValue: \"DateTimeValue\",\r\n DateTimeOffsetValue: \"DateTimeOffsetValue\",\r\n ByteValue: \"ByteValue\",\r\n ObjectValue: \"ObjectValue\",\r\n};\r\n\r\nexport type DocListColumnTypeEnum = $Keys;\r\n\r\nexport type DocColumnResultDTO = {\r\n name: string,\r\n caption: string,\r\n width: number,\r\n type: DocListColumnTypeEnum,\r\n canSort: boolean,\r\n};\r\n\r\nexport const DocsFlags = {\r\n ForceDocListSimple: 1,\r\n IsDocEditAllowed: 2,\r\n IsDocDownloadAllowed: 4,\r\n IsDocAssignmentAllowed: 8,\r\n inPointSyncIntegration: 16,\r\n IsFolderClassificationEditAllowed: 32,\r\n IsDocClassificationEditAllowed: 64,\r\n IsDocSendByEmailAllowed: 128,\r\n};\r\n\r\nexport type DocsResultDTO = {\r\n itemUri: string,\r\n pageSize: number,\r\n rowCount: number,\r\n rows: Object,\r\n cols: Array,\r\n flags: number,\r\n};\r\n\r\nexport const SortDirectionOptions = {\r\n Ascending: \"Ascending\",\r\n Descending: \"Descending\",\r\n};\r\nexport type SortDirectionEnum = $Keys;\r\n\r\nexport type DocListSortRequestDTO = {\r\n name: string,\r\n direction: SortDirectionEnum,\r\n};\r\n\r\nexport type DocListFilterRequestDTO = {\r\n operator: DocListFilterOperatorsEnum,\r\n name: string,\r\n values: Array,\r\n};\r\n\r\nexport type DocListLayout = {\r\n filters?: Array,\r\n sorts?: Array,\r\n cols?: Array,\r\n};\r\n\r\nexport const ActivityType = {\r\n create: \"create\",\r\n modifyContent: \"modifyContent\",\r\n modifyField: \"modifyField\",\r\n comment: \"comment\",\r\n locked: \"locked\",\r\n};\r\nexport type ActivityTypeEnum = $Keys;\r\n\r\nexport type ActivityFieldDTO = {\r\n caption: string,\r\n oldVal: ?string,\r\n newVal: ?string,\r\n};\r\n\r\nexport type ActivityDTO = {\r\n id: number,\r\n on: DateTime,\r\n what: ActivityTypeEnum,\r\n extras?: any,\r\n userId: number,\r\n userName: string,\r\n text: string,\r\n changes: Array,\r\n};\r\n\r\nexport const ItemNoteType = {\r\n Default: \"default\",\r\n PdfHighlight: \"pdfHighlight\",\r\n};\r\n\r\nexport type ItemNoteTypeEnum = $Values;\r\n\r\nexport const ItemNoteTypeIcon = {\r\n default: \"comment-o\",\r\n pdfHighlight: \"commenting-o\",\r\n};\r\n\r\nexport type IItemNoteExtras = {\r\n $type: ItemNoteTypeEnum,\r\n};\r\n\r\nexport type ItemNoteExtrasDefault = IItemNoteExtras & {\r\n data: Array,\r\n};\r\n\r\nexport const PdfShapeType = {\r\n Rectangle: \"rectangle\",\r\n};\r\n\r\nexport type PdfShapeTypeEnum = $Values;\r\n\r\nexport type IPdfShape = {\r\n $type: PdfShapeTypeEnum,\r\n};\r\n\r\nexport type PdfShapeRectangle = {\r\n scale: number,\r\n pageNumber: number,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n};\r\n\r\nexport type ItemNoteExtrasPdfHighlight = IItemNoteExtras & {\r\n shapes: Array,\r\n};\r\n\r\n// export type ItemNoteDTO = {\r\n// itemUri: string,\r\n// text: string,\r\n// id?: number,\r\n// parentId?: number,\r\n// extras?: IItemNoteExtras,\r\n// date?: DateTime,\r\n// creationDate?: DateTime,\r\n// creator?: IPrincipalDTO,\r\n// };\r\n\r\nexport const CleanupKeepVersionType = {\r\n All: \"all\",\r\n Last: \"last\",\r\n PerDay: \"perDay\",\r\n PerUser: \"perUser\",\r\n};\r\nexport type CleanupKeepVersionTypeEnum = $Keys;\r\n\r\nexport type CleanupKeepInfoDTO = {\r\n type: CleanupKeepVersionTypeEnum,\r\n count: number,\r\n};\r\n\r\nexport const RetentionType = {\r\n Default: \"default\",\r\n Forever: \"forever\",\r\n Custom: \"custom\",\r\n};\r\nexport type RetentionTypeEnum = $Keys;\r\n\r\nexport type RetentionInfoDTO = {\r\n type: RetentionTypeEnum,\r\n months: number,\r\n};\r\n\r\nexport type ActivitiesDTO = {\r\n items: Array,\r\n keep: CleanupKeepInfoDTO,\r\n retention: RetentionInfoDTO,\r\n};\r\n// --------- Form\r\n\r\nexport type LastChangeState = {\r\n ns?: string,\r\n name: string,\r\n value: Object,\r\n};\r\n\r\nexport const FormLookupType = {\r\n ip: 0,\r\n ea_lookup: 1,\r\n ea_ftlookup: 2,\r\n sf_ftlookup: 3,\r\n};\r\nexport type FormLookupTypeEnum = $Values;\r\n\r\nexport type FormLookupValue = {\r\n T: string,\r\n K?: string,\r\n};\r\n\r\n// export type GetLookupValuesRequestDTO = {\r\n// keyword: string,\r\n// pageNum: number,\r\n// itemUri: string,\r\n// name: string,\r\n// lookupType: FormLookupTypeEnum,\r\n// valueType: SearchValueTypeEnum,\r\n// values: any\r\n// }\r\n\r\nexport type LookupValuesResultDTO = {\r\n values: Array,\r\n hasMore: boolean,\r\n};\r\n\r\nexport const NewFormType = {\r\n Document: \"Document\",\r\n Folder: \"Folder\",\r\n};\r\nexport type NewFormTypeEnum = $Values;\r\n\r\nexport const ExtraAttributeEmbeddedGridRowStatus = {\r\n None: 0,\r\n Updated: 1,\r\n Added: 2,\r\n Deleted: 3,\r\n};\r\nexport type ExtraAttributeEmbeddedGridRowStatusEnum = $Values<\r\n typeof ExtraAttributeEmbeddedGridRowStatus\r\n>;\r\n\r\nexport type ExtraAttributeEmbeddedGridColumnDTO = {\r\n name: string,\r\n visible: boolean,\r\n width: number,\r\n};\r\n\r\nexport type ExtraAttributesEmbeddedGridDTO = {\r\n columns: Array,\r\n //rows: Dictionary>,\r\n rows: Array>,\r\n pageSize: number,\r\n showFilter: boolean,\r\n sortColumn: string,\r\n sortDirection: SortDirectionEnum,\r\n seqIdColumn: number,\r\n};\r\n\r\nexport type ExtraAttributeDataAuditLogDTO = {\r\n deletedIds: Array,\r\n updatedRows: Object,\r\n newRows: Array>,\r\n};\r\n\r\nexport const DateTimeFormat = {\r\n Time: \"Time\",\r\n LongTime: \"LongTime\",\r\n DateTime: \"DateTime\",\r\n DateLongTime: \"DateLongTime\",\r\n Date: \"Date\",\r\n //For non-formatted DateTimes, e.g. Reminder, Share, DocListFilter\r\n JsonDate: \"JsonDate\",\r\n JsonDateEnd: \"JsonDateEnd\", //Time should point to end of day\r\n JsonDateTime: \"JsonDateTime\",\r\n};\r\n\r\nexport type DateTimeFormatValues = $Values;\r\n\r\ntype FieldDefinitionBaseDTO = {\r\n id: number,\r\n header?: string,\r\n name: string,\r\n value: null | any | ExtraAttributesEmbeddedGridDTO,\r\n};\r\n\r\ntype FieldDefinitionWithExtrasBaseDTO = FieldDefinitionBaseDTO & {\r\n ro: boolean,\r\n req: boolean,\r\n format: string, // CustomFormats enum\r\n extra?: ?Object,\r\n};\r\n\r\nexport type FieldDefinitionDTO = FieldDefinitionWithExtrasBaseDTO & {\r\n width: number,\r\n height: number,\r\n};\r\n\r\nexport type FormFieldDTO = FieldDefinitionWithExtrasBaseDTO & {\r\n max?: number,\r\n};\r\n\r\nexport const ItemLinkType = {\r\n Manual: 0,\r\n WorkflowReport: 1,\r\n Shortcut: 2,\r\n};\r\nexport type ItemLinkTypeEnum = $Values;\r\n\r\ntype IFormResultDTO = {\r\n formatId: number,\r\n isDoc: boolean,\r\n name: string,\r\n layoutXml?: string,\r\n};\r\n\r\nexport type FormResultDTO = IFormResultDTO & {\r\n attributes?: Array,\r\n fields: Array,\r\n formTitle?: string,\r\n grids?: Array,\r\n labelWidth: number,\r\n isEditAllowed: boolean,\r\n status: ItemStatusesDTO,\r\n etag: string,\r\n};\r\n\r\nexport type LockResultDTO = {\r\n lockedById: number,\r\n lockedByName: string,\r\n lockedOnMachine: string,\r\n lockedDate: string,\r\n};\r\n\r\nexport type DocFormResultDTO = FormResultDTO & {\r\n isLocked: boolean,\r\n lockInfo?: LockResultDTO,\r\n};\r\n\r\nexport type FormFieldProps = {\r\n name?: string,\r\n header: string,\r\n value: null | any | ExtraAttributesEmbeddedGridDTO,\r\n width?: number,\r\n userid?: number,\r\n marker?: any,\r\n isGridCell?: boolean,\r\n formatId?: number,\r\n};\r\n\r\nexport type FormFieldInfo = {\r\n Component: React.Component,\r\n props: FormFieldProps,\r\n};\r\n\r\n// --------- Workflow\r\n\r\nexport const WorkflowProvider = {\r\n inPointWorkflow: \"inPointWf\",\r\n AxonIvy: \"AxonIvy\",\r\n};\r\nexport type WorkflowProviderEnum = $Values;\r\n\r\nexport const WorkflowType = {\r\n Unknown: \"unknown\",\r\n Routing: \"routing\",\r\n Process: \"process\",\r\n};\r\nexport type WorkflowTypeEnum = $Values;\r\n\r\nexport type WorkflowDTO = {\r\n provider: WorkflowProviderEnum,\r\n id: string,\r\n icon?: string,\r\n name: string,\r\n description: string,\r\n startLink: string,\r\n deadline?: string,\r\n progress?: number,\r\n itemUri?: string,\r\n};\r\n\r\nexport type WorkflowAction = {\r\n name: string,\r\n icon?: string,\r\n caption: string,\r\n description?: string,\r\n page: string,\r\n};\r\n\r\nexport type WorkflowInfoDTO = {\r\n provider: WorkflowProviderEnum,\r\n id: string,\r\n name: string,\r\n progress?: number,\r\n status?: string,\r\n attributes?: Array,\r\n actions?: Array,\r\n};\r\n\r\n// --------- Search\r\n\r\nexport const SearchOperator = {\r\n NotSet: 0,\r\n Contextor: 1,\r\n From: 2,\r\n To: 3,\r\n FromTo: 4,\r\n FromToWithTime: 5,\r\n FromWithTime: 6,\r\n ToWithTime: 7,\r\n Equals: 8,\r\n EqualsWithTime: 9,\r\n RelativeDate: 10,\r\n // #46483 remove not working date searchform Operators\r\n // FromRelativeTo: 11,\r\n // FromRelativeToWithTime: 12,\r\n // FromToRelative: 13,\r\n // FromWithTimeToRelative: 14,\r\n FromRelative: 15,\r\n ToRelative: 16,\r\n Contains: 17,\r\n StartsWith: 18,\r\n EndsWith: 19,\r\n GeoRadius: 20,\r\n GeoArea: 21,\r\n GeoRadiusIntersect: 22,\r\n GeoRadiusWithin: 23,\r\n GeoAreaIntersect: 24,\r\n GeoAreaWithin: 25,\r\n GeoAreaPoint: 26,\r\n ContextorContains: 27,\r\n};\r\nexport type SearchOperatorEnum = $Values;\r\n\r\nexport const SearchNodeType = {\r\n AllNodes: 0,\r\n LeafNode: 1,\r\n CustomNode: 2,\r\n Auto: 3,\r\n};\r\nexport type SearchNodeTypeEnum = $Values;\r\n\r\nexport type SearchFormInfoDTO = {\r\n id: number,\r\n name: string,\r\n // scope: string,\r\n // itemUri: string,\r\n // breadcrumb: string,\r\n // image: string\r\n};\r\n\r\nexport const SearchScope = {\r\n AllSites: 0,\r\n AllFolders: 1,\r\n CurrentFolder: 2,\r\n};\r\nexport type SearchScopeEnum = $Values;\r\n\r\nexport const SearchValueType = {\r\n NotSet: 0,\r\n String: 1,\r\n RelativeDate: 2,\r\n DateTime: 3,\r\n FileSize: 4,\r\n ItemType: 5,\r\n Decimal: 6,\r\n GeoPoint: 7,\r\n GeoArea: 8,\r\n StringFieldOnly: 9,\r\n DecimalFieldOnly: 10,\r\n Link: 11,\r\n};\r\nexport type SearchValueTypeEnum = $Values;\r\n\r\nexport type SearchBucketValueDTO = {\r\n value: string | number,\r\n caption?: string,\r\n count?: number,\r\n};\r\n\r\nexport type SearchBucketDTO = {\r\n visible?: boolean,\r\n name: string,\r\n caption?: string,\r\n hideName?: boolean,\r\n hideMenu?: boolean,\r\n hideAllReset?: boolean,\r\n selected?: Array,\r\n valueType?: SearchValueTypeEnum,\r\n buckets: Array,\r\n};\r\n\r\nexport const SearchRequestType = {\r\n Favorite: 0,\r\n Recent: 1,\r\n Freetext: 2,\r\n Form: 3,\r\n Url: 4,\r\n};\r\nexport type SearchRequestTypeEnum = $Values;\r\n\r\nexport type SearchFilterDTO = {\r\n name: string,\r\n valueType: SearchValueTypeEnum,\r\n value: any,\r\n op: SearchOperatorEnum,\r\n boostLeafNode?: number,\r\n nodeType?: SearchNodeTypeEnum,\r\n};\r\n\r\nexport type SearchSortDTO = {\r\n name: string,\r\n valueType: SearchValueTypeEnum,\r\n direction: SortDirectionEnum,\r\n};\r\n\r\nexport type SearchRequestDTO = {\r\n id: number,\r\n name: ?string,\r\n searchType: SearchRequestTypeEnum,\r\n scope?: SearchScopeEnum,\r\n isCustom: boolean,\r\n searchText?: ?string,\r\n pageNum: number,\r\n itemUri?: string,\r\n filters: Array,\r\n sorts: Array,\r\n fakeUris?: Array,\r\n};\r\n\r\nexport const SearchItemType = {\r\n Favorite: 0,\r\n Recent: 1,\r\n Freetext: 2,\r\n Form: 3,\r\n Url: 4, // passing Url parameters\r\n};\r\nexport type SearchItemTypeEnum = $Values;\r\n\r\nexport type SearchItemDTO = {\r\n name: string,\r\n searchText: ?string,\r\n scope?: SearchScopeEnum,\r\n id: number,\r\n searchType: SearchItemTypeEnum,\r\n param?: Array,\r\n nodeType?: SearchNodeTypeEnum,\r\n\r\n // TODO those do not exist in server-side object!\r\n itemUri?: string,\r\n filters?: Array,\r\n sorts?: Array,\r\n fakeUris?: Array,\r\n};\r\n\r\nexport type SAYTOptionDTO = {\r\n /* required by react-select */\r\n className?: string,\r\n label: string,\r\n /* our custom values */\r\n count: number,\r\n item: SearchItemDTO,\r\n};\r\n\r\nexport type SearchResultRowDTO = {\r\n title: string,\r\n itemUri: string,\r\n isDoc: boolean,\r\n elementType: ?number,\r\n ext: string,\r\n summary: ?string,\r\n foundTerms: ?Array,\r\n breadcrumb: BreadcrumbResultDTO,\r\n attributes: Array,\r\n};\r\n\r\nexport type SearchResultDTO = {\r\n pageSize: number,\r\n pageNum: number,\r\n totalCount: number,\r\n rows: Object,\r\n aggregations?: Array,\r\n autoBrowseToItem?: boolean,\r\n};\r\n\r\nexport type SearchCountResultDTO = {\r\n totalCount: number,\r\n totalTime: number,\r\n aggregations?: Array,\r\n};\r\n\r\n// searchForms\r\n\r\nexport type SearchFieldDefinitionDTO = FieldDefinitionBaseDTO & {\r\n hidden?: boolean,\r\n valueType: SearchValueTypeEnum,\r\n op: SearchOperatorEnum,\r\n boostLeafNode?: number,\r\n nodeType?: SearchNodeTypeEnum,\r\n};\r\n\r\nexport type SearchFormResultDTO = IFormResultDTO & {\r\n // totalCount: number,\r\n // singleItemUri?: string,\r\n attributes?: Array,\r\n sort?: Array,\r\n};\r\n\r\n// --------- Cards\r\n\r\nexport const CardType = {\r\n Rec: \"rec\",\r\n Fav: \"fav\",\r\n Task: \"task\",\r\n Action: \"action\",\r\n};\r\nexport type CardTypeEnum = $Values;\r\n\r\nexport const CardItemType = {\r\n Folder: \"folder\",\r\n Doc: \"doc\",\r\n Search: \"search\",\r\n Task: \"task\",\r\n SearchForm: \"searchForm\",\r\n CommandAction: \"commandAction\",\r\n ArchiveTarget: \"archiveTarget\",\r\n};\r\nexport type CardItemTypeEnum = $Values;\r\n\r\nexport type CardItemResultDTO = {\r\n id: string,\r\n type: CardTypeEnum,\r\n itemtype: CardItemTypeEnum,\r\n siteType: SiteTypeEnum,\r\n image: ?string,\r\n name: string,\r\n desc?: string,\r\n uri: ?string,\r\n searchItem?: SearchItemDTO, // only for search\r\n bcText?: string, // only for recent folders,\r\n commandAction?: CommandActionPropsDTO,\r\n extras?: Object, // any additional properties\r\n};\r\n\r\nexport type ItemActionViewConfig = {\r\n name: string,\r\n header?: string,\r\n};\r\n\r\nexport type ItemActionConfigBase = {\r\n id?: string,\r\n visible?: boolean,\r\n itemUriRegex?: string,\r\n loc?: string, //only used in data/itemActions.js\r\n name: string,\r\n desc?: string,\r\n icon?: string,\r\n shouldBeVisible?: Array,\r\n views?: Array,\r\n view?: ItemActionViewConfig,\r\n};\r\n\r\nexport type ItemActionCategoryConfig = ItemActionConfigBase & {\r\n renderHeader?: boolean,\r\n expanded?: boolean,\r\n};\r\n\r\nexport type ItemActionConfig = ItemActionConfigBase & {\r\n category?: string,\r\n commandAction?: CommandActionPropsDTO,\r\n};\r\n\r\nexport type ItemActionsConfigDTO = {\r\n categories: Array,\r\n actions: Array,\r\n};\r\n\r\n// ---------- Errors\r\n\r\nexport type ApiErrorEventId = {\r\n id: number,\r\n name: string,\r\n};\r\n\r\nexport type ApiErrorResult = {\r\n detail: string | null,\r\n message: string,\r\n isError: boolean,\r\n eventId: ApiErrorEventId,\r\n extra?: any,\r\n};\r\n\r\nexport type ApiError = {\r\n data: ApiErrorResult,\r\n};\r\n\r\n// ----------- NewsFeed\r\n\r\nexport type NewsFeedItemDTO = {\r\n date: Object,\r\n title: string,\r\n itemStatus: ItemStatusesDTO,\r\n name: string,\r\n ext: string,\r\n category: string,\r\n itemUri: string,\r\n isDoc: boolean,\r\n elementType: number,\r\n breadcrumb: BreadcrumbResultDTO,\r\n summary: string,\r\n};\r\n\r\nexport type NewsFeedDTO = {\r\n items: Array,\r\n};\r\n\r\nexport type SubscribeResponseDTO = {\r\n id: number,\r\n name: string,\r\n itemUri: string,\r\n};\r\n\r\nexport type SubscribeRequestDTO = {\r\n itemUri: string,\r\n name: string,\r\n};\r\n\r\n// ----------- Upload\r\n\r\n/** whether TusHandler.cs should Create or Modify a document */\r\nexport const UploadMode = {\r\n CreateDocument: \"CreateDocument\",\r\n ModifyDocument: \"ModifyDocument\",\r\n};\r\n\r\n// ------------ Map\r\n\r\ntype MapProviderOnClickConfig = {\r\n // HACK will set commandAction.props.defaultValues[locationTargetFieldName] to clicked location\r\n locationTargetFieldName?: string,\r\n commandAction: CommandActionPropsDTO,\r\n};\r\n\r\nexport type MapProviderConfig = {\r\n name?: string,\r\n enabled?: boolean,\r\n key?: string,\r\n isRaster?: boolean,\r\n rasterMapIdSelector?: string, // only when isRaster=true\r\n onClick?: MapProviderOnClickConfig,\r\n layers?: Array, // references to public/__map/indoor-raster/*\r\n};\r\n\r\nexport type Location = {\r\n latitude: number,\r\n longitude: number,\r\n};\r\n\r\nexport type RasterLocation = {\r\n x: number,\r\n y: number,\r\n rasterId: string,\r\n};\r\n\r\n/** returned in callback methods from map providers */\r\nexport type MapEditLocationResult = {\r\n /** new Point location (or setRadius center) */\r\n location?: Location,\r\n /** setRadius setting */\r\n radius?: number,\r\n /** area path */\r\n area?: Array,\r\n};\r\n\r\nexport type MapLocationInfo = Location & {\r\n /** field's common name */\r\n attribute: string,\r\n /** item's name */\r\n label: string,\r\n /** item's rendered InfoPopup in HTML */\r\n preview?: string,\r\n /** item's image thumbnail either in URL format or base64 blob */\r\n thumbnail?: string | Blob,\r\n /** marker custom icon */\r\n icon?: MarkerDTO,\r\n /** item's itemUri */\r\n itemUri?: string,\r\n /** optional polygon area points */\r\n area?: Array,\r\n /** whether this marker can be dragged/edited */\r\n allowEdit?: boolean,\r\n};\r\n\r\n// export const MapEditMode = {\r\n// Readonly: 0,\r\n// Point: 1,\r\n// Area: 2,\r\n// Radius: 3\r\n// };\r\n\r\n// export type MapEditModeEnum = $Values;\r\n\r\n// ---- Server Sent Events\r\n\r\nexport const ServerEventItemType = {\r\n document: \"document\",\r\n folder: \"folder\",\r\n activity: \"activity\",\r\n task: \"task\",\r\n search: \"search\",\r\n favorite: \"favorite\",\r\n subscription: \"subscription\",\r\n offline: \"offline\",\r\n};\r\n\r\nexport type ServerEventItemEnum = $Values;\r\n\r\nexport const ServerEventActionType = {\r\n notSet: 0,\r\n add: \"add\",\r\n modify: \"modify\",\r\n edit: \"edit\",\r\n delete: \"delete\",\r\n refresh: \"refresh\",\r\n view: \"view\",\r\n};\r\n\r\nexport type ServerEventActionEnum = $Values;\r\n\r\nexport type ServerEventData = {\r\n userId: number,\r\n /** ServerEventItemUriData */\r\n itemUri: ?string,\r\n parentItemUri: ?string,\r\n /** ServerEventSearchData */\r\n formId: ?number,\r\n};\r\n\r\nexport type ServerEventMessage = {\r\n id: string,\r\n item: ServerEventItemEnum,\r\n action: ServerEventActionEnum,\r\n data: ServerEventData,\r\n};\r\n\r\nexport const RefreshMode = {\r\n All: 0, // Auto refresh all\r\n Originator: 1, // Auto refresh Originator, ask Others\r\n Self: 2, // Auto refresh Originator, ignore Others\r\n};\r\n\r\nexport type RefreshModeEnum = $Values;\r\n\r\nexport type ImageResultDTO = {\r\n /** base64 encoded src string */\r\n src: string,\r\n /** indicates if src is a default or editable source */\r\n fallback: boolean,\r\n};\r\n\r\n// ------ ArrowNavigation\r\n\r\nexport type ArrowNavigationSetter = {\r\n /** source (itemUri) of master => to target source specific child windows only */\r\n setSource: (source: string) => void,\r\n /** target setter => for action panel context */\r\n setTarget: (target: string) => void,\r\n /** set DocModal rows => context */\r\n setRows: (rows: Array) => void,\r\n /** callback to set */\r\n setCurrentIndex: (index: number) => void,\r\n};\r\n\r\n// ------ ItemFlows\r\n\r\nexport const ItemFlowDirection = {\r\n in: \"in\",\r\n out: \"out\",\r\n};\r\n\r\nexport type ItemFlowDirectionEnum = $Values;\r\n\r\nexport const ItemFlowTemplateType = {\r\n Document: \"Document\",\r\n DocTemplate: \"DocTemplate\",\r\n Folder: \"Folder\",\r\n FolderTemplate: \"FolderTemplate\",\r\n};\r\n\r\nexport type ItemFlowTemplateTypeEnum = $Values;\r\n\r\nexport type ItemFlowConfigDTO = ItemActionConfig & {\r\n isSuggested: boolean,\r\n};\r\n\r\nexport type ItemFlowCategoryConfig = ItemActionConfigBase & {};\r\n\r\nexport type ItemFlowsConfigDTO = {\r\n categories: Array,\r\n flows: Array,\r\n};\r\n\r\nexport const UploadProvider = {\r\n Any: \"Any\",\r\n Uppy: \"Uppy\",\r\n Sync: \"Sync\",\r\n};\r\n\r\nexport type UploadProviderEnum = $Values;\r\n\r\nexport type NewItemResultDTO = {\r\n success: boolean,\r\n itemUri: string,\r\n name: string,\r\n formatId: number,\r\n elementType: number,\r\n};\r\n\r\n// ------ Loading\r\n\r\nexport const LoadingType = {\r\n Default: \"Default\",\r\n Status: \"Status\",\r\n};\r\n\r\nexport type LoadingTypeEnum = $Values;\r\n\r\n// ------ Raster maps\r\n\r\nexport type RasterMapLayerDTO = {\r\n id: string,\r\n name: string,\r\n itemUri: string,\r\n dim: Array,\r\n zoom: Array,\r\n};\r\n\r\nexport type RasterMapResultDTO = {\r\n id: string,\r\n layers: Array,\r\n};\r\n\r\nexport const RasterMapLayerEditAction = {\r\n none: 0,\r\n delete: 1,\r\n add: 2,\r\n rename: 3,\r\n};\r\nexport type RasterMapLayerEditActionEnum = $Values<\r\n typeof RasterMapLayerEditAction\r\n>;\r\n\r\nexport type RasterMapLayerSaveRequestDTO = RasterMapLayerDTO & {\r\n editAction: RasterMapLayerEditAction,\r\n};\r\n\r\nexport type RasterMapSaveRequestDTO = {\r\n id: string,\r\n layers: Array,\r\n};\r\n\r\nexport const LocalDateStringOption = {\r\n DateTimeLong: {\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n },\r\n DateTime: {\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n },\r\n Date: {\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n },\r\n // Browser does not natively support displaying only Time from Date Object\r\n // TimeLong: {\r\n // hour: \"2-digit\",\r\n // minute: \"2-digit\",\r\n // second: \"2-digit\",\r\n // },\r\n // Time: {\r\n // hour: \"2-digit\",\r\n // minute: \"2-digit\",\r\n // },\r\n};\r\n\r\n// ------ Reminder\r\n\r\nexport const ReminderPriority = {\r\n NotSet: 0,\r\n High: 1,\r\n Normal: 2,\r\n Low: 3,\r\n};\r\nexport type ReminderPriorityEnum = $Values;\r\n\r\nexport const ReminderTypeFlags = {\r\n NotSet: 0,\r\n Calendar: 1,\r\n Task: 2,\r\n Mail: 4,\r\n CustomAction: 8,\r\n};\r\nexport type ReminderTypeFlagsEnum = $Values;\r\n\r\nexport const CustomActionState = {\r\n NotSet: 0,\r\n NotStarted: 1,\r\n Retry: 2,\r\n Error: 9,\r\n Done: 10,\r\n Abort: 11,\r\n};\r\n\r\nexport type CustomActionStateEnum = $Values;\r\nexport type CustomActionDTO = {\r\n id: string,\r\n displayName: string,\r\n state: CustomActionStateEnum,\r\n executedDate: DateTime,\r\n error: string,\r\n};\r\nexport type ReminderDTO = {\r\n id?: int,\r\n itemUri: string,\r\n date: DateTime,\r\n creationDate?: DateTime,\r\n creator?: UserPrincipalDTO,\r\n recipient?: UserPrincipalDTO | GroupPrincipalDTO,\r\n reason: string,\r\n priority: ReminderPriorityEnum,\r\n type?: ReminderTypeFlagsEnum,\r\n isReadOnly: boolean,\r\n customAction?: CustomActionDTO,\r\n};\r\n\r\nexport type EnumValue = {\r\n value: T,\r\n label: string,\r\n icon?: string,\r\n};\r\n\r\nexport type SummaryAttributeValueEnum = SummaryAttributeValue & {\r\n enum: EnumValue,\r\n value: T,\r\n};\r\n\r\nexport const ReminderTypeFlagsEnumValues: Array<\r\n EnumValue\r\n> = [\r\n {\r\n value: ReminderTypeFlags.Calendar,\r\n label: \"$reminder:type.calendar\",\r\n icon: \"calendar\",\r\n },\r\n {\r\n value: ReminderTypeFlags.Task,\r\n label: \"$reminder:type.task\",\r\n icon: \"list-alt\",\r\n },\r\n {\r\n value: ReminderTypeFlags.Mail,\r\n label: \"$reminder:type.mail\",\r\n icon: \"envelope-o\",\r\n },\r\n];\r\n\r\nexport const ReminderPriorityEnumValues: Array<\r\n EnumValue\r\n> = [\r\n {\r\n value: ReminderPriority.High,\r\n label: \"$reminder:priority.high\",\r\n icon: \"exclamation\",\r\n },\r\n {\r\n value: ReminderPriority.Normal,\r\n label: \"$reminder:priority.normal\",\r\n },\r\n {\r\n value: ReminderPriority.Low,\r\n label: \"$reminder:priority.low\",\r\n icon: \"long-arrow-down\",\r\n },\r\n];\r\n\r\n// ----- Share\r\n\r\nconst AllowedShareActionFlags = {\r\n NotSet: 0,\r\n Link: 1,\r\n Web: 2,\r\n Sync: 4,\r\n Share: 8,\r\n Attachment: 16,\r\n Pdf: 32,\r\n Anonym: 64,\r\n};\r\nAllowedShareActionFlags.Default =\r\n AllowedShareActionFlags.Link |\r\n AllowedShareActionFlags.Web |\r\n AllowedShareActionFlags.Share;\r\n\r\nexport { AllowedShareActionFlags };\r\n\r\nexport type AllowedShareActionFlagsEnum = $Values<\r\n typeof AllowedShareActionFlags\r\n>;\r\n\r\nexport const ShareType = {\r\n Anonym: \"anonym\", // SAS (not implemented yet)\r\n Share: \"share\", // Create Share and Provide as Web/Client Link\r\n Link: \"link\", // Provide as Web/Client Link\r\n Attachment: \"attachment\", // Provide Document as Attachment via Mail\r\n Pdf: \"pdf\", // Provide Document as PDF via Mail\r\n};\r\n\r\nexport type ShareTypeEnum = $Values;\r\n\r\nexport const ShareAccessControlListType = {\r\n View: \"view\",\r\n Edit: \"edit\",\r\n Delete: \"delete\",\r\n};\r\n\r\nexport type ShareAccessControlListTypeEnum = $Values<\r\n typeof ShareAccessControlListType\r\n>;\r\n\r\nexport type ShareActionDTO = {\r\n allowedFlags: AllowedShareActionFlagsEnum,\r\n type: ShareTypeEnum,\r\n acl: ShareAccessControlListTypeEnum,\r\n expires?: DateTime,\r\n shareAs?: string,\r\n};\r\n\r\nexport type SharePrincipalDTO = ISharePrincipalDTO & {\r\n principal: GroupPrincipalDTO | UserPrincipalDTO,\r\n acl: ShareAccessControlListTypeEnum,\r\n};\r\n\r\nexport type ShareDTO = {\r\n itemUris: Array,\r\n action: ShareActionDTO,\r\n principals: Array,\r\n subject?: string,\r\n body?: string,\r\n};\r\n\r\nexport type ShareFormDTO = ShareDTO & {\r\n message: string,\r\n};\r\n\r\nexport type ShareAllowedDTO = {\r\n allowedAcl: Array,\r\n};\r\n\r\nexport const SORT_BUCKET_NAME = \"__SORT__\";\r\n\r\nexport const GridListConstant = {\r\n ExtensionIcon: \"ExtensionIcon\",\r\n IconItemStatus: \"IconItemStatus\",\r\n ItemUri: \"ITEMURI\",\r\n};\r\n\r\nexport type ItemContextResponseDTO = {\r\n isDoc: boolean,\r\n siteType: SiteTypeEnum,\r\n isFlatAU: boolean,\r\n isReadOnly: boolean,\r\n itemStatus?: ItemStatusesDTO,\r\n isFolderClassificationEditAllowed?: boolean,\r\n isEditAllowed?: boolean,\r\n isDocClassificationEditAllowed?: boolean,\r\n isDocEditAllowed?: boolean,\r\n isDocDownloadAllowed?: boolean,\r\n isDocAssignmentAllowed?: boolean,\r\n isDocSendByEmailAllowed?: boolean,\r\n forceDocListSimple?: boolean,\r\n inPointSyncIntegration?: boolean,\r\n isOffline?: boolean,\r\n name?: string,\r\n ext?: string,\r\n};\r\n\r\nconst ItemContextsFlags = {\r\n NotSet: 0,\r\n ItemType: 1,\r\n ItemStatus: 2,\r\n ResultFlags: 4,\r\n Offline: 8,\r\n Pdf: 16,\r\n WebDavName: 32,\r\n Extension: 64,\r\n};\r\nItemContextsFlags.All =\r\n ItemContextsFlags.ItemType |\r\n ItemContextsFlags.ItemStatus |\r\n ItemContextsFlags.ResultFlags |\r\n ItemContextsFlags.Offline |\r\n ItemContextsFlags.WebDavName |\r\n ItemContextsFlags.Extension;\r\n\r\nexport { ItemContextsFlags };\r\n\r\nexport type ItemContextsFlagsEnum = $Values;\r\n\r\nexport type ItemContextRequestDTO = {\r\n itemUri: string,\r\n formatId: number,\r\n itemContexts: ItemContextsFlagsEnum,\r\n};\r\n\r\nexport const TransferType = {\r\n Copy: \"copy\",\r\n Move: \"move\",\r\n Link: \"link\",\r\n};\r\n\r\nexport type TransferTypeEnum = $Values;\r\n\r\nexport type TransferItemRequestDTO = {\r\n type: TransferTypeEnum,\r\n name: string,\r\n itemUri: string,\r\n targetItemUri: string,\r\n};\r\n\r\nexport type MultiSelectionActions = {\r\n handleAdd: (id: number) => void,\r\n handleRemove: (id: number) => void,\r\n handleToggle: (id: number) => void,\r\n handleSelectAll: () => void,\r\n handleDeselectAll: () => void,\r\n handleInvert: () => void,\r\n};\r\n\r\nexport type MultiSelectionHandlers = {\r\n onTouchEnd: () => void,\r\n onTouchMove: () => void,\r\n onTouchStart: () => void,\r\n};\r\n\r\nexport type MultiSelectionContextProps = {\r\n handler: MultiSelectionHandlers,\r\n multiple: boolean,\r\n actions: MultiSelectionActions,\r\n isSelected: (index: number) => boolean,\r\n renderedBucket: React.Component,\r\n renderCheckbox: (index: number) => React.Component,\r\n};\r\n\r\nexport type MultiSelectionProps = {\r\n actions: MultiSelectionActions,\r\n activeRows: any,\r\n availableRows: any,\r\n setAvailableRows: () => void,\r\n enable: () => void,\r\n disable: () => void,\r\n handler: MultiSelectionHandlers,\r\n multiple: boolean,\r\n isSelected: (index: number) => boolean,\r\n};\r\n\r\nexport const NotificationStyle = {\r\n Info: \"info\",\r\n Success: \"success\",\r\n Warning: \"warning\",\r\n Error: \"error\",\r\n Default: \"default\",\r\n};\r\nexport type NotificationStyleEnum = $Values;\r\n\r\nexport const NotificationStatusFlag = {\r\n New: 0,\r\n Read: 1,\r\n Pending: 2,\r\n Error: 4,\r\n};\r\nexport type NotificationStatusFlagEnum = $Values;\r\n\r\nexport type ToastProps = {\r\n message: string,\r\n icon?: string,\r\n details?: (props: ToastProps) => any,\r\n handleClick?: () => void,\r\n};\r\n\r\nexport type ToastType = ToastProps & {\r\n style?: NotificationStyleEnum,\r\n status?: NotificationStatusFlagEnum,\r\n toastId?: string,\r\n isRouted?: boolean,\r\n autoClose?: number | boolean,\r\n position?: $Keys,\r\n className?: string,\r\n};\r\n\r\nexport type GUID = string;\r\nexport type ToastId = string;\r\nexport type NotificationId = string;\r\n\r\nexport const PriorityType = {\r\n Low: 0,\r\n Intermediate: 1,\r\n High: 2,\r\n};\r\nexport type PriorityTypeEnum = $Values;\r\n\r\nexport type NotificationDTO = {\r\n notificationId: NotificationId,\r\n icon: string,\r\n message: string,\r\n priority: PriorityEnum,\r\n style: NotificationStyleEnum,\r\n status: NotificationStatusFlagEnum,\r\n toast?: any,\r\n Component?: React.Component,\r\n timestamp: Date,\r\n};\r\n\r\nexport const CommandActionStatusFlag = {\r\n NotSet: 0,\r\n Loading: 1,\r\n Done: 2,\r\n Success: 4,\r\n Partial: 8,\r\n Error: 16,\r\n};\r\nexport type CommandActionStatusFlagEnum = $Values<\r\n typeof CommandActionStatusFlag\r\n>;\r\n\r\nexport type CommandActionItem = {\r\n status: ConstantsEnum,\r\n itemUri: string,\r\n formatId: number,\r\n isDoc: boolean,\r\n};\r\n\r\nexport type CommandActionLog = {\r\n timestamp: Date,\r\n message: string,\r\n status: ConstantsEnum,\r\n details: any,\r\n itemUri: string,\r\n};\r\n\r\nexport type CommandActionRequest = {\r\n guid: GUID,\r\n status: CommandActionStatusFlagEnum,\r\n items: Array,\r\n commandAction: string,\r\n log: Array,\r\n};\r\n","// @flow\r\nimport React, { PureComponent, type ComponentType } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport Split from \"split.js\";\r\nimport panesDefaultState from \"data/panes\";\r\nimport { getDisplayName } from \"data/constants\";\r\nimport { setSplitPanesAction, persistSplitPanesAction } from \"data/actions\";\r\nimport isEqual from \"lodash/isEqual\";\r\nimport * as s from \"data/reducers/selectors\";\r\n// import getToggles from \"data/toggles\";\r\n\r\ntype Props = {\r\n viewName?: string,\r\n // from redux\r\n dispatch: Dispatch,\r\n selectedToggles: Array,\r\n panes: Object,\r\n // from TogglesHandler\r\n setToggles: Function,\r\n};\r\n\r\ntype Config = {\r\n viewName?: string,\r\n paneIds: Array,\r\n toggleIds: Array,\r\n direction?: string,\r\n};\r\n\r\nconst SplitPanes = ({\r\n viewName,\r\n paneIds,\r\n toggleIds,\r\n direction = \"vertical\",\r\n}: Config) => (WrappedComponent: ComponentType) => {\r\n class PP extends PureComponent {\r\n split1: Split;\r\n split2: Split;\r\n\r\n static displayName = `SplitPanes(${getDisplayName(WrappedComponent)})`;\r\n\r\n componentDidMount() {\r\n let paneIdx = 0;\r\n this.split1 = Split([paneIds[paneIdx++], paneIds[paneIdx++]], {\r\n sizes: this.props.panes[0],\r\n direction:\r\n paneIds.length === 2\r\n ? direction /*\"vertical\"*/\r\n : \"horizontal\",\r\n minSize: 0,\r\n gutterSize: 10,\r\n onDragEnd: () => {\r\n // adjust toggles based on panes' dimensions\r\n const dimensions = this.split1.getSizes();\r\n // const toggles = getToggles(viewName || this.props.viewName);\r\n // let toggleUpdated = false;\r\n // for (let i = 0; i < dimensions.length; i++) {\r\n // const isSelected = dimensions[i] >= 1;\r\n // if (toggles.toggles[i].isSelected !== isSelected) {\r\n // toggles.toggles[i].isSelected = isSelected;\r\n // toggleUpdated = true;\r\n // }\r\n // }\r\n // /* istanbul ignore else */\r\n // if (toggleUpdated && toggles != null) {\r\n // this.props.setToggles(toggles);\r\n // }\r\n\r\n this.dispatch({\r\n persist: true,\r\n view:\r\n viewName ||\r\n /* istanbul ignore next */ this.props.viewName,\r\n name: 0,\r\n dimensions,\r\n });\r\n },\r\n\r\n elementStyle: /* istanbul ignore next */ (\r\n dimension,\r\n size,\r\n gutterSize\r\n ) => {\r\n return {\r\n \"flex-basis\":\r\n \"calc(\" + size + \"% - \" + gutterSize + \"px)\",\r\n };\r\n },\r\n gutterStyle: /* istanbul ignore next */ (\r\n dimension,\r\n gutterSize\r\n ) => {\r\n return { \"flex-basis\": gutterSize + \"px\" };\r\n },\r\n });\r\n\r\n if (paneIdx < paneIds.length) {\r\n this.split2 = Split([paneIds[paneIdx++], paneIds[paneIdx++]], {\r\n sizes: this.props.panes[1],\r\n minSize: 0,\r\n gutterSize: 10,\r\n direction: \"vertical\",\r\n onDragEnd: () => {\r\n this.dispatch({\r\n persist: true,\r\n view:\r\n viewName ||\r\n /* istanbul ignore next */ this.props.viewName,\r\n name: 1,\r\n dimensions: this.split2.getSizes(),\r\n });\r\n },\r\n elementStyle: /* istanbul ignore next */ (\r\n dimension,\r\n size,\r\n gutterSize\r\n ) => {\r\n return {\r\n \"flex-basis\":\r\n \"calc(\" + size + \"% - \" + gutterSize + \"px)\",\r\n };\r\n },\r\n gutterStyle: /* istanbul ignore next */ (\r\n dimension,\r\n gutterSize\r\n ) => {\r\n return { \"flex-basis\": gutterSize + \"px\" };\r\n },\r\n });\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n if (paneIds.length === 2) {\r\n /* istanbul ignore next */\r\n if (\r\n !isEqual(\r\n prevProps.selectedToggles,\r\n this.props.selectedToggles\r\n )\r\n ) {\r\n const selected = this.props.selectedToggles;\r\n\r\n let master = panesDefaultState[\r\n viewName || this.props.viewName\r\n ][0].slice(0);\r\n if (!selected.includes(toggleIds[0])) {\r\n master = [0, 100];\r\n } else if (!selected.includes(toggleIds[1])) {\r\n master = [100, 0];\r\n }\r\n\r\n // document.getElementsByClassName(\r\n // \"gutter-horizontal\"\r\n // )[0].style.display =\r\n // master[0] === 0 || master[0] === 100 ? \"none\" : \"inline\";\r\n this.split1.setSizes(master);\r\n this.dispatch({\r\n persist: prevProps.selectedToggles != null, //Do not persist initial set of toggles\r\n view:\r\n viewName ||\r\n /* istanbul ignore next */ this.props.viewName,\r\n name: 0,\r\n dimensions: master,\r\n });\r\n }\r\n\r\n /* istanbul ignore next */\r\n if (prevProps.panes[0] !== this.props.panes[0]) {\r\n this.split1.setSizes(this.props.panes[0]);\r\n }\r\n } else {\r\n /* istanbul ignore next */\r\n if (\r\n !isEqual(\r\n prevProps.selectedToggles,\r\n this.props.selectedToggles\r\n )\r\n ) {\r\n const selected = this.props.selectedToggles;\r\n\r\n // let master =\r\n // prevProps.panes && prevProps.panes[0]\r\n // ? prevProps.panes[0].slice(0)\r\n // : panesDefaultState[\r\n // viewName || this.props.viewName\r\n // ][0].slice(0);\r\n let master = panesDefaultState[\r\n viewName ||\r\n /* istanbul ignore next */ this.props.viewName\r\n ][0].slice(0);\r\n\r\n if (!selected.includes(toggleIds[0])) {\r\n master = [0, 100];\r\n }\r\n\r\n // let slave =\r\n // prevProps.panes && prevProps.panes[1]\r\n // ? prevProps.panes[1].slice(0)\r\n // : panesDefaultState[\r\n // viewName || this.props.viewName\r\n // ][1].slice(0);\r\n let slave = panesDefaultState[\r\n viewName ||\r\n /* istanbul ignore next */ this.props.viewName\r\n ][1].slice(0);\r\n if (!selected.includes(toggleIds[1])) slave[0] = 0;\r\n if (!selected.includes(toggleIds[2])) slave[1] = 0;\r\n if (\r\n !selected.includes(toggleIds[1]) &&\r\n !selected.includes(toggleIds[2]) &&\r\n selected.includes(toggleIds[0])\r\n ) {\r\n master = [100, 0];\r\n }\r\n if (\r\n selected.includes(toggleIds[1]) &&\r\n !selected.includes(toggleIds[2])\r\n ) {\r\n slave[0] = 100;\r\n } else if (\r\n !selected.includes(toggleIds[1]) &&\r\n selected.includes(toggleIds[2])\r\n ) {\r\n slave[1] = 100;\r\n }\r\n // document.getElementsByClassName(\r\n // \"gutter-horizontal\"\r\n // )[0].style.display =\r\n // master[0] === 0 || master[0] === 100 ? \"none\" : \"inline\";\r\n // document.getElementsByClassName(\r\n // \"gutter-vertical\"\r\n // )[0].style.display =\r\n // slave[0] === 0 || slave[0] === 100 ? \"none\" : \"block\";\r\n\r\n this.split1.setSizes(master);\r\n //console.log(prevProps.selectedToggles);\r\n this.dispatch({\r\n persist: prevProps.selectedToggles != null, //Do not persist initial set of toggles\r\n view:\r\n viewName ||\r\n /* istanbul ignore next */ this.props.viewName,\r\n name: 0,\r\n dimensions: master,\r\n });\r\n this.split2.setSizes(slave);\r\n this.dispatch({\r\n persist: prevProps.selectedToggles != null, //Do not persist initial set of toggles\r\n view:\r\n viewName ||\r\n /* istanbul ignore next */ this.props.viewName,\r\n name: 1,\r\n dimensions: slave,\r\n });\r\n }\r\n\r\n /* istanbul ignore next */\r\n if (!isEqual(prevProps.panes[0], this.props.panes[0])) {\r\n this.split1.setSizes(this.props.panes[0]);\r\n }\r\n /* istanbul ignore next */\r\n if (!isEqual(prevProps.panes[1], this.props.panes[1])) {\r\n this.split2.setSizes(this.props.panes[1]);\r\n }\r\n }\r\n }\r\n dispatch = ({\r\n persist,\r\n ...action\r\n }: {\r\n persist: boolean,\r\n view: string,\r\n name: number,\r\n dimensions: Array,\r\n }) =>\r\n this.props.dispatch(\r\n persist\r\n ? persistSplitPanesAction(action)\r\n : setSplitPanesAction(action)\r\n );\r\n\r\n setSizes = (paneIdx: number, dimensions: Array) => {\r\n if (paneIdx === 0) {\r\n this.split1.setSizes(dimensions);\r\n } else {\r\n /* istanbul ignore else */\r\n if (paneIdx === 1) {\r\n this.split2.setSizes(dimensions);\r\n } else {\r\n alert(\"Unknown paneIdx=\" + paneIdx);\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n const { panes, ...rest } = this.props;\r\n return ;\r\n }\r\n }\r\n\r\n const mapStateToProps = (state, ownProps) => ({\r\n selectedToggles: s.selectedTogglesSelector(\r\n state,\r\n viewName || /* istanbul ignore next */ ownProps.viewName\r\n ),\r\n panes: s.panesViewSelector(\r\n state,\r\n viewName || /* istanbul ignore next */ ownProps.viewName\r\n ),\r\n ...ownProps,\r\n });\r\n\r\n return connect(mapStateToProps)(PP);\r\n};\r\n\r\nexport default SplitPanes;\r\n","// @flow\r\nimport React from \"react\";\r\nimport globalloc from \"data/i18n.global\";\r\n\r\nconst Loading = ({\r\n isLoading,\r\n pastDelay,\r\n error,\r\n}: {\r\n isLoading: boolean,\r\n pastDelay: boolean,\r\n error: boolean,\r\n}) => {\r\n if (isLoading) {\r\n // While our other component is loading...\r\n /*if (props.timedOut) {\r\n // In case we've timed out loading our other component.\r\n return
Loader timed out!
;\r\n } else*/ if (\r\n pastDelay\r\n ) {\r\n // Display a loading screen after a set delay.\r\n return
{globalloc.modules.loading}
;\r\n } else {\r\n // Don't flash \"Loading...\" when we don't need to.\r\n return null;\r\n }\r\n } else if (error) {\r\n console.error(\"Loader error\", error);\r\n // If we aren't loading, maybe\r\n return
{globalloc.modules.error}
;\r\n } else {\r\n // This case shouldn't happen... but we'll return null anyways.\r\n return null;\r\n }\r\n};\r\n\r\nexport default Loading;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Status from \"./index\";\r\nimport Constants from \"data/constants\";\r\n\r\nconst Loading = ({\r\n isLoading,\r\n pastDelay,\r\n error,\r\n}: {\r\n isLoading: boolean,\r\n pastDelay: boolean,\r\n error: boolean,\r\n}) => {\r\n if (!pastDelay && isLoading) return null;\r\n let status = error ? Constants.ERROR : Constants.LOADING;\r\n return ;\r\n};\r\n\r\nexport default Loading;\r\n","//@flow\r\nimport Loadable from \"react-loadable\";\r\nimport Loading from \"./Loading\";\r\nimport StatusLoading from \"components/Status/Loading\";\r\nimport { LoadingType, type LoadingTypeEnum } from \"data/types\";\r\n\r\nconst getDefaltsByLoadingType = (loadingType: LoadingTypeEnum) => {\r\n switch (loadingType) {\r\n case LoadingType.Default:\r\n return {\r\n loading: Loading,\r\n delay: 5000,\r\n timeout: 10,\r\n };\r\n case LoadingType.Status:\r\n return {\r\n loading: StatusLoading,\r\n delay: 0,\r\n timeout: 10,\r\n };\r\n /* istanbul ignore next */\r\n default:\r\n console.warn(\"Unknown LoadingType provided for Loader\");\r\n }\r\n};\r\n\r\ntype LoaderOptions = {\r\n loading: React.Node,\r\n delay: number,\r\n timeout: number,\r\n};\r\n\r\nexport default (\r\n opts: LoaderOptions,\r\n loadingType: LoadingTypeEnum = LoadingType.Default\r\n) => Loadable(Object.assign(getDefaltsByLoadingType(loadingType), opts));\r\n","import ApiManager from \"data/ApiManagerBase\";\r\nimport { offlineQueueStorage, getAllItems } from \"data/storage\";\r\nimport { toastActionResult, dismissToast, toastId } from \"data/toast\";\r\nimport { sleep } from \"data/utils\";\r\nimport { JL } from \"data/logging\";\r\nimport { openConflictModal } from \"components/ConflictModal\";\r\nimport produce from \"immer\";\r\nimport { OfflineQueueItem, OfflineQueueItemType } from \"data/types\";\r\n// import uppy from \"data/uppy\";\r\n\r\nconst _log = JL(\"offlineQueue\");\r\nconst UPDATE_CONFLICT_EVENTID = 1201;\r\n\r\nexport /**\r\n * Add an ApiCatalog call to the offlineQueue\r\n * @param {string} name ApiCatalog.name\r\n * @param {*} params parameters to pass to ApiManager.call\r\n * @returns {Promise}\r\n */\r\nconst addToOfflineQueue = ({\r\n key,\r\n type,\r\n name,\r\n params,\r\n}: {\r\n key?: string,\r\n type: OfflineQueueItemTypeEnum,\r\n name: string,\r\n params: any,\r\n}): Promise => {\r\n let dbKey = key;\r\n if (dbKey == null) {\r\n dbKey = String(Date.now());\r\n if (params && params.hasOwnProperty(\"itemUri\")) {\r\n dbKey = params.itemUri + \"_\" + dbKey;\r\n }\r\n }\r\n return offlineQueueStorage.setItem(dbKey, {\r\n type,\r\n name,\r\n params,\r\n });\r\n};\r\n\r\nexport const anyPendingChanges = (keyPrefix: string): Promise =>\r\n // TODO review anyPendingChanges for exact or startsWith itemUri?\r\n offlineQueueStorage\r\n .keysStartingWith(keyPrefix)\r\n .then((result) => result.length > 0);\r\n\r\n/**\r\n * Works through the offlineQueue and retries the ApiCatalog calls\r\n */\r\nexport async function replayOfflineQueue(): Promise {\r\n const count = await offlineQueueStorage.length();\r\n if (count === 0) return;\r\n _log.debug(() => ({\r\n msg: `Found ${count} pending items in offlineQueue`,\r\n }));\r\n\r\n const api = new ApiManager();\r\n let isError = false;\r\n const allItems = await getAllItems(offlineQueueStorage);\r\n for (const item of allItems) {\r\n const offlineQueueItem = item.value;\r\n _log.debug(() => ({\r\n msg: `Syncing \"${item.key}\" from offlineQueue`,\r\n api: offlineQueueItem,\r\n }));\r\n let success = false;\r\n switch (offlineQueueItem.type) {\r\n case OfflineQueueItemType.ApiCall:\r\n success = await _replayApiCall(api, item.key, offlineQueueItem);\r\n break;\r\n case OfflineQueueItemType.UppyFile:\r\n success = await _replayUppyUpload(item.key, offlineQueueItem);\r\n break;\r\n /* istanbul ignore next */\r\n default:\r\n _log.warn(() => ({\r\n msg: \"Unknown OfflineQueueItemType\",\r\n offlineQueueItem,\r\n }));\r\n break;\r\n }\r\n\r\n if (!success) isError = true;\r\n }\r\n\r\n dismissToast(toastId.NetworkStatus);\r\n toastActionResult(!isError, \"common:offline.synced\");\r\n}\r\n\r\n// returns true for success\r\nasync function _replayApiCall(\r\n api: ApiManager,\r\n key: string,\r\n queueItem: OfflineQueueItem\r\n): Promise {\r\n let qi = produce(queueItem, (draft) => draft);\r\n\r\n // #55386 simple retrial policy\r\n for (let i = 0; i < 5; i++) {\r\n try {\r\n await api.call(qi.name, {\r\n params: qi.params,\r\n });\r\n await offlineQueueStorage.removeItem(key);\r\n return true;\r\n } catch (error) {\r\n // eslint-disable-next-line no-loop-func\r\n _log.error(() => ({\r\n msg: `Error while syncing \"${key}\" offline queue`,\r\n api: qi,\r\n error,\r\n }));\r\n qi = produce(qi, (draft) => {\r\n draft.retries = (draft.retries || 0) + 1;\r\n draft.error = error.data || error.message;\r\n });\r\n await offlineQueueStorage.setItem(key, qi);\r\n\r\n // #55376 conflict management\r\n if (\r\n error.data != null &&\r\n error.data.eventId === UPDATE_CONFLICT_EVENTID &&\r\n error.data.extra &&\r\n error.data.extra.name != null\r\n ) {\r\n qi = await _handleConflict(error, key, qi);\r\n if (qi == null) return true;\r\n }\r\n await sleep(3000);\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// returns true to try again\r\nasync function _handleConflict(\r\n error,\r\n key: string,\r\n offlineQueueItem: OfflineQueueItem\r\n): Promise {\r\n const doOverwrite = await openConflictModal(error.data.extra.name);\r\n if (doOverwrite) {\r\n const qi = produce(offlineQueueItem, (draft) => {\r\n // we blindly set the etag, reset counter try again\r\n draft.params[\"etag\"] = error.data.extra.currentEtag;\r\n draft.retries = 0;\r\n draft.error = null;\r\n });\r\n // update and immediately continue and retry (shorten concurrency window)\r\n await offlineQueueStorage.setItem(key, qi);\r\n return qi;\r\n } else {\r\n await offlineQueueStorage.removeItem(key);\r\n return null;\r\n }\r\n}\r\n\r\n// returns true for success\r\nasync function _replayUppyUpload(\r\n key: string,\r\n offlineQueueItem: OfflineQueueItem\r\n): Promise {\r\n try {\r\n const uppy = (await import(\"data/uppy\")).default;\r\n uppy.addFile(offlineQueueItem.params);\r\n const result = await uppy.retryUpload(offlineQueueItem.params.id);\r\n if (result && result.failed && result.failed.length === 0) {\r\n await offlineQueueStorage.removeItem(key);\r\n uppy.reset();\r\n return true;\r\n } else {\r\n throw new Error(\"Uppy upload failed\");\r\n }\r\n } catch (error) {\r\n _log.error(() => ({\r\n msg: \"While replaying uppy file upload\",\r\n error,\r\n offlineQueueItem,\r\n }));\r\n const qi = produce(offlineQueueItem, (draft) => {\r\n draft.retries = (draft.retries || 0) + 1;\r\n draft.error = error.data || error.message;\r\n });\r\n await offlineQueueStorage.setItem(key, qi);\r\n }\r\n return false;\r\n}\r\n","import React from \"react\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\nimport MaskedInput from \"@hs/masked-input\";\r\nimport { getClassNames } from \"data/utils\";\r\nimport IMask from \"imask\";\r\nimport loc from \"i18next\";\r\n\r\nconst TextEditorControl = (props) => (\r\n (\r\n \r\n )}\r\n {...props}\r\n validations={{\r\n ...props.validations,\r\n notEmptyMask: /*istanbul ignore next*/ (values, value) => {\r\n if (!props.isRequired || !props.mask) return true;\r\n const rawValue = IMask.pipe(\r\n value,\r\n {\r\n mask: props.mask,\r\n definitions: {\r\n \"#\": /[0-9]/,\r\n \"&\": /./,\r\n A: /[0-9a-zA-Z]/,\r\n a: /[0-9a-zA-Z]/,\r\n 9: /[0-9]/,\r\n C: /./,\r\n \"?\": /./,\r\n n: /[0-9]/,\r\n },\r\n },\r\n IMask.PIPE_TYPE.MASKED,\r\n IMask.PIPE_TYPE.UNMASKED\r\n );\r\n return String(rawValue) !== \"\";\r\n },\r\n }}\r\n validationErrors={{\r\n ...props.validationErrors,\r\n notEmptyMask: loc.t(\"common:validation.required\"),\r\n }}\r\n />\r\n);\r\nTextEditorControl.displayName = \"TextEditorControl\";\r\nexport default TextEditorControl;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"UploadImage_container__3rabK\",\"image\":\"UploadImage_image__21AEd\",\"middle\":\"UploadImage_middle__12lER\",\"ro\":\"UploadImage_ro__2CBTQ\",\"button\":\"UploadImage_button__2D9zY\",\"input\":\"UploadImage_input__14FQD\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"checkbox\":\"CellContent_checkbox__152-h\",\"desktop\":\"CellContent_desktop__2ulOb\",\"link\":\"CellContent_link__2nsPt\",\"icons\":\"CellContent_icons__1tAYs\",\"boolean\":\"CellContent_boolean__3cO2X\",\"number\":\"CellContent_number__2HsSU\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"mark\":\"CellContent_mark__3pu0O\",\"checkbox\":\"CellContent_checkbox__1XIS9\",\"desktop\":\"CellContent_desktop__2bXxB\",\"link\":\"CellContent_link__VcSKB\"};","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport \"./index.css\";\r\n\r\ntype Props = {\r\n /** controlled input text value */\r\n name: string,\r\n /** controller input onChange event */\r\n onChange: Function,\r\n /** optional title (tooltip) */\r\n title?: string,\r\n};\r\n\r\ntype State = {\r\n name: string,\r\n editing: boolean,\r\n};\r\n\r\nclass Rename extends PureComponent {\r\n _txt: HTMLInputElement | null;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = { editing: false, name: props.name };\r\n }\r\n\r\n _startEditing = () => {\r\n this.setState({ editing: true }, () => {\r\n /* istanbul ignore else */\r\n if (this._txt != null) {\r\n const txt = this._txt;\r\n txt.focus();\r\n txt.setSelectionRange(0, this.state.name.length);\r\n }\r\n });\r\n };\r\n\r\n _onChange = (e: SyntheticInputEvent<*>) => {\r\n this.setState({ name: e.currentTarget.value });\r\n };\r\n\r\n _onBlur = (e: SyntheticInputEvent<*>) => {\r\n this.setState({ editing: false }, () => {\r\n /* istanbul ignore else */\r\n if (\r\n typeof this.props.onChange === \"function\" &&\r\n this.state.name !== this.props.name\r\n )\r\n this.props.onChange(this.state.name);\r\n });\r\n };\r\n\r\n _onKeyDown = (e: SyntheticInputEvent<*>) => {\r\n /* istanbul ignore else */\r\n if (e.which === 13) {\r\n //ENTER\r\n e.preventDefault();\r\n this._onBlur(e);\r\n }\r\n /* istanbul ignore else */\r\n if (e.which === 27) {\r\n //ESCAPE\r\n e.preventDefault();\r\n this.setState({ name: this.props.name }, () => this._onBlur(e));\r\n }\r\n };\r\n\r\n render() {\r\n if (this.state.editing) {\r\n return (\r\n (this._txt = ref)}\r\n style={{ display: \"inline\" }}\r\n type=\"text\"\r\n className=\"form-control\"\r\n value={this.state.name}\r\n onBlur={this._onBlur}\r\n onChange={this._onChange}\r\n onKeyDown={this._onKeyDown}\r\n />\r\n );\r\n } else {\r\n return (\r\n \r\n {this.props.name}\r\n \r\n );\r\n }\r\n }\r\n}\r\nexport default Rename;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Breadcrumb from \"react-bootstrap/lib/Breadcrumb\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport loc from \"i18next\";\r\nimport Status from \"components/Status\";\r\nimport Rename from \"components/Rename\";\r\n\r\ntype Props = {\r\n /** name of search item */\r\n name: ?string,\r\n /** whether this is a favorite */\r\n isFav: boolean,\r\n /** whether user is allowed to rename searchcrumb (and hide favorite option) */\r\n isReadonly: boolean,\r\n /** favorite add/remove fetch status */\r\n favStatus: string,\r\n /** callback when favorite icon is clicked */\r\n favOnClick?: () => void,\r\n /** callback when user renamed favorite\r\n * @param {string} name new name\r\n */\r\n onRename: ?(name: string) => void,\r\n /** CSS styles to apply */\r\n style?: StyleSheet | Object,\r\n /** className to apply */\r\n className?: string,\r\n};\r\n\r\nconst Searchcrumb = ({\r\n name,\r\n isFav = false,\r\n isReadonly = false,\r\n favStatus,\r\n favOnClick,\r\n onRename,\r\n style,\r\n className,\r\n}: Props) => (\r\n \r\n {typeof favOnClick === \"function\" &&\r\n !isReadonly &&\r\n (isFav ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n ))}{\" \"}\r\n \r\n {isReadonly === true && (\r\n \r\n {loc.t(\"search.searchcrumb\")}\r\n \r\n )}\r\n {isReadonly === false && (\r\n \r\n {loc.t(\"search.searchcrumb\")}\r\n \r\n )}\r\n \r\n {name && String(name).length > 0 && (\r\n \r\n {typeof onRename === \"function\" && !isReadonly ? (\r\n \r\n ) : (\r\n name\r\n )}\r\n \r\n )}\r\n \r\n);\r\nSearchcrumb.displayName = \"Searchcrumb\";\r\nexport default Searchcrumb;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { addSearchFavorite, delFavoriteLink } from \"data/api\";\r\nimport { renameSearchFavoriteAction } from \"data/actions\";\r\nimport {\r\n type SearchRequestDTO,\r\n type SearchItemDTO,\r\n SearchRequestType,\r\n} from \"data/types\";\r\nimport Searchcrumb from \"components/Searchcrumb\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\ntype Props = {\r\n /** searchItem object (not executed yet) */\r\n searchItem: ?SearchItemDTO,\r\n /** search Request object (executed query) */\r\n searchRequest: SearchRequestDTO,\r\n /** whether user is allowed to rename searchcrumb (and hide favorite option) */\r\n isReadonly: boolean,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n};\r\n\r\ntype State = {\r\n status: ConstantsEnum,\r\n isFav: boolean,\r\n favStatus: ConstantsEnum,\r\n name: string,\r\n linkId: number,\r\n};\r\n\r\nexport class SearchcrumbContainer extends PureComponent {\r\n favOnClick: Function;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n status: Constants.LOADING,\r\n isFav: false,\r\n favStatus: Constants.LOADING,\r\n name: \"\",\r\n linkId: -1,\r\n };\r\n this.favOnClick = this.favOnClick.bind(this);\r\n }\r\n\r\n // componentDidMount() {\r\n // this._parse(this.props.searchRequest);\r\n // }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (prevProps.searchRequest !== this.props.searchRequest) {\r\n this._parse(this.props.searchRequest);\r\n }\r\n }\r\n\r\n _parse = (searchRequest: SearchRequestDTO): void => {\r\n if (searchRequest) {\r\n this.setState({\r\n status: Constants.OK,\r\n isFav:\r\n searchRequest.isCustom === false &&\r\n searchRequest.searchType === SearchRequestType.Favorite,\r\n favStatus: Constants.OK,\r\n name: searchRequest.name || \"\",\r\n linkId: searchRequest.id,\r\n });\r\n } else {\r\n this.setState({ status: Constants.OK });\r\n }\r\n };\r\n\r\n async favOnClick(e: SyntheticEvent) {\r\n e.preventDefault();\r\n const { searchRequest } = this.props;\r\n const { name, isFav, linkId } = this.state;\r\n\r\n this.setState({ favStatus: Constants.LOADING });\r\n\r\n try {\r\n const success = isFav\r\n ? await delFavoriteLink(linkId)\r\n : await addSearchFavorite(searchRequest);\r\n\r\n toastActionResult(\r\n success,\r\n isFav ? \"breadcrumb.delfav\" : \"breadcrumb.addfav\",\r\n { name }\r\n );\r\n\r\n if (success) {\r\n this.setState({\r\n isFav: !isFav,\r\n favStatus: Constants.OK,\r\n });\r\n } else {\r\n this.setState({\r\n favStatus: Constants.ERROR,\r\n });\r\n }\r\n } catch (err) {\r\n this.setState({\r\n favStatus: Constants.ERROR,\r\n });\r\n }\r\n }\r\n\r\n favOnRename = (name: string) =>\r\n this.props.dispatch(renameSearchFavoriteAction({ name }));\r\n\r\n render() {\r\n const { searchRequest, searchItem, isReadonly } = this.props;\r\n if (searchRequest != null && searchItem != null) {\r\n const { name, status, isFav, favStatus } = this.state;\r\n if (status === Constants.OK)\r\n return (\r\n \r\n );\r\n\r\n return ;\r\n } else if (searchItem != null) {\r\n return (\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n );\r\n }\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n searchRequest: s.searchRequestSelector(state),\r\n ...ownProps,\r\n});\r\n\r\nexport default connect(mapStateToProps)(SearchcrumbContainer);\r\n","import React from \"react\";\r\nimport BreadcrumbContainer from \"containers/Breadcrumb\";\r\nimport SearchcrumbContainer from \"containers/Searchcrumb\";\r\nimport { check_isSpecialFolder } from \"containers/ActionPanel_shouldBeVisible\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { type SearchItemDTO } from \"data/types\";\r\nimport loc from \"i18next\";\r\n\r\nexport const CustomBreadcrumb = ({\r\n name,\r\n icon,\r\n}: {\r\n /** text to show */\r\n name: string,\r\n /** icon to show (FontAwesome) */\r\n icon: string,\r\n}) => (\r\n
\r\n \r\n {\" \" + name}\r\n
\r\n);\r\nCustomBreadcrumb.displayName = \"CustomBreadcrumb\";\r\n\r\ntype Props = {\r\n /** itemUri */\r\n itemUri: ?string,\r\n /** current view name */\r\n viewName: string,\r\n /** optional used searchItem */\r\n searchItem?: SearchItemDTO,\r\n /** whether user is allowed to navigate through breadcrumb (and hide favorite option) */\r\n isReadonly: boolean,\r\n /** scope breadcrumb to show parts only starting the specified level number */\r\n scopeFromLevel?: number,\r\n /** optional breadcrumbPart click event instead of history.push */\r\n onBreadcrumbPartClick?: (itemUri: string) => void,\r\n};\r\n\r\nexport const CrumbSelector = ({\r\n itemUri,\r\n viewName,\r\n searchItem,\r\n isReadonly = false,\r\n isRecycleBin = false,\r\n scopeFromLevel = 0,\r\n onBreadcrumbPartClick,\r\n}: Props) => {\r\n if (searchItem != null)\r\n return (\r\n \r\n );\r\n else if (\r\n itemUri == null //home baby\r\n )\r\n return null;\r\n // ;\r\n else if (itemUri === \"search\")\r\n return (\r\n \r\n );\r\n else if (itemUri === \"news\")\r\n return ;\r\n else if (itemUri === \"upload\")\r\n return (\r\n \r\n );\r\n else if (\r\n String(itemUri).startsWith(\"pam-item://\") ||\r\n check_isSpecialFolder({ itemUri })\r\n ) {\r\n const isFavorable = !(\r\n check_isSpecialFolder({ itemUri }) || isRecycleBin\r\n );\r\n return (\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n};\r\nCrumbSelector.displayName = \"CrumbSelector\";\r\nexport default CrumbSelector;\r\n","// @flow\r\nimport React from \"react\";\r\nimport noop from \"lodash/noop\";\r\nimport \"./index.css\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport ButtonGroup from \"react-bootstrap/lib/ButtonGroup\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { type ToggleItemDTO } from \"data/types\";\r\nimport Constants from \"data/constants\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\nconst renderStatus = (item: ToggleItemDTO) => {\r\n if (item.status === null || item.status === undefined) return;\r\n if (item.status === Constants.LOADING)\r\n return (\r\n <>\r\n {\" \"}\r\n \r\n \r\n );\r\n return (\r\n <>\r\n {\" \"}\r\n \r\n \r\n );\r\n};\r\n\r\ntype Props = {\r\n name: string,\r\n isMultiple: boolean,\r\n toggles: Array,\r\n onClick: Function,\r\n};\r\n\r\nconst ToggleBar = ({ name, isMultiple, toggles, onClick }: Props) => (\r\n \r\n {toggles.map(\r\n (item: ToggleItemDTO, index: number) =>\r\n !item.isHidden && (\r\n \r\n item.isDisabled === true /* istanbul ignore next */\r\n ? noop\r\n : onClick(item, isMultiple)\r\n }\r\n data-test={`toggleButton-${item.value}`}\r\n >\r\n {item.icon && }\r\n \r\n {\" \" + item.text}\r\n \r\n {item.count != null && item.count > 0 && (\r\n \r\n {\" \"}\r\n \r\n \r\n )}\r\n {renderStatus(item)}\r\n \r\n )\r\n )}\r\n \r\n);\r\n\r\nexport default ToggleBar;\r\n","import { connect } from \"react-redux\";\r\nimport ToggleBarComponent from \"components/ToggleBar\";\r\nimport { persistTogglesAction } from \"data/actions\";\r\nimport immutable from \"object-path-immutable\";\r\n\r\n// apply Redux Store state to Component Properties\r\nexport const mapStateToProps = (state, ownProps) => {\r\n //console.log('mapStateToProps', state, ownProps);\r\n let toggleState = state.toggles[ownProps.name];\r\n if (toggleState != null) {\r\n let result = {\r\n name: ownProps.name,\r\n isMultiple:\r\n state.browser.greaterThanOrEqual.medium && ownProps.isMultiple,\r\n };\r\n\r\n result.toggles = ownProps.toggles.map((toggle) => {\r\n return immutable(toggle)\r\n .set(\r\n \"isSelected\",\r\n toggleState._selected\r\n ? toggleState._selected.includes(toggle.value)\r\n : false\r\n )\r\n .set(\r\n \"count\",\r\n toggleState.counts &&\r\n (toggleState.counts[toggle.value] || 0)\r\n )\r\n .set(\r\n \"status\",\r\n toggleState.status &&\r\n (toggleState.status[toggle.value] || null)\r\n )\r\n .value();\r\n });\r\n return result;\r\n }\r\n\r\n const { isMultiple, ...otherProps } = ownProps;\r\n\r\n return {\r\n isMultiple: state.browser.greaterThanOrEqual.medium && isMultiple,\r\n ...otherProps,\r\n };\r\n};\r\n\r\n// create the Component giving parent Properties and handling the onClick event to dispatch changes to the Store\r\n//export const mapDispatchToProps = (dispatch, ownProps) => {\r\nexport const mergeProps = (stateProps, dispatchProps, ownProps) => {\r\n // if NOT isMultiple and multiple selected leave only the first one\r\n if (\r\n !stateProps.isMultiple &&\r\n stateProps.toggles.filter((toggle) => {\r\n return toggle.isSelected;\r\n }).length > 1\r\n ) {\r\n const newtoggles = stateProps.toggles.map(\r\n (toggle: ToggleItemDTO, index: number) => {\r\n return immutable(toggle)\r\n .set(\"isSelected\", index === 0)\r\n .value();\r\n }\r\n );\r\n dispatchProps.dispatch(\r\n persistTogglesAction(stateProps.name, newtoggles)\r\n );\r\n }\r\n\r\n return {\r\n ...stateProps,\r\n ...dispatchProps,\r\n onClick: (item, isMultiple) => {\r\n var toggles = stateProps.toggles.map((toggle) => {\r\n if (!isMultiple) toggle.isSelected = false;\r\n if (toggle.value === item.value) {\r\n toggle.isSelected = !toggle.isSelected;\r\n }\r\n return toggle;\r\n }, this);\r\n // if none selected preselect first one\r\n /* istanbul ignore else */\r\n if (\r\n toggles.filter((toggle) => {\r\n return toggle.isSelected;\r\n }).length === 0\r\n ) {\r\n toggles[0].isSelected = true;\r\n }\r\n dispatchProps.dispatch(\r\n persistTogglesAction(ownProps.name, toggles)\r\n );\r\n },\r\n };\r\n};\r\n\r\nconst ToggleBarContainer = connect(\r\n mapStateToProps,\r\n null,\r\n mergeProps\r\n)(ToggleBarComponent);\r\n\r\nexport default ToggleBarContainer;\r\n","// @flow\r\nimport React, { type Node } from \"react\";\r\nimport \"./index.css\";\r\n// local components\r\nimport CrumbSelector from \"./CrumbSelector\";\r\nimport ToggleBarContainer from \"containers/ToggleBar\";\r\nimport ActionsMenu from \"components/ActionsMenu\";\r\nimport ActionsButton from \"components/ActionPanel/ActionsButton\";\r\nimport Pane from \"components/SplitPanes/Pane\";\r\nimport { openItemActionPanel } from \"components/ItemActionPanel\";\r\nimport { type ToggleDTO, type SearchItemDTO } from \"data/types\";\r\nimport { usePendingOfflineChanges } from \"./usePendingOfflineChanges\";\r\n\r\ntype Props = {\r\n /** toggles definition */\r\n toggles: ?ToggleDTO,\r\n /** React children */\r\n children?: Node,\r\n /** optional control to show at the beginning of topbar */\r\n topRowBefore?: Node,\r\n /** optional control to show at the end of topbar */\r\n topRowEnd?: Node,\r\n /** optional CSS class to apply */\r\n className?: string,\r\n /** current itemUri */\r\n itemUri?: ?string, //TODO remove MainLayout.ItemUri since it should be included in contextProps\r\n /** any contextProps to pass to actions */\r\n contextProps?: Object,\r\n /** optional used searchItem */\r\n searchItem?: SearchItemDTO,\r\n /** view name */\r\n name: string,\r\n /** callback when user selects action from ActionsMenu\r\n * @param {string} actionId which action has been selected by the user\r\n */\r\n onAction?: (actionId: string) => void,\r\n /** callback to decide whether specified action should be visible\r\n * @param {object} action action object for which to decide visibility\r\n * @returns {boolean} true if should be visible, false to not render\r\n */\r\n onActionShouldBeVisible?: (action: { id: string }) => boolean,\r\n /** scope breadcrumbs to recyclebin; default: false */\r\n breadcrumbIsRecycleBin?: boolean,\r\n /** whether user is allowed to navigate through breadcrumb (and hide favorite option); default: false */\r\n breadcrumbReadonly?: boolean,\r\n /** scope breadcrumb to show parts only starting the specified level number */\r\n breadcrumbScopeFromLevel?: number,\r\n /** optional breadcrumbPart click event instead of history.push */\r\n onBreadcrumbPartClick?: (itemUri: string) => void,\r\n /** whether to disable the whole actionsMenu; default: false */\r\n actionsDisabled?: boolean,\r\n};\r\n\r\nconst MainLayout = ({\r\n toggles,\r\n children,\r\n topRowClassName = \"\",\r\n topRowBefore,\r\n topRowEnd,\r\n id,\r\n className,\r\n itemUri,\r\n contextProps,\r\n searchItem,\r\n name,\r\n onAction,\r\n onActionShouldBeVisible,\r\n breadcrumbIsRecycleBin = false,\r\n breadcrumbReadonly = false,\r\n breadcrumbScopeFromLevel,\r\n onBreadcrumbPartClick,\r\n actionsDisabled = false,\r\n}: Props) => {\r\n usePendingOfflineChanges(itemUri);\r\n return (\r\n
\r\n \r\n {topRowBefore}\r\n
\r\n \r\n
\r\n\r\n {toggles && }\r\n\r\n {contextProps && (\r\n \r\n openItemActionPanel({ contextProps })\r\n }\r\n className=\"ab\"\r\n dataTest=\"openItemActionPanelButton\"\r\n />\r\n )}\r\n {onAction && name && (\r\n \r\n )}\r\n {topRowEnd}\r\n
\r\n \r\n {children}\r\n \r\n
\r\n );\r\n};\r\nMainLayout.displayName = \"MainLayout\";\r\nexport default MainLayout;\r\n","import { useEffect } from \"react\";\r\nimport { toastTypes, toastStyled } from \"data/toast\";\r\nimport { anyPendingChanges } from \"data/offline/offlineQueue\";\r\n\r\nexport function usePendingOfflineChanges(itemUri: string) {\r\n // const [hasPendingChanges, setHasPendingChanges] = useState(false);\r\n useEffect(() => {\r\n if (itemUri != null) {\r\n anyPendingChanges(itemUri).then((result) => {\r\n if (result === true) {\r\n toastStyled(toastTypes.offlinePendingChanges);\r\n }\r\n // setHasPendingChanges(result);\r\n });\r\n }\r\n }, [itemUri]);\r\n\r\n // useEffect(() => {\r\n // if (hasPendingChanges === true) {\r\n // toastStyled(toastTypes.offlinePendingChanges);\r\n // }\r\n // }, [hasPendingChanges]);\r\n}\r\n","// @flow\r\nimport React from \"react\";\r\nimport { openActionPanel } from \"containers/ActionPanel\";\r\nimport Icons from \"@hs/icons\";\r\nimport Breadcrumb from \"components/Breadcrumb\";\r\nimport Attributes from \"components/Attributes\";\r\nimport styles from \"./ItemActionPanel.module.css\";\r\nimport { type BreadcrumbResultDTO } from \"data/types\";\r\nimport { getFileExtension, getLocalizedText } from \"data/utils\";\r\nimport ActionCategory from \"components/ActionPanel/ActionCategory\";\r\nimport loc from \"i18next\";\r\n\r\nexport const RowTitle = ({ title, ext }: { title?: string, ext?: string }) => (\r\n <>\r\n {ext && }\r\n {title || \"Actions\"}\r\n \r\n);\r\nRowTitle.displayName = \"RowTitle\";\r\n\r\nexport const RowBody = ({\r\n thumbnail,\r\n breadcrumb,\r\n attributes,\r\n}: {\r\n thumbnail?: React.Element,\r\n breadcrumb?: BreadcrumbResultDTO,\r\n attributes?: Array>,\r\n}) => (\r\n \r\n
\r\n {thumbnail}\r\n {breadcrumb && (\r\n \r\n )}\r\n {attributes && (\r\n \r\n )}\r\n
\r\n \r\n);\r\nRowBody.displayName = \"RowBody\";\r\n\r\ntype Props = {\r\n /** the name of the item */\r\n title?: string,\r\n /** file extension (if document and known) */\r\n ext?: string,\r\n /** contextProps to pass to commandActions */\r\n contextProps: {\r\n itemUri: string,\r\n isDoc: boolean,\r\n formatId: number,\r\n name?: string,\r\n ext?: string,\r\n } & Object,\r\n /** file thumbnail (if document) */\r\n thumbnail?: React.Element,\r\n /** item breadcrumb */\r\n breadcrumb?: BreadcrumbResultDTO,\r\n /** item attribute values */\r\n attributes?: Array>,\r\n /** Target view (override for current)*/\r\n targetView?: string,\r\n};\r\n\r\nconst parseName = (name) =>\r\n typeof name !== \"string\" &&\r\n name &&\r\n Object.prototype.hasOwnProperty.call(name, \"value\")\r\n ? name.value\r\n : name;\r\n\r\nconst parseTitle = (title, parsedName) => {\r\n let parsedTitleOrName = title || parsedName;\r\n return `${parsedTitleOrName}`.startsWith(\"$folder:\")\r\n ? getLocalizedText(parsedTitleOrName)\r\n : parsedTitleOrName;\r\n};\r\n\r\nexport /**\r\n * opens an actionPanel for the given itemUri (can be a Document or Folder)\r\n */\r\nconst openItemActionPanel = ({\r\n title,\r\n ext,\r\n contextProps,\r\n thumbnail,\r\n breadcrumb,\r\n attributes,\r\n targetView,\r\n}: Props) => {\r\n const parsedName = parseName(contextProps && contextProps.name);\r\n const parsedTitle = parseTitle(title, parsedName);\r\n\r\n openActionPanel({\r\n title: (\r\n \r\n ),\r\n body: (thumbnail || breadcrumb || attributes) && (\r\n \r\n ),\r\n contextProps,\r\n targetView,\r\n });\r\n};\r\n","// @flow\r\nimport React from \"react\";\r\nimport ModalBootstrap from \"react-bootstrap/lib/Modal\";\r\nimport Form from \"react-bootstrap/lib/Form\";\r\nimport { isHandheld, isIOS } from \"data/bowser\";\r\nimport debounce from \"lodash/debounce\";\r\nimport styles from \"./Modal.module.css\";\r\nimport { History } from \"history\";\r\nimport { withRouter } from \"react-router\";\r\nimport queryString from \"data/queryString\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\nconst ModalHeader = (props) => ;\r\nconst ModalTitle = (props) => ;\r\nconst ModalBody = (props) => ;\r\nconst ModalFooter = (props) => ;\r\n\r\nexport const ModalSize = {\r\n Large: \"large\",\r\n Medium: undefined,\r\n Small: \"small\",\r\n};\r\n\r\ntype ModalSizeEnum = $Values;\r\n\r\ntype Props = {\r\n history: History,\r\n show: boolean,\r\n onHide: () => void,\r\n onKeyPress: () => void,\r\n style?: CSSStyleDeclaration,\r\n /** width of Dialog box to render */\r\n size?: ModalSizeEnum,\r\n /** height in pixels of header\r\n * @default 42 */\r\n headerSize?: number,\r\n /** height in pixels of footer\r\n * @default 0\r\n */\r\n footerSize?: number,\r\n /** whether to scroll modal contents\r\n * @default false\r\n */\r\n scroll?: boolean,\r\n /** whether modal should take fullscreen height (true) or max-height (false)\r\n * @default false\r\n */\r\n fullscreen?: boolean,\r\n /** whether modal should open docked to the right (true) or centered (false)\r\n * @default false\r\n */\r\n docked?: boolean,\r\n /** whether modal should enforce focus state (set to false if portal is used within modal)\r\n * @default true\r\n */\r\n enforceFocus?: boolean,\r\n /** optional CSS class to apply to Modal dialog */\r\n dialogClassName?: string,\r\n /** optional string to help test engines target this component */\r\n dataTest?: string,\r\n};\r\n\r\ntype State = {\r\n vh: number,\r\n fs: boolean,\r\n closeRequested: boolean,\r\n};\r\n\r\n/**\r\n * wrapper around Modal which will dynamically calculate viewport height\r\n */\r\nexport class Modal extends React.PureComponent {\r\n Header: ModalHeader;\r\n Title: ModalTitle;\r\n Body: ModalBody;\r\n Footer: ModalFooter;\r\n\r\n static defaultProps = {\r\n size: ModalSize.Large,\r\n headerSize: 42,\r\n footerSize: 0,\r\n scroll: false,\r\n fullscreen: false,\r\n enforceFocus: true,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n const fs = this._shouldFullscreen();\r\n this.state = {\r\n vh: this._getHeight(fs),\r\n fs,\r\n closeRequested: false,\r\n location: props.history.location,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this.historyUnlisten = this.props.history.listen((location, action) => {\r\n // Compare search parameter to distinguish if modal should be closed: Do not close Modal on e.g. pagination\r\n const _search = queryString.parse(this.state.location.search);\r\n const search = queryString.parse(location.search);\r\n const closeRequested = search.uri !== _search.uri;\r\n this.setState({\r\n location,\r\n closeRequested,\r\n });\r\n });\r\n window.addEventListener(\"resize\", this._onResizeDebounced, {\r\n capture: false,\r\n passive: true,\r\n });\r\n };\r\n\r\n componentWillUnmount = () => {\r\n if (this.historyUnlisten) this.historyUnlisten();\r\n window.removeEventListener(\"resize\", this._onResizeDebounced);\r\n };\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (this.props.show !== prevProps.show && this.props.show === true)\r\n this._onResize();\r\n }\r\n\r\n _onResize = () => {\r\n const fs = this._shouldFullscreen();\r\n this.setState({\r\n vh: this._getHeight(\r\n /*istanbul ignore next*/ fs || this.props.docked\r\n ),\r\n fs,\r\n });\r\n };\r\n\r\n _onResizeDebounced = debounce(this._onResize, 400);\r\n\r\n _shouldFullscreen = () => isHandheld() || this._getWidth() <= 768;\r\n\r\n _getWidth = () =>\r\n isIOS() ? document.documentElement.clientWidth : window.innerWidth;\r\n\r\n _getHeight = (fs: boolean) => {\r\n const height = isIOS()\r\n ? document.documentElement.clientHeight\r\n : window.innerHeight;\r\n const margin = fs ? 0 : 31;\r\n return (\r\n height - this.props.headerSize - this.props.footerSize - margin * 2\r\n );\r\n };\r\n\r\n _renderChildren = (children) =>\r\n React.Children.map(children, (child, index) =>\r\n this._renderChild(child)\r\n );\r\n\r\n _renderChild = (child) => {\r\n /* istanbul ignore else */\r\n if (child != null) {\r\n if (child.type === ModalBody) {\r\n return React.cloneElement(child, {\r\n style: {\r\n height: this.props.fullscreen\r\n ? this.state.vh\r\n : undefined,\r\n maxHeight: this.props.fullscreen\r\n ? undefined\r\n : this.state.vh,\r\n overflowY:\r\n this.props.scroll === true ? \"auto\" : \"hidden\",\r\n },\r\n });\r\n } else if (child.type === ModalHeader) {\r\n return React.cloneElement(child, {\r\n style: {\r\n height: this.props.headerSize,\r\n },\r\n });\r\n } else if (\r\n child.type === Form &&\r\n React.Children.count(child.props.children) > 0\r\n ) {\r\n return React.cloneElement(\r\n child,\r\n {},\r\n this._renderChildren(child.props.children)\r\n );\r\n } else {\r\n return React.cloneElement(child, {});\r\n }\r\n }\r\n };\r\n render() {\r\n const { show, onHide, onKeyPress, dialogClassName, style } = this.props;\r\n return (\r\n \r\n {this._renderChildren(this.props.children)}\r\n \r\n );\r\n }\r\n}\r\n\r\nModal.Header = ModalHeader;\r\nModal.Title = ModalTitle;\r\nModal.Body = ModalBody;\r\nModal.Footer = ModalFooter;\r\nexport default withRouter(Modal);\r\n","// @flow\r\nimport React, { useMemo } from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport queryString from \"data/queryString\";\r\nimport { getRoute } from \"components/ItemUriLink\";\r\nimport AttributeLabel from \"components/ExtraAttributes/AttributeLabel\";\r\nimport ViewerControlBase from \"components/ExtraAttributes/ViewerControl/ViewerControlBase\";\r\nimport styles from \"./LinkViewer.module.css\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** attribute name */\r\n name: string,\r\n /** current value */\r\n value: string | any,\r\n /** which link type to create (mailto, tel, ...) set as prefix (if not defined will show localized \"open link\" text */\r\n linkType?: string,\r\n /** value width */\r\n width?: number,\r\n /** which FontAwesome icon to render */\r\n icon?: string,\r\n /** whether icon should be place at beginning or end of text */\r\n isIconLast?: boolean,\r\n width?: number,\r\n className?: string,\r\n caption?: string,\r\n /** optional onClick handler */\r\n onClick?: () => void,\r\n};\r\n\r\ntype ControlledProps = Props & {\r\n /** label text */\r\n header?: string,\r\n /** whether rendered inside a Grid */\r\n isGridCell: boolean,\r\n};\r\n\r\nconst renderValue = (\r\n linkType?: string,\r\n value?: string,\r\n caption?: string,\r\n icon?: string,\r\n isIconLast?: boolean\r\n) => (\r\n <>\r\n {icon && isIconLast === false && (\r\n <>\r\n {\" \"}\r\n \r\n )}\r\n {linkType == null && caption == null ? (\r\n {loc.t(\"plugin:extraAttributes.link_open\")}\r\n ) : (\r\n {caption || value}\r\n )}\r\n {icon && isIconLast && (\r\n <>\r\n {\" \"}\r\n \r\n \r\n )}\r\n \r\n);\r\n\r\nconst useAnchorProps = (value, linkType, width) => {\r\n // #35977 convert inpoint:browse links\r\n let href = String(value || \"\");\r\n let target = \"_blank\";\r\n\r\n let comparableValue = String(value || \"\").toLowerCase();\r\n if (comparableValue.startsWith(\"inpoint:browse\")) {\r\n const qs = queryString.parse(value.substr(value.indexOf(\"?\")));\r\n /* istanbul ignore else */\r\n if (qs[\"uri\"] !== undefined) {\r\n target = \"_self\";\r\n href = getRoute(qs.uri, null, true);\r\n }\r\n } else if (comparableValue.startsWith(\"pam-item://\")) {\r\n target = \"_self\";\r\n href = getRoute(comparableValue, null, true);\r\n } else if (linkType != null) {\r\n href = `${linkType}:${href}`;\r\n }\r\n let style: CSSStyleDeclaration = useMemo(\r\n () => ({\r\n color: \"#337ab7\",\r\n width: width && width > 0 ? `${width}px` : \"100px\",\r\n }),\r\n [width]\r\n );\r\n return useMemo(() => ({ href, target, style }), [href, target, style]);\r\n};\r\n\r\nconst LinkViewer = ({\r\n name,\r\n value,\r\n linkType,\r\n width,\r\n icon,\r\n isIconLast,\r\n className,\r\n caption,\r\n onClick,\r\n}: Props) => {\r\n const { style, href, target } = useAnchorProps(value, linkType, width);\r\n return href.length > 0 ? (\r\n \r\n {renderValue(linkType, value, caption, icon, isIconLast)}\r\n \r\n ) : (\r\n \r\n {loc.t(\"plugin:extraAttributes.link_empty\")}\r\n \r\n );\r\n};\r\nLinkViewer.displayName = \"LinkViewer\";\r\n\r\nconst LinkViewerControl = ({\r\n isGridCell,\r\n header,\r\n ...props\r\n}: ControlledProps) => {\r\n if (isGridCell)\r\n return (\r\n
\r\n \r\n
\r\n );\r\n else\r\n return (\r\n \r\n {\" \"}\r\n \r\n \r\n );\r\n};\r\n\r\nLinkViewerControl.displayName = \"LinkViewerControl\";\r\nLinkViewerControl.defaultProps = {\r\n isGridCell: false,\r\n isIconLast: true,\r\n icon: \"external-link\",\r\n};\r\nexport default LinkViewerControl;\r\n\r\nexport { LinkViewer };\r\n","import React, { PureComponent } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { docThumbnailRequestAction } from \"data/actions\";\r\n// import { fetchThumbnail } from \"data/api\";\r\nimport Img from \"react-image\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport styles from \"./Thumbnail.module.css\";\r\n\r\ntype Props = {\r\n /** document's itemUri */\r\n itemUri: string,\r\n /** callback when rendered (and HTML loaded) */\r\n onLoad?: () => void,\r\n /** callback when user clicks the img element */\r\n onClick?: () => void,\r\n // from Redux\r\n /** thumbnail's data base64 encoded */\r\n result?: string,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** thumbnail fetch status */\r\n status: ConstantsEnum,\r\n /** optional style to apply to image itself\r\n * @default {CSSStyleDeclaration} { maxHeight:128, maxWidth:128 }\r\n */\r\n style?: CSSStyleDeclaration,\r\n};\r\n\r\n/**\r\n * Renders one document's Thumbnail\r\n */\r\nexport class Thumbnail extends PureComponent {\r\n componentDidMount() {\r\n /* istabul ignore else */\r\n if (\r\n this.props.itemUri != null &&\r\n this.props.result === undefined &&\r\n this.props.status === Constants.NONE\r\n ) {\r\n this._fetch();\r\n }\r\n }\r\n\r\n _fetch = () => {\r\n const { itemUri, dispatch } = this.props;\r\n dispatch(docThumbnailRequestAction(itemUri));\r\n };\r\n\r\n _onLoad = () => {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onLoad === \"function\") this.props.onLoad();\r\n };\r\n\r\n render() {\r\n if (\r\n this.props.result == null ||\r\n String(this.props.result).length === 0\r\n ) {\r\n if (\r\n [Constants.NONE, Constants.LOADING].includes(this.props.status)\r\n ) {\r\n return ;\r\n } else {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n } else {\r\n return (\r\n }\r\n className={styles.thumbnail}\r\n style={\r\n this.props.style || {\r\n maxWidth: 128,\r\n maxHeight: 128,\r\n }\r\n }\r\n />\r\n );\r\n }\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n status: s.thumbnailStatusSelector(state, ownProps.itemUri),\r\n result:\r\n ownProps.itemUri == null\r\n ? undefined\r\n : s.thumbnailStatusSelector(state, ownProps.itemUri) ===\r\n Constants.OK\r\n ? s.thumbnailResultSelector(state, ownProps.itemUri)\r\n : undefined,\r\n ...ownProps,\r\n});\r\n\r\nexport default connect(mapStateToProps)(Thumbnail);\r\n","//@flow\r\nimport React from \"react\";\r\nimport { useMomentLocale } from \"hooks\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\nimport { getDisplayName } from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport Constants from \"data/constants\";\r\n\r\nconst Moment = (WrappedComponent: ComponentType) => {\r\n function MomentLocale(props: any) {\r\n const status = useMomentLocale(userLanguage());\r\n return status === Constants.OK ? (\r\n \r\n ) : (\r\n \r\n );\r\n }\r\n MomentLocale.displayName = `MomentLocale(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n return MomentLocale;\r\n};\r\n\r\nexport default Moment;\r\n","export const removeSpaces = (text) => {\r\n return typeof text === \"string\" ? text.replace(/ /g, \"\") : text;\r\n};\r\n","// @flow\r\nimport React from \"react\";\r\nimport Avatar from \"components/User/Avatar\";\r\nimport AttributeLabel from \"components/ExtraAttributes/AttributeLabel\";\r\nimport ViewerControlBase from \"components/ExtraAttributes/ViewerControl/ViewerControlBase\";\r\n\r\ntype Props = {\r\n header?: string,\r\n value: any | string,\r\n userid: number,\r\n width?: number,\r\n};\r\n\r\nconst UserIdViewerControl = ({ header, value, userid, width }: Props) => {\r\n return (\r\n \r\n {\" \"}\r\n \r\n \r\n \r\n {value}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nUserIdViewerControl.displayName = \"UserIdViewerControl\";\r\nexport default UserIdViewerControl;\r\n","import { type FormFieldDTO } from \"data/types\";\r\nimport {\r\n type FormResultDTO,\r\n type DocFormResultDTO,\r\n type FormFieldInfo,\r\n} from \"data/types\";\r\n\r\nimport StaticViewerControl from \"components/ExtraAttributes/ViewerControl/StaticViewerControl\";\r\nimport UserIdViewerControl from \"components/ExtraAttributes/ViewerControl/UserIdViewerControl\";\r\nimport ImageViewerControl from \"components/ExtraAttributes/ViewerControl/ImageViewerControl\";\r\nimport LocationViewerControl from \"components/ExtraAttributes/ViewerControl/LocationViewerControl\";\r\nimport GeoRasterViewerControl from \"components/ExtraAttributes/ViewerControl/GeoRasterViewerControl\";\r\nimport EmailViewerControl from \"components/ExtraAttributes/ViewerControl/EmailViewerControl\";\r\nimport TelViewerControl from \"components/ExtraAttributes/ViewerControl/TelViewerControl\";\r\nimport LinkViewerControl from \"components/ExtraAttributes/ViewerControl/LinkViewerControl\";\r\n\r\nconst findCustomField = (\r\n fields: Array,\r\n name: string\r\n): ?FormFieldDTO => {\r\n return fields.find((f) => f.format === name && f.name === name);\r\n};\r\n\r\nexport const getFields = (\r\n form: FormResultDTO | DocFormResultDTO,\r\n itemUri: string\r\n): ?Array => {\r\n return form?.fields?.map((field) =>\r\n getFieldType(itemUri, form.formatId, field, form.fields)\r\n );\r\n};\r\n\r\nconst getFieldType = (\r\n itemUri: string,\r\n formatId: number,\r\n field: FormFieldDTO,\r\n fields: Array\r\n): ?FormFieldInfo => {\r\n const header = field.header || field.name;\r\n\r\n switch (field.format) {\r\n case undefined:\r\n return null;\r\n\r\n case \"Image\":\r\n return {\r\n Component: ImageViewerControl,\r\n props: {\r\n name: header,\r\n header,\r\n value: field.value,\r\n },\r\n };\r\n\r\n case \"CreatorName\":\r\n const creatorIdField = findCustomField(fields, \"CreatorId\");\r\n /* istanbul ignore next */\r\n if (creatorIdField === undefined) return null;\r\n return {\r\n Component: UserIdViewerControl,\r\n props: {\r\n header,\r\n value: field.value,\r\n userid: parseInt(creatorIdField.value, 10),\r\n width: field.width,\r\n },\r\n };\r\n\r\n case \"ModifiedName\":\r\n const modifiedIdField = findCustomField(fields, \"ModifiedId\");\r\n /* istanbul ignore next */\r\n if (modifiedIdField === undefined) return null;\r\n return {\r\n Component: UserIdViewerControl,\r\n props: {\r\n header,\r\n value: field.value,\r\n userid: parseInt(modifiedIdField.value, 10),\r\n width: field.width,\r\n },\r\n };\r\n\r\n case \"CreatorId\":\r\n case \"ModifiedId\":\r\n // those will not be rendered since they are internally created\r\n /* istanbul ignore next */\r\n if (field.format === field.name) return null;\r\n else\r\n return {\r\n Component: StaticViewerControl,\r\n props: {\r\n name: field.name,\r\n header,\r\n value: field.value,\r\n width: field.width,\r\n },\r\n };\r\n\r\n case \"Text_GeoPoint\":\r\n case \"Text_GeoArea\":\r\n return {\r\n Component: LocationViewerControl,\r\n props: {\r\n name: field.name,\r\n header,\r\n value: field.value,\r\n width: field.width,\r\n marker: field.extra && field.extra.marker,\r\n },\r\n };\r\n\r\n case \"Text_GeoRaster\":\r\n return {\r\n Component: GeoRasterViewerControl,\r\n props: {\r\n itemUri,\r\n formatId,\r\n name: field.name,\r\n header,\r\n value: field.value,\r\n width: field.width,\r\n marker: field.extra && field.extra.marker,\r\n },\r\n };\r\n\r\n case \"Text_Lookup\":\r\n case \"Text_LookupRep\":\r\n const value =\r\n field.value == null || field.value.T == null\r\n ? null\r\n : field.value.T;\r\n return {\r\n Component: StaticViewerControl,\r\n props: {\r\n name: field.name,\r\n header,\r\n value,\r\n width: field.width,\r\n },\r\n };\r\n\r\n case \"Text_TelNumber\":\r\n return {\r\n Component: TelViewerControl,\r\n props: {\r\n name: field.name,\r\n header,\r\n value: field.value,\r\n isGridCell: false,\r\n },\r\n };\r\n\r\n case \"Text_EMail\":\r\n return {\r\n Component: EmailViewerControl,\r\n props: {\r\n name: field.name,\r\n header,\r\n value: field.value,\r\n isGridCell: false,\r\n },\r\n };\r\n\r\n case \"Text_Link\":\r\n return {\r\n Component: LinkViewerControl,\r\n props: {\r\n name: field.name,\r\n header,\r\n value: field.value,\r\n isGridCell: false,\r\n },\r\n };\r\n case \"WebDavName\":\r\n if (field.extra && field.extra.hidden) {\r\n return null;\r\n }\r\n //fall through\r\n default:\r\n return {\r\n Component: StaticViewerControl,\r\n props: {\r\n name: field.name,\r\n header,\r\n value: field.value,\r\n width: field.width,\r\n },\r\n };\r\n }\r\n};\r\n","// @flow\r\nimport React, { useMemo, memo } from \"react\";\r\nimport Form from \"react-bootstrap/lib/Form\";\r\nimport Row from \"react-bootstrap/lib/Row\";\r\nimport \"./index.css\";\r\nimport EAForm from \"components/ExtraAttributes/EAForm\";\r\nimport NoData from \"components/NoData\";\r\nimport LocalContactInfo from \"components/LocalContactInfo\";\r\nimport { type FormResultDTO, type DocFormResultDTO } from \"data/types\";\r\nimport { LabelSizeContext } from \"data/context\";\r\nimport { getClassNames } from \"data/utils\";\r\nimport { getFields } from \"./utils\";\r\n\r\ntype Props = {\r\n form: FormResultDTO | DocFormResultDTO,\r\n itemUri: string,\r\n isNoDataError: boolean,\r\n};\r\n\r\nconst MyForm = memo(({ form, itemUri, isNoDataError }: Props) => {\r\n const fields = useMemo(() => getFields(form, itemUri), [form, itemUri]);\r\n const fieldsLength = useMemo(\r\n () => fields?.filter((field) => field).length,\r\n [fields]\r\n );\r\n\r\n const hasEA = useMemo(() => form?.attributes != null, [form]);\r\n return (\r\n e.preventDefault()}\r\n data-test=\"form\"\r\n >\r\n \r\n {form?.fields != null &&\r\n fieldsLength > 0 &&\r\n fields.map(\r\n (field, index) =>\r\n field && (\r\n \r\n \r\n \r\n )\r\n )}\r\n {hasEA && (\r\n \r\n )}\r\n {(form?.fields === null || fieldsLength === 0) &&\r\n form?.attributes === null && (\r\n \r\n {isNoDataError && }\r\n \r\n )}\r\n \r\n \r\n );\r\n});\r\n\r\nexport default MyForm;\r\n","import React from \"react\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\n\r\nconst HiddenEditorControl = (props) => (\r\n (\r\n \r\n )}\r\n {...props}\r\n />\r\n);\r\nHiddenEditorControl.displayName = \"HiddenEditorControl\";\r\nexport default HiddenEditorControl;\r\n","// @flow\r\nimport React from \"react\";\r\nimport TextEditorControl from \"components/ExtraAttributes/EditorControl/TextEditorControl\";\r\nimport HiddenEditorControl from \"components/ExtraAttributes/EditorControl/HiddenEditorControl\";\r\nimport MemoEditorControl from \"components/ExtraAttributes/EditorControl/MemoEditorControl\";\r\nimport NumberEditorControl from \"components/ExtraAttributes/EditorControl/NumberEditorControl\";\r\nimport LookupEditorControl from \"components/ExtraAttributes/EditorControl/LookupEditorControl\";\r\nimport StaticViewerControl from \"components/ExtraAttributes/ViewerControl/StaticViewerControl\";\r\nimport UserIdViewerControl from \"components/ExtraAttributes/ViewerControl/UserIdViewerControl\";\r\nimport ImageEditorControl from \"components/ExtraAttributes/EditorControl/ImageEditorControl\";\r\nimport DateEditorControl from \"components/ExtraAttributes/EditorControl/DateEditorControl\";\r\nimport GeoPointEditorControl from \"components/ExtraAttributes/EditorControl/LoadableGeoPointEditorControl\";\r\nimport GeoAreaEditorControl from \"components/ExtraAttributes/EditorControl/GeoAreaEditorControl\";\r\nimport GeoRasterEditorControl from \"components/ExtraAttributes/EditorControl/GeoRasterEditorControl\";\r\nimport { type FormFieldDTO, FormLookupType } from \"data/types\";\r\nimport loc from \"i18next\";\r\nimport {\r\n GeoPointValidationRegex,\r\n GeoAreaValidationRegex,\r\n} from \"components/MapViewer/utils\";\r\nimport { DateTimeFormat } from \"data/types\";\r\n\r\nfunction findCustomField(\r\n fields: Array,\r\n name: string\r\n): FormFieldDTO | void {\r\n return fields.find((f) => f.format === name && f.name === name);\r\n /*for (var i = 0; i < fields.length; i++) {\r\n if (fields[i].format === name && fields[i].name === name)\r\n return fields[i];\r\n }\r\n return undefined;*/\r\n}\r\n\r\nfunction getValidationErrors(field: FormFieldDTO, customErrors?: Object) {\r\n let validationErrors = customErrors || {};\r\n if (field.req)\r\n validationErrors.isDefaultRequiredValue = loc.t(\r\n \"common:validation.required\"\r\n );\r\n return validationErrors;\r\n}\r\n\r\nconst FieldEdit = ({\r\n isDoc,\r\n itemUri,\r\n formatId,\r\n field,\r\n fields,\r\n onChange,\r\n}: {\r\n isDoc: boolean,\r\n itemUri: string,\r\n formatId: number,\r\n field: FormFieldDTO,\r\n fields: Array,\r\n onChange: Function,\r\n}) => {\r\n const formPrefix = \"ip.\";\r\n const header = field.header || field.name;\r\n //console.dir(formAttribute);\r\n switch (field.format) {\r\n case \"None\":\r\n case undefined:\r\n return null;\r\n\r\n case \"Image\":\r\n return (\r\n \r\n );\r\n\r\n case \"CreatorName\":\r\n const creatorIdField = findCustomField(fields, \"CreatorId\");\r\n /* istanbul ignore if */\r\n if (creatorIdField === undefined) return null;\r\n return (\r\n \r\n );\r\n\r\n case \"ModifiedName\":\r\n const modifiedIdField = findCustomField(fields, \"ModifiedId\");\r\n /* istanbul ignore if */\r\n if (modifiedIdField === undefined) return null;\r\n return (\r\n \r\n );\r\n\r\n case \"CreatorId\":\r\n case \"ModifiedId\":\r\n // those will not be rendered since they are internally created\r\n if (field.format === field.name) return null;\r\n else\r\n return (\r\n \r\n );\r\n\r\n case \"Date_Time\":\r\n case \"Date_Date\":\r\n if (field.ro) {\r\n return (\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n );\r\n }\r\n\r\n case \"Text_Lookup\":\r\n case \"Text_LookupRep\":\r\n const value =\r\n field.value == null || field.value.T == null\r\n ? null\r\n : field.value;\r\n return (\r\n \r\n );\r\n\r\n case \"Number_IntegerNumber\":\r\n return (\r\n \r\n );\r\n\r\n case \"Number_DecimalNumberOneDecimal\":\r\n return (\r\n \r\n );\r\n\r\n case \"Number_DecimalNumberTwoDecimal\":\r\n return (\r\n \r\n );\r\n\r\n case \"Number_DecimalNumberThreeDecimal\":\r\n return (\r\n \r\n );\r\n\r\n case \"Number_CurrencyEuroTwoDecimal\":\r\n return (\r\n \r\n );\r\n\r\n case \"Number_CurrencyDollarTwoDecimal\":\r\n return (\r\n \r\n );\r\n\r\n case \"Number_CurrencyEuroThreeDecimal\":\r\n return (\r\n \r\n );\r\n\r\n case \"Number_CurrencyDollarThreeDecimal\":\r\n return (\r\n \r\n );\r\n\r\n case \"WebDavName\":\r\n // Render hidden field, in case WebDavName is hidden\r\n if (field.extra && field.extra.hidden === true) {\r\n return (\r\n \r\n );\r\n }\r\n return (\r\n \r\n );\r\n\r\n case \"Text_TelNumber\":\r\n return (\r\n \r\n );\r\n\r\n case \"Text_Text\":\r\n return (\r\n \r\n );\r\n\r\n case \"Text_EMail\":\r\n return (\r\n \r\n );\r\n\r\n case \"Text_GeoPoint\":\r\n return (\r\n \r\n );\r\n\r\n case \"Text_GeoArea\":\r\n return (\r\n \r\n );\r\n\r\n case \"Text_GeoRaster\":\r\n return (\r\n \r\n );\r\n case \"Text_Link\":\r\n return (\r\n \r\n );\r\n\r\n default:\r\n return (\r\n \r\n );\r\n }\r\n};\r\n\r\nexport default FieldEdit;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { Prompt } from \"react-router\";\r\n\r\ntype Props = { isDirty: boolean, message: ?string | ?boolean };\r\n\r\nexport default class NavigationBlock extends PureComponent {\r\n componentDidUpdate() {\r\n if (this.props.isDirty === true) {\r\n window.onbeforeunload = /* istanbul ignore next */ () =>\r\n this.props.message;\r\n } else {\r\n window.onbeforeunload = undefined;\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n window.onbeforeunload = undefined;\r\n }\r\n\r\n render() {\r\n const { isDirty, message } = this.props;\r\n if (message == null) return null;\r\n return ;\r\n }\r\n}\r\n","// @flow\r\nimport React, { PureComponent, type Children } from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport Formsy from \"formsy-react\";\r\nimport Row from \"react-bootstrap/lib/Row\";\r\nimport ButtonToolbar from \"react-bootstrap/lib/ButtonToolbar\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport FieldEdit from \"./FieldEdit\";\r\nimport \"components/Form/index.css\";\r\nimport EAForm from \"components/ExtraAttributes/EAForm\";\r\nimport NoData from \"components/NoData\";\r\nimport LocalContactInfo from \"components/LocalContactInfo\";\r\nimport loc from \"i18next\";\r\nimport produce from \"immer\";\r\nimport immutable from \"object-path-immutable\";\r\nimport { addValidationRule } from \"formsy-react\";\r\nimport { extraAttributesSetField } from \"data/actions\";\r\nimport NavigationBlock from \"components/NavigationBlock\";\r\nimport { type FormResultDTO, type DocFormResultDTO } from \"data/types\";\r\nimport isEmpty from \"lodash/isEmpty\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { LabelSizeContext } from \"data/context\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** the Form itself */\r\n form: FormResultDTO | DocFormResultDTO,\r\n /** itemUri of Folder or Document */\r\n itemUri: string,\r\n /** callback for Cancel button */\r\n onCancel?: () => void,\r\n /** callback for Save button\r\n * @param {Object} model model to save\r\n * @returns {boolean} true is success\r\n */\r\n onSave: (model: Object) => boolean,\r\n /**\r\n * handler to validate model\r\n * @param {Object} model the current form (changed) values\r\n * @returns {Object} validation errors e.g. {field:msg,field:msg,...}\r\n */\r\n onValidate: (model: Object) => Object,\r\n /** save button label\r\n * @default common:save\r\n */\r\n saveLabel?: string,\r\n /** saving button label\r\n * @default common:savingLabel\r\n */\r\n savingLabel?: string,\r\n /** if NOT null will prompt user upon navigating away */\r\n confirmLabel?: boolean,\r\n /** should the save button be enabled */\r\n isFormButtonEnabled?: boolean,\r\n /** whether to include all or only changed fields\r\n * @default false\r\n */\r\n onSaveReturnAllFields?: boolean,\r\n /** defaultValues to set\r\n * Note: $NAME$ is special - see {@link _prepForm}\r\n * @example {\"$NAME$\"\":\"test.docx\"}\r\n */\r\n defaultValues?: Object,\r\n /** optional DOM ref to render ButtonToolbar onto (otherwise will render as child of form) */\r\n buttonToolbarPortal?: React.DOMElement,\r\n};\r\n\r\ntype State = {\r\n canSubmit: boolean,\r\n changed: Object,\r\n form: FormResultDTO | DocFormResultDTO,\r\n validationErrors: Object,\r\n isSubmitting: boolean,\r\n isValidating: boolean,\r\n};\r\n\r\nexport class MyFormEdit extends PureComponent {\r\n constructor(props: Props, children: any) {\r\n super(props);\r\n this._onSubmit = this._onSubmit.bind(this);\r\n this._formsyRef = React.createRef();\r\n this.state = {\r\n canSubmit: false,\r\n isSubmitting: false,\r\n isValidating: false,\r\n validationErrors: {},\r\n ...this._prepForm(props.form),\r\n };\r\n this._setupValidations();\r\n this._onFieldChange = this._onFieldChange.bind(this);\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n if (this.props.form !== prevProps.form) {\r\n this.setState((state) => ({\r\n ...this._prepForm(this.props.form, state.changed),\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * returns immutable form & changeLog with applied props.defaultValues\r\n * Note: $NAME$ is special\r\n * @param {FormResultDTO} form the current form\r\n * @memberof MyFormEdit\r\n */\r\n _prepForm = (form: FormResultDTO | DocFormResultDTO, changed = {}) => {\r\n const { defaultValues } = this.props;\r\n return produce({ form, changed }, (draft) => {\r\n if (defaultValues == null || form == null) {\r\n return;\r\n }\r\n Object.keys(defaultValues).forEach((defaultValueKey) => {\r\n if (defaultValueKey.startsWith(\"ea.\")) {\r\n /* istanbul ignore next */\r\n if (form.attributes == null) {\r\n console.warn(\r\n `Requested setting DefaultValue for ${defaultValueKey} but there are no ExtraAttributes defined here!`\r\n );\r\n return null;\r\n }\r\n const defaultAttributeKey = defaultValueKey.substr(3);\r\n let idx = form.attributes.findIndex(\r\n (attribute) => attribute.name === defaultAttributeKey\r\n );\r\n if (idx === -1) {\r\n console.warn(\r\n `Requested setting DefaultValue for ${defaultValueKey} but it was not found!`\r\n );\r\n return;\r\n }\r\n /* istanbul ignore else */\r\n if (draft.changed.ea == null) draft.changed.ea = {};\r\n // update changeLog (dot notation)\r\n draft.changed.ea[form.attributes[idx].name] =\r\n defaultValues[defaultValueKey];\r\n // update form (to immediately show value)\r\n draft.form.attributes[idx].value =\r\n defaultValues[defaultValueKey];\r\n } else {\r\n const defaultFieldKey = defaultValueKey.startsWith(\"ip.\")\r\n ? defaultValueKey.substr(3)\r\n : defaultValueKey;\r\n // find field by field name (commonName)\r\n let idx = form.fields.findIndex(\r\n (field) => field.name === defaultFieldKey\r\n );\r\n if (idx === -1) {\r\n console.warn(\r\n `Requested setting DefaultValue for ${defaultValueKey} but it was not found!`\r\n );\r\n return;\r\n }\r\n /* istanbul ignore else */\r\n if (draft.changed.ip == null) draft.changed.ip = {};\r\n // update changeLog (dot notation)\r\n draft.changed.ip[form.fields[idx].name] =\r\n defaultValues[defaultValueKey];\r\n // update form (to immediately show value)\r\n draft.form.fields[idx].value =\r\n defaultValues[defaultValueKey];\r\n }\r\n });\r\n });\r\n };\r\n\r\n /* istanbul ignore next */ _setupValidations = () => {\r\n // setup our custom validation rules used by Field/AttributeEdit components\r\n addValidationRule(\"isRange\", (values, value, range) => {\r\n // empty value need no validation - is required needs additional isRequired validation\r\n if (value == null) return true;\r\n return value >= range.min && value <= range.max;\r\n });\r\n\r\n addValidationRule(\"isFilename\", (values, value) => {\r\n // rules: https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file\r\n var rg1 = /^[^\\\\/:*?\"<>|]+$/; // forbidden characters \\ / : * ? \" < > |\r\n var rg2 = /^\\./; // cannot start with dot (.)\r\n var rg3 = /^(aux|nul|prn|con|lpt[1-9]|com[1-9])(\\.|$)/i; // forbidden file names\r\n return rg1.test(value) && !rg2.test(value) && !rg3.test(value);\r\n });\r\n\r\n addValidationRule(\"isPathname\", (values, value) => {\r\n var rg1 = /^[^\\\\/:*?\"<>|]+$/; // forbidden characters \\ / : * ? \" < > |\r\n return rg1.test(value);\r\n });\r\n\r\n addValidationRule(\r\n \"isNotInvalid\",\r\n (values, value) =>\r\n value == null || !String(value).startsWith(\"__INVALID__\")\r\n );\r\n };\r\n\r\n _onInvalid = () => this.setState({ canSubmit: false });\r\n\r\n _onValid = () => this.setState({ canSubmit: true });\r\n\r\n _onSubmit = async (\r\n model: Object,\r\n resetForm?: boolean,\r\n invalidateForm?: boolean\r\n ) => {\r\n try {\r\n this.setState({ isValidating: true });\r\n const validationErrors = await this.props.onValidate(model);\r\n if (!isEmpty(validationErrors)) {\r\n invalidateForm(validationErrors);\r\n this.setState({ isValidating: false });\r\n } else {\r\n this.setState({ isValidating: false, isSubmitting: true });\r\n const result = await this.props.onSave(\r\n this.props.onSaveReturnAllFields === true\r\n ? model\r\n : this.state.changed\r\n );\r\n if (false === result) {\r\n this.setState({ isSubmitting: false });\r\n }\r\n }\r\n } catch (e) {\r\n /* istanbul ignore else */\r\n if (e.code !== 20)\r\n //AbortController aborted\r\n this.setState({ isValidating: false, isSubmitting: false });\r\n }\r\n };\r\n\r\n /**\r\n * On every change will update changeLog and fire a Redux action\r\n * @param {string} name the field's name (dot notation e.g. ip.WebDavName)\r\n * @param {any} value the field's value\r\n * @memberof MyFormEdit\r\n */\r\n _onFieldChange = (name: string, value: any): void => {\r\n const splittedName = name.split(\".\");\r\n\r\n // is it an inPoint field?\r\n const valueType = splittedName[0] === \"ip\" ? \"fields\" : \"attributes\";\r\n const idx = this.state.form[valueType].findIndex(\r\n (a) => a.name === splittedName[1]\r\n );\r\n // Allow fast (= multiple) field changes of state (e.g. Lookup Extras)\r\n this.setState(\r\n (prevState) => ({\r\n form:\r\n idx !== -1\r\n ? immutable.set(\r\n prevState.form,\r\n [valueType, idx, \"value\"],\r\n value\r\n )\r\n : prevState.form,\r\n changed: immutable.set(prevState.changed, name, value),\r\n }),\r\n () =>\r\n this.props.dispatch(\r\n extraAttributesSetField(\r\n splittedName[0],\r\n splittedName[1],\r\n value\r\n )\r\n )\r\n );\r\n };\r\n\r\n _isDirty = (): boolean => {\r\n /* istanbul ignore if */\r\n if (this.state.changed == null) return false;\r\n return Object.keys(this.state.changed).length > 0;\r\n };\r\n\r\n _getSaveButtonLabel = (): React.Element => {\r\n const { isValidating, isSubmitting } = this.state;\r\n\r\n if (isValidating === true) {\r\n return (\r\n <>\r\n {loc.t(\"validating\")}\r\n \r\n \r\n );\r\n }\r\n\r\n if (isSubmitting === true) {\r\n return (\r\n <>\r\n {this.props.savingLabel || loc.t(\"saving\")}\r\n \r\n \r\n );\r\n }\r\n\r\n return this.props.saveLabel || loc.t(\"save\");\r\n };\r\n\r\n _formsySubmit = () => this._formsyRef.current.submit();\r\n\r\n render() {\r\n const { itemUri, saveLabel, confirmLabel } = this.props;\r\n const {\r\n form,\r\n validationErrors,\r\n canSubmit,\r\n isSubmitting,\r\n isValidating,\r\n } = this.state;\r\n const hasEA = form && form.attributes != null;\r\n const toolbar = (\r\n \r\n \r\n {this._getSaveButtonLabel()}\r\n \r\n \r\n );\r\n return (\r\n \r\n \r\n \r\n {form &&\r\n form.fields !== null &&\r\n form.fields.map((field, index) => (\r\n \r\n \r\n \r\n ))}\r\n {form && form.attributes !== null && (\r\n \r\n )}\r\n {form && form.fields === null && form.attributes === null && (\r\n \r\n \r\n \r\n )}\r\n {this.props.buttonToolbarPortal == null && toolbar}\r\n \r\n {this.props.buttonToolbarPortal &&\r\n ReactDOM.createPortal(\r\n toolbar,\r\n this.props.buttonToolbarPortal\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default connect()(MyFormEdit);\r\n","// @flow\r\nimport React from \"react\";\r\nimport Header from \"components/Header\";\r\nimport { type FormResultDTO, type DocFormResultDTO } from \"data/types\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** current Form being edited */\r\n form?: FormResultDTO | DocFormResultDTO,\r\n /** callback when user clicks Cancel */\r\n onCancel: () => void,\r\n /** default form title to use when formTitle/name not supplied\r\n * @default {string} null so use i18next localization upload:edit_form.title\r\n */\r\n title?: string,\r\n /** optional icon to display\r\n * @default {string} edit\r\n */\r\n icon?: string,\r\n /** optional center component */\r\n centerComponent?: React.ElementType,\r\n};\r\n\r\n/**\r\n * renders the FormEdit's panel header\r\n *\r\n * @param {Props} { form, onCancel }\r\n */\r\nconst FormEditHeader = ({\r\n icon,\r\n form,\r\n onCancel,\r\n title,\r\n centerComponent,\r\n}: Props) => (\r\n \r\n);\r\nFormEditHeader.displayName = \"FormEditHeader\";\r\nFormEditHeader.defaultProps = {\r\n icon: \"edit\",\r\n};\r\nexport default FormEditHeader;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport { fetchForm, fetchNewForm, saveForm, validateForm } from \"data/api\";\r\nimport { togglesUpdateCounterAction } from \"data/actions\";\r\nimport {\r\n ServerEventActionType,\r\n ServerEventItemType,\r\n type ServerEventMessage,\r\n type NewFormTypeEnum,\r\n NewFormType,\r\n type FormResultDTO,\r\n type DocFormResultDTO,\r\n} from \"data/types\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport Form from \"components/Form\";\r\nimport FormEdit from \"components/FormEdit\";\r\nimport FormEditHeader from \"components/FormEditHeader\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport Constants, {\r\n type ConstantsEnum,\r\n isFeatureOn,\r\n Feature,\r\n} from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport loc from \"i18next\";\r\nimport { type ApiError, type ItemStatusesDTO } from \"data/types\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport LockInfo from \"components/LockInfo\";\r\nimport isEmpty from \"lodash/isEmpty\";\r\nimport GlobalEventsHandler from \"containers/GlobalEventsHandler\";\r\nimport { openConflictModal } from \"components/ConflictModal\";\r\nimport produce from \"immer\";\r\nimport withOfflineHandler from \"containers/OfflineHandler\";\r\nimport FormGroup from \"react-bootstrap/lib/FormGroup\";\r\nimport FormControl from \"react-bootstrap/lib/FormControl\";\r\nimport ControlLabel from \"react-bootstrap/lib/ControlLabel\";\r\nimport SettingValue, { type SettingValueProps } from \"containers/SettingValue\";\r\n\r\ntype Props = {\r\n form?: FormResultDTO | DocFormResultDTO,\r\n /** the current itemUri */\r\n itemUri: string,\r\n /** the current viewName */\r\n viewName: string,\r\n /** whether we are now editing */\r\n isEditMode: boolean,\r\n /** callback when cancelling edit mode */\r\n onCancel: () => void,\r\n /** callback when saving a new item\r\n * @async\r\n * @param {object} model the form's values\r\n * @param {boolean?} keepOriginalFilename whether to use the actual filename or the user input\r\n * @returns {boolean} true if success, false otherwise\r\n */\r\n onSaveNew: (\r\n model: Object,\r\n keepOriginalFilename?: boolean\r\n ) => Promise,\r\n /** callback to set context properties for ActionPanel\r\n * @param {object} onContextProps context properties for ActionPanel\r\n * @param {boolean} onContextProps.isEditAllowed whether the current user is allowed to edit this form\r\n * @param {ItemStatusesDTO} onContextProps.itemStatus current items ItemStatuses\r\n */\r\n onContextProps: (contextProps: {\r\n isEditAllowed: boolean,\r\n itemStatus: ItemStatusesDTO,\r\n }) => void,\r\n /** callback when the form definition has been loaded from server\r\n * @param {FormResultDTO | DocFormResultDTO} form the form definition\r\n */\r\n onFormLoad: (form: FormResultDTO | DocFormResultDTO) => void,\r\n /** which new item to create (Folder or Document) */\r\n newFormType: NewFormTypeEnum,\r\n /** pass-through save button label */\r\n saveLabel?: string,\r\n /** pass-through saving label */\r\n savingLabel?: string,\r\n /** pass-through to FormEditHeader */\r\n defaultFormTitle?: string,\r\n /** pass-through to FormEditHeader */\r\n defaultFormIcon?: string,\r\n /** whether to enable save form button */\r\n isFormButtonEnabled?: boolean,\r\n /** whether an internet connection is detected */\r\n isOnline?: boolen,\r\n /** whether offline feature is enabled */\r\n isOfflineAllowed?: boolean,\r\n /** whether to return ALL form fields or only changeLog */\r\n onSaveReturnAllFields?: boolean,\r\n /** defaultValues to preset on the form, accepts any {field:value} or {attribute:value} (no prefixes) */\r\n defaultValues?: Object,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** GlobalEventsHandler.refreshId */\r\n refreshId: number,\r\n /** GlobalEventsHandler.refreshEvent */\r\n refreshEvent: ?ServerEventMessage,\r\n /** whether to show FormEditHeader */\r\n showHeader?: boolean,\r\n /** optional DOM ref to render ButtonToolbar onto (otherwise will render as child of form) */\r\n buttonToolbarPortal?: React.DOMElement,\r\n /** whether no data is intentional or an error */\r\n isNoDataError?: boolean,\r\n /** persisted bool if original filename should be kept */\r\n keepFilename: SettingValueProps,\r\n};\r\n\r\ntype State = {\r\n form?: FormResultDTO | DocFormResultDTO,\r\n status: ConstantsEnum,\r\n defaultValues: ?Object,\r\n};\r\n\r\nexport class FormContainer extends PureComponent {\r\n abortController: AbortController | null;\r\n _isMounted: boolean;\r\n _formsyRef: Formsy | null;\r\n\r\n static defaultProps = {\r\n isEditMode: false,\r\n isFormButtonEnabled: true,\r\n isOnline: true,\r\n isOfflineAllowed: false,\r\n showHeader: true,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n form: undefined,\r\n status: Constants.LOADING,\r\n defaultValues: props.defaultValues,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n this._fetch(this.props.itemUri);\r\n };\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n /* istanbul ignore else */\r\n if (this.abortController != null) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n /* istanbul ignore else */\r\n if (\r\n prevProps.itemUri !== this.props.itemUri ||\r\n prevProps.refreshId !== this.props.refreshId ||\r\n prevProps.form !== this.props.form\r\n ) {\r\n this.setState({\r\n status: Constants.LOADING,\r\n defaultValues: this.props.defaultValues,\r\n });\r\n this._fetch(this.props.itemUri);\r\n return;\r\n }\r\n\r\n if (prevProps.keepFilename.value !== this.props.keepFilename.value) {\r\n this.setState((state) => ({\r\n form: this._handleKeepFilename(state.form),\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * @async\r\n * @summary will fetch the appropriate form (new/edit) from the server\r\n * @param {string} paramUri - the itemUri of the item\r\n * @memberof FormContainer\r\n */\r\n _fetch = async (paramUri: string) => {\r\n this._updateToggleLoading(true);\r\n try {\r\n let form = this.props.form;\r\n if (form == null) {\r\n if (this.props.newFormType != null) {\r\n form = await this.props.offlineHandler.factory(\r\n fetchNewForm\r\n )(this.props.newFormType, paramUri);\r\n } else {\r\n form = await this.props.offlineHandler.factory(fetchForm)(\r\n paramUri\r\n );\r\n }\r\n if (typeof this.props.onFormLoad === \"function\")\r\n this.props.onFormLoad(form);\r\n }\r\n /* istanbul ignore else */\r\n if (\r\n form != null &&\r\n this.props.itemUri === paramUri &&\r\n this._isMounted\r\n ) {\r\n form = this._handleKeepFilename(form);\r\n this.setState({\r\n status: Constants.OK,\r\n form,\r\n });\r\n /* istanbul ignore else */\r\n if (typeof this.props.onContextProps === \"function\") {\r\n this.props.onContextProps({\r\n isEditAllowed: form.isEditAllowed,\r\n itemStatus: form.status,\r\n });\r\n }\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n try {\r\n this.setState({ status: Constants.ERROR });\r\n } catch (e2) {}\r\n } finally {\r\n this._updateToggleLoading(false);\r\n }\r\n };\r\n\r\n _updateToggleLoading = (loading?: boolean) => {\r\n const { viewName, dispatch } = this.props;\r\n dispatch(\r\n togglesUpdateCounterAction({\r\n name: viewName,\r\n counts: { form: 0 },\r\n status: {\r\n form: loading === true ? Constants.LOADING : null,\r\n },\r\n })\r\n );\r\n };\r\n\r\n _handleKeepFilename = (form: FormResultDTO) => {\r\n if (this.props.newFormType !== NewFormType.Document) {\r\n return form;\r\n }\r\n return produce(form, (draft) => {\r\n const idx = draft.fields.findIndex(\r\n (f) => f.format === \"WebDavName\" && f.name === \"$NAME$\"\r\n );\r\n /* istanbul ignore else */\r\n if (idx > -1) {\r\n draft.fields[idx].ro = this.props.keepFilename.value;\r\n }\r\n });\r\n };\r\n\r\n _isWebDavNameHidden = (): boolean =>\r\n this.state.form.fields.some(\r\n (f) =>\r\n f.format === \"WebDavName\" &&\r\n f.name === \"$NAME$\" &&\r\n f.extra &&\r\n f.extra.hidden\r\n );\r\n\r\n _ignoreWebDavName = (): boolean => {\r\n const {\r\n newFormType,\r\n keepFilename: { value: keepFilename },\r\n } = this.props;\r\n\r\n const hiddenWebDavName = this._isWebDavNameHidden();\r\n return (\r\n (newFormType === NewFormType.Document && keepFilename) ||\r\n (newFormType != null && hiddenWebDavName)\r\n );\r\n };\r\n\r\n _maybeAddDefaultWebDavName = (defaultValues: ?Object): Object => {\r\n const { newFormType } = this.props;\r\n if (!(this._isWebDavNameHidden() && newFormType != null)) {\r\n return defaultValues;\r\n }\r\n return produce(defaultValues, (draft: ?Object) => {\r\n /* istanbul ignore else */\r\n if (draft == null) {\r\n draft = {};\r\n }\r\n /* istanbul ignore else */\r\n if (!draft[\"$NAME$\"]) {\r\n draft[\"$NAME$\"] = loc.t(\"common:new_folder\");\r\n }\r\n return draft;\r\n });\r\n };\r\n\r\n /**\r\n * Will validate the model against the server\r\n * @async\r\n * @param {Object} model contains current changed fields & attributes\r\n * @returns {Object} containing all localized validation errors per field e.g. {fieldName:error, fieldName:error...}\r\n * @memberof FormContainer\r\n */\r\n _onValidate = async (model: Object): Object => {\r\n this.abortController = new AbortController();\r\n const validationErrors = await validateForm(\r\n this.props.newFormType != null, //isNew\r\n this.props.itemUri.includes(\"@eid=\") ||\r\n this.props.newFormType === NewFormType.Document, //isDoc\r\n this.props.itemUri,\r\n !this._ignoreWebDavName(),\r\n model,\r\n this.abortController.signal\r\n );\r\n // localize error messages\r\n const locErrors = {};\r\n if (!isEmpty(validationErrors)) {\r\n Object.keys(validationErrors).forEach(\r\n (k) => (locErrors[k] = getLocalizedText(validationErrors[k]))\r\n );\r\n }\r\n return locErrors;\r\n };\r\n\r\n /**\r\n * Will submit the form to the server\r\n * @returns {boolean} true if success, false otherwise\r\n * @async\r\n * @param {Object} model - contains current changed fields & attributes\r\n * @memberof FormContainer\r\n */\r\n _onSave = async (model: Object): boolean => {\r\n try {\r\n let response: boolean | null | ApiError = null;\r\n if (this.props.newFormType != null) {\r\n return await this.props.onSaveNew(\r\n model,\r\n this._ignoreWebDavName()\r\n );\r\n } else {\r\n response = await saveForm(\r\n this.props.itemUri,\r\n model,\r\n this.state.form.etag\r\n );\r\n }\r\n /* istanbul ignore else */\r\n if (response != null) {\r\n if (response === false || response.isError) {\r\n toastActionResult(\r\n false,\r\n `${this.props.viewName}:edit_form`\r\n );\r\n } else {\r\n toastActionResult(true, `${this.props.viewName}:edit_form`);\r\n this.props.onCancel();\r\n return true;\r\n }\r\n }\r\n } catch (e) {\r\n if (e.data && e.constructor.name === \"ApiConflictError\") {\r\n const doOverwrite = await openConflictModal(e.data.extra.name);\r\n if (doOverwrite) {\r\n this.setState({\r\n form: produce(\r\n this.state.form,\r\n (draft: FormResultDTO) => {\r\n draft.etag = e.data.extra.currentEtag;\r\n }\r\n ),\r\n });\r\n return await this._onSave(model);\r\n } else {\r\n this.props.onCancel();\r\n }\r\n } else {\r\n //this.setState({ status: Constants.ERROR });\r\n toastActionResult(false, `${this.props.viewName}:edit_form`);\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n renderKeepFilename = () => {\r\n if (this.props.newFormType !== NewFormType.Document) {\r\n return null;\r\n }\r\n return (\r\n \r\n \r\n this.props.keepFilename.setValue(\r\n e.currentTarget.checked\r\n )\r\n }\r\n />{\" \"}\r\n \r\n {loc.t(\"upload:keepFilename\")}\r\n \r\n \r\n );\r\n };\r\n\r\n render() {\r\n const {\r\n itemUri,\r\n isEditMode,\r\n onCancel,\r\n newFormType,\r\n isFormButtonEnabled,\r\n saveLabel,\r\n savingLabel,\r\n onSaveReturnAllFields,\r\n isOnline,\r\n isOfflineAllowed,\r\n isNoDataError,\r\n } = this.props;\r\n const { status, form, defaultValues } = this.state;\r\n let adjustedItemUri = itemUri;\r\n if (newFormType === NewFormType.Document) {\r\n adjustedItemUri +=\r\n \"@eid=00000000|000|000|0000000000000000000000000\";\r\n }\r\n if (status === Constants.OK) {\r\n if (window.CONFIG.licenseAllowEdit && isEditMode)\r\n return (\r\n <>\r\n {this.props.showHeader && (\r\n \r\n )}\r\n \r\n \r\n );\r\n else\r\n return (\r\n <>\r\n {form.isLocked && }\r\n \r\n \r\n );\r\n } else\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n isOnline: s.isOnlineSelector(state),\r\n isOfflineAllowed: isFeatureOn(Feature.offline),\r\n ...ownProps,\r\n});\r\n\r\nexport default compose(\r\n connect(mapStateToProps),\r\n withOfflineHandler,\r\n SettingValue({\r\n name: \"keepFilename\",\r\n namespace: \"keepFilename\",\r\n defaultValue: true,\r\n }),\r\n GlobalEventsHandler({\r\n actions: [\r\n ServerEventActionType.modify,\r\n ServerEventActionType.edit,\r\n ServerEventActionType.refresh,\r\n ],\r\n items: [ServerEventItemType.document, ServerEventItemType.folder],\r\n })\r\n)(FormContainer);\r\n","// @flow\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport Breadcrumb from \"react-bootstrap/lib/Breadcrumb\";\r\nimport { getRoute } from \"components/ItemUriLink\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport { getLocalizedText } from \"data/utils\";\r\n\r\nfunction partTitle(\r\n text: string,\r\n itemUri: string,\r\n isLast: boolean,\r\n bctext: string\r\n): string {\r\n const isDoc = itemUri.indexOf(\"@eid=\") > 0;\r\n /* istanbul ignore next */\r\n return isDoc && isLast\r\n ? loc.t(\"breadcrumb.titleDoc\", { text })\r\n : isLast\r\n ? bctext\r\n : loc.t(\"breadcrumb.title\", { text });\r\n}\r\n\r\ntype Props = {\r\n /** Breadcrumb as Text (shown in Tooltip) */\r\n bctext?: string,\r\n /** font-awesome icon to display before text */\r\n symbolName?: string,\r\n /** part name */\r\n text: string,\r\n /** part itemUri */\r\n itemUri: string,\r\n /** whether this is the last part */\r\n isLast: boolean,\r\n /** CSS styles to apply */\r\n style?: StyleSheet,\r\n /** CSS classname to apply */\r\n className?: string,\r\n /** part index */\r\n index: number,\r\n /** calback when width of part has been measured\r\n * @param {number} index index of part\r\n * @param {number} width pixel width of rendered part\r\n */\r\n onMeasured?: (index: number, width: number) => void,\r\n /** whether part should be rendered as readonly (no navigation) */\r\n isReadonly: boolean,\r\n /** optional onClick instead of using history.push */\r\n onClick?: (itemUri: string) => void,\r\n};\r\n\r\nexport const BreadcrumbPart = ({\r\n bctext,\r\n symbolName,\r\n text,\r\n itemUri,\r\n isLast,\r\n style,\r\n className,\r\n index,\r\n onMeasured,\r\n isReadonly,\r\n onClick,\r\n}: Props) => {\r\n function measureWidth(ref: Breadcrumb.Item) {\r\n const bi: Breadcrumb.Item = ReactDOM.findDOMNode(ref);\r\n /* istanbul ignore else */\r\n if (bi !== null && bi !== undefined) {\r\n /* istanbul ignore else */\r\n if (onMeasured) onMeasured(index, bi.clientWidth + 8);\r\n }\r\n }\r\n function onPartClick(e, itemUri: string) {\r\n // no link on last part\r\n if (isLast) {\r\n e.preventDefault();\r\n return;\r\n }\r\n // if onclick defined avoid history.push\r\n /* istanbul ignore else */\r\n if (typeof onClick === \"function\") {\r\n e.preventDefault();\r\n onClick(itemUri);\r\n }\r\n // use history.push to load itemUri\r\n return null;\r\n }\r\n\r\n const localizedText = text.startsWith(\"$folder:\")\r\n ? getLocalizedText(text)\r\n : text;\r\n\r\n return (\r\n ref && measureWidth(ref)}\r\n active={isLast || isReadonly}\r\n style={style}\r\n className={className}\r\n data-test={`breadCrumb${isReadonly ? 'Disabled' : 'Enabled'}`}\r\n >\r\n {isReadonly ? (\r\n \r\n {symbolName ? (\r\n \r\n ) : (\r\n localizedText\r\n )}\r\n \r\n ) : (\r\n onPartClick(e, itemUri)}\r\n >\r\n \r\n {symbolName ? (\r\n \r\n ) : (\r\n localizedText\r\n )}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nBreadcrumbPart.displayName = \"BreadcrumbPart\";\r\nexport default BreadcrumbPart;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Status from \"components/Status\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** whether marked as favorite */\r\n isFav?: boolean,\r\n /** fetch processing status */\r\n favStatus?: string,\r\n /** callback when favorite icon clicked */\r\n onClick: () => void,\r\n};\r\n\r\nconst BreadcrumbFavorite = ({ isFav, favStatus, onClick }: Props) => {\r\n if (isFav) {\r\n return (\r\n \r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n};\r\nBreadcrumbFavorite.displayName = \"BreadcrumbFavorite\";\r\n\r\nexport default BreadcrumbFavorite;\r\n","// @flow\r\nimport React from \"react\";\r\nimport BreadcrumbPart from \"./BreadcrumbPart\";\r\nimport Breadcrumb from \"react-bootstrap/lib/Breadcrumb\";\r\nimport BreadcrumbFavorite from \"./BreadcrumbFavorite\";\r\nimport {\r\n SystemWebDavName,\r\n type SiteTypeEnum,\r\n type BreadcrumbPartDTO,\r\n} from \"data/types\";\r\nimport \"./index.css\";\r\nimport loc from \"i18next\";\r\nimport Icons from \"@hs/icons\";\r\nimport Badge from \"react-bootstrap/lib/Badge\";\r\n\r\ntype Props = {\r\n /** whole breadcrumb in text */\r\n text?: string,\r\n /** siteType */\r\n siteType?: SiteTypeEnum,\r\n /** all part objects making up breadcrumb */\r\n parts: Array,\r\n /** current version */\r\n version?: number,\r\n /** whether marked as favorite */\r\n isFav?: boolean,\r\n /** whether this item is favorable */\r\n isFavorable?: boolean,\r\n /** fetch processing status */\r\n favStatus?: string,\r\n /** callback when favorite icon clicked */\r\n favOnClick?: () => void,\r\n /** optional additional CSS style */\r\n style?: StyleSheet,\r\n /** optional additional CSS class to apply */\r\n className?: string,\r\n /** whether last breadcrumb part should be active */\r\n leafActive?: boolean,\r\n /** callback when UI measured length of rendered breadcrumb */\r\n onMeasured: Function,\r\n /** which parts in the breadcrumb to show (depending on rendering size and screen width) */\r\n showParts: Array,\r\n /** how many parts of the breadcrumb are actually hidden (depending on rendering size and screen width) */\r\n hiddenCount: number,\r\n /** whether user is allowed to navigate through breadcrumb (and hide favorite option) */\r\n isReadonly: boolean,\r\n /** scope breadcrumb to show parts only starting the specified level number */\r\n scopeFromLevel: number,\r\n /** optional breadcrumbPart click event instead of history.push */\r\n onPartClick?: (itemUri: string) => void,\r\n};\r\n\r\nconst MyBreadcrumb = ({\r\n text,\r\n siteType,\r\n parts,\r\n version,\r\n isFav = false,\r\n favStatus,\r\n favOnClick,\r\n style,\r\n className,\r\n leafActive = false,\r\n onMeasured,\r\n showParts,\r\n hiddenCount,\r\n isReadonly = false,\r\n isFavorable = true,\r\n scopeFromLevel = -1,\r\n onPartClick,\r\n}: Props) => (\r\n \r\n {siteType &&\r\n // !isReadonly &&\r\n isFavorable &&\r\n scopeFromLevel <= 0 &&\r\n typeof favOnClick === \"function\" && (\r\n \r\n )}\r\n {parts &&\r\n ((hiddenCount > 0 &&\r\n parts.length > 1 &&\r\n hiddenCount < showParts.length - 1) ||\r\n parts.length === 1 ||\r\n hiddenCount === 0) &&\r\n siteType &&\r\n \" \"}\r\n {parts &&\r\n ((hiddenCount > 0 &&\r\n parts.length > 1 &&\r\n hiddenCount < showParts.length - 1) ||\r\n parts.length === 1 ||\r\n hiddenCount === 0 ||\r\n isReadonly) &&\r\n siteType && (\r\n \r\n )}{\" \"}\r\n {parts && siteType && parts.length === 1 && (\r\n s === parts[0].text\r\n )\r\n ? loc.t(`siteItemType.${String(siteType)}`)\r\n : parts[0].text\r\n }\r\n itemUri={parts[0].itemUri}\r\n style={style}\r\n className={className}\r\n isLast={!leafActive}\r\n isReadonly={isReadonly}\r\n onClick={onPartClick}\r\n />\r\n )}\r\n {parts &&\r\n parts.length > 1 &&\r\n !isReadonly &&\r\n hiddenCount > 0 &&\r\n (hiddenCount === showParts.length - 1 ||\r\n (scopeFromLevel > 0 &&\r\n hiddenCount === showParts.length - scopeFromLevel - 1)) && (\r\n \r\n )}\r\n {parts &&\r\n parts.length > 1 &&\r\n hiddenCount > 0 &&\r\n hiddenCount < showParts.length - 1 && (\r\n \r\n ...\r\n \r\n )}\r\n {parts &&\r\n parts.length > 1 &&\r\n parts.map((part, index) => {\r\n if (showParts.length > 0 && !showParts[index]) return null;\r\n if (index < scopeFromLevel) return null;\r\n return (\r\n s === parts[0].text\r\n ))\r\n ? loc.t(`siteItemType.${String(siteType)}`)\r\n : part.text\r\n }\r\n itemUri={part.itemUri}\r\n style={style}\r\n className={className}\r\n isLast={!leafActive && index === parts.length - 1}\r\n isReadonly={isReadonly}\r\n onClick={onPartClick}\r\n />\r\n );\r\n })}\r\n {parts && parts.length > 1 && version > 0 && (\r\n \r\n {loc.t(\"common:version.text\", { version })}\r\n \r\n )}\r\n \r\n);\r\n\r\nMyBreadcrumb.displayName = \"MyBreadcrumb\";\r\nexport default MyBreadcrumb;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Breadcrumb from \"./Breadcrumb\";\r\nimport { type BreadcrumbPartDTO, type SiteTypeEnum } from \"data/types\";\r\nimport noop from \"lodash/noop\";\r\nimport Measure from \"react-measure\";\r\nimport throttle from \"lodash/debounce\";\r\n\r\ntype Props = {\r\n /** width in pixel */\r\n knownWidth?: number,\r\n /** breadcrumb leaf name */\r\n text?: string,\r\n /** siteType */\r\n siteType?: SiteTypeEnum,\r\n /** all parts making up the breadcrumb */\r\n parts: Array,\r\n /** whether user is allowed to navigate the breadcrumb parts */\r\n isReadonly?: boolean,\r\n /** current version */\r\n version?: number,\r\n /** optional breadcrumbPart click event instead of history.push */\r\n onPartClick?: (itemUri: string) => void,\r\n};\r\n\r\ntype State = {\r\n width: number,\r\n parts: Array,\r\n showParts: Array,\r\n hiddenCount: number,\r\n calculated: boolean,\r\n};\r\n\r\nclass ResponsiveBreadcrumb extends React.PureComponent {\r\n _isMounted: boolean;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n width: props.knownWidth || 0,\r\n parts: [],\r\n showParts: [],\r\n hiddenCount: 0,\r\n calculated: false,\r\n };\r\n }\r\n\r\n _onMeasured = (index: number, width: number) => {\r\n const { parts, showParts } = this.state;\r\n parts[index] = width;\r\n showParts[index] = true;\r\n this.setState({ parts, showParts });\r\n };\r\n\r\n __calcVisible = (knownState: State) => {\r\n if (knownState.width === 0) return;\r\n const { parts, width } = knownState;\r\n if (parts.length === 0) return;\r\n\r\n let showParts = [],\r\n hiddenCount = 0;\r\n parts.reduceRight((previousValue, currentValue, index) => {\r\n const result = previousValue + currentValue;\r\n showParts[index] = index === parts.length - 1 || result <= width;\r\n if (!showParts[index]) hiddenCount++;\r\n return result;\r\n }, 0);\r\n\r\n /* first calculate the parts that must be shown\r\n let sum = parts[parts.length - 1];\r\n let anyHidden = false;\r\n const newShowParts = showParts.map((part, index) => {\r\n if (index === parts.length - 1) return true;\r\n sum += parts[index];\r\n const isVisible = sum <= width;\r\n if (!isVisible) anyHidden = true;\r\n return isVisible;\r\n });*/\r\n /* istanbul ignore else */\r\n if (this._isMounted)\r\n this.setState({ showParts, hiddenCount, calculated: true });\r\n };\r\n\r\n _calcVisible = throttle(this.__calcVisible, 200, {\r\n leading: false,\r\n trailing: true,\r\n });\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n this._calcVisible(this.state);\r\n }\r\n\r\n componentWillUnmount = () => (this._isMounted = false);\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n if (prevProps.parts !== this.props.parts) {\r\n this.setState(\r\n {\r\n parts: [],\r\n showParts: [],\r\n hiddenCount: 0,\r\n calculated: false,\r\n },\r\n () => this._calcVisible(this.state)\r\n );\r\n }\r\n\r\n if (prevState.width === this.state.width && this.state.calculated)\r\n return;\r\n this._calcVisible(this.state);\r\n }\r\n\r\n render() {\r\n const mybc = (\r\n \r\n );\r\n if (this.props.knownWidth !== undefined) return mybc;\r\n\r\n return (\r\n this.setState({ width: bounds.width })}\r\n >\r\n {mybc}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ResponsiveBreadcrumb;\r\n","// @flow\r\nimport React, { useCallback, useContext, useState, useEffect } from \"react\";\r\nimport { MultiSelectionContext } from \"data/context\";\r\nimport noop from \"lodash/noop\";\r\nimport { isHandheld } from \"data/bowser\";\r\n\r\ntype Props = {\r\n /** which HTML element to use to wrap the children */\r\n componentClass: string,\r\n /** callback when user wants to see the ContextMenu */\r\n onContextMenu: () => void,\r\n /** React children to render */\r\n children?: Node,\r\n};\r\n\r\n/**\r\n * wrapper to add context menu event handling\r\n */\r\nconst EventHandler = ({\r\n componentClass = \"div\",\r\n onContextMenu = noop,\r\n children,\r\n onTouchEnd,\r\n onTouchStart,\r\n onTouchMove,\r\n onMouseDown,\r\n onMouseLeave,\r\n onMouseUp,\r\n rowIndex,\r\n columnIndex,\r\n ...rest\r\n}: Props) => {\r\n /* istanbul ignore next */\r\n const {\r\n handler,\r\n multiple,\r\n actions: { handleAdd },\r\n } = useContext(MultiSelectionContext) || {\r\n handler: {},\r\n multiple: false,\r\n actions: { handleAdd: (index: number) => null },\r\n };\r\n\r\n // Auto toggle row on initial MultiSelection\r\n const [autoToggleRow, setAutoToggleRow] = useState(false);\r\n\r\n useEffect(() => {\r\n setAutoToggleRow(multiple);\r\n }, [multiple]);\r\n\r\n const handleTouchStart = useCallback(\r\n (e) => {\r\n /* istanbul ignore else */\r\n if (handler.onTouchStart) handler.onTouchStart(e);\r\n /* istanbul ignore else */\r\n if (onTouchStart) onTouchStart(e);\r\n if (multiple) setAutoToggleRow(false);\r\n },\r\n [handler, onTouchStart, multiple]\r\n );\r\n\r\n const handleTouchMove = useCallback(\r\n (e) => {\r\n /* istanbul ignore else */\r\n if (handler.onTouchMove) handler.onTouchMove(e);\r\n /* istanbul ignore else */\r\n if (onTouchMove) onTouchMove(e);\r\n },\r\n [handler, onTouchMove]\r\n );\r\n\r\n const handleTouchEnd = useCallback(\r\n (e) => {\r\n /* istanbul ignore else */\r\n if (handler.onTouchEnd) handler.onTouchEnd(e);\r\n /* istanbul ignore else */\r\n if (onTouchEnd) onTouchEnd(e);\r\n /* istanbul ignore else */\r\n if (autoToggleRow) {\r\n setAutoToggleRow(false);\r\n handleAdd(rowIndex);\r\n }\r\n },\r\n [handler, onTouchEnd, autoToggleRow, handleAdd, rowIndex]\r\n );\r\n\r\n const handleMouseDown = useCallback(\r\n (e) => {\r\n /* istanbul ignore else */\r\n if (handler.onMouseDown) handler.onMouseDown(e);\r\n /* istanbul ignore else */\r\n if (onMouseDown) onMouseDown(e);\r\n },\r\n [handler, onMouseDown]\r\n );\r\n\r\n const handleMouseLeave = useCallback(\r\n (e) => {\r\n /* istanbul ignore else */\r\n if (handler.onMouseLeave) handler.onMouseLeave(e);\r\n /* istanbul ignore else */\r\n if (onMouseLeave) onMouseLeave(e);\r\n },\r\n [handler, onMouseLeave]\r\n );\r\n\r\n const handleMouseUp = useCallback(\r\n (e) => {\r\n /* istanbul ignore else */\r\n if (handler.onMouseUp) handler.onMouseUp(e);\r\n /* istanbul ignore else */\r\n if (onMouseUp) onMouseUp(e);\r\n },\r\n [handler, onMouseUp]\r\n );\r\n\r\n return React.createElement(\r\n componentClass,\r\n {\r\n ...rest,\r\n onTouchStart: handleTouchStart,\r\n onTouchMove: handleTouchMove,\r\n onTouchEnd: handleTouchEnd,\r\n onMouseDown: handleMouseDown,\r\n onMouseLeave: handleMouseLeave,\r\n onMouseUp: handleMouseUp,\r\n onContextMenu: isHandheld() ? null : onContextMenu,\r\n },\r\n children\r\n );\r\n};\r\n\r\nexport default EventHandler;\r\n","// @flow\r\n//#region imports\r\nimport React, { PureComponent } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport { fetchBreadcrumb, addFavorite, delFavorite } from \"data/api\";\r\nimport {\r\n ServerEventActionType,\r\n ServerEventItemType,\r\n type BreadcrumbResultDTO,\r\n type BreadcrumbPartDTO,\r\n type SiteTypeEnum,\r\n} from \"data/types\";\r\nimport { setCurrentBreadcrumb } from \"data/actions\";\r\nimport Breadcrumb from \"components/Breadcrumb\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport GlobalEventsHandler from \"containers/GlobalEventsHandler\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport withOfflineHandler from \"containers/OfflineHandler\";\r\n//#endregion\r\n\r\n//#region flow types\r\ntype Props = {\r\n /** itemUri */\r\n itemUri?: string,\r\n /** whether marked as favorite */\r\n isFav: boolean,\r\n /** whether this item is favorable */\r\n isFavorable: boolean,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** all part objects making up breadcrumb */\r\n parts?: Array,\r\n /** current version */\r\n version?: number,\r\n /** siteType */\r\n siteType?: SiteTypeEnum,\r\n /** whole breadcrumb in text */\r\n text?: string,\r\n /** breadcrumb item name */\r\n name: string,\r\n /** current view name */\r\n viewName: string,\r\n /** whether user is allowed to navigate through breadcrumb (and hide favorite option) */\r\n isReadonly: boolean,\r\n /** whether this updates when globalEvents are received */\r\n isRefreshing: boolean,\r\n /** scope breadcrumb to show parts only starting the specified level number */\r\n scopeFromLevel?: number,\r\n /** GlobalEventsHandler.refreshId */\r\n refreshId: number,\r\n /** optional breadcrumbPart click event instead of history.push */\r\n onBreadcrumbPartClick?: (itemUri: string) => void,\r\n};\r\n\r\ntype State = {\r\n status: ConstantsEnum,\r\n favStatus: ConstantsEnum,\r\n initialLoading: boolean,\r\n};\r\n//#endregion\r\n\r\nexport async function toggleFavorite({\r\n isFav,\r\n itemUri,\r\n name,\r\n logger = toastActionResult,\r\n}: {\r\n isFav: boolean,\r\n itemUri: string,\r\n name: string,\r\n logger: () => void,\r\n}): Promise {\r\n const success: boolean = isFav\r\n ? await delFavorite(itemUri)\r\n : await addFavorite(itemUri, name);\r\n logger(success, isFav ? \"breadcrumb.delfav\" : \"breadcrumb.addfav\", {\r\n name,\r\n });\r\n return success;\r\n}\r\n\r\nexport class BreadcrumbContainer extends PureComponent {\r\n _isMounted: boolean;\r\n abortController: AbortController | null;\r\n\r\n state = {\r\n status: Constants.LOADING,\r\n favStatus: Constants.LOADING,\r\n initialLoading: true,\r\n };\r\n\r\n static defaultProps = {\r\n isFav: false,\r\n isReadonly: false,\r\n isRefreshing: true,\r\n };\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n this._fetch(this.props.itemUri);\r\n };\r\n\r\n componentWillUnmount = () => {\r\n const { dispatch, viewName } = this.props;\r\n /* istanbul ignore else */\r\n if (this.abortController != null) {\r\n this.abortController.abort();\r\n }\r\n dispatch(\r\n setCurrentBreadcrumb({\r\n breadcrumb: {},\r\n viewName,\r\n })\r\n );\r\n this._isMounted = false;\r\n };\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (\r\n prevProps.itemUri !== this.props.itemUri ||\r\n (this.props.isRefreshing === true &&\r\n prevProps.refreshId !== this.props.refreshId)\r\n ) {\r\n this._fetch(this.props.itemUri);\r\n }\r\n /*if (nextProps.isFav !== this.props.isFav) {\r\n this._isFavToast(nextProps.isFav);\r\n }*/\r\n }\r\n\r\n _maybeGetNewAbortController = () => {\r\n if (this.abortController != null) {\r\n this.abortController.abort();\r\n return new AbortController();\r\n }\r\n return this.abortController || new AbortController();\r\n };\r\n\r\n _fetch = (itemUri: ?string): void => {\r\n this.abortController = this._maybeGetNewAbortController();\r\n const { dispatch, viewName } = this.props;\r\n if (itemUri != null) {\r\n this.setState({ status: Constants.LOADING });\r\n this.props.offlineHandler\r\n .factory(fetchBreadcrumb)(itemUri, this.abortController.signal)\r\n .then((breadcrumb: BreadcrumbResultDTO) => {\r\n this._isMounted &&\r\n this.setState(\r\n {\r\n status: Constants.OK,\r\n initialLoading: false,\r\n favStatus: Constants.OK,\r\n },\r\n () =>\r\n dispatch(\r\n setCurrentBreadcrumb({\r\n breadcrumb,\r\n viewName,\r\n })\r\n )\r\n );\r\n })\r\n .catch((err) => {\r\n /* istanbul ignore if */\r\n if (this._isMounted && err.name === \"AbortError\") {\r\n this.setState({\r\n status: Constants.LOADING,\r\n initialLoading: true,\r\n });\r\n } else if (this._isMounted) {\r\n this.setState({\r\n status: Constants.ERROR,\r\n favStatus: Constants.ERROR,\r\n });\r\n }\r\n });\r\n } else {\r\n this._isMounted && this.setState({ status: Constants.OK });\r\n }\r\n };\r\n\r\n favOnClick = (e: SyntheticMouseEvent<*>) => {\r\n e.preventDefault();\r\n const { itemUri, name, isFav } = this.props;\r\n\r\n /* istanbul ignore next */\r\n if (itemUri == null) return;\r\n\r\n this.setState({ favStatus: Constants.LOADING });\r\n\r\n toggleFavorite({ isFav, itemUri, name }).then((success) => {\r\n this.setState({\r\n favStatus: success ? Constants.OK : Constants.ERROR,\r\n });\r\n });\r\n };\r\n\r\n render() {\r\n /* istanbul ignore else */\r\n if (this.props.itemUri) {\r\n const { initialLoading, status, favStatus } = this.state;\r\n const {\r\n text,\r\n parts,\r\n version,\r\n siteType,\r\n isFav,\r\n isReadonly,\r\n isFavorable,\r\n scopeFromLevel,\r\n onBreadcrumbPartClick,\r\n } = this.props;\r\n\r\n /* istanbul ignore else */\r\n if (initialLoading === true || status === Constants.ERROR)\r\n return (\r\n \r\n );\r\n\r\n /* istanbul ignore else */\r\n if (status !== Constants.ERROR)\r\n return (\r\n \r\n );\r\n\r\n /* istanbul ignore next */\r\n return null;\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n\r\n// apply Redux Store state to Component Properties\r\nconst mapStateToProps = /*istanbul ignore next*/ (state, ownProps) => {\r\n let result = {\r\n name: s.breadcrumbNameSelector(state, ownProps.viewName),\r\n ...ownProps,\r\n };\r\n if (state.breadcrumb[ownProps.viewName]) {\r\n const { itemUri, ...rest } = state.breadcrumb[ownProps.viewName];\r\n result = Object.assign({}, result, rest);\r\n }\r\n return result;\r\n};\r\n\r\nexport default compose(\r\n connect(mapStateToProps),\r\n GlobalEventsHandler({\r\n items: [\r\n ServerEventItemType.document,\r\n ServerEventItemType.folder,\r\n ServerEventItemType.favorite,\r\n ],\r\n actions: [\r\n ServerEventActionType.modify,\r\n ServerEventActionType.edit,\r\n ServerEventActionType.add,\r\n ServerEventActionType.delete,\r\n ServerEventActionType.refresh,\r\n ],\r\n }),\r\n withOfflineHandler\r\n)(BreadcrumbContainer);\r\n","// @flow\r\nimport React, { useMemo } from \"react\";\r\nimport AttributeLabel from \"components/ExtraAttributes/AttributeLabel\";\r\nimport ViewerControlBase from \"components/ExtraAttributes/ViewerControl/ViewerControlBase\";\r\nimport { getValue } from \"data/utils\";\r\n\r\ntype Props = {\r\n name: string,\r\n header?: string,\r\n value: any | string,\r\n width?: number,\r\n};\r\n\r\nconst StaticViewerControl = ({ name, header, value, width }: Props) => {\r\n // $FlowFixMe\r\n let style: CSSStyleDeclaration = {};\r\n if (width && width > 0) style.width = width * 1.3 + \"px\";\r\n else style.minWidth = \"100px\";\r\n\r\n // replace carriage returns and some basic html safety\r\n const htmlValue = useMemo(() => {\r\n const v = getValue(value);\r\n return (\r\n (v\r\n ? String(v)\r\n .replace(//g, \">\")\r\n .replace(/\\n/g, \"
\")\r\n : \"\") + \" \"\r\n );\r\n }, [value]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nStaticViewerControl.displayName = \"StaticViewerControl\";\r\nexport default StaticViewerControl;\r\n","import {\r\n HttpMethod,\r\n ContentType,\r\n CacheStrategy,\r\n SearchRequestType,\r\n SearchScope,\r\n NewFormType,\r\n ItemFlowTemplateType,\r\n ItemContextsFlags,\r\n} from \"data/types\";\r\nimport type {\r\n Dictionary,\r\n ApiMethod,\r\n UserInfoResultDTO,\r\n CardItemResultDTO,\r\n TreeDTO,\r\n BreadcrumbResultDTO,\r\n FormResultDTO,\r\n SearchFormResultDTO,\r\n DocInfoResultDTO,\r\n DocInfoResultWithTokenDTO,\r\n DocListFilterRequestDTO,\r\n DocListSortRequestDTO,\r\n DocsResultDTO,\r\n WorkflowDTO,\r\n WorkflowInfoDTO,\r\n WorkflowProviderEnum,\r\n SAYTOptionDTO,\r\n SearchResultDTO,\r\n SearchCountResultDTO,\r\n SearchRequestDTO,\r\n SearchFilterDTO,\r\n UserPrincipalDTO,\r\n GroupPrincipalDTO,\r\n ExtraAttributesEmbeddedGridDTO,\r\n SortDirectionEnum,\r\n ItemLinkTypeEnum,\r\n ActivitiesDTO,\r\n NewFormTypeEnum,\r\n LookupValuesResultDTO,\r\n FormLookupTypeEnum,\r\n NewsFeedDTO,\r\n SubscribeResponseDTO,\r\n UserSettingsResultDTO,\r\n SearchFormInfoDTO,\r\n UserSettingsDTO,\r\n ItemFlowsConfigDTO,\r\n ItemFlowDirectionEnum,\r\n SendNotificationRequestDTO,\r\n SendDocumentsRequestDTO,\r\n NewItemResultDTO,\r\n RasterMapResultDTO,\r\n ReminderDTO,\r\n ShareDTO,\r\n TransferItemRequestDTO,\r\n // SearchValueTypeEnum\r\n} from \"data/types\";\r\n\r\nimport { getGeoRasterProvider } from \"components/MapViewer/providerSupport\";\r\n\r\n/**\r\n * ApiCatalog defines ALL WebApi methods provided by inPoint.Web.Server.\r\n *\r\n * Each method is identified by name (the \"key\"), and the value is the metadata:\r\n * - url (without the __api/ prefix); e.g. \"/user/cards\"\r\n * - HTTP method (per default GET)\r\n *\r\n * Cache: caching settings for:\r\n * 1. resilience - unstable network connection\r\n * Cached by service-worker.custom.js; do not define to use default caching strategy,\r\n * set to false to always avoid caching (equals to CacheStrategy.NetworkOnly) or define\r\n * extra properties as such:\r\n * - strategy: defaults to CacheStrategy.StaleWhileRevalidate\r\n * Available: None, StaleWhileRevalidate, CacheFirst, NetworkFirst, NetworkOnly, CacheOnly\r\n *\r\n * 2. offline items - fully synchronized for full offline work.\r\n * Handled by ApiManagerMakeAvailableOffline.js, uses following cache settings:\r\n * - keyParams: per default the URL is used as the CacheKey - here you can\r\n * optionally choose to omit/add other params\r\n * - transformer: transform the original body (only JSON) before caching\r\n * - depsAnalyzer: define which other dependencies exist for the current method\r\n * (note: you can view the latest dependency tree with CommandAction offline_depsMap)\r\n *\r\n * Notes:\r\n * - resilience is currently only for GET methods\r\n * - while online the caching is handled by service-worker.js; when offline it's\r\n * done directly by ApiManager (since Workbox can only check ONE specific Cache\r\n * and we might have items across multiple ones)\r\n * - caching of offline items (\"synchronization\") is handled only by ApiManagerMakeAvailableOffline;\r\n * this includes GET/PUT/POST methods\r\n * -\r\n */\r\n\r\nexport /* istanbul ignore next*/ const ApiCatalog: Dictionary<\r\n string,\r\n ApiMethod\r\n> = {\r\n //#region User\r\n\r\n /**\r\n * @returns {UserInfoResultDTO}\r\n */\r\n fetchUser: {\r\n url: \"/user\",\r\n cache: {\r\n strategy: CacheStrategy.NetworkFirst,\r\n },\r\n },\r\n\r\n /**\r\n * @returns {Array}\r\n */\r\n fetchSites: {\r\n url: \"/user/sites\",\r\n cache: {\r\n strategy: CacheStrategy.NetworkFirst,\r\n },\r\n },\r\n\r\n /**\r\n * @returns {Array}\r\n */\r\n fetchCards: {\r\n url: \"/user/cards\",\r\n cache: {\r\n strategy: CacheStrategy.NetworkFirst,\r\n },\r\n },\r\n\r\n /**\r\n * @returns {UserSettingsResultDTO}\r\n */\r\n fetchUserSettings: {\r\n url: \"/user/settings\",\r\n },\r\n\r\n /**\r\n * @param {UserSettingsDTO} settings\r\n * @returns {boolean}\r\n */\r\n saveUserSettings: {\r\n method: HttpMethod.POST,\r\n url: \"/user/settings\",\r\n },\r\n\r\n /**\r\n * @returns {NewsFeedDTO}\r\n */\r\n fetchNews: {\r\n url: \"/user/feed\",\r\n cache: {\r\n strategy: CacheStrategy.NetworkFirst,\r\n },\r\n },\r\n\r\n // ----- favorites\r\n\r\n /**\r\n * @returns {Array}\r\n */\r\n fetchFavorites: {\r\n url: \"/user/fav\",\r\n cache: {\r\n strategy: CacheStrategy.NetworkFirst,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {string} name\r\n * @returns {boolean}\r\n */\r\n addFavorite: {\r\n method: HttpMethod.PUT,\r\n url: \"/user/fav\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean}\r\n */\r\n delFavorite: {\r\n method: HttpMethod.DELETE,\r\n url: \"/user/fav\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {SearchRequestDTO} searchRequest\r\n * @returns {boolean}\r\n */\r\n addSearchFavorite: {\r\n method: HttpMethod.PUT,\r\n url: \"/search/fav\",\r\n },\r\n\r\n /**\r\n * @param {number} linkId\r\n * @returns {boolean}\r\n */\r\n delFavoriteLink: {\r\n method: HttpMethod.DELETE,\r\n url: \"/user/fav\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n // ----- mails\r\n\r\n // TODO move to /item/mail\r\n /**\r\n * @param {SendNotificationRequestDTO} request\r\n * @returns {boolean}\r\n */\r\n sendMail: {\r\n method: HttpMethod.POST,\r\n url: \"/user/mail\",\r\n },\r\n\r\n // TODO move to /item/mail/doc\r\n /**\r\n * @param {SendDocumentsRequestDTO} request\r\n * @returns {boolean}\r\n */\r\n sendMailAttachments: {\r\n method: HttpMethod.POST,\r\n url: \"/user/maildoc\",\r\n },\r\n //#endregion\r\n\r\n //#region Items\r\n /**\r\n * @param {string} itemUri\r\n * @returns {BreadcrumbResultDTO}\r\n */\r\n fetchBreadcrumb: {\r\n url: \"/folder/breadcrumb\",\r\n },\r\n\r\n // ----- Reminders\r\n /**\r\n * @param {string} itemUri\r\n * @returns {Array}\r\n */\r\n fetchReminders: {\r\n url: \"/item/reminders\",\r\n },\r\n\r\n /**\r\n * @param {ReminderDTO} reminderRequest\r\n * @returns {number}\r\n */\r\n upsertReminder: {\r\n method: HttpMethod.POST,\r\n url: \"/item/reminder\",\r\n },\r\n\r\n /**\r\n * @param {number} reminderId\r\n * @param {string} itemUri\r\n * @returns {number}\r\n */\r\n deleteReminder: {\r\n method: HttpMethod.DELETE,\r\n url: \"/item/reminder\",\r\n },\r\n\r\n // ----- shares\r\n /**\r\n * @param {string} itemUri\r\n * @returns {ShareDTO}\r\n */\r\n fetchShare: {\r\n url: \"/item/share\",\r\n },\r\n\r\n /**\r\n * @param {ShareDTO} shareRequest\r\n * @returns {boolean}\r\n */\r\n createShare: {\r\n method: HttpMethod.POST,\r\n url: \"/item/share\",\r\n },\r\n\r\n /**\r\n * @param {ShareDTO} shareRequest\r\n * @returns {boolean}\r\n */\r\n updateShare: {\r\n method: HttpMethod.PUT,\r\n url: \"/item/share\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean}\r\n */\r\n deleteShare: {\r\n method: HttpMethod.DELETE,\r\n url: \"/item/share\",\r\n },\r\n\r\n /**\r\n * @param {Array} itemUris\r\n * @param {Array} webDavName\r\n * @returns {Array}\r\n */\r\n checkShareName: {\r\n method: HttpMethod.POST,\r\n url: \"/item/share/unique\",\r\n },\r\n\r\n /**\r\n * @param {Array} itemUris\r\n * @param {Array} formatIds\r\n * @returns {ShareContextDTO}\r\n */\r\n fetchShareContext: {\r\n method: HttpMethod.POST,\r\n url: \"/item/share/context\",\r\n },\r\n // ----- items\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {Array}\r\n */\r\n fetchActivities: {\r\n url: \"/item/activity\",\r\n },\r\n\r\n /**\r\n * @returns {Array}\r\n */\r\n fetchOfflineItems: {\r\n url: \"/offline/all\",\r\n cache: {\r\n strategy: CacheStrategy.NetworkFirst,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {string} guid or null\r\n */\r\n addOfflineItem: {\r\n method: HttpMethod.POST,\r\n url: \"/offline\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => crypto.randomUUID(), //TODO: Fix for WebKit < 92,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean} success\r\n */\r\n delOfflineItem: {\r\n method: HttpMethod.DELETE,\r\n url: \"/offline\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean} true if already marked for offline\r\n */\r\n isOfflineItem: {\r\n url: \"/offline\",\r\n },\r\n\r\n // called directly by service-worker.custom.js\r\n // /**\r\n // * @returns {Array}\r\n // */\r\n // fetchOfflinePrecache: {\r\n // // TODO move fetchOfflinePrecache to /user (or /offline?)\r\n // url: \"offline/precache\",\r\n // cache: {\r\n // strategy: CacheStrategy.NetworkOnly,\r\n // },\r\n // },\r\n\r\n context: {\r\n method: HttpMethod.POST,\r\n url: \"/item/context\",\r\n cache: {\r\n strategy: CacheStrategy.NetworkFirst,\r\n keyParams: (params) => ({\r\n itemUri: params.itemUris.length === 1 && params.itemUris[0],\r\n }),\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {string} name\r\n * @returns {boolean}\r\n */\r\n subscribe: {\r\n method: HttpMethod.PUT,\r\n url: \"/item/subscribe\",\r\n offline: {\r\n allowEdit: true,\r\n },\r\n },\r\n\r\n // TODO should be /item/subscribe\r\n /**\r\n * @param {string} itemUri\r\n * @returns {SubscribeResponseDTO}\r\n */\r\n isSubscribed: {\r\n url: \"/item/subscribed\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean}\r\n */\r\n unsubscribeByItemUri: {\r\n method: HttpMethod.DELETE,\r\n url: \"/item/subscribe\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n // TODO should be /item/subscribe/{id}\r\n /**\r\n * @param {string} itemUri\r\n * @param {number} linkID\r\n * @returns {boolean}\r\n */\r\n unsubscribeById: {\r\n method: HttpMethod.DELETE,\r\n url: \"/item/subscribeById\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean}\r\n */\r\n delDefiniteItemUri: {\r\n method: HttpMethod.DELETE,\r\n url: \"/item/deleteDefinite\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean}\r\n */\r\n restoreItemUri: {\r\n method: HttpMethod.PUT,\r\n url: \"/item/restore\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {FormResultDTO}\r\n */\r\n fetchForm: {\r\n url: \"/item/form\",\r\n cache: {\r\n strategy: CacheStrategy.NetworkFirst,\r\n depsAnalyzer: (data: FormResultDTO, params: Object) => {\r\n // TODO #54607 appSettings offline specs - allow editing\r\n const allowEdit = data.isEditAllowed;\r\n const depsApis = [\r\n {\r\n name: \"fetchBreadcrumb\",\r\n params: { itemUri: params.itemUri },\r\n },\r\n {\r\n name: \"context\",\r\n params: {\r\n itemUris: [params.itemUri],\r\n formatIds: [data.formatId],\r\n itemContexts: ItemContextsFlags.All,\r\n },\r\n },\r\n ];\r\n\r\n // parse inPoint.Fields\r\n if (data.fields && data.fields.length > 0) {\r\n for (const field of data.fields) {\r\n switch (field.format) {\r\n case \"Text_LookupRep\":\r\n //lint -fallthrough\r\n case \"Text_Lookup\":\r\n if (allowEdit) {\r\n depsApis.push({\r\n name: \"fetchFormLookup\",\r\n params: {\r\n filters: [],\r\n formatId: data.formatId,\r\n id: field.id,\r\n name: field.name,\r\n pageNum: 0,\r\n isDoc: data.isDoc,\r\n lookupType: 0,\r\n keyword: \"\",\r\n itemUri: data.itemUri,\r\n },\r\n });\r\n }\r\n break;\r\n case \"Text_GeoRaster\":\r\n const mapProvider = getGeoRasterProvider(\r\n params.itemUri,\r\n data.formatId\r\n );\r\n if (mapProvider == null) {\r\n console.warn(\r\n `Text_GeoRaster field ${field.name} - could not find mapProvider for ${params.itemUri}`\r\n );\r\n } else {\r\n depsApis.push({\r\n name: \"fetchRasterMapLayers\",\r\n params: {\r\n itemUri: params.itemUri,\r\n rasterMapIdSelector:\r\n mapProvider.rasterMapIdSelector,\r\n },\r\n });\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // parse ExtraAttributes\r\n if (data.attributes && data.attributes.length > 0) {\r\n for (const ea of data.attributes) {\r\n switch (ea.format) {\r\n case \"FullTextLookup_Combo\":\r\n break;\r\n case \"Lookup_Combo\":\r\n if (allowEdit) {\r\n depsApis.push({\r\n name: \"fetchFormLookup\",\r\n params: {\r\n filters: [],\r\n formatId: data.formatId,\r\n id: ea.id,\r\n name: ea.name,\r\n pageNum: 0,\r\n isDoc: data.isDoc,\r\n lookupType: 1,\r\n keyword: \"\",\r\n itemUri: data.itemUri,\r\n },\r\n });\r\n }\r\n break;\r\n case \"SearchResult\":\r\n // HACK not sure how to discover those dynamically?\r\n const mapProvider = getGeoRasterProvider(\r\n params.itemUri,\r\n data.formatId\r\n );\r\n if (mapProvider == null) {\r\n console.warn(\r\n `EA.SearchResult attribute ${ea.name} - could not find mapProvider for ${params.itemUri}`\r\n );\r\n } else {\r\n depsApis.push({\r\n name: \"fetchRasterMapLayers\",\r\n params: {\r\n itemUri: params.itemUri,\r\n rasterMapIdSelector:\r\n mapProvider.rasterMapIdSelector,\r\n },\r\n });\r\n }\r\n depsApis.push({\r\n name: \"fetchSearchResult\",\r\n params: {\r\n itemUri: params.itemUri,\r\n name: ea.name,\r\n pageNum: 0,\r\n filters: ea.extra.filters,\r\n searchType: SearchRequestType.Url,\r\n scope: SearchScope.CurrentFolder,\r\n },\r\n });\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (allowEdit) {\r\n depsApis.push(\r\n {\r\n name: \"fetchNewForm\",\r\n params: { itemUri: params.itemUri },\r\n },\r\n {\r\n name: \"validateForm\",\r\n params: {\r\n itemUri: params.itemUri,\r\n isDoc: data.isDoc,\r\n values: {},\r\n },\r\n }\r\n );\r\n }\r\n return depsApis;\r\n },\r\n },\r\n },\r\n\r\n /**\r\n * @param {boolean} isNew\r\n * @param {boolean} isDoc\r\n * @param {string} itemUri\r\n * @param {Object} values\r\n * @returns {Object}\r\n */\r\n validateForm: {\r\n method: HttpMethod.POST,\r\n url: \"/item/form/validate\",\r\n cache: {\r\n strategy: CacheStrategy.NetworkOnly,\r\n keyParams: (params) => ({\r\n itemUri: params.itemUri,\r\n isDoc: params.isDoc,\r\n }),\r\n },\r\n offline: {\r\n allowEdit: true,\r\n showToast: false,\r\n transformer: () => ({}), // return no errors on offline so we can continue\r\n },\r\n },\r\n\r\n /**\r\n * @param {NewFormTypeEnum} formType\r\n * @param {string} itemUri\r\n * @returns {FormResultDTO}\r\n */\r\n fetchNewForm: {\r\n url: \"/doc/newform\",\r\n params: ({ itemUri }) => ({ itemUri }),\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean}\r\n */\r\n delItemUri: {\r\n method: HttpMethod.DELETE,\r\n url: \"/item\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} keyword\r\n * @param {number} pageNum\r\n * @param {boolean} isDoc\r\n * @param {number} formatId\r\n * @param {string} name\r\n * @param {FormLookupTypeEnum} lookupType\r\n * @param {number} id\r\n * @param {Array} filters\r\n * @param {string} itemUri\r\n * @returns {LookupValuesResultDTO}\r\n */\r\n fetchFormLookup: {\r\n method: HttpMethod.POST,\r\n url: \"/item/form/lookup\",\r\n cache: {\r\n strategy: CacheStrategy.CacheFirst,\r\n keyParams: (params) => ({\r\n formatId: params.formatId,\r\n name: params.name,\r\n pageNum: params.pageNum,\r\n }),\r\n depsAnalyzer: (data: LookupValuesResultDTO, params: Object) => {\r\n // TODO #54607 appSettings offline specs\r\n const allowEdit = true;\r\n const depsApis = [];\r\n // recursively load all pages\r\n // TODO #54607 appSettings offline specs - limit number of lookup pages to cache\r\n if (allowEdit && data.hasMore) {\r\n depsApis.push({\r\n name: \"fetchFormLookup\",\r\n params: Object.assign({}, params, {\r\n pageNum: params.pageNum + 1,\r\n }),\r\n });\r\n }\r\n return depsApis;\r\n },\r\n },\r\n },\r\n\r\n /**\r\n * @param {boolean} isDoc\r\n * @param {number} formatId\r\n * @param {string} name\r\n * @param {FormLookupTypeEnum} lookupType\r\n * @param {Array} currentLookupValues\r\n * @param {string} itemUri\r\n * @returns {Array}\r\n */\r\n fetchFormLookupDependencies: {\r\n method: HttpMethod.POST,\r\n url: \"/item/form/lookup/dependencies\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {string} name\r\n * @param {string} filter\r\n * @param {number} pageNum\r\n * @param {string} sortColumn\r\n * @param {SortDirectionEnum} sortDirection\r\n * @returns {ExtraAttributesEmbeddedGridDTO}\r\n */\r\n fetchExtraAttributesEmbeddedGrid: {\r\n url: \"/folder/form/grid\",\r\n cache: {\r\n strategy: CacheStrategy.CacheFirst,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {Object} values\r\n * @returns {boolean}\r\n */\r\n saveForm: {\r\n method: HttpMethod.POST,\r\n url: \"/item/form\",\r\n offline: {\r\n allowEdit: true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} templateId\r\n * @param {string} itemUri\r\n * @param {Object} values\r\n * @returns {bool}\r\n */\r\n saveNewDocFromTemplate: {\r\n method: HttpMethod.PUT,\r\n url: \"/doc/doctemplate\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {number} pageNum\r\n * @param {DocListSortRequestDTO | Array} sorts\r\n * @param {Array} filters\r\n * @param {Array} cols\r\n * @returns {DocsResultDTO}\r\n */\r\n fetchDocs: {\r\n method: HttpMethod.POST,\r\n url: \"/folder/docs\",\r\n params: ({\r\n itemUri,\r\n pageNum = 0,\r\n sorts = [],\r\n filters = [],\r\n cols,\r\n }: {\r\n itemUri: string,\r\n pageNum?: number,\r\n sorts?: DocListSortRequestDTO | Array,\r\n filters?: Array,\r\n cols?: Array,\r\n }) => ({\r\n itemUri,\r\n pageNum: pageNum || 0,\r\n sorts: sorts != null && !Array.isArray(sorts) ? [sorts] : sorts,\r\n filters,\r\n cols,\r\n }),\r\n cache: {\r\n keyParams: (params) => ({\r\n itemUri: params.itemUri,\r\n pageNum: params.pageNum,\r\n }),\r\n depsAnalyzer: (data: DocsResultDTO, params: Object) => {\r\n let depsApis = [];\r\n if (data.rowCount > 0 && data.rows) {\r\n for (let rowKey of Object.keys(data.rows)) {\r\n const row = data.rows[rowKey];\r\n const itemUri = row[row.length - 1];\r\n depsApis.push(\r\n {\r\n name: \"fetchForm\",\r\n params: { itemUri },\r\n },\r\n {\r\n name: \"fetchActivities\",\r\n params: { itemUri },\r\n },\r\n {\r\n name: \"fetchDownloadToken\",\r\n params: { itemUri },\r\n transformer: (\r\n data: DocInfoResultWithTokenDTO\r\n ) => ({\r\n ...data,\r\n token: itemUri,\r\n }),\r\n },\r\n {\r\n name: \"context\",\r\n params: {\r\n itemUris: [itemUri],\r\n itemContexts: ItemContextsFlags.All,\r\n },\r\n },\r\n {\r\n name: \"fetchThumbnail\",\r\n params: { itemUri },\r\n }\r\n );\r\n }\r\n }\r\n return depsApis;\r\n },\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {DocListSortRequestDTO | Array} sorts\r\n * @param {Array} filters\r\n * @returns {any}\r\n */\r\n fetchDocsCsv: {\r\n method: HttpMethod.POST,\r\n contentType: ContentType.BLOB,\r\n url: \"/folder/docs_csv\",\r\n params: ({\r\n itemUri,\r\n sorts = [],\r\n filters = [],\r\n }: {\r\n itemUri: string,\r\n sorts?: DocListSortRequestDTO | Array,\r\n filters?: Array,\r\n }) => ({\r\n itemUri,\r\n sorts: sorts != null && !Array.isArray(sorts) ? [sorts] : sorts,\r\n filters,\r\n }),\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {Array} filters\r\n * @returns {number}\r\n */\r\n fetchDocCount: {\r\n method: HttpMethod.POST,\r\n url: \"/folder/doccount\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {DocInfoResultDTO}\r\n */\r\n fetchDocInfo: {\r\n url: \"/doc/info\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {number} version\r\n * @returns {boolean}\r\n */\r\n delDocVersion: {\r\n method: HttpMethod.DELETE,\r\n url: \"/doc/version\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {number} version\r\n * @returns {boolean}\r\n */\r\n restoreDocVersion: {\r\n method: HttpMethod.PUT,\r\n url: \"/doc/version\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {DocInfoResultWithTokenDTO}\r\n */\r\n fetchDownloadToken: {\r\n url: \"/doc/token\",\r\n cache: {\r\n strategy: CacheStrategy.None,\r\n depsAnalyzer: (data: DocInfoResultWithTokenDTO, params: Object) => [\r\n {\r\n name: \"fetchDocument\",\r\n params: {\r\n token: data.token,\r\n pdf: data.isPdf || data.canPdf ? true : undefined,\r\n // fake for offline cache to be used only by fetchDocument/cache/keyParams\r\n itemUri: params.itemUri,\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} token\r\n * @param {string} uri\r\n * @param {boolean} inline\r\n * @param {boolean} pdf\r\n * @param {boolean} stream\r\n * NOTE: api.js only returns URL, we return Content for offline caching\r\n */\r\n fetchDocument: {\r\n url: \"/doc/download\",\r\n cache: {\r\n strategy: CacheStrategy.None,\r\n keyParams: (params) => ({\r\n pdf: params.pdf,\r\n // fake \"random\" token for offline cache\r\n token: params.itemUri,\r\n }),\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {string}\r\n */\r\n fetchThumbnail: {\r\n url: \"/doc/thumbnail\",\r\n cache: {\r\n strategy: CacheStrategy.CacheFirst,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {ItemLinkTypeEnum} itemLinkType\r\n * @param {boolean} getSource\r\n * @returns {Array}\r\n */\r\n fetchRelatedDocs: {\r\n url: \"/doc/related\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {string} webDavName\r\n * @returns {string}\r\n */\r\n getWebDavHttpLink: {\r\n url: \"/doc/webdav\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {string} webDavName\r\n * @returns {Array}\r\n */\r\n getCloudInfo: {\r\n url: \"/doc/cloudinfo\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean}\r\n */\r\n lock: {\r\n method: HttpMethod.PUT,\r\n url: \"/doc/lock\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {boolean}\r\n */\r\n unlock: {\r\n method: HttpMethod.DELETE,\r\n url: \"/doc/lock\",\r\n },\r\n\r\n // ----- folders\r\n\r\n //TODO shouldn't this be in /item or /user?\r\n /**\r\n * @param {boolean} offline\r\n * @returns {Array}\r\n */\r\n getArchiveTargets: {\r\n url: \"/folder/archivetargets\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {string} filter\r\n * @param {boolean} deep\r\n * @param {boolean} all\r\n * @returns {TreeDTO}\r\n */\r\n fetchTree: {\r\n url: \"/folder/tree\",\r\n params: ({ itemUri, filter = \"\", deep = false, all = false }) => ({\r\n itemUri,\r\n filter,\r\n deep,\r\n all,\r\n }),\r\n cache: {\r\n keyParams: (params) => ({\r\n itemUri: params.itemUri,\r\n }),\r\n depsAnalyzer: (data: TreeDTO, params) => {\r\n const { itemUri } = params;\r\n let depsApis = [\r\n // current details\r\n {\r\n name: \"fetchBreadcrumb\",\r\n params: { itemUri },\r\n },\r\n {\r\n name: \"fetchForm\",\r\n params: { itemUri },\r\n },\r\n {\r\n name: \"fetchDocs\",\r\n params: { itemUri },\r\n },\r\n {\r\n name: \"context\",\r\n params: {\r\n itemUris: [itemUri],\r\n itemContexts: ItemContextsFlags.All,\r\n },\r\n },\r\n {\r\n name: \"fetchActivities\",\r\n params: { itemUri },\r\n },\r\n {\r\n name: \"fetchItemFlows\",\r\n params: {\r\n dir: \"in\",\r\n itemUri,\r\n },\r\n },\r\n ];\r\n\r\n if (data.totalCount > 0 && data.items) {\r\n for (const treeNode of data.items) {\r\n depsApis.push(\r\n // recursive children\r\n {\r\n name: \"fetchTree\",\r\n params: {\r\n itemUri: treeNode.itemUri,\r\n deep: false,\r\n all: true, // no paging\r\n },\r\n }\r\n );\r\n }\r\n }\r\n return depsApis;\r\n },\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {number} formatId\r\n * @param {number} elementType\r\n * @param {Object} values\r\n * @returns {NewItemResultDTO}\r\n */\r\n createFolder: {\r\n method: HttpMethod.PUT,\r\n url: \"/folder/form\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => ({ success: true }), // return no errors on offline so we can continue\r\n // transformer: (params) => ({\r\n // success: true,\r\n // itemUri: \"pam-item://FAKEID1\",\r\n // name: params.values.ip[\"$NAME$\"],\r\n // formatId: params.formatId,\r\n // elementType: params.elementType,\r\n // }),\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} template\r\n * @param {string} itemUri\r\n * @param {string} targetFolderName\r\n * @returns {number}\r\n */\r\n createFolderFromTemplate: {\r\n method: HttpMethod.PUT,\r\n url: \"/folder/template\",\r\n offline: {\r\n allowEdit: true,\r\n transformer: () => ({ success: true }), // return no errors on offline so we can continue\r\n },\r\n },\r\n\r\n /**\r\n * @param {number} jobId\r\n * @returns {string}\r\n */\r\n createFolderTemplateGetItemUri: {\r\n url: \"/folder/templatejob\",\r\n },\r\n\r\n // ----- itemNotes\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {number} noteId\r\n * @returns {any}\r\n */\r\n fetchItemNote: {\r\n method: HttpMethod.GET,\r\n url: \"/item/note\",\r\n },\r\n\r\n /**\r\n * @param {ActivityDTO} activity\r\n * @returns {any}\r\n */\r\n addItemNote: {\r\n method: HttpMethod.POST,\r\n url: \"/item/note\",\r\n offline: {\r\n allowEdit: true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {ActivityDTO} activity\r\n * @returns {any}\r\n */\r\n updateItemNote: {\r\n method: HttpMethod.PUT,\r\n url: \"/item/note\",\r\n offline: {\r\n allowEdit: true,\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {number} noteId\r\n * @returns {any}\r\n */\r\n deleteItemNote: {\r\n method: HttpMethod.DELETE,\r\n url: \"/item/note\",\r\n offline: {\r\n allowEdit: true,\r\n },\r\n },\r\n\r\n // ----- itemFlows\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @param {ItemFlowDirectionEnum} dir\r\n * @returns {ItemFlowsConfigDTO}\r\n */\r\n fetchItemFlows: {\r\n url: \"/item/flows\",\r\n cache: {\r\n // transformer to remove custom flows using iframes!\r\n transformer: (data: ItemFlowsConfigDTO) =>\r\n data.flows &&\r\n data.flows.length > 0 &&\r\n data.flows.filter(\r\n (flow) => flow.commandAction.name !== \"itemFlow_custom\"\r\n ),\r\n depsAnalyzer: (data: ItemFlowsConfigDTO, params: Object) => {\r\n const depsApi = [];\r\n if (data.flows && data.flows.length > 0) {\r\n for (const flow of data.flows) {\r\n // TODO #54607 appSettings flow specs - which itemFlows to allow/pre-cache offline\r\n // components/CommandActions/itemFlows/Factory.js\r\n switch (flow.commandAction.name) {\r\n case \"itemFlow_custom\":\r\n break;\r\n case \"itemFlow_folder\":\r\n depsApi.push({\r\n name: \"fetchItemFlowForm\",\r\n params: {\r\n formType: NewFormType.Folder,\r\n itemUri: params.itemUri,\r\n templateType:\r\n ItemFlowTemplateType.Folder,\r\n templateId:\r\n flow.commandAction.props.templateId,\r\n },\r\n });\r\n break;\r\n case \"itemFlow_folderTemplate\":\r\n depsApi.push({\r\n name: \"fetchItemFlowForm\",\r\n params: {\r\n formType: NewFormType.Folder,\r\n itemUri: params.itemUri,\r\n templateType:\r\n ItemFlowTemplateType.FolderTemplate,\r\n templateId:\r\n flow.commandAction.props.templateId,\r\n },\r\n });\r\n break;\r\n case \"itemFlow_document\":\r\n depsApi.push({\r\n name: \"fetchItemFlowForm\",\r\n params: {\r\n formType: NewFormType.Document,\r\n itemUri: params.itemUri,\r\n templateType:\r\n ItemFlowTemplateType.Document,\r\n templateId:\r\n flow.commandAction.props.templateId,\r\n },\r\n });\r\n break;\r\n case \"itemFlow_docTemplate\":\r\n depsApi.push({\r\n name: \"fetchItemFlowForm\",\r\n params: {\r\n formType: NewFormType.Document,\r\n itemUri: params.itemUri,\r\n templateType:\r\n ItemFlowTemplateType.DocTemplate,\r\n templateId:\r\n flow.commandAction.props.templateId,\r\n },\r\n });\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n return depsApi;\r\n },\r\n },\r\n },\r\n\r\n /**\r\n * @param {NewFormTypeEnum} formType\r\n * @param {string} itemUri\r\n * @param {string} templateId\r\n * @param {string} templateType\r\n * @returns {FormResultDTO}\r\n */\r\n fetchItemFlowForm: {\r\n url: \"/item/flows/form\",\r\n },\r\n\r\n // ----- search\r\n /**\r\n * @returns {Array}\r\n */\r\n fetchSearchFormList: {\r\n url: \"/search/list\",\r\n },\r\n\r\n /**\r\n * @param {number} id\r\n * @param {Object} values\r\n * @returns {SearchFormResultDTO}\r\n */\r\n fetchSearchForm: {\r\n method: HttpMethod.POST,\r\n url: \"/search/form\",\r\n },\r\n\r\n //#endregion\r\n\r\n //#region Workflows\r\n /**\r\n * @returns {Array}\r\n */\r\n fetchWorkflowCards: {\r\n url: \"/workflow/cards\",\r\n },\r\n\r\n /**\r\n * @param {string} itemUri\r\n * @returns {Array}\r\n */\r\n fetchNewWorkflows: {\r\n url: \"/workflow/new\",\r\n },\r\n\r\n /**\r\n * @param {WorkflowProviderEnum} provider\r\n * @param {string} wfID\r\n * @param {string} itemUri\r\n * @returns {Array}\r\n */\r\n fetchWorkflowInfo: {\r\n url: \"/workflow/info\",\r\n },\r\n //#endregion\r\n\r\n //#region Raster maps\r\n /**\r\n * @param {string} itemUri\r\n * @param {string} rasterMapIdSelector\r\n * @param {boolean} create\r\n * @returns {RasterMapResultDTO}\r\n */\r\n fetchRasterMapLayers: {\r\n url: \"/map/raster/layers\",\r\n },\r\n\r\n /**\r\n * @param {RasterMapSaveRequestDTO} map\r\n * @returns {RasterMapResultDTO}\r\n */\r\n saveRasterMapLayers: {\r\n method: HttpMethod.POST,\r\n url: \"/map/raster/layers\",\r\n },\r\n //#endregion\r\n\r\n //#region Search\r\n /**\r\n * @param {string} keyword\r\n * @param {string} itemUri\r\n * @returns {Array}\r\n */\r\n fetchSAYT: {\r\n url: \"/search/sayt\",\r\n cache: {\r\n strategy: CacheStrategy.CacheFirst,\r\n },\r\n },\r\n\r\n /**\r\n * @param {SearchRequestDTO} searchRequest\r\n * @returns {SearchCountResultDTO}\r\n */\r\n fetchSearchCount: {\r\n method: HttpMethod.PUT,\r\n url: \"/search/count\",\r\n cache: {\r\n strategy: CacheStrategy.CacheFirst,\r\n },\r\n },\r\n\r\n /**\r\n * @param {SearchRequestDTO} searchRequest\r\n * @returns {SearchResultDTO}\r\n */\r\n fetchSearchResult: {\r\n method: HttpMethod.PUT,\r\n url: \"/search\",\r\n cache: {\r\n keyParams: (params) => ({\r\n name: params.name,\r\n pageNum: params.pageNum,\r\n itemUri: params.itemUri,\r\n scope: params.scope,\r\n searchType: params.searchType,\r\n filters: JSON.stringify(params.filters),\r\n sorts: JSON.stringify(params.sorts),\r\n }),\r\n },\r\n },\r\n\r\n /**\r\n * @param {string} provider\r\n * @param {Array} filters\r\n * @returns {string}\r\n */\r\n fetchSearchSuggestion: {\r\n method: HttpMethod.PUT,\r\n url: \"/search/suggestion\",\r\n },\r\n\r\n /**\r\n * @param {string} keyword\r\n * @param {boolean} includeUsers\r\n * @param {boolean} includeGroups\r\n * @returns {Array}\r\n */\r\n fetchSearchPrincipal: {\r\n url: \"/search/principal\",\r\n cache: {\r\n strategy: CacheStrategy.CacheFirst,\r\n },\r\n },\r\n //#endregion\r\n\r\n //#region transfer\r\n /**\r\n * @param {string} provider\r\n * @param {TransferItemRequestDTO} transferRequest\r\n * @returns {bool}\r\n */\r\n transfer: {\r\n method: HttpMethod.POST,\r\n url: \"/item/transfer\",\r\n },\r\n //#endregion\r\n};\r\n","import \"whatwg-fetch\";\r\nimport { ApiCatalog } from \"data/ApiCatalog\";\r\nimport {\r\n HttpMethod,\r\n type HttpMethodEnum,\r\n ContentType,\r\n type ContentTypeEnum,\r\n CacheStrategy,\r\n type CacheSettings,\r\n CustomHttpHeader,\r\n} from \"data/types\";\r\nimport { isMiniView } from \"data/constants\";\r\nimport {\r\n HTTP_ERROR_CONFLICT,\r\n notifyOnError,\r\n ApiError,\r\n ApiErrorContainer,\r\n ApiNetworkError,\r\n ApiNetworkOfflineError,\r\n ApiConflictError,\r\n} from \"data/apiError\";\r\nimport { accessToken, correlationId, isOnline } from \"data/storeHelper\";\r\nimport { signinRedirect } from \"data/loginFlow\";\r\nimport qs from \"data/queryString\";\r\nimport { performanceTester } from \"data/utils\";\r\nimport { JL } from \"jsnlog\";\r\nimport { isLegacyResponseClone } from \"data/bowser\";\r\nimport cloneDeep from \"lodash/cloneDeep\";\r\n\r\n//#region AbortSignal\r\n// https://github.com/flow-typed/flow-typed/issues/1652\r\n// translation of https://dom.spec.whatwg.org/#abortcontroller\r\ndeclare interface AbortSignal extends EventTarget {\r\n +aborted: boolean;\r\n onabort: EventHandler;\r\n}\r\ndeclare class AbortController {\r\n +signal: AbortSignal;\r\n abort: () => void;\r\n}\r\n//#endregion\r\n\r\nexport type ContextRequest = {\r\n name: string,\r\n method: HttpMethodEnum,\r\n contentType: ContentTypeEnum,\r\n urlEnd: string,\r\n params: Object,\r\n cache: CacheSettings,\r\n};\r\n\r\nexport type Context = {\r\n request: ContextRequest,\r\n response?: Response,\r\n url: string,\r\n options: RequestInit,\r\n body?: any,\r\n};\r\n\r\n/**\r\n * Base implementation for API calls\r\n * TODO this is not meant to be used directly - a cache read-through (including offline) descendent WIP\r\n * @export\r\n * @class ApiManager\r\n * @abstract\r\n */\r\nexport default class ApiManagerBase {\r\n constructor() {\r\n this._log = JL(\"ApiManager\");\r\n this.call = this.call.bind(this);\r\n this.BeforeFetch = this.BeforeFetch.bind(this);\r\n this.OnFetch = this.OnFetch.bind(this);\r\n this.AfterFetch = this.AfterFetch.bind(this);\r\n this.CheckLicense = this.CheckLicense.bind(this);\r\n this.DecodeBody = this.DecodeBody.bind(this);\r\n this.CheckCustomError = this.CheckCustomError.bind(this);\r\n this.EOL = this.EOL.bind(this);\r\n }\r\n\r\n /**\r\n * Call an API method\r\n * @param {string} name API method name (from ApiCatalog)\r\n * @param {Object} params optional parameters\r\n * @param {AbortSignal} signal optional AbortSignal\r\n * @returns {Context} decoded response body\r\n * @memberof ApiManager\r\n * @protected\r\n */\r\n _callReturnContext = async (\r\n name: string,\r\n {\r\n params,\r\n signal,\r\n transformer,\r\n }?: {\r\n params?: Object,\r\n signal?: AbortSignal,\r\n transformer?: (data: Object) => Object,\r\n } = {}\r\n ): Promise => {\r\n if (name == null)\r\n throw new ApiError(\"You must provide the API method name!\");\r\n const meta = ApiCatalog[name];\r\n if (meta == null)\r\n throw new ApiError(`Could not find ${name} in ApiCatalog!`);\r\n let context: Context = {\r\n request: {\r\n name,\r\n method: meta.method ?? HttpMethod.GET,\r\n urlEnd: meta.url,\r\n params:\r\n typeof meta.params === \"function\"\r\n ? meta.params(params)\r\n : params,\r\n contentType: meta.contentType ?? ContentType.AUTO,\r\n cache: meta.cache,\r\n offline: meta.offline,\r\n transformer,\r\n signal,\r\n },\r\n };\r\n context = await this._pipeline(context);\r\n return context;\r\n };\r\n\r\n /**\r\n * Call an API method\r\n * @param {string} name API method name (from ApiCatalog)\r\n * @param {Object} params optional parameters\r\n * @param {AbortSignal} signal optional AbortSignal\r\n * @returns {any} decoded response body\r\n * @memberof ApiManager\r\n * @public\r\n */\r\n call = async (name: string, args?: Object = {}): Promise => {\r\n return (await this._callReturnContext(name, args)).body;\r\n };\r\n\r\n /**\r\n * encode request query parameters\r\n * @param {Object} data\r\n * @returns {string} encoded ready to add to URL (without ?)\r\n * @memberof ApiManager\r\n * @private\r\n */\r\n _encodeData = (data: Object): string => {\r\n // prefix ItemUris\r\n if (Object.prototype.hasOwnProperty.call(data, \"itemUri\")) {\r\n let itemUri = data.itemUri;\r\n if (itemUri && !itemUri.startsWith(\"pam-item://\")) {\r\n data.itemUri = \"pam-item://\" + itemUri;\r\n }\r\n }\r\n // stringify skipping empty values\r\n return qs.stringify(data, {\r\n filter: /* istanbul ignore next */ (prefix, value) =>\r\n value == null ? undefined : value,\r\n });\r\n };\r\n\r\n _getFullCacheKey = (context: Context): string => {\r\n if (context.request.cacheKey) {\r\n return `${window.CONFIG.host.basename}${window.CONFIG.general.api}${context.request.urlEnd}${context.request.cacheKey}`;\r\n }\r\n if (context.request.method === HttpMethod.GET) {\r\n return context.url;\r\n } else {\r\n // store api method name in cache URL to cover apis using same URL but different HTTP methods\r\n // e.g. fetchFavorites, addFavorite and delFavorite\r\n return `${context.url}?${this._encodeData({\r\n api: context.request.name,\r\n })}`;\r\n }\r\n };\r\n\r\n /**\r\n * Creates appropriate request HTTP headers\r\n * @param {Context} context query context\r\n * @returns {Headers} Headers collection\r\n * @memberof ApiManager\r\n * @private\r\n */\r\n _getHeaders = (context: Context): Headers => {\r\n const token: string = accessToken();\r\n /* istanbul ignore else */\r\n if (token == null) {\r\n this._log.error(\"No user token available!\");\r\n throw new ApiError(\"No user token available!\");\r\n }\r\n\r\n const headers = new Headers();\r\n headers.append(\"Accept\", \"application/json\"); //application/json -> to avoid OPTIONS pre-flight requests\r\n\r\n // Bearer Authorization header\r\n if (window.CONFIG.auth.useCustomAuthHeader) {\r\n headers.append(CustomHttpHeader.CustomAuthorization, token);\r\n } else {\r\n headers.append(CustomHttpHeader.Authorization, `Bearer ${token}`);\r\n }\r\n headers.append(CustomHttpHeader.CorrelationId, correlationId());\r\n\r\n // add cacheStrategy for our ServiceWorker to process (avoid a back-lookup)\r\n const { cache } = context.request;\r\n if (cache !== false) {\r\n headers.append(\r\n CustomHttpHeader.CacheStrategy,\r\n cache == null || cache === true\r\n ? CacheStrategy.NetworkFirst\r\n : cache.strategy || CacheStrategy.NetworkFirst\r\n );\r\n }\r\n\r\n // encode custom cacheKey for serviceWorker to use when storing in cache\r\n if (\r\n cache != null &&\r\n Object.prototype.hasOwnProperty.call(cache, \"keyParams\")\r\n ) {\r\n context.request.cacheKey = `?${this._encodeData(\r\n cache.keyParams(context.request.params)\r\n )}`;\r\n headers.append(CustomHttpHeader.CacheKey, context.request.cacheKey);\r\n }\r\n\r\n // passthrough original secureParams token\r\n if (window.CONFIG.general.secure_params) {\r\n headers.append(\r\n CustomHttpHeader.SecureParams,\r\n window.CONFIG.general.secure_params\r\n );\r\n }\r\n\r\n // passthrough original /mini view mode\r\n if (isMiniView(window.location)) {\r\n headers.append(CustomHttpHeader.MiniView, \"1\");\r\n }\r\n return headers;\r\n };\r\n\r\n /**\r\n * Handles failed Network requests\r\n * @param {Context} context query context\r\n * @memberof ApiManager\r\n * @private\r\n */\r\n _networkError = (context: Context): void => {\r\n this._log.error(() => ({\r\n msg: `${context.request.name}: OnFetch - Network request failed`,\r\n apiContext: context,\r\n }));\r\n throw new ApiNetworkOfflineError(\"Network request failed\", context);\r\n };\r\n\r\n /**\r\n * First chain method to prepare Request\r\n * @memberof ApiManager\r\n * @param {Context} context query context\r\n * @returns {Promise} current context\r\n * @virtual\r\n */\r\n async BeforeFetch(context: Context): Promise {\r\n this._log.debug(() => ({\r\n msg: `${context.request.name}: BeforeFetch`,\r\n apiContext: context,\r\n }));\r\n const { method, urlEnd, params, signal } = context.request;\r\n\r\n context.url = `${window.CONFIG.host.basename}${window.CONFIG.general.api}${urlEnd}`;\r\n if (\r\n params &&\r\n (method === HttpMethod.GET ||\r\n method === HttpMethod.DELETE ||\r\n method === HttpMethod.HEAD)\r\n ) {\r\n const urlParams = this._encodeData(params);\r\n if (urlParams && urlParams.length > 0) {\r\n context.url += `?${urlParams}`;\r\n }\r\n }\r\n\r\n context.options = {\r\n method,\r\n headers: this._getHeaders(context),\r\n credentials: \"include\",\r\n mode: \"cors\",\r\n body: undefined,\r\n signal,\r\n };\r\n\r\n /* istanbul ignore else */\r\n if (method === HttpMethod.PUT || method === HttpMethod.POST) {\r\n context.options.headers.append(\"Content-Type\", \"application/json\");\r\n context.options.body = JSON.stringify(params);\r\n }\r\n return context;\r\n }\r\n\r\n /**\r\n * Runs actual data fetch\r\n * @param {Context} context query context\r\n * @returns {Promise} current context with fetch .response\r\n * @memberof ApiManager\r\n * @virtual\r\n */\r\n async OnFetch(context: Context): Promise {\r\n this._log.debug(() => ({\r\n msg: `${context.request.name}: OnFetch`,\r\n apiContext: context,\r\n }));\r\n if (false === isOnline()) this._networkError(context);\r\n context.response = await fetch(context.url, context.options).catch(\r\n (e) => {\r\n // Handle Signal AbortErrors\r\n if (e.name === \"AbortError\") {\r\n throw e;\r\n }\r\n this._networkError(context);\r\n }\r\n );\r\n\r\n return context;\r\n }\r\n\r\n /**\r\n * First response in fetch response chain\r\n * @param {Context} context query context\r\n * @returns {Promise} current context\r\n * @memberof ApiManager\r\n * @virtual\r\n */\r\n async AfterFetch(context: Context): Promise {\r\n this._log.debug(() => ({\r\n msg: `${context.request.name}: AfterFetch`,\r\n apiContext: context,\r\n }));\r\n const { response } = context;\r\n /* istanbul ignore else */\r\n if (!response.ok) {\r\n // NotAuthorized? redirect\r\n if (response.status === 401) {\r\n signinRedirect();\r\n return context;\r\n }\r\n if (response.status === HTTP_ERROR_CONFLICT) {\r\n throw new ApiConflictError(\r\n response,\r\n await this._getErrorData(response)\r\n );\r\n }\r\n if (response.status !== 500 && response.status !== 408) {\r\n throw new ApiNetworkError(\r\n response,\r\n await this._getErrorData(response)\r\n );\r\n } else {\r\n // API errors also have HTTP 500 but include json for isError description\r\n const contentHeader = response.headers.get(\"content-type\");\r\n if (\r\n contentHeader == null ||\r\n contentHeader.indexOf(\"application/json\") === -1\r\n ) {\r\n // this is a different HTTP 500 not coming from API!\r\n throw new ApiNetworkError(\r\n response,\r\n await this._getErrorData(response)\r\n );\r\n }\r\n }\r\n }\r\n return context;\r\n }\r\n\r\n async _getErrorData(response: Response): Promise {\r\n let result = {};\r\n try {\r\n result = await response.clone().json();\r\n } catch (error) {\r\n /* istanbul ignore next */\r\n this._log.warn(() => ({\r\n msg: \"Could parse response body for additional error data\",\r\n error,\r\n response,\r\n }));\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Validates HTTP header for a valid inPoint license\r\n * @param {Context} context query context\r\n * @returns {Promise} current context\r\n * @memberof ApiManager\r\n * @virtual\r\n */\r\n async CheckLicense(context: Context): Promise {\r\n this._log.debug(() => ({\r\n msg: `${context.request.name}: CheckLicense`,\r\n apiContext: context,\r\n }));\r\n // check license\r\n const lic = context.response.headers.get(\"x-inpoint-license\");\r\n /* istanbul ignore else */\r\n if (lic === null || lic === \"Invalid\") {\r\n // TODO invalid license user notification instead of console error\r\n this._log.warn(\"Invalid inPoint.Web Server License!\");\r\n }\r\n return context;\r\n }\r\n\r\n /**\r\n * Decodes response body based on content-type\r\n * @param {Context} context query context\r\n * @returns {Promise} current context with decoded .body\r\n * @memberof ApiManager\r\n * @virtual\r\n */\r\n async DecodeBody(context: Context): Promise {\r\n this._log.debug(() => ({\r\n msg: `${context.request.name}: DecodeBody`,\r\n apiContext: context,\r\n }));\r\n const { request } = context;\r\n // avoid bodyUsed in case of cache.transformer!\r\n /* istanbul ignore next */\r\n const response = isLegacyResponseClone()\r\n ? cloneDeep(context.response) // Legacy browsers\r\n : context.response.clone(); // Modern browsers\r\n switch (request.contentType) {\r\n case ContentType.NONE:\r\n context.body = null;\r\n break;\r\n case ContentType.TEXT:\r\n context.body = await response.text();\r\n break;\r\n case ContentType.AUTO:\r\n // fall through\r\n case ContentType.JSON:\r\n const contentHeader = response.headers.get(\"content-type\");\r\n if (\r\n contentHeader &&\r\n contentHeader.indexOf(\"application/json\") !== -1\r\n ) {\r\n // checking response header\r\n context.body = await response.json();\r\n } else {\r\n context.body = await response.text();\r\n }\r\n break;\r\n case ContentType.BLOB:\r\n // TODO #40646 only newest fetch-mock supports blobs\r\n context.body =\r\n typeof response.blob === \"function\"\r\n ? await response.blob()\r\n : /* istanbul ignore next */ null;\r\n break;\r\n default:\r\n this._log.error(() => ({\r\n msg: `${context.request.name} ApiCatalog has invalid ContentType: ${context.request.contentType}`,\r\n apiContext: context,\r\n }));\r\n break;\r\n }\r\n return context;\r\n }\r\n\r\n /**\r\n * Check for any custom server errors\r\n * @param {Context} context query context\r\n * @returns {Promise} current context\r\n * @memberof ApiManager\r\n * @virtual\r\n */\r\n async CheckCustomError(context: Context): Promise {\r\n this._log.debug(() => ({\r\n msg: `${context.request.name}: CheckCustomError`,\r\n apiContext: context,\r\n }));\r\n const { request, body } = context;\r\n if (request.contentType !== ContentType.BLOB && body != null) {\r\n /* istanbul ignore else */\r\n if (body.isError === true) {\r\n notifyOnError(body);\r\n throw new ApiErrorContainer(body);\r\n }\r\n }\r\n return context;\r\n }\r\n\r\n /**\r\n * Placeholder event at the End Of line\r\n * @param {Context} context\r\n * @returns {Promise}\r\n * @memberof ApiManager\r\n * @virtual\r\n */\r\n async EOL(context: Context): Promise {\r\n return context;\r\n }\r\n\r\n /**\r\n * Main Worker kicking off pipeline chain\r\n * @memberof ApiManager\r\n * @private\r\n */\r\n _pipeline = async (\r\n context: Context\r\n ): Promise /* istanbul ignore next */ =>\r\n performanceTester(\r\n async () =>\r\n await this.BeforeFetch(context)\r\n .then(this.OnFetch)\r\n .then(this.AfterFetch)\r\n .then(this.CheckLicense)\r\n .then(this.DecodeBody)\r\n .then(this.CheckCustomError)\r\n .then(this.EOL),\r\n (ms) =>\r\n this._log.info(() => ({\r\n msg: `${context.request.name} Done in ${ms}ms`,\r\n apiContext: context,\r\n apiTook: ms,\r\n }))\r\n );\r\n}\r\n","//@flow\r\nimport React from \"react\";\r\nimport Status from \"./index\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport styles from \"./Overlay.module.css\";\r\n\r\ntype Props = { status: ConstantsEnum, message: string };\r\nconst Overlay = ({ status, message }: Props) =>\r\n status !== Constants.OK ? (\r\n
\r\n \r\n
\r\n ) : null;\r\nOverlay.displayName = \"Status.Overlay\";\r\n\r\nexport default Overlay;\r\n","// @flow\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Constants from \"data/constants\";\r\nimport styles from \"./Status.module.css\";\r\nimport Overlay from \"./Overlay\";\r\nimport loc from \"i18next\";\r\n\r\n// central UI for status icon\r\nconst Status = ({\r\n status,\r\n ok,\r\n okStyle,\r\n inline = false,\r\n message = \"\",\r\n error = null,\r\n}: {\r\n status: string,\r\n ok?: string,\r\n okStyle?: StyleSheet,\r\n inline?: boolean,\r\n message: ?string,\r\n error?: Error,\r\n}) => {\r\n switch (status) {\r\n case Constants.REFRESH:\r\n case Constants.LOADING:\r\n return inline ? (\r\n \r\n ) : (\r\n
\r\n \r\n
\r\n );\r\n case Constants.OK:\r\n return ok ? (\r\n \r\n ) : null;\r\n case Constants.ERROR:\r\n if (\r\n error != null &&\r\n error.constructor.name === \"ApiNetworkOfflineError\"\r\n ) {\r\n return inline ? (\r\n \r\n ) : (\r\n
\r\n {loc.t(\"offline.pretty.msg\")}\r\n
\r\n );\r\n }\r\n //fallthrough\r\n default:\r\n return inline ? (\r\n \r\n ) : (\r\n
\r\n \r\n {message && (\r\n <>\r\n
\r\n {message}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n};\r\n\r\nStatus.Overlay = Overlay;\r\n\r\nStatus.propTypes = {\r\n status: PropTypes.oneOf([\r\n Constants.NONE,\r\n Constants.LOADING,\r\n Constants.ERROR,\r\n Constants.OK,\r\n Constants.REFRESH,\r\n ]).isRequired,\r\n ok: PropTypes.string,\r\n okStyle: PropTypes.object,\r\n inline: PropTypes.bool,\r\n message: PropTypes.string,\r\n};\r\n\r\nexport default Status;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"LockInfo_wrapper__2aYcg\",\"show\":\"LockInfo_show__1saXx\",\"fadeIn\":\"LockInfo_fadeIn__3rKhE\",\"noshow\":\"LockInfo_noshow__3lCpj\",\"fadeOut\":\"LockInfo_fadeOut__167Ps\",\"info\":\"LockInfo_info__13eo2\",\"icon\":\"LockInfo_icon__miP0D\",\"pulse\":\"LockInfo_pulse__1kC-k\",\"avatar\":\"LockInfo_avatar__19BDH\",\"closeButton\":\"LockInfo_closeButton__2N1K3\"};","import ApiManagerBase, { type Context } from \"./ApiManagerBase\";\r\nimport { ContentType, HttpMethod, OfflineQueueItemType } from \"data/types\";\r\nimport { JL } from \"data/logging\";\r\nimport { ApiNetworkOfflineError } from \"data/apiError\";\r\nimport { addToOfflineQueue } from \"data/offline/offlineQueue\";\r\nimport { isOnline } from \"data/storeHelper\";\r\nimport { toastStyled, toastTypes } from \"data/toast\";\r\n\r\nconst QueuedOfflineStatusText = \"[OFFLINE]\";\r\n\r\n/**\r\n * Adds Offline capabilities\r\n *\r\n * @export\r\n * @class ApiManagerOffline\r\n * @extends {ApiManagerBase}\r\n */\r\nexport default class ApiManagerOffline extends ApiManagerBase {\r\n constructor(args) {\r\n super(args);\r\n this._log = JL(\"ApiManagerOffline\");\r\n this.OnFetch = this.OnFetch.bind(this);\r\n this.AfterFetch = this.AfterFetch.bind(this);\r\n this.CheckLicense = this.CheckLicense.bind(this);\r\n }\r\n\r\n /**\r\n * Runs actual data fetch\r\n * @param {Context} context query context\r\n * @returns {Promise} current context with fetch .response\r\n * @memberof ApiManagerOffline\r\n * @virtual\r\n */\r\n async OnFetch(context: Context): Promise {\r\n if (false === isOnline()) {\r\n this._log.debug(() => ({\r\n msg: `${context.request.name}: OnFetch`,\r\n apiContext: context,\r\n }));\r\n context = await this._handleOfflineRequest(context);\r\n } else {\r\n context = await super.OnFetch(context);\r\n }\r\n return context;\r\n }\r\n\r\n /**\r\n * First response in fetch response chain\r\n * @param {Context} context query context\r\n * @returns {Promise} current context\r\n * @memberof ApiManager\r\n * @virtual\r\n */\r\n async AfterFetch(context: Context): Promise {\r\n context = await super.AfterFetch(context);\r\n\r\n const { response } = context;\r\n const addedToOfflineQueue =\r\n response.status === 202 &&\r\n response.statusText === QueuedOfflineStatusText;\r\n\r\n if (\r\n addedToOfflineQueue &&\r\n context.request.offline &&\r\n context.request.offline.showToast !== false\r\n ) {\r\n toastStyled(toastTypes.swOfflineQueueAdd);\r\n }\r\n return context;\r\n }\r\n\r\n /**\r\n * Logic for handling a Request while network is offline\r\n * Note: we handle offline requests by ourselves, since:\r\n * 1. workbox only checks ONE cache at a time\r\n * 2. workbox cannot handle PUT/POST requests (tricky with plugins)\r\n * 3. we handle our own offlineItems (ApiManagerOffline)\r\n * 4. we return custom error for non-cached methods\r\n * @param {Context} context\r\n * @returns {Promise}\r\n * @memberof ApiManager\r\n * @private\r\n */\r\n async _handleOfflineRequest(context: Context): Promise {\r\n // do we have request pre-cached?\r\n const cacheKey = this._getFullCacheKey(context);\r\n const match = await window.caches.match(cacheKey);\r\n if (match != null) {\r\n this._log.debug(() => ({\r\n msg: `${context.request.name}: OnFetch (from cache)`,\r\n apiContext: context,\r\n cacheKey,\r\n }));\r\n context.response = match;\r\n } else {\r\n // is this a Save request and the ApiMethod supports it?\r\n const shouldSaveOffline =\r\n context.request.offline &&\r\n context.request.offline.allowEdit &&\r\n [HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE].includes(\r\n context.request.method\r\n );\r\n\r\n if (shouldSaveOffline) {\r\n context = await this._handleOfflineSave(context, cacheKey);\r\n } else {\r\n // not managed offline - throw offline error\r\n this._log.warn(() => ({\r\n msg: `${context.request.name}: OnFetch (from cache) - NOT FOUND`,\r\n apiContext: context,\r\n cacheKey,\r\n }));\r\n throw new ApiNetworkOfflineError(\"OFFLINE\", cacheKey);\r\n }\r\n }\r\n return context;\r\n }\r\n\r\n async _handleOfflineTransformer(context: Context): Promise {\r\n if (\r\n context.request.contentType !== ContentType.AUTO &&\r\n context.request.contentType !== ContentType.JSON\r\n ) {\r\n throw new Error(\r\n `ApiCatalog method ${context.request.name} error: cache.transformer can only be used on ContentType.AUTO or JSON!`\r\n );\r\n }\r\n\r\n // transform it and convert back to body\r\n const resultBody = JSON.stringify(\r\n context.request.offline.transformer(context.request.params)\r\n );\r\n\r\n // return this response instead\r\n const headers = new Headers();\r\n headers.append(\"Content-Type\", \"application/json\");\r\n context.response = new Response(resultBody, {\r\n status: 202, // Accepted\r\n statusText: QueuedOfflineStatusText,\r\n headers,\r\n });\r\n return context;\r\n }\r\n\r\n /**\r\n * Logic for handling a Save Request while offline\r\n * @param {Context} context\r\n * @param {string} cacheKey\r\n * @returns {Promise}\r\n * @memberof ApiManager\r\n * @private\r\n */\r\n async _handleOfflineSave(\r\n context: Context,\r\n cacheKey: string\r\n ): Promise {\r\n this._log.info(() => ({\r\n msg: `${context.request.name}: OnFetch while offline - add to offline queue`,\r\n apiContext: context,\r\n cacheKey,\r\n }));\r\n\r\n await addToOfflineQueue({\r\n type: OfflineQueueItemType.ApiCall,\r\n name: context.request.name,\r\n params: context.request.params,\r\n });\r\n\r\n if (typeof context.request.offline.transformer === \"function\") {\r\n // #56022 Support offline save also for items not marked as offline\r\n // return the success body expected by the relevant apiCatalog method\r\n context = await this._handleOfflineTransformer(context);\r\n } else {\r\n // ...and return meaningful info e.g. \"will be saved once online...\" -> handled by AfterFetch()\r\n context.response = new Response(null, {\r\n status: 202, // Accepted\r\n statusText: QueuedOfflineStatusText,\r\n });\r\n }\r\n return context;\r\n }\r\n\r\n /**\r\n * We skip licensing check when offline\r\n * @param {Context} context query context\r\n * @returns {Promise} current context\r\n * @memberof ApiManagerOffline\r\n * @override\r\n */\r\n async CheckLicense(context: Context): Promise {\r\n return context;\r\n }\r\n}\r\n","import ApiManagerBase from \"./ApiManagerBase\";\r\nimport ApiManagerOffline from \"./ApiManagerOffline\";\r\nimport { isFeatureOn, Feature } from \"data/constants\";\r\n\r\nconst ApiManager = isFeatureOn(Feature.offline)\r\n ? new ApiManagerOffline()\r\n : new ApiManagerBase();\r\nexport default ApiManager;\r\n","import actionTypes from \"../actions/actionTypes\";\r\n\r\nexport const initialState = {\r\n initialized: false,\r\n updated: false,\r\n failed: false,\r\n registration: null,\r\n};\r\n\r\nconst serviceWorkerReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.SW_INIT:\r\n return {\r\n ...state,\r\n initialized:\r\n action.payload.registration != null &&\r\n action.payload.error == null,\r\n failed:\r\n action.payload.registration == null &&\r\n action.payload.error != null,\r\n ...action.payload,\r\n };\r\n case actionTypes.SW_UPDATE:\r\n return {\r\n ...state,\r\n updated: !state.updated,\r\n ...action.payload,\r\n };\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default serviceWorkerReducer;\r\n\r\nexport const isSwInitializedSelector = (state: Object): boolean =>\r\n state.sw.initialized === true;\r\nexport const isSwFailedSelector = (state: Object): boolean =>\r\n state.sw.failed === true;\r\nexport const isSwUpdatedSelector = (state: Object): boolean =>\r\n state.sw.updated === true;\r\nexport const swRegistrationSelector = (\r\n state: Object\r\n): ServiceWorkerRegistration | null => state.sw.registration;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** callback when user clicks on More... Button */\r\n onClick?: () => void,\r\n /** optional CSS Class to apply */\r\n className?: string,\r\n /** whether to render the button in a disabled state */\r\n disabled?: boolean,\r\n /** additional css styling */\r\n style?: CSStyleDefinition,\r\n /** Integration Test identifier */\r\n dataTest?: string,\r\n};\r\n\r\nconst ActionsButton = ({\r\n onClick,\r\n className,\r\n disabled,\r\n style = { color: \"black\" },\r\n dataTest = \"actionsButton\",\r\n ...props\r\n}: Props) => (\r\n \r\n \r\n \r\n);\r\nActionsButton.displayName = \"ActionsButton\";\r\nexport default ActionsButton;\r\n","import { useRef, useEffect, useCallback } from \"react\";\r\n\r\nconst useAbortController = (\r\n abortControllerInstance = new AbortController()\r\n) => {\r\n const abort = useRef(abortControllerInstance);\r\n\r\n // Get AbortController (optional: abort existing)\r\n const abortController = useCallback((reset = false): AbortController => {\r\n if (reset) {\r\n abort.current.abort();\r\n abort.current = new AbortController();\r\n }\r\n return abort.current;\r\n }, []);\r\n\r\n // Abort on unmount\r\n useEffect(() => {\r\n function handleUnmount() {\r\n abort.current.abort();\r\n }\r\n return handleUnmount;\r\n }, [abort]);\r\n return abortController;\r\n};\r\n\r\nexport { useAbortController };\r\n","import { useState, useRef, useEffect } from \"react\";\r\nimport { BroadcastChannel } from \"broadcast-channel\";\r\n\r\nexport function useBroadcast(\r\n channelName: string = \"BROADCAST\",\r\n initialState: Object | null = { type: \"UNKNOWN\" }\r\n) {\r\n let [state, setState] = useState(initialState);\r\n let channel = useRef(new BroadcastChannel(channelName));\r\n\r\n useEffect(() => {\r\n /* istanbul ignore next */\r\n if (channel.current) {\r\n channel.current.onmessage = (event: MessageEvent) =>\r\n setState(event);\r\n }\r\n return () => channel.current && channel.current.close();\r\n }, [channelName]);\r\n\r\n const postMessage = (value: any) =>\r\n channel.current && channel.current.postMessage(value);\r\n\r\n return [state, postMessage];\r\n}\r\n","import { useUpdateEffect } from \"hooks\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { toastStyled, dismissToast, toastPosition, toastId } from \"data/toast\";\r\nimport { NotificationStyle } from \"data/types\";\r\nimport styles from \"./NetworkStatus.module.css\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport loc from \"i18next\";\r\nimport { offlineQueueStorage } from \"data/storage\";\r\n\r\nconst useNetworkStatus = () => {\r\n const isOnline = useSelector(s.isOnlineSelector);\r\n\r\n useUpdateEffect(() => {\r\n dismissToast(toastId.NetworkStatus);\r\n if (isOnline) {\r\n offlineQueueStorage.length().then((count) =>\r\n toastStyled({\r\n message:\r\n count === 0\r\n ? loc.t(\"common:offline.connected\")\r\n : loc.t(\"common:offline.connectedSyncing\", {\r\n count,\r\n }),\r\n icon: \"check\",\r\n style: NotificationStyle.Success,\r\n toastId: toastId.NetworkStatus,\r\n className: styles.toast,\r\n position: toastPosition.TOP_CENTER,\r\n })\r\n );\r\n } else {\r\n toastStyled({\r\n message: \"$common:offline.lost\",\r\n icon: \"warning\",\r\n style: NotificationStyle.Warning,\r\n toastId: toastId.NetworkStatus,\r\n className: styles.toast,\r\n autoClose: false,\r\n position: toastPosition.TOP_CENTER,\r\n });\r\n }\r\n }, [isOnline]);\r\n\r\n return null;\r\n};\r\n\r\nexport { useNetworkStatus };\r\n","// @flow\r\nimport { useEvent } from \"hooks\";\r\n\r\n// hook to handle message events\r\nexport function usePostMessageHandler(\r\n handlers: Object,\r\n parentWindow = window.parent\r\n) {\r\n // calls the registered handler for a given message type\r\n function handleMessage(data) {\r\n if (data == null || data.source !== \"inPoint\") return;\r\n var handler = handlers[data.type];\r\n if (handler == null || typeof handler !== \"function\") return;\r\n handler(data.data);\r\n }\r\n\r\n const onMessage = (e) => {\r\n //console.log(e.data);\r\n // some security checks\r\n if (!e.isTrusted || e.data == null) return;\r\n /* istanbul ignore next */ else if (\r\n window !== parentWindow &&\r\n window.location.href !== parentWindow.location.href &&\r\n window.location.origin === parentWindow.location.origin\r\n )\r\n // forward message\r\n parentWindow.postMessage(e.data, \"*\");\r\n else {\r\n // handle\r\n if (Array.isArray(e.data)) {\r\n e.data.forEach(handleMessage);\r\n } else handleMessage(e.data);\r\n }\r\n };\r\n\r\n useEvent(\"message\", onMessage);\r\n}\r\n","// @flow\r\nimport { openSearchResultActionPanel } from \"components/SearchResultActionPanel\";\r\nimport { openGeoPointActionPanel } from \"components/GeoPointActionPanel\";\r\nimport { searchRouteWithItem } from \"components/ItemUriLink\";\r\nimport { check_isView } from \"containers/ActionPanel\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport { usePostMessageHandler } from \"./Handler\";\r\n\r\nconst useDefaultPostMessageHandler = (history) =>\r\n usePostMessageHandler({\r\n search: (data) =>\r\n history.push(searchRouteWithItem(/*searchItem*/ data)),\r\n \"geo-info\": (data) => {\r\n /* istanbul ignore else */\r\n if (data.row) {\r\n openSearchResultActionPanel({\r\n row: {\r\n ...data.row,\r\n targetView: \"searchresult\",\r\n },\r\n });\r\n } else if (check_isView({ views: [\"upload\"] })) {\r\n openGeoPointActionPanel({\r\n location: data,\r\n });\r\n }\r\n },\r\n exec: (data) => CommandActionHandler(data.actionId, data.props),\r\n });\r\n\r\nexport { usePostMessageHandler, useDefaultPostMessageHandler };\r\n","// @flow\r\nimport React from \"react\";\r\nimport { openItemActionPanel } from \"components/ItemActionPanel\";\r\nimport { type MapLocationInfo } from \"data/types\";\r\nimport { getFileExtension } from \"data/utils\";\r\n\r\nexport const openGeoPointActionPanel = ({\r\n location,\r\n}: {\r\n location: MapLocationInfo,\r\n}) =>\r\n openItemActionPanel({\r\n title: location.label,\r\n ext: location.label.includes(\".\") && getFileExtension(location.label),\r\n contextProps: {\r\n itemUri: location.itemUri || \"GEOUPLOAD\",\r\n ext:\r\n location.label.includes(\".\") &&\r\n getFileExtension(location.label),\r\n },\r\n thumbnail: location.thumbnail && (\r\n \r\n ),\r\n attributes: [\r\n [\"Longitude\", String(location.longitude)],\r\n [\"Latitude\", String(location.latitude)],\r\n ],\r\n });\r\n","import { useCallback } from \"react\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport { setSettingAction } from \"data/actions\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\n/** hooks version of containers/SettingValue */\r\nexport function usePersistSetting({ name, defaultValue }) {\r\n const dispatch = useDispatch();\r\n\r\n let value = useSelector((state) => s.settingValueSelector(name, state));\r\n if (value == null) value = defaultValue;\r\n\r\n const setValue = useCallback(\r\n (value: Object) => dispatch(setSettingAction(name, value)),\r\n [dispatch, name]\r\n );\r\n\r\n return [value, setValue];\r\n}\r\n","import { useRef } from \"react\";\r\nimport { compose, createStore, applyMiddleware } from \"redux\";\r\nimport appReducers from \"data/reducers\";\r\n// responsive\r\nimport { responsiveStoreEnhancer } from \"redux-responsive\";\r\n// sagas\r\nimport createSagaMiddleware from \"redux-saga\";\r\nimport { localRootSaga } from \"data/sagas/rootSaga\";\r\n\r\nconst getStore = (storeName: string = \"LocalStore\") => {\r\n // create the saga middleware\r\n const sagaMiddleware = createSagaMiddleware();\r\n\r\n // http://redux.js.org/\r\n const middlewares = [sagaMiddleware];\r\n /*istanbul ignore next*/\r\n const composeEnhancers =\r\n (window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&\r\n window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\r\n name: `inPoint.Web ${storeName}`,\r\n })) ||\r\n compose;\r\n const store = createStore(\r\n appReducers,\r\n composeEnhancers(\r\n responsiveStoreEnhancer,\r\n applyMiddleware(...middlewares)\r\n )\r\n );\r\n\r\n // then run the rootSaga which forks all the others\r\n sagaMiddleware.run(localRootSaga);\r\n\r\n return store;\r\n};\r\n\r\nconst useLocalStore = (storeName: ?string) => {\r\n const store = useRef(null);\r\n /* istanbul ignore else */\r\n if (store.current == null) {\r\n store.current = getStore(storeName);\r\n }\r\n return store.current;\r\n};\r\n\r\nexport { useLocalStore, getStore };\r\n","//@flow\r\nimport { useState, useEffect } from \"react\";\r\nimport moment from \"moment\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\n\r\nconst getMomentLocale = (language: string): string => {\r\n if (language == null) {\r\n return \"de\";\r\n }\r\n switch (language) {\r\n case \"en\":\r\n case \"en-US\":\r\n return null;\r\n case \"de-DE\":\r\n return \"de\";\r\n default:\r\n return language.toLowerCase();\r\n }\r\n};\r\n\r\nconst useMomentLocale = (language: string): ConstantsEnum => {\r\n const locale = getMomentLocale(language);\r\n const [status, setStatus] = useState(Constants.LOADING);\r\n useEffect(() => {\r\n if (locale == null || moment.locales().includes(locale)) {\r\n return setStatus(Constants.OK);\r\n }\r\n import(\r\n `__i18n/moment/${locale}` /* webpackChunkName: \"moment-[request]\" */\r\n )\r\n .then(() => setStatus(Constants.OK))\r\n .catch((e) => {\r\n console.error(\r\n \"[useMomentLocale] Cannot load moment.js locale:\",\r\n e\r\n );\r\n setStatus(Constants.ERROR);\r\n });\r\n }, [locale]);\r\n return status;\r\n};\r\n\r\nexport { useMomentLocale, getMomentLocale };\r\n","import { useState, useRef, useEffect } from \"react\";\r\nimport {\r\n createUppy,\r\n addUppyPlugins,\r\n getUppyLocale,\r\n addUppyEvents,\r\n removeUppyEvents,\r\n type UppyEvent,\r\n uppyPendingFilesMetaSelector,\r\n} from \"data/uppy\";\r\nimport { useDeepCompareEffect } from \"hooks\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\ntype Props = {\r\n /** which uppy ID to use (to separate from other upload queues)\r\n * @default {string} const from data/uppy.js/DEFAULT_UPPY_ID\r\n */\r\n uppyId?: string,\r\n /** optional uppy properties to pass (e.g. maxNumberOfFiles) */\r\n uppyProps?: Object,\r\n /** optional list of uppy events to attach to */\r\n events?: Array,\r\n};\r\n\r\nexport function useUppy({ uppyId, uppyProps, events }: Props) {\r\n const [ready, setReady] = useState(false);\r\n const uppy = useRef();\r\n useEffect(() => {\r\n uppy.current = createUppy({\r\n id: uppyId,\r\n ...uppyProps,\r\n });\r\n uppy.current = addUppyPlugins(uppy.current);\r\n // clear all pending uploads in this queue\r\n uppy.current.reset();\r\n if (events) addUppyEvents(events, uppy.current);\r\n getUppyLocale()\r\n .then((result) => {\r\n uppy.current.locale = { ...result.i18n };\r\n })\r\n .finally(() => setReady(true));\r\n\r\n return () => {\r\n if (events) removeUppyEvents(events, uppy.current);\r\n uppy.current.close();\r\n };\r\n }, [uppyId, uppyProps, events]);\r\n\r\n return ready ? uppy.current : null;\r\n}\r\n\r\n/**\r\n * data/uppy/uppyPendingFilesMetaSelector returns a new object on every call\r\n * this wrapper uses a deep compare to avoid re-renders\r\n * @returns {Array} array of pending file uploads\r\n */\r\nexport function usePendingUploads() {\r\n const [pendingUploads, setPendingUploads] = useState([]);\r\n const uppyPendingUploads = useSelector(uppyPendingFilesMetaSelector);\r\n\r\n useDeepCompareEffect(() => {\r\n setPendingUploads(uppyPendingUploads);\r\n }, [uppyPendingUploads]);\r\n\r\n return pendingUploads;\r\n}\r\n","//@flow\r\nimport { useMemo, useCallback, useState } from \"react\";\r\nimport useUpdateEffect from \"react-use/lib/useUpdateEffect\";\r\nimport createGlobalState from \"react-use/lib/createGlobalState\";\r\nimport { postMessageTo } from \"hooks/PostMessage/Utils\";\r\nimport {\r\n PdfHighlightAction,\r\n type PdfHighlightActionEnum,\r\n} from \"hooks/PostMessage/Actions\";\r\nimport { usePostMessageHandler } from \"hooks/PostMessage/Handler\";\r\nimport {\r\n ActivityType,\r\n ItemNoteType,\r\n type ActivityDTO,\r\n type IPdfShape,\r\n} from \"data/types\";\r\n\r\ntype PdfHighlight = {\r\n $type: ItemNoteTypeEnum,\r\n shapes: Array,\r\n activityId: number,\r\n isReadonly: boolean,\r\n};\r\n\r\nconst usePdfHighlight = createGlobalState(null);\r\n\r\nconst usePdfHighlightActions = () => {\r\n const [target] = usePdfHighlight();\r\n const createPostMessage = useCallback(\r\n (action: PdfHighlightActionEnum) => (payload: any) => {\r\n if (target == null) {\r\n console.warn(`Target is null, ${action} will not be executed!`);\r\n return;\r\n }\r\n postMessageTo(action, payload, target);\r\n },\r\n [target]\r\n );\r\n return useMemo(\r\n () => ({\r\n handleLoad: createPostMessage(PdfHighlightAction.Load),\r\n handleUpsert: createPostMessage(PdfHighlightAction.Upsert),\r\n handleHighlight: createPostMessage(PdfHighlightAction.Highlight),\r\n handleDelete: createPostMessage(PdfHighlightAction.Delete),\r\n handleSelect: createPostMessage(PdfHighlightAction.Select),\r\n }),\r\n [createPostMessage]\r\n );\r\n};\r\n\r\nconst usePdfHighlightActivityList = (\r\n items: Array,\r\n userId: number,\r\n setEdit: (activityId: number) => void,\r\n onAction: (action: string, itemIndex: number) => void\r\n) => {\r\n const [highlight, setHighlight] = useState(null);\r\n const actions = usePdfHighlightActions();\r\n\r\n // Handle UI input from PDF\r\n usePostMessageHandler({\r\n [PdfHighlightAction.Highlight]: (pdfHighlight: PdfHighlight) =>\r\n setHighlight(pdfHighlight.activityId),\r\n [PdfHighlightAction.Upsert]: (pdfHighlight: PdfHighlight) =>\r\n setEdit(pdfHighlight.activityId),\r\n [PdfHighlightAction.Delete]: (pdfHighlight: PdfHighlight) =>\r\n onAction(\r\n \"delete_note\",\r\n items.findIndex(\r\n (item) =>\r\n item.what === ActivityType.comment &&\r\n item.id === pdfHighlight.activityId\r\n )\r\n ),\r\n });\r\n\r\n // Update PDF when items change\r\n useUpdateEffect(() => {\r\n const pdfHighlights: Array = items\r\n .filter(\r\n (item) =>\r\n item.extras &&\r\n item.extras.$type === ItemNoteType.PdfHighlight\r\n )\r\n .map((item) => ({\r\n activityId: item.id,\r\n ...item.extras,\r\n isReadonly: userId !== item.userId,\r\n }));\r\n actions.handleLoad(pdfHighlights);\r\n return () => actions.handleLoad([]);\r\n }, [items, actions, userId]);\r\n\r\n // Create handleHightlicht Callback Factory for ActivityDTOs\r\n const handleHighlight = useCallback(\r\n (item: ActivityDTO) => {\r\n const targetHighlight =\r\n item &&\r\n item.extras &&\r\n item.extras.$type === ItemNoteType.PdfHighlight\r\n ? item.id\r\n : null;\r\n actions.handleHighlight({ activityId: targetHighlight });\r\n setHighlight(targetHighlight);\r\n },\r\n [actions]\r\n );\r\n\r\n return useMemo(\r\n () => [highlight, handleHighlight],\r\n [highlight, handleHighlight]\r\n );\r\n};\r\n\r\nconst usePdfHighlightInput = (handleNoteExtras, noteRef) => {\r\n usePostMessageHandler({\r\n [PdfHighlightAction.Select]: (pdfHighlight: PdfHighlight) => {\r\n /* istanbul ignore else */\r\n if (\r\n pdfHighlight != null &&\r\n noteRef.current &&\r\n noteRef.current.clearableInput\r\n ) {\r\n noteRef.current.clearableInput.scrollIntoView({\r\n block: \"center\",\r\n inline: \"center\",\r\n });\r\n noteRef.current.clearableInput.focus();\r\n }\r\n handleNoteExtras(pdfHighlight);\r\n },\r\n });\r\n return usePdfHighlightActions();\r\n};\r\n\r\nexport {\r\n usePdfHighlight,\r\n usePdfHighlightActions,\r\n usePdfHighlightActivityList,\r\n usePdfHighlightInput,\r\n};\r\n","import React, { useState, useMemo, useCallback, useEffect } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport createGlobalState from \"react-use/lib/createGlobalState\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport { isFeatureOn, Feature } from \"data/constants\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport { toastStyled, dismissToast, toastId } from \"data/toast\";\r\nimport { NotificationStyle } from \"data/types\";\r\n\r\nconst useDismissNetworkToast = createGlobalState(false);\r\n\r\nconst OfflineHandlerFactory =\r\n ({ details, dismiss, setDismiss, setError }) =>\r\n (fetchRequest) =>\r\n (...args) =>\r\n fetchRequest(...args)\r\n .then((response) => {\r\n dismissToast(toastId.NoNetwork);\r\n setDismiss(false);\r\n setError(null);\r\n return response;\r\n })\r\n .catch((e) => {\r\n setError(e);\r\n if (\r\n e.constructor.name === \"ApiNetworkOfflineError\" &&\r\n !dismiss\r\n ) {\r\n toastStyled({\r\n icon: \"chain-broken\",\r\n style: NotificationStyle.Warning,\r\n autoClose: false,\r\n details,\r\n toastId: toastId.NoNetwork,\r\n message: \"$offline.pretty.msg\",\r\n });\r\n }\r\n throw e;\r\n });\r\n\r\nconst useOfflineHandler = ({ itemUri, name, request = null }) => {\r\n const [error, setError] = useState(null);\r\n const [dismiss, setDismiss] = useDismissNetworkToast();\r\n const isOnline = useSelector(s.isOnlineSelector);\r\n\r\n useEffect(() => {\r\n if (isOnline) {\r\n dismissToast(toastId.NoNetwork);\r\n setDismiss(false);\r\n }\r\n }, [dismiss, setDismiss, isOnline]);\r\n\r\n const handleDismissClick = useCallback(\r\n () => setDismiss(true),\r\n [setDismiss]\r\n );\r\n const handleEnableOffline = useMemo(\r\n () =>\r\n /* istanbul ignore else */\r\n itemUri\r\n ? () =>\r\n CommandActionHandler(\"offline_add\", {\r\n itemUri,\r\n name: name || loc.t(\"offline.pretty.noname\"),\r\n })\r\n : null,\r\n [itemUri, name]\r\n );\r\n\r\n const details = useMemo(\r\n () =>\r\n function OfflineErrorDetails() {\r\n return (\r\n <>\r\n {isFeatureOn(Feature.offline) &&\r\n typeof handleEnableOffline === \"function\" && (\r\n \r\n {\" \"}\r\n {loc.t(\"offline.pretty.enable\")}\r\n \r\n )}\r\n \r\n {loc.t(\"offline.pretty.dismiss\")}\r\n \r\n \r\n );\r\n },\r\n [handleEnableOffline, handleDismissClick]\r\n );\r\n\r\n const factory = OfflineHandlerFactory({\r\n details,\r\n dismiss,\r\n setDismiss,\r\n setError,\r\n });\r\n\r\n return useMemo(\r\n () => ({\r\n error,\r\n factory: request ? undefined : factory,\r\n request: request ? factory(request) : undefined,\r\n }),\r\n [error, factory, request]\r\n );\r\n};\r\n\r\nexport { useOfflineHandler, OfflineHandlerFactory };\r\n","import { usePostMessageHandler } from \"hooks/PostMessage/Handler\";\r\nimport { postMessageTo } from \"hooks/PostMessage/Utils\";\r\nimport { ArrowNavigationAction } from \"hooks/PostMessage/Actions\";\r\nimport { docRoute } from \"components/ItemUriLink\";\r\nimport queryString from \"data/queryString\";\r\nimport { get } from \"data/constants\";\r\n\r\nconst useArrowNavigationTransmitter = (\r\n source,\r\n target,\r\n targetData,\r\n setCurrentIndex,\r\n history\r\n) =>\r\n usePostMessageHandler({\r\n [ArrowNavigationAction.Ready]: (data) =>\r\n postMessageTo(ArrowNavigationAction.Load, targetData, target),\r\n [ArrowNavigationAction.Paginate]: (data) => {\r\n if (source !== data.source) {\r\n return;\r\n }\r\n const search = queryString.parse(window.location.search);\r\n search[data.qsParam] = data.currentIndex;\r\n setCurrentIndex(data.currentIndex);\r\n const a = document.createElement(\"a\"); // Use a tag for Location conversion\r\n a.href = window.location;\r\n a.pathname = a.pathname.replace(\r\n get(window.CONFIG, [\"host\", \"basename\"], \"\"),\r\n \"\"\r\n );\r\n a.search = queryString.stringify(search);\r\n history.push(a.pathname + a.search);\r\n },\r\n });\r\n\r\nconst useArrowNavigationReceiver = (\r\n postMessageProps,\r\n setPostMessageProps,\r\n history,\r\n setMaxCount\r\n) =>\r\n usePostMessageHandler({\r\n [ArrowNavigationAction.Load]: (data) => {\r\n /* istanbul ignore if */\r\n if (postMessageProps.source) {\r\n return;\r\n }\r\n setPostMessageProps(data);\r\n setMaxCount(data.rows.length);\r\n },\r\n [ArrowNavigationAction.Reload]: (data) => {\r\n /* istanbul ignore if */\r\n if (data.source !== postMessageProps.source) {\r\n return;\r\n }\r\n setPostMessageProps({\r\n ...postMessageProps,\r\n rows: data.rows,\r\n currentIndex: data.currentIndex,\r\n });\r\n setMaxCount(data.rows.length);\r\n },\r\n [ArrowNavigationAction.SetIndex]: (data) => {\r\n if (data.source !== postMessageProps.source) {\r\n return;\r\n }\r\n const url = docRoute(\r\n postMessageProps.rows[data.currentIndex],\r\n true,\r\n false\r\n );\r\n history.push(url);\r\n setPostMessageProps({\r\n ...postMessageProps,\r\n currentIndex: data.currentIndex,\r\n });\r\n },\r\n });\r\n\r\nexport { useArrowNavigationTransmitter, useArrowNavigationReceiver };\r\n","// @flow\r\nimport React, { useEffect, useMemo } from \"react\";\r\nimport { isFeatureOn, Feature } from \"data/constants\";\r\nimport { Dashboard } from \"@uppy/react\";\r\nimport \"@uppy/dashboard/dist/style.css\";\r\nimport \"./index.css\";\r\n\r\ntype Props = {\r\n /** uppy instance reference */\r\n uppy: Object,\r\n /** whether to immediately open File Browse dialog */\r\n openBrowseDialog?: boolean,\r\n /** whether to immediately open Camera dialog */\r\n openCamera?: boolean,\r\n /** callback when user wants to add a file\r\n * set to replace uppy's dashboard addFilePanel\r\n */\r\n onAddFile?: () => void,\r\n};\r\n\r\nconst UploadSelection = ({\r\n uppy,\r\n openBrowseDialog,\r\n openCamera,\r\n onAddFile,\r\n}: Props) => {\r\n useEffect(() => {\r\n const plugin = uppy.getPlugin(\"react:Dashboard\");\r\n /* istanbul ignore else */\r\n if (plugin) plugin.hideAllPanels();\r\n if (openBrowseDialog === true) {\r\n // browse\r\n var e = document.getElementsByClassName(\"uppy-Dashboard-input\");\r\n /* istanbul ignore else */\r\n if (e.length === 1) e[0].click();\r\n } else if (openCamera === true) {\r\n /* istanbul ignore else */\r\n if (plugin) plugin.showPanel(\"Webcam\");\r\n }\r\n if (plugin && onAddFile)\r\n plugin.toggleAddFilesPanel = onAddFile.bind(this);\r\n }, [uppy, openBrowseDialog, openCamera, onAddFile]);\r\n\r\n const plugins = useMemo(() => {\r\n const plugins = [\"Webcam\"];\r\n /* istanbul ignore next */\r\n if (isFeatureOn(Feature.uppyLexmark)) {\r\n plugins.push(\"Lexmark\");\r\n }\r\n return plugins;\r\n }, []);\r\n\r\n return (\r\n \r\n );\r\n};\r\nexport default UploadSelection;\r\n","// this file defines default split panes proportions\r\n\r\nconst panesDefaultState = {\r\n minipicker: [/*leftSplit:*/ [25, 75]],\r\n folder: [\r\n /*leftSplit:*/ [25, 75],\r\n /*rightSplit:*/ [50, 50],\r\n ],\r\n mailbox: [\r\n /*leftSplit:*/ [25, 75],\r\n /*rightSplit:*/ [60, 40],\r\n ],\r\n document: [\r\n /*leftSplit:*/ [70, 30],\r\n [60, 40],\r\n ],\r\n docmodal: [\r\n /*leftSplit:*/ [70, 30],\r\n [60, 40],\r\n ],\r\n miniflat: [/*topSplit:*/ [60, 40]],\r\n upload: [/*leftSplit*/ [30, 70]],\r\n search: [\r\n /*leftSplit*/ [20, 70],\r\n /*rightSplit:*/ [40, 60],\r\n ],\r\n itemflows: [/*leftSplit*/ [35, 65]],\r\n};\r\n\r\nexport default panesDefaultState;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inputGroup\":\"GeoPointInput_inputGroup__26O1P\",\"buttonsWrapper\":\"GeoPointInput_buttonsWrapper__GebQy\",\"iconWrapper\":\"GeoPointInput_iconWrapper__4x_ll\",\"button\":\"GeoPointInput_button__LLpOp\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"searchTextEditor\":\"AttributeSearch_searchTextEditor__1dsuo\",\"searchRelativeDataEditor\":\"AttributeSearch_searchRelativeDataEditor__1yLoD\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"searchPanel\":\"ArchiveTargetSearchForm_searchPanel__QuqOn\",\"searchResult\":\"ArchiveTargetSearchForm_searchResult__1GcS2\",\"wrapper\":\"ArchiveTargetSearchForm_wrapper__1jneC\",\"fSplit\":\"ArchiveTargetSearchForm_fSplit__TsByH\"};","import store from \"data/store\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { persistor } from \"data/store\";\r\nimport { NotificationStatusFlag, SiteType } from \"data/types\";\r\n\r\nexport const isOnline = () => s.isOnlineSelector(store.getState());\r\n\r\nexport const docsItemUri = () => s.docsItemUriSelector(store.getState());\r\n\r\nexport const currentItemUri = () => s.currentItemUriSelector(store.getState());\r\n\r\nexport const docsFlagsIsDocAssignmentAllowed = () =>\r\n s.docsFlagsIsDocAssignmentAllowedSelector(store.getState());\r\n\r\nexport const accessToken = () => s.loginAccessTokenSelector(store.getState());\r\n\r\nexport const correlationId = () =>\r\n s.userCorrelationIdSelector(store.getState());\r\n\r\nexport const sitesSelector = () => s.userSitesSelector(store.getState());\r\n\r\nexport const globalSitesAreaSelector = () =>\r\n sitesSelector().find(\r\n (s) =>\r\n s.siteType === SiteType.GlobalSites && s.webDavName === \"GLOBALSITE\"\r\n );\r\n\r\nexport const userLanguage = () => s.userLanguageSelector(store.getState());\r\n\r\nexport const settingValue = (name) =>\r\n s.settingValueSelector(name, store.getState());\r\n\r\nexport const swRegistrationSelector = () =>\r\n s.swRegistrationSelector(store.getState());\r\n\r\nexport const dispatch = (action) => store.dispatch(action);\r\n\r\nexport const getNotification = (notificationId) =>\r\n s.notificationSelector(store.getState(), notificationId)?.[0] || {};\r\n\r\nexport { persistor };\r\n","export const postMessageTo = (type, data, target = window.parent) =>\r\n target.postMessage({ source: \"inPoint\", type, data }, \"*\");\r\n","// @flow\r\nimport React from \"react\";\r\nimport AttributeLabel from \"components/ExtraAttributes/AttributeLabel\";\r\nimport ViewerControlBase from \"components/ExtraAttributes/ViewerControl/ViewerControlBase\";\r\n\r\ntype Props = {\r\n name: string,\r\n header?: string,\r\n value?: any | string,\r\n width?: number,\r\n height?: number,\r\n className?: string,\r\n};\r\n\r\nexport const defaultFallbackImage =\r\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\";\r\n\r\nconst ImageViewerControl = ({\r\n name,\r\n header,\r\n value,\r\n width,\r\n height,\r\n className,\r\n}: Props) => {\r\n const heightStyle = height == null || height === 0 ? \"auto\" : `${height}px`;\r\n const widthStyle = width == null || width === 0 ? \"auto\" : `${width}px`;\r\n const parsedValue = value\r\n ? Object.prototype.hasOwnProperty.call(value, \"src\")\r\n ? value.src\r\n : value\r\n : defaultFallbackImage;\r\n return (\r\n \r\n {\" \"}\r\n \r\n \r\n );\r\n};\r\nImageViewerControl.displayName = \"ImageViewerControl\";\r\nexport default ImageViewerControl;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\n\r\nconst initialState = {\r\n cards: [],\r\n status: Constants.NONE,\r\n};\r\n\r\nconst workflowReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.WF_FETCH_REQUESTED:\r\n return { ...state, ...action.payload };\r\n case actionTypes.WF_FETCH_RESULT:\r\n return { ...state, ...action.payload };\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default workflowReducer;\r\n\r\nexport const workflowStatusSelector = (state: Object) => state.workflow.status;\r\nexport const workflowCardsSelector = (state: Object) => state.workflow.cards;\r\nexport const workflowPendingCountSelector = (state: Object) =>\r\n (state.workflow.status === Constants.OK ||\r\n state.workflow.status === Constants.REFRESH) &&\r\n state.workflow.cards\r\n ? state.workflow.cards.filter(\r\n (card) => card.extras.toggle === \"pending\"\r\n ).length\r\n : -1;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\nimport { type docsLayoutState } from \"./types\";\r\n\r\nexport const initialState: docsLayoutState = {\r\n status: Constants.NONE,\r\n};\r\n\r\nconst docsReducer = (state: docsLayoutState = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.CURRENTITEM_SET:\r\n if (\r\n action.payload.name !== \"docmodal\" &&\r\n action.payload.name !== \"itemflows\" &&\r\n action.payload.itemUri !== state.itemUri\r\n )\r\n return { ...initialState };\r\n else return state;\r\n\r\n case actionTypes.DOCS_LAYOUT_REQUEST:\r\n case actionTypes.DOCS_LAYOUT_SET:\r\n return {\r\n ...state,\r\n ...action.payload,\r\n };\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default docsReducer;\r\n\r\nexport const docsLayoutStatusSelector = (state: Object) =>\r\n state.docsLayout.status;\r\nexport const docsLayoutFiltersSelector = (state: Object) =>\r\n state.docsLayout.filters;\r\nexport const docsLayoutSortsSelector = (state: Object) =>\r\n state.docsLayout.sorts;\r\n","import actionTypes from \"../actions/actionTypes\";\r\nimport { ListViewMode } from \"data/types\";\r\nimport bowser from \"data/bowser\";\r\n\r\nexport const initialState = {\r\n mini: false,\r\n // set default based on target device\r\n docListViewMode: null,\r\n};\r\n\r\nconst settingsReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.SETTINGS_SIDEBAR_MINI:\r\n return { ...state, ...action.payload };\r\n case actionTypes.SETTINGS_DOCLIST_VIEWMODE:\r\n return { ...state, docListViewMode: action.payload.viewMode };\r\n case actionTypes.SETTINGS_SET:\r\n return { ...state, [action.payload.name]: action.payload.value };\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default settingsReducer;\r\n\r\nexport const sidebarMiniSelector = (state: Object) => state.settings.mini;\r\nexport const docListViewModeSelector = (state: Object) =>\r\n state.settings.docListViewMode == null\r\n ? bowser.is(\"mobile\") || bowser.is(\"tablet\")\r\n ? ListViewMode.List\r\n : ListViewMode.Grid\r\n : state.settings.docListViewMode;\r\nexport const settingValueSelector = (name: string, state: Object) =>\r\n state.settings[name];\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\n\r\nconst initialState = {\r\n name: \"\",\r\n itemUri: \"\",\r\n status: Constants.LOADING,\r\n};\r\n\r\nconst currentItemReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.CURRENTITEM_BAK:\r\n return {\r\n ...state,\r\n saved: state,\r\n };\r\n case actionTypes.CURRENTITEM_RESTORE:\r\n return {\r\n ...state,\r\n ...state.saved,\r\n saved: undefined,\r\n };\r\n case actionTypes.CURRENTITEM_SET:\r\n const { name, itemUri } = state;\r\n // we reset the state.current to remove any extra values\r\n return {\r\n name,\r\n itemUri,\r\n status: Constants.LOADING,\r\n saved: state.saved,\r\n ...action.payload,\r\n };\r\n case actionTypes.CURRENTITEM_LOADED:\r\n return { ...state, ...action.payload };\r\n\r\n /*case actionTypes.SPLITPANES_SET:\r\n return {\r\n ...state,\r\n [action.payload.name]: action.payload.dimensions\r\n };*/\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default currentItemReducer;\r\n\r\nexport const currentItemUriSelector = (state: Object) => state.current.itemUri;\r\nexport const currentNameSelector = (state: Object) => state.current.name;\r\nexport const currentStatusSelector = (state: Object) => state.current.status;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\nimport { type searchFormListResultState } from \"./types\";\r\n\r\nexport const initialState: searchFormListResultState = {\r\n status: Constants.NONE,\r\n result: [],\r\n};\r\n\r\nconst searchFormsReducer = (\r\n state: searchResultState = initialState,\r\n action\r\n) => {\r\n switch (action.type) {\r\n case actionTypes.SEARCH_FORM_LIST_FETCH_REQUEST:\r\n case actionTypes.SEARCH_FORM_LIST_FETCH_RESULT:\r\n return {\r\n ...state,\r\n ...action.payload,\r\n };\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default searchFormsReducer;\r\n\r\nexport const searchFormListStatusSelector = (state: Object) =>\r\n state.searchForms.status;\r\nexport const searchFormListResultSelector = (state: Object) =>\r\n state.searchForms.result;\r\nexport const searchFormListCountSelector = (state: Object) =>\r\n state.searchForms.status === Constants.OK\r\n ? state.searchForms.result.length\r\n : -1;\r\n","import actionTypes from \"../actions/actionTypes\";\r\nimport {\r\n OfflineSyncStatus,\r\n type OfflineSyncStatusEnum,\r\n type OfflineItemStatus,\r\n} from \"data/types\";\r\nimport produce from \"immer\";\r\n\r\nexport const initialState = {\r\n status: OfflineSyncStatus.Unknown,\r\n message: null,\r\n items: {},\r\n};\r\n\r\nconst offlineReducer = (state = initialState, action) => {\r\n const { payload } = action;\r\n const { item } = payload || {};\r\n\r\n switch (action.type) {\r\n case actionTypes.OFFLINE_SYNC_STARTED:\r\n //lint -fallthrough\r\n case actionTypes.OFFLINE_SYNC_DONE:\r\n return {\r\n ...state,\r\n ...payload,\r\n };\r\n\r\n case actionTypes.OFFLINEITEM_SYNC_STATUS:\r\n return {\r\n ...state,\r\n message: payload.message,\r\n items: produce(state.items, (draft) => {\r\n draft[item.id] = Object.assign({}, item, {\r\n message: payload.message,\r\n status: payload.status,\r\n at: action.receivedAt,\r\n took: payload.took,\r\n });\r\n }),\r\n };\r\n\r\n case actionTypes.OFFLINEITEM_REMOVE:\r\n return {\r\n ...state,\r\n items: produce(state.items, (draft) => {\r\n delete draft[item.id];\r\n }),\r\n };\r\n\r\n case actionTypes.OFFLINEITEM_DEPSMAP_RESULT:\r\n return {\r\n ...state,\r\n items: produce(state.items, (draft) => {\r\n draft[item.id] = Object.assign({}, item, {\r\n depsMap: payload.depsMap,\r\n });\r\n }),\r\n };\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default offlineReducer;\r\n\r\nexport const offlineSyncStatusSelector = (\r\n state: Object\r\n): OfflineSyncStatusEnum => state.offline.status;\r\nexport const offlineItemsSelector = (state: Object) =>\r\n state.offline.items /* istanbul ignore next */ || {};\r\nexport const offlineItemDepsMapSelector = (\r\n state: Object,\r\n item: OfflineItemStatus\r\n) => state.offline.items[item.id].depsMap;\r\n","import React, { useMemo } from \"react\";\r\nimport ClearableInput from \"@hs/clearable-input\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\n\r\nconst MemoEditorControl = (props) => {\r\n const style = useMemo(\r\n () => ({\r\n width: \"100%\",\r\n borderRadius: 0,\r\n resize: \"vertical\",\r\n overflow: \"auto\",\r\n paddingTop: 6,\r\n paddingLeft: 9,\r\n paddingBottom: 6,\r\n border: \"1px solid #cccccc\",\r\n boxShadow: \"inset 0 1px 1px rgb(0 0 0 / 8%)\",\r\n minHeight: props.height || 32,\r\n }),\r\n [props.height]\r\n );\r\n return (\r\n (\r\n \r\n )}\r\n {...props}\r\n />\r\n );\r\n};\r\nMemoEditorControl.displayName = \"MemoEditorControl\";\r\nexport default MemoEditorControl;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport SearchBucket, { getSelected } from \"./\";\r\nimport {\r\n SORT_BUCKET_NAME,\r\n type SearchBucketDTO,\r\n type SearchBucketValueDTO,\r\n} from \"data/types\";\r\nimport styles from \"./SearchBucket.module.css\";\r\n\r\ntype Props = {\r\n item: SearchBucketDTO,\r\n};\r\n\r\nconst findBucketValue = (\r\n item: SearchBucketDTO,\r\n value: number | string | null\r\n): ?SearchBucketValueDTO => {\r\n const idx = item.buckets.findIndex((b) => b.value === value);\r\n if (idx === -1) {\r\n return null;\r\n } else {\r\n return item.buckets[idx];\r\n }\r\n};\r\n\r\nconst parseSelectedValue = (selected: Array): string => {\r\n const selectedValue = getSelected(selected);\r\n return Array.isArray(selectedValue)\r\n ? selectedValue.filter((v) => !!v).join(\"-\")\r\n : selectedValue;\r\n};\r\n\r\nconst Name = ({ item }: Props) => {\r\n const selectedValue = parseSelectedValue(item.selected);\r\n const caption = getLocalizedText(item.caption || item.name);\r\n\r\n // nothing yet selected, show the searchBucketName (localized)\r\n if (selectedValue == null) {\r\n return {caption};\r\n } else {\r\n // we have a value\r\n\r\n // find localized caption of selected value\r\n const bucket = findBucketValue(item, selectedValue);\r\n if (bucket == null) {\r\n // we could not find it (should not really happen)\r\n return (\r\n \r\n {selectedValue\r\n ? `${getLocalizedText(item.caption)}: ${selectedValue}`\r\n : getLocalizedText(item.caption)}\r\n \r\n );\r\n } else {\r\n // should we show the searchBucketName (or save screenspace)?\r\n // note: custom handling of known searchBuckets\r\n if (\r\n item.name === \"Dateityp\" ||\r\n item.name === \"ItemType\" ||\r\n item.hideName === true\r\n ) {\r\n // no, just the selected value\r\n return (\r\n \r\n \r\n {getLocalizedText(\r\n String(bucket.caption || bucket.value)\r\n )}\r\n \r\n );\r\n } else {\r\n // yes show it all (otherwise wont be clear)\r\n return (\r\n \r\n {item.name === SORT_BUCKET_NAME ? (\r\n <>\r\n {/**/}\r\n {getLocalizedText(item.caption)}:{\" \"}\r\n \r\n ) : (\r\n getLocalizedText(caption) + \": \"\r\n )}\r\n \r\n {getLocalizedText(\r\n String(bucket.caption || bucket.value)\r\n )}\r\n \r\n );\r\n }\r\n }\r\n }\r\n};\r\nName.displayName = \"FilterBar.SearchBucket.Name\";\r\n\r\nexport default Name;\r\n","// @flow\r\nimport React from \"react\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport { type SearchBucketDTO } from \"data/types\";\r\n\r\ntype Props = { item: SearchBucketDTO };\r\n\r\nconst Header = ({ item }: Props) => (\r\n {item.caption || item.name}\r\n);\r\n\r\nHeader.displayName = \"FilterBar.SearchBucket.Header\";\r\n\r\nexport default Header;\r\n","// @flow\r\nimport React from \"react\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport loc from \"i18next\";\r\nimport { type SearchBucketDTO } from \"data/types\";\r\n\r\ntype Props = {\r\n item: SearchBucketDTO,\r\n onSelect: (name: string, value: Object) => void,\r\n};\r\n\r\nconst AllItem = ({ item, onSelect }: Props) => (\r\n \r\n onSelect({\r\n name: item.name,\r\n value: \"__ALL__\",\r\n })\r\n }\r\n >\r\n {loc.t(\"common:filter.AllCaption\")}\r\n \r\n);\r\n\r\nAllItem.displayName = \"FilterBar.SearchBucket.AllItem\";\r\n\r\nexport default AllItem;\r\n","// @flow\r\nimport React, { useCallback } from \"react\";\r\nimport MenuItemUI from \"react-bootstrap/lib/MenuItem\";\r\nimport SearchBucket from \"./\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport { type SearchBucketValueDTO } from \"data/types\";\r\nimport styles from \"./SearchBucket.module.css\";\r\n\r\ntype Props = {\r\n name: string,\r\n selected: Array,\r\n item: SearchBucketValueDTO,\r\n onSelect: (name: string, value: Object) => void,\r\n};\r\n\r\nconst MenuItem = ({ name, selected, item, onSelect }: Props) => {\r\n const handleSelect = useCallback(\r\n () => onSelect({ name, value: item.value, valueType: item.valueType }),\r\n [onSelect, name, item]\r\n );\r\n return (\r\n \r\n {item.count > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n {getLocalizedText(item.caption || item.value)}\r\n \r\n \r\n );\r\n};\r\n\r\nMenuItem.displayName = \"FilterBar.SearchBucket.MenuItem\";\r\n\r\nexport default MenuItem;\r\n","// @flow\r\nimport React from \"react\";\r\nimport ButtonUI from \"react-bootstrap/lib/Button\";\r\nimport SearchBucket from \"./\";\r\nimport { type SearchBucketDTO } from \"data/types\";\r\n\r\ntype Props = {\r\n item: SearchBucketDTO,\r\n selected: Array,\r\n onSelect: (name: string, value: Object) => void,\r\n};\r\n\r\nconst Button = ({ item, selected, onSelect }: Props) => (\r\n \r\n onSelect({\r\n name: item.name,\r\n value: null,\r\n })\r\n }\r\n bsSize=\"small\"\r\n style={{\r\n fontWeight: selected.length > 0 ? \"bold\" : \"normal\",\r\n fontStyle: selected.length > 0 ? \"normal\" : \"italic\",\r\n }}\r\n >\r\n \r\n \r\n);\r\n\r\nButton.displayName = \"FilterBar.SearchBucket.Button\";\r\n\r\nexport default Button;\r\n","// @flow\r\nimport React from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Icons from \"@hs/icons\";\r\n\r\ntype Props = {\r\n /** commonName */\r\n name: string,\r\n /** field's value */\r\n value: number | string | null,\r\n /** CSS class to apply to icon */\r\n className?: string,\r\n};\r\n\r\n// gets a bucket's value's icon\r\nconst Icon = ({ name, value, className }: Props) => {\r\n /* istanbul ignore next */\r\n if (value === null) return null;\r\n // note: custom handling of known searchBuckets\r\n if (name === \"Dateityp\") {\r\n return ;\r\n } /* istanbul ignore else */ else if (name === \"ItemType\") {\r\n if (value === \"Document\")\r\n return ;\r\n /* istanbul ignore else */ else if (value === \"Folder\")\r\n return ;\r\n }\r\n return null;\r\n};\r\nIcon.displayName = \"FilterBar.SearchBucket.Icon\";\r\nexport default Icon;\r\n","// @flow\r\nimport React from \"react\";\r\nimport AbsoluteDropdown from \"components/AbsoluteDropdown\";\r\nimport Dropdown from \"react-bootstrap/lib/Dropdown\";\r\nimport bowser from \"data/bowser\";\r\nimport Name from \"./Name\";\r\nimport Header from \"./Header\";\r\nimport AllItem from \"./AllItem\";\r\nimport MenuItem from \"./MenuItem\";\r\nimport Button from \"./Button\";\r\nimport Icon from \"./Icon\";\r\nimport { SORT_BUCKET_NAME, type SearchBucketDTO } from \"data/types\";\r\n// import \"font-awesome/css/font-awesome.css\";\r\n// import FontAwesome from \"react-fontawesome\";\r\n\r\nexport const getSelected = (\r\n selected: Array\r\n): string | number | null =>\r\n selected != null &&\r\n Array.isArray(selected) &&\r\n selected.length > 0 &&\r\n selected[0] != null &&\r\n String(selected[0]).length > 0\r\n ? selected[0]\r\n : null;\r\n\r\ntype Props = {\r\n item: SearchBucketDTO,\r\n i: number,\r\n onSelect: (name: string, value: Object) => void,\r\n isDisabled: boolean,\r\n};\r\n\r\nconst SearchBucket = ({ item, i, onSelect, isDisabled }: Props) => {\r\n const selected: Array = item.selected || [];\r\n\r\n // custom button without menu\r\n /* istanbul ignore else */\r\n if (item.buckets.length === 0) {\r\n if (item.hideMenu === true) {\r\n return (\r\n \r\n );\r\n } else return null;\r\n }\r\n\r\n return (\r\n \r\n 0 ? \"bold\" : \"normal\",\r\n fontStyle: selected.length > 0 ? \"normal\" : \"italic\",\r\n }}\r\n >\r\n {/* {item.icon && (\r\n \r\n )} */}\r\n \r\n \r\n \r\n {bowser.is(\"mobile\") && }\r\n {getSelected(selected) != null &&\r\n item.name !== SORT_BUCKET_NAME &&\r\n item.hideAllReset !== true && (\r\n \r\n )}\r\n {item.buckets.map((bucket, i) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\nSearchBucket.displayName = \"FilterBar.SearchBucket\";\r\nSearchBucket.Name = Name;\r\nSearchBucket.Header = Header;\r\nSearchBucket.AllItem = AllItem;\r\nSearchBucket.MenuItem = MenuItem;\r\nSearchBucket.Button = Button;\r\nSearchBucket.Icon = Icon;\r\n\r\nexport default SearchBucket;\r\n","/* istanbul ignore file */\r\n\r\nimport Loader from \"components/Loader\";\r\nimport { LoadingType } from \"data/types\";\r\n\r\nexport default Loader(\r\n {\r\n loader: () =>\r\n import(\"./index\" /* webpackChunkName: \"component-EAForm\" */),\r\n },\r\n LoadingType.Status\r\n);\r\n","// @flow\r\nimport React from \"react\";\r\nimport { get } from \"data/constants\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./LocalContactInfo.module.css\";\r\nimport globalloc from \"data/i18n.global\";\r\n\r\nconst LocalContactInfo = () => {\r\n const localContactInfo = get(\r\n window.CONFIG,\r\n [\"general\", \"localContactInfo\"],\r\n null\r\n );\r\n if (localContactInfo == null) {\r\n return null;\r\n }\r\n const { email, text = \"\", url } = localContactInfo;\r\n return (\r\n
\r\n {text}\r\n {(email || url) && (\r\n
\r\n {email && (\r\n
\r\n {loc.t(\"localContactInfo:email\") ||\r\n /* istanbul ignore next */ globalloc\r\n .localContactInfo.email}\r\n \r\n {email}\r\n \r\n
\r\n )}\r\n {url && (\r\n
\r\n {loc.t(\"localContactInfo:url\") ||\r\n /* istanbul ignore next */ globalloc\r\n .localContactInfo.url}\r\n \r\n {url}\r\n \r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nLocalContactInfo.displayName = \"LocalContactInfo\";\r\nexport default LocalContactInfo;\r\n","// @flow\r\nimport React from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport styles from \"./Header.module.css\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** optional FontAwesome icon */\r\n icon?: string,\r\n /** optional image source */\r\n image?: string,\r\n /** header's title to display */\r\n title?: string,\r\n /** header's description (as tooltip) */\r\n description?: string,\r\n /** whether to render Favorite icon */\r\n isFav?: boolean,\r\n /** whether to render Recent icon */\r\n isRecent?: boolean,\r\n /** optional center component */\r\n centerComponent?: React.ElementType,\r\n /** optional right component */\r\n rightComponent?: React.ElementType,\r\n /** callback when user clicks Cancel */\r\n onCancel?: () => void,\r\n};\r\n\r\n/**\r\n * renders a panel's header\r\n */\r\nconst Header = ({\r\n icon,\r\n image,\r\n title,\r\n description,\r\n isFav,\r\n isRecent,\r\n centerComponent,\r\n rightComponent,\r\n onCancel,\r\n}: Props) => (\r\n \r\n {icon && }\r\n {image && {title}}\r\n {isFav && }\r\n {isRecent && }\r\n {title && (\r\n \r\n {title}\r\n \r\n )}\r\n {centerComponent}\r\n {rightComponent}\r\n {typeof onCancel === \"function\" && (\r\n \r\n {loc.t(\"cancel\")}\r\n \r\n )}\r\n \r\n);\r\n\r\nHeader.displayName = \"Header\";\r\nexport default Header;\r\n","import React from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport styles from \"./UserGroup.module.css\";\r\n\r\nconst UserGroup = ({ className = \"\" }: { className?: string }) => (\r\n \r\n \r\n \r\n);\r\n\r\nUserGroup.displayName = \"UserGroup\";\r\nexport default UserGroup;\r\n","import React from \"react\";\r\nimport Avatar from \"./Avatar\";\r\nimport UserGroup from \"./UserGroup\";\r\nimport { PrincipalType, type PrincipalTypeEnum } from \"data/types\";\r\n\r\nconst PrincipalAvatar = ({\r\n id,\r\n className,\r\n type = PrincipalType.User,\r\n}: {\r\n id?: int,\r\n className?: string,\r\n type: PrincipalTypeEnum,\r\n}) =>\r\n type === PrincipalType.User ? (\r\n \r\n ) : (\r\n \r\n );\r\n\r\nPrincipalAvatar.displayName = \"Principal\";\r\nexport default PrincipalAvatar;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"NativeSelect_wrapper__3wn7x\",\"icon\":\"NativeSelect_icon__3lgDG\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"table\":\"RowResultByLayout_table__1dG2X\",\"row\":\"RowResultByLayout_row__2_oTT\",\"cell\":\"RowResultByLayout_cell__28nnu\",\"lastcell\":\"RowResultByLayout_lastcell__u2vNi\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"main\":\"Divider_main__bPfiD\",\"textNoHR\":\"Divider_textNoHR__2Zgbo\",\"text\":\"Divider_text__20CvV\",\"fa\":\"Divider_fa__23KPV\",\"hr\":\"Divider_hr__98RAJ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"strip\":\"itemView_docListGallery_strip__2gPpM\",\"stripInner\":\"itemView_docListGallery_stripInner__1sQTy\",\"thumb\":\"itemView_docListGallery_thumb__2vB-w\",\"nav\":\"itemView_docListGallery_nav__20h1C\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"top\":\"itemView_workflow_top___CY33\",\"progressBadge\":\"itemView_workflow_progressBadge__2Atpi\",\"wrapper\":\"itemView_workflow_wrapper__nfgH4\",\"actions\":\"itemView_workflow_actions__3_5me\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"SharePrincipal_wrapper__2xzQt\",\"empty\":\"SharePrincipal_empty__2y9BE\",\"row\":\"SharePrincipal_row__36t1C\",\"toolbar\":\"SharePrincipal_toolbar__2JiHI\",\"noBorder\":\"SharePrincipal_noBorder__3hPh5\"};","import Bowser from \"bowser\";\r\n\r\nconst bowser = Bowser.getParser(window.navigator.userAgent);\r\nexport default bowser;\r\n\r\nexport /**\r\n * @returns {boolean} true if browser cannot clone fetch responses\r\n * @url https://developer.mozilla.org/en-US/docs/Web/API/Response/clone#browser_compatibility\r\n */\r\n/* istanbul ignore next */\r\nconst isLegacyResponseClone = () =>\r\n bowser.satisfies({\r\n chrome: \"<42\",\r\n });\r\n\r\nexport /**\r\n * @returns {boolean} true if mobile or tablet device\r\n *\r\n */\r\nconst isHandheld = () => bowser.is(\"mobile\") || bowser.is(\"tablet\");\r\n\r\nexport /**\r\n * @returns {boolean} true if iOS\r\n *\r\n */\r\nconst isIOS = () => bowser.is(\"iOS\");\r\n\r\nexport /**\r\n * @returns {boolean} true if Windows\r\n *\r\n */\r\nconst isWindows = () => bowser.is(\"Windows\");\r\n\r\nexport /**\r\n * @returns {boolean} true if Safari\r\n *\r\n */\r\nconst isSafari = () => bowser.is(\"Safari\");\r\n\r\nexport /* istanbul ignore next */ const hasConsole = () =>\r\n bowser.is(Bowser.BROWSER_MAP.edge) ||\r\n bowser.is(Bowser.BROWSER_MAP.chrome) ||\r\n bowser.is(Bowser.BROWSER_MAP.firefox) ||\r\n bowser.is(Bowser.BROWSER_MAP.opera) ||\r\n bowser.is(Bowser.BROWSER_MAP.electron) ||\r\n bowser.is(Bowser.BROWSER_MAP.safari);\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"GeoRasterInput_container__1a5g4\",\"inputGroup\":\"GeoRasterInput_inputGroup__3yxK5\",\"buttonsWrapper\":\"GeoRasterInput_buttonsWrapper__1duSy\",\"iconWrapper\":\"GeoRasterInput_iconWrapper__1hLr4\",\"button\":\"GeoRasterInput_button__3NHjt\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"Header_wrapper__2Fjz6\",\"title\":\"Header_title__23ya5\",\"center\":\"Header_center__5c778\",\"right\":\"Header_right__2zfVa\",\"cancel\":\"Header_cancel__2Rthi\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"layerContainer\":\"RasterLayer_layerContainer__2ilJQ\",\"arrows\":\"RasterLayer_arrows__jvd97\",\"thumb\":\"RasterLayer_thumb__jbtQN\",\"name\":\"RasterLayer_name__1GZh5\",\"btnDelete\":\"RasterLayer_btnDelete__267PZ\"};","// @flow\r\n\r\nimport {\r\n type ExtraAttributesEmbeddedGridDTO,\r\n type ExtraAttributeEmbeddedGridColumnDTO,\r\n type ExtraAttributeDataAuditLogDTO,\r\n} from \"data/types\";\r\n\r\n/**\r\n * returns the default values for a given grid\r\n *\r\n * @param {string} gridName grid name (identifier)\r\n * @param {any} attributes form attributes\r\n * @param {string} seqId seqId\r\n * @returns {Array} default value of related grid row\r\n */\r\nexport const getGridRowDefaultValues = (\r\n gridName: string,\r\n attributes: any,\r\n seqId: string | number\r\n): Array => {\r\n const grid = getGrid(attributes, gridName);\r\n const [isNew] = parseSeqId(seqId);\r\n if (isNew) {\r\n return grid.columns.map((col, index) =>\r\n grid.seqIdColumn === index\r\n ? `${seqId}`\r\n : attributes.find((attribute) => attribute.name === col.name)\r\n .value\r\n );\r\n }\r\n return grid.rows.find((row) => row[grid.seqIdColumn] === `${seqId}`);\r\n};\r\n\r\n/**\r\n * returns isNew and corresponding row index/seqId\r\n *\r\n * @param {string | number} seqId seqId to parse\r\n * @returns {Array} array containing a bool flag \"isNew\" and the designated seqId (isNew = false) or new row index (isNew = true)\r\n */\r\nexport const parseSeqId = (seqId: string | number): Array => {\r\n seqId = parseInt(seqId, 10);\r\n return [seqId < 0, seqId < 0 ? convertSeqIdToIndex(seqId) : seqId];\r\n};\r\n\r\n/**\r\n * converts a row index into a seqId\r\n *\r\n * @param {number} index row index to convert to seqId\r\n * @returns {number} seqId\r\n */\r\nexport const convertIndexToSeqId = (index: number) => (index + 1) * -1;\r\n\r\n/**\r\n * converts a seqId into a row index\r\n *\r\n * @param {number} seqId seqId to convert to row index\r\n * @returns {number} row index\r\n */\r\nexport const convertSeqIdToIndex = (seqId: number) => seqId * -1 - 1;\r\n\r\n/**\r\n * returns Embedded Grid DTO from form attributes by given gridName\r\n *\r\n * @param {Array} attributes form attributes\r\n * @param {string} gridName grid name with form type prefix\r\n * @returns {ExtraAttributesEmbeddedGridDTO} Embedded Grid DTO\r\n */\r\nexport const getGrid = (\r\n attributes: Array,\r\n gridName: string\r\n): ExtraAttributesEmbeddedGridDTO => {\r\n return attributes.find(\r\n (attribute) => attribute.name === gridName.split(\".\")[1]\r\n ).value;\r\n};\r\n\r\n/**\r\n * maps a grid row to given ExtraAttributeEmbeddedGridColumnDTO names\r\n *\r\n * @param {Array} row given row\r\n * @param {Array} columns grid columns\r\n * @returns {Object} row values by column name\r\n */\r\nexport const mapGridRowToColumns = (\r\n row: Array,\r\n columns: Array\r\n): Object => {\r\n const result = {};\r\n columns.forEach(\r\n (col: ExtraAttributeEmbeddedGridColumnDTO, index: number) => {\r\n result[col.name] = row[index];\r\n }\r\n );\r\n return result;\r\n};\r\n\r\n/**\r\n * checks if row is deleted in given auditLog\r\n *\r\n * @param {?ExtraAttributeDataAuditLogDTO} auditLog auditLog to check\r\n * @param {string} seqId row identifier\r\n * @returns {bool} flag if row by seqId has changed or is new\r\n */\r\nexport const isGridRowDeleted = (\r\n auditLog: ?ExtraAttributeDataAuditLogDTO,\r\n seqId: string\r\n): boolean =>\r\n auditLog &&\r\n auditLog.deletedIds &&\r\n auditLog.deletedIds.includes(parseInt(seqId, 10));\r\n\r\n/**\r\n * checks if row is updated changed in given auditLog\r\n *\r\n * @param {?ExtraAttributeDataAuditLogDTO} auditLog auditLog to check\r\n * @param {string} seqId row identifier\r\n * @returns {bool} flag if row by seqId has changed or is new\r\n */\r\nexport const isGridRowUpdated = (\r\n auditLog: ?ExtraAttributeDataAuditLogDTO,\r\n seqId: string\r\n): boolean =>\r\n auditLog &&\r\n ((auditLog.updatedRows &&\r\n Object.prototype.hasOwnProperty.call(auditLog.updatedRows, seqId)) ||\r\n parseInt(seqId, 10) < 0);\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\n\r\nconst initialState = {\r\n cards: [],\r\n status: Constants.NONE,\r\n};\r\n\r\nconst cardsReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.CARDS_FETCH_REQUESTED:\r\n return { ...state, ...action.payload };\r\n case actionTypes.CARDS_FETCH_RESULT:\r\n return { ...state, ...action.payload };\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default cardsReducer;\r\n\r\nexport const cardsStatusSelector = (state: Object) => state.cards.status;\r\nexport const cardsCardsSelector = (state: Object) => state.cards.cards;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\nimport immutable from \"object-path-immutable\";\r\n\r\nconst initialState = {};\r\n\r\nconst thumbnailsReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.CURRENTITEM_SET:\r\n /* istanbul ignore next */\r\n if (\r\n action.payload.name !== \"docmodal\" &&\r\n action.payload.name !== \"itemflows\" &&\r\n action.payload.itemUri !== state.itemUri\r\n )\r\n return { ...initialState };\r\n else return state;\r\n\r\n case actionTypes.DOCS_THUMBNAIL_REQUEST:\r\n return immutable.set(state, [action.payload.itemUri], {\r\n status: Constants.LOADING,\r\n });\r\n\r\n case actionTypes.DOCS_THUMBNAIL_RESULT:\r\n return immutable.set(state, [action.payload.itemUri], {\r\n status: action.payload.status,\r\n result: action.payload.result,\r\n });\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default thumbnailsReducer;\r\n\r\nexport const thumbnailStatusSelector = (state: Object, itemUri: string) =>\r\n state.thumbnails[itemUri] != null\r\n ? state.thumbnails[itemUri].status\r\n : Constants.NONE;\r\nexport const thumbnailResultSelector = (state: Object, itemUri: string) =>\r\n state.thumbnails[itemUri] != null\r\n ? state.thumbnails[itemUri].result\r\n : undefined;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\n\r\nconst initialState = {\r\n favorites: [],\r\n status: Constants.NONE,\r\n};\r\n\r\nconst favoritesReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.FAVORITES_FETCH_REQUEST:\r\n return { ...state, ...action.payload };\r\n case actionTypes.FAVORITES_FETCH_RESULT:\r\n return { ...state, ...action.payload };\r\n\r\n // first time loaded as part of the User object\r\n case actionTypes.USER_FETCH_RESULT:\r\n return {\r\n ...state,\r\n status: Constants.OK,\r\n favorites: action.payload.favorites,\r\n };\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default favoritesReducer;\r\n\r\nexport const favoritesStatusSelector = (state: Object) =>\r\n state.favorites.status;\r\nexport const favoritesFavoritesSelector = (state: Object) =>\r\n state.favorites.favorites;\r\n","import actionTypes from \"../actions/actionTypes\";\r\nimport { type CommandActionRequestDTO } from \"data/types\";\r\nimport produce from \"immer\";\r\n\r\nexport const initialState: Array = [];\r\n\r\nconst commandActionReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n const { payload, type } = action;\r\n const i = state.findIndex((i) => i.guid === payload?.guid);\r\n\r\n switch (type) {\r\n case actionTypes.COMMANDACTION_REQUEST:\r\n draft.push(payload);\r\n break;\r\n case actionTypes.COMMANDACTION_REMOVE:\r\n if (i > -1) draft.splice(i, 1);\r\n else\r\n console.warn(\r\n `Not found. Cannot delete CommandAction ${payload.guid}`\r\n );\r\n break;\r\n case actionTypes.COMMANDACTION_LOG:\r\n if (i > -1) {\r\n if (!Array.isArray(draft[i].log)) draft[i].log = [];\r\n draft[i].log.unshift(payload.log);\r\n } else\r\n console.warn(\r\n `Not found. Cannot log to CommandAction ${payload.guid}`\r\n );\r\n break;\r\n case actionTypes.COMMANDACTION_STATUS:\r\n if (i > -1)\r\n draft[i].status = payload.replace\r\n ? payload.status\r\n : draft[i].status | payload.status;\r\n else\r\n console.warn(\r\n `Not found. Cannot update status on CommandAction ${payload.guid}`\r\n );\r\n break;\r\n case actionTypes.COMMANDACTION_ITEM_STATUS:\r\n if (i === -1) {\r\n console.warn(\r\n `GUID not found. Cannot update item status on CommandAction ${payload.guid}`\r\n );\r\n return;\r\n }\r\n const j = draft[i].items.findIndex(\r\n (i) =>\r\n i.itemUri === payload?.itemUri ||\r\n (i.itemUri == null && payload?.itemUri == null)\r\n );\r\n if (j > -1) {\r\n draft[i].items[j].status = payload.status;\r\n } else\r\n console.warn(\r\n `Item not found. Cannot update item status on CommandAction ${payload.guid}`\r\n );\r\n break;\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\nexport default commandActionReducer;\r\n\r\nexport const commandActionRequestSelector = (\r\n state: Any,\r\n guid: GUID = null\r\n): Array =>\r\n state.commandAction?.filter((i) => guid == null || i.guid === guid) ?? [];\r\n\r\nexport const commandActionRequestItemSelector = (\r\n state: Any,\r\n guid: GUID,\r\n itemUri: string = null\r\n): Array =>\r\n commandActionRequestSelector(state, guid)?.[0]?.items?.filter(\r\n (i) => itemUri == null || i.itemUri === itemUri\r\n ) ?? [];\r\n","import { openProgressModal } from \"components/ProgressModal\";\r\nimport geolocator from \"geolocator\";\r\nimport { LocationToString } from \"components/MapViewer/utils\";\r\nimport loc from \"i18next\";\r\nimport geoLocatorOptions from \"components/LocatorButton/geoLocatorOptions\";\r\n\r\ntype Props = {\r\n /** callback when user's geolocation successfully retrieved\r\n * @param {string} strLocation string coordinates\r\n */\r\n onLocation: (strLocation: string) => void,\r\n};\r\n\r\nconst getGeoLocation = ({ onLocation }: Props) =>\r\n openProgressModal({\r\n icon: \"globe\",\r\n title: loc.t(\"common:location.loading\"),\r\n doWork: (close, setError) =>\r\n geolocator.locate(geoLocatorOptions(), (err, location) => {\r\n if (err) {\r\n /* istanbul ignore next */\r\n if (err.message != null) setError(err.message);\r\n else setError(\"Unknown Error Occured.\");\r\n console.warn(err);\r\n } else {\r\n onLocation(LocationToString(location.coords));\r\n close();\r\n }\r\n }),\r\n });\r\n\r\nexport default getGeoLocation;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport { createModal } from \"react-modal-promise\";\r\n// import styles from \"./ConfirmModal.module.css\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\n// import { LoadingType } from \"data/types\";\r\n// import Loader from \"components/Loader\";\r\nimport \"./index.css\";\r\nimport QrReader from \"react-qr-reader\";\r\n\r\n// /* istanbul ignore next */\r\n// const QrReader = Loader(\r\n// {\r\n// loader: () =>\r\n// import(\r\n// \"react-qr-reader\" /* webpackChunkName: \"component-QrReader\" */\r\n// )\r\n// },\r\n// LoadingType.Status\r\n// );\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog\r\n * @param {string} barcode returns the parsed barcode or undefined if user cancelled\r\n */\r\n close: (barcode?: string) => void,\r\n /** Modal Dialog title */\r\n title?: string,\r\n};\r\n\r\ntype State = {\r\n result: ?string,\r\n legacy: boolean,\r\n};\r\n\r\n/** presents a Barcode dialog to the user\r\n * @returns {string} barcode found, null/undefined otherwise\r\n */\r\nexport class BarcodeModal extends React.PureComponent {\r\n bc: null | QrReader;\r\n\r\n state = {\r\n result: null,\r\n legacy: true,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n legacy: !(\r\n \"mediaDevices\" in navigator &&\r\n \"getUserMedia\" in navigator.mediaDevices\r\n ),\r\n };\r\n this._onError = this._onError.bind(this);\r\n }\r\n\r\n _onScan = (result: ?string) =>\r\n (result != null || this.state.legacy) && this.props.close(result);\r\n\r\n /* istanbul ignore next */ _onUpload = () => this.bc.openImageDialog();\r\n\r\n _onError = (err) => {\r\n if (err && err.name === \"NotFoundError\") {\r\n this.setState({ legacy: true });\r\n } else console.error(\"Barcode error: \", err);\r\n };\r\n\r\n render() {\r\n const { open, close, title } = this.props;\r\n return (\r\n close(false)}\r\n >\r\n \r\n \r\n {title}\r\n \r\n \r\n \r\n (this.bc = ref)}\r\n delay={300}\r\n onError={this._onError}\r\n onScan={this._onScan}\r\n style={{ height: \"100%\" }}\r\n legacyMode={this.state.legacy}\r\n />\r\n {this.state.legacy && (\r\n

\r\n {loc.t(\"barcode:noCamera\")}\r\n

\r\n )}\r\n
\r\n \r\n {this.state.legacy && (\r\n \r\n )}\r\n {this.state.legacy === false && (\r\n \r\n close(this.state.result)\r\n }\r\n >\r\n \r\n \r\n )}\r\n close(false)}\r\n >\r\n {loc.t(\"cancel\")}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\nexport const openBarcodeModal = createModal(BarcodeModal);\r\n","import { openBarcodeModal } from \"components/BarcodeModal\";\r\nimport { getBarcodeMatch } from \"data/barcode\";\r\n\r\ntype Props = {\r\n /** Barcode modal title */\r\n title: string,\r\n /** callback once barcode was read (or user clicked cancel)\r\n * @note will NOT be called if user clicked Cancel\r\n * @param {?string} barcode null if no match or barcode itself\r\n */\r\n onBarcode: (barcode: ?string) => void,\r\n /** optional RegExp to retrieve code from QR Barcode */\r\n matchRegexp?: string,\r\n};\r\n\r\n/**\r\n * shows a Barcode Model to scan/upload a barcode,\r\n * matches it and returns the matched code\r\n// TODO currently only QR codes supported, normal Barcode do not need any regexp!\r\n */\r\nconst getBarcode = ({ title, onBarcode, matchRegexp }: Props) =>\r\n openBarcodeModal({\r\n title,\r\n }).then((code) => {\r\n // user clicked cancel/closed modal?\r\n if (code === false) {\r\n return;\r\n }\r\n const result = matchRegexp\r\n ? getBarcodeMatch({ code, matchRegexp })\r\n : code;\r\n onBarcode(result);\r\n });\r\n\r\nexport default getBarcode;\r\n","// @flow\r\n// import { SearchItemDTO } from \"data/types\";\r\n\r\n// type BarcodeConfig = {\r\n// description: string,\r\n// matchRegexp: RegExp,\r\n// searchItem: SearchItemDTO\r\n// };\r\n\r\n// const barcodes: Array = [\r\n// {\r\n// description:\r\n// \"by Freetext: will retrieve k code from a SolothurnURL e.g. https://geo.so.ch/map/?k=cde94a977\",\r\n// matchRegexp: /k=(.*)/gm,\r\n// searchItem: {\r\n// name: \"QR location search\",\r\n// searchType: 2, //SearchItemType.Freetext\r\n// itemUri: \"pam-item://hierarchy=51@path=78$-7\\\\,82$-8812\\\\,83$-8813\",\r\n// scope: 2, //SearchScope.CurrentFolder\r\n// filters: [\r\n// // {\r\n// // name: \"sys.itemtype\",\r\n// // value: \"Folder\"\r\n// // },\r\n// {\r\n// name: \"KCode\",\r\n// valueMatchGroup: 1,\r\n// op: 8, //SearchOperator.Equals,\r\n// valueType: \"String\", //SearchValueType.String\r\n// nodeType: 0 //SearchNodeType.AllNodes\r\n// }\r\n// ]\r\n// }\r\n// }\r\n// // {\r\n// // description:\r\n// // \"by SearchForm: will retrieve k code from a SolothurnURL e.g. https://geo.so.ch/map/?k=cde94a977\",\r\n// // matchRegexp: /k=(.*)/gm,\r\n// // searchItem: {\r\n// // pageNum: 0,\r\n// // id: 9410, //\"Barcode - Solothurn\"\r\n// // // name: \"QR location search\",\r\n// // searchType: 3, //SearchItemType.Form\r\n// // filters: [\r\n// // // {\r\n// // // name: \"sys.itemtype\",\r\n// // // value: \"Folder\"\r\n// // // },\r\n// // {\r\n// // name: \"KCode\",\r\n// // op: 8,//SearchOperator.Equals,\r\n// // valueType: \"String\", //SearchValueType.String\r\n// // nodeType: 0, //SearchNodeType.AllNodes\r\n// // matchGroup: 1\r\n// // }\r\n// // ]\r\n// // }\r\n// // }\r\n// ];\r\n\r\n// export /**\r\n// * tries to match a barcode configuration and returns filters to set\r\n// *\r\n// * @param {{ code: string }} { code } barcode scanned\r\n// * @returns {{ barcode: BarcodeConfig, filters: Object }}\r\n// */\r\n// const findBarcodeConfig = ({ code }: { code: string }) => {\r\n// let i = 0;\r\n// // loop through all barcode configs\r\n// while (i < barcodes.length) {\r\n// let barcode = barcodes[i++];\r\n// let m;\r\n// // find all matches\r\n// while ((m = barcode.matchRegexp.exec(code)) !== null) {\r\n// // This is necessary to avoid infinite loops with zero-width matches\r\n// if (m.index === barcode.matchRegexp.lastIndex) {\r\n// barcode.matchRegexp.lastIndex++;\r\n// }\r\n// // anything found?\r\n// if (m.length > 0) {\r\n// const filters = [];\r\n// // let's build a filter list searchItemType.FreeText\r\n// // eslint-disable-next-line\r\n// barcode.searchItem.filters.forEach(filter => {\r\n// if (filter.value) filters.push(filter);\r\n// else if (filter.valueMatchGroup)\r\n// filters.push(\r\n// Object.assign(\r\n// {},\r\n// filter,\r\n// { valueMatchGroup: null },\r\n// { value: m[filter.valueMatchGroup] }\r\n// )\r\n// );\r\n// });\r\n// return {\r\n// barcode,\r\n// filters\r\n// };\r\n// }\r\n// }\r\n// }\r\n// return null;\r\n// };\r\n\r\nexport const getBarcodeMatch = ({\r\n code,\r\n matchRegexp,\r\n}: {\r\n code: string,\r\n matchRegexp: string,\r\n}): ?string => {\r\n let m;\r\n const re = new RegExp(matchRegexp, \"gmi\");\r\n // find all matches\r\n while ((m = re.exec(code)) !== null) {\r\n // This is necessary to avoid infinite loops with zero-width matches\r\n /* istanbul ignore if */\r\n if (m.index === re.lastIndex) {\r\n re.lastIndex++;\r\n }\r\n // anything found?\r\n /* istanbul ignore else */\r\n if (m.length > 1) {\r\n return m[1];\r\n }\r\n }\r\n return null;\r\n};\r\n","import { searchRouteWithItem } from \"components/ItemUriLink\";\r\nimport history from \"data/history\";\r\nimport {\r\n type SearchItemDTO,\r\n SearchItemType,\r\n type SearchFilterDTO,\r\n type SearchSortDTO,\r\n NotificationStyle,\r\n} from \"data/types\";\r\nimport getGeoLocation from \"./searchResult_form.geoLocation\";\r\nimport getBarcode from \"./searchResult_form.barcode\";\r\nimport loc from \"i18next\";\r\nimport { toastStyled } from \"data/toast\";\r\nimport { tokenize } from \"data/utils\";\r\n\r\nexport /**\r\n * will prefix the filter's name with \".\" (unless $SEARCHTEXT$) to signalize the server-side processing to replace only the value\r\n * and take all filter properties as configured in the search form\r\n * @param {*} name\r\n */\r\nconst fixSearchFilterName = (name) =>\r\n name.toLowerCase() === \"$searchtext$\" ? \"$SEARCHTEXT$\" : \".\" + name; //only overwrite value (see SearchQueryConversion.cs)\r\n\r\n/**\r\n * create a searchItem object and navigate to the /searchresult view\r\n */\r\nconst runSearchItem = ({\r\n id,\r\n name,\r\n showFilterbar,\r\n searchType,\r\n viewMode,\r\n filters,\r\n sorts,\r\n}) =>\r\n history.push(\r\n searchRouteWithItem({\r\n id,\r\n name,\r\n searchType,\r\n fb: showFilterbar ? 1 : 0,\r\n vm: viewMode,\r\n filters: JSON.stringify(filters),\r\n sorts: JSON.stringify(sorts),\r\n })\r\n );\r\n\r\nexport const createSearchItem = ({\r\n id,\r\n name,\r\n showFilterbar,\r\n searchType,\r\n viewMode,\r\n filters,\r\n sorts,\r\n onSearchItemCreated,\r\n}) => {\r\n const searchItem: SearchItemDTO = {\r\n id,\r\n name,\r\n searchType: searchType || SearchItemType.Form,\r\n showFilterbar:\r\n showFilterbar !== \"false\" && showFilterbar !== false ? true : false,\r\n viewMode,\r\n filters: filters && JSON.parse(JSON.stringify(filters)), //HACK: We need a mutable object for this function\r\n sorts,\r\n };\r\n // analyse required filters (any tokens?)\r\n if (filters && filters.length > 0) {\r\n // any geolocation token?\r\n const geoFilter = searchItem.filters.find(\r\n (f) =>\r\n f.value &&\r\n String(f.value).toLowerCase().indexOf(\"{geolocation}\") !== -1\r\n );\r\n if (geoFilter) {\r\n getGeoLocation({\r\n onLocation: (strLoc) => {\r\n geoFilter.name = fixSearchFilterName(geoFilter.name); //only overwrite value (see SearchQueryConversion.cs)\r\n // geolocation string format with radius (as required by inPoint.Web.Server for geoField radius search)\r\n const geolocation = `${strLoc},${geoFilter.radius || 1000}`;\r\n geoFilter.value = tokenize(geoFilter.value, {\r\n geolocation,\r\n });\r\n onSearchItemCreated(searchItem);\r\n },\r\n });\r\n return null;\r\n }\r\n\r\n // or barcode token?\r\n const barcodeFilter = searchItem.filters.find(\r\n (f) =>\r\n f.value &&\r\n String(f.value).toLowerCase().indexOf(\"{barcode}\") !== -1\r\n );\r\n if (barcodeFilter) {\r\n getBarcode({\r\n title: name,\r\n matchRegexp: barcodeFilter.matchRegexp,\r\n onBarcode: (barcode) => {\r\n if (barcode == null) {\r\n toastStyled({\r\n icon: \"warning\",\r\n style: NotificationStyle.Error,\r\n toastId: \"barcode-failure\",\r\n message: loc.t(\"barcode:noMatch\"),\r\n });\r\n return;\r\n }\r\n barcodeFilter.name = fixSearchFilterName(\r\n barcodeFilter.name\r\n ); //only overwrite value (see SearchQueryConversion.cs)\r\n barcodeFilter.value = tokenize(barcodeFilter.value, {\r\n barcode,\r\n });\r\n onSearchItemCreated(searchItem);\r\n },\r\n });\r\n return null;\r\n }\r\n }\r\n return searchItem;\r\n};\r\n\r\nexport /**\r\n * a Promise version of the createSearchItem() function (in case of placeholders it uses callbacks)\r\n */\r\nconst createSearchItemAsync = (\r\n searchItem: SearchItemDTO\r\n): Promise =>\r\n new Promise((resolve, reject) => {\r\n const newSearchItem = createSearchItem({\r\n ...searchItem,\r\n onSearchItemCreated: resolve,\r\n });\r\n /* istanbul ignore else */\r\n if (newSearchItem != null) resolve(newSearchItem);\r\n });\r\n\r\ntype Context = {\r\n title: string,\r\n searchForm: number,\r\n showFilterbar?: boolean | string,\r\n viewMode?: string,\r\n filters?: Array,\r\n sorts?: Array,\r\n};\r\n\r\nclass searchResult_form {\r\n /**\r\n * shows searchResults for a pre-defined searchForm\r\n * @param {{ title: string }} { title } the modal title\r\n * @param {{ searchForm: number }} { searchForm } searchForm.id to run\r\n * @param {{ showFilterbar: boolean }} { showFilterbar } whether to include Filterbar (default: true)\r\n * @param {{ viewMode: string }} { viewMode } change default viewMode (List/Map) (default: List)\r\n * @param {{ filters: Array }} { filters } set additional filters\r\n * @param {{ sorts: Array }} { sorts } set sorting\r\n */\r\n execute = ({\r\n title,\r\n searchForm,\r\n showFilterbar,\r\n viewMode,\r\n filters,\r\n sorts,\r\n }: Context) => {\r\n const searchItem = createSearchItem({\r\n id: searchForm,\r\n name: title,\r\n showFilterbar,\r\n viewMode,\r\n filters,\r\n sorts,\r\n onSearchItemCreated: runSearchItem,\r\n });\r\n if (searchItem != null) {\r\n // no filters / nor geolocation / nor barcode\r\n runSearchItem(searchItem);\r\n }\r\n return true;\r\n };\r\n}\r\n\r\nexport default searchResult_form;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"list\":\"ExternalUser_list__3MyIf\",\"label\":\"ExternalUser_label__1SAIl\",\"name\":\"ExternalUser_name__3MJqW\",\"action\":\"ExternalUser_action__ULTs0\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"LocalContactInfo_wrapper__2fqCp\",\"actions\":\"LocalContactInfo_actions__3qo-A\",\"btn\":\"LocalContactInfo_btn__3RVwf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inputGroup\":\"GeoAreaInput_inputGroup__3SKXn\",\"buttonsWrapper\":\"GeoAreaInput_buttonsWrapper__3_XFG\",\"iconWrapper\":\"GeoAreaInput_iconWrapper__2_968\",\"button\":\"GeoAreaInput_button__PfwfE\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"filter\":\"TreeFilter_filter__nmE69\",\"toggleGroup\":\"TreeFilter_toggleGroup__3y1jK\",\"si\":\"TreeFilter_si__HWo-O\",\"buttonDeep\":\"TreeFilter_buttonDeep__EqZpA\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"toolbar\":\"Toolbar_toolbar__36k4K\",\"title\":\"Toolbar_title__1NWsg\",\"projColor\":\"Toolbar_projColor__3ldkV\",\"projName\":\"Toolbar_projName__PXVEJ\"};","// @flow\r\nimport { type ComponentType } from \"react\";\r\nimport { type Location } from \"history\";\r\n\r\n// global const\r\nconst Constants = {\r\n NONE: \"\",\r\n OK: \"OK\",\r\n ERROR: \"ERROR\",\r\n LOADING: \"LOADING\",\r\n REFRESH: \"REFRESH\",\r\n};\r\n\r\nexport default Constants;\r\n\r\nexport type ConstantsEnum = $Keys;\r\n\r\n// used to give a nice displayName to HOCs\r\nexport const getDisplayName = (WrappedComponent: ComponentType) =>\r\n WrappedComponent.displayName || WrappedComponent.name || \"Component\";\r\n\r\n// finds an appsettings defaults config given an itemUri\r\nexport const getDefaultsConfig = (\r\n itemUri: string,\r\n formatId: number\r\n): Object | null => {\r\n if (\r\n itemUri &&\r\n window.CONFIG.general.defaults &&\r\n window.CONFIG.general.defaults.length > 0\r\n ) {\r\n // search by itemUri\r\n const defaults = window.CONFIG.general.defaults.find((item) => {\r\n let found = false;\r\n // check itemUri\r\n if (item.exactItemUri !== false) found = item.itemUri === itemUri;\r\n else found = itemUri.startsWith(item.itemUri);\r\n if (found) return found;\r\n // check formatIds\r\n if (formatId && formatId !== -1)\r\n found = item.formatIds && item.formatIds.includes(formatId);\r\n return found;\r\n });\r\n if (defaults != null) {\r\n return defaults;\r\n }\r\n\r\n // is there a global default (no itemUri nor formatIds)?\r\n const globalDefaults = window.CONFIG.general.defaults.find(\r\n (item) => item[\"itemUri\"] == null && item[\"formatIds\"] == null\r\n //item => !Object.prototype.hasOwnProperty.call(item, \"itemUri\")\r\n );\r\n /* istanbul ignore else */\r\n if (globalDefaults != null) {\r\n return globalDefaults;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n// Feature Toggles\r\n\r\nexport const Feature = {\r\n searchStatistics: \"searchStatistics\",\r\n searchAsYouType: \"searchAsYouType\",\r\n searchFacets: \"searchFacets\",\r\n searchCalendar: \"searchCalendar\",\r\n homeActions: \"homeActions\",\r\n offline: \"offline\",\r\n uppyLexmark: \"uppyLexmark\",\r\n noteService: \"noteService\",\r\n mailService: \"mailService\",\r\n rasterMapService: \"rasterMapService\",\r\n reminderService: \"reminderService\",\r\n shareService: \"shareService\",\r\n templateService: \"templateService\",\r\n workflowService: \"workflowService\",\r\n};\r\nexport type FeatureEnum = $Values;\r\n\r\nexport const isFeatureOn = (name: FeatureEnum) =>\r\n get(window.CONFIG, [\"general\", \"features\"], []).includes(name);\r\n\r\n/**\r\n * easy null-checked way to access a deep object\r\n * @link https://medium.com/javascript-inside/safely-accessing-deeply-nested-values-in-javascript-99bf72a0855a\r\n * @note could have used lodash._get but this is enough for our needs\r\n * @param {Object} o the object itself\r\n * @param {Array} p array of properties to drill down\r\n * @param {any} d default value in case on the way a null is encountered\r\n */\r\nexport const get = (o, p, d) =>\r\n p.reduce((xs, x) => (xs != null && xs[x] != null ? xs[x] : d), o);\r\n\r\nexport /**\r\n * checks if running in \"mini\" view\r\n *\r\n * @param {?Location} location\r\n */\r\nconst isMiniView = (location: ?Location) =>\r\n location != null ? location.pathname.includes(\"/mini/\") : false;\r\n\r\nexport /**\r\n * checks if running in \"secureParams\" mode\r\n *\r\n * @param {?Location} location\r\n */\r\nconst isSecureParams = (location: ?Location) =>\r\n location != null ? location.search.indexOf(\"sp=\") >= 0 : false;\r\n","// @flow\r\nimport React, { PureComponent, type Node } from \"react\";\r\nimport uppy from \"data/uppy\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport { getClassNames } from \"data/utils\";\r\nimport \"./index.css\";\r\n\r\nconst isDragDropSupported = require(\"@uppy/utils/lib/isDragDropSupported\");\r\nconst getDroppedFiles = require(\"@uppy/utils/lib/getDroppedFiles\");\r\n\r\nexport type DroppedFile = {\r\n source: string,\r\n name: string,\r\n type: string,\r\n data: Object,\r\n};\r\n\r\ntype Props = {\r\n /** whether to allow dropping file on these children */\r\n allowDrop: boolean,\r\n /** called after files have been dropped\r\n * @param {Array} files dropped files ready for uppy - only if @see {addFilesToUppy} is false!\r\n */\r\n onDrop: (files: Array) => void,\r\n /** React node(s) to render */\r\n children: ?Node,\r\n /** HTML id attribute */\r\n id: ?string,\r\n /** HTML style attribute */\r\n style: ?string,\r\n /** HTML class attribute */\r\n className: ?string,\r\n /** Component to apply the FileDropHandler (must be HTML Tag string or Component that forwards the filedrop ref ) */\r\n component: ?string | PureComponent,\r\n /** whether to automatically add files to global uppy instance */\r\n addFilesToUppy?: boolean,\r\n /** message to show while user is dragging over the targetEl dropzone */\r\n dragOverText?: string,\r\n /** relative path */\r\n relativePath?: string,\r\n};\r\n\r\ntype State = {\r\n isDragover: boolean,\r\n isDrop: boolean,\r\n};\r\n\r\n/**\r\n * This will watch @see {targetEl} as a dropzone and process the files (by adding them to uppy)\r\n * and finally calling the onDrop callback\r\n * @export\r\n */\r\nexport default class FileDropHandler extends PureComponent {\r\n _dropzone: ?React$ElementRef;\r\n _timeout: ?TimeoutID;\r\n _isMounted: boolean;\r\n\r\n static defaultProps = {\r\n addFilesToUppy: true,\r\n relativePath: null,\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n this._dropzone = React.createRef();\r\n this.state = {\r\n isDragover: false,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n this._registerHandler();\r\n };\r\n\r\n componentWillUnmount = () => {\r\n this._isMounted = false;\r\n this._unregisterHandler();\r\n };\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n // allowDrop changed\r\n /* istanbul ignore else */\r\n if (prevProps.allowDrop !== this.props.allowDrop) {\r\n if (this.props.allowDrop === false) {\r\n this._unregisterHandler();\r\n } else {\r\n this._registerHandler();\r\n }\r\n }\r\n }\r\n\r\n _registerHandler = () => {\r\n if (this.props.allowDrop !== true || !isDragDropSupported()) {\r\n return;\r\n }\r\n this._dropzone.current.addEventListener(\"drop\", this.onDrop);\r\n this._dropzone.current.addEventListener(\"dragover\", this.onDragOver);\r\n this._dropzone.current.addEventListener(\"dragleave\", this.onDragLeave);\r\n };\r\n\r\n _unregisterHandler = () => {\r\n this._dropzone.current.removeEventListener(\"drop\", this.onDrop);\r\n this._dropzone.current.removeEventListener(\"dragover\", this.onDragOver);\r\n this._dropzone.current.removeEventListener(\r\n \"dragleave\",\r\n this.onDragLeave\r\n );\r\n clearTimeout(this._timeout);\r\n };\r\n\r\n onDrop = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n event.dataTransfer.dropEffect = \"copy\";\r\n\r\n if (!this.isFileDrag(event)) {\r\n toastActionResult(false, \"action_drop\");\r\n return;\r\n }\r\n\r\n getDroppedFiles(event.dataTransfer).then((files) => {\r\n let addedCount = 0;\r\n const filesDTO = files.map((file) => {\r\n const fileDTO = {\r\n source: \"FileDropHandler\",\r\n name: file.name,\r\n type: file.type,\r\n data: file,\r\n meta: {\r\n relativePath: this.props.relativePath,\r\n },\r\n };\r\n\r\n /* istanbul ignore else */\r\n if (this.props.addFilesToUppy)\r\n try {\r\n uppy.addFile(fileDTO);\r\n addedCount++;\r\n } catch (err) {\r\n /* istanbul ignore next */\r\n if (!err.isRestriction) {\r\n uppy.log(err);\r\n }\r\n }\r\n else addedCount++;\r\n return fileDTO;\r\n });\r\n // only continue if any pending uploads remain\r\n /* istanbul ignore else */\r\n if (addedCount > 0) {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onDrop === \"function\") {\r\n this.props.onDrop(filesDTO);\r\n }\r\n }\r\n this.onDragLeave(event);\r\n });\r\n };\r\n\r\n isFileDrag = (event) =>\r\n event &&\r\n event.dataTransfer &&\r\n event.dataTransfer.types &&\r\n [...event.dataTransfer.types].includes(\"Files\");\r\n\r\n onDragOver = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n /* istanbul ignore else */\r\n if (this._isMounted && this.isFileDrag(event))\r\n this.setState({\r\n isDragover: true,\r\n });\r\n clearTimeout(this._timeout);\r\n };\r\n\r\n onDragLeave = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this._timeout = setTimeout(this._timedDragLeave, 100);\r\n };\r\n\r\n /** Delays firing of dragleave on child dragenter */\r\n _timedDragLeave = () =>\r\n this._isMounted && this.setState({ isDragover: false });\r\n\r\n render = () => {\r\n const {\r\n style,\r\n id,\r\n component: DropHandler = \"div\",\r\n dragOverText,\r\n children = null,\r\n relativePath,\r\n ...props\r\n } = this.props;\r\n let {\r\n className = \"\",\r\n allowDrop,\r\n onDrop,\r\n addFilesToUppy,\r\n ...componentProps\r\n } = props;\r\n className = getClassNames(\r\n className,\r\n this.state.isDragover ? \"drag\" : \"\"\r\n );\r\n return (\r\n \r\n {this.state.isDragover && (\r\n {this.props.dragOverText}\r\n )}\r\n {children}\r\n \r\n );\r\n };\r\n}\r\n","// @flow\r\nimport React, { PureComponent, type ElementRef } from \"react\";\r\nimport styles from \"components/NativeSelect/NativeSelect.module.css\";\r\nimport { components } from \"react-select\";\r\nconst { DownChevron } = components;\r\n\r\ntype Props = {\r\n /** control id */\r\n id?: string,\r\n /** current selected value */\r\n value?: ?Object | ?Array,\r\n /** defaultValue for initial rendering */\r\n defaultValue?: Object | ?Array,\r\n /** placeholder text to show when nothing is rendered */\r\n placeholder?: string,\r\n /** callback when user selects a value\r\n * @param {Object} option new option selected\r\n */\r\n onChange?: (option: Object) => void,\r\n /** React.createRef reference */\r\n selectRef?: ElementRef<*>,\r\n /** CSS Classname to apply to wrapper */\r\n wrapperClassName?: string,\r\n /** CSS Classname to apply */\r\n className?: string,\r\n /** @see options property name used to show to the user */\r\n labelKey?: string,\r\n /** @see options property name used to store value reference */\r\n valueKey?: string,\r\n /** list of options to display */\r\n options?: Array,\r\n /** whether the SELECT tag should be disabled */\r\n disabled?: boolean,\r\n /** whether to allow multiple selection */\r\n isMultiple?: boolean,\r\n};\r\n\r\ntype State = {\r\n selected: ?Object | ?Array,\r\n};\r\n\r\n// based on: https://github.com/JaniAnttonen/react-select-native/blob/master/src/index.js\r\nexport default class NativeSelect extends PureComponent {\r\n static defaultProps = {\r\n labelKey: \"label\",\r\n valueKey: \"value\",\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n selected: props.value || props.defaultValue,\r\n };\r\n }\r\n\r\n _onChange = (e: SyntheticInputEvent<*>) => {\r\n e.preventDefault();\r\n let selected = null;\r\n if (this.props.isMultiple) {\r\n selected = [...e.currentTarget.options]\r\n .filter((so) => so.selected && so.value.length > 0)\r\n .map(\r\n (so) =>\r\n this.props.options &&\r\n this.props.options.find(\r\n (o) => o[this.props.valueKey] === so.value\r\n )\r\n );\r\n } else {\r\n const value = e.currentTarget.value;\r\n selected =\r\n this.props.options &&\r\n this.props.options.find(\r\n (o) => String(o[this.props.valueKey]) === value\r\n );\r\n }\r\n /* istanbul ignore else */\r\n if (selected != null) {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onChange === \"function\")\r\n this.props.onChange(selected);\r\n this.setState({\r\n selected,\r\n });\r\n }\r\n };\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n /* istanbul ignore else */\r\n if (prevProps.value !== this.props.value) {\r\n this.setState({\r\n selected: this.props.value,\r\n });\r\n }\r\n }\r\n\r\n _getValue = () => {\r\n if (this.state.selected == null) return undefined;\r\n if (this.props.isMultiple) {\r\n return this.state.selected.map((o) => o[this.props.valueKey]);\r\n } else {\r\n return this.state.selected[this.props.valueKey];\r\n }\r\n };\r\n\r\n render = () => (\r\n \r\n \r\n {this.props.placeholder && (\r\n \r\n )}\r\n {this.props.options &&\r\n this.props.options.map((option, index) => (\r\n \r\n {option[this.props.labelKey]}\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n}\r\n","// @flow\r\nimport React, { useContext } from \"react\";\r\nimport { MultiSelectionContext } from \"data/context\";\r\nimport PropTypes from \"prop-types\";\r\nimport Icons from \"@hs/icons\";\r\nimport Breadcrumb from \"components/Breadcrumb\";\r\nimport Attributes from \"components/Attributes\";\r\nimport { type SearchResultRowDTO } from \"data/types\";\r\nimport { removeSpaces } from \"data/integrationTestUtils\";\r\nimport withStickyToggle from \"containers/StickyToggle\";\r\nimport StickyToggleStyle from \"containers/StickyToggle/style\";\r\nimport { isHandheld } from \"data/bowser\";\r\nimport styles from \"./RowResult.module.css\";\r\n\r\ntype Props = {\r\n /** row number */\r\n index: number,\r\n /* CSS classname to apply */\r\n className: string,\r\n /* CSS styles to apply */\r\n style?: StyleSheet | Object,\r\n /* search result row object */\r\n row: SearchResultRowDTO,\r\n /** callback when user clicks whole row */\r\n onClick: () => void,\r\n /** whether breadcrumb should be readonly */\r\n isBreadcrumbReadonly: boolean,\r\n /** whether more button is rendered */\r\n actionsDisabled: boolean,\r\n /** StickyToggleHOC div ref */\r\n divRef: { current: null | React.ElementRef },\r\n /** ContextMenuHandler onTouchStart callback */\r\n onTouchStart: () => void,\r\n /** ContextMenuHandler onTouchMove callback */\r\n onTouchMove: () => void,\r\n /** ContextMenuHandler onTouchEnd callback */\r\n onTouchEnd: () => void,\r\n /** ContextMenuHandler onMouseDown callback */\r\n onMouseDown: () => void,\r\n /** ContextMenuHandler onMouseUp callback */\r\n onMouseUp: () => void,\r\n /** ContextMenuHandler onContextMenu callback */\r\n onContextMenu: () => void,\r\n};\r\n\r\n/**\r\n * will render one folder search result\r\n */\r\nexport const FolderResult = ({\r\n index,\r\n className,\r\n style,\r\n row,\r\n onClick,\r\n isBreadcrumbReadonly,\r\n actionsDisabled,\r\n isHovered,\r\n divRef,\r\n onMouseEnter,\r\n onMouseLeave,\r\n onTouchStart,\r\n onTouchMove,\r\n onTouchEnd,\r\n onMouseDown,\r\n onMouseUp,\r\n onContextMenu,\r\n}: Props) => {\r\n /* istanbul ignore next */\r\n const { multiple, renderCheckbox } = useContext(MultiSelectionContext) || {\r\n multiple: false,\r\n renderCheckbox: () => null,\r\n };\r\n\r\n return (\r\n \r\n {(multiple || (isHovered && !isHandheld())) &&\r\n renderCheckbox(index, styles.checkbox)}\r\n
\r\n {row.elementType && (\r\n \r\n )}\r\n {row.title}\r\n \r\n
\r\n \r\n \r\n );\r\n};\r\nFolderResult.displayName = \"FolderResult\";\r\nFolderResult.propTypes = {\r\n index: PropTypes.number.isRequired,\r\n className: PropTypes.string,\r\n style: PropTypes.object,\r\n row: PropTypes.object.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n isBreadcrumbReadonly: PropTypes.bool,\r\n};\r\n\r\nconst FolderResultWithStickyToggle = withStickyToggle({\r\n renderDiv: false,\r\n usePortal: false,\r\n getStyle: StickyToggleStyle.List,\r\n})(FolderResult);\r\n\r\nexport default FolderResultWithStickyToggle;\r\n","// @flow\r\nimport React, { useContext } from \"react\";\r\nimport { MultiSelectionContext } from \"data/context\";\r\nimport PropTypes from \"prop-types\";\r\nimport Icons from \"@hs/icons\";\r\nimport Breadcrumb from \"components/Breadcrumb\";\r\nimport Attributes from \"components/Attributes\";\r\nimport { type SearchResultRowDTO } from \"data/types\";\r\nimport { removeSpaces } from \"data/integrationTestUtils\";\r\nimport withStickyToggle from \"containers/StickyToggle\";\r\nimport StickyToggleStyle from \"containers/StickyToggle/style\";\r\nimport { isHandheld } from \"data/bowser\";\r\nimport styles from \"./RowResult.module.css\";\r\n\r\ntype Props = {\r\n /** row number */\r\n index: number,\r\n /* CSS classname to apply */\r\n className: string,\r\n /* CSS styles to apply */\r\n style?: StyleSheet | Object,\r\n /* search result row object */\r\n row: SearchResultRowDTO,\r\n /** callback when user clicks whole row */\r\n onClick: () => void,\r\n /** whether breadcrumb should be readonly */\r\n isBreadcrumbReadonly: boolean,\r\n /** whether more button is rendered */\r\n actionsDisabled: boolean,\r\n /** StickyToggleHOC div ref */\r\n divRef: { current: null | React.ElementRef },\r\n /** ContextMenuHandler onTouchStart callback */\r\n onTouchStart: () => void,\r\n /** ContextMenuHandler onTouchMove callback */\r\n onTouchMove: () => void,\r\n /** ContextMenuHandler onTouchEnd callback */\r\n onTouchEnd: () => void,\r\n /** ContextMenuHandler onMouseDown callback */\r\n onMouseDown: () => void,\r\n /** ContextMenuHandler onMouseUp callback */\r\n onMouseUp: () => void,\r\n /** ContextMenuHandler onContextMenu callback */\r\n onContextMenu: () => void,\r\n};\r\n\r\n/**\r\n * will render one document search result\r\n */\r\nexport const DocumentResult = ({\r\n index,\r\n className,\r\n style,\r\n row,\r\n onClick,\r\n isBreadcrumbReadonly,\r\n actionsDisabled,\r\n isHovered,\r\n divRef,\r\n onMouseEnter,\r\n onMouseLeave,\r\n onTouchStart,\r\n onTouchMove,\r\n onTouchEnd,\r\n onMouseDown,\r\n onMouseUp,\r\n onContextMenu,\r\n}: Props) => {\r\n /* istanbul ignore next */\r\n const { multiple, renderCheckbox } = useContext(MultiSelectionContext) || {\r\n multiple: false,\r\n renderCheckbox: () => null,\r\n };\r\n return (\r\n \r\n {(multiple || (isHovered && !isHandheld())) &&\r\n renderCheckbox(index, styles.checkbox)}\r\n
\r\n \r\n {row.title}\r\n \r\n
\r\n
{row.summary}
\r\n \r\n \r\n );\r\n};\r\nDocumentResult.displayName = \"DocumentResult\";\r\nDocumentResult.propTypes = {\r\n index: PropTypes.number.isRequired,\r\n className: PropTypes.string,\r\n style: PropTypes.object,\r\n row: PropTypes.object.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n isBreadcrumbReadonly: PropTypes.bool,\r\n};\r\n\r\nconst DocumentResultWithStickyToggle = withStickyToggle({\r\n renderDiv: false,\r\n usePortal: false,\r\n getStyle: StickyToggleStyle.List,\r\n})(DocumentResult);\r\n\r\nexport default DocumentResultWithStickyToggle;\r\n","// @flow\r\nimport React, { useMemo, useCallback, useContext } from \"react\";\r\nimport { MultiSelectionContext } from \"data/context\";\r\nimport { useEffectOnce } from \"hooks\";\r\nimport FolderResult from \"./FolderResult\";\r\nimport DocumentResult from \"./DocumentResult\";\r\nimport Mark from \"@hs/mark\";\r\nimport { type SearchResultRowDTO } from \"data/types\";\r\nimport { hasSomeParentTheClass, getClassNames } from \"data/utils\";\r\nimport { isHandheld } from \"data/bowser\";\r\nimport styles from \"./RowResult.module.css\";\r\n\r\ntype Props = {\r\n /** row index number */\r\n index: number,\r\n /** optional CSS style to apply */\r\n style?: Object,\r\n /** search item row to render */\r\n row: SearchResultRowDTO,\r\n /** callback when search row has been rendered (CellMeasurer) */\r\n onLoad: () => void,\r\n /** words to highlight */\r\n terms: Array,\r\n /** whether current should be marked as active */\r\n isActive: boolean,\r\n /** callback when user clicks on a row\r\n * @param {number} index the row index clicked\r\n * @param {SearchResultRowDTO} row the row object itself\r\n * @param {boolean} ctrlKey whether control-key was pressed\r\n */\r\n onClick: (index: number, row: SearchResultRowDTO, ctrlKey: boolean) => void,\r\n /** callback when user clicks on a row More... button\r\n * @param {number} index the row index clicked\r\n * @param {SearchResultRowDTO} row the row object itself\r\n */\r\n onMoreClick: (index: number, row: SearchResultRowDTO) => void,\r\n /** callback when user hovers row\r\n * @param {number} index the row hovered\r\n */\r\n onMouseEnter: (index: number, row: SearchResultRowDTO) => void,\r\n /** whether breadcrumb should allow navigation */\r\n isBreadcrumbReadonly?: boolean,\r\n};\r\n\r\nconst RowResult = ({\r\n index,\r\n style,\r\n row,\r\n onLoad,\r\n terms,\r\n isBreadcrumbReadonly,\r\n isActive,\r\n isHovered,\r\n onClick,\r\n onContextMenu,\r\n onTouchStart,\r\n onTouchMove,\r\n onTouchEnd,\r\n onMoreClick,\r\n onMouseDown,\r\n onMouseEnter,\r\n onMouseLeave,\r\n onMouseUp,\r\n}: Props) => {\r\n useEffectOnce(() => {\r\n onLoad();\r\n }, []);\r\n\r\n /* istanbul ignore next */\r\n const { multiple, isSelected } = useContext(MultiSelectionContext) || {\r\n multiple: false,\r\n isSelected: (index: number) => false,\r\n };\r\n\r\n const handleClick = useCallback(\r\n (e: SyntheticMouseEvent<*>) => {\r\n e.preventDefault();\r\n // not clicking on a breadcrumb?\r\n /* istanbul ignore else */\r\n if (!hasSomeParentTheClass(e.target, styles.bc)) {\r\n /* istanbul ignore else */\r\n if (typeof onClick === \"function\") onClick(e, index, row);\r\n }\r\n },\r\n [onClick, row, index]\r\n );\r\n\r\n const combinedClassNames = getClassNames(\r\n styles.row,\r\n isHovered ? styles.hovered : null,\r\n multiple\r\n ? isSelected(index)\r\n ? styles.active\r\n : null\r\n : isActive\r\n ? styles.active\r\n : null,\r\n isHandheld() ? (multiple ? styles.multi : null) : styles.multi\r\n );\r\n\r\n const Component = useMemo(\r\n () => (row.isDoc === true ? DocumentResult : FolderResult),\r\n [row]\r\n );\r\n\r\n return (\r\n \r\n term.replace(\"*\", \"\")\r\n )}\r\n exclude={[\".a-name\"]}\r\n // Mark search term but ignore attribute captions!\r\n style={style}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default RowResult;\r\n","// @flow\r\nimport React, { PureComponent, type Node } from \"react\";\r\nimport InfiniteLoader from \"react-virtualized/dist/commonjs/InfiniteLoader\";\r\nimport List from \"react-virtualized/dist/commonjs/List\";\r\nimport CellMeasurer from \"react-virtualized/dist/commonjs/CellMeasurer\";\r\nimport CellMeasurerCache from \"react-virtualized/dist/commonjs/CellMeasurer/CellMeasurerCache\";\r\nimport Measure from \"react-measure\";\r\nimport ReactResizeDetector from \"react-resize-detector\";\r\nimport immutable from \"object-path-immutable\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport RowResult from \"./RowResult\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport { type SearchResultDTO, type SearchResultRowDTO } from \"data/types\";\r\nimport NoData from \"components/NoData\";\r\nimport ContextMenuHandler from \"components/ContextMenu/Handler\";\r\nimport styles from \"./SearchResult.module.css\";\r\n\r\n// #39038 ES limits paged results to 10000 rows\r\nconst FT_ROWSLIMIT = 10000;\r\n\r\ntype Props = {\r\n /** words to highlight in results */\r\n terms: Array,\r\n /** search results */\r\n result: SearchResultDTO,\r\n /** callback to load next page\r\n * @param {number} pageNum which page number to load\r\n */\r\n loadMoreRows: (pageNum: number) => Promise,\r\n /** callback when user clicks on a row\r\n * @param {number} index the row index clicked\r\n * @param {SearchResultRowDTO} row the row object itself\r\n * @param {boolean} newWindow whether requesting new window (ctrlKey or altKey)\r\n */\r\n onClick: (\r\n index: number,\r\n row: SearchResultRowDTO,\r\n newWindow: boolean\r\n ) => void,\r\n /** callback when user clicks on a row More... button\r\n * @param {number} index the row index clicked\r\n * @param {SearchResultRowDTO} row the row object itself\r\n */\r\n onMoreClick: (index: number, row: SearchResultRowDTO) => void,\r\n /** search result row currently active (-1 for none) */\r\n activeRowIndex: number,\r\n /** whether breadcrumbs should allow navigation */\r\n isBreadcrumbReadonly?: boolean,\r\n /** to which row to scroll to */\r\n scrollToRow?: ?number,\r\n /** Callback after rows have been loaded */\r\n handleMoreRowsLoaded: (\r\n rows: Array,\r\n totalCount: number,\r\n updateTotalCount: boolean\r\n ) => void,\r\n};\r\n\r\ntype State = {\r\n rows: any,\r\n pageSize: number,\r\n maxTotal: number,\r\n pagesStatus: Array,\r\n scrollToRow: number,\r\n hoveredRowIndex: number,\r\n};\r\n\r\n/**\r\n * renders flat list of search results\r\n */\r\nexport default class SearchResult extends PureComponent {\r\n _cache: Object;\r\n _list: List;\r\n _isMounted: boolean;\r\n\r\n constructor(props: Props, children?: Node) {\r\n super(props);\r\n this._isMounted = false;\r\n this._cache = new CellMeasurerCache({\r\n fixedWidth: true,\r\n minHeight: 40,\r\n });\r\n\r\n this.state = {\r\n //first page results loaded by SearchResultContainer\r\n rows: props.result.rows,\r\n pageSize: props.result.pageSize,\r\n maxTotal: FT_ROWSLIMIT - props.result.pageSize,\r\n //first page already pre-loaded otherwise we wouldn't be here\r\n pagesStatus: [Constants.OK],\r\n scrollToRow: props.scrollToRow || -1,\r\n hoveredRowIndex: -1,\r\n };\r\n }\r\n componentDidMount = () => (this._isMounted = true);\r\n componentWillUnmount = () => (this._isMounted = false);\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (prevProps.result !== this.props.result) {\r\n /* istanbul ignore next */\r\n this._cache.clearAll();\r\n this.setState(\r\n {\r\n rows: this.props.result.rows,\r\n pagesStatus: [Constants.OK],\r\n scrollToRow: -1,\r\n },\r\n () => this._list.scrollToPosition(0)\r\n );\r\n }\r\n /* istanbul ignore else */\r\n if (prevProps.scrollToRow !== this.props.scrollToRow) {\r\n this.setState({\r\n scrollToRow: this.props.scrollToRow,\r\n });\r\n }\r\n }\r\n\r\n /* istanbul ignore next */ _onResize = (width: number, height: number) =>\r\n /* istanbul ignore next */\r\n this._cache.clearAll();\r\n\r\n _isRowLoaded = ({ index }: { index: number }) =>\r\n Object.prototype.hasOwnProperty.call(this.state.rows, index);\r\n\r\n _loadMoreRows = ({\r\n startIndex,\r\n stopIndex,\r\n }: {\r\n startIndex: number,\r\n stopIndex: number,\r\n }) => {\r\n const { rows, pageSize, pagesStatus } = this.state;\r\n //console.log(\"loadMoreRows\", startIndex, stopIndex);\r\n\r\n // result already has data?\r\n /* istanbul ignore next */\r\n if (\r\n Object.prototype.hasOwnProperty.call(rows, startIndex) &&\r\n Object.prototype.hasOwnProperty.call(rows, stopIndex)\r\n ) {\r\n return;\r\n }\r\n\r\n // calc pagenumber\r\n let pageNum = 0;\r\n /* istanbul ignore else */\r\n if (startIndex > 0) {\r\n // specific row index requested? calc page number\r\n pageNum = Math.floor(startIndex / pageSize);\r\n }\r\n // check that stopIndex is indeed included\r\n /* istanbul ignore next */\r\n if ((pageNum + 1) * pageSize < stopIndex) {\r\n pageNum++;\r\n }\r\n // page already loaded/requested?\r\n /* istanbul ignore next */\r\n if (\r\n pagesStatus[pageNum] === Constants.OK ||\r\n pagesStatus[pageNum] === Constants.LOADING\r\n )\r\n return;\r\n\r\n // fetch\r\n this.setState({\r\n pagesStatus: immutable.set(\r\n this.state.pagesStatus,\r\n pageNum,\r\n Constants.LOADING\r\n ),\r\n });\r\n\r\n return this.props.loadMoreRows(pageNum).then(\r\n (result) =>\r\n this._isMounted &&\r\n this.setState((state) => {\r\n const nextRows = immutable.assign(\r\n state,\r\n \"rows\",\r\n result.rows\r\n ).rows;\r\n this.props.handleMoreRowsLoaded(\r\n nextRows,\r\n result.totalCount\r\n );\r\n return {\r\n rows: nextRows,\r\n pagesStatus: immutable.set(\r\n state.pagesStatus,\r\n pageNum,\r\n Constants.OK\r\n ),\r\n };\r\n })\r\n );\r\n };\r\n\r\n _rowRenderer = ({\r\n index,\r\n isScrolling,\r\n key,\r\n parent,\r\n style,\r\n }: {\r\n index: number,\r\n isScrolling: boolean,\r\n key: number,\r\n parent: Object,\r\n style: StyleSheet,\r\n }) => {\r\n const { rows } = this.state;\r\n const onMouseEnter = (e) => this.setState({ hoveredRowIndex: index });\r\n const onMoreClick = (e) =>\r\n typeof this.props.onMoreClick === \"function\" &&\r\n this.props.onMoreClick(e, index, rows[index]);\r\n\r\n // result already has data?\r\n if (this._isRowLoaded({ index })) {\r\n return (\r\n \r\n {({ measure }) => (\r\n \r\n )}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {({ measure }) => (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n };\r\n\r\n render() {\r\n const { result } = this.props;\r\n const { rows, maxTotal } = this.state;\r\n return (\r\n \r\n {(dimensions) => (\r\n // $FlowFixMe\r\n \r\n \r\n {({ onRowsRendered, registerChild }) => (\r\n {\r\n this._list = ref;\r\n registerChild(ref);\r\n }}\r\n deferredMeasurementCache={this._cache}\r\n className={styles.list}\r\n height={dimensions.height}\r\n onRowsRendered={onRowsRendered}\r\n overscanRowCount={0}\r\n rowCount={Math.min(\r\n result.totalCount,\r\n maxTotal\r\n )}\r\n rowHeight={this._cache.rowHeight}\r\n rowRenderer={this._rowRenderer}\r\n noRowsRenderer={() => (\r\n \r\n )}\r\n rows={rows}\r\n width={dimensions.width}\r\n scrollToIndex={this.state.scrollToRow}\r\n scrollToAlignment=\"center\"\r\n />\r\n )}\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport MapViewer from \"components/MapViewer\";\r\nimport {\r\n type MapLocationInfo,\r\n type SearchResultDTO,\r\n type MapProviderConfig,\r\n type RasterLocation,\r\n} from \"data/types\";\r\nimport {\r\n ParseLocation,\r\n ParseArea,\r\n ParseRaster,\r\n} from \"components/MapViewer/utils\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport NoData from \"components/NoData\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** fetch status */\r\n status: ConstantsEnum,\r\n /** search results */\r\n result: ?SearchResultDTO,\r\n /** callback when we know number of geo locations */\r\n onCountOfGeoResults: (count: number) => void,\r\n /** callback to load next page\r\n * @param {number} pageNum which page number to load\r\n */\r\n loadMoreRows: (pageNum: number) => Promise,\r\n /** custom mapProvider to use */\r\n mapProvider?: MapProviderConfig,\r\n /** callback when user clicks an empty space on the map (only when useMarker=false & mapProvider.onClick exists) */\r\n onClick?: (location: RasterLocation) => void,\r\n};\r\n\r\ntype State = {\r\n locations: ?Array,\r\n pageNum: number,\r\n totalLoaded: number,\r\n isLoadingNextPage: boolean,\r\n hasMorePages: boolean,\r\n};\r\n\r\nexport class SearchResultMap extends PureComponent {\r\n state = {\r\n locations: null,\r\n pageNum: 0,\r\n totalLoaded: 0,\r\n isLoadingNextPage: false,\r\n hasMorePages: false,\r\n };\r\n\r\n componentDidMount() {\r\n const { status, result } = this.props;\r\n if (status !== Constants.OK) return;\r\n else this._firstPage(result);\r\n }\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n /* istanbul ignore else */\r\n if (\r\n this.props.status !== prevProps.status &&\r\n this.props.status === Constants.OK\r\n ) {\r\n this._firstPage(this.props.result);\r\n }\r\n /* istanbul ignore else */\r\n if (\r\n this.state.locations !== prevState.locations &&\r\n typeof this.props.onCountOfGeoResults === \"function\"\r\n ) {\r\n this.props.onCountOfGeoResults(this.state.locations.length);\r\n }\r\n }\r\n\r\n _firstPage = (result: SearchResultDTO) => {\r\n const locations = this._getLocationsFromResult(result);\r\n this.setState({\r\n locations,\r\n hasMorePages: result.totalCount > result.pageSize,\r\n });\r\n };\r\n\r\n _getLocationsFromResult = (result: SearchResultDTO) => {\r\n let locations: Array = [];\r\n let totalLoaded = this.state.totalLoaded;\r\n const onlyRaster =\r\n this.props.mapProvider && this.props.mapProvider.isRaster === true;\r\n Object.keys(result.rows).forEach((rowKey) => {\r\n totalLoaded++;\r\n const row = result.rows[rowKey];\r\n this._getLocations(row).forEach((attr) => {\r\n let location: MapLocationInfo = {\r\n latitude: null,\r\n longitude: null,\r\n label: row.title,\r\n attribute: attr.caption,\r\n row,\r\n itemUri: row.itemUri,\r\n thumbnail: null,\r\n icon: (attr.value && attr.value.marker) || null,\r\n };\r\n switch (attr.format) {\r\n case \"Text_GeoPoint\":\r\n if (onlyRaster) location = null;\r\n else {\r\n const point = ParseLocation(\r\n attr.value.value || attr.value\r\n );\r\n location.latitude = point.latitude;\r\n location.longitude = point.longitude;\r\n }\r\n break;\r\n case \"Text_GeoArea\":\r\n if (onlyRaster) location = null;\r\n else\r\n location.area = ParseArea(\r\n attr.value.value || attr.value\r\n );\r\n break;\r\n case \"Text_GeoRaster\":\r\n if (onlyRaster)\r\n location = Object.assign(\r\n {},\r\n location,\r\n ParseRaster(attr.value.value || attr.value)\r\n );\r\n else location = null;\r\n break;\r\n default:\r\n location = null;\r\n console.warn(\r\n \"Unsupported row attribute format \" + attr.format\r\n );\r\n }\r\n if (location != null) locations.push(location);\r\n });\r\n });\r\n this.setState({ totalLoaded });\r\n return locations;\r\n };\r\n\r\n /** find all attributes with type Text_GeoPoint or Text_GeoArea */\r\n _getLocations = (row: Object) =>\r\n row.attributes.filter(\r\n (a) => a.format && a.format.startsWith(\"Text_Geo\")\r\n );\r\n\r\n // TODO should really be loaded by Redux dispatch\r\n _loadNextPage = () => {\r\n this.setState({ isLoadingNextPage: true });\r\n this.props.loadMoreRows(this.state.pageNum + 1).then((result) => {\r\n const nextLocations = this._getLocationsFromResult(result);\r\n this.setState({\r\n locations: this.state.locations.concat(nextLocations),\r\n pageNum: this.state.pageNum + 1,\r\n hasMorePages:\r\n this.state.totalLoaded < this.props.result.totalCount,\r\n isLoadingNextPage: false,\r\n });\r\n });\r\n };\r\n\r\n render() {\r\n const { status } = this.props;\r\n if (status !== Constants.OK) return ;\r\n\r\n // #51511 Raster Map should always show even if no geo results were found\r\n const isRaster =\r\n this.props.mapProvider &&\r\n this.props.mapProvider.isRaster != null &&\r\n this.props.mapProvider.isRaster !== false;\r\n if (\r\n this.state.locations == null ||\r\n (this.state.locations.length === 0 && !isRaster)\r\n ) {\r\n return ;\r\n }\r\n\r\n return (\r\n <>\r\n {this.state.hasMorePages && (\r\n \r\n {loc.t(\"location.loadNextPage\") + \" \"}\r\n {this.state.isLoadingNextPage && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// TODO move to a container\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n status: s.searchStatusSelector(state),\r\n result:\r\n s.searchStatusSelector(state) === Constants.OK\r\n ? s.searchResultSelector(state)\r\n : undefined,\r\n ...ownProps,\r\n});\r\n\r\nexport default connect(mapStateToProps)(SearchResultMap);\r\n","import React from \"react\";\r\nimport ToggleButtonGroup from \"react-bootstrap/lib/ToggleButtonGroup\";\r\nimport ToggleButton from \"react-bootstrap/lib/ToggleButton\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport ButtonToolbar from \"react-bootstrap/lib/ButtonToolbar\";\r\nimport AbsoluteDropdown from \"components/AbsoluteDropdown\";\r\nimport Dropdown from \"react-bootstrap/lib/Dropdown\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport styles from \"./Toolbar.module.css\";\r\nimport loc from \"i18next\";\r\n\r\nconst Views = {\r\n month: \"dayGridMonth\",\r\n week: \"timeGridWeek\",\r\n day: \"timeGridDay\",\r\n agenda: \"listWeek\",\r\n};\r\n\r\ntype Props = {\r\n /** current calendar range title */\r\n title: string,\r\n /** ReactRef to FullCalendar instance */\r\n calendarRef: React.Ref,\r\n /** current FullCalendar view name */\r\n currentView: string,\r\n /** info on all projections */\r\n projections: Object,\r\n /** current selected projection\r\n * @default {string} \"\" to show ALL\r\n */\r\n currentProjection: string,\r\n /** callback when user selects a projection\r\n * @param {string} newProjection projection name from projections\r\n */\r\n onProjectionChange: (newProjection: string) => void,\r\n /** button rendering for loading next result set */\r\n nextPageButton: React.ReactElement,\r\n /** Browser info */\r\n browser: Object,\r\n};\r\n\r\nconst Toolbar = ({\r\n title,\r\n browser,\r\n calendarRef,\r\n currentView,\r\n projections,\r\n currentProjection,\r\n onProjectionChange,\r\n nextPageButton,\r\n}: Props) => (\r\n
\r\n \r\n \r\n {nextPageButton}\r\n\r\n \r\n \r\n {loc.t(\"common:search.calendar.projections\")}\r\n \r\n \r\n {currentProjection !== \"\" && (\r\n \r\n onProjectionChange(\"\")\r\n }\r\n >\r\n {loc.t(\"common:filter.AllCaption\")}\r\n \r\n )}\r\n {Object.keys(projections).map((name) => (\r\n \r\n onProjectionChange(name)\r\n }\r\n active={currentProjection === name}\r\n >\r\n \r\n \r\n \r\n {name}\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n\r\n \r\n calendarRef.getApi().prev()}\r\n title={loc.t(\"common:search.calendar.prev\")}\r\n >\r\n \r\n \r\n calendarRef.getApi().today()}\r\n title={loc.t(\"common:search.calendar.today\")}\r\n >\r\n {title}\r\n \r\n calendarRef.getApi().next()}\r\n title={loc.t(\"common:search.calendar.next\")}\r\n >\r\n \r\n \r\n \r\n\r\n \r\n calendarRef.getApi().changeView(name)\r\n }\r\n >\r\n {Object.keys(Views).map((name) => (\r\n \r\n {loc\r\n .t(`common:search.calendar.${name}`)\r\n .substr(0, browser.lessThan.medium ? 1 : undefined)}\r\n \r\n ))}\r\n \r\n \r\n
\r\n);\r\nToolbar.displayName = \"Calendar.Toolbar\";\r\nexport default Toolbar;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { compose } from \"redux\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { type SearchResultDTO, type SearchResultRowDTO } from \"data/types\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport NoData from \"components/NoData\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport loc from \"i18next\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\nimport Toolbar from \"./Toolbar\";\r\nimport SettingValue, { type SettingValueProps } from \"containers/SettingValue\";\r\nimport Measure from \"react-measure\";\r\n\r\nimport moment from \"moment\";\r\nimport Moment from \"containers/Moment\";\r\nimport FullCalendar from \"@fullcalendar/react\";\r\nimport \"@fullcalendar/core/main.css\";\r\nimport \"./index.css\";\r\nimport dayGridPlugin from \"@fullcalendar/daygrid\";\r\nimport \"@fullcalendar/daygrid/main.css\";\r\nimport timeGridPlugin from \"@fullcalendar/timegrid\";\r\nimport \"@fullcalendar/timegrid/main.css\";\r\nimport listPlugin from \"@fullcalendar/list\";\r\nimport \"@fullcalendar/list/main.css\";\r\nimport bootstrapPlugin from \"@fullcalendar/bootstrap\";\r\nimport \"@fullcalendar/bootstrap/main.css\";\r\nimport allLocales from \"@fullcalendar/core/locales-all\";\r\n\r\nvar colorArray = [\r\n \"#FF6633\",\r\n \"#FFB399\",\r\n \"#FF33FF\",\r\n \"#FFFF99\",\r\n \"#00B3E6\",\r\n \"#E6B333\",\r\n \"#3366E6\",\r\n \"#999966\",\r\n \"#99FF99\",\r\n \"#B34D4D\",\r\n \"#80B300\",\r\n \"#809900\",\r\n \"#E6B3B3\",\r\n \"#6680B3\",\r\n \"#66991A\",\r\n \"#FF99E6\",\r\n \"#CCFF1A\",\r\n \"#FF1A66\",\r\n \"#E6331A\",\r\n \"#33FFCC\",\r\n \"#66994D\",\r\n \"#B366CC\",\r\n \"#4D8000\",\r\n \"#B33300\",\r\n \"#CC80CC\",\r\n \"#66664D\",\r\n \"#991AFF\",\r\n \"#E666FF\",\r\n \"#4DB3FF\",\r\n \"#1AB399\",\r\n \"#E666B3\",\r\n \"#33991A\",\r\n \"#CC9999\",\r\n \"#B3B31A\",\r\n \"#00E680\",\r\n \"#4D8066\",\r\n \"#809980\",\r\n \"#E6FF80\",\r\n \"#1AFF33\",\r\n \"#999933\",\r\n \"#FF3380\",\r\n \"#CCCC00\",\r\n \"#66E64D\",\r\n \"#4D80CC\",\r\n \"#9900B3\",\r\n \"#E64D66\",\r\n \"#4DB380\",\r\n \"#FF4D4D\",\r\n \"#99E6E6\",\r\n \"#6666FF\",\r\n];\r\n\r\n// https://fullcalendar.io/docs/event-object\r\ntype EventInfo = {\r\n title: string,\r\n start: Date,\r\n allDay?: boolean,\r\n backgroundColor?: string,\r\n borderColor?: string,\r\n textColor?: string,\r\n extendedProps: { bc: string, row: Object, projection: string },\r\n};\r\n\r\ntype Props = {\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** fetch status */\r\n status: ConstantsEnum,\r\n /** search results */\r\n result: ?SearchResultDTO,\r\n /** callback to load next page\r\n * @param {number} pageNum which page number to load\r\n */\r\n loadMoreRows: (pageNum: number) => Promise,\r\n /** callback when user clicks on a row\r\n * @param {number} index the row index clicked\r\n * @param {SearchResultRowDTO} row the row object itself\r\n */\r\n onMoreClick: (index: number, row: SearchResultRowDTO) => void,\r\n /** persisted calendar view */\r\n calendarView: SettingValueProps,\r\n /** Browser info */\r\n browser: Object,\r\n};\r\n\r\ntype State = {\r\n events: ?Array,\r\n projections: Object,\r\n pageNum: number,\r\n totalLoaded: number,\r\n isLoadingNextPage: boolean,\r\n hasMorePages: boolean,\r\n currentProjection: string,\r\n title: string,\r\n formatDate_Date: string,\r\n formatDate_Time: string,\r\n};\r\n\r\nexport class SearchResultCalendar extends PureComponent {\r\n _calendar: null | Calendar;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this._calendar = React.createRef();\r\n\r\n moment.locale(userLanguage());\r\n\r\n this.state = {\r\n events: null,\r\n projections: {},\r\n pageNum: 0,\r\n totalLoaded: 0,\r\n isLoadingNextPage: false,\r\n hasMorePages: false,\r\n currentProjection: \"\",\r\n title: \"loading\",\r\n formatDate_Date: moment.localeData().longDateFormat(\"L\"),\r\n formatDate_Time: `${moment\r\n .localeData()\r\n .longDateFormat(\"L\")} ${moment\r\n .localeData()\r\n .longDateFormat(\"LTS\")}`,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const { status, result } = this.props;\r\n if (status !== Constants.OK) return;\r\n else this._firstPage(result);\r\n }\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n /* istanbul ignore else */\r\n if (\r\n this.props.status !== prevProps.status &&\r\n this.props.status === Constants.OK\r\n ) {\r\n this._firstPage(this.props.result);\r\n }\r\n }\r\n\r\n _firstPage = (result: SearchResultDTO) =>\r\n this.setState({\r\n events: this._getEventsFromResult(result),\r\n hasMorePages: result.totalCount > result.pageSize,\r\n });\r\n\r\n _getEventsFromResult = (result: SearchResultDTO) => {\r\n let events: Array = [];\r\n let totalLoaded = this.state.totalLoaded;\r\n let projections = this.state.projections;\r\n Object.keys(result.rows).forEach((rowKey) => {\r\n totalLoaded++;\r\n const row = result.rows[rowKey];\r\n this._getEvents(row).forEach((attr) => {\r\n // collect legend and assign color\r\n if (projections[attr.name] == null) {\r\n projections[attr.name] = {\r\n color: colorArray[Object.keys(projections).length],\r\n total: 1,\r\n };\r\n } else {\r\n projections[attr.name].total++;\r\n }\r\n // render event\r\n events.push({\r\n id: rowKey,\r\n title: row.title,\r\n start: attr.date,\r\n allDay: attr.allDay,\r\n backgroundColor: projections[attr.name].color,\r\n extendedProps: {\r\n row,\r\n projection: attr.name,\r\n bc: row.breadcrumb.text,\r\n // icon: (attr.value && attr.value.marker) || null\r\n },\r\n });\r\n });\r\n });\r\n this.setState({ totalLoaded, projections });\r\n return events;\r\n };\r\n\r\n /** find all attributes with type Date_* */\r\n _getEvents = (row: Object) =>\r\n row.attributes\r\n .filter((a) => a.format && a.format.startsWith(\"Date_\"))\r\n .map((a) => {\r\n const mom = moment(a.value, this.state[`format${a.format}`]);\r\n if (!mom.isValid()) {\r\n console.warn(\r\n \"Could not parse Date \" +\r\n this.state[`format${a.format}`],\r\n a\r\n );\r\n return null;\r\n }\r\n return {\r\n date: mom.toDate(),\r\n name: a.caption,\r\n allDay: a.format === \"Date_Date\",\r\n };\r\n })\r\n .filter((a) => a);\r\n\r\n // TODO should really be loaded by Redux dispatch\r\n _loadNextPage = () => {\r\n this.setState({ isLoadingNextPage: true });\r\n this.props.loadMoreRows(this.state.pageNum + 1).then((result) => {\r\n const nextEvents = this._getEventsFromResult(result);\r\n this.setState({\r\n events: this.state.events.concat(nextEvents),\r\n pageNum: this.state.pageNum + 1,\r\n hasMorePages:\r\n this.state.totalLoaded < this.props.result.totalCount,\r\n isLoadingNextPage: false,\r\n });\r\n });\r\n };\r\n\r\n _onEventRender = ({ event, el, view }) => {\r\n el.title = event.extendedProps.bc;\r\n };\r\n\r\n _onEventClick = ({ event, el, jsEvent, view }) =>\r\n this.props.onMoreClick(jsEvent, event.id, event.extendedProps.row);\r\n\r\n _onViewChange = ({ view, el }) =>\r\n this.props.calendarView.setValue(view.type);\r\n\r\n _onProjectionChange = (currentProjection) =>\r\n this.setState({ currentProjection });\r\n\r\n _getProjectedEvents = () =>\r\n this.state.currentProjection === \"\"\r\n ? this.state.events\r\n : this.state.events.filter(\r\n (e) =>\r\n e.extendedProps.projection ===\r\n this.state.currentProjection\r\n );\r\n\r\n _onDatesRender = ({ view, el }) =>\r\n this.setState({\r\n title: view.title,\r\n });\r\n\r\n render() {\r\n const { status } = this.props;\r\n if (status !== Constants.OK) return ;\r\n\r\n // TODO allow adding new items directly on calendar\r\n if (this.state.events == null || this.state.events.length === 0) {\r\n return ;\r\n }\r\n\r\n return (\r\n <>\r\n {this._calendar.current && (\r\n \r\n {loc\r\n .t(\"location.loadNextPage\")\r\n .substr(\r\n 0,\r\n this.props.browser.lessThan.medium\r\n ? 1\r\n : undefined\r\n ) + \" \"}\r\n {this.state.isLoadingNextPage && (\r\n \r\n )}\r\n \r\n )\r\n }\r\n />\r\n )}\r\n \r\n {\r\n /* istanbul ignore next */ (dimensions) => (\r\n \r\n \r\n \r\n )\r\n }\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n browser: state.browser,\r\n status: s.searchStatusSelector(state),\r\n result:\r\n s.searchStatusSelector(state) === Constants.OK\r\n ? s.searchResultSelector(state)\r\n : undefined,\r\n ...ownProps,\r\n});\r\n\r\nexport default compose(\r\n connect(mapStateToProps),\r\n SettingValue({\r\n name: \"searchResultCalendarView\",\r\n namespace: \"calendarView\",\r\n defaultValue: \"dayGridMonth\",\r\n }),\r\n Moment\r\n)(SearchResultCalendar);\r\n","// @flow\r\nimport React, { useContext } from \"react\";\r\nimport { MultiSelectionContext } from \"data/context\";\r\nimport Icons from \"@hs/icons\";\r\nimport { BrowserDragLink } from \"components/ItemUriLink\";\r\nimport ValueFactory from \"components/Attributes/SummaryAttribute/ValueFactory\";\r\nimport Mark from \"@hs/mark\";\r\nimport {\r\n GridListConstant,\r\n SearchValueType,\r\n SummaryAttributeValueType,\r\n} from \"data/types\";\r\nimport withStickyToggle from \"containers/StickyToggle\";\r\nimport StickyToggleStyle from \"containers/StickyToggle/style\";\r\nimport { isHandheld } from \"data/bowser\";\r\nimport styles from \"./CellContent.module.css\";\r\n\r\nconst style = {\r\n marginLeft: \".5em\",\r\n verticalAlign: \"middle\",\r\n};\r\n\r\ntype Props = {\r\n col: DocColumnResultDTO,\r\n cell: any,\r\n filterText: any,\r\n onMoreClick: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n actionsDisabled: boolean,\r\n itemUri: string,\r\n};\r\n\r\nexport const CellContent = ({ index, cell, col, isHovered }: Props) => {\r\n /* istanbul ignore next */\r\n const { multiple, renderCheckbox } = useContext(MultiSelectionContext) || {\r\n multiple: false,\r\n renderCheckbox: () => null,\r\n };\r\n let content = cell && cell.value;\r\n if (col.name === GridListConstant.ExtensionIcon) {\r\n if (multiple && isHandheld()) {\r\n content = renderCheckbox(index, styles.checkbox);\r\n } else {\r\n content = (\r\n <>\r\n {(isHovered || multiple) &&\r\n !isHandheld() &&\r\n renderCheckbox(\r\n index,\r\n `${styles.checkbox} ${styles.desktop}`\r\n )}\r\n {cell.isDoc ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n }\r\n } else if (SearchValueType[col.type] === SearchValueType.Link) {\r\n return (\r\n \r\n );\r\n } else if (content == null) {\r\n return null;\r\n } else if (Object.prototype.hasOwnProperty.call(content, \"$type\")) {\r\n return ;\r\n }\r\n return (\r\n term.replace(\"*\", \"\"))}\r\n >\r\n {content}\r\n \r\n );\r\n};\r\n\r\nconst CellContentWithStickyToggle = withStickyToggle({\r\n getStyle: StickyToggleStyle.GridList,\r\n renderDiv: true,\r\n portalTargetSelector:\r\n \"#searchResult .ReactVirtualized__Grid__innerScrollContainer\",\r\n})(CellContent);\r\n\r\nexport default CellContentWithStickyToggle;\r\n","// @flow\r\nimport React, { useCallback, useState, useEffect } from \"react\";\r\nimport Constants from \"data/constants\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport GridList from \"@hs/grid-list\";\r\nimport \"@hs/grid-list/build/GridList.css\";\r\nimport noop from \"lodash/noop\";\r\nimport ContextMenuHandler from \"components/ContextMenu/Handler\";\r\nimport CellContent from \"./CellContent\";\r\nimport { isHandheld } from \"data/bowser\";\r\nimport {\r\n GridListConstant,\r\n SortDirectionOptions,\r\n SORT_BUCKET_NAME,\r\n} from \"data/types\";\r\n\r\nconst SearchResultGrid = ({\r\n result,\r\n rowCount,\r\n onClick,\r\n onMoreClick,\r\n onContextClick,\r\n onFilterBarSelect,\r\n activeRowIndex,\r\n scrollToRow,\r\n loadMoreRows,\r\n children,\r\n searchRequest,\r\n onSetActiveRowIndex,\r\n terms,\r\n isMoreHidden,\r\n handleMoreRowsLoaded,\r\n isRowActive,\r\n refresh,\r\n}) => {\r\n const { aggregations, cols, rows: rowsFromResult, totalCount } = result;\r\n const [rows, setRows] = useState(rowsFromResult);\r\n useEffect(() => {\r\n setRows(rowsFromResult);\r\n }, [rowsFromResult]);\r\n const [pagesStatus, setPagesStatus] = useState([Constants.OK]);\r\n const { pageSize } = result;\r\n /* istanbul ignore next */\r\n const count = totalCount === 0 ? Object.keys(rows).length : totalCount;\r\n const parseCellColumnTitle = useCallback((header, content) => {\r\n const value = content && content.value;\r\n return value ? value.value || value : value;\r\n }, []);\r\n const isRowLoaded = useCallback(\r\n ({ rowIndex }) => Object.prototype.hasOwnProperty.call(rows, rowIndex),\r\n [rows]\r\n );\r\n const isColumnFiltered = useCallback(\r\n (name) =>\r\n aggregations.find((f) => f.name === name && f.selected != null),\r\n [aggregations]\r\n );\r\n const isColumnSorted = useCallback(\r\n (name) => {\r\n const sort = aggregations.find((f) => f.name === SORT_BUCKET_NAME);\r\n return sort && sort.selected.includes(name);\r\n },\r\n [aggregations]\r\n );\r\n const getColumnSortDirection = useCallback(\r\n () =>\r\n (searchRequest.sorts &&\r\n searchRequest.sorts[0] &&\r\n searchRequest.sorts[0].direction) ||\r\n SortDirectionOptions.Ascending,\r\n [searchRequest.sorts]\r\n );\r\n const handleLoadMoreRows = useCallback(\r\n ({ rowIndex }) => {\r\n let pageNum = 0;\r\n /* istanbul ignore else */\r\n if (rowIndex > 0) {\r\n pageNum = Math.floor(rowIndex / pageSize);\r\n }\r\n\r\n // page already loaded/requested?\r\n /* istanbul ignore else */\r\n if (\r\n pagesStatus[pageNum] === Constants.OK ||\r\n pagesStatus[pageNum] === Constants.LOADING\r\n )\r\n return null;\r\n setPagesStatus((pagesStatus) => {\r\n pagesStatus[pageNum] = Constants.LOADING;\r\n return pagesStatus;\r\n });\r\n loadMoreRows(pageNum)\r\n .then((result) => {\r\n setPagesStatus((pagesStatus) => {\r\n pagesStatus[pageNum] = Constants.OK;\r\n return pagesStatus;\r\n });\r\n setRows((rows) => {\r\n const nextRows = { ...rows, ...result.rows };\r\n handleMoreRowsLoaded(nextRows, result.totalCount);\r\n return nextRows;\r\n });\r\n })\r\n .catch((e) => {\r\n setPagesStatus((pagesStatus) => {\r\n pagesStatus[pageNum] = Constants.ERROR;\r\n return pagesStatus;\r\n });\r\n });\r\n },\r\n [handleMoreRowsLoaded, pagesStatus, pageSize, loadMoreRows]\r\n );\r\n const handleCellClick = useCallback(\r\n (e, rowIndex: number, columnIndex: number, itemUri: string) => {\r\n onClick(e, rowIndex, rows[rowIndex]);\r\n },\r\n [onClick, rows]\r\n );\r\n const handleCellMoreClick = useCallback(\r\n (e, itemUri, rowIndex) => {\r\n const row = rows[rowIndex];\r\n onMoreClick(e, rowIndex, row);\r\n },\r\n [onMoreClick, rows]\r\n );\r\n const handleCellContextClick = useCallback(\r\n (e, rowIndex: number, columnIndex: number, itemUri: string) => {\r\n const row = rows[rowIndex];\r\n onContextClick(rowIndex, row);\r\n },\r\n [onContextClick, rows]\r\n );\r\n const handleHeaderFilterClick = useCallback(\r\n (e, name) => {\r\n e.stopPropagation();\r\n const filter = aggregations.find((f) => f.name === name);\r\n onFilterBarSelect(name, filter.valueType, \"__ALL__\");\r\n },\r\n [aggregations, onFilterBarSelect]\r\n );\r\n const handleHeaderClick = useCallback(\r\n (columnIndex: number, header: string) => {\r\n const col = cols[columnIndex];\r\n // const sort = aggregations.find((f) => f.name === SORT_BUCKET_NAME);\r\n // const bucket = sort.buckets.find((b) => b.value === col.name);\r\n // if (bucket == null) return;\r\n if (!col.canSort || col.type == null) return;\r\n onFilterBarSelect(SORT_BUCKET_NAME, col.type, col.name);\r\n },\r\n [/*aggregations,*/ onFilterBarSelect, cols]\r\n );\r\n const getColumnWidth = useCallback(\r\n ({ index, col }: { index: number, col: DocColumnResultDTO }) => {\r\n const width =\r\n index === 0 ? (isHandheld() ? 35 : 42) : col.width * 1.2 + 15;\r\n return width + (index === cols.length - 1 ? 20 : 0);\r\n },\r\n [cols.length]\r\n );\r\n const getCell = useCallback(\r\n ({ row, columnIndex }) => {\r\n const col = cols[columnIndex];\r\n const foundTerms = row.foundTerms || terms;\r\n switch (col.name) {\r\n case GridListConstant.ExtensionIcon:\r\n case GridListConstant.ItemUri:\r\n return { ...row, foundTerms };\r\n case \"Dateityp\":\r\n return { name: col.name, value: row.ext, foundTerms };\r\n default:\r\n const cell = row.attributes.find(\r\n (a) => a.name === col.name\r\n );\r\n // show title instead of name, if empty\r\n if (col.name === \"Name\" && cell == null) {\r\n return { name: col.name, value: row.title, foundTerms };\r\n }\r\n // if (cell == null) console.log(col, cell, row);\r\n return cell ? { ...cell, foundTerms } : null;\r\n }\r\n },\r\n [cols, terms]\r\n );\r\n return (\r\n \r\n );\r\n};\r\nSearchResultGrid.displayName = \"SearchResult.Grid\";\r\n\r\nexport default SearchResultGrid;\r\n","// @flow\r\nimport { type SearchBucketDTO, SearchValueType } from \"data/types\";\r\nimport loc from \"i18next\";\r\n\r\n// inPoint.Forms/Controls/Search/Search/SearchViewModel.cs\r\nconst GetDefaultSearchBuckets = (): Array => [\r\n {\r\n visible: true,\r\n icon: \"clock\",\r\n name: \"Geaendert_am\",\r\n caption: loc.t(\"common:filter.ModifyTimeCaption\"),\r\n valueType: SearchValueType.RelativeDate,\r\n selected: [],\r\n buckets: [\r\n {\r\n value: \"Today\",\r\n caption: loc.t(\"common:filter.RelativeDate.Today\"),\r\n },\r\n {\r\n value: \"Yesterday\",\r\n caption: loc.t(\"common:filter.RelativeDate.Yesterday\"),\r\n },\r\n {\r\n value: \"ThisWeek\",\r\n caption: loc.t(\"common:filter.RelativeDate.ThisWeek\"),\r\n },\r\n {\r\n value: \"ThisMonth\",\r\n caption: loc.t(\"common:filter.RelativeDate.ThisMonth\"),\r\n },\r\n {\r\n value: \"LastMonth\",\r\n caption: loc.t(\"common:filter.RelativeDate.LastMonth\"),\r\n },\r\n {\r\n value: \"ThisYear\",\r\n caption: loc.t(\"common:filter.RelativeDate.ThisYear\"),\r\n },\r\n {\r\n value: \"LastYear\",\r\n caption: loc.t(\"common:filter.RelativeDate.LastYear\"),\r\n },\r\n ],\r\n },\r\n {\r\n visible: true,\r\n icon: \"child\",\r\n name: \"Erstellt_am\",\r\n caption: loc.t(\"common:filter.CreationTimeCaption\"),\r\n valueType: SearchValueType.RelativeDate,\r\n selected: [],\r\n buckets: [\r\n {\r\n value: \"Today\",\r\n caption: loc.t(\"common:filter.RelativeDate.Today\"),\r\n },\r\n {\r\n value: \"Yesterday\",\r\n caption: loc.t(\"common:filter.RelativeDate.Yesterday\"),\r\n },\r\n {\r\n value: \"ThisWeek\",\r\n caption: loc.t(\"common:filter.RelativeDate.ThisWeek\"),\r\n },\r\n {\r\n value: \"ThisMonth\",\r\n caption: loc.t(\"common:filter.RelativeDate.ThisMonth\"),\r\n },\r\n {\r\n value: \"LastMonth\",\r\n caption: loc.t(\"common:filter.RelativeDate.LastMonth\"),\r\n },\r\n {\r\n value: \"ThisYear\",\r\n caption: loc.t(\"common:filter.RelativeDate.ThisYear\"),\r\n },\r\n {\r\n value: \"LastYear\",\r\n caption: loc.t(\"common:filter.RelativeDate.LastYear\"),\r\n },\r\n ],\r\n },\r\n {\r\n visible: true,\r\n icon: \"save\",\r\n name: \"Groesse\",\r\n caption: loc.t(\"common:filter.FileSizeCaption\"),\r\n valueType: SearchValueType.FileSize,\r\n hideName: true,\r\n selected: [],\r\n buckets: [\r\n { value: \"Empty\", caption: loc.t(\"common:filter.FileSize.Empty\") },\r\n { value: \"Tiny\", caption: loc.t(\"common:filter.FileSize.Tiny\") },\r\n { value: \"Small\", caption: loc.t(\"common:filter.FileSize.Small\") },\r\n {\r\n value: \"Medium\",\r\n caption: loc.t(\"common:filter.FileSize.Medium\"),\r\n },\r\n { value: \"Large\", caption: loc.t(\"common:filter.FileSize.Large\") },\r\n { value: \"Huge\", caption: loc.t(\"common:filter.FileSize.Huge\") },\r\n {\r\n value: \"VeryHuge\",\r\n caption: loc.t(\"common:filter.FileSize.VeryHuge\"),\r\n },\r\n ],\r\n },\r\n // {\r\n // icon: \"file\",\r\n // name: \"ItemType\",\r\n // caption: \"Typ\",\r\n // valueType: SearchValueType.ItemType,\r\n // hideName: true,\r\n // selected: [],\r\n // buckets: [\r\n // { value: \"Document\", caption: \"Dokumente\" },\r\n // { value: \"Folder\", caption: \"Ordner\" }\r\n // ]\r\n // },\r\n // {\r\n // visible: true,\r\n // icon: \"sort\",\r\n // name: SORT_BUCKET_NAME,\r\n // caption: loc.t(\"common:filter.SortCaption\"),\r\n // valueType: SearchValueType.NotSet,\r\n // selected: [\"\"],\r\n // buckets: [\r\n // {\r\n // value: \"\",\r\n // caption: loc.t(\"common:filter.RelevanceCaption\"),\r\n // },\r\n // { value: \"Name\", caption: loc.t(\"common:filter.NameCaption\") },\r\n // {\r\n // value: \"Erstellt_am\",\r\n // caption: loc.t(\"common:filter.CreationTimeCaption\"),\r\n // },\r\n // {\r\n // value: \"Geaendert_am\",\r\n // caption: loc.t(\"common:filter.ModifyTimeCaption\"),\r\n // },\r\n // // ,\r\n // // {\r\n // // value: \"__SORT:DESC_\",\r\n // // caption: loc.t(\"common:filter.SortDescending\")\r\n // // }\r\n // ],\r\n // },\r\n];\r\n\r\nexport default GetDefaultSearchBuckets;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport { withRouter } from \"react-router\";\r\nimport { History } from \"history\";\r\nimport { fetchSearchResult } from \"data/api\";\r\nimport {\r\n type SearchResultDTO,\r\n type SearchItemDTO,\r\n type SearchRequestDTO,\r\n type SearchBucketDTO,\r\n type SearchValueTypeEnum,\r\n type SearchFilterDTO,\r\n type SearchSortDTO,\r\n type SearchResultRowDTO,\r\n SortDirectionOptions,\r\n SearchValueType,\r\n ListViewMode,\r\n type ListViewModeEnum,\r\n type ApiErrorResult,\r\n type MapProviderConfig,\r\n type RasterLocation,\r\n type ArrowNavigationSetter,\r\n SORT_BUCKET_NAME,\r\n} from \"data/types\";\r\nimport { togglesUpdateCounterAction, getSearchAction } from \"data/actions\";\r\nimport { getRoute } from \"components/ItemUriLink\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport SettingValue, { type SettingValueProps } from \"containers/SettingValue\";\r\nimport SearchResult from \"components/SearchResult\";\r\nimport SearchResultMap from \"components/SearchResultMap\";\r\nimport SearchResultCalendar from \"components/SearchResultCalendar\";\r\nimport SearchResultGrid from \"components/SearchResultGrid\";\r\nimport FilterBarContainer from \"containers/FilterBar\";\r\nimport type DocModalProps from \"components/DocModal\";\r\nimport Constants, {\r\n type ConstantsEnum,\r\n Feature,\r\n isFeatureOn,\r\n} from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport immutable from \"object-path-immutable\";\r\nimport GetDefaultSearchBuckets from \"data/FilterBar\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport NoData from \"components/NoData\";\r\nimport { SupportGeoMapViewer } from \"components/MapViewer/providerSupport\";\r\nimport { openSearchResultActionPanel } from \"components/SearchResultActionPanel\";\r\nimport { openMultiSelectionActionPanel } from \"components/MultiSelectionActionPanel\";\r\nimport withMultiSelection, {\r\n type MultiSelectionProps,\r\n} from \"containers/MultiSelection\";\r\nimport styles from \"./SearchResult.module.css\";\r\n\r\ntype Props = {\r\n /** react-router History */\r\n history: History,\r\n /** the search requested by the user */\r\n searchItem?: SearchItemDTO,\r\n /** optional extra filters to set on searchRequest */\r\n extraFilters?: Array,\r\n /** fetch status */\r\n status: ConstantsEnum,\r\n /** fetch error details */\r\n error?: ApiErrorResult,\r\n /** search results */\r\n result: ?SearchResultDTO,\r\n /** the words to highlight */\r\n terms: Array,\r\n /** last searchRequest sent to server (from Redux store) */\r\n searchRequest: SearchRequestDTO,\r\n /** callback when setting activeRowIndex\r\n * @param {number} activeRowIndex new row index\r\n * @param {SearchResultRowDTO} row row object that was clicked\r\n * @returns {bool} return FALSE to avoid opening DocViewer for Doc itemUris\r\n */\r\n onSetActiveRowIndex?: (\r\n activeRowIndex: number,\r\n row?: SearchResultRowDTO\r\n ) => boolean,\r\n /** callback when searchForm.autoBrowseToItem is true and one result found\r\n * @default undefined will navigate to the folder view\r\n * @param {number} activeRowIndex new row index (0)\r\n * @param {SearchResultRowDTO} row row object that was clicked\r\n * */\r\n onAutoBrowseToItem?: (\r\n activeRowIndex: number,\r\n row?: SearchResultRowDTO\r\n ) => void,\r\n /** search result row to mark as active */\r\n activeRowIndex: number,\r\n /** whether the breadcrumbs should allow navigation */\r\n isBreadcrumbReadonly?: boolean,\r\n /** current view mode */\r\n viewModeSetting: SettingValueProps,\r\n /** current result sorting */\r\n sortSetting: SettingValueProps,\r\n /** Redux Dispatch */\r\n dispatch: Dispatch,\r\n /** optional specific ViewMode */\r\n viewMode: ?ListViewMode,\r\n /** optional whether to show filterbar */\r\n showFilterBar: ?boolean,\r\n /** custom mapProvider to use for Map viewMode */\r\n mapProvider?: MapProviderConfig,\r\n /** callback when user clicks an empty space on the map (only when useMarker=false & mapProvider.onClick exists) */\r\n onMapClick?: (location: RasterLocation) => void,\r\n /** whether to hide More Action or not */\r\n isMoreHidden: ?boolean,\r\n /** ArrowNavigation Setter Functions */\r\n postMessage: ?ArrowNavigationSetter,\r\n /** withMultipleSelection additional props */\r\n multiSelection: MultiSelectionProps,\r\n};\r\n\r\ntype State = {\r\n aggregations: ?Array,\r\n selected: Array,\r\n scrollToRow: number,\r\n documents: any,\r\n};\r\n\r\nexport class SearchResultContainer extends PureComponent {\r\n _isMounted: boolean;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n aggregations: GetDefaultSearchBuckets(),\r\n selected: [],\r\n scrollToRow: props.activeRowIndex,\r\n documents: {},\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n if (this.props.viewMode) {\r\n this._maybeChangeViewMode(this.props.viewMode);\r\n } else {\r\n this._maybeChangeViewMode();\r\n }\r\n this.props.searchItem &&\r\n this._fetch(this._prepSearchRequest(this.props.searchItem));\r\n };\r\n\r\n componentWillUnmount = () => (this._isMounted = false);\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (prevProps.searchItem !== this.props.searchItem) {\r\n this.props.multiSelection?.disable();\r\n this.setState(\r\n {\r\n aggregations: GetDefaultSearchBuckets(),\r\n selected: [],\r\n },\r\n () =>\r\n this._fetch(this._prepSearchRequest(this.props.searchItem))\r\n );\r\n }\r\n\r\n if (\r\n prevProps.result !== this.props.result &&\r\n this.props.status === Constants.OK\r\n ) {\r\n const result = this.props.result;\r\n /* istanbul ignore else */\r\n if (result != null) {\r\n if (\r\n this.props.result.autoBrowseToItem === true &&\r\n result.totalCount === 1\r\n ) {\r\n if (typeof this.props.onAutoBrowseToItem === \"function\") {\r\n this.props.onAutoBrowseToItem(0, result.rows[0]);\r\n } else {\r\n this.props.history.replace(\r\n getRoute(result.rows[0].itemUri, false, false)\r\n );\r\n }\r\n return;\r\n }\r\n // first result page? update counter\r\n this._updateToggleCounter(result.totalCount);\r\n /* istanbul ignore next */\r\n const aggregationsFromResult =\r\n result.aggregations != null ? result.aggregations : [];\r\n let aggregations: Array =\r\n GetDefaultSearchBuckets()\r\n .concat(\r\n aggregationsFromResult.filter(\r\n // Hide Aggregations from result that are provided via DefaultSearchBuckets\r\n (a) =>\r\n !GetDefaultSearchBuckets().some(\r\n (b) =>\r\n b.name.toUpperCase() ===\r\n a.name.toUpperCase()\r\n )\r\n )\r\n )\r\n .sort((a, b) => {\r\n var nameA = a.name.toUpperCase(); // ignore upper and lowercase\r\n var nameB = b.name.toUpperCase(); // ignore upper and lowercase\r\n if (nameA < nameB) {\r\n return -1;\r\n }\r\n /* istanbul ignore else */\r\n if (nameA > nameB) {\r\n return 1;\r\n }\r\n\r\n // names must be equal\r\n /* istanbul ignore next */\r\n return 0;\r\n });\r\n\r\n // update bucket.selected\r\n this.state.selected.forEach((filter) => {\r\n /* istanbul ignore else */\r\n if (filter.value != null) {\r\n const selectIndex = aggregations.findIndex(\r\n (i) => i.name === filter.name\r\n );\r\n /* istanbul ignore else */\r\n if (selectIndex !== -1) {\r\n aggregations[selectIndex].selected = [filter.value];\r\n }\r\n }\r\n });\r\n\r\n this._handleMoreRowsLoaded(\r\n result.rows,\r\n result.totalCount,\r\n false,\r\n {\r\n aggregations,\r\n }\r\n );\r\n\r\n this.props.multiSelection?.disable();\r\n }\r\n }\r\n /* istanbul ignore next */\r\n if (this.props.activeRowIndex !== prevProps.activeRowIndex) {\r\n this.setState((state) => {\r\n this._updateArrowNavigationRows(state.documents);\r\n return {\r\n scrollToRow: state.scrollToRow || this.props.activeRowIndex, //#59968\r\n };\r\n });\r\n }\r\n }\r\n\r\n _updateToggleCounter(count: number, loading?: boolean): void {\r\n let { dispatch } = this.props;\r\n let status = Constants.OK;\r\n if (loading === true) {\r\n status = Constants.LOADING;\r\n }\r\n /** Need to update both toggles for consistent UX */\r\n dispatch(\r\n togglesUpdateCounterAction({\r\n name: \"searchresult\",\r\n counts: { result: count },\r\n status: { result: status },\r\n })\r\n );\r\n dispatch(\r\n togglesUpdateCounterAction({\r\n name: \"search\",\r\n counts: { result: count },\r\n status: { result: status },\r\n })\r\n );\r\n }\r\n\r\n _prepSearchRequest = (searchItem: SearchItemDTO): SearchRequestDTO => {\r\n // let's build a searchRequest from an existing SearchItem\r\n const searchRequest: SearchRequestDTO = {\r\n pageNum: 0,\r\n id: searchItem.id,\r\n name: searchItem.name,\r\n searchType: searchItem.searchType,\r\n isCustom: false,\r\n searchText: searchItem.searchText,\r\n itemUri: searchItem.itemUri,\r\n scope: searchItem.scope,\r\n filters: (searchItem.filters || []).concat(\r\n this.props.extraFilters || []\r\n ),\r\n sorts: searchItem.sorts || [],\r\n nodeType: searchItem.nodeType,\r\n fakeUris: searchItem.fakeUris,\r\n };\r\n // any filterBar filters from searchItem? update bucket.selected\r\n const bucketFilters = searchRequest.filters.filter(\r\n (f) => f.valueType !== SearchValueType.NotSet && f.value != null\r\n );\r\n /** istanbul ignore else */\r\n if (bucketFilters.length > 0) {\r\n this.setState((prevState: state) => ({\r\n selected: prevState.selected.concat(bucketFilters),\r\n }));\r\n }\r\n return searchRequest;\r\n };\r\n\r\n // load first page of results\r\n _fetch(searchRequest: SearchRequestDTO, hideLoading?: boolean) {\r\n this._updateToggleCounter(0, true);\r\n this.props.dispatch(getSearchAction({ searchRequest }));\r\n }\r\n\r\n // load next page of results\r\n loadMoreRows = (pageNum: number): Promise => {\r\n const { searchRequest, result } = this.props;\r\n /** Trigger loading only on MapViewMode, due to totalCount on ListView */\r\n const hasMapViewMode =\r\n this.props.viewModeSetting.value === ListViewMode.Map;\r\n this._updateToggleCounter(\r\n /*istanbul ignore next */ result && !hasMapViewMode\r\n ? result.totalCount\r\n : 0,\r\n hasMapViewMode\r\n );\r\n\r\n // TODO use Redux action instead of directly loading from fetch!\r\n return fetchSearchResult(\r\n immutable.set(searchRequest, \"pageNum\", pageNum)\r\n ).then((result) => {\r\n /* istanbul ignore next */\r\n if (!this._isMounted) {\r\n return;\r\n }\r\n this._handleMoreRowsLoaded(result.rows, result.totalCount, true);\r\n return result;\r\n });\r\n };\r\n\r\n _onFilterBarSelect = (\r\n name: string,\r\n valueType: SearchValueTypeEnum,\r\n value: any\r\n ) => {\r\n const { selected } = this.state;\r\n const { searchRequest } = this.props;\r\n let newSelected = selected;\r\n let newSearchRequest = searchRequest;\r\n\r\n // changing a previous loaded one?\r\n /* istanbul ignore else */\r\n if (searchRequest.isCustom === false) {\r\n newSearchRequest = immutable.set(searchRequest, \"isCustom\", true);\r\n }\r\n\r\n // do we already a filter set?\r\n const selectIndex = selected.findIndex((i) => i.name === name);\r\n const filterIndex = searchRequest.filters.findIndex(\r\n (i) => i.name === name\r\n );\r\n if (filterIndex !== -1) {\r\n newSearchRequest = immutable.del(\r\n searchRequest,\r\n \"filters.\" + filterIndex\r\n );\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (selectIndex !== -1) {\r\n newSelected = immutable.del(selected, String(selectIndex));\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (value === \"__ALL__\" && filterIndex !== -1) {\r\n // enum value? set to 0 (NotSet/Unknown) instead of deleting it (otherwise it cannot overwrite any seachForm additionalParameters)\r\n if (\r\n [\r\n SearchValueType.ItemType,\r\n SearchValueType.FileSize,\r\n SearchValueType.RelativeDate,\r\n ].includes(searchRequest.filters[filterIndex].valueType)\r\n ) {\r\n newSearchRequest = immutable.set(\r\n searchRequest,\r\n [\"filters\", filterIndex, \"value\"],\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (value !== \"__ALL__\") {\r\n // add new filter\r\n newSelected = newSelected.concat([{ name, value, valueType }]);\r\n if (name !== SORT_BUCKET_NAME) {\r\n const newFilter: SearchFilterDTO = {\r\n name,\r\n valueType,\r\n value,\r\n };\r\n newSearchRequest = immutable.push(\r\n newSearchRequest,\r\n \"filters\",\r\n newFilter\r\n );\r\n } else {\r\n const newSort: SearchSortDTO = {\r\n name: value,\r\n valueType,\r\n direction:\r\n searchRequest.sorts &&\r\n searchRequest.sorts[0] &&\r\n searchRequest.sorts[0].direction ===\r\n SortDirectionOptions.Ascending\r\n ? SortDirectionOptions.Descending\r\n : SortDirectionOptions.Ascending,\r\n };\r\n // TODO support multiple sort columns?\r\n newSearchRequest = immutable.set(newSearchRequest, \"sorts\", [\r\n newSort,\r\n ]);\r\n this.props.sortSetting.setValue(value);\r\n }\r\n }\r\n\r\n newSearchRequest = immutable.set(newSearchRequest, \"pageNum\", 0);\r\n this.setState({ selected: newSelected }, () => {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onSetActiveRowIndex === \"function\")\r\n this.props.onSetActiveRowIndex(-1);\r\n this._fetch(newSearchRequest, true);\r\n });\r\n };\r\n\r\n _onFilterBarClear = () => {\r\n const { searchRequest, searchItem } = this.props;\r\n this.setState(\r\n {\r\n selected: [],\r\n },\r\n () => {\r\n if (searchItem) {\r\n this._fetch(this._prepSearchRequest(searchItem), true);\r\n return;\r\n }\r\n\r\n let newSearchRequest = searchRequest;\r\n newSearchRequest = immutable.set(\r\n newSearchRequest,\r\n \"filters\",\r\n []\r\n );\r\n newSearchRequest = immutable.set(newSearchRequest, \"sorts\", []);\r\n // TODO FilterBarClear should remove ALL BUT HIDDEN FILTERS!\r\n this._fetch(newSearchRequest, true);\r\n }\r\n );\r\n };\r\n\r\n //#region docmodal\r\n _isDocument = (row: SearchResultRowDTO): boolean => row.isDoc === true;\r\n\r\n _getNextDocumentIndex = (index) => {\r\n for (let i = index; i < this.props.result.totalCount; ++i) {\r\n const row = this._getDocument(i);\r\n /* istanbul ignore else */\r\n if (typeof row !== \"undefined\") {\r\n return i;\r\n }\r\n }\r\n return index - 1;\r\n };\r\n\r\n _getPrevDocumentIndex = (index: number): number => {\r\n for (let i = index; i >= 0; --i) {\r\n const row = this._getDocument(i);\r\n /* istanbul ignore else */\r\n if (typeof row !== \"undefined\") {\r\n return i;\r\n }\r\n }\r\n return index + 1;\r\n };\r\n\r\n _getDocument = (index: number): ?SearchResultRowDTO => {\r\n const row = Object.prototype.hasOwnProperty.call(\r\n this.state.documents,\r\n index\r\n );\r\n // Return only documents from multi selection\r\n if (\r\n this.props.multiSelection?.multiple &&\r\n !this.props.multiSelection?.activeRows.hasOwnProperty(index)\r\n ) {\r\n return undefined;\r\n }\r\n if (!row) {\r\n return undefined;\r\n } else {\r\n this.setState({\r\n scrollToRow: index,\r\n });\r\n return this.state.documents[index];\r\n }\r\n };\r\n\r\n _updateArrowNavigationRows = (documents = this.state.documents) => {\r\n const { postMessage, multiSelection, result } = this.props;\r\n // Update postMessage rows if applicable\r\n /* istanbul ignore next */\r\n if (result?.totalCount && postMessage?.setRows) {\r\n if (multiSelection?.multiple) {\r\n const reducedDocuments = {};\r\n Object.keys(documents).forEach((i) => {\r\n const index = parseInt(i, 10);\r\n if (multiSelection?.activeRows.hasOwnProperty(index)) {\r\n reducedDocuments[index] = documents[i];\r\n }\r\n });\r\n postMessage.setRows({\r\n ...reducedDocuments,\r\n length: result.totalCount,\r\n });\r\n } else {\r\n postMessage.setRows({\r\n ...documents,\r\n length: result.totalCount,\r\n });\r\n }\r\n }\r\n };\r\n\r\n _getDocModalProps = (activeRowIndex: number): DocModalProps => {\r\n this._updateArrowNavigationRows();\r\n return {\r\n activeRowIndex,\r\n totalCount: this.props.result.totalCount,\r\n onSetActiveRowIndex: (index: number, isNext: boolean): index => {\r\n const documentIndex = isNext\r\n ? this._getNextDocumentIndex(index)\r\n : this._getPrevDocumentIndex(index);\r\n /* istanbul ignore else */\r\n if (typeof this.props.onSetActiveRowIndex === \"function\") {\r\n this.props.onSetActiveRowIndex(\r\n documentIndex,\r\n this._getDocument(documentIndex)\r\n );\r\n }\r\n return documentIndex;\r\n },\r\n getActiveRowItemUri: this._getDocument,\r\n setTarget: this.props.postMessage?.setTarget,\r\n };\r\n };\r\n\r\n setDocuments = (documents: Array) =>\r\n this.setState({ documents, scrollToRow: -1 });\r\n\r\n _onClick = (\r\n e: SyntheticMouseEvent<*>,\r\n rowIndex: number,\r\n row: SearchResultRowDTO\r\n ) => {\r\n const prevRowIndex = this.props.activeRowIndex;\r\n let showViewer = true;\r\n /* istanbul ignore else */\r\n if (typeof this.props.onSetActiveRowIndex === \"function\")\r\n showViewer = this.props.onSetActiveRowIndex(\r\n rowIndex,\r\n e.ctrlKey || e.shiftKey || this.props.multiSelection?.multiple\r\n ? null\r\n : row\r\n );\r\n if (e.ctrlKey) {\r\n /* istanbul ignore else */\r\n if (!this.props.multiSelection?.multiple && prevRowIndex > -1) {\r\n this.props.multiSelection?.actions.handleToggle(prevRowIndex);\r\n }\r\n this.props.multiSelection?.actions.handleToggle(rowIndex);\r\n } else if (e.shiftKey) {\r\n const startIndex =\r\n prevRowIndex > rowIndex ? rowIndex : prevRowIndex;\r\n const endIndex = prevRowIndex > rowIndex ? prevRowIndex : rowIndex;\r\n for (let i = startIndex; i <= endIndex; i++) {\r\n /* istanbul ignore if */\r\n if (i < 0) continue;\r\n this.props.multiSelection?.actions.handleAdd(i);\r\n }\r\n } else if (this.props.multiSelection?.multiple) {\r\n this.props.multiSelection?.disable();\r\n e.stopPropagation();\r\n } else if (this._isDocument(row)) {\r\n /* istanbul ignore else */\r\n if (showViewer !== false) {\r\n CommandActionHandler(\"doc_preview\", {\r\n itemUri: row.itemUri,\r\n newWindow: e.altKey,\r\n searchTerm: (row.foundTerms || this.props.terms)\r\n .join(\" \")\r\n .replace(\"*\", \"\"),\r\n ...this._getDocModalProps(rowIndex),\r\n });\r\n }\r\n }\r\n };\r\n\r\n _onMoreClick = (\r\n e: SyntheticMouseEvent<*>,\r\n rowIndex: number,\r\n row: SearchResultRowDTO\r\n ) => {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onSetActiveRowIndex === \"function\")\r\n this.props.onSetActiveRowIndex(rowIndex);\r\n if (\r\n this.props.multiSelection?.multiple &&\r\n Object.keys(this.props.multiSelection?.activeRows).length > 1 &&\r\n Object.prototype.hasOwnProperty.call(\r\n this.props.multiSelection?.activeRows,\r\n rowIndex\r\n )\r\n ) {\r\n openMultiSelectionActionPanel({\r\n ...this._getDocModalProps(rowIndex),\r\n activeRows: this.props.multiSelection?.activeRows,\r\n targetView: \"searchresult\",\r\n mapper: /* istanbul ignore next */ (row) => ({\r\n name: row.title,\r\n itemUri: row.itemUri,\r\n formatId: row.breadcrumb?.formatId,\r\n isDoc: row.isDoc,\r\n }),\r\n });\r\n } else {\r\n openSearchResultActionPanel({\r\n row: { ...row, targetView: \"searchresult\" },\r\n ...this._getDocModalProps(rowIndex),\r\n });\r\n }\r\n };\r\n //#endregion\r\n\r\n _maybeChangeViewMode = (newViewMode: ?ListViewModeEnum): void => {\r\n let viewMode, fallbackViewMode;\r\n\r\n /** Decide if the current or future ViewMode might be changed */\r\n if (newViewMode) {\r\n viewMode = newViewMode;\r\n } else {\r\n viewMode = this.props.viewModeSetting.value;\r\n }\r\n /** Set fallback ViewMode if current/future ViewMode is not supported */\r\n if (!SupportGeoMapViewer() && viewMode === ListViewMode.Map) {\r\n console.warn(\r\n `GeoMapViewer support is disabled. Using fallback viewMode \"${ListViewMode.List}\"`\r\n );\r\n fallbackViewMode = ListViewMode.List;\r\n }\r\n /** Change ViewMode if there is a fallbackViewMode or a newViewMode*/\r\n if (fallbackViewMode) {\r\n this.props.viewModeSetting.setValue(fallbackViewMode);\r\n } else if (\r\n this.props.viewModeSetting &&\r\n newViewMode !== this.props.viewModeSetting.value\r\n ) {\r\n this.props.viewModeSetting.setValue(newViewMode);\r\n }\r\n\r\n /** Update toggle count on List */\r\n if (\r\n newViewMode &&\r\n newViewMode === ListViewMode.List &&\r\n this.props.result\r\n ) {\r\n this._updateToggleCounter(this.props.result.totalCount);\r\n }\r\n };\r\n\r\n _onViewModeChange = (viewMode: ListViewModeEnum): void =>\r\n this._maybeChangeViewMode(viewMode);\r\n\r\n _getAvailableViewModes = () => {\r\n const viewModes = [ListViewMode.List, ListViewMode.Grid];\r\n if (SupportGeoMapViewer()) viewModes.push(ListViewMode.Map);\r\n if (isFeatureOn(Feature.searchCalendar))\r\n viewModes.push(ListViewMode.Calendar);\r\n return viewModes;\r\n };\r\n\r\n _onCountOfGeoResults = (count: number): void =>\r\n this._updateToggleCounter(count, false);\r\n\r\n // _onTextFilter = (value: ?string) => {\r\n // // TODO update searchRequest.freetext and run query again\r\n // const { searchRequest } = this.props;\r\n // this._fetch(immutable.set(searchRequest, \"searchText\", value), true);\r\n // };\r\n\r\n _handleMoreRowsLoaded = (\r\n rows: Array,\r\n totalCount: number = 0,\r\n updateTotalCount = false,\r\n additionalState = {}\r\n ) => {\r\n // Store documents for pagination / multi selection\r\n const documents = {};\r\n const availableRows = {};\r\n for (let index in rows) {\r\n availableRows[index] = { ...rows[index] };\r\n /* istanbul ignore if */\r\n if (!this._isDocument(rows[index])) {\r\n continue;\r\n }\r\n documents[index] = rows[index].itemUri;\r\n }\r\n\r\n // Update multiSelection available Rows\r\n /* istanbul ignore next */\r\n this.props.multiSelection?.setAvailableRows(availableRows);\r\n\r\n this._updateArrowNavigationRows(documents);\r\n\r\n this.setState({ documents, scrollToRow: -1, ...additionalState });\r\n if (updateTotalCount) this._updateToggleCounter(totalCount);\r\n };\r\n\r\n _isRowActive = (rowIndex: number, activeState: boolean): boolean => {\r\n return this.props.multiSelection?.multiple\r\n ? this.props.multiSelection?.isSelected(rowIndex)\r\n : activeState;\r\n };\r\n\r\n render() {\r\n const {\r\n status,\r\n error,\r\n result,\r\n terms,\r\n activeRowIndex,\r\n isBreadcrumbReadonly,\r\n } = this.props;\r\n const { scrollToRow } = this.state;\r\n if (\r\n this.props.searchItem == null &&\r\n result == null &&\r\n status === Constants.NONE\r\n ) {\r\n return ;\r\n }\r\n\r\n // custom error message handling\r\n if (\r\n status === Constants.ERROR &&\r\n error != null &&\r\n error.eventId != null &&\r\n error.eventId.id === 1500 /*SEARCH_PARSE*/\r\n ) {\r\n return (\r\n \r\n
\r\n
\r\n Error parsing, field: {error.extra.field}, value:{\" \"}\r\n {error.extra.value}\r\n
\r\n
\r\n {error.message}\r\n
\r\n
\r\n );\r\n }\r\n /* istanbul ignore else */\r\n if (status === Constants.OK && result != null) {\r\n return (\r\n
\r\n {this.props.showFilterBar !== false && (\r\n \r\n )}\r\n\r\n {this.props.viewModeSetting.value === ListViewMode.Map && (\r\n \r\n )}\r\n\r\n {this.props.viewModeSetting.value ===\r\n ListViewMode.Calendar && (\r\n \r\n )}\r\n\r\n {this.props.viewModeSetting.value === ListViewMode.Grid && (\r\n \r\n )}\r\n {this.props.viewModeSetting.value === ListViewMode.List && (\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n return ;\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n status: s.searchStatusSelector(state),\r\n error: s.searchErrorSelector(state),\r\n searchRequest: s.searchRequestSelector(state),\r\n terms:\r\n s.searchStatusSelector(state) === Constants.OK\r\n ? s.searchTermsSelector(state)\r\n : [\"\"],\r\n result:\r\n s.searchStatusSelector(state) === Constants.OK\r\n ? s.searchResultSelector(state)\r\n : undefined,\r\n ...ownProps,\r\n});\r\n\r\nexport default compose(\r\n withRouter,\r\n connect(mapStateToProps),\r\n SettingValue({\r\n name: \"searchResultViewMode\",\r\n namespace: \"viewModeSetting\",\r\n defaultValue: ListViewMode.List,\r\n }),\r\n SettingValue({\r\n name: \"searchResultSort\",\r\n namespace: \"sortSetting\",\r\n defaultValue: \"\",\r\n }),\r\n withMultiSelection({\r\n delay: 600,\r\n })\r\n)(SearchResultContainer);\r\n","// @flow\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport ReactDOMServer from \"react-dom/server\";\r\nimport {\r\n ViewNameType,\r\n type SidebarItemDTO,\r\n type SearchItemDTO,\r\n type SearchScopeEnum,\r\n type SearchFilterDTO,\r\n type SearchNodeTypeEnum,\r\n} from \"data/types\";\r\nimport queryString from \"data/queryString\";\r\nimport * as cfg from \"data/storeHelper\";\r\nimport { isMiniView, isSecureParams, get } from \"data/constants\";\r\n\r\nexport const inPointAction = {\r\n browse: \"browse\",\r\n preview: \"preview\",\r\n properties: \"properties\",\r\n edit: \"edit\",\r\n archive: \"archive\",\r\n commandAction: \"commandaction\",\r\n};\r\nexport type inPointActionsEnum = $Keys;\r\n\r\nexport /**\r\n * creates an inPoint:uri link (for use with inPoint.Sync)\r\n *\r\n * @param {inPointActionsEnum} action type of action\r\n * @param {string?} itemUri itemUri\r\n * @returns {string} link\r\n */\r\nconst inPointActionLink = (\r\n action: inPointActionsEnum,\r\n itemUri?: string,\r\n itemUris?: Array,\r\n additionalProps?: any = {}\r\n): string =>\r\n `inpoint:${action}?${queryString.stringify({\r\n ...additionalProps,\r\n uri: itemUri,\r\n uris: itemUris,\r\n sp: get(window.CONFIG, [\"general\", \"secure_params\"], undefined),\r\n })}`;\r\n\r\nconst ClientLink = ({\r\n action,\r\n name,\r\n itemUri,\r\n}: {\r\n action: inPointActionsEnum,\r\n name: string,\r\n itemUri: string,\r\n}) => (\r\n \r\n {name}\r\n \r\n);\r\nClientLink.displayName = \"ClientLink\";\r\n\r\nexport /**\r\n * returns an HTML rendered link to open an inPoint:uri (for use with inPoint.Sync)\r\n *\r\n * @param {string} name text to display as link name\r\n * @param {string} itemUri itemUri\r\n * @param {inPointActionsEnum} action inPoint.Client action\r\n * @returns {string} HTML rendering of link\r\n */\r\nconst getClientLinkHtml = (\r\n name: string,\r\n itemUri: string,\r\n action: inPointActionsEnum\r\n): string => {\r\n const link = ;\r\n return ReactDOMServer.renderToStaticMarkup(link);\r\n};\r\n\r\nexport /**\r\n * converts an itemUri to a Web short itemUri (no protocol prefix)\r\n *\r\n * @param {string} itemUri\r\n * @returns {string}\r\n */\r\nconst shortItemUri = (itemUri: string): string =>\r\n itemUri.substring(\r\n itemUri.indexOf(\"pam-item://\") === -1 ? 0 : \"pam-item://\".length\r\n );\r\n\r\n// export /** returns an itemUri with a specific document's version */\r\n// const docItemUriWithVersion = (itemUri: string, version?: number) =>\r\n// version && version > 0 ? `${itemUri}@version=${version}` : itemUri;\r\n\r\nexport /**\r\n * returns route to open a document\r\n *\r\n * @param {string} itemUri itemUri\r\n * @param {boolean} [mini] whether docRoute should be opened in mini mode\r\n * @param {boolean} [externalLink] whether link will be used for external new browser\r\n * @param {string | Array} [toggles] toggles to select\r\n * @param {?string} [mark] terms to highlight (if PDF)\r\n * @param {boolean} [print] toggle print dialog (if PDF)\r\n * @returns {string} doc route link\r\n */\r\nconst docRoute = (\r\n itemUri: string,\r\n mini?: boolean,\r\n externalLink?: boolean,\r\n toggles?: string | Array,\r\n mark?: string,\r\n print?: boolean\r\n): string =>\r\n (externalLink === true\r\n ? get(window.CONFIG, [\"host\", \"basename\"], \"\")\r\n : \"\") +\r\n (mini === true ? \"/mini\" : \"\") +\r\n \"/doc?\" +\r\n queryString.stringify({\r\n uri: shortItemUri(itemUri),\r\n sp: get(window.CONFIG, [\"general\", \"secure_params\"], undefined),\r\n toggles:\r\n toggles != null && Array.isArray(toggles)\r\n ? toggles.join(\",\")\r\n : toggles,\r\n mark,\r\n print,\r\n });\r\n\r\nexport /**\r\n * converts a searchItem object into a searchRoute\r\n *\r\n * @param {SearchItemDTO} searchItem searchItem object to convert\r\n * @returns {string} search route link\r\n */\r\nconst searchRouteWithItem = (searchItem: SearchItemDTO): string => {\r\n let qs = {};\r\n Object.keys(searchItem).forEach((k) => {\r\n if ((searchItem[k] && searchItem[k] !== null) || searchItem[k] === 0)\r\n switch (k) {\r\n case \"sorts\":\r\n //TODO: Allow multiple sorts\r\n const sort = searchItem[k][0];\r\n Object.keys(sort).forEach(\r\n (sortKey) => (qs[`sorts.${sortKey}`] = sort[sortKey])\r\n );\r\n break;\r\n default:\r\n qs[k] = searchItem[k];\r\n break;\r\n }\r\n });\r\n return \"/searchResult?\" + queryString.stringify(qs);\r\n};\r\n\r\nexport /**\r\n * returns route to start a fulltext search with keyword\r\n *\r\n * @param {string} keyword keyword to use for search\r\n * @returns {string} search route link\r\n */\r\nconst searchRouteWithKeyword = (keyword: string): string =>\r\n \"/searchResult?\" +\r\n queryString.stringify({\r\n searchText: keyword,\r\n });\r\n\r\nexport /**\r\n * returns route to start a fulltext search with keyword scoped to itemUri\r\n *\r\n * @param {string} keyword keyword to use for search\r\n * @param {string} itemUri itemUri to limit scope (CurrentFolder)\r\n * @param {SearchScopeEnum} [scope] optional search scope (AllSites, AllFolders, CurrentFolder)\r\n * @param {Array} [filters] optional search filters\r\n * @param {Array} [sorts] optional search sorts\r\n * @param {SearchNodeTypeEnum} [nodeType] optional search NodeType\r\n * @returns {string} search route link\r\n */\r\nconst searchRouteWithKeywordAndMore = (\r\n keyword: string,\r\n itemUri: string,\r\n scope?: SearchScopeEnum,\r\n filters?: Array,\r\n sorts?: Array,\r\n nodeType?: SearchNodeTypeEnum\r\n): string =>\r\n \"/searchResult?\" +\r\n queryString.stringify({\r\n searchText: keyword,\r\n itemUri,\r\n scope,\r\n filters:\r\n filters && filters.length > 0 ? JSON.stringify(filters) : undefined,\r\n sorts: sorts && sorts.length > 0 ? JSON.stringify(sorts) : undefined,\r\n nodeType,\r\n });\r\n\r\n/**\r\n * returns a folder route\r\n *\r\n * @param {string} itemUri folder's itemUri\r\n * @param {boolean} [mini] whether route should be opened in mini mode\r\n * @param {boolean} [externalLink] whether link will be used for external new browser\r\n * @param {string | Array} [toggles] toggles to select\r\n * @returns {string} folder route link\r\n */\r\nconst folderRoute = (\r\n itemUri: string,\r\n mini?: boolean,\r\n externalLink?: boolean,\r\n toggles?: string | Array\r\n): string =>\r\n (externalLink === true\r\n ? get(window.CONFIG, [\"host\", \"basename\"], \"\")\r\n : \"\") +\r\n (mini === true ? \"/mini\" : \"\") +\r\n \"/folder?\" +\r\n queryString.stringify({\r\n uri: shortItemUri(itemUri),\r\n sp: get(window.CONFIG, [\"general\", \"secure_params\"], undefined),\r\n toggles:\r\n toggles != null && Array.isArray(toggles)\r\n ? toggles.join(\",\")\r\n : toggles,\r\n });\r\n\r\n/**\r\n * returns a route for flat view\r\n *\r\n * @param {string} itemUri folder's itemUri\r\n * @param {boolean} [mini] whether route should be opened in mini mode\r\n * @param {boolean} [externalLink] whether link will be used for external new browser\r\n * @param {string | Array} [toggles] toggles to select\r\n * @returns {string} flat route link\r\n */\r\nconst flatRoute = (\r\n itemUri: string,\r\n mini?: boolean,\r\n externalLink?: boolean,\r\n toggles?: string | Array\r\n): string =>\r\n (externalLink === true\r\n ? get(window.CONFIG, [\"host\", \"basename\"], \"\")\r\n : \"\") +\r\n (mini === true ? \"/mini\" : \"\") +\r\n \"/flat?\" +\r\n queryString.stringify({\r\n uri: shortItemUri(itemUri),\r\n sp: get(window.CONFIG, [\"general\", \"secure_params\"], undefined),\r\n toggles:\r\n toggles != null && Array.isArray(toggles)\r\n ? toggles.join(\",\")\r\n : toggles,\r\n });\r\n\r\nexport /**\r\n * returns a route for mail view\r\n *\r\n * @param {string} itemUri folder's itemUri\r\n * @param {boolean} [mini] whether route should be opened in mini mode\r\n * @param {boolean} [externalLink] whether link will be used for external new browser\r\n * @param {string | Array} [toggles] toggles to select\r\n * @returns {string} mail route link\r\n */\r\nconst mailRoute = (\r\n itemUri: string,\r\n mini?: boolean,\r\n externalLink?: boolean,\r\n toggles?: string | Array\r\n): string =>\r\n (externalLink === true\r\n ? get(window.CONFIG, [\"host\", \"basename\"], \"\")\r\n : \"\") +\r\n (mini === true ? \"/mini\" : \"\") +\r\n (mini === true ? \"/flat?\" : \"/mail?\") + // There is currently NO mini view for mail so we use flat\r\n queryString.stringify({\r\n uri: shortItemUri(itemUri),\r\n sp: get(window.CONFIG, [\"general\", \"secure_params\"], undefined),\r\n toggles:\r\n toggles != null && Array.isArray(toggles)\r\n ? toggles.join(\",\")\r\n : toggles,\r\n });\r\n\r\nconst viewNameTypeRouteMapping = {\r\n [ViewNameType.folder]: folderRoute,\r\n [ViewNameType.mailbox]: mailRoute,\r\n [ViewNameType.flat]: flatRoute,\r\n};\r\n\r\nexport /**\r\n * dynamically figures out which route (and view) to use.\r\n * if no sites configuration available, will always return a folder route link\r\n * @param {string} itemUri item's itemURi\r\n * @param {boolean} [mini] whether route should be opened in mini mode (if not passed will try to parse from window.location)\r\n * @param {boolean} [externalLink] whether link will be used for external new browser\r\n * @returns {string} route link\r\n */\r\nconst getRoute = (\r\n itemUri: string,\r\n mini?: boolean,\r\n externalLink?: boolean,\r\n isDoc?: boolean,\r\n toggles?: string | Array\r\n): string => {\r\n // no isDoc parameter passed on? figure it out if not in secureParams\r\n if (isDoc == null) isDoc = itemUri.indexOf(\"@eid\") > 0;\r\n\r\n // no mini parameter passed on? figure it out\r\n /* istanbul ignore else */\r\n if (mini == null) {\r\n mini = isMiniView(window.location);\r\n }\r\n\r\n const props = [itemUri, mini, externalLink, toggles];\r\n\r\n if (isDoc === true) return docRoute(...props);\r\n\r\n const sites = cfg.sitesSelector();\r\n if (sites != null) {\r\n // sites sorted by itemUri.length descending\r\n const sitesOrdered = sites\r\n .slice(0)\r\n .sort(\r\n (a: SidebarItemDTO, b: SidebarItemDTO) =>\r\n b.itemUri.length - a.itemUri.length\r\n );\r\n // do we have an exact match?\r\n const orderedIndex = sitesOrdered.findIndex(\r\n (orderedSite) => orderedSite.itemUri === itemUri\r\n );\r\n // ...then take it\r\n if (orderedIndex !== -1) {\r\n return viewNameTypeRouteMapping[\r\n sitesOrdered[orderedIndex].viewName\r\n ](...props);\r\n } else {\r\n // find closest neighbour\r\n const orderedIndex2 = sitesOrdered.findIndex(\r\n (orderedSite) => itemUri.indexOf(orderedSite.itemUri) === 0\r\n );\r\n if (orderedIndex2 !== -1) {\r\n return viewNameTypeRouteMapping[\r\n sitesOrdered[orderedIndex2].viewName\r\n ](...props);\r\n }\r\n }\r\n }\r\n //if uri does not exist at all in our sidebar\r\n return folderRoute(...props);\r\n};\r\n\r\n/**\r\n * React component to render an HTML tag with a link\r\n *\r\n * @param {{ name: string, itemUri: string }} { name, itemUri }\r\n * @returns HTML component\r\n */\r\nconst BrowserLink = ({\r\n name,\r\n itemUri,\r\n isDoc,\r\n}: {\r\n name: string,\r\n itemUri: string,\r\n isDoc?: boolean,\r\n}) => (\r\n \r\n {name}\r\n \r\n);\r\nBrowserLink.displayName = \"BrowserLink\";\r\n\r\nexport /**\r\n * returns an HTML rendered link to open an inPoint.Web route link\r\n *\r\n * @param {string} name text to display as link name\r\n * @param {string} itemUri itemUri\r\n * @param {?boolean} itemUri itemUri\r\n * @returns {string} HTML rendering of link\r\n */\r\nconst getBrowserLinkHtml = (\r\n name: string,\r\n itemUri: string,\r\n isDoc: ?boolean\r\n): string => {\r\n const link = ;\r\n return ReactDOMServer.renderToStaticMarkup(link);\r\n};\r\n\r\nexport const BrowserDragLink = ({\r\n className,\r\n itemUri,\r\n children,\r\n}: {\r\n className: ?string,\r\n itemUri: string,\r\n children: any,\r\n}) => {\r\n if (isSecureParams(window.location)) return children;\r\n else\r\n return (\r\n e.preventDefault()}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\nBrowserDragLink.displayName = \"BrowserDragLink\";\r\nBrowserDragLink.propTypes = {\r\n itemUri: PropTypes.string.isRequired,\r\n};\r\n","// @flow\r\nimport { Location } from \"history\";\r\nimport qs from \"data/queryString\";\r\nimport { persistor } from \"data/storeHelper\";\r\n\r\n/* istanbul ignore next */\r\n/**\r\n * create a valid GUID\r\n *\r\n * @returns {string} random guid\r\n */\r\nfunction randomGuid(): string {\r\n var guidHolder = \"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx\";\r\n var hex = \"0123456789abcdef\";\r\n var r = 0;\r\n var guidResponse = \"\";\r\n for (var i = 0; i < guidHolder.length; i++) {\r\n if (guidHolder[i] !== \"-\" && guidHolder[i] !== \"4\") {\r\n // each x and y needs to be random\r\n r = (Math.random() * 16) | 0;\r\n }\r\n\r\n if (guidHolder[i] === \"x\") {\r\n guidResponse += hex[r];\r\n } else if (guidHolder[i] === \"y\") {\r\n // clock-seq-and-reserved first hex is filtered and remaining hex values are random\r\n r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??\r\n r |= 0x8; // set pos 3 to 1 as 1???\r\n guidResponse += hex[r];\r\n } else {\r\n guidResponse += guidHolder[i];\r\n }\r\n }\r\n return guidResponse;\r\n}\r\n// export as function for test mocking\r\nconst functions = {\r\n randomGuid,\r\n};\r\nexport { functions };\r\n\r\n/**\r\n * creates a URL to request authentication from identityServer\r\n *\r\n * @export\r\n * @param {Object} state can include a \"from\" property to specify the return route after login (used by {@link getAuthCallback})\r\n * @returns absolute url to identity login process\r\n */\r\nexport function getAuthUrl(state?: { from: string }): string {\r\n const params = {\r\n client_id: window.CONFIG.auth.clientId,\r\n redirect_uri: window.CONFIG.auth.redirectUrl,\r\n response_type: window.CONFIG.auth.responseType || \"id_token token\",\r\n scope: window.CONFIG.auth.scope || \"openid\",\r\n state: /* istanbul ignore next */ state\r\n ? JSON.stringify(state)\r\n : undefined,\r\n\r\n nonce: functions.randomGuid(),\r\n // https://github.com/IdentityModel/oidc-client-js/issues/624\r\n // https://stackoverflow.com/a/23945116/1069189\r\n resource: window.CONFIG.auth.resource,\r\n //login_hint: pre-fill username on login form\r\n };\r\n if (window.CONFIG.auth.forceLogin === true) {\r\n params.prompt = window.CONFIG.auth.forceLoginPrompt || \"login\";\r\n }\r\n // http://docs.identityserver.io/en/release/endpoints/authorize.html\r\n return window.CONFIG.auth.authorizeEndpoint + \"?\" + qs.stringify(params);\r\n}\r\n\r\nexport type authInfo = {\r\n /** identity id_token */\r\n id_token: string,\r\n /** identity access_token */\r\n access_token: string,\r\n /** which route should the user land at */\r\n state: { from: string },\r\n /** ticks until tokens expire (absolute value, not related to token itself) */\r\n expires_in: number,\r\n};\r\n\r\n/**\r\n * parses the hash part of the url to retrieve identity authentication tokens - id_token, access_token, etc...\r\n * will also parse the state originally passed by {@link getAuthUrl}\r\n * @export\r\n * @param {Location} urlLocation\r\n * @returns object with all parsed identity values\r\n */\r\nexport function getAuthCallback(urlLocation: Location): authInfo {\r\n const search = urlLocation.hash.substring(1);\r\n const qr = qs.parse(search);\r\n let expires_in = 73360; //1 hour default\r\n /* istanbul ignore else */\r\n if (qr.expires_in) {\r\n expires_in = parseInt(qr.expires_in, 10);\r\n }\r\n return {\r\n id_token: qr.id_token,\r\n access_token: qr.access_token || qr.id_token,\r\n state: /* istanbul ignore next */ qr.state\r\n ? JSON.parse(qr.state)\r\n : { from: \"/\" },\r\n expires_in,\r\n };\r\n}\r\n\r\n/**\r\n * will sign-out the current user invaliding the stored tokens and forwarding to the identity/EndSession Endpoint\r\n *\r\n * @export\r\n * @param {string} idToken\r\n */\r\nexport const signout = (idToken: string): Promise => {\r\n // #43383 clear all persisted data\r\n persistor.pause();\r\n persistor.flush().then(() => {\r\n persistor.purge().then(() =>\r\n window.location.assign(\r\n window.CONFIG.auth.endSessionEndpoint +\r\n \"?\" +\r\n qs.stringify({\r\n // by passing the original id_token the user gets a prompt to return to logoutRedirectUrl\r\n id_token_hint: idToken,\r\n // this must be the same as the Identity/Config.ClientStore.logoutRedirectUrl otherwise it wont work!\r\n post_logout_redirect_uri:\r\n window.CONFIG.auth.logoutRedirectUrl,\r\n })\r\n )\r\n );\r\n });\r\n};\r\n\r\n/**\r\n * will return the current location pathname + search values but remove any basename from the route\r\n *\r\n * @export\r\n * @returns relative url of current route (without basename)\r\n */\r\nexport function signinFromLocation(): string {\r\n return (window.location.pathname + window.location.search).replace(\r\n window.CONFIG.host.basename,\r\n \"\"\r\n );\r\n}\r\n\r\n/**\r\n * will redirect user after successfull login to his original requested route\r\n *\r\n * @export\r\n */\r\nexport function signinRedirect(): void {\r\n window.location.assign(\r\n getAuthUrl({\r\n // Root.js/BrowserRouter already sets basename so avoid duplicating it\r\n from: signinFromLocation(),\r\n })\r\n );\r\n}\r\n\r\n// https://github.com/IdentityModel/oidc-client-js/blob/dev/src/UserManager.js\r\n// export function silentRenewUrl() {\r\n// return (\r\n// \"https://lns-w10.hs.local:5000/connect/authorize?\" +\r\n// qs.stringify({\r\n// client_id,\r\n// redirect_uri,\r\n// //id_token_hint: id_token,\r\n// prompt: \"none\",\r\n// response_type: \"id_token token\",\r\n// scope: \"openid inPoint.Web.API inPoint.Core.API\",\r\n// nonce: random()\r\n// //login_hint: pre-fill username on login form\r\n// })\r\n// );\r\n// }\r\n\r\n// export function getTokens(code: string) {\r\n// const url = \"https://lns-w10.hs.local:5000/connect/token\";\r\n\r\n// fetch(url, {\r\n// method: \"POST\",\r\n// headers: {\r\n// \"Content-Type\": \"application/x-www-form-urlencoded\"\r\n// },\r\n// body: qs.stringify({\r\n// code,\r\n// grant_type: \"refresh_token\",\r\n// client_id,\r\n// redirect_uri\r\n// })\r\n// })\r\n// .then(response => {\r\n// console.log(\"token response\", response);\r\n// const accessToken = response.access_token;\r\n// })\r\n// .catch(err => {\r\n// console.log(\"token error\", err);\r\n// });\r\n// }\r\n","// @flow\r\nimport React from \"react\";\r\nimport \"./index.css\";\r\nimport CardItem from \"./CardItem\";\r\nimport {\r\n type CardItemResultDTO,\r\n CardItemType,\r\n type CardItemTypeEnum,\r\n} from \"data/types\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport NoData from \"components/NoData\";\r\n\r\ntype Props = {\r\n /** current fetch status */\r\n status: ConstantsEnum,\r\n /** all cards objects */\r\n cards?: Array,\r\n /** which panes are currently toggled */\r\n toggles: Array,\r\n /** callback when user clicks on a card\r\n * @param {CardItemResultDTO} item which card was clicked\r\n * @param {?SyntheticMouseEvent<*>} e click event details\r\n */\r\n onClick: (item: CardItemResultDTO, e: ?SyntheticMouseEvent<*>) => void,\r\n /** optional callback when user clicks on the three dots more\r\n * @param {CardItemResultDTO} item which card was clicked\r\n */\r\n onMoreClick?: (item: CardItemResultDTO) => void,\r\n /** optional function to validate whether to show the onMoreClick\r\n * @param {CardItemResultDTO} item which card\r\n * @default only for card.itemtype=Doc,Folder,Search,Task\r\n */\r\n showOnMoreClick?: (item: CardItemResultDTO) => boolean,\r\n /** which itemTypes to show */\r\n itemtypes?: Array,\r\n /** current filterText (or empty string if none) */\r\n filterText: string,\r\n};\r\n\r\nconst CardList = ({\r\n status,\r\n cards,\r\n toggles,\r\n onClick,\r\n onMoreClick,\r\n showOnMoreClick,\r\n itemtypes,\r\n filterText,\r\n}: Props) => {\r\n const _onMoreClick = (card: CardItemResultDTO) => {\r\n // onMoreClick defined at all?\r\n if (typeof onMoreClick === \"function\") {\r\n // custom evaluator defined?\r\n if (typeof showOnMoreClick === \"function\") {\r\n return showOnMoreClick(card)\r\n ? (e) => e.stopPropagation() || onMoreClick(card)\r\n : undefined;\r\n }\r\n // default evaluator (for backward compatibility)\r\n /* istanbul ignore else */\r\n if (\r\n [\r\n CardItemType.Doc,\r\n CardItemType.Folder,\r\n CardItemType.Search,\r\n CardItemType.Task,\r\n ].includes(card.itemtype)\r\n ) {\r\n return (e) => e.stopPropagation() || onMoreClick(card);\r\n }\r\n }\r\n // do not show onMore\r\n return undefined;\r\n };\r\n /* istanbul ignore else */\r\n if ([Constants.OK, Constants.REFRESH].includes(status) && cards != null) {\r\n const totalVisible = cards.filter(\r\n (item) =>\r\n toggles.includes(item.type) &&\r\n (itemtypes == null || itemtypes.includes(item.itemtype))\r\n ).length;\r\n if (totalVisible === 0) return ;\r\n else\r\n return (\r\n
    \r\n {cards &&\r\n cards.map((item) => (\r\n onClick(item, e)}\r\n onMoreClick={_onMoreClick(item)}\r\n dataTest={`cardItem-${item.uri}`}\r\n />\r\n ))}\r\n
\r\n );\r\n }\r\n\r\n return ;\r\n};\r\nCardList.displayName = \"CardList\";\r\nexport default CardList;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport immutable from \"object-path-immutable\";\r\n\r\n// state.toggles {}\r\n// ._selected[] of string toggle.value\r\n// .counts {} of string toggle.value=toggle.count\r\n\r\nexport function getSelected(toggles) {\r\n let result = [];\r\n toggles\r\n .filter((toggle) => toggle.isSelected)\r\n .forEach((toggle) => result.push(toggle.value));\r\n return result;\r\n}\r\n\r\nconst togglesReducer = (state = {}, action) => {\r\n switch (action.type) {\r\n case actionTypes.TOGGLES_PERSIST:\r\n case actionTypes.TOGGLES_CHANGE:\r\n return immutable.set(\r\n state,\r\n [action.payload.name, \"_selected\"],\r\n getSelected(action.payload.toggles)\r\n );\r\n\r\n case actionTypes.TOGGLES_UPDATECOUNTER:\r\n const keys = Object.keys(action.payload.counts);\r\n if (keys.length === 1) {\r\n // updating only one counter\r\n const state2 = immutable.set(\r\n state,\r\n [action.payload.name, \"counts\", keys[0]],\r\n action.payload.counts[keys[0]]\r\n );\r\n if (action.payload.status !== undefined) {\r\n const state3 = immutable.set(\r\n state2,\r\n [action.payload.name, \"status\", keys[0]],\r\n action.payload.status[keys[0]]\r\n );\r\n return state3;\r\n }\r\n return state2;\r\n } else {\r\n //updating all\r\n const state2 = immutable.set(\r\n state,\r\n [action.payload.name, \"counts\"],\r\n action.payload.counts\r\n );\r\n if (action.payload.status !== undefined) {\r\n const state3 = immutable.set(\r\n state2,\r\n [action.payload.name, \"status\"],\r\n action.payload.status\r\n );\r\n return state3;\r\n }\r\n return state2;\r\n }\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return {};\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default togglesReducer;\r\n\r\nexport const selectedTogglesSelector = (state: Object, viewName: string) =>\r\n state.toggles &&\r\n state.toggles[viewName] &&\r\n state.toggles[viewName][\"_selected\"]\r\n ? state.toggles[viewName][\"_selected\"]\r\n : undefined; // used by TogglesHandler to load initialState\r\n","import actionTypes from \"../actions/actionTypes\";\r\nimport immutable from \"object-path-immutable\";\r\nimport panesDefaultState from \"../panes.js\";\r\n\r\nconst panesReducer = (state = panesDefaultState, action) => {\r\n switch (action.type) {\r\n case actionTypes.SPLITPANES_PERSIST:\r\n case actionTypes.SPLITPANES_SET:\r\n return immutable.set(\r\n state,\r\n [action.payload.view, action.payload.name],\r\n action.payload.dimensions\r\n );\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return panesDefaultState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default panesReducer;\r\n\r\nexport const panesViewSelector = (state: Object, viewName: string) =>\r\n state.panes[viewName];\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants from \"data/constants\";\r\n\r\nconst initialState = {\r\n options: undefined,\r\n status: Constants.LOADING,\r\n};\r\n\r\nconst globalSearchReducer = (state = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.GLOBALDEFAULTSEARCH_FETCH_RESULT:\r\n return { ...state, ...action.payload };\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default globalSearchReducer;\r\n\r\nexport const globalSearchOptionsSelector = (state: Object) =>\r\n state.globalSearch.status === Constants.OK\r\n ? state.globalSearch.options\r\n : undefined;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\n\r\nconst globalEventsReducer = (state = {}, action) => {\r\n switch (action.type) {\r\n case actionTypes.GLOBALEVENTS_SERVER:\r\n return { ...state, ...action.payload, id: action.receivedAt };\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return {};\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default globalEventsReducer;\r\n\r\nexport const globalEventsSelector = (state: Object) => state.globalEvents;\r\n// export const serverEventsTypeSelector = (state: Object) =>\r\n// state.serverEvents.type;\r\n// export const serverEventsItemUriSelector = (state: Object) =>\r\n// state.serverEvents.itemUri;\r\n","import actionTypes from \"../actions/actionTypes\";\r\nimport {\r\n NotificationStatusFlag,\r\n PriorityType,\r\n NotificationStyle,\r\n type NotificationDTO,\r\n} from \"data/types\";\r\nimport produce from \"immer\";\r\n\r\nexport const initialState: Array = [];\r\n\r\nconst notificationReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n const { payload, type } = action;\r\n const i = state.findIndex(\r\n (i) => i.notificationId === payload?.notificationId\r\n );\r\n\r\n switch (type) {\r\n case actionTypes.NOTIFICATION_UPSERT:\r\n if (i === -1)\r\n draft.unshift({\r\n notificationId:\r\n payload?.notificationId ??\r\n window.crypto.randomUUID(),\r\n message: payload?.message,\r\n status: payload?.status ?? NotificationStatusFlag.New,\r\n priority:\r\n payload?.priority ?? PriorityType.Intermediate,\r\n style: payload?.style ?? NotificationStyle.Default,\r\n icon: payload?.icon,\r\n Component: payload?.Component,\r\n toast: payload?.toast ?? false,\r\n timestamp: payload?.timestamp ?? Date.now(),\r\n });\r\n else draft[i] = { ...draft[i], ...payload };\r\n break;\r\n case actionTypes.NOTIFICATION_DEL:\r\n if (i > -1) draft.splice(i, 1);\r\n else\r\n console.warn(\r\n `Not found. Cannot delete Notification ${payload.notificationId}`\r\n );\r\n break;\r\n case actionTypes.NOTIFICATION_STATUS:\r\n if (i === -1)\r\n draft.forEach((item, i) => {\r\n draft[i].status = payload.replace\r\n ? payload.status\r\n : draft[i].status | payload.status;\r\n });\r\n else\r\n draft[i].status = payload.replace\r\n ? payload.status\r\n : draft[i].status | payload.status;\r\n break;\r\n case actionTypes.NOTIFICATION_CLEAR:\r\n return payload == null\r\n ? initialState\r\n : draft.filter(\r\n (item) =>\r\n (payload.priority == null ||\r\n payload.priority !== item.priority) &&\r\n (payload.style == null ||\r\n payload.style !== item.style) &&\r\n (payload.status == null ||\r\n payload.status !== item.status)\r\n );\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\nexport default notificationReducer;\r\n\r\nexport const notificationSelector = (\r\n state: Any,\r\n notificationId: NotificationId = null\r\n): Array =>\r\n state.notification\r\n ?.filter(\r\n (i) => notificationId == null || i.notificationId === notificationId\r\n )\r\n ?.sort((a, b) =>\r\n a.timestamp > b.timestamp ? -1 : a.timestamp < b.timestamp ? 1 : 0\r\n ) ?? [];\r\n","import _queryString, { StringifyOptions } from \"query-string\";\r\n\r\nconst queryString = {\r\n ..._queryString,\r\n stringify: (object: Record, options: StringifyOptions) =>\r\n _queryString.stringify(object, {\r\n skipNull: true,\r\n skipEmptyString: true,\r\n }),\r\n};\r\n\r\nexport default queryString;\r\n","// @flow\r\nimport React, { type ComponentType } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\nimport { fetchFormLookup, fetchFormLookupDependencies } from \"data/api\";\r\nimport {\r\n type ApiError,\r\n type FormLookupTypeEnum,\r\n FormLookupType,\r\n type FieldDefinitionDTO,\r\n type SearchFieldDefinitionDTO,\r\n type SearchFilterDTO,\r\n type FormLookupValue,\r\n type LookupValuesResultDTO,\r\n type SearchValueTypeEnum,\r\n SearchValueType,\r\n SearchOperator,\r\n} from \"data/types\";\r\nimport loc from \"i18next\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport { AsyncPaginate } from \"react-select-async-paginate\";\r\nimport { createFilter, components } from \"react-select\";\r\nimport Status from \"components/Status\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport NativeSelect from \"components/NativeSelect\";\r\nimport { isHandheld } from \"data/bowser\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport Mark from \"@hs/mark\";\r\nimport SearchBucket from \"components/FilterBar/SearchBucket\";\r\nimport { getClassNames, closeMenuOnScroll } from \"data/utils\";\r\nimport styles from \"./LookupEditorControl.module.css\";\r\n\r\nconst { Option } = components;\r\n\r\ntype FetchFormResponseDTO = {\r\n options: Array,\r\n hasMore: boolean,\r\n additional: { pageNum: number },\r\n};\r\n\r\ntype Props = {\r\n /** whether handling a Document or Folder form */\r\n isDoc: boolean,\r\n /** requested formatId */\r\n formatId: number,\r\n /** requested itemUri */\r\n itemUri: string,\r\n /** commonName */\r\n name: string,\r\n /** current value */\r\n value: string,\r\n /** all ExtraAttributes */\r\n attributes: Array,\r\n /** Redux form changes */\r\n changes: ?Object,\r\n /** type of lookup */\r\n lookupType: FormLookupTypeEnum,\r\n /** when lookupType==FormLookupType.sf_ftlookup then this is the searchFormId */\r\n formId?: number,\r\n /** SearchValueType */\r\n valueType?: SearchValueTypeEnum,\r\n /** whether multiple selection is allowed */\r\n isMultiple: boolean,\r\n /** whether this is a required field */\r\n isRequired: boolean,\r\n /** whether this is a readonly field */\r\n isReadonly: boolean,\r\n /** filtering by matching any part of starts with */\r\n useContains: boolean,\r\n /** whether to use lookup values keys */\r\n useKeys: boolean,\r\n /** all available options */\r\n values?: Array,\r\n /** placeholder text to display when @see {value} is empty */\r\n placeholder?: string,\r\n /** optional children to render */\r\n children?: ComponentType<*>,\r\n /** optional parentName (dependent lookups) */\r\n parentName: string,\r\n};\r\n\r\ntype State = {\r\n inputValue: ?string,\r\n status: ConstantsEnum,\r\n loadIndex: number,\r\n};\r\n\r\nexport class LookupEditorControl extends React.Component {\r\n static defaultProps = {\r\n isDoc: false,\r\n formatId: 0,\r\n name: \"\",\r\n lookupType: FormLookupType.ea_lookup,\r\n isMultiple: false,\r\n isRequired: false,\r\n isReadonly: false,\r\n useContains: false,\r\n useKeys: false,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n status: props.values ? Constants.OK : Constants.LOADING,\r\n loadIndex: 0,\r\n inputValue: null,\r\n };\r\n }\r\n\r\n /** re-render only when value changes! */\r\n shouldComponentUpdate = (nextProps: Props, nextState: State) =>\r\n nextProps.value !== this.props.value ||\r\n nextProps.values !== this.props.values ||\r\n // used to force reloading\r\n nextState.loadIndex !== this.state.loadIndex ||\r\n nextState.inputValue !== this.state.inputValue;\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (\r\n prevProps.attributes !== this.props.attributes ||\r\n prevProps.values !== this.props.values\r\n ) {\r\n this.setState(({ loadIndex }: State) => ({\r\n loadIndex: loadIndex + 1,\r\n }));\r\n }\r\n }\r\n\r\n getParentAsFilters = (filters = [], parentName = this.props.parentName) => {\r\n // Bail early if not EA\r\n if (this.props.attributes == null) {\r\n return filters;\r\n }\r\n const attr = this.props.attributes.find(\r\n (attr) => attr.name === parentName\r\n );\r\n // No parent found, return found filters\r\n if (attr == null) return filters;\r\n\r\n // Up the dependency tree\r\n if (attr.extra && attr.extra.parentLookupCommonName != null) {\r\n filters = this.getParentAsFilters(\r\n filters,\r\n attr.extra.parentLookupCommonName\r\n );\r\n }\r\n const filter: SearchFilterDTO = {\r\n name: parentName,\r\n op: SearchOperator.Equals,\r\n value: attr.value,\r\n };\r\n filters.push(filter);\r\n return filters;\r\n };\r\n\r\n getCurrentDependentLookupValues = (\r\n lookupValues = [],\r\n parentName = this.props.name.substring(3)\r\n ) => {\r\n // Bail early if not EA\r\n if (this.props.attributes == null) {\r\n return lookupValues;\r\n }\r\n // Re-use getParentAsFilters to get all parent values\r\n if (\r\n lookupValues.length === 0 &&\r\n parentName === this.props.name.substring(3)\r\n ) {\r\n lookupValues = this.getParentAsFilters(\r\n lookupValues,\r\n this.props.parentName\r\n ).map((filter) => ({\r\n name: filter.name,\r\n value: filter.value,\r\n }));\r\n }\r\n\r\n // Find any child\r\n const attr = this.props.attributes.find(\r\n (attr) =>\r\n attr.extra && attr.extra.parentLookupCommonName === parentName\r\n );\r\n\r\n if (attr == null) return lookupValues;\r\n\r\n const value = {\r\n name: attr.name,\r\n value: attr.value,\r\n };\r\n lookupValues.push(value);\r\n\r\n // Down the dependency tree\r\n return this.getCurrentDependentLookupValues(lookupValues, attr.name);\r\n };\r\n\r\n getValueByOperator = (value: any, op: SearchOperatorEnum) => {\r\n switch (op) {\r\n case SearchOperator.Contextor:\r\n case SearchOperator.ContextorContains:\r\n return value && value.T ? value.T : value;\r\n default:\r\n return value;\r\n }\r\n };\r\n\r\n fetchLookup = (\r\n keyword: string,\r\n loadedOptions: any,\r\n { pageNum }: { pageNum: number }\r\n ): Promise => {\r\n if (this.props.values) {\r\n return Promise.resolve({\r\n options: this.props.values,\r\n hasMore: false,\r\n additional: { pageNum: 0 },\r\n });\r\n }\r\n const name = this.props.name.substring(3); //remove formPrefix\r\n // collect other attribute values\r\n let filters: Array = [];\r\n if (\r\n this.props.lookupType === FormLookupType.sf_ftlookup &&\r\n this.props.changes != null\r\n ) {\r\n this.props.attributes.forEach((attr) => {\r\n const changed = this.props.changes[attr.name];\r\n // pass any other set filters (always pass ourselves as well)\r\n // NOTE: we need to pass everything to allow resetting predefined SearchParameters!\r\n // if (\r\n // changed != null &&\r\n // (changed.val != null || attr.name === name)\r\n // ) {\r\n const filter: SearchFilterDTO = {\r\n name: attr.name,\r\n op: changed.op,\r\n value: this.getValueByOperator(changed.val, changed.op),\r\n valueType: attr.valueType,\r\n boostLeafNode: attr.boostLeafNode,\r\n nodeType: attr.nodeType,\r\n };\r\n filters.push(filter);\r\n // }\r\n });\r\n }\r\n // collect any (parent(s)) parent value and add to filter\r\n if (this.props.parentName) {\r\n filters = this.getParentAsFilters(filters);\r\n }\r\n\r\n return fetchFormLookup({\r\n keyword,\r\n pageNum,\r\n isDoc: this.props.isDoc,\r\n formatId: this.props.formatId,\r\n itemUri: this.props.itemUri,\r\n name,\r\n lookupType: this.props.lookupType,\r\n id: this.props.formId,\r\n filters,\r\n })\r\n .catch((err: ApiError) => {\r\n this.setState({\r\n status: Constants.ERROR,\r\n });\r\n return null;\r\n })\r\n .then((result: ?LookupValuesResultDTO) => {\r\n if (result != null && result.values != null) {\r\n this.setState({\r\n // values,\r\n status: Constants.OK,\r\n });\r\n return {\r\n options: result.values,\r\n hasMore: result.hasMore,\r\n additional: { pageNum: pageNum + 1 },\r\n };\r\n } else\r\n return {\r\n options: [],\r\n hasMore: false,\r\n additional: { pageNum: 0 },\r\n };\r\n });\r\n };\r\n\r\n _fixValue = (value: ?any | ?Array | ?FormLookupValue) => {\r\n if (Array.isArray(value)) {\r\n const values = value\r\n .map((v) => this._fixValue(v))\r\n .filter((v) => v != null);\r\n return values.length ? values : null;\r\n }\r\n return value?.T ? value : null;\r\n };\r\n\r\n _onChange = (\r\n value: ?Array | ?FormLookupValue,\r\n changeValue: Function\r\n ) =>\r\n this._handleDependenciesUpdate(\r\n this._handleLookupValue(value),\r\n changeValue\r\n );\r\n\r\n _prepareOtherValueFor = (name: string, value: any): any => {\r\n const target = this.props.attributes?.find((a) => a.name === name);\r\n let v = value;\r\n if (\r\n [\"List_Combo\", \"Lookup_Combo\", \"FullTextLookup_Combo\"].includes(\r\n target?.format\r\n )\r\n ) {\r\n v = { T: `${value}` };\r\n }\r\n if (v != null && typeof v === \"object\" && target?.extra?.useKeys) {\r\n v.K = `${value}`;\r\n }\r\n if (target?.extra?.isMultiple) {\r\n v = [v];\r\n }\r\n return v;\r\n };\r\n\r\n _handleLookupValue = (\r\n rawValue: ?Array | ?FormLookupValue,\r\n name: string = this.props.name\r\n ): Array => {\r\n const changed: Array = [];\r\n if (Array.isArray(rawValue)) {\r\n changed.push({\r\n name,\r\n value: this._fixValue(rawValue),\r\n });\r\n } else {\r\n const { O: others, ...current } = rawValue || {};\r\n const value = this._fixValue(current);\r\n changed.push({\r\n name,\r\n value,\r\n });\r\n if (others != null) {\r\n const splittedName = name.split(\".\");\r\n const prefix = splittedName.shift();\r\n Object.keys(others)\r\n .filter((name) => name !== splittedName.join(\".\"))\r\n .forEach((name) => {\r\n changed.push({\r\n name: `${prefix}.${name}`,\r\n value: this._prepareOtherValueFor(\r\n name,\r\n others[name]\r\n ),\r\n });\r\n });\r\n }\r\n }\r\n return changed;\r\n };\r\n\r\n _handleDependenciesUpdate = (\r\n changed: Array,\r\n changeValue: Function\r\n ) => {\r\n const splittedName = changed[0].name.split(\".\");\r\n const currentLookupValues = this.getCurrentDependentLookupValues();\r\n // Bail early if only one Lookup is present\r\n if (currentLookupValues.length === 0) {\r\n return changeValue(changed);\r\n }\r\n currentLookupValues.push({\r\n name: splittedName[1],\r\n value: changed[0].value,\r\n });\r\n fetchFormLookupDependencies({\r\n isDoc: this.props.isDoc,\r\n formatId: this.props.formatId,\r\n itemUri: this.props.itemUri,\r\n name: this.props.name.substring(3),\r\n lookupType: this.props.lookupType,\r\n currentLookupValues,\r\n })\r\n .then((dependentLookups) => {\r\n dependentLookups.forEach((lookup) => {\r\n const _lookup = this._handleLookupValue(\r\n lookup.value,\r\n `${splittedName[0]}.${lookup.name}`\r\n );\r\n // append updated lookup & other values\r\n changed = changed.concat(_lookup);\r\n });\r\n changeValue(changed);\r\n })\r\n .catch((e) => {\r\n changeValue(changed);\r\n });\r\n };\r\n\r\n _onInputChange = (inputValue: string): void =>\r\n this.setState({ inputValue });\r\n\r\n _valueRenderer = (props: any) => {\r\n const { value } = props;\r\n switch (this.props.valueType) {\r\n case SearchValueType.Decimal:\r\n case SearchValueType.DecimalFieldOnly:\r\n return value.toLocaleString(userLanguage());\r\n default:\r\n const valueWithIcon = (\r\n \r\n );\r\n /* istanbul ignore next */\r\n return valueWithIcon != null ? (\r\n <>\r\n {valueWithIcon} {value}\r\n \r\n ) : (\r\n value\r\n );\r\n }\r\n };\r\n\r\n _optionRenderer = (props: any) => {\r\n // https://github.com/JedWatson/react-select/issues/3128#issuecomment-451936743\r\n const { onMouseMove, onMouseOver, ...rest } = props.innerProps;\r\n const newProps = Object.assign({}, props, { innerProps: rest });\r\n const ValueComponent = this._valueRenderer;\r\n ValueComponent.displayName = \"LookupEditorControl._valueRenderer\";\r\n return (\r\n Option && (\r\n \r\n {this.props.lookupType === FormLookupType.sf_ftlookup ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n );\r\n };\r\n\r\n render = () => (\r\n {\r\n /* istanbul ignore if */\r\n if (this.state.status === Constants.ERROR)\r\n return ;\r\n else {\r\n // only on mobile with values fallback to HTML select\r\n if (isHandheld() && this.props.values) {\r\n return (\r\n \r\n this._onChange(item, changeValue)\r\n }\r\n options={this.props.values}\r\n />\r\n );\r\n } else {\r\n // otherwise use full-featured react-select\r\n return (\r\n <>\r\n ({\r\n ...provided,\r\n width: \"100%\",\r\n minWidth: 120,\r\n whiteSpace: \"normal\",\r\n }),\r\n control: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n height: this.props.isMultiple\r\n ? \"auto\"\r\n : 34,\r\n minHeight: \"fit-content\",\r\n borderRadius: 0,\r\n boxShadow:\r\n \"inset 0 1px 1px rgba(0, 0, 0, 0.075)\",\r\n }),\r\n valueContainer:\r\n /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n padding: \"0px 6px\",\r\n minHeight: 34,\r\n }),\r\n input: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n margin: 0,\r\n padding: 0,\r\n }),\r\n dropdownIndicator:\r\n /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n padding: 4,\r\n }),\r\n indicatorSeparator:\r\n /* istanbul ignore next */ () => ({\r\n display: \"none\",\r\n }),\r\n clearIndicator:\r\n /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n padding: 0,\r\n }),\r\n menu: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n marginTop: 0,\r\n borderRadius: 0,\r\n width: \"auto\",\r\n minWidth: \"100%\",\r\n // left: -300, // to set the dropdown bigger than the field - needs work to align correctly (and to the right side!)\r\n // minWidth: 300,\r\n // zIndex: 1051\r\n }),\r\n menuPortal: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n zIndex: 9999,\r\n }),\r\n placeholder:\r\n /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n whiteSpace: \"nowrap\",\r\n color: \"hsl(0, 0%, 80%)\",\r\n }),\r\n option: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => {\r\n if (state.isSelected) {\r\n return Object.assign(\r\n {},\r\n provided,\r\n {\r\n boxShadow: \"none\",\r\n background: \"#0098AA\",\r\n textShadow: \"none\",\r\n cursor: \"pointer\",\r\n // border: \"1px solid #f5f5f5\"\r\n }\r\n );\r\n } else if (state.isFocused) {\r\n return Object.assign(\r\n {},\r\n provided,\r\n {\r\n boxShadow: \"none\",\r\n background: \"#f5f5f5\",\r\n textShadow: \"none\",\r\n cursor: \"pointer\",\r\n // border: \"1px solid #f5f5f5\"\r\n }\r\n );\r\n }\r\n return provided;\r\n },\r\n }}\r\n // async-paginate\r\n loadOptions={this.fetchLookup}\r\n debounceTimeout={300}\r\n additional={{\r\n pageNum: 0,\r\n }}\r\n cacheUniqs={[this.state.loadIndex]}\r\n onMenuClose={\r\n /*istanbul ignore next*/ () =>\r\n this.setState(\r\n (prevState: State) => ({\r\n loadIndex:\r\n prevState.loadIndex + 1,\r\n })\r\n )\r\n }\r\n // defaultOptions={true}\r\n // options\r\n getOptionLabel={\r\n /* istanbul ignore next */ (option: {\r\n T: \"\",\r\n }) => option.T\r\n }\r\n getOptionValue={\r\n /* istanbul ignore next */ (option: {\r\n K: \"\",\r\n T: \"\",\r\n }) =>\r\n this.props.useKeys\r\n ? option.K\r\n : option.T\r\n }\r\n filterOption={createFilter({\r\n ignoreAccents: false,\r\n })}\r\n // filterOption={createFilter({\r\n // ignoreCase: true,\r\n // ignoreAccents: false,\r\n // trim: true,\r\n // matchFrom: /* istanbul ignore next */ this\r\n // .props.useContains\r\n // ? \"any\"\r\n // : \"start\"\r\n // })}\r\n // behavior\r\n isClearable={true}\r\n openMenuOnFocus={true}\r\n // localizations\r\n placeholder={\r\n this.props.placeholder ||\r\n loc.t(\"common:validation.select\")\r\n }\r\n // selection\r\n onChange={\r\n /* istanbul ignore next */ (item) =>\r\n this._onChange(item, changeValue)\r\n }\r\n value={this._fixValue(value)}\r\n inputValue={this.state.inputValue}\r\n onInputChange={this._onInputChange}\r\n isMulti={this.props.isMultiple}\r\n delimiter=\",\"\r\n />\r\n {this.props.children}\r\n \r\n );\r\n }\r\n }\r\n }}\r\n {...this.props}\r\n value={this._fixValue(this.props.value)}\r\n />\r\n );\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (\r\n state: State,\r\n ownProps: Props\r\n) => ({\r\n changes: s.searchFormChangesSelector(state),\r\n formId:\r\n ownProps.lookupType === FormLookupType.sf_ftlookup\r\n ? s.searchFormIdSelector(state)\r\n : -1,\r\n ...ownProps,\r\n // #56024 disable FT lookup when offline\r\n isReadonly: s.isOnlineSelector(state)\r\n ? ownProps.isReadonly\r\n : ownProps.lookupType === FormLookupType.ea_ftlookup,\r\n});\r\n\r\nexport default connect(mapStateToProps)(LookupEditorControl);\r\n","// @flow\r\nimport React from \"react\";\r\nimport Modal from \"components/Modal\";\r\n// import Button from \"react-bootstrap/lib/Button\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { usePostMessageHandler } from \"hooks\";\r\nimport { ModalAction } from \"hooks/PostMessage/Actions\";\r\nimport LoadingIframe from \"components/LoadingIframe\";\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** url to open in modal */\r\n url: string,\r\n /** iframe name */\r\n name?: string,\r\n /** whether to open Modal in Docked mode */\r\n docked?: boolean,\r\n};\r\n\r\nexport const ExternalLinkModal = ({\r\n open,\r\n close,\r\n url,\r\n name,\r\n docked,\r\n}: Props) => {\r\n usePostMessageHandler({\r\n [ModalAction.Close]: close,\r\n [ModalAction.CloseLegacy]: close,\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n {name || url}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const openExternalLinkModal = createModal(ExternalLinkModal);\r\n","// @flow\r\nimport React, { useState, useCallback, useRef } from \"react\";\r\nimport { usePdfHighlightInput } from \"hooks\";\r\nimport FormGroup from \"react-bootstrap/lib/FormGroup\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport ClearableInput from \"@hs/clearable-input\";\r\nimport Avatar from \"components/User/Avatar\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./NoteInput.module.css\";\r\nimport { ActivityType, ItemNoteType, type ActivityDTO } from \"data/types\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** callback when user wants to add note\r\n * @param {ActivityDTO} activity new note to add\r\n */\r\n onEnter: (activity: ActivityDTO) => void,\r\n /** optional callback when user aborts note\r\n * @param {SyntheticMouseEvent<*>} e mouse event\r\n */\r\n onAbort?: (e: SyntheticMouseEvent<*>) => void,\r\n /** current userId */\r\n userId: number,\r\n /** optional: initial values */\r\n activity?: ActivityDTO,\r\n};\r\n\r\nexport const getNoteType = (type: string): string => {\r\n switch (type) {\r\n case ItemNoteType.PdfHighlight:\r\n return type.toLowerCase();\r\n default:\r\n if (type != null)\r\n console.info(\r\n `Unknown ItemNoteType: ${type}, fallback to default.`\r\n );\r\n return \"note\";\r\n }\r\n};\r\n\r\nconst NoteInput = ({\r\n onEnter,\r\n onAbort,\r\n userId,\r\n activity = { what: ActivityType.comment, extras: null, text: \"\" },\r\n}: Props) => {\r\n const noteRef = useRef(null);\r\n const [value, setValue] = useState(activity.text);\r\n const [noteExtras, setNoteExtras] = useState(activity.extras);\r\n\r\n const handleNoteExtras = useCallback(\r\n (extras) =>\r\n setNoteExtras(\r\n extras != null\r\n ? /* istanbul ignore next */ extras\r\n : activity.extras\r\n ),\r\n [activity.extras]\r\n );\r\n\r\n const { handleHighlight, handleSelect } = usePdfHighlightInput(\r\n handleNoteExtras,\r\n noteRef\r\n );\r\n\r\n const handleEnter = useCallback(\r\n (text: string) => {\r\n onEnter({\r\n ...activity,\r\n text,\r\n extras: noteExtras,\r\n }).then((result) => {\r\n /* istanbul ignore else */\r\n if (result) {\r\n handleHighlight(null);\r\n setValue(\"\");\r\n handleSelect();\r\n }\r\n });\r\n },\r\n [onEnter, noteExtras, activity, handleHighlight, handleSelect]\r\n );\r\n\r\n const handleAbort = useCallback(\r\n (e) => {\r\n typeof onAbort === \"function\" && onAbort(e);\r\n setNoteExtras(activity.extras);\r\n setValue(\"\");\r\n handleSelect();\r\n },\r\n [onAbort, activity.extras, handleSelect]\r\n );\r\n\r\n return (\r\n
\r\n \r\n {userId && }\r\n \r\n \r\n {((activity.extras == null && noteExtras != null) ||\r\n activity.text !== \"\" ||\r\n activity.extras != null ||\r\n value !== activity.text) && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\nNoteInput.displayName = \"NoteInput\";\r\nexport default NoteInput;\r\n","// @flow\r\nimport React, { useCallback, useEffect, useRef } from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport NoteInput, { getNoteType } from \"components/NoteInput\";\r\nimport {\r\n type ActivityDTO,\r\n type ActivityFieldDTO,\r\n ActivityType,\r\n ItemNoteType,\r\n ItemNoteTypeIcon,\r\n} from \"data/types\";\r\nimport Avatar from \"components/User/Avatar\";\r\nimport Table from \"react-bootstrap/lib/Table\";\r\nimport loc from \"i18next\";\r\nimport Badge from \"react-bootstrap/lib/Badge\";\r\nimport styles from \"./Activity.module.css\";\r\nimport ActionsMenu from \"components/ActionsMenu\";\r\nimport { LockInfoOn } from \"components/LockInfo\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** activity to render */\r\n activity: ActivityDTO,\r\n /** current user's id */\r\n userId: number,\r\n /** whether to show activities details\r\n * @default {boolean} false\r\n */\r\n showDetails?: boolean,\r\n /** whether to show the Actions menu\r\n * @default {boolean} false\r\n */\r\n showActions?: boolean,\r\n /** whether to render in edit state\r\n * @default {boolean} false\r\n */\r\n isEdit: boolean,\r\n /** set items edit state\r\n * @param {boolean} isEdit new isEdit state\r\n */\r\n isHighlighted: boolean,\r\n /** callback when user chooses an action\r\n * @param {boolean} false\r\n */\r\n isSelected?: boolean,\r\n /** whether this activity is the last version available\r\n * @default {boolean} false\r\n */\r\n isLastVersion?: boolean,\r\n /** callback when user chooses an action\r\n * @param {string} actionId action identifier\r\n * @param {?any} payload optional payload\r\n */\r\n onAction: (actionId: string, payload: ?any) => void,\r\n /** what action menu to display\r\n * @default {string} docactivity_context\r\n */\r\n actionMenu: string,\r\n};\r\n\r\nconst getCommentIconString = (activity) => {\r\n if (\r\n activity?.extras?.$type == null ||\r\n !Object.prototype.hasOwnProperty.call(\r\n ItemNoteTypeIcon,\r\n activity.extras.$type\r\n )\r\n )\r\n return ItemNoteTypeIcon[ItemNoteType.Default];\r\n return ItemNoteTypeIcon[activity.extras.$type];\r\n};\r\n\r\n/** Renders a list of activities */\r\nconst Activity = ({\r\n activity,\r\n userId,\r\n showDetails,\r\n showActions,\r\n isEdit,\r\n isHighlighted,\r\n isSelected,\r\n isLastVersion,\r\n onAction,\r\n actionMenu,\r\n}: Props) => {\r\n const renderWhatIcon = useCallback(() => {\r\n switch (activity.what) {\r\n case ActivityType.create:\r\n return ;\r\n case ActivityType.modifyContent:\r\n case ActivityType.modifyField:\r\n return ;\r\n case ActivityType.comment:\r\n return (\r\n \r\n onAction(\"filter_note\")\r\n }\r\n name={getCommentIconString(activity)}\r\n title={loc.t(\"activity:note.filter\")}\r\n />\r\n );\r\n default:\r\n return null;\r\n }\r\n }, [activity, onAction]);\r\n\r\n const renderWhat = useCallback((): string => {\r\n switch (activity.what) {\r\n case ActivityType.create:\r\n case ActivityType.modifyContent:\r\n case ActivityType.modifyField:\r\n case ActivityType.comment:\r\n return loc.t(`common:act.changes_${activity.what}`, {\r\n date: activity.on,\r\n });\r\n case ActivityType.locked:\r\n // TODO custom ActionsMenu for Locked activitys (unlock!)\r\n return ;\r\n default:\r\n return \"unknown what=\" + activity.what;\r\n }\r\n }, [activity]);\r\n\r\n const renderChange = useCallback(\r\n (change: ActivityFieldDTO, index: number) => (\r\n \r\n {change.caption}\r\n {change.newVal}\r\n {change.oldVal}\r\n \r\n ),\r\n []\r\n );\r\n\r\n const renderChanges = useCallback(\r\n () => (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {activity.changes.map((change, index) =>\r\n renderChange(change, index)\r\n )}\r\n \r\n
 {loc.t(\"common:act.changes_newVal\")}{loc.t(\"common:act.changes_oldVal\")}
\r\n
\r\n ),\r\n [activity, renderChange]\r\n );\r\n\r\n const activityRef = useRef(null);\r\n useEffect(() => {\r\n /* istanbul ignore else */\r\n if (isHighlighted && activityRef.current) {\r\n activityRef.current.scrollIntoView({\r\n block: \"center\",\r\n inline: \"center\",\r\n });\r\n }\r\n }, [isHighlighted]);\r\n\r\n const handleEnter: (activity: ActivityDTO) => Promise =\r\n useCallback(\r\n (activity: ActivityDTO) =>\r\n onAction(\"update_note\", activity).then(\r\n (result) => result && onAction(\"edit_note\", false)\r\n ),\r\n [onAction]\r\n );\r\n\r\n const handleAbort: (e: SyntheticMouseEvent<*>) => void = useCallback(\r\n (e) => e.stopPropagation() || onAction(\"edit_note\", false),\r\n [onAction]\r\n );\r\n\r\n const renderText = useCallback(() => {\r\n switch (activity.what) {\r\n case ActivityType.create:\r\n case ActivityType.modifyContent:\r\n case ActivityType.modifyField:\r\n if (activity.changes == null || activity.changes.length === 0)\r\n return null;\r\n return renderChanges();\r\n case ActivityType.comment:\r\n if (isEdit) {\r\n return (\r\n \r\n );\r\n } else {\r\n return

{activity.text}

;\r\n }\r\n case ActivityType.locked:\r\n return null;\r\n default:\r\n return \"unknown what=\" + activity.what;\r\n }\r\n }, [activity, isEdit, handleEnter, renderChanges, handleAbort]);\r\n\r\n const onShouldBeVisible = (action: { id: string }): boolean =>\r\n !(\r\n isLastVersion === true &&\r\n [\"sep\", \"restore\", \"delete\"].includes(action.id)\r\n );\r\n\r\n return (\r\n \r\n (!isEdit || (isEdit && !isHighlighted)) &&\r\n onAction(\"highlight_note\")\r\n }\r\n >\r\n
\r\n \r\n {activity.userName}\r\n {/* */}\r\n {renderWhatIcon()}\r\n {showActions &&\r\n [\r\n ActivityType.create,\r\n ActivityType.modifyContent,\r\n ActivityType.modifyField,\r\n ].includes(activity.what) && (\r\n \r\n \r\n {loc.t(\"common:version.text\", {\r\n version: activity.id,\r\n })}\r\n \r\n \r\n }\r\n name={actionMenu}\r\n className={styles.actions}\r\n onAction={onAction}\r\n onShouldBeVisible={onShouldBeVisible}\r\n />\r\n )}\r\n {activity.userId === userId &&\r\n activity.what === ActivityType.comment && (\r\n \r\n {!isEdit && (\r\n \r\n ((isEdit ||\r\n (!isEdit && isHighlighted)) &&\r\n e.stopPropagation()) ||\r\n onAction(\"edit_note\", true)\r\n }\r\n >\r\n \r\n \r\n )}\r\n {isEdit && (\r\n \r\n (isEdit && e.stopPropagation()) ||\r\n onAction(\"delete_note\")\r\n }\r\n >\r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n
{renderWhat()}
\r\n
\r\n \r\n {renderText(activity)}\r\n \r\n \r\n );\r\n};\r\nActivity.displayName = \"Activity\";\r\nActivity.defaultProps = {\r\n showDetails: false,\r\n showActions: false,\r\n isSelected: false,\r\n actionMenu: \"docactivity_context\",\r\n};\r\nexport default Activity;\r\n","// @flow\r\nimport React, { useState, useCallback, useEffect } from \"react\";\r\nimport { usePdfHighlightActivityList } from \"hooks\";\r\nimport {\r\n type ActivityDTO,\r\n ActivityType,\r\n ItemNoteType,\r\n type ItemNoteTypeEnum,\r\n} from \"data/types\";\r\nimport loc from \"i18next\";\r\nimport Activity from \"./Activity\";\r\n\r\ntype ActionCallback = (actionId: string, payload: T | number) => any;\r\ntype ActionFactory = (item: T, index: number) => ActionCallback;\r\n\r\ntype Props = {\r\n /** list of activities */\r\n items: Array,\r\n /** current user's id */\r\n userId: number,\r\n /** whether to show activities details */\r\n showDetails: boolean,\r\n /** whether to show history menu\r\n * @default {boolean} true\r\n */\r\n showActions?: boolean,\r\n /** whether to show notes (comment) entries */\r\n showNotes: boolean,\r\n /** whether to show history entries */\r\n showHistory: boolean,\r\n /** which version should be selected\r\n * 0 to show latest\r\n */\r\n currentVersion: number,\r\n /** callback when user chooses an action\r\n * @param {string} actionId action identifier\r\n * @param {ActivityDTO | number} payload payload or activity row index\r\n */\r\n onAction: ActionCallback,\r\n /** whether ActivityList is read-only */\r\n isReadOnly?: boolean,\r\n};\r\n\r\n/** Renders a list of activities */\r\nconst ActivityList = ({\r\n items,\r\n userId,\r\n showDetails,\r\n showNotes = true,\r\n showHistory = true,\r\n showActions = true,\r\n currentVersion,\r\n onAction,\r\n isReadOnly = false,\r\n}: Props) => {\r\n const [edit, setEdit] = useState(null);\r\n const [commentType, setCommentType] = useState(null);\r\n\r\n const [highlight, handleHighlight] = usePdfHighlightActivityList(\r\n items,\r\n userId,\r\n setEdit,\r\n onAction\r\n );\r\n\r\n const handleAction: ActionFactory = useCallback(\r\n (item: ActivityDTO, index: number) => (\r\n actionId: string,\r\n payload: any = index\r\n ) => {\r\n switch (actionId) {\r\n case \"filter_note\":\r\n const itemCommentType: ItemNoteTypeEnum =\r\n (item.what === ActivityType.comment &&\r\n item.extras &&\r\n item.extras.$type) ||\r\n ItemNoteType.Default;\r\n return setCommentType(\r\n commentType !== itemCommentType ? itemCommentType : null\r\n );\r\n case \"edit_note\":\r\n return setEdit(payload ? item.id : null);\r\n case \"highlight_note\":\r\n return handleHighlight(highlight !== item.id ? item : null);\r\n case \"update_note\":\r\n return onAction(actionId, payload).then((success) => {\r\n /* istanbul ignore else */\r\n if (success) setEdit(null);\r\n return success;\r\n });\r\n case \"delete_note\":\r\n return onAction(actionId, payload).then((success) => {\r\n /* istanbul ignore else */\r\n if (success) {\r\n setEdit(null);\r\n handleHighlight(null);\r\n }\r\n return success;\r\n });\r\n default:\r\n return onAction(actionId, payload);\r\n }\r\n },\r\n [commentType, highlight, handleHighlight, onAction]\r\n );\r\n\r\n const filterType = useCallback(\r\n (item: ActivityDTO): boolean => {\r\n if (commentType != null)\r\n return (\r\n showNotes &&\r\n item.what === ActivityType.comment &&\r\n ((item.extras && item.extras.$type === commentType) ||\r\n (!item.extras && commentType === ItemNoteType.Default))\r\n );\r\n if (item.what === ActivityType.comment) return showNotes;\r\n return showHistory;\r\n },\r\n [commentType, showHistory, showNotes]\r\n );\r\n\r\n useEffect(() => {\r\n // Reset CommentType\r\n if (items.filter(filterType).length === 0) setCommentType(null);\r\n }, [filterType, items]);\r\n\r\n if (!showNotes && !showHistory)\r\n return
{loc.t(\"activity:list.invalid\")}
;\r\n let lastVersionId = 1;\r\n const totalVersions = items.reduce((accumulator, item: ActivityDTO) => {\r\n if (item.what !== ActivityType.comment) {\r\n lastVersionId = item.id;\r\n return accumulator + 1;\r\n }\r\n return accumulator;\r\n }, 0);\r\n\r\n return (\r\n <>\r\n {items.map(\r\n (item: ActivityDTO, index: number) =>\r\n filterType(item) && (\r\n 1 && showActions}\r\n onAction={handleAction(item, index)}\r\n />\r\n )\r\n )}\r\n \r\n );\r\n};\r\nActivityList.displayName = \"ActivityList\";\r\nexport default ActivityList;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { type CleanupKeepInfoDTO, CleanupKeepVersionType } from \"data/types\";\r\nimport Alert from \"react-bootstrap/lib/Alert\";\r\nimport loc from \"i18next\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\n\r\ntype Props = {\r\n /** info object for Cleanup Keep Version */\r\n info: ?CleanupKeepInfoDTO,\r\n /** optional custom CSS class to apply */\r\n className?: string,\r\n};\r\n\r\nconst CleanupKeepInfo = ({ info, className }: Props) => {\r\n // no message if keeping them all\r\n if (info == null || info.type === CleanupKeepVersionType.All) return null;\r\n return (\r\n \r\n {\" \"}\r\n {loc.t(`docactivity:keep.${info.type}`, { count: info.count })}\r\n \r\n );\r\n};\r\nCleanupKeepInfo.displayName = \"CleanupKeepInfo\";\r\nexport default CleanupKeepInfo;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { type RetentionInfoDTO, RetentionType } from \"data/types\";\r\nimport Alert from \"react-bootstrap/lib/Alert\";\r\nimport loc from \"i18next\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\n\r\ntype Props = {\r\n /** info object for Retention */\r\n info: ?RetentionInfoDTO,\r\n /** optional custom CSS class to apply */\r\n className?: string,\r\n};\r\n\r\nconst RetentionInfo = ({ info, className }: Props) => {\r\n // no message if default\r\n if (info == null || info.type === RetentionType.Default) return null;\r\n return (\r\n \r\n {\" \"}\r\n {loc.t(`docactivity:retention.${info.type}`, {\r\n months: info.months,\r\n })}\r\n \r\n );\r\n};\r\nRetentionInfo.displayName = \"RetentionInfo\";\r\nexport default RetentionInfo;\r\n","// @flow\r\nimport React, { useCallback } from \"react\";\r\nimport {\r\n type ActivityDTO,\r\n type CleanupKeepInfoDTO,\r\n type RetentionInfoDTO,\r\n} from \"data/types\";\r\nimport { isFeatureOn, Feature } from \"data/constants\";\r\nimport ActivityList from \"./ActivityList\";\r\nimport Status from \"components/Status\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport CleanupKeepInfo from \"./CleanupKeepInfo\";\r\nimport RetentionInfo from \"./RetentionInfo\";\r\nimport NoteInput from \"components/NoteInput\";\r\nimport styles from \"./Activities.module.css\";\r\n\r\ntype Props = {\r\n /** optional status defaults to OK*/\r\n status?: ConstantsEnum,\r\n /** list of activities */\r\n items: Array,\r\n /** cleanup keep versions info */\r\n cleanupKeepInfo: ?CleanupKeepInfoDTO,\r\n /** retention info */\r\n retentionInfo: ?RetentionInfoDTO,\r\n /** callback when user chooses an action\r\n * @param {string} actionId action identifier\r\n * @param {string} index activity row index\r\n */\r\n onAction: (actionId: string, index: number) => void,\r\n /** which version should be selected\r\n * 0 to show latest\r\n */\r\n currentVersion: number,\r\n /** whether to show all details */\r\n showDetails: boolean,\r\n /** whether to allow adding notes */\r\n showAddNote: boolean,\r\n /** whether to show notes (comment) entries */\r\n showNotes: boolean,\r\n /** whether to show history entries */\r\n showHistory: boolean,\r\n /** whether to show history menu */\r\n showActions: boolean,\r\n /** whether to show retention info */\r\n showRetentionInfo: boolean,\r\n /** current userId */\r\n userId: number,\r\n /** whether activities are read-only */\r\n isReadOnly: boolean,\r\n};\r\n\r\n/**\r\n * renders a list of document's activities\r\n */\r\nconst Activities = ({\r\n status = Constants.OK,\r\n items,\r\n cleanupKeepInfo,\r\n retentionInfo,\r\n onAction,\r\n currentVersion,\r\n showDetails,\r\n showAddNote,\r\n showNotes,\r\n showHistory,\r\n showActions,\r\n showRetentionInfo,\r\n userId,\r\n isReadOnly,\r\n}: Props) => {\r\n const handleEnter: (activity: ActivityDTO) => Promise =\r\n useCallback((activity) => onAction(\"add_note\", activity), [onAction]);\r\n return (\r\n
\r\n \r\n {showRetentionInfo && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n \r\n {showAddNote && !isReadOnly && isFeatureOn(Feature.noteService) && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nActivities.displayName = \"Activities\";\r\nexport default Activities;\r\n\r\n// const useScrollToBottom = ({ className }) => {\r\n// React.useEffect(() => {\r\n// const elems = document.getElementsByClassName(className);\r\n// if (elems.length === 1) {\r\n// elems[0].scrollTo(0, elems[0].scrollHeight);\r\n// }\r\n// }, [className]);\r\n// };\r\n\r\n// actEnd: HTMLDivElement | null;\r\n\r\n// componentDidMount = () => this._scrollToBottom();\r\n\r\n// // componentDidUpdate = () => this._scrollToBottom();\r\n\r\n// _scrollToBottom = (smooth?: boolean) => {\r\n// if (\r\n// this.actEnd != null &&\r\n// typeof this.actEnd.scrollIntoView === \"function\"\r\n// ) {\r\n// if (smooth === true)\r\n// this.actEnd.scrollIntoView({ behavior: \"smooth\" });\r\n// else this.actEnd.scrollIntoView();\r\n// }\r\n// };\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport Constants, {\r\n getDefaultsConfig,\r\n type ConstantsEnum,\r\n} from \"data/constants\";\r\nimport {\r\n fetchActivities,\r\n addItemNote,\r\n updateItemNote,\r\n deleteItemNote,\r\n delDocVersion,\r\n restoreDocVersion,\r\n} from \"data/api\";\r\nimport Activities from \"components/Activities\";\r\nimport Status from \"components/Status\";\r\nimport {\r\n ServerEventActionType,\r\n ServerEventItemType,\r\n type UserInfoResultDTO,\r\n type ActivitiesDTO,\r\n} from \"data/types\";\r\nimport GlobalEventsHandler from \"containers/GlobalEventsHandler\";\r\nimport { openConfirmModal } from \"components/ConfirmModal\";\r\nimport loc from \"i18next\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport moment from \"moment\";\r\nimport Moment from \"containers/Moment\";\r\nimport withOfflineHandler from \"containers/OfflineHandler\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\n\r\ntype Props = {\r\n isDoc: boolean,\r\n /** the current itemUri */\r\n itemUri: ?string,\r\n /** the current formatId */\r\n formatId: ?number,\r\n /** Redux: the current User object */\r\n user: UserInfoResultDTO,\r\n /** GlobalEventsHandler.refreshId */\r\n refreshId: number,\r\n /** which version should be selected\r\n * 0 to show latest\r\n */\r\n currentVersion?: number,\r\n /** callback when user wants to see a specific version\r\n * @param {number} version which version to display\r\n * @param {number} itemUri itemUri including version\r\n */\r\n onShowVersion?: (version: number, itemUri: string) => void,\r\n /** whether to allow adding notes\r\n * @default {boolean} true\r\n */\r\n showAddNote?: boolean,\r\n /** whether to show notes (comment) entries\r\n * @default {boolean} true\r\n */\r\n showNotes?: boolean,\r\n /** whether to show history entries\r\n * @default {boolean} true\r\n */\r\n showHistory?: boolean,\r\n /** whether to show history menu\r\n * @default {boolean} true\r\n */\r\n showActions?: boolean,\r\n /** whether to show retention info\r\n * @default {boolean} true\r\n */\r\n showRetentionInfo?: boolean,\r\n /** whether activities are read-only\r\n * @default {boolean} false\r\n */\r\n isReadOnly?: boolean,\r\n};\r\n\r\ntype State = {\r\n status: ConstantsEnum,\r\n result: ?ActivitiesDTO,\r\n showDetails: boolean,\r\n /** whether to allow adding notes\r\n * @default {boolean} true\r\n */\r\n showAddNote?: boolean,\r\n /** whether to show notes (comment) entries\r\n * @default {boolean} true\r\n */\r\n showNotes?: boolean,\r\n /** whether to show history entries\r\n * @default {boolean} true\r\n */\r\n showHistory?: boolean,\r\n /** whether to show history menu\r\n * @default {boolean} true\r\n */\r\n showActions?: boolean,\r\n /** whether to show retention info\r\n * @default {boolean} true\r\n */\r\n showRetentionInfo?: boolean,\r\n};\r\n\r\n// TODO this will need refactoring once inPoint implemented Folder versioning\r\nexport class ActivitiesContainer extends PureComponent {\r\n state = {\r\n status: Constants.LOADING,\r\n result: null,\r\n showDetails: false,\r\n showAddNote: this.props.showAddNote || true,\r\n showNotes: this.props.showNotes || true,\r\n showHistory: this.props.showHistory || true,\r\n showActions: this.props.showActions || true,\r\n showRetentionInfo: this.props.showRetentionInfo || true,\r\n };\r\n\r\n static defaultProps = {\r\n currentVersion: 0,\r\n isReadOnly: false,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n moment.locale(userLanguage());\r\n this.format = `${moment.localeData().longDateFormat(\"L\")} ${moment\r\n .localeData()\r\n .longDateFormat(\"LTS\")}`;\r\n }\r\n\r\n componentDidMount = () => {\r\n this._fetch();\r\n this._setActivityListDefaults();\r\n };\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (prevProps.itemUri !== this.props.itemUri) {\r\n this.setState(\r\n {\r\n status: Constants.LOADING,\r\n result: null,\r\n },\r\n () => {\r\n this._fetch();\r\n this._setActivityListDefaults();\r\n }\r\n );\r\n } else if (prevProps.refreshId !== this.props.refreshId) {\r\n this.setState(\r\n {\r\n status: Constants.LOADING,\r\n },\r\n () => this._fetch()\r\n );\r\n }\r\n }\r\n\r\n _fetch() {\r\n const { itemUri, offlineHandler } = this.props;\r\n if (itemUri != null) {\r\n offlineHandler\r\n .factory(fetchActivities)(itemUri)\r\n .catch((err) => {\r\n this.setState({\r\n status: Constants.ERROR,\r\n });\r\n return null;\r\n })\r\n .then((result: ActivitiesDTO) => {\r\n if (result != null) {\r\n this.setState({\r\n status: Constants.OK,\r\n result,\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n _setActivityListDefaults = () => {\r\n const defaults = getDefaultsConfig(\r\n this.props.itemUri,\r\n this.props.formatId\r\n );\r\n if (\r\n defaults == null ||\r\n !Object.prototype.hasOwnProperty.call(defaults, \"activityList\")\r\n ) {\r\n return;\r\n }\r\n this.setState({ ...defaults.activityList });\r\n };\r\n\r\n _onAddNote = (activity: ActivityDTO) => {\r\n if (this.props.itemUri == null) {\r\n toastActionResult(false, \"activity:note.notallowed\");\r\n return new Promise((resolve) => resolve(false));\r\n }\r\n activity.itemUri = this.props.itemUri;\r\n return addItemNote(activity)\r\n .then(() => true)\r\n .catch((err) => {\r\n console.warn(err);\r\n toastActionResult(false, \"activity:note.add\");\r\n return false;\r\n });\r\n };\r\n\r\n /* add additional checks here (e.g. date based) */\r\n _canUserUpdateOrDelete = (activity: ActivityDTO): boolean =>\r\n activity != null &&\r\n this.props.itemUri === activity.itemUri &&\r\n this.props.user.id === activity.userId;\r\n\r\n _onUpdateNote = (activity: ActivityDTO): Promise => {\r\n activity.itemUri = this.props.itemUri;\r\n if (!this._canUserUpdateOrDelete(activity)) {\r\n toastActionResult(false, \"activity:note.notallowed\");\r\n return new Promise((resolve) => resolve(false));\r\n }\r\n return updateItemNote(activity)\r\n .then(() => true)\r\n .catch((err) => {\r\n console.warn(err);\r\n toastActionResult(false, \"activity:note.update\");\r\n return false;\r\n });\r\n };\r\n\r\n _onDeleteNote = (activity: ActivityDTO): Promise => {\r\n activity.id = activity.id && Math.abs(activity.id);\r\n activity.itemUri = this.props.itemUri;\r\n if (!this._canUserUpdateOrDelete(activity)) {\r\n toastActionResult(false, \"activity:note.notallowed\");\r\n return new Promise((resolve) => resolve(false));\r\n }\r\n return openConfirmModal({\r\n body: loc.t(\"activity:note.delete.confirmBody\"),\r\n confirmButton: loc.t(\"activity:note.delete.confirmYes\"),\r\n }).then(async (confirmed) => {\r\n /* istanbul ignore else */\r\n if (confirmed === true) {\r\n try {\r\n const deleted = await deleteItemNote(\r\n this.props.itemUri,\r\n activity.id\r\n );\r\n if (!deleted)\r\n toastActionResult(false, \"activity:note.delete\");\r\n return deleted;\r\n } catch (err) {\r\n console.warn(err);\r\n toastActionResult(false, \"activity:note.delete\");\r\n return false;\r\n }\r\n }\r\n return false;\r\n });\r\n };\r\n\r\n _toggleDetails = () =>\r\n this.setState((prevState: State) => ({\r\n showDetails: !prevState.showDetails,\r\n }));\r\n\r\n _onAction = (actionId: string, payload: any) => {\r\n const activity =\r\n (typeof payload === \"number\" && this.state.result.items[payload]) ||\r\n {};\r\n const version = activity.id;\r\n const itemUriWithVersion = activity.itemUri;\r\n switch (actionId) {\r\n case \"view\":\r\n /* istanbul ignore else */\r\n if (typeof this.props.onShowVersion === \"function\")\r\n this.props.onShowVersion(version, itemUriWithVersion);\r\n break;\r\n case \"download\":\r\n CommandActionHandler(\"doc_download\", {\r\n itemUri: itemUriWithVersion,\r\n });\r\n break;\r\n case \"popout\":\r\n CommandActionHandler(\"doc_preview\", {\r\n itemUri: itemUriWithVersion,\r\n newWindow: true,\r\n });\r\n break;\r\n case \"details\":\r\n this._toggleDetails();\r\n break;\r\n case \"restore\":\r\n openConfirmModal({\r\n body: loc.t(\r\n \"docactivity_context:action_restore.confirmBody\"\r\n ),\r\n }).then((confirmed) => {\r\n if (confirmed === true) {\r\n this.restoreVersion(version);\r\n }\r\n });\r\n break;\r\n case \"delete\":\r\n openConfirmModal({\r\n body: loc.t(\r\n \"docactivity_context:action_delete.confirmBody\"\r\n ),\r\n confirmButton: loc.t(\"common:delete\"),\r\n }).then((confirmed) => {\r\n if (confirmed === true) {\r\n this.deleteVersion(version);\r\n }\r\n });\r\n break;\r\n case \"add_note\":\r\n return this._onAddNote(payload);\r\n case \"update_note\":\r\n return this._onUpdateNote(payload);\r\n case \"delete_note\":\r\n return this._onDeleteNote(activity);\r\n /* istanbul ignore next */\r\n default:\r\n console.warn(actionId);\r\n break;\r\n }\r\n };\r\n\r\n restoreVersion = (version: number) => {\r\n this.setState({ status: Constants.LOADING }, () => {\r\n restoreDocVersion(this.props.itemUri, version)\r\n .catch((err) => {\r\n console.warn(err);\r\n return null;\r\n })\r\n .then((success) => {\r\n // notify user\r\n toastActionResult(\r\n success === true,\r\n \"docactivity_context:action_restore\"\r\n );\r\n // refresh\r\n if (success === true) {\r\n // show new @latest version\r\n /* istanbul ignore else */\r\n if (typeof this.props.onShowVersion === \"function\")\r\n this.props.onShowVersion(0, this.props.itemUri);\r\n // refetch activity list\r\n this._fetch();\r\n } else {\r\n this.setState({\r\n status: Constants.ERROR,\r\n });\r\n }\r\n });\r\n });\r\n };\r\n\r\n deleteVersion = (version: number) => {\r\n this.setState({ status: Constants.LOADING }, () => {\r\n delDocVersion(this.props.itemUri, version)\r\n .catch((err) => {\r\n console.warn(err);\r\n return null;\r\n })\r\n .then((success) => {\r\n // notify user\r\n toastActionResult(\r\n success === true,\r\n \"docactivity_context:action_delete\"\r\n );\r\n // refresh\r\n if (success === true) {\r\n // in case it was selected reset to latest\r\n /* istanbul ignore else */\r\n\r\n if (\r\n this.props.currentVersion === version &&\r\n typeof this.props.onShowVersion === \"function\"\r\n ) {\r\n this.props.onShowVersion(0, this.props.itemUri);\r\n }\r\n // re-fetch activity list\r\n this._fetch();\r\n } else {\r\n this.setState({\r\n status: Constants.ERROR,\r\n });\r\n }\r\n });\r\n });\r\n };\r\n\r\n render() {\r\n const { status, result } = this.state;\r\n if (result != null && status !== Constants.ERROR) {\r\n return (\r\n \r\n );\r\n }\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\n// apply Redux Store state to Component Properties\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n user: state.user,\r\n});\r\n\r\nexport default compose(\r\n connect(mapStateToProps),\r\n GlobalEventsHandler({\r\n items: [\r\n ServerEventItemType.document,\r\n ServerEventItemType.task,\r\n ServerEventItemType.activity,\r\n ],\r\n actions: [\r\n ServerEventActionType.add,\r\n ServerEventActionType.modify,\r\n ServerEventActionType.edit,\r\n ServerEventActionType.delete,\r\n ServerEventActionType.refresh,\r\n ],\r\n }),\r\n Moment,\r\n withOfflineHandler\r\n)(ActivitiesContainer);\r\n","// @flow\r\nimport React from \"react\";\r\nimport InputGroup from \"react-bootstrap/lib/InputGroup\";\r\nimport FormControl from \"react-bootstrap/lib/FormControl\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport { ParseArea, AreaToString } from \"components/MapViewer/utils\";\r\nimport {\r\n SupportGeoAreaEdit,\r\n getGeoAreaProvider,\r\n} from \"components/MapViewer/providerSupport\";\r\nimport { openMapModal } from \"components/MapModal\";\r\nimport styles from \"./GeoAreaInput.module.css\";\r\n\r\ntype Props = {\r\n /** displayName of field */\r\n label: ?string,\r\n /** current area in string format */\r\n value: ?string,\r\n /** whether to show an icon before the text field */\r\n showIcon: boolean,\r\n /** callback when user sets location\r\n * @param {string} value new area path in string format\r\n */\r\n onChange: (value: string) => void,\r\n /** callback when user sets area path by map\r\n * @param {string} area area coordinates\r\n */\r\n onManualArea?: (area: string) => void,\r\n /** optional CSS class to apply to root element */\r\n className?: string,\r\n /** placeholder text to display when @see {value} is empty */\r\n placeholder?: string,\r\n};\r\n\r\ntype State = {\r\n value: ?string,\r\n};\r\n\r\nclass GeoAreaInput extends React.PureComponent {\r\n static defaultProps = {\r\n showIcon: true,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n value: props.value,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n if (prevProps.value !== this.props.value) {\r\n this.setState({ value: this.props.value });\r\n }\r\n }\r\n\r\n /** change location input text value */\r\n changeValue = (e) =>\r\n this.setState({ value: e.target.value }, () =>\r\n this.props.onChange(this.state.value)\r\n );\r\n\r\n /** show map and allow user to change marker's location */\r\n _setAreaManually = () =>\r\n openMapModal({\r\n mapProvider: getGeoAreaProvider(),\r\n useMarker: false,\r\n setButtonLabel: loc.t(\"common:map.setArea\"),\r\n locations: [\r\n {\r\n attribute: this.props.label,\r\n label: this.props.label,\r\n allowEdit: true, // allow dragging/editing\r\n area: ParseArea(\r\n this.state.value != null &&\r\n String(this.state.value).length > 0\r\n ? this.state.value\r\n : \"0,0;0,0;0,0\"\r\n ),\r\n },\r\n ],\r\n onSet: (editLocationResult: MapEditLocationResult) => {\r\n this.props.onManualArea(AreaToString(editLocationResult.area));\r\n },\r\n });\r\n\r\n render = () => (\r\n \r\n {this.props.showIcon && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n {SupportGeoAreaEdit() && (\r\n \r\n \r\n \r\n )}\r\n \r\n {this.props.children}\r\n \r\n );\r\n}\r\nexport default GeoAreaInput;\r\n","import React from \"react\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\nimport GeoAreaInput from \"components/GeoAreaInput\";\r\n\r\nconst GeoAreaEditorControl = (props) => (\r\n (\r\n \r\n changeValue({ currentTarget: { value } })\r\n }\r\n onManualArea={\r\n /* istanbul ignore next */ (value: string) =>\r\n changeValue({ currentTarget: { value } })\r\n }\r\n placeholder={props.placeholder}\r\n />\r\n )}\r\n {...props}\r\n />\r\n);\r\nGeoAreaEditorControl.displayName = \"GeoAreaEditorControl\";\r\nexport default GeoAreaEditorControl;\r\n","import { combineReducers } from \"redux\";\r\nimport togglesReducer from \"./togglesReducer\";\r\nimport userReducer from \"./userReducer\";\r\nimport loginReducer from \"./loginReducer\";\r\nimport formReducer from \"./formReducer\";\r\nimport cardsReducer from \"./cardsReducer\";\r\nimport workflowReducer from \"./workflowReducer\";\r\nimport panesReducer from \"./panesReducer\";\r\nimport treeReducer from \"./treeReducer\";\r\nimport docsReducer from \"./docsReducer\";\r\nimport thumbnailsReducer from \"./thumbnailsReducer\";\r\nimport docsLayoutReducer from \"./docsLayoutReducer\";\r\nimport settingsReducer from \"./settingsReducer\";\r\nimport breadcrumbReducer from \"./breadcrumbReducer\";\r\nimport favoritesReducer from \"./favoritesReducer\";\r\nimport globalSearchReducer from \"./globalSearchReducer\";\r\nimport currentItemReducer from \"./currentItemReducer\";\r\nimport searchReducer from \"./searchReducer\";\r\nimport searchFormsReducer from \"./searchFormsReducer\";\r\nimport globalEventsReducer from \"./globalEventsReducer\";\r\nimport offlineReducer from \"./offlineReducer\";\r\nimport serviceWorkerReducer from \"./serviceWorkerReducer\";\r\nimport notificationReducer from \"./notificationReducer\";\r\nimport commandActionReducer from \"./commandActionReducer\";\r\n// import { reducer as oidcReducer } from \"redux-oidc\";\r\nimport { createResponsiveStateReducer } from \"redux-responsive\";\r\nimport transform from \"lodash/transform\";\r\nimport uppyRedux from \"@uppy/store-redux\";\r\nimport { reducer as networkReducer } from \"redux-saga-network-status\";\r\n\r\nconst appReducers = combineReducers({\r\n // oidc: oidcReducer,\r\n toggles: togglesReducer,\r\n user: userReducer,\r\n offline: offlineReducer,\r\n login: loginReducer,\r\n favorites: favoritesReducer,\r\n cards: cardsReducer,\r\n workflow: workflowReducer,\r\n tree: treeReducer,\r\n docs: docsReducer,\r\n thumbnails: thumbnailsReducer,\r\n docsLayout: docsLayoutReducer,\r\n panes: panesReducer,\r\n settings: settingsReducer,\r\n breadcrumb: breadcrumbReducer,\r\n globalSearch: globalSearchReducer,\r\n current: currentItemReducer,\r\n search: searchReducer,\r\n searchForms: searchFormsReducer,\r\n form: formReducer,\r\n globalEvents: globalEventsReducer,\r\n sw: serviceWorkerReducer,\r\n network: networkReducer,\r\n commandAction: commandActionReducer,\r\n browser: createResponsiveStateReducer(null, {\r\n extraFields: ({ greaterThan, is }) => ({\r\n // greaterThanOrEqual is built by transforming greaterThan\r\n greaterThanOrEqual: transform(\r\n greaterThan,\r\n (result, value, mediaType) => {\r\n // and combining the value with the `is` field\r\n result[mediaType] = value || is[mediaType];\r\n },\r\n {}\r\n ),\r\n }),\r\n }),\r\n uppy: uppyRedux.reducer,\r\n notification: notificationReducer,\r\n});\r\n\r\nexport default appReducers;\r\n","import { openConfirmModal } from \"components/ConfirmModal\";\r\nimport loc from \"i18next\";\r\n\r\nexport const openConflictModal = (name: string): Promise =>\r\n openConfirmModal({\r\n title: loc.t(\"common:conflict.title\", {\r\n name,\r\n }),\r\n body: loc.t(\"common:conflict.message\"),\r\n confirmButton: loc.t(\"common:conflict.overwrite\"),\r\n cancelButton: loc.t(\"common:conflict.cancel\"),\r\n requireSelection: true,\r\n });\r\n","// @flow\r\nimport React from \"react\";\r\nimport { openItemActionPanel } from \"components/ItemActionPanel\";\r\nimport Thumbnail from \"components/DocListSimple/Thumbnail\";\r\nimport store from \"data/store\";\r\n\r\nexport const openSearchResultActionPanel = ({\r\n row,\r\n ...contextProps\r\n}: {\r\n row: Object,\r\n}) =>\r\n openItemActionPanel({\r\n title: row.title,\r\n ext: row.ext,\r\n contextProps: {\r\n ...contextProps,\r\n itemUri: row.itemUri,\r\n name: row.title,\r\n ext: row.ext,\r\n isDoc: row.isDoc,\r\n formatId: row.breadcrumb.formatId,\r\n },\r\n breadcrumb: row.breadcrumb,\r\n thumbnail: row.isDoc && (\r\n \r\n ),\r\n attributes: row.attributes,\r\n targetView: row.targetView,\r\n });\r\n","// @flow\r\nimport React from \"react\";\r\nimport ItemActions from \"./ItemActions\";\r\nimport {\r\n type ItemActionConfig,\r\n type ItemActionCategoryConfig,\r\n} from \"data/types\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport Divider from \"components/Divider\";\r\nimport styles from \"./ActionCategory.module.css\";\r\n\r\ntype Props = {\r\n /** current category to render */\r\n category: ItemActionCategoryConfig,\r\n /** list of all actions (will be filtered by category.category) */\r\n actions?: Array,\r\n /** callback when user clicks an action */\r\n onAction?: (action: ItemActionConfig) => void,\r\n /** optional children (if actions not provided) */\r\n children?: React.Node,\r\n};\r\n\r\n/**\r\n * renders a category and all it's defined actions\r\n */\r\nconst ActionCategory = ({ category, actions, onAction, children }: Props) => {\r\n const catActions =\r\n actions && actions.filter((action) => action.category === category.id);\r\n if (\r\n (catActions == null || catActions.length === 0) &&\r\n typeof onAction === \"function\"\r\n )\r\n return null;\r\n\r\n const content = catActions ? (\r\n \r\n ) : (\r\n children\r\n );\r\n if (category.renderHeader === false) {\r\n return content;\r\n } else {\r\n return (\r\n \r\n {getLocalizedText(category.name)}\r\n {category.icon && (\r\n \r\n )}\r\n \r\n }\r\n >\r\n {content}\r\n \r\n );\r\n }\r\n};\r\n\r\nActionCategory.displayName = \"ActionCategory\";\r\nexport default ActionCategory;\r\n","// @flow\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport loc from \"i18next\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport { type ItemStatusesDTO, ItemStatuses, ItemLinkType } from \"data/types\";\r\nimport Icons from \"@hs/icons\";\r\n\r\nconst itemStatusMapping = {\r\n [ItemStatuses.Reminder]: Icons.Reminder,\r\n [ItemStatuses.Share]: Icons.Share,\r\n [ItemStatuses.Relation]: Icons.Relation,\r\n [ItemStatuses.PDF]: Icons.Pdf,\r\n [ItemStatuses.WFReport]: Icons.WorkflowReport,\r\n [ItemStatuses.Note]: Icons.Notes,\r\n [ItemStatuses.Link]: Icons.Link,\r\n [ItemStatuses.MailHasAttachment]: Icons.Email.Attachment,\r\n [ItemStatuses.MailReplied]: Icons.Email.Replied,\r\n [ItemStatuses.MailForwarded]: Icons.Email.Forwarded,\r\n [ItemStatuses.Locked]: Icons.Locked,\r\n [ItemStatuses.CloudSync]: Icons.Cloud,\r\n};\r\n\r\nconst getPropsForItemStatus = (\r\n status: ItemStatusesDTO,\r\n itemUri: string,\r\n /** callback when user clicks on More... Button\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n */\r\n onMoreClick?: (e: SyntheticMouseEvent) => void\r\n) => {\r\n switch (status) {\r\n case 1: //ItemStatuses.Reminder\r\n return typeof onMoreClick === \"function\"\r\n ? {\r\n style: {\r\n cursor: \"pointer\",\r\n },\r\n onClick: onMoreClick,\r\n }\r\n : {};\r\n case 16: //ItemStatuses.WFReport\r\n return {\r\n style: {\r\n cursor: \"pointer\",\r\n },\r\n onClick: () =>\r\n CommandActionHandler(\"doc_related\", {\r\n itemUri,\r\n itemLinkType: ItemLinkType.WorkflowReport,\r\n }),\r\n };\r\n case 8192: //ItemStatuses.CloudSync\r\n return {\r\n style: {\r\n cursor: \"pointer\",\r\n },\r\n onClick: (e: SyntheticMouseEvent) =>\r\n CommandActionHandler(\"doc_editCloud\", {\r\n itemUri,\r\n onlineEditor: !(e.ctrlKey || e.altKey),\r\n }),\r\n };\r\n default:\r\n return {};\r\n }\r\n};\r\n\r\nconst ItemStatusIcons = ({\r\n itemStatus,\r\n itemUri,\r\n style,\r\n className,\r\n onMoreClick,\r\n}: {\r\n itemStatus: ItemStatusesDTO,\r\n itemUri: ?string,\r\n style?: CSSStyleDeclaration,\r\n className?: string,\r\n /** callback when user clicks on More... Button\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n */\r\n onMoreClick?: (e: SyntheticMouseEvent) => void,\r\n}) => {\r\n if (itemStatus === ItemStatuses.Nothing) return null;\r\n const iconStyle = Object.assign({}, style, {\r\n marginRight: 2,\r\n });\r\n let bit = 1;\r\n let children = [];\r\n while (bit <= 8192) {\r\n if (itemStatus & bit) {\r\n const ItemStatusComponent = itemStatusMapping[bit];\r\n if (ItemStatusComponent != null) {\r\n const props = getPropsForItemStatus(bit, itemUri, onMoreClick);\r\n children.push(\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n bit *= 2;\r\n }\r\n return children.length ? <>{children} : null;\r\n};\r\n\r\nItemStatusIcons.displayName = \"ItemStatusIcons\";\r\nItemStatusIcons.propTypes = {\r\n //itemStatus: PropTypes.number.isRequired,\r\n style: PropTypes.object,\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default ItemStatusIcons;\r\n","//@flow\r\nimport React from \"react\";\r\nimport \"./SimpleAttribute.css\"; // TODO refactor to CSSModule - note used globally!\r\n\r\nexport const SimpleAttributeValue = ({\r\n value,\r\n className = \"a-val\",\r\n}: {\r\n value: string,\r\n className: string,\r\n}) => {value};\r\n\r\nconst SimpleAttribute = ({ attribute }: { attribute: Array }) => (\r\n \r\n {attribute[0]}{\" \"}\r\n \r\n \r\n);\r\nSimpleAttribute.displayName = \"SimpleAttribute\";\r\nexport default SimpleAttribute;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"AttributeLabel_label__1Rp17\"};","// @flow\r\nimport React from \"react\";\r\nimport { useToggle } from \"hooks\";\r\nimport { type LockResultDTO } from \"data/types\";\r\nimport Avatar from \"components/User/Avatar\";\r\nimport Icons from \"@hs/icons\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./LockInfo.module.css\";\r\nimport CloseButton from \"components/ModalCloseButton\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\nexport const LockInfoOn = ({ date }) => (\r\n
\r\n \r\n {loc.t(\"common:act.changes_locked\", { date })}\r\n
\r\n);\r\n\r\nconst LockInfo = ({\r\n lockInfo,\r\n className,\r\n}: {\r\n lock: LockResultDTO,\r\n className?: string,\r\n}) => {\r\n const [show, toggle] = useToggle(true);\r\n return (\r\n \r\n {show && (\r\n \r\n )}\r\n \r\n {lockInfo.lockedByName} \r\n \r\n );\r\n};\r\nLockInfo.displayName = \"LockInfo\";\r\nexport default LockInfo;\r\n","// @flow\r\nimport { Plugin } from \"@uppy/core\";\r\nimport { getFileExtension } from \"data/utils\";\r\nimport match from \"mime-match\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport store from \"data/store\";\r\nimport { getDefaultsConfig } from \"data/constants\";\r\nimport { toastStyled, toastTypes } from \"data/toast\";\r\nimport loc from \"i18next\";\r\n\r\n// export type uppyFile = {\r\n// id: string, // 'uppyteamkongjpg1501851828779'\r\n// name: string, // 'nature.jpg'\r\n// extension: string, // '.jpg'\r\n// type: string, // 'image/jpeg'\r\n// data: Object, // the Blob object\r\n// size: number | string, // 3947642 (returns 'N/A' if size cannot be determined)\r\n// preview: string, // value that can be used to populate \"src\" attribute of an \"img\" tag,\r\n// meta: uppyFileMetadata\r\n// };\r\n\r\ntype uppyRestrictions = {\r\n maxNumberOfFiles?: ?number,\r\n maxFileSize?: ?number,\r\n deniedFileTypes?: ?Array,\r\n allowedFileTypes?: ?Array,\r\n};\r\n\r\nexport /**\r\n * set current uppy restrictions\r\n *\r\n * @param {Object} uppyRef\r\n * @param {uppyRestrictions} restrictions\r\n * @returns {uppyRestrictions} restrictions set\r\n */\r\nconst setUppyRestrictions = (\r\n uppyRef,\r\n restrictions: uppyRestrictions\r\n): uppyRestrictions => {\r\n const updatedRestrictions = Object.assign(\r\n {},\r\n {\r\n maxNumberOfFiles: null,\r\n maxFileSize: null,\r\n deniedFileTypes: null,\r\n allowedFileTypes: null,\r\n },\r\n restrictions || {}\r\n );\r\n uppyRef.setOptions({\r\n restrictions: updatedRestrictions,\r\n });\r\n return updatedRestrictions;\r\n};\r\n\r\n// /* istanbul ignore next */\r\nexport default class UppyRestrictions extends Plugin {\r\n constructor(uppy: Object, opts: Object) {\r\n super(uppy, opts);\r\n this.uppy = uppy;\r\n this.type = \"Restrictions\";\r\n this.id = \"Restrictions\";\r\n this.title = \"uppy-restrictions\";\r\n\r\n // set default options\r\n const defaultOptions = {};\r\n\r\n // merge default options with the ones set by user\r\n this.opts = Object.assign({}, defaultOptions, opts);\r\n }\r\n\r\n install() {\r\n this.uppy.log(\"[restrictions] Installing UppyRestrictions Plugin\");\r\n\r\n // before actually adding files to uppy\r\n this.old_onBeforeFileAdded = this.uppy.opts.onBeforeFileAdded;\r\n this.uppy.opts.onBeforeFileAdded = this.onBeforeFileAdded;\r\n\r\n // before actually starting the upload\r\n this.old_onBeforeUpload = this.uppy.opts.onBeforeUpload;\r\n this.uppy.opts.onBeforeUpload = this.onBeforeUpload;\r\n\r\n this.uppy.on(\"restriction-failed\", this.onRestrictionFailed);\r\n }\r\n\r\n uninstall() {\r\n this.uppy.log(\"[restrictions] Removing UppyRestrictions Plugin\");\r\n\r\n this.uppy.opts.onBeforeFileAdded = this.old_onBeforeFileAdded;\r\n this.uppy.opts.onBeforeUpload = this.old_onBeforeUpload;\r\n\r\n this.uppy.off(\"restriction-failed\", this.onRestrictionFailed);\r\n setUppyRestrictions(this.uppy);\r\n }\r\n\r\n onRestrictionFailed = (file: Object, error: Object): void => {\r\n console.warn(\"[Restrictions] file restriction failed\", file, error);\r\n //this.uppy.info(\"This file type is not allowed\", \"error\", 500);-> does not always work!\r\n toastStyled({\r\n ...toastTypes.uppyError,\r\n message: loc.t(\"upload:restricted.message\"),\r\n });\r\n };\r\n\r\n /** double-check before actually uploading */\r\n onBeforeUpload = (files: Object) => {\r\n const restrictions = this._updateRestrictions();\r\n let restrictedFileIDs = [];\r\n Object.keys(files).forEach((fileID) => {\r\n if (\r\n false ===\r\n this._checkRestrictions(\r\n files[fileID],\r\n files,\r\n restrictions,\r\n true\r\n )\r\n ) {\r\n restrictedFileIDs.push(fileID);\r\n }\r\n });\r\n if (restrictedFileIDs.length > 0) {\r\n const restrictedFiles = restrictedFileIDs.map(\r\n (fileID) => files[fileID].name\r\n );\r\n toastStyled({\r\n ...toastTypes.uppyError,\r\n message:\r\n restrictedFileIDs.length === 1\r\n ? loc.t(\"upload:restricted.one\", {\r\n file: restrictedFiles[0],\r\n })\r\n : loc.t(\"upload:restricted.multiple\", {\r\n files: restrictedFiles.join(\", \"),\r\n }),\r\n });\r\n // abort all\r\n return false;\r\n }\r\n // continue\r\n return this.old_onBeforeUpload(files);\r\n };\r\n\r\n // https://uppy.io/docs/uppy/#onBeforeFileAdded-currentFile-files-gt-currentFile\r\n /** check before adding file to uppy */\r\n onBeforeFileAdded = (file: Object, files: Object) => {\r\n const restrictions = this._updateRestrictions();\r\n\r\n if (this._checkRestrictions(file, files, restrictions, false) === false)\r\n return false;\r\n else return this.old_onBeforeFileAdded(file, files);\r\n };\r\n\r\n /** update uppy restrictions based on current Defaults itemUri/formatId\r\n * @returns {Object} restrictions\r\n */\r\n _updateRestrictions = (): uppyRestrictions => {\r\n const state = store.getState();\r\n const viewName = s.currentNameSelector(state);\r\n const formatId = s.breadcrumbFormatIdSelector(state, viewName);\r\n const itemUri = s.breadcrumbItemUriSelector(state, viewName);\r\n const defaults = getDefaultsConfig(\r\n itemUri || \"pam-item://\",\r\n formatId || -1\r\n );\r\n // any Defaults configuration? set it\r\n if (defaults) {\r\n return setUppyRestrictions(this.uppy, defaults.upload);\r\n } else {\r\n // set empty retrictions\r\n return setUppyRestrictions(this.uppy);\r\n }\r\n };\r\n\r\n /**\r\n * Check if file passes a set of restrictions set in options: maxFileSize,\r\n * maxNumberOfFiles and allowedFileTypes.\r\n * lns -> additional checks for deniedFileTypes\r\n * @borrows https://github.com/transloadit/uppy/blob/856243a149739fbeeac9f75f1343c0bf71d6cf8f/packages/%40uppy/core/src/index.js#L438\r\n *\r\n * @param {object} file object to check\r\n * @param {object} files Object of IDs → files already added\r\n * @param {uppyRestrictions} restrictions which upload restrictions to apply\r\n * @param {boolean} beforeUpload onBeforeUpload calls with true\r\n * @returns {boolean} true if allowed, false if restricted\r\n * @private\r\n */\r\n _checkRestrictions = (\r\n file: Object,\r\n files: Object,\r\n restrictions: uppyRestrictions,\r\n beforeUpload: boolean\r\n ): boolean => {\r\n const {\r\n maxFileSize,\r\n maxNumberOfFiles,\r\n allowedFileTypes,\r\n deniedFileTypes,\r\n } = restrictions;\r\n\r\n if (maxNumberOfFiles) {\r\n if (\r\n Object.keys(files).length + (beforeUpload ? 0 : 1) >\r\n maxNumberOfFiles\r\n ) {\r\n this.uppy.log(\r\n `[Restrictions] only ${maxNumberOfFiles} maxNumberOfFiles are allowed`\r\n );\r\n return false;\r\n // throw new RestrictionError(\r\n // `${this.i18n(\"youCanOnlyUploadX\", {\r\n // smart_count: maxNumberOfFiles\r\n // })}`\r\n // );\r\n }\r\n }\r\n\r\n const ext = getFileExtension(file.name).toLowerCase();\r\n if (allowedFileTypes) {\r\n const isCorrectFileType = allowedFileTypes.some((type) => {\r\n // is this is a mime-type\r\n if (type.indexOf(\"/\") > -1) {\r\n /* istanbul ignore next */\r\n if (!file.type) return false;\r\n return match(file.type.replace(/;.*?$/, \"\"), type);\r\n }\r\n\r\n // otherwise this is likely an extension\r\n /* istanbul ignore else */\r\n if (type[0] === \".\") {\r\n return ext === type.toLowerCase();\r\n }\r\n return false;\r\n });\r\n\r\n if (!isCorrectFileType) {\r\n this.uppy.log(\r\n `[Restrictions] only ${allowedFileTypes.join(\r\n \", \"\r\n )} are allowed`\r\n );\r\n return false;\r\n // const allowedFileTypesString = allowedFileTypes.join(\", \");\r\n // throw new RestrictionError(\r\n // this.i18n(\"youCanOnlyUploadFileTypes\", {\r\n // types: allowedFileTypesString\r\n // })\r\n // );\r\n }\r\n }\r\n\r\n if (deniedFileTypes) {\r\n // https://github.com/transloadit/uppy/blob/856243a149739fbeeac9f75f1343c0bf71d6cf8f/packages/%40uppy/core/src/index.js#L438\r\n const isDeniedFileType = deniedFileTypes.some((type) => {\r\n // is this is a mime-type\r\n if (type.indexOf(\"/\") > -1) {\r\n /* istanbul ignore next */\r\n if (!file.type) return false;\r\n return match(file.type.replace(/;.*?$/, \"\"), type);\r\n }\r\n\r\n // otherwise this is likely an extension\r\n /* istanbul ignore else */\r\n if (type[0] === \".\") {\r\n return ext === type.toLowerCase();\r\n }\r\n return false;\r\n });\r\n\r\n if (isDeniedFileType) {\r\n this.uppy.log(\r\n `[Restrictions] ${deniedFileTypes.join(\r\n \", \"\r\n )} are not allowed`\r\n );\r\n // this.uppy.log(\r\n // `[restrictions] User tried to upload '${currentFile.name}' which is listed in the deniedFileTypes (${deniedFileTypes})`\r\n // );\r\n return false;\r\n }\r\n }\r\n\r\n // We can't check maxFileSize if the size is unknown.\r\n if (maxFileSize && file.data.size != null) {\r\n if (file.data.size > maxFileSize) {\r\n this.uppy.log(\r\n `[Restrictions] with ${file.data.size} exceeds maxFileSize set at ${maxFileSize}`\r\n );\r\n return false;\r\n // throw new RestrictionError(\r\n // `${this.i18n(\"exceedsSize\")} ${prettyBytes(maxFileSize)}`\r\n // );\r\n }\r\n }\r\n return true;\r\n };\r\n}\r\n","import React from \"react\";\r\n\r\nexport const PaneSizeContext = React.createContext();\r\nPaneSizeContext.displayName = \"PaneSize\";\r\n\r\nexport const LabelSizeContext = React.createContext();\r\nLabelSizeContext.displayName = \"LabelSize\";\r\n\r\nexport const CurrentItemContext = React.createContext();\r\nCurrentItemContext.displayName = \"CurrentItem\";\r\n\r\nexport const MultiSelectionContext = React.createContext();\r\nMultiSelectionContext.displayName = \"MultiSelection\";\r\n","// @flow\r\nimport React from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport loc from \"i18next\";\r\nimport { openMapModal } from \"components/MapModal\";\r\nimport {\r\n ParseLocation,\r\n ParseRaster,\r\n ParseArea,\r\n} from \"components/MapViewer/utils\";\r\nimport {\r\n SupportGeoMapViewer,\r\n getGeoMapViewerProvider,\r\n getGeoRasterProvider,\r\n} from \"components/MapViewer/providerSupport\";\r\nimport { type MarkerDTO } from \"data/types\";\r\n\r\ntype Props = {\r\n /** current itemUri */\r\n itemUri: string,\r\n /** current formatId */\r\n formatId: number,\r\n /** location point or area in string format */\r\n value: string,\r\n /** marker name to show on map */\r\n label: string,\r\n /** whether to render button as disabled */\r\n disabled?: boolean,\r\n /** CSS style to apply to button */\r\n style?: CSSStyleDeclaration,\r\n /** optional (custom) location marker icon */\r\n marker?: MarkerDTO,\r\n};\r\n\r\nconst MapButton = ({\r\n itemUri,\r\n formatId,\r\n value,\r\n label,\r\n disabled,\r\n style,\r\n marker,\r\n}: Props) => {\r\n const showOnMap = () => {\r\n // area?\r\n if (value.includes(\";\")) {\r\n const area = ParseArea(value);\r\n openMapModal({\r\n title: label,\r\n mapProvider: getGeoMapViewerProvider(),\r\n useMarker: false,\r\n locations: [\r\n {\r\n attribute: label,\r\n label,\r\n area,\r\n },\r\n ],\r\n });\r\n } else if (value.includes(\":\")) {\r\n // raster\r\n const loc = ParseRaster(value);\r\n openMapModal({\r\n title: label,\r\n mapProvider: getGeoRasterProvider(itemUri, formatId),\r\n useMarker: true,\r\n locations: [\r\n {\r\n attribute: label,\r\n label,\r\n allowEdit: false,\r\n icon: marker,\r\n ...loc,\r\n },\r\n ],\r\n });\r\n } else {\r\n // exactly one point\r\n const loc = ParseLocation(value);\r\n openMapModal({\r\n title: label,\r\n mapProvider: getGeoMapViewerProvider(),\r\n useMarker: true,\r\n locations: [\r\n {\r\n attribute: label,\r\n label,\r\n allowEdit: false,\r\n icon: marker,\r\n ...loc,\r\n },\r\n ],\r\n });\r\n }\r\n };\r\n if (!SupportGeoMapViewer()) return null;\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\nMapButton.displayName = \"MapButton\";\r\nexport default MapButton;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport {\r\n type MapLocationInfo,\r\n type Location,\r\n type RasterLocation,\r\n type MapEditLocationResult,\r\n type MapProviderConfig,\r\n} from \"data/types\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\nimport qs from \"data/queryString\";\r\nimport { fetchRasterMapLayers } from \"data/api\";\r\nimport NoData from \"components/NoData\";\r\nimport { correlationId } from \"data/storeHelper\";\r\nimport { CurrentItemContext } from \"data/context\";\r\n\r\ntype Props = {\r\n /** provider config to use\r\n * @default null retrieve default mapProvider from config.general.geo.name/key\r\n */\r\n mapProvider: ?MapProviderConfig,\r\n /** list of locations (markers) to show on the map */\r\n locations: ?Array,\r\n /** whether to render a \"center\" draggable pin marker */\r\n useMarker?: boolean,\r\n /** the current radius circle (in meters) - used by GeoRadiusInput */\r\n radius?: number,\r\n /** callback when user clicks an empty space on the map (only when useMarker=false & mapProvider.onClick exists)\r\n * @param {RasterLocation} rasterLocation the location the user clicked on the map\r\n */\r\n onClick?: (rasterLocation: RasterLocation) => void,\r\n /** callback after iframe loaded\r\n * @param {bool} success whether the iframe was loaded successfully\r\n */\r\n onLoad?: (success: boolean) => void,\r\n /** current itemUri (Note: Use MapViewer.WithContext to get current itemUri from CurrentItem.Provider) */\r\n itemUri: string,\r\n};\r\n\r\ntype State = {\r\n editLocationResult: ?MapEditLocationResult,\r\n fetchError: ?Object,\r\n};\r\n\r\nexport class MapViewer extends PureComponent {\r\n _iframe: HTMLIFrameElement | null;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this._iframe = React.createRef();\r\n this.state = {\r\n fetchError: null,\r\n editLocationResult: {\r\n location:\r\n props.locations != null && props.locations.length > 0\r\n ? props.locations[0]\r\n : null,\r\n area:\r\n props.locations != null && props.locations.length > 0\r\n ? props.locations[0].area\r\n : null,\r\n radius: props.radius,\r\n },\r\n };\r\n\r\n // validate raster configuration\r\n /* istanbul ignore next */\r\n if (\r\n (props.mapProvider == null ||\r\n props.mapProvider.isRaster !== true) &&\r\n props.locations &&\r\n props.locations.length > 0\r\n ) {\r\n // no .isRaster? make sure locations are not raster positions and warn user!\r\n const anyRaster = props.locations.find((l) =>\r\n Object.prototype.hasOwnProperty.call(l, \"rasterId\")\r\n );\r\n if (anyRaster) {\r\n this.state.fetchError = {\r\n message:\r\n \"Raster maps require manual configuration - Please review the Documentation!\",\r\n };\r\n }\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore next */\r\n if (\r\n this.props.locations !== prevProps.locations &&\r\n this.props.locations != null\r\n ) {\r\n this._addLocationsToMap(this.props.locations);\r\n }\r\n }\r\n\r\n SetCenterMarker = (location: Location) => {\r\n /* istanbul ignore next */\r\n if (this._iframe.current == null) return;\r\n this._iframe.current.contentWindow.setCenterMarker(location);\r\n this.setState((prevState) => ({\r\n editLocationResult: {\r\n ...prevState.editLocationResult,\r\n location,\r\n },\r\n }));\r\n };\r\n\r\n /** retrieve current location edit result\r\n * @returns {number} current radius (in meters)\r\n */\r\n GetEditLocationResult = (): MapEditLocationResult =>\r\n this.state.editLocationResult;\r\n\r\n _fetchRasterLayers = (): Promise =>\r\n fetchRasterMapLayers({\r\n itemUri: this.props.itemUri,\r\n rasterMapIdSelector: this.props.mapProvider.rasterMapIdSelector,\r\n })\r\n .then((mapLayers) => mapLayers.layers)\r\n .catch((fetchError) => {\r\n console.error(fetchError);\r\n this.setState({ fetchError });\r\n return null;\r\n });\r\n\r\n _callOnLoad = (success: boolean) =>\r\n typeof this.props.onLoad === \"function\" && this.props.onLoad(success);\r\n\r\n _frameLoaded = async () => {\r\n let layers = null;\r\n if (this.props.mapProvider && this.props.mapProvider.isRaster) {\r\n layers = await this._fetchRasterLayers();\r\n if (layers == null) {\r\n this._callOnLoad(false);\r\n return;\r\n }\r\n }\r\n\r\n /* istanbul ignore next */\r\n if (this._iframe.current == null) {\r\n this._callOnLoad(false);\r\n return;\r\n }\r\n if (\r\n this.props.radius == null &&\r\n typeof this._iframe.current.contentWindow.showLocations ===\r\n \"function\"\r\n ) {\r\n this._iframe.current.contentWindow.showLocations(\r\n this.props.locations,\r\n this.props.useMarker !== false,\r\n /* istanbul ignore next */ (\r\n editLocationResult: MapEditLocationResult | RasterLocation\r\n ) => {\r\n if (this.props.useMarker) {\r\n // editing mode\r\n this.setState({ editLocationResult });\r\n } else if (\r\n this.props.mapProvider &&\r\n this.props.mapProvider.onClick &&\r\n typeof this.props.onClick === \"function\"\r\n ) {\r\n this.props.onClick(editLocationResult);\r\n }\r\n },\r\n layers\r\n );\r\n this._callOnLoad(true);\r\n } /* istanbul ignore else */ else if (\r\n this.props.radius != null &&\r\n this.props.locations.length > 0 &&\r\n typeof this._iframe.current.contentWindow.searchRadius ===\r\n \"function\"\r\n ) {\r\n this._iframe.current.contentWindow.searchRadius(\r\n this.props.locations[0],\r\n this.state.editLocationResult.radius,\r\n /* istanbul ignore next */ (\r\n editLocationResult: MapEditLocationResult\r\n ) =>\r\n this.setState({\r\n editLocationResult,\r\n })\r\n );\r\n this._callOnLoad(true);\r\n }\r\n\r\n this._callOnLoad(\r\n typeof this._iframe.current.contentWindow.showLocations ===\r\n \"function\" ||\r\n typeof this._iframe.current.contentWindow.searchRadius ===\r\n \"function\"\r\n );\r\n };\r\n\r\n _addLocationsToMap = (locations?: Array) => {\r\n /* istanbul ignore next */\r\n if (this._iframe.current == null) return;\r\n this._iframe.current.contentWindow.showMoreLocations(locations);\r\n };\r\n\r\n _getMapUrl = (): string => {\r\n const providerName =\r\n (this.props.mapProvider && this.props.mapProvider.name) ||\r\n window.CONFIG.general.geo.name ||\r\n \"leaflet-osm\";\r\n const providerKey =\r\n (this.props.mapProvider && this.props.mapProvider.key) ||\r\n window.CONFIG.general.geo.key;\r\n return (\r\n (process.env.PUBLIC_URL || \"\") +\r\n `/__map/${providerName}/index.html?` +\r\n qs.stringify({\r\n lang: userLanguage(),\r\n key: providerKey,\r\n correlationId: correlationId(),\r\n })\r\n );\r\n };\r\n\r\n render() {\r\n const { fetchError } = this.state;\r\n if (fetchError == null) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n // custom error message handling\r\n return (\r\n \r\n
\r\n
\r\n Error: {fetchError.message}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst MapViewerWithContext = (props: Props) => (\r\n \r\n {(itemUri) => }\r\n \r\n);\r\n\r\nMapViewer.WithContext = MapViewerWithContext;\r\nexport default MapViewer;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Async from \"react-select/async\";\r\nimport loc from \"i18next\";\r\n// import debounce from \"lodash/debounce\";\r\nimport { LocationToString } from \"components/MapViewer/utils\";\r\nimport { getGeoPlacesProvider } from \"components/MapViewer/providerSupport\";\r\nimport { closeMenuOnScroll } from \"data/utils\";\r\nimport styles from \"./GeoPlaceInput.module.css\";\r\n\r\ntype Props = {\r\n /** initial string value to show */\r\n value?: string,\r\n /** callback when user selects a location */\r\n onChange: (location: string) => void,\r\n /** input placeholder */\r\n placeholder: string,\r\n /** CSS style to apply to container */\r\n style?: CSSStyleSheet,\r\n};\r\n\r\ntype State = {\r\n value: string,\r\n refreshIndex: number,\r\n};\r\n\r\n/**\r\n * renders a Select dropdown for Geocoding address search\r\n */\r\nexport default class GeoPlaceInput extends React.PureComponent {\r\n _geoCodingProvider: Object | null;\r\n\r\n static defaultProps = {\r\n placeholder: \"\",\r\n inline: false,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this._initProvider();\r\n this.state = {\r\n value: /* istanbul ignore next */ props.value || \"\",\r\n refreshIndex: 0,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n if (prevProps.value !== this.props.value) {\r\n this.setState({\r\n value: this.props.value,\r\n refreshIndex: prevState.refreshIndex + 1,\r\n });\r\n }\r\n }\r\n\r\n _initProvider = () => {\r\n const providerMapping = {\r\n osm: \"openStreetMapProvider\",\r\n google: \"googleProvider\",\r\n bing: \"bingProvider\",\r\n esri: \"esriProvider\",\r\n };\r\n const providerName = providerMapping[getGeoPlacesProvider().name];\r\n /* istanbul ignore next */\r\n if (providerName == null) {\r\n alert(\r\n `Unknown setting under general/geoProvider.places.name - '${getGeoPlacesProvider()}' unknown!`\r\n );\r\n return;\r\n }\r\n // dynamically load only the requested geoProvider\r\n import(`leaflet-geosearch/lib/providers/${providerName}.js`)\r\n .then((provider) => {\r\n this._geoCodingProvider = new provider.default({\r\n // https://wiki.openstreetmap.org/wiki/Nominatim\r\n params: window.CONFIG.general.geo.places.params,\r\n });\r\n })\r\n .catch(\r\n /* istanbul ignore next */ (err) =>\r\n alert(\"Cannot load geoProvider: \" + err.message)\r\n );\r\n };\r\n\r\n getSAYT = (query?: string): Promise<*> => {\r\n if (this._geoCodingProvider == null) {\r\n return new Promise((resolve) => resolve([]));\r\n } else {\r\n return this._geoCodingProvider.search({ query });\r\n }\r\n };\r\n\r\n // getSAYT = debounce(this._getSAYT, 700, {\r\n // leading: false,\r\n // trailing: true,\r\n // maxWait: 1000\r\n // });\r\n\r\n _onChange = (option: ?Object) => {\r\n /* istanbul ignore next */\r\n if (option == null) return;\r\n this.props.onChange(\r\n LocationToString({\r\n latitude: option.y,\r\n longitude: option.x,\r\n })\r\n );\r\n };\r\n\r\n _onInputChange = (value, { action }) => {\r\n // console.log(action);\r\n if (action === \"input-change\" || action === \"set-value\") {\r\n this.setState({ value });\r\n }\r\n if (action === \"input-blur\") {\r\n this.props.onChange(this.state.value);\r\n }\r\n };\r\n\r\n render = () => (\r\n ({\r\n ...provided,\r\n ...this.props.style,\r\n }),\r\n control: /* istanbul ignore next */ (provided, state) => ({\r\n ...provided,\r\n height: 34,\r\n minHeight: \"fit-content\",\r\n borderRadius: 0,\r\n marginRight: -1,\r\n boxShadow: \"inset 0 1px 1px rgba(0, 0, 0, 0.075)\",\r\n width: \"100%\",\r\n }),\r\n valueContainer: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n padding: \"0px 6px 0 12px\",\r\n width: \"100%\",\r\n maxHeight: 34,\r\n }),\r\n input: /* istanbul ignore next */ (provided, state) => ({\r\n ...provided,\r\n margin: 0,\r\n padding: 0,\r\n width: \"100%\",\r\n marginLeft: -3,\r\n }),\r\n clearIndicator: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n padding: 4,\r\n }),\r\n placeholder: /* istanbul ignore next */ (provided, state) => ({\r\n ...provided,\r\n whiteSpace: \"nowrap\",\r\n color: \"hsl(0, 0%, 80%)\",\r\n marginLeft: -3,\r\n }),\r\n menu: /* istanbul ignore next */ (provided, state) => ({\r\n ...provided,\r\n marginTop: 0,\r\n marginBottom: 0,\r\n borderRadius: 0,\r\n }),\r\n menuPortal: /* istanbul ignore next */ (provided, state) => ({\r\n ...provided,\r\n zIndex: 9999,\r\n }),\r\n option: /* istanbul ignore next */ (provided, state) => {\r\n let style = Object.assign({}, provided, {\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n });\r\n if (state.isFocused) {\r\n style = Object.assign({}, style, {\r\n boxShadow: \"none\",\r\n background: \"#f5f5f5\",\r\n textShadow: \"none\",\r\n cursor: \"pointer\",\r\n // border: \"1px solid #f5f5f5\"\r\n });\r\n }\r\n return style;\r\n },\r\n }}\r\n components={{\r\n IndicatorSeparator: /* istanbul ignore next */ () => null,\r\n // Option: OptionRenderer,\r\n DropdownIndicator: /* istanbul ignore next */ () => null,\r\n }}\r\n // async loading\r\n cacheOptions={true}\r\n loadOptions={this.getSAYT}\r\n // behaviour\r\n isClearable\r\n menuPortalTarget={document.body}\r\n menuPlacement=\"auto\"\r\n closeMenuOnScroll={closeMenuOnScroll}\r\n // openMenuOnFocus={false}\r\n // openMenuOnClick={false}\r\n // localizations\r\n loadingMessage={\r\n /* istanbul ignore next */ () => loc.t(\"search.loading\")\r\n }\r\n placeholder={this.props.placeholder}\r\n noOptionsMessage={\r\n /* istanbul ignore next */ () =>\r\n loc.t(\"common:location.searchPlace\")\r\n }\r\n // selection\r\n onChange={this._onChange}\r\n onInputChange={this._onInputChange}\r\n inputValue={this.state.value}\r\n // defaultInputValue={this.state.value}\r\n />\r\n );\r\n}\r\n","// @flow\r\nimport { PdfPrintAction } from \"hooks/PostMessage/Actions\";\r\n/**\r\n * trigger pdf.js print dialog\r\n */\r\n\r\ntype Context = DocModalProps & {\r\n target?: any,\r\n};\r\n\r\nclass doc_print {\r\n execute = ({ target = window }: Context) => {\r\n target.postMessage(\r\n {\r\n source: \"inPoint\",\r\n type: PdfPrintAction,\r\n },\r\n \"*\"\r\n );\r\n return true;\r\n };\r\n}\r\nexport default doc_print;\r\n","// @flow\r\nimport React, { useState, useCallback } from \"react\";\r\nimport Constants from \"data/constants\";\r\nimport Status from \"components/Status\";\r\n\r\n/**\r\n * renders a local loading icon until iframe onLoad event is fired\r\n */\r\nconst LoadingIframe = ({\r\n onLoad,\r\n ...props\r\n}: {\r\n onLoad: () => void,\r\n props: Object,\r\n}) => {\r\n const [loading, setLoading] = useState(true);\r\n\r\n const _onLoad = useCallback(() => {\r\n setLoading(false);\r\n /* istanbul ignore else */\r\n if (typeof onLoad === \"function\") onLoad();\r\n }, [setLoading, onLoad]);\r\n\r\n return (\r\n <>\r\n {loading && }\r\n \r\n \r\n );\r\n};\r\n\r\nexport default LoadingIframe;\r\n","// @flow\r\nimport React, { useRef, useEffect } from \"react\";\r\nimport {\r\n type SiteTypeEnum,\r\n SiteType,\r\n CardType,\r\n type CardTypeEnum,\r\n CardItemType,\r\n type CardItemTypeEnum,\r\n} from \"data/types\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport Icons from \"@hs/icons\";\r\n//import Collapse from \"react-bootstrap/lib/Collapse\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Mark from \"@hs/mark\";\r\nimport ActionsButton from \"components/ActionPanel/ActionsButton\";\r\nimport { getClassNames } from \"data/utils\";\r\nimport { removeSpaces } from \"data/integrationTestUtils\";\r\n// import loc from \"i18next\";\r\n\r\n/**\r\n * renders a CardItem's subtype's icon\r\n */\r\nconst CardSubTypeIcon = ({\r\n cardtype,\r\n itemtype,\r\n name,\r\n style,\r\n}: {\r\n cardtype: CardTypeEnum,\r\n itemtype: CardItemTypeEnum,\r\n name: string,\r\n style?: CSSStyleDefinition,\r\n}) => {\r\n switch (itemtype) {\r\n case CardItemType.Task:\r\n return (\r\n \r\n );\r\n\r\n case CardItemType.Folder:\r\n return (\r\n \r\n );\r\n case CardItemType.Doc:\r\n const ext = name.substring(name.lastIndexOf(\".\"));\r\n return (\r\n \r\n );\r\n\r\n case CardItemType.ArchiveTarget:\r\n switch (cardtype) {\r\n case CardType.Rec:\r\n return (\r\n \r\n );\r\n case CardType.Fav:\r\n return (\r\n \r\n );\r\n default:\r\n return (\r\n \r\n );\r\n }\r\n\r\n case CardItemType.Search:\r\n case CardItemType.SearchForm:\r\n return ;\r\n\r\n case CardItemType.CommandAction:\r\n return cardtype === CardType.Task ? (\r\n \r\n ) : (\r\n \r\n );\r\n\r\n /* istanbul ignore next */\r\n default:\r\n console.log(\"Unknown CardItem.ItemType=\" + itemtype);\r\n return ;\r\n }\r\n};\r\n\r\n/**\r\n * returns the document's name without extension\r\n *\r\n * @param {CardItemTypeEnum} itemType doc if document\r\n * @param {string} name full filename\r\n * @returns {string} filename without extension\r\n */\r\nfunction onlyName(\r\n cardType: CardTypeEnum,\r\n itemType: CardItemTypeEnum,\r\n name: string\r\n): string {\r\n if (cardType !== CardType.Task && itemType === CardItemType.Doc) {\r\n return name.substring(0, name.lastIndexOf(\".\"));\r\n }\r\n return name;\r\n}\r\n\r\n// const typeIcon = {\r\n// [CardType.Fav]: \"star\",\r\n// [CardType.Rec]: \"history\",\r\n// [CardType.Task]: \"tasks\"\r\n// // [CardType.Action]: \"puzzle-piece\"\r\n// };\r\n\r\nfunction cardColor(\r\n type: CardTypeEnum,\r\n itemtype: CardItemTypeEnum,\r\n siteType: SiteTypeEnum\r\n): string {\r\n if (type === CardType.Task) {\r\n return \"task\";\r\n }\r\n if (itemtype === CardItemType.Folder && siteType === SiteType.GlobalSites) {\r\n return \"top\";\r\n }\r\n return type;\r\n}\r\n\r\ntype Props = {\r\n /** the card item's type */\r\n itemtype: CardItemTypeEnum,\r\n /** the card site type */\r\n siteType: SiteTypeEnum,\r\n /** card type */\r\n type: CardTypeEnum,\r\n /** image in base64 encoding */\r\n image?: ?string | ?React.ReactElement,\r\n /** card name */\r\n name?: string,\r\n /** card's description */\r\n desc?: string,\r\n /** breadcrumb text */\r\n bcText?: string,\r\n /** whether should be visible */\r\n visible: boolean,\r\n /** callback when user clicks on a card\r\n * @param {SyntheticMouseEvent<*>} e HTML click event object\r\n */\r\n onClick: (e: SyntheticMouseEvent<*>) => void,\r\n /** optional callback when user clicks on the three dots more\r\n * @param {SyntheticMouseEvent<*>} e HTML click event object\r\n */\r\n onMoreClick?: (e: SyntheticMouseEvent<*>) => void,\r\n /** current filter text (empty string if none) */\r\n filterText: string,\r\n /** search statistics */\r\n count?: number,\r\n /** whether to mark Card as selected */\r\n isSelected?: boolean,\r\n extras?: Object,\r\n /** optional string to help test engines target this component */\r\n dataTest?: string,\r\n};\r\n\r\n/**\r\n * renders one Card\r\n */\r\nconst CardItem = ({\r\n itemtype,\r\n siteType,\r\n bcText,\r\n type,\r\n image,\r\n name,\r\n desc,\r\n visible,\r\n extras,\r\n onClick,\r\n onMoreClick,\r\n filterText,\r\n count,\r\n isSelected,\r\n dataTest,\r\n}: Props) => {\r\n const liRef = useRef(null);\r\n useEffect(() => {\r\n if (isSelected === true) {\r\n window.setTimeout(() => {\r\n liRef.current != null &&\r\n liRef.current.scrollIntoView(/*{ behavior: \"smooth\" }*/);\r\n }, 100);\r\n }\r\n }, [isSelected]);\r\n\r\n const className = [\"card\", cardColor(type, itemtype, siteType)];\r\n /* istanbul ignore else */\r\n if (isSelected) {\r\n className.push(\"selected\");\r\n }\r\n return (\r\n // \r\n \r\n
\r\n {\r\n /* istanbul ignore next */ image != null &&\r\n typeof image === \"string\" &&\r\n (!image.startsWith(\"data:image\") &&\r\n [CardType.Task, CardType.Action].includes(type) ? (\r\n
\r\n \r\n
\r\n ) : (\r\n \"\"\r\n ))\r\n }\r\n {\r\n /* istanbul ignore next */ image != null &&\r\n React.isValidElement(image) && <>{image}\r\n }\r\n {image == null && (\r\n <>\r\n
\r\n \r\n
\r\n {siteType !== SiteType.NotSet && (\r\n \r\n )}\r\n {count != null && count !== -1 && (\r\n \r\n )}\r\n \r\n )}\r\n
\r\n
\r\n \r\n \r\n {onlyName(\r\n type,\r\n itemtype,\r\n name /* istanbul ignore next */ || \"\"\r\n )}\r\n \r\n {type === CardType.Task &&\r\n extras != null &&\r\n extras.name != null && (\r\n
\r\n {/* */}\r\n \r\n {extras.name}\r\n
\r\n )}\r\n {/* {bcText && (\r\n
\r\n {bcText}\r\n
\r\n )} */}\r\n
\r\n\r\n {desc && (\r\n
\r\n
\r\n {desc}\r\n
\r\n
\r\n )}\r\n \r\n
\r\n {siteType !== SiteType.NotSet && (\r\n \r\n {bcText && (\r\n \r\n )}\r\n
\r\n )}\r\n {typeof onMoreClick === \"function\" && (\r\n \r\n )}\r\n {/*
\r\n \r\n
*/}\r\n \r\n \r\n // \r\n );\r\n};\r\nCardItem.displayName = \"CardItem\";\r\nexport default CardItem;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport {\r\n type SearchBucketDTO,\r\n type SearchFilterDTO,\r\n type SearchValueTypeEnum,\r\n type ListViewModeEnum,\r\n} from \"data/types\";\r\nimport { connect } from \"react-redux\";\r\nimport FilterBar from \"components/FilterBar\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\ntype Props = {\r\n /** list of filters (and if any possible values) to show */\r\n aggregations: ?Array,\r\n /** currently selected filter values */\r\n selected: Array,\r\n /** callback when user selects a filter\r\n * @param {string} name field's common name\r\n * @param {SearchValueTypeEnum} valueType field's type\r\n * @param {Object} value the actual value selected\r\n */\r\n onSelect: (\r\n name: string,\r\n valueType: SearchValueTypeEnum,\r\n value: Object\r\n ) => void,\r\n /** callback when user wants to clear/reset all filter values */\r\n onClear?: () => void,\r\n /** callback when user wants to quickly filter by text */\r\n onFilterTextChange?: (value: ?string) => void,\r\n /** current filterText value */\r\n filterText: ?string,\r\n /** placeholder text to display on quick text filter */\r\n filterTextPlaceholder?: string,\r\n /** current viewMode */\r\n viewMode: ListViewModeEnum,\r\n /** which view modes to show/allow */\r\n viewModes?: Array,\r\n /** callback when user changes viewMode\r\n * @param {ListViewModeEnum} viewMode the viewMode the user chose\r\n */\r\n onViewModeChange: (viewMode: ListViewModeEnum) => void,\r\n /** whether filter should be rendered */\r\n renderFilter: ?boolean,\r\n /** whether filter should be disabled */\r\n disableFilter: ?boolen,\r\n};\r\n\r\ntype State = {\r\n aggregations: ?Array,\r\n};\r\n\r\n/** will render a filter/sort/views bar */\r\nexport class FilterBarContainer extends PureComponent {\r\n state = {\r\n aggregations: undefined,\r\n };\r\n\r\n componentDidMount = () =>\r\n this._prep(this.props.aggregations, this.props.selected);\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (\r\n prevProps.aggregations !== this.props.aggregations ||\r\n prevProps.selected !== this.props.selected\r\n ) {\r\n this._prep(this.props.aggregations, this.props.selected);\r\n }\r\n }\r\n\r\n _prep(\r\n aggregations: ?Array,\r\n selected: Array\r\n ) {\r\n if (aggregations == null) {\r\n this.setState({ aggregations: undefined });\r\n } else {\r\n /* istanbul ignore next */\r\n let items = aggregations.slice(0);\r\n\r\n // update bucket.selected\r\n selected.forEach((filter) => {\r\n const item = items.find((i) => i.name === filter.name);\r\n /* istanbul ignore else */\r\n if (item != null) {\r\n item.selected = [filter.value];\r\n }\r\n });\r\n this.setState({\r\n aggregations: items,\r\n });\r\n }\r\n }\r\n\r\n _onSelect = ({\r\n name,\r\n value,\r\n valueType,\r\n }: {\r\n name: string,\r\n value: any,\r\n valueType?: SearchValueTypeEnum,\r\n }): void => {\r\n const { aggregations } = this.state;\r\n /* istanbul ignore next */\r\n if (aggregations == null) return;\r\n const aggregation = aggregations.find((b) => b.name === name);\r\n /* istanbul ignore else */\r\n if (aggregation != null) {\r\n this.props.onSelect(\r\n name,\r\n valueType || aggregation.valueType,\r\n value\r\n );\r\n }\r\n };\r\n\r\n render() {\r\n /* istanbul ignore else */\r\n if (this.state.aggregations == null) return null;\r\n\r\n return (\r\n String(s.value).length > 0\r\n ).length > 0\r\n }\r\n viewMode={this.props.viewMode}\r\n viewModes={this.props.viewModes}\r\n onViewModeChange={this.props.onViewModeChange}\r\n renderFilter={this.props.renderFilter}\r\n disableFilter={this.props.disableFilter}\r\n />\r\n );\r\n }\r\n}\r\n\r\nFilterBarContainer.displayName = \"FilterBarContainer\";\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n ...ownProps,\r\n disableFilter: s.isOnlineSelector(state) ? ownProps.disableFilter : true,\r\n});\r\n\r\nexport default connect(mapStateToProps)(FilterBarContainer);\r\n","// @flow\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport FormControl from \"react-bootstrap/lib/FormControl\";\r\nimport styles from \"components/NativeSelect/NativeSelect.module.css\";\r\nimport loc from \"i18next\";\r\nimport { components } from \"react-select\";\r\nconst { DownChevron } = components;\r\n\r\nexport const RelativeDate = [\r\n \"NotSet\",\r\n \"Today\",\r\n \"Yesterday\",\r\n \"ThisWeek\",\r\n \"LastWeek\",\r\n \"ThisMonth\",\r\n \"LastMonth\",\r\n \"ThisYear\",\r\n \"LastYear\",\r\n];\r\n\r\nconst RelativeDatePicker = ({\r\n autoFocus,\r\n index,\r\n value,\r\n onChange,\r\n style,\r\n className,\r\n}: {\r\n autoFocus?: boolean,\r\n index: number,\r\n value?: string,\r\n onChange: Function,\r\n style?: Object,\r\n className?: string,\r\n}) => (\r\n
\r\n \r\n {RelativeDate.map((relDate, index) => (\r\n \r\n ))}\r\n \r\n \r\n
\r\n);\r\nRelativeDatePicker.displayName = \"RelativeDatePicker\";\r\nRelativeDatePicker.propTypes = {\r\n autoFocus: PropTypes.bool,\r\n index: PropTypes.number.isRequired,\r\n value: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n};\r\nexport default RelativeDatePicker;\r\n","// global geolocator settings\r\nconst geoLocatorOptions = (custom: Object) => ({\r\n enableHighAccuracy: true,\r\n timeout: 5000,\r\n maximumWait: 10000, // max wait time for desired accuracy\r\n maximumAge: 0, // disable cache\r\n desiredAccuracy: 2, // meters\r\n fallbackToIP: false,\r\n addressLookup: false, // requires Google API key if true\r\n timezone: false, // requires Google API key if true\r\n //map: \"map-canvas\", // interactive map element id (or options object)\r\n staticMap: false, // get a static map image URL (boolean or options object)\r\n ...custom,\r\n});\r\nexport default geoLocatorOptions;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport ProgressBar from \"react-bootstrap/lib/ProgressBar\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport styles from \"./ProgressModal.module.css\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** text to show in Cancel button */\r\n cancelButton?: string,\r\n /** Modal Dialog title */\r\n title?: string,\r\n /** FontAwesome icon to show above title\r\n * @default {string} \"spinner\"\r\n */\r\n icon?: string,\r\n /** called once dialog mounted to actually perform work\r\n * @param {Function} close call to close dialog passing whichever return value you need\r\n * @param {Function} setError call to set error message to display on dialog\r\n */\r\n doWork: (close: () => void, setError: (error: string) => void) => void,\r\n};\r\n\r\ntype State = {\r\n error: ?string,\r\n};\r\n\r\n/** presents a Progress dialog to the user\r\n * @returns {boolean} true if user confirmed, null/undefined otherwise\r\n */\r\nexport class ProgressModal extends React.PureComponent {\r\n state = { error: null };\r\n\r\n componentDidMount() {\r\n /* istanbul ignore else */\r\n if (typeof this.props.doWork === \"function\") {\r\n this.props.doWork(this.props.close, (error: string) =>\r\n this.setState({ error })\r\n );\r\n }\r\n }\r\n\r\n render() {\r\n const {\r\n open,\r\n close,\r\n cancelButton = loc.t(\"common:cancel\"),\r\n title,\r\n icon,\r\n } = this.props;\r\n\r\n return (\r\n close()}\r\n dialogClassName={styles.modal}\r\n >\r\n {title && (\r\n \r\n \r\n {title}\r\n \r\n )}\r\n \r\n {this.state.error == null && (\r\n \r\n )}\r\n {this.state.error != null &&
{this.state.error}
}\r\n
\r\n {this.state.error != null && (\r\n \r\n close()}\r\n >\r\n {cancelButton}\r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\nProgressModal.displayName = \"ProgressModal\";\r\nProgressModal.defaultProps = {\r\n icon: \"spinner\",\r\n};\r\n\r\nexport const openProgressModal = createModal(ProgressModal);\r\n","import { hasCacheSupport, isListed } from \"data/utils\";\r\nimport { getStorageEstimate } from \"data/storage\";\r\nimport { JL } from \"data/logging\";\r\n\r\nexport default class ApiCacheManager {\r\n constructor() {\r\n this._log = JL(\"ApiCacheManager\");\r\n this.OpenCache = this.OpenCache.bind(this);\r\n this.DeleteCache = this.DeleteCache.bind(this);\r\n this.CacheExists = this.CacheExists.bind(this);\r\n this.LogEstimates = this.LogEstimates.bind(this);\r\n }\r\n\r\n /**\r\n * Returns a handle to the requested cache\r\n *\r\n * @returns {Promise} cache handler\r\n * @memberof ApiCacheManager\r\n * @public\r\n */\r\n OpenCache = (id: string): Promise => {\r\n if (!hasCacheSupport())\r\n throw new Error(\"Browser does not support cache!\");\r\n return window.caches.open(id);\r\n };\r\n\r\n /**\r\n * Deletes the requested cache\r\n *\r\n * @returns {Promise} f the cache was actually deleted and a false if something went wrong or the cache doesn’t exist\r\n * @memberof ApiCacheManager\r\n * @public\r\n */\r\n DeleteCache = (id: string): Promise => {\r\n if (!hasCacheSupport())\r\n throw new Error(\"Browser does not support cache!\");\r\n return window.caches.delete(id);\r\n };\r\n\r\n /**\r\n * Checks if an existing Cache key already exists\r\n * @returns {Promise} true or false\r\n * @memberof ApiCacheManager\r\n * @public\r\n */\r\n CacheExists = (id: string): Promise => {\r\n if (!hasCacheSupport())\r\n throw new Error(\"Browser does not support cache!\");\r\n return window.caches.keys().then((keys) => isListed(id, keys));\r\n };\r\n\r\n /**\r\n * Logs to the console some storage usage estimates\r\n *\r\n * @memberof ApiCacheManager\r\n * @public\r\n */\r\n LogEstimates = (id: string): void => {\r\n // show total number of cached items - unfortunately it is not possible to retrieve cache total in diskspace\r\n // https://github.com/w3c/ServiceWorker/issues/587\r\n this.OpenCache(id).then((cache) =>\r\n cache.keys().then(async (cachedRequests) => {\r\n this._log.info(() => ({\r\n msg: `[storage] total of ${cachedRequests.length} cached items`,\r\n id,\r\n }));\r\n const estimate = await getStorageEstimate();\r\n /* istanbul ignore next */\r\n if (estimate != null) {\r\n this._log.info(() => ({\r\n msg: `[storage] total usage estimate: ${estimate.usageInGb} out of ${estimate.quotaInGb}Gb used (${estimate.percentUsed}%)`,\r\n estimate,\r\n id,\r\n }));\r\n }\r\n })\r\n );\r\n };\r\n}\r\n","import ApiManagerBase, { type Context } from \"./ApiManagerBase\";\r\nimport {\r\n ContentType,\r\n type OfflineItemDTO,\r\n CustomHttpHeader,\r\n type ApiMethodRef,\r\n DEFAULT_CACHE_NAME,\r\n} from \"data/types\";\r\nimport ApiCacheManager from \"data/ApiCacheManager\";\r\nimport { JL } from \"jsnlog\";\r\n\r\n/**\r\n * Specifically used by offlineSaga to sync \"make available offline\"marked for offline items\r\n *\r\n * @export\r\n * @class ApiManagerMakeAvailableOffline\r\n * @extends {ApiManagerBase}\r\n */\r\nexport default class ApiManagerMakeAvailableOffline extends ApiManagerBase {\r\n constructor(offlineItem: OfflineItemDTO) {\r\n super();\r\n this._log = JL(\"ApiManagerMakeAvailableOffline\");\r\n this._offlineItem = offlineItem;\r\n this._apiCache = new ApiCacheManager();\r\n this.CacheExists = this.CacheExists.bind(this);\r\n this.DeleteCache = this.DeleteCache.bind(this);\r\n this.LogEstimates = this.LogEstimates.bind(this);\r\n this.CheckLicense = this.CheckLicense.bind(this);\r\n this.EOL = this.EOL.bind(this);\r\n this._callWithDeps = this._callWithDeps.bind(this);\r\n this._runTransformer = this._runTransformer.bind(this);\r\n this._addToCache = this._addToCache.bind(this);\r\n }\r\n\r\n _callWithDeps = async (\r\n name: string,\r\n args?: Object = {}\r\n ): Promise> => {\r\n // calling the API method will effectively cache it\r\n const context = await this._callReturnContext(name, args);\r\n const { cache } = context.request;\r\n if (cache == null || cache.depsAnalyzer == null) return [];\r\n else return cache.depsAnalyzer(context.body, context.request.params);\r\n };\r\n\r\n /**\r\n * Deletes the whole current OfflineItem's cache\r\n * @returns {Promise} true if the cache was actually deleted and false if something went wrong or the cache doesn’t exist\r\n * @memberof ApiManagerMakeAvailableOffline\r\n * @public\r\n */\r\n DeleteCache = (): Promise => {\r\n /* istanbul ignore else */\r\n if (this._offlineItem) {\r\n return this._apiCache.DeleteCache(this._offlineItem.id);\r\n } else {\r\n return Promise.reject(false);\r\n }\r\n };\r\n\r\n /**\r\n * Checks if an existing Cache key already exists\r\n * @returns {Promise} true or false\r\n * @memberof ApiManagerMakeAvailableOffline\r\n * @public\r\n */\r\n CacheExists = (): Promise => {\r\n /* istanbul ignore else */\r\n if (this._offlineItem) {\r\n return this._apiCache.CacheExists(this._offlineItem.id);\r\n } else {\r\n return Promise.reject(false);\r\n }\r\n };\r\n\r\n /**\r\n * Logs to the console some storage usage estimates\r\n * @memberof ApiManagerMakeAvailableOffline\r\n * @public\r\n */\r\n LogEstimates = (): void => {\r\n /* istanbul ignore else */\r\n if (this._offlineItem) {\r\n this._apiCache.LogEstimates(this._offlineItem.id);\r\n }\r\n };\r\n\r\n /**\r\n * Prepares request's HTTP headers\r\n * @memberof ApiManagerMakeAvailableOffline\r\n * @param {Context} context query context\r\n * @returns {Promise} current context\r\n * @override\r\n */\r\n async BeforeFetch(context: Context): Promise {\r\n context = await super.BeforeFetch(context);\r\n // tell serviceWorker to skip these requests - we'll cache them\r\n context.options.headers.delete(CustomHttpHeader.CacheStrategy);\r\n // #55379 tell the server we are requesting for offline cache\r\n context.options.headers.append(CustomHttpHeader.OfflineSync, \"true\");\r\n return context;\r\n }\r\n\r\n /**\r\n * We skip licensing check when caching offline items\r\n * @param {Context} context query context\r\n * @returns {Promise} current context\r\n * @memberof ApiManagerMakeAvailableOffline\r\n * @override\r\n */\r\n async CheckLicense(context: Context): Promise {\r\n return context;\r\n }\r\n\r\n // TODO handle API custom errors instead of throwing\r\n // async CheckCustomError(context: Context): Promise {\r\n // }\r\n\r\n /**\r\n * Convert response body and cache it\r\n * @param {Context} context query context\r\n * @returns {Promise} current context\r\n * @memberof ApiManagerMakeAvailableOffline\r\n * @override\r\n */\r\n async EOL(context: Context): Promise {\r\n this._log.debug(() => ({\r\n msg: `${context.request.name}: EOL`,\r\n apiContext: context,\r\n }));\r\n\r\n // custom transformer function defined?\r\n context = this._runTransformer(context);\r\n\r\n await this._addToCache(context);\r\n\r\n return context;\r\n }\r\n\r\n _runTransformer = (context: Context): Promise => {\r\n if (\r\n context.request &&\r\n typeof context.request.transformer === \"function\"\r\n ) {\r\n if (\r\n context.request.contentType !== ContentType.AUTO &&\r\n context.request.contentType !== ContentType.JSON\r\n ) {\r\n throw new Error(\r\n `ApiCatalog method ${context.request.name} error: cache.transformer can only be used on ContentType.AUTO or JSON!`\r\n );\r\n }\r\n try {\r\n // transform it and convert back to body\r\n const cacheBody = JSON.stringify(\r\n context.request.transformer(context.body)\r\n );\r\n\r\n // return/cache this response instead\r\n context.response = new Response(cacheBody, context.response);\r\n } catch (e) {\r\n this._log.fatalException(\r\n () => ({\r\n msg: \"error while transforming body\",\r\n body: context.body,\r\n apiMethod: context.request.name,\r\n apiContext: context,\r\n }),\r\n e\r\n );\r\n throw new Error(\r\n \"Could not transform body for \" + context.request.name\r\n );\r\n }\r\n }\r\n return context;\r\n };\r\n\r\n _addToCache = async (context: Context): void => {\r\n // note: better control here than having the serviceWorker do this; cons - #54575 we need to handle our own cache store\r\n const cache = await this._apiCache.OpenCache(this._offlineItem.id);\r\n if (cache != null) {\r\n const cacheKey = this._getFullCacheKey(context);\r\n // note: no need to clone response here since .DecodeBody() does it for us!\r\n try {\r\n await cache.put(cacheKey, context.response);\r\n\r\n // Delete existing cache entry from Default store\r\n // Fixes #58699 Remove offline availability is not available\r\n const defaultCache = await this._apiCache.OpenCache(\r\n DEFAULT_CACHE_NAME\r\n );\r\n const deleted = await defaultCache.delete(cacheKey);\r\n /* istanbul ignore next */\r\n if (deleted) {\r\n this._log.info(() => ({\r\n msg: `Deleted duplicate cacheKey from defaultStore.`,\r\n cacheKey,\r\n defaultCache: DEFAULT_CACHE_NAME,\r\n cache: this._offlineItem.id,\r\n }));\r\n }\r\n } catch (e) {\r\n this._log.fatalException(\r\n () => ({\r\n msg: \"could not store cacheKey\",\r\n cacheKey: cacheKey,\r\n apiMethod: context.request.name,\r\n apiContext: context,\r\n }),\r\n e\r\n );\r\n throw new Error(\"Could not store cacheKey \" + cacheKey);\r\n }\r\n } else {\r\n this._log.fatalException(() => ({\r\n msg: \"could not open cache for offlineItem\",\r\n apiMethod: context.request.name,\r\n offlineItem: this._offlineItem,\r\n }));\r\n throw new Error(\"Could not open cache for storing offlineItem\");\r\n }\r\n };\r\n}\r\n","import {\r\n fork,\r\n all,\r\n call,\r\n put,\r\n takeLatest,\r\n select,\r\n spawn,\r\n take,\r\n race,\r\n} from \"redux-saga/effects\";\r\nimport { delay } from \"redux-saga\";\r\nimport {\r\n startOfflineSyncAction,\r\n offlineSyncStartedAction,\r\n offlineSyncDoneAction,\r\n setOfflineItemSyncStatusAction,\r\n removeOfflineItemAction,\r\n setOfflineItemDepsMapAction,\r\n} from \"data/actions\";\r\nimport { actions as networkActions } from \"redux-saga-network-status\";\r\nimport * as networkActionTypes from \"redux-saga-network-status/lib/actionTypes\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport {\r\n CustomHttpHeader,\r\n OfflineSyncStatus,\r\n type ApiMethodRef,\r\n} from \"data/types\";\r\nimport ApiManagerMakeAvailableOffline from \"data/ApiManagerMakeAvailableOffline\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { fetchOfflineItems, fetchUser } from \"data/api\";\r\nimport { hasCacheSupport } from \"data/utils\";\r\nimport { JL } from \"data/logging\";\r\nimport { replayOfflineQueue } from \"data/offline/offlineQueue\";\r\nimport { isFeatureOn, Feature } from \"data/constants\";\r\n\r\nconst _log = JL(\"offlineSaga\");\r\n\r\n// caching API instances per offlineItem\r\nlet APIs = {};\r\nconst getAPI = (item: OfflineItemDTO) =>\r\n APIs[item.id] == null\r\n ? (APIs[item.id] = new ApiManagerMakeAvailableOffline(item))\r\n : APIs[item.id];\r\nlet isSyncing = false;\r\n\r\nlet promptedForPersistentStorage = false;\r\nconst depsMap = {};\r\n\r\nexport function* updateUser() {\r\n yield call(fetchUser);\r\n}\r\n\r\nexport function* startSync(action) {\r\n try {\r\n isSyncing = true;\r\n _log.debug(() => \"starting sync\");\r\n const items = action.payload.items; //exact items to sync\r\n if (items && items.length > 0) {\r\n console.time(\"[offline]\");\r\n let anyOfflineItemSyncErrors = false;\r\n yield put(offlineSyncStartedAction());\r\n\r\n // cache global items non itemUri specific\r\n yield call(preFetchGlobals, { id: \"api\" });\r\n\r\n for (var i = 0; i < items.length; i++) {\r\n const item = items[i];\r\n _log.debug(() => ({\r\n msg: \"syncing\",\r\n bc: item.breadcrumb.text,\r\n offlineItem: item,\r\n }));\r\n depsMap[item.id] = {\r\n name: item.breadcrumb.text,\r\n children: [],\r\n attributes: {\r\n itemUri: item.itemUri,\r\n },\r\n };\r\n\r\n try {\r\n yield put(\r\n setOfflineItemSyncStatusAction({\r\n item,\r\n status: OfflineSyncStatus.Syncing,\r\n })\r\n );\r\n\r\n const t0 = performance.now();\r\n yield call(preFetchFolder, item, item.itemUri);\r\n const took = performance.now() - t0;\r\n\r\n // retrieve item from redux to check for errors\r\n const storeItems = yield select(s.offlineItemsSelector);\r\n /* istanbul ignore if */\r\n if (storeItems == null) {\r\n throw new Error(\r\n \"offlineSaga could not retrieve all offlineItems\"\r\n );\r\n }\r\n const storeItem = storeItems[item.id];\r\n /* istanbul ignore if */\r\n if (storeItem == null) {\r\n throw new Error(\r\n \"offlineSaga could not retrieve offlineItem \" +\r\n item.id\r\n );\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (storeItem.status === OfflineSyncStatus.Syncing) {\r\n // no errors, update to done!\r\n yield put(\r\n setOfflineItemSyncStatusAction({\r\n item,\r\n status: OfflineSyncStatus.Synced,\r\n took,\r\n })\r\n );\r\n delete depsMap[item.id].attributes.error;\r\n } else {\r\n anyOfflineItemSyncErrors = true;\r\n }\r\n } catch (e) {\r\n anyOfflineItemSyncErrors = true;\r\n _log.fatalException(\r\n () => ({\r\n msg: \"error while syncing\",\r\n bc: item.breadcrumb.text,\r\n offlineItem: item,\r\n }),\r\n e\r\n );\r\n depsMap[item.id].attributes.error = e;\r\n depsMap[item.id]._collapsed = false;\r\n yield put(\r\n setOfflineItemSyncStatusAction({\r\n item,\r\n message: e.message,\r\n status: OfflineSyncStatus.SyncedWithErrors,\r\n })\r\n );\r\n }\r\n console.timeLog(\"[offline]\", item);\r\n yield call(getAPI(item).LogEstimates);\r\n }\r\n yield put(\r\n offlineSyncDoneAction({\r\n status: anyOfflineItemSyncErrors\r\n ? OfflineSyncStatus.SyncedWithErrors\r\n : OfflineSyncStatus.Synced,\r\n })\r\n );\r\n console.timeEnd(\"[offline]\");\r\n }\r\n } catch (e) {\r\n /* istanbul ignore next */\r\n _log.fatalException(() => \"Error in startSync()\", e);\r\n\r\n /* istanbul ignore next */\r\n yield put(\r\n offlineSyncDoneAction({\r\n status: OfflineSyncStatus.Error,\r\n message: e.message,\r\n })\r\n );\r\n } finally {\r\n // release all API instances\r\n APIs = {};\r\n }\r\n isSyncing = false;\r\n}\r\n\r\nfunction* preFetchGlobals(item: OfflineItemDTO): void {\r\n _log.debug(() => ({\r\n msg: \"pre-fetching globals\",\r\n item,\r\n }));\r\n const globalApis = [\r\n {\r\n name: \"getArchiveTargets\",\r\n params: {\r\n offline: true,\r\n },\r\n },\r\n ];\r\n for (const apiGlobal of globalApis) {\r\n yield call(getAPI(item)._callWithDeps, apiGlobal.name, {\r\n params: apiGlobal.params,\r\n });\r\n }\r\n}\r\n\r\nfunction* preFetchFolder(item: OfflineItemDTO, itemUri: string): void {\r\n if (item.isDoc !== false) {\r\n _log.warn(() => ({\r\n msg: \"cannot pre-fetch offlineItem as currently only Folders are supported!\",\r\n offlineItem: item,\r\n }));\r\n throw new Error(\"Only Folders are supported for offline sync!\");\r\n }\r\n\r\n _log.debug(() => ({\r\n msg: \"pre-fetching Folder\",\r\n item,\r\n itemUri,\r\n }));\r\n\r\n // starting point is always the tree\r\n const childMapRef = {\r\n name: \"fetchTree\",\r\n children: [],\r\n attributes: {\r\n itemUri,\r\n },\r\n };\r\n depsMap[item.id].children.push(childMapRef);\r\n const rootDep = {\r\n name: \"fetchTree\",\r\n params: {\r\n itemUri,\r\n deep: false,\r\n all: true, // no paging\r\n },\r\n };\r\n yield call(fetchDeps, item, rootDep, childMapRef);\r\n}\r\n\r\nfunction* fetchDeps(item: OfflineItemDTO, dep: ApiMethodRef, mapRef): void {\r\n _log.debug(() => ({\r\n msg: \"Fetching DEP:\",\r\n dep,\r\n }));\r\n const t0 = performance.now();\r\n const { name, ...args } = dep;\r\n const deps = yield call(getAPI(item)._callWithDeps, dep.name, args);\r\n const took = Math.round(performance.now() - t0) + \"ms\";\r\n mapRef.attributes = {\r\n took,\r\n ...dep.params,\r\n };\r\n\r\n _log.debug(() => ({\r\n msg: \"Retrieved sub-dependencies\",\r\n dep,\r\n args,\r\n deps,\r\n }));\r\n\r\n for (const dep of deps) {\r\n try {\r\n // add child dependencies for processing\r\n const childMapRef = {\r\n name: dep.name,\r\n children: [],\r\n attributes: {},\r\n };\r\n mapRef.children.push(childMapRef);\r\n\r\n yield call(fetchDeps, item, dep, childMapRef);\r\n } catch (e) {\r\n _log.warn(() => ({\r\n msg: \"error while fetchDeps\",\r\n dep,\r\n e,\r\n }));\r\n\r\n yield put(\r\n setOfflineItemSyncStatusAction({\r\n item,\r\n message: e.message,\r\n status: OfflineSyncStatus.SyncedWithErrors,\r\n })\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction* removeOfflineItem(action) {\r\n _log.debug(() => ({\r\n msg: \"remove offline item\",\r\n offlineItem: action.payload.item,\r\n }));\r\n const itemAPI = yield call(getAPI, action.payload.item);\r\n // remove window.cache entries\r\n itemAPI.DeleteCache().then((isSuccess) => {\r\n if (isSuccess)\r\n _log.debug(() => ({\r\n msg: \"successfully deleted cache\",\r\n offlineItem: action.payload.item,\r\n }));\r\n else\r\n _log.warn(() => ({\r\n msg: \"could not delete cache\",\r\n offlineItem: action.payload.item,\r\n }));\r\n });\r\n}\r\n\r\nexport function* checkOfflineItems() {\r\n const hasOfflineItems = yield select(s.userHasOfflineItemsSelector);\r\n // retrieve current offline items\r\n const currentOffline = yield select(s.offlineItemsSelector);\r\n /* istanbul ignore else */\r\n if (\r\n hasOfflineItems /* istanbul ignore next */ ||\r\n Object.keys(currentOffline).length > 0\r\n ) {\r\n // https://storage.spec.whatwg.org/#example-3a7051a8\r\n if (\r\n !promptedForPersistentStorage &&\r\n navigator.storage &&\r\n navigator.storage.persist\r\n ) {\r\n // eslint-disable-next-line no-loop-func\r\n navigator.storage.persist().then((persistent) => {\r\n promptedForPersistentStorage = true;\r\n /* istanbul ignore else */\r\n if (persistent)\r\n _log.info(\r\n () =>\r\n \"Storage will not be cleared except by explicit user action\"\r\n );\r\n else\r\n _log.warn(\r\n () =>\r\n \"Storage may be cleared by the UA under storage pressure.\"\r\n );\r\n });\r\n }\r\n\r\n // manual offline files\r\n try {\r\n // yield put(\r\n // setOfflineSyncStatusAction({\r\n // status: OfflineSyncStatus.Syncing,\r\n // })\r\n // );\r\n\r\n const itemsToSync = [];\r\n\r\n // Update cached User network call to fix #56961 (update detached)\r\n yield spawn(updateUser);\r\n // retrieve new ones (with .LastUpdate) from server\r\n const items = yield call(fetchOfflineItems);\r\n\r\n // let's check the new ones\r\n for (const item of items) {\r\n // do we have this one already?\r\n const currentOfflineItem = currentOffline[item.id];\r\n // same same? no need to sync\r\n if (\r\n currentOfflineItem &&\r\n currentOfflineItem.lastUpdate === item.lastUpdate &&\r\n [\r\n OfflineSyncStatus.Synced,\r\n OfflineSyncStatus.SyncedWithErrors,\r\n OfflineSyncStatus.Error,\r\n ].includes(currentOfflineItem.status)\r\n ) {\r\n const exists = yield call(\r\n getAPI(currentOfflineItem).CacheExists\r\n );\r\n if (exists) {\r\n _log.debug(() => ({\r\n msg: \"item already synchronized\",\r\n offlineItem: currentOfflineItem,\r\n }));\r\n continue;\r\n }\r\n }\r\n // TODO better granularity of which ItemsUris within an OfflineItem to sync?\r\n itemsToSync.push(item);\r\n }\r\n // process currentOfflineItems that have been removed!\r\n for (const currentOfflineItem of Object.values(currentOffline)) {\r\n const item = items.find((i) => i.id === currentOfflineItem.id);\r\n // does not exist anymore! purge\r\n if (item == null) {\r\n yield put(removeOfflineItemAction(currentOfflineItem));\r\n }\r\n }\r\n\r\n if (itemsToSync.length > 0) {\r\n _log.debug(() => ({\r\n msg: \"checkOfflineItems: itemsToSync\",\r\n itemsToSync,\r\n }));\r\n // TODO should we clear current cache for this item as a whole?\r\n // put(setOfflineItemSyncStatusAction) BEFORE startOfflineSyncAction() so they are all visible in the sidebar!\r\n for (const item of itemsToSync) {\r\n yield put(\r\n setOfflineItemSyncStatusAction({\r\n item,\r\n status: OfflineSyncStatus.Unknown,\r\n })\r\n );\r\n }\r\n yield put(startOfflineSyncAction(itemsToSync));\r\n } else {\r\n _log.debug(() => \"checkOfflineItems: nothing to sync!\");\r\n // yield put(\r\n // setOfflineSyncStatusAction({\r\n // status: OfflineSyncStatus.Synced,\r\n // })\r\n // );\r\n }\r\n } catch (e) {\r\n _log.fatalException(\r\n () => ({ msg: \"Error in checkOfflineItems()\" }),\r\n e\r\n );\r\n yield put(\r\n offlineSyncDoneAction({\r\n status: OfflineSyncStatus.Error,\r\n message: e.message,\r\n })\r\n );\r\n }\r\n }\r\n}\r\n\r\nexport function* watchOfflineSync() {\r\n while (true) {\r\n const isOnline = yield select(s.isApiOnlineSelector);\r\n // if (!isOnline) {\r\n // const hasBeenOnline = yield select(s.hasBeenOnlineSelector);\r\n // if (!hasBeenOnline) {\r\n // yield call(delay, 1000 * 5);\r\n // continue;\r\n // }\r\n // }\r\n if (isOnline && !isSyncing) {\r\n // check pending offline queue\r\n yield call(replayOfflineQueue);\r\n // check offlineItems to cache\r\n yield call(checkOfflineItems);\r\n }\r\n yield race({\r\n user: take(actionTypes.OFFLINE_SYNC_UPDATE),\r\n network: take(networkActionTypes.PING_SUCCESS),\r\n timeout: delay(1000 * 60), // TODO #54607 appSettings offline refresh timeout\r\n });\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\nfunction* getDepsMap(action) {\r\n yield put(\r\n setOfflineItemDepsMapAction(\r\n action.payload.item,\r\n depsMap[action.payload.item.id]\r\n )\r\n );\r\n}\r\n\r\n/* istanbul ignore next */\r\nfunction persistNetworkStatus(action) {\r\n // To avoid race-condition with network-status reducer = > calculate online status by ourself\r\n const offline = [\r\n networkActionTypes.PING_FAILURE,\r\n networkActionTypes.NAVIGATOR_OFFLINE,\r\n ];\r\n const payload = {\r\n isOnline: !offline.includes(action.type),\r\n };\r\n window.caches.open(\"swConfig\").then((cache) =>\r\n cache\r\n .put(\r\n \"/swConfig\",\r\n new Response(JSON.stringify(payload), {\r\n status: 200,\r\n headers: { \"Content-Type\": \"application/json\" },\r\n })\r\n )\r\n .then(() =>\r\n _log.info(() => ({\r\n msg: \"Persited Networkstatus to cache\",\r\n payload,\r\n }))\r\n )\r\n );\r\n}\r\n\r\n/* istanbul ignore next */\r\nfunction* watchNetworkStatus() {\r\n yield takeLatest(\r\n [\r\n networkActionTypes.PING_SUCCESS,\r\n networkActionTypes.PING_FAILURE,\r\n networkActionTypes.NAVIGATOR_ONLINE,\r\n networkActionTypes.NAVIGATOR_OFFLINE,\r\n ],\r\n persistNetworkStatus\r\n );\r\n}\r\n\r\nfunction* offlineSaga() {\r\n if (!hasCacheSupport()) {\r\n _log.info(\r\n () =>\r\n \"Browser does not support Caching - offlineItems cannot be synchronized!\"\r\n );\r\n return;\r\n }\r\n if (!isFeatureOn(Feature.offline)) {\r\n _log.info(\r\n () =>\r\n \"Offline feature disabled in appsettings - offlineItems cannot be synchronized!\"\r\n );\r\n return;\r\n }\r\n\r\n yield all([\r\n // listen for sync requests\r\n takeLatest(actionTypes.OFFLINE_SYNC_REQUEST, startSync),\r\n // listen for removals\r\n takeLatest(actionTypes.OFFLINEITEM_REMOVE, removeOfflineItem),\r\n // retrieve last offlineItem sync and add it to redux store\r\n takeLatest(actionTypes.OFFLINEITEM_DEPSMAP_REQUEST, getDepsMap),\r\n // background sync job\r\n fork(watchOfflineSync),\r\n // handle online/offline changes\r\n fork(watchNetworkStatus),\r\n ]);\r\n}\r\n\r\nexport default offlineSaga;\r\n\r\n// continuos check for actual server connectivity - forked by rootSaga\r\n/* istanbul ignore next*/\r\nexport function* checkServerConnectivity() {\r\n // check for network outages\r\n const correlationId = yield select(s.userCorrelationIdSelector);\r\n const pingUrl = `${window.CONFIG.host.basename}/ping`;\r\n var headers = new Headers();\r\n if (correlationId != null) {\r\n headers.append(CustomHttpHeader.CorrelationId, correlationId);\r\n }\r\n yield put(\r\n networkActions.startWatchNetworkStatus(\r\n new Request(pingUrl, {\r\n headers,\r\n })\r\n )\r\n );\r\n // additionally, periodically check for server connection\r\n // while (true) {\r\n // if (!isSyncing) {\r\n // if (yield select(isNavigatorOnlineSelector)) {\r\n // yield put(networkActions.ping(pingUrl));\r\n // }\r\n // }\r\n // yield call(delay, 1000 * 10); //every 10sec\r\n // }\r\n}\r\n","import { call, put, takeLatest, select } from \"redux-saga/effects\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport { getUserResultAction } from \"data/actions\";\r\nimport { fetchUser } from \"data/api\";\r\nimport Constants from \"data/constants\";\r\nimport { version } from \"../../../package.json\";\r\nimport { signout } from \"data/loginFlow\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\n// worker Saga: will be fired on USER_FETCH_REQUESTED actions\r\nfunction* getUser(action) {\r\n try {\r\n const user = yield call(fetchUser);\r\n window.CONFIG.web_version = version;\r\n window.CONFIG.provider_fileVersion = user.provider_fileVersion;\r\n window.CONFIG.provider_serviceVersion = user.provider_serviceVersion;\r\n window.CONFIG.general.features = user.features;\r\n\r\n yield put(getUserResultAction({ status: Constants.OK, info: user }));\r\n //}\r\n } catch (e) {\r\n yield put(\r\n getUserResultAction({ status: Constants.ERROR, message: e.message })\r\n );\r\n }\r\n}\r\n\r\nfunction* logoutUser() {\r\n const idToken = yield select(s.loginIdTokenSelector);\r\n yield call(signout, idToken);\r\n}\r\n\r\nfunction* userSaga() {\r\n yield takeLatest(actionTypes.USER_FETCH_REQUESTED, getUser);\r\n yield takeLatest(actionTypes.LOGIN_SIGNOUT, logoutUser);\r\n}\r\n\r\nexport default userSaga;\r\n","import {\r\n call,\r\n put,\r\n takeLatest,\r\n takeEvery,\r\n select,\r\n take,\r\n race,\r\n} from \"redux-saga/effects\";\r\nimport { delay } from \"redux-saga\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport {\r\n getFavoritesAction,\r\n getFavoritesResultAction,\r\n setCurrentBreadcrumb,\r\n} from \"data/actions\";\r\nimport { fetchFavorites } from \"data/api\";\r\nimport Constants from \"data/constants\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\nconst breadcrumbSelector = (state, viewName) => state.breadcrumb[viewName];\r\n\r\nfunction* getFavorites(action) {\r\n try {\r\n const favorites = yield call(fetchFavorites);\r\n yield put(\r\n getFavoritesResultAction({ status: Constants.OK, favorites })\r\n );\r\n\r\n // const breadcrumb = yield select(breadcrumbSelector);\r\n // yield put(setCurrentBreadcrumb(breadcrumb));\r\n } catch (e) {\r\n yield put(\r\n getFavoritesResultAction({\r\n status: Constants.ERROR,\r\n message: e.message,\r\n })\r\n );\r\n }\r\n}\r\n\r\nfunction* checkIsFav(action) {\r\n const breadcrumb = yield select(\r\n breadcrumbSelector,\r\n action.payload.viewName\r\n );\r\n // only check if unknown\r\n if (breadcrumb != null && breadcrumb.isFav == null) {\r\n let stateFavoritesStatus = yield select(s.favoritesStatusSelector);\r\n if (\r\n [Constants.LOADING, Constants.REFRESH].includes(\r\n stateFavoritesStatus\r\n )\r\n ) {\r\n const { timeout } = yield race({\r\n favoritesFetched: take(actionTypes.FAVORITES_FETCH_RESULT),\r\n timeout: call(delay, 5000),\r\n });\r\n stateFavoritesStatus = yield select(s.favoritesStatusSelector);\r\n /* istanbul ignore if */\r\n if (timeout || stateFavoritesStatus !== Constants.OK) {\r\n return;\r\n }\r\n }\r\n const stateFavorites = yield select(s.favoritesFavoritesSelector);\r\n // only check if favorites known\r\n /* istanbul ignore else */\r\n if (stateFavorites != null) {\r\n const isFav = stateFavorites.includes(breadcrumb.itemUri);\r\n // update state\r\n yield put(setCurrentBreadcrumb({ ...action.payload, isFav }));\r\n }\r\n }\r\n}\r\n\r\nexport function* refreshFavorites(action) {\r\n /* istanbul ignore else */\r\n if (\"favorite\" === action.payload.item) {\r\n return yield put(getFavoritesAction(Constants.REFRESH));\r\n }\r\n}\r\n\r\nfunction* favoritesSaga() {\r\n yield takeLatest(actionTypes.FAVORITES_FETCH_REQUEST, getFavorites);\r\n yield takeEvery(actionTypes.CURRENT_BREADCRUMB, checkIsFav);\r\n yield takeEvery(actionTypes.GLOBALEVENTS_SERVER, refreshFavorites);\r\n}\r\n\r\nexport default favoritesSaga;\r\n","import { call, put, takeLatest, cancelled } from \"redux-saga/effects\";\r\nimport { delay } from \"redux-saga\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport { getCardsAction, getCardsResultAction } from \"data/actions\";\r\nimport { fetchCards } from \"data/api\";\r\nimport Constants from \"data/constants\";\r\n\r\nexport const lib = {\r\n delay,\r\n};\r\n\r\n// worker Saga: will be fired on CARDS_FETCH_REQUESTED actions\r\nexport function* getCards(action) {\r\n if (\r\n action &&\r\n action.payload &&\r\n action.payload.status === Constants.REFRESH\r\n ) {\r\n // this delay in combination with takeLatest\r\n // is our debouncer to avoid multiple calls\r\n yield call(lib.delay, 10000);\r\n }\r\n\r\n // https://decembersoft.com/posts/redux-saga-abort-controller-cancel-api-calls/\r\n const abortController = new AbortController();\r\n\r\n try {\r\n const cards = yield call(fetchCards, abortController.signal);\r\n yield put(getCardsResultAction({ status: Constants.OK, cards }));\r\n } catch (e) {\r\n yield put(\r\n getCardsResultAction({\r\n status: Constants.ERROR,\r\n message: e.message,\r\n })\r\n );\r\n } finally {\r\n if (yield cancelled()) {\r\n // Cancel the API call if the saga was cancelled\r\n abortController.abort();\r\n }\r\n }\r\n}\r\n\r\nfunction* refreshCards(action) {\r\n /* istanbul ignore else */\r\n if (\r\n action.payload.action === \"view\" &&\r\n [\"document\", \"folder\", \"task\", \"search\"].includes(action.payload.item)\r\n ) {\r\n return yield put(getCardsAction(Constants.REFRESH));\r\n }\r\n}\r\n\r\nfunction* cardsSaga() {\r\n yield takeLatest(actionTypes.CARDS_FETCH_REQUESTED, getCards);\r\n yield takeLatest(actionTypes.GLOBALEVENTS_SERVER, refreshCards);\r\n}\r\n\r\nexport default cardsSaga;\r\n","import { call, put, takeLatest, cancelled } from \"redux-saga/effects\";\r\nimport { delay } from \"redux-saga\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport { getWorkflowCards, getWorkflowCardsResult } from \"data/actions\";\r\nimport { fetchWorkflowCards } from \"data/api\";\r\nimport Constants from \"data/constants\";\r\n\r\nexport const lib = {\r\n delay,\r\n};\r\n\r\n// worker Saga: will be fired on WF_FETCH_REQUESTED actions\r\nexport function* getCards(action) {\r\n if (\r\n action &&\r\n action.payload &&\r\n action.payload.status === Constants.REFRESH\r\n ) {\r\n // this delay in combination with takeLatest\r\n // is our debouncer to avoid multiple calls\r\n yield call(lib.delay, 10000);\r\n }\r\n\r\n // https://decembersoft.com/posts/redux-saga-abort-controller-cancel-api-calls/\r\n const abortController = new AbortController();\r\n\r\n try {\r\n const cards = yield call(fetchWorkflowCards, abortController.signal);\r\n yield put(getWorkflowCardsResult({ status: Constants.OK, cards }));\r\n } catch (e) {\r\n yield put(\r\n getWorkflowCardsResult({\r\n status: Constants.ERROR,\r\n message: e.message,\r\n })\r\n );\r\n } finally {\r\n if (yield cancelled()) {\r\n // Cancel the API call if the saga was cancelled\r\n abortController.abort();\r\n }\r\n }\r\n}\r\n\r\nfunction* refreshCards(action) {\r\n /* istanbul ignore else */\r\n if (\r\n action.payload.action === \"view\" &&\r\n [\"document\", \"folder\", \"task\", \"search\"].includes(action.payload.item)\r\n ) {\r\n return yield put(getWorkflowCards(Constants.REFRESH));\r\n }\r\n}\r\n\r\nfunction* workflowSaga() {\r\n yield takeLatest(actionTypes.WF_FETCH_REQUESTED, getCards);\r\n yield takeLatest(actionTypes.GLOBALEVENTS_SERVER, refreshCards);\r\n}\r\n\r\nexport default workflowSaga;\r\n","import { call, put, takeLatest, cancelled } from \"redux-saga/effects\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport { getTreeResultAction } from \"data/actions\";\r\nimport { fetchTree } from \"data/api\";\r\nimport Constants from \"data/constants\";\r\n\r\nexport function* getTree(action) {\r\n // https://decembersoft.com/posts/redux-saga-abort-controller-cancel-api-calls/\r\n const abortController = new AbortController();\r\n\r\n try {\r\n const tree = yield call(fetchTree, {\r\n itemUri: action.payload.itemUri,\r\n filter: action.payload.filter,\r\n deep: action.payload.deep,\r\n all: action.payload.all,\r\n signal: abortController.signal,\r\n });\r\n yield put(\r\n getTreeResultAction({ status: Constants.OK, tree, error: null })\r\n );\r\n } catch (e) {\r\n yield put(\r\n getTreeResultAction({\r\n status: Constants.ERROR,\r\n error: e,\r\n })\r\n );\r\n } finally {\r\n if (yield cancelled()) {\r\n // Cancel the API call if the saga was cancelled\r\n abortController.abort();\r\n }\r\n }\r\n}\r\n\r\nfunction* treeSaga() {\r\n yield takeLatest(actionTypes.TREE_FETCH_REQUEST, getTree);\r\n}\r\n\r\nexport default treeSaga;\r\n","import { call, put, takeLatest, cancelled, select } from \"redux-saga/effects\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport { getDocsResultAction } from \"data/actions\";\r\nimport { fetchDocs, fetchDocsCsv, fetchDocCount } from \"data/api\";\r\nimport Constants from \"data/constants\";\r\nimport FileSaver from \"file-saver\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\n// fetches batch of results\r\nexport function* getDocs(action) {\r\n // https://decembersoft.com/posts/redux-saga-abort-controller-cancel-api-calls/\r\n const abortController = new AbortController();\r\n\r\n // this delay in combination with takeLatest\r\n // is our debouncer to avoid multiple calls\r\n // yield call(delay, 300);\r\n try {\r\n const result = yield call(\r\n fetchDocs,\r\n action.payload.itemUri,\r\n action.payload.pageNum,\r\n action.payload.sorts,\r\n action.payload.filters,\r\n action.payload.cols,\r\n abortController.signal\r\n );\r\n\r\n yield put(\r\n getDocsResultAction({\r\n status: Constants.OK,\r\n result,\r\n totalCount: result.rowCount,\r\n error: null,\r\n })\r\n );\r\n\r\n // do we need to fetch the real totalCount?\r\n if (\r\n (action.payload.pageNum === 0 ||\r\n action.payload.pageNum === undefined) &&\r\n result.rowCount > 0 &&\r\n result.rowCount === result.pageSize\r\n ) {\r\n const totalCount = yield call(\r\n fetchDocCount,\r\n action.payload.itemUri,\r\n action.payload.filters,\r\n abortController.signal\r\n );\r\n yield put(\r\n getDocsResultAction({\r\n status: Constants.OK,\r\n result,\r\n totalCount,\r\n error: null,\r\n })\r\n );\r\n }\r\n } catch (e) {\r\n yield put(\r\n getDocsResultAction({\r\n status: Constants.ERROR,\r\n error: e,\r\n })\r\n );\r\n } finally {\r\n if (yield cancelled()) {\r\n // console.log(\"getDocs cancelled\");\r\n // Cancel the API call if the saga was cancelled\r\n abortController.abort();\r\n }\r\n }\r\n}\r\n\r\nfunction* exportToCsv() {\r\n const itemUri = yield select(s.currentItemUriSelector);\r\n const filters = yield select(s.docsFiltersSelector);\r\n const sorts = yield select(s.docsSortsSelector);\r\n\r\n const blob = yield call(fetchDocsCsv, itemUri, sorts, filters);\r\n FileSaver.saveAs(blob, \"inPoint.Web.Export.csv\");\r\n}\r\n\r\nfunction* docsSaga() {\r\n yield takeLatest(actionTypes.DOCS_FETCH_REQUEST, getDocs);\r\n yield takeLatest(actionTypes.DOCS_EXPORT_CSV, exportToCsv);\r\n}\r\n\r\nexport default docsSaga;\r\n","import { call, put, take, takeEvery, select, race } from \"redux-saga/effects\";\r\nimport { delay } from \"redux-saga\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport { getDocsAction, setDocsLayoutAction } from \"data/actions\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { DocListFilterOperators, SearchValueType } from \"data/types\";\r\nimport {\r\n GetDefaults,\r\n ResetFilters,\r\n GetFilterValueAsString,\r\n} from \"components/DocListFilterModal/Utils\";\r\nimport immutable from \"object-path-immutable\";\r\nimport Constants, { getDefaultsConfig } from \"data/constants\";\r\n\r\nconst resultSelector = (state) => state.docs;\r\nconst currentItemSelector = (state) => state.current;\r\nconst formatIdSelector = (state) =>\r\n s.breadcrumbFormatIdSelector(state, s.currentNameSelector(state));\r\n\r\n// clears all filters & sorts (in case none is available, will reset everything)\r\nfunction* resetFilters() {\r\n const result = yield select(resultSelector);\r\n const formatId = yield select(formatIdSelector);\r\n if (result != null && result.cols != null && result.cols.length > 0) {\r\n yield put(\r\n setDocsLayoutAction({\r\n sorts: [],\r\n filters: ResetFilters(\r\n result.itemUri,\r\n formatId,\r\n result.filters,\r\n result.cols\r\n ),\r\n })\r\n );\r\n } else {\r\n // bruteforce - delete everything\r\n yield put(setDocsLayoutAction());\r\n }\r\n}\r\n\r\n// create a filter based on a value referenced from the result.rows\r\nfunction* setFilterByRef(action) {\r\n const status = yield select(s.docsStatusSelector);\r\n if (status !== Constants.OK) return;\r\n\r\n const { docContextClick, resetValues } = action.payload;\r\n const result = yield select(resultSelector);\r\n const formatId = yield select(formatIdSelector);\r\n //const filters = yield select(s.docsFiltersSelector);\r\n //const cols = yield select(s.docsColsSelector);\r\n /* istanbul ignore else */\r\n if (result != null && result.cols != null) {\r\n // get current filters\r\n let filters = result.filters;\r\n // none yet? create default list\r\n if (filters == null || filters.length === 0) {\r\n filters = GetDefaults(\r\n result.itemUri,\r\n formatId,\r\n result.cols\r\n ).filters;\r\n }\r\n if (resetValues) {\r\n // reset values ONLY (operators stay as they are)\r\n filters = ResetFilters(\r\n result.itemUri,\r\n formatId,\r\n filters,\r\n result.cols\r\n );\r\n }\r\n const { cols } = result;\r\n const colName = cols[docContextClick.columnIndex].name;\r\n\r\n // then set our own\r\n const newfilters = filters.map((filter, index) => {\r\n if (filter.name === colName) {\r\n let newfilter = immutable.set(filter, \"values\", [\r\n docContextClick.rowIndex === -1\r\n ? \"\"\r\n : GetFilterValueAsString(\r\n result.rows[docContextClick.rowIndex][\r\n docContextClick.columnIndex\r\n ]\r\n ),\r\n ]);\r\n if (\r\n [\r\n DocListFilterOperators.None,\r\n DocListFilterOperators.Between,\r\n DocListFilterOperators.NotBetween,\r\n // DocListFilterOperators.Contains\r\n ].includes(newfilter.operator)\r\n )\r\n newfilter.operator = DocListFilterOperators.Equals;\r\n if (\r\n [DocListFilterOperators.DoesNotContain].includes(\r\n newfilter.operator\r\n )\r\n )\r\n newfilter.operator = DocListFilterOperators.NotEquals;\r\n return newfilter;\r\n }\r\n return filter;\r\n });\r\n yield put(setDocsLayoutAction({ filters: newfilters }));\r\n }\r\n}\r\n\r\nfunction* setFilterByName(action) {\r\n const result = yield select(resultSelector);\r\n const formatId = yield select(formatIdSelector);\r\n /* istanbul ignore else */\r\n if (result == null || result.cols == null) return;\r\n\r\n const { name, valueType, operator, value } = action.payload;\r\n // get current filters\r\n let filters = result.filters;\r\n // none yet? create default list\r\n if (filters == null || filters.length === 0) {\r\n filters = GetDefaults(result.itemUri, formatId, result.cols).filters;\r\n }\r\n\r\n // new value to assign; reset or set value\r\n let newValue =\r\n value === \"__ALL__\" ||\r\n (valueType === SearchValueType.RelativeDate && value === \"NotSet\")\r\n ? \"\"\r\n : value;\r\n // Transform to Array (if not already an array)\r\n if (!Array.isArray(newValue)) {\r\n newValue = [newValue];\r\n }\r\n // find requested filter\r\n const idx = filters.findIndex((f) => f.name === name);\r\n let newFilters = filters;\r\n if (idx === -1) {\r\n // add new filter\r\n newFilters = immutable.push(filters, undefined, {\r\n name,\r\n operator,\r\n values: newValue,\r\n });\r\n } else {\r\n newFilters = immutable.set(filters, [idx], {\r\n name,\r\n operator: operator || filters[idx].operator,\r\n values: newValue,\r\n });\r\n }\r\n // publish the changed filters\r\n yield put(setDocsLayoutAction({ filters: newFilters }));\r\n}\r\n\r\nfunction* getDocsLayout(action) {\r\n let formatId = yield select(formatIdSelector);\r\n if (formatId == null) {\r\n yield take(actionTypes.CURRENT_BREADCRUMB);\r\n formatId = yield select(formatIdSelector);\r\n }\r\n // anything saved in storage?\r\n const { currentItemLoaded, timeout } = yield race({\r\n currentItemLoaded: take(actionTypes.CURRENTITEM_LOADED),\r\n timeout: call(delay, 2000),\r\n });\r\n if (\r\n !timeout &&\r\n currentItemLoaded &&\r\n currentItemLoaded.payload.layout != null\r\n ) {\r\n /* console.debug(\r\n \"restoring layout from storage\",\r\n currentItemLoaded.payload.layout\r\n ); */\r\n yield put(setDocsLayoutAction(currentItemLoaded.payload.layout));\r\n return;\r\n }\r\n // or maybe defaults config?\r\n const defaults = getDefaultsConfig(action.payload.itemUri, formatId);\r\n /* istanbul ignore else */\r\n if (defaults !== null) {\r\n const { filters, sorts } = defaults;\r\n /* istanbul ignore else */\r\n if (filters != null /* istanbul ignore next */ || sorts != null) {\r\n /* console.debug(\"setting layout from defaults\", defaults); */\r\n yield put(setDocsLayoutAction({ filters, sorts }));\r\n return;\r\n }\r\n }\r\n\r\n // create default\r\n const result = yield select(resultSelector);\r\n if (result != null && result.cols != null) {\r\n /* console.debug(\"setting layout by GetDefaults()\"); */\r\n yield put(\r\n setDocsLayoutAction(\r\n GetDefaults(result.itemUri, formatId, result.cols)\r\n )\r\n );\r\n return;\r\n } else if (action.payload.allowPreFetch === true) {\r\n // only if param \"allowPreFetch\" is set! (related to showDocs=true and immediately showing filters)\r\n const currentItem = yield select(currentItemSelector);\r\n /* console.debug(\"setting layout by first getting schema\"); */\r\n yield put(getDocsAction({ pageNum: -1, itemUri: currentItem.itemUri }));\r\n const docsresult = yield take(actionTypes.DOCS_FETCH_RESULT);\r\n yield put(\r\n setDocsLayoutAction(\r\n GetDefaults(\r\n currentItem.itemUri,\r\n formatId,\r\n docsresult.payload.result.cols\r\n )\r\n )\r\n );\r\n return;\r\n }\r\n\r\n yield put(setDocsLayoutAction());\r\n}\r\n\r\nfunction* setFilterText(action) {\r\n yield setFilterByName(action);\r\n}\r\n\r\nfunction* docsSaga() {\r\n yield takeEvery(actionTypes.DOCS_FILTERS_RESET, resetFilters);\r\n yield takeEvery(actionTypes.DOCS_FILTERS_SETBYREF, setFilterByRef);\r\n yield takeEvery(actionTypes.DOCS_FILTERS_SETBYNAME, setFilterByName);\r\n yield takeEvery(actionTypes.DOCS_FILTERTEXT_SET, setFilterText);\r\n\r\n yield takeEvery(actionTypes.DOCS_LAYOUT_REQUEST, getDocsLayout);\r\n}\r\n\r\nexport default docsSaga;\r\n","import { call, put, takeEvery, select } from \"redux-saga/effects\";\r\nimport { delay } from \"redux-saga\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport {\r\n togglesChangeAction,\r\n currentItemLoadedAction,\r\n //setCurrentItemAction,\r\n saveCurrentItemAction,\r\n setSplitPanesAction,\r\n} from \"data/actions\";\r\nimport { viewStorage, cacheStorage } from \"data/storage\";\r\nimport {\r\n isMiniView,\r\n isFeatureOn,\r\n Feature,\r\n getDefaultsConfig,\r\n} from \"data/constants\";\r\nimport queryString from \"data/queryString\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\nconst togglesSelector = (state) => state.toggles;\r\nconst panesSelector = (state) => state.panes;\r\n\r\nconst ignoredViews = [\"itemflows\", \"upload\", \"search\"];\r\nconst isIgnoredView = (view) => ignoredViews.indexOf(view) > -1;\r\n\r\nfunction* loadSettings(action) {\r\n try {\r\n const currentItemName = yield select(s.currentNameSelector);\r\n const currentItemUri = yield select(s.currentItemUriSelector);\r\n const name = yield call(getName, action, currentItemName);\r\n\r\n // Bail early if on ignored view\r\n /* istanbul ignore if */\r\n if (isIgnoredView(name)) {\r\n yield put(currentItemLoadedAction());\r\n return;\r\n }\r\n\r\n const key = yield call(getKey, name, currentItemUri);\r\n const value = yield call(\r\n [\r\n shouldPersist(currentItemUri) ? viewStorage : cacheStorage,\r\n \"getItem\",\r\n ],\r\n name\r\n );\r\n if (value !== null) {\r\n value.layout = yield call(\r\n [\r\n shouldPersist(currentItemUri) ? viewStorage : cacheStorage,\r\n \"getItem\",\r\n ],\r\n key\r\n );\r\n const qs = queryString.parse(window.location.search);\r\n if (\r\n Object.prototype.hasOwnProperty.call(value, \"toggles\") &&\r\n !qs.toggles\r\n ) {\r\n const toggles = value.toggles.map((togglename) => {\r\n // Trigger action view on home in Mini-View\r\n let value = togglename;\r\n /* istanbul ignore next */\r\n if (\r\n isMiniView(window.location) &&\r\n name === \"home\" &&\r\n value !== \"action\" &&\r\n isFeatureOn(Feature.homeActions)\r\n ) {\r\n console.warn(\r\n `Mini View \"${name}\" currently does not support \"${value}\", falling back to \"action\"`\r\n );\r\n value = \"action\";\r\n }\r\n return { value, isSelected: true };\r\n });\r\n //console.log(\"settoggles\", toggles);\r\n yield put(togglesChangeAction(currentItemName, toggles));\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(value, \"panes\") &&\r\n !qs.toggles\r\n ) {\r\n for (let key in value.panes) {\r\n yield put(\r\n setSplitPanesAction({\r\n view: name,\r\n name: key,\r\n dimensions: value.panes[key],\r\n })\r\n );\r\n }\r\n }\r\n\r\n // console.log(\"loadsettings\", value, name);\r\n }\r\n\r\n yield put(currentItemLoadedAction(value));\r\n } catch (e) {\r\n /* istanbul ignore next */\r\n console.warn(e);\r\n }\r\n}\r\n\r\nfunction shouldPersist(itemUri: string): boolean {\r\n const def = getDefaultsConfig(itemUri);\r\n if (def != null && def.persist != null) return def.persist;\r\n else return true;\r\n}\r\n\r\nfunction* calcCurrentItem(action) {\r\n yield call(delay, 500);\r\n try {\r\n const currentItemName = yield select(s.currentNameSelector);\r\n const currentItemUri = yield select(s.currentItemUriSelector);\r\n const name = yield call(getName, action, currentItemName);\r\n\r\n // Bail early if on ignored view\r\n /* istanbul ignore if */\r\n if (isIgnoredView(name)) {\r\n return;\r\n }\r\n\r\n const key = yield call(getKey, name, currentItemUri);\r\n // console.log(\"calcCurrentItem\", action.type, name, key);\r\n\r\n /* istanbul ignore next */\r\n let value = yield call(\r\n [\r\n shouldPersist(currentItemUri) ? viewStorage : cacheStorage,\r\n \"getItem\",\r\n ],\r\n name\r\n );\r\n // console.log(\"val\", action.type, value);\r\n /* istanbul ignore next */\r\n if (value == null) {\r\n value = {};\r\n }\r\n\r\n /* istanbul ignore next */\r\n value.layout = yield call(\r\n [\r\n shouldPersist(currentItemUri) ? viewStorage : cacheStorage,\r\n \"getItem\",\r\n ],\r\n key\r\n );\r\n\r\n // Setup defaults\r\n const toggles = yield select(togglesSelector);\r\n value.toggles = toggles[name][\"_selected\"];\r\n const panes = yield select(panesSelector);\r\n value.panes = panes[name] /* istanbul ignore next */ || [];\r\n value.layout = {};\r\n\r\n //console.log(\"action\", action);\r\n switch (action.type) {\r\n /* istanbul ignore next */\r\n case actionTypes.CURRENTITEM_SET:\r\n //yield call(loadSettings, action);\r\n break;\r\n\r\n case actionTypes.TOGGLES_PERSIST:\r\n value.toggles = action.payload.toggles\r\n .filter((t) => t.isSelected)\r\n .map((t) => t.value);\r\n break;\r\n\r\n case actionTypes.SPLITPANES_PERSIST:\r\n value.panes[action.payload.name] = action.payload.dimensions;\r\n break;\r\n\r\n case actionTypes.DOCS_LAYOUT_SET:\r\n const filters =\r\n action.payload.filters ||\r\n (yield select(s.docsLayoutFiltersSelector));\r\n const sorts =\r\n action.payload.sorts ||\r\n (yield select(s.docsLayoutSortsSelector));\r\n value.layout = {\r\n filters,\r\n sorts,\r\n };\r\n break;\r\n\r\n /* istanbul ignore next */\r\n default:\r\n console.warn(\r\n \"currentItemSaga.calcCurrentItem cannot handle action.type=\" +\r\n action.type\r\n );\r\n break;\r\n }\r\n\r\n yield put(\r\n saveCurrentItemAction({\r\n name,\r\n key,\r\n value,\r\n persist: shouldPersist(currentItemUri),\r\n })\r\n );\r\n } catch (e) {\r\n /* istanbul ignore next */\r\n console.warn(e);\r\n }\r\n}\r\n\r\nfunction* saveCurrentItem(action) {\r\n try {\r\n const {\r\n name,\r\n key,\r\n value: { layout, ...rest },\r\n persist,\r\n } = action.payload;\r\n // console.log(\"saveCurrentItem\", action.type, key, value);\r\n yield call(\r\n [persist ? viewStorage : cacheStorage, \"setItem\"],\r\n name,\r\n rest\r\n );\r\n yield call(\r\n [persist ? viewStorage : cacheStorage, \"setItem\"],\r\n key,\r\n layout\r\n );\r\n } catch (e) {\r\n /* istanbul ignore next */\r\n console.warn(e);\r\n }\r\n}\r\n\r\nexport function getKey(name, currentItemUri) {\r\n switch (name) {\r\n // doc* settings are global and not itemUri specific\r\n case \"document\":\r\n case \"docmodal\":\r\n // const folderItemUri = currentItemUri.substring(\r\n // 0,\r\n // currentItemUri.indexOf(\"@eid\")\r\n // );\r\n // return `${name}_${folderItemUri}`;\r\n return name;\r\n default:\r\n return `${name}_${currentItemUri}`;\r\n }\r\n}\r\n\r\nexport function getName(action, currentItemName) {\r\n let name;\r\n switch (action.type) {\r\n case actionTypes.CURRENTITEM_SET:\r\n case actionTypes.TOGGLES_PERSIST:\r\n name = action.payload.name;\r\n break;\r\n case actionTypes.DOCS_LAYOUT_SET:\r\n name = currentItemName;\r\n break;\r\n case actionTypes.SPLITPANES_PERSIST:\r\n name = action.payload.view;\r\n break;\r\n default:\r\n console.warn(\r\n \"currentItemSaga.getName cannot handle action.type=\" +\r\n action.type\r\n );\r\n return null;\r\n }\r\n return name;\r\n}\r\n\r\nfunction* currentItemSaga() {\r\n // this will reload settings from storage (and apply them) whenever CURRENTITEM changes\r\n yield takeEvery(actionTypes.CURRENTITEM_SET, loadSettings);\r\n // this will calculate the settings for the CURRENTITEM\r\n yield takeEvery(\r\n [\r\n //actionTypes.CURRENTITEM_SET,\r\n actionTypes.TOGGLES_PERSIST,\r\n actionTypes.SPLITPANES_PERSIST,\r\n actionTypes.DOCS_LAYOUT_SET,\r\n ],\r\n calcCurrentItem\r\n );\r\n // this will save settings in storage\r\n yield takeEvery(actionTypes.CURRENTITEM_SAVE, saveCurrentItem);\r\n}\r\n\r\nexport default currentItemSaga;\r\n","import { call, put, takeLatest, select, cancelled } from \"redux-saga/effects\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport {\r\n getSearchResultAction,\r\n renameSearchFavoriteResultAction,\r\n getSearchFormResultAction,\r\n globalSearchDefaultResultAction,\r\n getSearchFormListResultAction,\r\n getSearchCountResultAction,\r\n togglesUpdateCounterAction,\r\n} from \"data/actions\";\r\nimport { SearchRequestType } from \"data/types\";\r\nimport {\r\n fetchSearchResult,\r\n fetchSearchFormList,\r\n fetchSearchForm,\r\n fetchSAYT,\r\n fetchSearchCount,\r\n} from \"data/api\";\r\nimport Constants from \"data/constants\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport immutable from \"object-path-immutable\";\r\n\r\n// fetches batch of results\r\nfunction* getSearchResult(action) {\r\n try {\r\n const result = yield call(\r\n fetchSearchResult,\r\n action.payload.searchRequest\r\n );\r\n\r\n yield put(\r\n getSearchResultAction({\r\n status: Constants.OK,\r\n result,\r\n terms: [\r\n (\r\n action.payload.searchRequest\r\n .searchText /* istanbul ignore next */ || \"\"\r\n )\r\n .replace(/\\[[^\\s]+/g, \"\")\r\n .trim(),\r\n ],\r\n })\r\n );\r\n } catch (e) {\r\n yield put(\r\n getSearchResultAction({\r\n status: Constants.ERROR,\r\n error: /* istanbul ignore next */ e.data || e.message,\r\n })\r\n );\r\n }\r\n}\r\n\r\nexport function* getSearchCountResult(action) {\r\n // https://decembersoft.com/posts/redux-saga-abort-controller-cancel-api-calls/\r\n const abortController = new AbortController();\r\n try {\r\n const result = yield call(\r\n fetchSearchCount,\r\n action.payload.searchRequest,\r\n abortController.signal\r\n );\r\n\r\n yield put(\r\n getSearchCountResultAction({\r\n status: Constants.OK,\r\n result,\r\n })\r\n );\r\n } catch (e) {\r\n yield put(\r\n getSearchCountResultAction({\r\n status: Constants.ERROR,\r\n message: e.message,\r\n })\r\n );\r\n } finally {\r\n if (yield cancelled()) {\r\n // console.log(\"getDocs cancelled\");\r\n // Cancel the API call if the saga was cancelled\r\n abortController.abort();\r\n }\r\n }\r\n}\r\n\r\nfunction* renameSearchFavorite(action) {\r\n const searchRequest = yield select(s.searchRequestSelector);\r\n // TODO searchFavorite rename existing\r\n if (\r\n searchRequest.searchType !== SearchRequestType.Favorite ||\r\n searchRequest.isCustom\r\n ) {\r\n yield put(\r\n renameSearchFavoriteResultAction({\r\n status: Constants.OK,\r\n message: \"\",\r\n searchRequest: immutable.set(\r\n searchRequest,\r\n \"name\",\r\n action.payload.name\r\n ),\r\n })\r\n );\r\n }\r\n}\r\n\r\nfunction* updateResultToggle(name, result, status) {\r\n yield put(\r\n togglesUpdateCounterAction({\r\n name,\r\n counts: { result },\r\n status,\r\n })\r\n );\r\n}\r\n\r\nfunction* resetResultToggle(name) {\r\n yield updateResultToggle(name, -1, Constants.OK);\r\n}\r\n\r\nfunction* resetSearch() {\r\n yield resetResultToggle(\"search\");\r\n yield resetResultToggle(\"searchresult\");\r\n}\r\n\r\nfunction* updateSearchFormToggles(counts, status) {\r\n yield put(\r\n togglesUpdateCounterAction({\r\n name: \"forms\",\r\n counts,\r\n status,\r\n })\r\n );\r\n yield put(\r\n togglesUpdateCounterAction({\r\n name: \"search\",\r\n counts: {\r\n forms: counts,\r\n },\r\n status: {\r\n forms: status,\r\n },\r\n })\r\n );\r\n}\r\n\r\nfunction* getSearchFormList(action) {\r\n try {\r\n yield updateSearchFormToggles(-1, Constants.LOADING);\r\n const result = yield call(fetchSearchFormList);\r\n yield updateSearchFormToggles(result.length, Constants.OK);\r\n yield put(\r\n getSearchFormListResultAction({\r\n status: Constants.OK,\r\n result,\r\n })\r\n );\r\n } catch (e) {\r\n yield put(\r\n getSearchFormListResultAction({\r\n status: Constants.ERROR,\r\n message: e.message,\r\n })\r\n );\r\n }\r\n}\r\n\r\nfunction* getSearchForm(action) {\r\n try {\r\n const result = yield call(\r\n fetchSearchForm,\r\n action.payload.id,\r\n action.payload.model\r\n );\r\n\r\n yield put(\r\n getSearchFormResultAction({\r\n status: Constants.OK,\r\n result,\r\n })\r\n );\r\n } catch (e) {\r\n yield put(\r\n getSearchFormResultAction({\r\n status: Constants.ERROR,\r\n message: e.message,\r\n })\r\n );\r\n }\r\n}\r\n\r\nfunction* getGlobalDefault(action) {\r\n try {\r\n const result = yield call(fetchSAYT);\r\n yield put(\r\n globalSearchDefaultResultAction({\r\n status: Constants.OK,\r\n options: result,\r\n })\r\n );\r\n } catch (e) {\r\n yield put(\r\n globalSearchDefaultResultAction({\r\n status: Constants.ERROR,\r\n message: e.message,\r\n })\r\n );\r\n }\r\n}\r\n\r\nfunction* searchSaga() {\r\n yield takeLatest(actionTypes.SEARCH_FETCH_REQUEST, getSearchResult);\r\n yield takeLatest(actionTypes.SEARCH_COUNT_REQUEST, getSearchCountResult);\r\n yield takeLatest(\r\n actionTypes.SEARCH_FAVRENAME_REQUEST,\r\n renameSearchFavorite\r\n );\r\n yield takeLatest(actionTypes.SEARCH_FORM_FETCH_REQUEST, getSearchForm);\r\n yield takeLatest(\r\n actionTypes.GLOBALDEFAULTSEARCH_FETCH_REQUEST,\r\n getGlobalDefault\r\n );\r\n yield takeLatest(\r\n actionTypes.SEARCH_FORM_LIST_FETCH_REQUEST,\r\n getSearchFormList\r\n );\r\n yield takeLatest(actionTypes.SEARCH_RESET, resetSearch);\r\n}\r\n\r\nexport default searchSaga;\r\n","import {\r\n call,\r\n put,\r\n take,\r\n actionChannel,\r\n race,\r\n flush,\r\n cancelled,\r\n} from \"redux-saga/effects\";\r\nimport { buffers } from \"redux-saga\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport { docThumbnailResultAction } from \"data/actions\";\r\nimport { fetchThumbnail } from \"data/api\";\r\nimport Constants from \"data/constants\";\r\n\r\nfunction* thumbnailsSaga() {\r\n // 1- Create a channel for request actions\r\n const requestChan = yield actionChannel(\r\n actionTypes.DOCS_THUMBNAIL_REQUEST,\r\n buffers.expanding()\r\n );\r\n while (true) {\r\n // 2- take from the channel\r\n const { payload } = yield take(requestChan);\r\n\r\n // support cancellation\r\n // https://github.com/redux-saga/redux-saga/issues/1046\r\n // eslint-disable-next-line\r\n const { task, cancel } = yield race({\r\n task: call(getThumbnail, payload),\r\n cancel: take(actionTypes.CURRENTITEM_SET),\r\n });\r\n\r\n /* istanbul ignore next */\r\n if (cancel !== undefined) {\r\n yield flush(requestChan);\r\n // Don't need these actions, do nothing.\r\n }\r\n }\r\n}\r\n\r\nexport function* getThumbnail(payload) {\r\n // https://decembersoft.com/posts/redux-saga-abort-controller-cancel-api-calls/\r\n const abortController = new AbortController();\r\n\r\n try {\r\n const result = yield call(\r\n fetchThumbnail,\r\n payload.itemUri,\r\n abortController.signal\r\n );\r\n\r\n yield put(\r\n docThumbnailResultAction({\r\n itemUri: payload.itemUri,\r\n status: Constants.OK,\r\n result,\r\n })\r\n );\r\n } catch (e) {\r\n yield put(\r\n docThumbnailResultAction({\r\n itemUri: payload.itemUri,\r\n status: Constants.ERROR,\r\n message: e.message,\r\n })\r\n );\r\n } finally {\r\n if (yield cancelled()) {\r\n // Cancel the API call if the saga was cancelled\r\n abortController.abort();\r\n }\r\n }\r\n}\r\n\r\nexport default thumbnailsSaga;\r\n","import {\r\n all,\r\n fork,\r\n call,\r\n take,\r\n put,\r\n cancelled,\r\n select,\r\n} from \"redux-saga/effects\";\r\nimport { channel, eventChannel, buffers, delay } from \"redux-saga\";\r\nimport { serverEventAction } from \"data/actions\";\r\nimport { actions as networkActions } from \"redux-saga-network-status\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { HubConnection, HubConnectionBuilder } from \"@microsoft/signalr\";\r\nimport { get } from \"data/constants\";\r\nimport { CustomHttpHeader } from \"data/types\";\r\nimport { JL } from \"jsnlog\";\r\n\r\nconst _log = JL(\"Notifications\");\r\nconst actionChannel = channel();\r\n\r\nfunction createSocket(\r\n accessToken: string,\r\n correlationId: string\r\n): HubConnection {\r\n return new HubConnectionBuilder()\r\n .withAutomaticReconnect({\r\n nextRetryDelayInMilliseconds: /*istanbul ignore next*/ (\r\n retryContext\r\n ) => {\r\n if (retryContext.elapsedMilliseconds < 60000) {\r\n // If we've been reconnecting for less than 60 seconds so far,\r\n // wait between 0 and 10 seconds before the next reconnect attempt.\r\n return Math.random() * 10000;\r\n } else {\r\n // If we've been reconnecting for more than 60 seconds so far, try only every 5mins\r\n return 1000 * 60 * 5;\r\n }\r\n },\r\n })\r\n .configureLogging(\"warn\")\r\n .withUrl(\r\n get(\r\n window.CONFIG,\r\n [\"notificationsUrl\", \"global\"],\r\n \"/notifications/global\"\r\n ) +\r\n \"?correlationId=\" +\r\n encodeURIComponent(correlationId),\r\n {\r\n // https://docs.microsoft.com/en-us/aspnet/core/signalr/configuration?view=aspnetcore-5.0&tabs=dotnet#configure-bearer-authentication\r\n accessTokenFactory: /*istanbul ignore next*/ () => accessToken,\r\n headers: {\r\n [CustomHttpHeader.CorrelationId]: correlationId,\r\n },\r\n }\r\n )\r\n .build();\r\n}\r\n\r\nfunction signalChannel(connection) {\r\n return eventChannel((emit) => {\r\n const pingUrl = `${window.CONFIG.host.basename}/ping`;\r\n // https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#how-to-handle-connection-lifetime-events\r\n connection.on(\"ReceiveMessage\", emit);\r\n connection.onreconnecting(\r\n /*istanbul ignore next*/ (error) => {\r\n actionChannel.put(networkActions.ping(pingUrl));\r\n _log.warn(() => ({\r\n msg: \"SignalR reconnecting\",\r\n error,\r\n }));\r\n }\r\n );\r\n connection.onreconnected(\r\n /*istanbul ignore next*/ (connectionId) => {\r\n actionChannel.put(networkActions.ping(pingUrl));\r\n _log.warn(() => ({\r\n msg: \"SignalR reconnected with connectionId\",\r\n connectionId,\r\n }));\r\n }\r\n );\r\n connection.onclose(\r\n /*istanbul ignore next*/ (error) => {\r\n actionChannel.put(networkActions.ping(pingUrl));\r\n _log.warn(() => ({\r\n msg: \"SignalR connection closed\",\r\n error,\r\n }));\r\n }\r\n );\r\n // cleanup when channel closes\r\n return /*istanbul ignore next*/ () =>\r\n connection &&\r\n typeof connection.close === \"function\" &&\r\n connection.close();\r\n }, buffers.expanding());\r\n}\r\n\r\n/* istanbul ignore next*/\r\nfunction* getToken() {\r\n // try for max. 1sec * 30\r\n for (let i = 0; i < 30; i++) {\r\n const accessToken = yield select(s.loginAccessTokenSelector);\r\n if (accessToken != null) return accessToken;\r\n else yield call(delay, 1000);\r\n }\r\n _log.warn(\r\n () => \"Cannot retrieve user token; no server pushed notifications!\"\r\n );\r\n // throw new Error(\"Cannot retrieve token\")\r\n return null;\r\n}\r\n\r\nfunction* notificationLoop(chan) {\r\n while (true) {\r\n try {\r\n // wait for incoming message\r\n const message = yield take(chan);\r\n // console.log(\"signalR message: \", message);\r\n // publish to Redux store for further handling\r\n yield put(serverEventAction(message));\r\n } finally {\r\n /* istanbul ignore if */\r\n if (yield cancelled()) {\r\n chan.close();\r\n }\r\n }\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\nfunction* actionLoop() {\r\n while (true) {\r\n const action = yield take(actionChannel);\r\n yield put(action);\r\n }\r\n}\r\n\r\nexport default function* notificationsSaga() {\r\n // create a SignalR connection socket\r\n try {\r\n // get user's token\r\n const accessToken = yield call(getToken);\r\n // no token? no game\r\n /* istanbul ignore next */\r\n if (accessToken == null) {\r\n throw new Error(\"No Access Token\");\r\n }\r\n const correlationId = yield select(s.userCorrelationIdSelector);\r\n const connection = yield call(createSocket, accessToken, correlationId);\r\n // create our Redux-Saga channel and register for client-side methods\r\n const chan = yield call(signalChannel, connection);\r\n\r\n // start listening\r\n connection\r\n .start()\r\n .then(\r\n /*istanbul ignore next*/ (result) =>\r\n _log.info(() => \"SignalR Connected!\")\r\n )\r\n .catch(\r\n /*istanbul ignore next*/ (e) => {\r\n throw e;\r\n }\r\n );\r\n\r\n yield all([notificationLoop(chan), actionLoop()]);\r\n } catch (e) {\r\n /* istanbul ignore next */\r\n _log.fatalException(() => \"SignalR Connection failed: \", e);\r\n }\r\n}\r\n","import { call, take, actionChannel, select, put } from \"redux-saga/effects\";\r\nimport { toast } from \"react-toastify\";\r\nimport {\r\n userLanguageSelector,\r\n settingValueSelector,\r\n} from \"data/reducers/selectors\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport { notificationUpsertAction } from \"data/actions\";\r\nimport { Toast, RoutedToast } from \"data/toast\";\r\nimport { NotificationType } from \"data/types\";\r\nimport { buffers } from \"redux-saga\";\r\n\r\nfunction* triggerNotificationAPI({ message, handleClick, autoClose, icon }) {\r\n const lang = yield select(userLanguageSelector);\r\n const notification = new Notification(message, {\r\n dir: \"auto\",\r\n lang,\r\n icon: icon\r\n ? `${window.CONFIG.host.basename}/__notification/${icon}.png`\r\n : undefined,\r\n });\r\n /* istanbul ignore else */\r\n if (handleClick) {\r\n notification.addEventListener(\"click\", handleClick);\r\n }\r\n /* istanbul ignore else */\r\n if (autoClose) {\r\n setTimeout(notification.close.bind(notification), autoClose);\r\n }\r\n return notification;\r\n}\r\n\r\nfunction triggerReactToastify({\r\n icon,\r\n message,\r\n details,\r\n handleClick,\r\n style,\r\n isRouted,\r\n className,\r\n toastId,\r\n autoClose,\r\n position,\r\n}) {\r\n const Component = isRouted ? RoutedToast : Toast;\r\n toast(\r\n ,\r\n {\r\n type: style,\r\n className,\r\n toastId,\r\n autoClose,\r\n position,\r\n }\r\n );\r\n}\r\n\r\nfunction* toastSaga() {\r\n const channel = yield actionChannel(\r\n actionTypes.NOTIFICATION_TOAST,\r\n buffers.expanding()\r\n );\r\n\r\n while (true) {\r\n const { payload } = yield take(channel);\r\n const notificationType = yield select((state) =>\r\n settingValueSelector(\"notificationType\", state)\r\n );\r\n let toast = payload.toast;\r\n if (notificationType === NotificationType.API) {\r\n // Update toast property with notification reference to close notification\r\n toast = yield call(triggerNotificationAPI, {\r\n ...payload.toast,\r\n message: payload.message,\r\n icon: payload.icon,\r\n });\r\n } else {\r\n triggerReactToastify({\r\n ...payload.toast,\r\n toastId: payload.notificationId,\r\n message: payload.message,\r\n style: payload.style,\r\n icon: payload.icon,\r\n });\r\n }\r\n yield put(notificationUpsertAction({ ...payload, toast }));\r\n }\r\n}\r\n\r\nexport default toastSaga;\r\n","import { buffers } from \"redux-saga\";\r\nimport {\r\n actionChannel,\r\n all,\r\n call,\r\n flush,\r\n fork,\r\n put,\r\n race,\r\n select,\r\n takeLatest,\r\n takeEvery,\r\n take,\r\n} from \"redux-saga/effects\";\r\nimport actionTypes from \"data/actions/actionTypes\";\r\nimport { dispatch } from \"data/storeHelper\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport { CommandActionStatusFlag } from \"data/types\";\r\nimport {\r\n commandActionQueueAddAction,\r\n commandActionQueueRemoveAction,\r\n commandActionRemoveAction,\r\n commandActionItemStatusAction,\r\n commandActionStatusAction,\r\n commandActionLogAction,\r\n notificationUpsertAction,\r\n notificationDelAction,\r\n notificationToastAction,\r\n} from \"data/actions\";\r\nimport { commandActionRequestSelector } from \"data/reducers/selectors\";\r\nimport { actionMappings } from \"components/CommandActions\";\r\nimport loc from \"i18next\";\r\nimport { toastTypes } from \"data/toast\";\r\nimport { JL } from \"data/logging\";\r\n\r\nconst log = JL(\"commandActionSaga\");\r\n\r\nfunction* handleCommandActionRequest({ payload }) {\r\n const { guid, commandAction, props } = payload;\r\n const actionHandler = new actionMappings[commandAction]();\r\n\r\n log.info(() => ({\r\n msg: \"Handle CommandAction request\",\r\n payload,\r\n actionHandler,\r\n }));\r\n\r\n if (props.multiple && actionHandler.queueMultiple) {\r\n log.info(() => ({\r\n msg: \"Add commandAction to queue\",\r\n commandAction,\r\n guid,\r\n }));\r\n yield put(\r\n notificationUpsertAction({\r\n guid,\r\n message: loc.t(`commandAction:${commandAction}.queued`, {\r\n count: payload.items.length,\r\n name: payload.items?.map((i) => i.name).join(\", \"),\r\n }),\r\n })\r\n );\r\n for (let item of payload?.items) {\r\n yield put(\r\n commandActionQueueAddAction({\r\n guid,\r\n commandAction,\r\n actionHandler,\r\n props: { ...props, ...item },\r\n })\r\n );\r\n yield put(\r\n commandActionItemStatusAction(\r\n guid,\r\n item.itemUri,\r\n Constants.LOADING,\r\n true\r\n )\r\n );\r\n }\r\n } else {\r\n yield executeCommandAction({\r\n payload: {\r\n commandAction,\r\n actionHandler,\r\n context: {\r\n dispatch,\r\n ...props,\r\n },\r\n guid,\r\n },\r\n });\r\n yield put(commandActionRemoveAction(guid));\r\n }\r\n}\r\n\r\nfunction getToastType(status) {\r\n switch (true) {\r\n case (status & CommandActionStatusFlag.Success) > 0:\r\n return toastTypes.success;\r\n case (status & CommandActionStatusFlag.Partial) > 0:\r\n return toastTypes.partial;\r\n default:\r\n return toastTypes.failure;\r\n }\r\n}\r\n\r\nfunction getToastMessage(commandAction, status) {\r\n let state = \"failure\";\r\n switch (true) {\r\n case (status & CommandActionStatusFlag.Success) > 0:\r\n state = \"success\";\r\n break;\r\n case (status & CommandActionStatusFlag.Partial) > 0:\r\n state = \"partial\";\r\n break;\r\n default:\r\n break;\r\n }\r\n return loc.t(`commandAction:${commandAction.commandAction}.${state}`, {\r\n count: commandAction.items.length,\r\n ok: commandAction.items.filter((i) => i.status === Constants.OK).length,\r\n error: commandAction.items.filter((i) => i.status === Constants.ERROR)\r\n .length,\r\n name: commandAction.items.map((i) => i.name).join(\", \"),\r\n });\r\n}\r\n\r\nfunction* updateCommandActionStatus({ payload }) {\r\n const commandAction = (yield select((state) =>\r\n commandActionRequestSelector(state, payload.guid)\r\n ))?.[0];\r\n if (commandAction == null) {\r\n log.warn(() => ({\r\n msg: \"Cannot update CommandAction Status\",\r\n payload,\r\n }));\r\n return;\r\n }\r\n log.info(() => ({\r\n msg: \"updateCommandActionStatus\",\r\n commandAction,\r\n payload,\r\n }));\r\n let status = CommandActionStatusFlag.NotSet;\r\n if (commandAction?.items?.some((i) => i.status === Constants.ERROR))\r\n status |= CommandActionStatusFlag.Error;\r\n if (commandAction?.items?.every((i) => i.status !== Constants.LOADING)) {\r\n status |= CommandActionStatusFlag.Done;\r\n if (commandAction?.items?.every((i) => i.status === Constants.OK)) {\r\n status |= CommandActionStatusFlag.Success;\r\n yield put(commandActionRemoveAction(payload.guid));\r\n } else if (\r\n !commandAction?.items?.every((i) => i.status === Constants.ERROR)\r\n )\r\n status |= CommandActionStatusFlag.Partial;\r\n log.info(() => ({\r\n msg: \"Command Action queue completed\",\r\n guid: payload.guid,\r\n commandAction,\r\n }));\r\n yield put(\r\n notificationToastAction({\r\n ...getToastType(status),\r\n guid: payload.guid,\r\n log: commandAction.log,\r\n message: getToastMessage(commandAction, status),\r\n })\r\n );\r\n } else {\r\n if (commandAction?.items?.some((i) => i.status !== Constants.LOADING))\r\n status |= CommandActionStatusFlag.Partial;\r\n status |= CommandActionStatusFlag.Loading;\r\n }\r\n yield put(commandActionStatusAction(payload.guid, status, true));\r\n}\r\n\r\nfunction* handleQueueRequest(payload, channel) {\r\n log.info(() => ({\r\n msg: \"handleQueueRequest\",\r\n payload,\r\n }));\r\n const { guid, actionHandler, commandAction, props } = payload;\r\n const context = {\r\n dispatch,\r\n ...props,\r\n };\r\n actionHandler.logger = (success, identifier, context) =>\r\n dispatch(\r\n commandActionLogAction(guid, {\r\n timestamp: Date.now(),\r\n status: success ? Constants.OK : Constants.ERROR,\r\n message: loc.t(\r\n `${identifier}.${success ? \"success\" : \"failure\"}`,\r\n context\r\n ),\r\n details: {\r\n ...props,\r\n commandAction: commandAction.commandAction,\r\n },\r\n })\r\n );\r\n log.info(() => ({\r\n msg: \"Update actionHandler.logger to log current details\",\r\n actionHandler,\r\n context,\r\n }));\r\n const itemStatus = yield executeCommandAction({\r\n payload: { actionHandler, commandAction, context, guid },\r\n });\r\n yield put(\r\n commandActionItemStatusAction(guid, props.itemUri, itemStatus, true)\r\n );\r\n}\r\n\r\nfunction* executeCommandAction({ payload }): ConstantsEnum {\r\n const { actionHandler, commandAction, context, guid } = payload;\r\n log.info(() => ({\r\n msg: `Execute commandAction \"${commandAction}\"`,\r\n actionHandler,\r\n context,\r\n }));\r\n const shouldExecute =\r\n typeof actionHandler?.render !== \"function\" ||\r\n !actionHandler?.shouldRender ||\r\n (yield call(actionHandler.render, context));\r\n if (!shouldExecute || typeof actionHandler?.execute !== \"function\") {\r\n yield put(commandActionQueueRemoveAction(guid));\r\n return Constants.OK;\r\n }\r\n let itemStatus = Constants.LOADING;\r\n try {\r\n const result = yield call(actionHandler.execute, context);\r\n if (typeof actionHandler?.report === \"function\")\r\n yield call(actionHandler.report, result, context);\r\n itemStatus = result ? Constants.OK : Constants.ERROR;\r\n log.info(() => ({\r\n msg: `Executed commandAction \"${commandAction}\"`,\r\n actionHandler,\r\n context,\r\n result,\r\n itemStatus,\r\n }));\r\n } catch (error) {\r\n itemStatus = Constants.ERROR;\r\n log.error(() => ({\r\n msg: `Error while executing commandAction \"${commandAction}\"`,\r\n actionHandler,\r\n context,\r\n error,\r\n itemStatus,\r\n }));\r\n }\r\n return itemStatus;\r\n}\r\n\r\nfunction* abortCommandAction({ payload }, channel) {\r\n yield flush(channel);\r\n yield put(\r\n commandActionStatusAction(\r\n payload.guid,\r\n CommandActionStatusFlag.Done | CommandActionStatusFlag.Partial,\r\n true\r\n )\r\n );\r\n yield rebuildQueue();\r\n}\r\n\r\nfunction* removeCommandAction({ payload }, channel) {\r\n channel && (yield flush(channel));\r\n yield put(commandActionRemoveAction(payload.guid));\r\n yield put(notificationDelAction(payload.guid));\r\n yield rebuildQueue();\r\n}\r\n\r\nfunction* handleCommandActionQueueAction(action, payload, channel) {\r\n switch (action?.type) {\r\n case actionTypes.COMMANDACTION_ABORT:\r\n yield call(abortCommandAction, action, channel);\r\n break;\r\n case actionTypes.COMMANDACTION_QUEUE_REMOVE:\r\n yield call(removeCommandAction, action, channel);\r\n break;\r\n case actionTypes.COMMANDACTION_QUEUE_PAUSE:\r\n yield call(pauseQueue, payload, channel);\r\n break;\r\n default:\r\n // Continue with requests\r\n break;\r\n }\r\n}\r\n\r\nfunction* pauseQueue(payload, channel) {\r\n // Re-add to queue (since we paused)\r\n yield put(commandActionQueueAddAction(payload));\r\n // Wait for command to continue queue\r\n const action = (yield race([\r\n take(actionTypes.COMMANDACTION_ABORT),\r\n take(actionTypes.COMMANDACTION_QUEUE_REMOVE),\r\n take(actionTypes.COMMANDACTION_QUEUE_START),\r\n ])).find((a) => a != null);\r\n yield call(handleCommandActionQueueAction, action, channel);\r\n}\r\n\r\nfunction* rebuildQueue() {\r\n const requests = (yield select(commandActionRequestSelector)).filter(\r\n (req) => req.status === CommandActionStatusFlag.Loading\r\n );\r\n if (requests.length === 0) return;\r\n log.info(() => ({\r\n msg: \"rebuildQueue\",\r\n requests,\r\n }));\r\n for (let payload of requests) {\r\n yield call(handleCommandActionRequest, { payload });\r\n }\r\n}\r\n\r\nfunction* watchCommandActionQueue() {\r\n const channel = yield actionChannel(\r\n actionTypes.COMMANDACTION_QUEUE_ADD,\r\n buffers.expanding()\r\n );\r\n while (true) {\r\n const { payload } = yield take(channel);\r\n const action = (yield race([\r\n call(handleQueueRequest, payload, channel),\r\n take(actionTypes.COMMANDACTION_ABORT),\r\n take(actionTypes.COMMANDACTION_QUEUE_REMOVE),\r\n take(actionTypes.COMMANDACTION_QUEUE_PAUSE),\r\n ])).find((a) => a != null);\r\n log.info(() => ({\r\n msg: \"watchCommandActionQueue\",\r\n action,\r\n payload,\r\n }));\r\n yield call(handleCommandActionQueueAction, action, payload, channel);\r\n }\r\n}\r\n\r\nfunction* commandActionSaga() {\r\n yield all([\r\n // listen for command action requests\r\n takeLatest(\r\n actionTypes.COMMANDACTION_REQUEST,\r\n handleCommandActionRequest\r\n ),\r\n // listen for command action item status changes\r\n takeEvery(\r\n actionTypes.COMMANDACTION_ITEM_STATUS,\r\n updateCommandActionStatus\r\n ),\r\n // watch Command Action Queue\r\n fork(watchCommandActionQueue),\r\n ]);\r\n}\r\n\r\nexport default commandActionSaga;\r\n","import { all, fork } from \"redux-saga/effects\";\r\nimport offlineSaga, { checkServerConnectivity } from \"./offlineSaga\";\r\nimport userSaga from \"./userSaga\";\r\nimport favoritesSaga from \"./favoritesSaga\";\r\nimport cardsSaga from \"./cardsSaga\";\r\nimport workflowSaga from \"./workflowSaga\";\r\nimport treeSaga from \"./treeSaga\";\r\nimport docsSaga from \"./docsSaga\";\r\nimport docsLayoutSaga from \"./docsLayoutSaga\";\r\nimport currentItemSaga from \"./currentItemSaga\";\r\nimport searchSaga from \"./searchSaga\";\r\nimport thumbnailsSaga from \"./thumbnailsSaga\";\r\nimport watchNetworkStatus from \"redux-saga-network-status\";\r\nimport notificationsSaga from \"./notificationsSaga\";\r\nimport toastSaga from \"./toastSaga\";\r\nimport commandActionSaga from \"./commandActionSaga\";\r\n\r\nexport default function* rootSaga() {\r\n yield all([\r\n fork(watchNetworkStatus),\r\n fork(checkServerConnectivity),\r\n fork(offlineSaga),\r\n fork(userSaga),\r\n fork(cardsSaga),\r\n fork(workflowSaga),\r\n fork(favoritesSaga),\r\n fork(treeSaga),\r\n fork(docsSaga),\r\n fork(docsLayoutSaga),\r\n fork(currentItemSaga),\r\n fork(searchSaga),\r\n fork(thumbnailsSaga),\r\n fork(notificationsSaga),\r\n fork(toastSaga),\r\n fork(commandActionSaga),\r\n ]);\r\n}\r\n\r\nexport function* localRootSaga() {\r\n yield all([\r\n fork(watchNetworkStatus),\r\n fork(checkServerConnectivity),\r\n fork(favoritesSaga),\r\n fork(treeSaga),\r\n fork(docsSaga),\r\n fork(docsLayoutSaga),\r\n fork(currentItemSaga),\r\n fork(searchSaga),\r\n fork(thumbnailsSaga),\r\n fork(toastSaga),\r\n fork(commandActionSaga),\r\n ]);\r\n}\r\n","// @flow\r\nimport React from \"react\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport HelpBlock from \"react-bootstrap/lib/HelpBlock\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport { type ItemActionConfig } from \"data/types\";\r\nimport styles from \"./ItemAction.module.css\";\r\n\r\nconst ItemAction = ({\r\n action,\r\n onAction,\r\n}: {\r\n action: ItemActionConfig,\r\n onAction: (action: ItemActionConfig) => void,\r\n}) => (\r\n
\r\n onAction(action)}\r\n className={styles.button}\r\n >\r\n {\" \"}\r\n {getLocalizedText(action.name) || \"N/A\"}\r\n \r\n {action.desc && (\r\n \r\n {getLocalizedText(action.desc)}\r\n \r\n )}\r\n
\r\n);\r\nItemAction.displayName = \"ActionPanel.ItemAction\";\r\nexport default ItemAction;\r\n","// @flow\r\nimport React, { useMemo, useCallback } from \"react\";\r\nimport Icons from \"@hs/icons\";\r\nimport {\r\n GridListConstant,\r\n DocListColumnType,\r\n type DocColumnResultDTO,\r\n type DocListLayout,\r\n} from \"data/types\";\r\nimport ValueFactory from \"components/Attributes/SummaryAttribute/ValueFactory\";\r\nimport styles from \"./RowResultByLayout.module.css\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** CSS styles to apply */\r\n style?: StyleSheet,\r\n /** the row object */\r\n row: Object,\r\n /** row index */\r\n index: number,\r\n /** requested layout */\r\n layout?: DocListLayout,\r\n /** all the columns */\r\n cols: Array,\r\n /** whether row should be marked as selected */\r\n isSelected: boolean,\r\n /** callback when user single clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onSingleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n};\r\n\r\n/**\r\n * Render one document row in \"Simple\" layout mode\r\n */\r\nconst RowResultByLayout = ({\r\n style,\r\n row,\r\n index,\r\n layout,\r\n cols,\r\n isSelected,\r\n onSingleClick,\r\n}: Props) => {\r\n const itemUri = useMemo(() => row[row.length - 1], [row]);\r\n // map requested columns (layout.cols) to existing ones (cols)\r\n const colIndexes = useMemo(() => {\r\n let result = [];\r\n if (layout && layout.cols) {\r\n layout.cols.forEach((colName) => {\r\n const colIdx = cols.findIndex((col) => col.name === colName);\r\n /* istanbul ignore if */\r\n if (colIdx === -1) {\r\n console.warn(\r\n \"RowResultByLayout: Cannot find column named: \" +\r\n colName\r\n );\r\n } else {\r\n result.push(colIdx);\r\n }\r\n });\r\n } else {\r\n // show a reasonable default - icon, name\r\n const extensionColIndex = cols.findIndex(\r\n (col) => col.name === GridListConstant.ExtensionIcon\r\n );\r\n if (extensionColIndex !== -1) result.push(extensionColIndex);\r\n let nameColIndex = cols.findIndex(\r\n (col) => col.type === DocListColumnType.WebDavName\r\n );\r\n // FlatAUs do not have any Name columns\r\n if (nameColIndex === -1) nameColIndex = 0;\r\n result.push(nameColIndex);\r\n }\r\n return result;\r\n }, [layout, cols]);\r\n const _onSingleClick = useCallback(\r\n (e: SyntheticMouseEvent<*>) => {\r\n e.stopPropagation();\r\n\r\n /* istanbul ignore else */\r\n if (typeof onSingleClick === \"function\")\r\n onSingleClick(e, itemUri, index);\r\n },\r\n [onSingleClick, itemUri, index]\r\n );\r\n\r\n return (\r\n \r\n {colIndexes.map((colIndex, colNameIndex) => {\r\n switch (cols[colIndex].name) {\r\n case GridListConstant.ExtensionIcon:\r\n return (\r\n \r\n \r\n \r\n );\r\n default:\r\n let value = row[colIndex];\r\n if (typeof value !== \"string\") {\r\n value = ;\r\n }\r\n return (\r\n 2\r\n ? styles.lastcell\r\n : \"\"\r\n )}\r\n style={{\r\n width: cols[colIndex].width,\r\n textAlign: [\r\n \"LongValue\",\r\n \"IntValue\",\r\n ].includes(cols[colIndex].type)\r\n ? \"right\"\r\n : \"left\",\r\n }}\r\n >\r\n {value}\r\n \r\n );\r\n }\r\n })}\r\n \r\n );\r\n};\r\n\r\nRowResultByLayout.displayName = \"DocListSimple.RowResultByLayout\";\r\nRowResultByLayout.defaultProps = {\r\n isSelected: false,\r\n};\r\nexport default RowResultByLayout;\r\n","import React from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Thumbnail from \"components/DocListSimple/Thumbnail\";\r\nimport NoData from \"components/NoData\";\r\nimport styles from \"./itemView_docListGallery.module.css\";\r\nimport { useSwipeable } from \"react-swipeable\";\r\n\r\nconst Thumbs = ({ result, onClick }) =>\r\n Object.keys(result.rows).map((key, index) => {\r\n const name = result.rows[key][1]; //hopefully it's always at that position ;)\r\n const itemUri = result.rows[key][result.cols.length - 1];\r\n return (\r\n onClick(itemUri)}\r\n >\r\n \r\n \r\n );\r\n });\r\nThumbs.displayName = \"ItemView_DocListGallery.Thumbs\";\r\n\r\nconst ItemView_DocListGallery = ({ result, onClick }) => {\r\n const stripRef = React.useRef();\r\n const goLeft = /*istanbul ignore next*/ () =>\r\n (stripRef.current.scrollLeft -= 80);\r\n const goRight = /*istanbul ignore next*/ () =>\r\n (stripRef.current.scrollLeft += 80);\r\n const handlers = useSwipeable({\r\n onSwipeLeft: goLeft,\r\n onSwipeRight: goRight,\r\n });\r\n\r\n if (result && result.rows && result.rowCount > 0) {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n return ;\r\n};\r\nItemView_DocListGallery.displayName = \"ItemViews.DocListGallery\";\r\nexport default ItemView_DocListGallery;\r\n","import React, { useState } from \"react\";\r\nimport { useAsync } from \"hooks\";\r\nimport Constants from \"data/constants\";\r\nimport { fetchDocs } from \"data/api\";\r\nimport Status from \"components/Status\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport ViewModes from \"components/FilterBar/ViewModes\";\r\nimport {\r\n ListViewMode,\r\n type ItemActionViewConfig,\r\n type ItemActionConfig,\r\n} from \"data/types\";\r\nimport styles from \"./itemView_docList.module.css\";\r\nimport DocListSimple from \"components/DocListSimple\";\r\nimport RowResultByLayout from \"components/DocListSimple/RowResultByLayout\";\r\nimport Divider from \"components/Divider\";\r\nimport ItemViewDocListGallery from \"./itemView_docListGallery\";\r\n\r\ntype ItemActionViewDocListConfig = ItemActionViewConfig & {\r\n viewMode?: ListViewModeEnum,\r\n layout?: DocListLayout,\r\n};\r\n\r\n/**\r\n * shows a doclist view for a folder\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n */\r\nconst ItemView_DocList = ({\r\n itemUri,\r\n action,\r\n view,\r\n onItemUriAction,\r\n}: {\r\n itemUri: string,\r\n action: ItemActionConfig,\r\n view: ItemActionViewDocListConfig,\r\n onItemUriAction: (itemUri: string) => void,\r\n}) => {\r\n const [viewMode, setViewMode] = useState(\r\n view.viewMode || ListViewMode.List\r\n );\r\n\r\n // get documents\r\n const state = useAsync(async () => {\r\n try {\r\n const docs = await fetchDocs(\r\n itemUri,\r\n 0,\r\n view.layout && view.layout.sorts,\r\n view.layout && view.layout.filters,\r\n view.layout && view.layout.cols\r\n );\r\n return docs;\r\n } catch (err) {\r\n console.warn(\"Error while fetchDocs\", err);\r\n throw err;\r\n }\r\n }, [itemUri]);\r\n\r\n if (state.loading || state.error) {\r\n return (\r\n \r\n
\r\n {view.header}{\" \"}\r\n {state.loading && (\r\n \r\n )}\r\n {state.error && (\r\n \r\n )}\r\n
\r\n \r\n }\r\n />\r\n );\r\n } else {\r\n return (\r\n \r\n
\r\n {view.header}\r\n \r\n
\r\n {state.value.rowCount > 0 && (\r\n \r\n setViewMode(viewMode)\r\n }\r\n />\r\n )}\r\n \r\n }\r\n >\r\n <>\r\n {viewMode === ListViewMode.List && (\r\n
\r\n \r\n console.warn(\r\n \"Paging is not supported for the ItemView_DocList!\"\r\n )\r\n }\r\n setSorting={\r\n /* istanbul ignore next */ () =>\r\n console.warn(\r\n \"Setting Sorting is not supported for the ItemView_DocList!\"\r\n )\r\n }\r\n layout={view.layout}\r\n requestShowFilter={\r\n /* istanbul ignore next */ () =>\r\n console.warn(\r\n \"Setting Filters is not supported for the ItemView_DocList!\"\r\n )\r\n }\r\n showThumbnails={false}\r\n showFilterbar={false} // cannot use Filters/Sorting due to centralized Redux store\r\n onSingleClick={\r\n /* istanbul ignore next */ (\r\n e,\r\n itemUri,\r\n index\r\n ) => onItemUriAction(itemUri)\r\n }\r\n />\r\n
\r\n )}\r\n {viewMode === ListViewMode.Thumbnails && (\r\n \r\n onItemUriAction(itemUri)\r\n }\r\n />\r\n )}\r\n \r\n \r\n );\r\n }\r\n};\r\n\r\nexport default ItemView_DocList;\r\n","import React from \"react\";\r\nimport Activities from \"containers/Activities\";\r\nimport { type ItemActionViewConfig, type ItemActionConfig } from \"data/types\";\r\n\r\ntype ItemActionViewActivityListConfig = ItemActionViewConfig & {\r\n /** whether this item is a Document or Folder */\r\n isDoc?: boolean,\r\n /** whether to allow adding notes\r\n * @default {boolean} false\r\n */\r\n showAddNote?: boolean,\r\n /** whether to show notes (comment) entries\r\n * @default {boolean} true\r\n */\r\n showNotes?: boolean,\r\n /** whether to show history entries\r\n * @default {boolean} false\r\n */\r\n showHistory?: boolean,\r\n /** whether to show retention info\r\n * @default {boolean} false\r\n */\r\n showRetentionInfo?: boolean,\r\n};\r\n\r\n/**\r\n * shows the ActivityList\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ formatId: number }} { formatId }\r\n * @param {{ action: ItemActionConfig }} { action }\r\n * @param {{ view: ItemActionViewActivityListConfig }} { view }\r\n * @param {{ onItemUriAction: (itemUri: string) => void }} { onItemUriAction }\r\n */\r\nconst ItemView_ActivityList = ({\r\n itemUri,\r\n formatId,\r\n action,\r\n view,\r\n onItemUriAction,\r\n}: {\r\n itemUri: string,\r\n formatId: number,\r\n action: ItemActionConfig,\r\n view: ItemActionViewActivityListConfig,\r\n onItemUriAction: (itemUri: string) => void,\r\n}) => (\r\n \r\n);\r\n\r\nItemView_ActivityList.displayName = \"ItemViews.ActivityList\";\r\nexport default ItemView_ActivityList;\r\n","import React from \"react\";\r\nimport { compose } from \"redux\";\r\nimport { useAsync } from \"hooks\";\r\nimport Constants from \"data/constants\";\r\nimport { fetchWorkflowInfo } from \"data/api\";\r\nimport Status from \"components/Status\";\r\nimport styles from \"./itemView_workflow.module.css\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport Attributes from \"components/Attributes\";\r\nimport Divider from \"components/Divider\";\r\nimport {\r\n type ItemActionViewConfig,\r\n type ItemActionConfig,\r\n type WorkflowAction,\r\n ServerEventItemType,\r\n} from \"data/types\";\r\nimport ItemActions from \"components/ActionPanel/ItemActions\";\r\nimport loc from \"i18next\";\r\nimport { get } from \"data/constants\";\r\nimport GlobalEventsHandler from \"containers/GlobalEventsHandler\";\r\n\r\n/**\r\n * shows the pending Workflow Actions\r\n */\r\nexport const WorkflowActions = ({\r\n onClick,\r\n actions,\r\n}: {\r\n onClick: (props: Object) => void,\r\n actions: Array,\r\n}) => {\r\n const workflowActions = actions.map((action) => ({\r\n icon: action.icon,\r\n name: action.caption,\r\n desc: action.description,\r\n url: action.page,\r\n }));\r\n const onActionClick = (action) =>\r\n onClick({\r\n title: action.name,\r\n url: action.url,\r\n });\r\n return ;\r\n};\r\nWorkflowActions.displayName = \"ItemViews.Workflow.Actions\";\r\n\r\nexport /**\r\n * shows Workflow\r\n *\r\n * @param {{ actions: Array }} { actions }\r\n */\r\nconst ItemView_Workflow = ({\r\n refreshId,\r\n onClick,\r\n itemUri,\r\n action,\r\n view,\r\n}: {\r\n refreshId: number,\r\n onClick: (props: Object) => void,\r\n itemUri: string,\r\n action: ItemActionConfig,\r\n view: ItemActionViewConfig,\r\n}) => {\r\n const state = useAsync(async () => {\r\n try {\r\n const info = get(\r\n action,\r\n [\"commandAction\", \"props\", \"workflow\"],\r\n null\r\n );\r\n const wfs = await fetchWorkflowInfo({\r\n provider: info && info.provider,\r\n wfId: info && info.wfid,\r\n itemUri,\r\n });\r\n return wfs;\r\n } catch (err) {\r\n console.warn(\"Error while fetchWorkflow\", err);\r\n throw err;\r\n }\r\n }, [action, itemUri, refreshId]);\r\n\r\n if (state.loading || state.error) {\r\n return (\r\n \r\n
\r\n {state.loading && (\r\n \r\n )}\r\n {state.error && (\r\n \r\n )}{\" \"}\r\n {loc.t(\"ipwf:loading\")}\r\n
\r\n \r\n }\r\n />\r\n );\r\n } else if (state.value == null || state.value === \"\") {\r\n return null;\r\n } else {\r\n return state.value.map((wf) => (\r\n \r\n
\r\n {wf.name} ({wf.status})\r\n {wf.progress != null && (\r\n \r\n )}\r\n
\r\n \r\n }\r\n >\r\n <>\r\n {wf.attributes && (\r\n
\r\n \r\n
\r\n )}\r\n {wf.actions && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n ));\r\n }\r\n};\r\n\r\nItemView_Workflow.displayName = \"ItemViews.Workflow\";\r\n// export default ItemView_Workflow;\r\n\r\nexport default compose(\r\n GlobalEventsHandler({\r\n items: [ServerEventItemType.task],\r\n })\r\n)(ItemView_Workflow);\r\n","import React, { useCallback } from \"react\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { type EnumValue } from \"data/types\";\r\n\r\ntype Props = {\r\n enum: Array>,\r\n value: T,\r\n name: string,\r\n label: string,\r\n isMulti: boolean,\r\n className: string,\r\n};\r\n\r\nconst EnumIcon = ({\r\n name,\r\n label,\r\n enum: enumValues,\r\n className,\r\n isMulti,\r\n value,\r\n}: Props) => {\r\n const renderEnumValue = useCallback(\r\n (enumValue: EnumValue) =>\r\n enumValue &&\r\n enumValue.icon && (\r\n \r\n {typeof enumValue.icon === \"string\" ? (\r\n \r\n ) : (\r\n enumValue.icon\r\n )}\r\n \r\n ),\r\n [name, label]\r\n );\r\n return value ? (\r\n \r\n {isMulti\r\n ? enumValues\r\n .filter((e) => (value & e.value) > 0)\r\n .map((e) => renderEnumValue(e))\r\n : renderEnumValue(enumValues.find((e) => e.value === value))}\r\n \r\n ) : null;\r\n};\r\n\r\nEnumIcon.displayName = \"EnumIcon\";\r\nexport default EnumIcon;\r\n","import React, { useMemo } from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport PrincipalAvatar from \"components/User/PrincipalAvatar\";\r\nimport HelpBlock from \"react-bootstrap/lib/HelpBlock\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./ReminderItem.module.css\";\r\nimport Icons from \"@hs/icons\";\r\nimport EnumIcon from \"./EnumIcon\";\r\nimport {\r\n LocalDateStringOption,\r\n CustomActionState,\r\n ReminderTypeFlags,\r\n ReminderTypeFlagsEnumValues,\r\n ReminderPriority,\r\n ReminderPriorityEnumValues,\r\n} from \"data/types\";\r\nimport { toastStyled, toastTypes } from \"data/toast\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\n\r\ntype Props = {\r\n reminder: ReminderDTO,\r\n isEditAllowed: boolean,\r\n onEdit: () => void,\r\n onDelete: () => void,\r\n className: string,\r\n};\r\n\r\nconst ReminderItem = ({\r\n reminder: { customAction, ...reminder },\r\n isEditAllowed,\r\n onEdit,\r\n onDelete,\r\n className = \"\",\r\n}: Props) => {\r\n const reminderTypeEnumValues = useMemo(\r\n () =>\r\n customAction == null\r\n ? ReminderTypeFlagsEnumValues\r\n : ReminderTypeFlagsEnumValues.concat({\r\n value: ReminderTypeFlags.CustomAction,\r\n label:\r\n customAction.displayName ||\r\n \"$reminder:type.customAction\",\r\n icon: (\r\n \r\n customAction.error &&\r\n toastStyled({\r\n message: customAction.error,\r\n ...toastTypes.failure,\r\n })\r\n }\r\n className={`${styles.customAction}${\r\n customAction.state === CustomActionState.Error\r\n ? ` ${styles.error}`\r\n : \"\"\r\n }`}\r\n />\r\n ),\r\n }),\r\n [customAction]\r\n );\r\n return (\r\n \r\n {reminder.priority !== ReminderPriority.Normal && (\r\n \r\n )}\r\n \r\n {new Date(reminder.date).toLocaleDateString(\r\n userLanguage(),\r\n LocalDateStringOption.DateTime\r\n )}\r\n \r\n \r\n {reminder.recipient && (\r\n \r\n \r\n \r\n )}\r\n {reminder.reason}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nReminderItem.displayName = \"ReminderItem\";\r\nexport default ReminderItem;\r\n","import React, { useCallback, useState } from \"react\";\r\nimport { useAsync, useAbortController } from \"hooks\";\r\nimport { fetchReminders, deleteReminder } from \"data/api\";\r\nimport Constants from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport ReminderItem from \"components/Reminder/ReminderItem\";\r\nimport {\r\n ReminderTypeFlags,\r\n LocalDateStringOption,\r\n type ItemActionViewConfig,\r\n type ItemActionConfig,\r\n} from \"data/types\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport { openConfirmModal } from \"components/ConfirmModal\";\r\nimport loc from \"i18next\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\n\r\ntype Props = {\r\n onClick: (props: Object) => void,\r\n itemUri: string,\r\n action: ItemActionConfig,\r\n view: ItemActionViewConfig,\r\n};\r\n\r\nfunction getLocContextFor(reminder) {\r\n return {\r\n date: new Date(reminder.date).toLocaleDateString(\r\n userLanguage(),\r\n LocalDateStringOption.DateTime\r\n ),\r\n user: reminder.recipient.displayName,\r\n };\r\n}\r\n\r\nconst ItemView_Reminder = ({ onClick, itemUri, action }: Props) => {\r\n const [reminders, setReminders] = useState(null);\r\n const abortController = useAbortController();\r\n\r\n const handleDelete = useCallback(\r\n (reminder) => {\r\n const locContext = getLocContextFor(reminder);\r\n openConfirmModal({\r\n body: loc.t(\"reminder:action_delete.confirmBody\", locContext),\r\n confirmButton: loc.t(\"reminder:action_delete.confirmYes\"),\r\n }).then((confirmed) => {\r\n /* istanbul ignore else */\r\n if (confirmed === true) {\r\n deleteReminder(\r\n reminder.id,\r\n itemUri,\r\n abortController(true).signal\r\n )\r\n .then((success) => {\r\n if (success) {\r\n const _reminders = reminders.filter(\r\n (r) => r.id !== reminder.id\r\n );\r\n setReminders(_reminders);\r\n }\r\n toastActionResult(\r\n success === true,\r\n \"reminder:action_delete\",\r\n locContext\r\n );\r\n return success;\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n toastActionResult(\r\n false,\r\n \"reminder:action_delete\",\r\n locContext\r\n );\r\n });\r\n }\r\n });\r\n },\r\n [reminders, abortController, itemUri]\r\n );\r\n\r\n const handleSave = useCallback(\r\n (reminder, id) => {\r\n /* istanbul ignore else */\r\n if (id > 0) {\r\n const _reminder = {\r\n ...reminder,\r\n creator: { ...reminder.creator },\r\n recipient: { ...reminder.recipient },\r\n id,\r\n };\r\n const _reminders = [...reminders];\r\n const idx = _reminders.findIndex((r) => r.id === id);\r\n if (idx > -1) {\r\n _reminders.splice(idx, 1, reminder);\r\n } else {\r\n _reminders.push(_reminder);\r\n }\r\n setReminders(_reminders);\r\n }\r\n },\r\n [reminders]\r\n );\r\n\r\n const handleEdit = useCallback(\r\n (reminder) =>\r\n CommandActionHandler(action.commandAction.name, {\r\n ...action.commandAction.props,\r\n reminder,\r\n onSave: handleSave,\r\n }),\r\n [handleSave, action.commandAction.name, action.commandAction.props]\r\n );\r\n\r\n const handleReadOnly = useCallback(\r\n (reminder, type) =>\r\n toastActionResult(\r\n false,\r\n `reminder:action_readonly_${type}`,\r\n getLocContextFor(reminder)\r\n ),\r\n []\r\n );\r\n\r\n const state = useAsync(async () => {\r\n try {\r\n const reminders = await fetchReminders(\r\n itemUri,\r\n abortController(true).signal\r\n );\r\n setReminders(reminders);\r\n } catch (e) {\r\n console.error(e);\r\n throw e;\r\n }\r\n });\r\n if (state.loading || state.error) {\r\n return (\r\n \r\n );\r\n }\r\n const isLoaded =\r\n !(state.loading || state.error) && Array.isArray(reminders);\r\n const hasReminders = isLoaded && reminders.length > 0;\r\n if (!hasReminders) {\r\n return
;\r\n }\r\n return reminders.map((r) => (\r\n \r\n r.isReadOnly ? handleReadOnly(r, \"edit\") : handleEdit(r)\r\n }\r\n isEditAllowed={!r.isReadOnly}\r\n onDelete={() =>\r\n r.isReadOnly ? handleReadOnly(r, \"delete\") : handleDelete(r)\r\n }\r\n />\r\n ));\r\n};\r\n\r\nItemView_Reminder.displayName = \"ItemViews.Reminder\";\r\nexport default ItemView_Reminder;\r\n","import React, { useCallback, useMemo } from \"react\";\r\nimport ItemActions from \"components/ActionPanel/ItemActions\";\r\nimport { connect, type Dispatch } from \"react-redux\";\r\nimport { resetDocFilters, setDocFilterByRef } from \"data/actions\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport {\r\n GetDefaults,\r\n GetFilterValueAsString,\r\n} from \"components/DocListFilterModal/Utils\";\r\nimport { getLocalizedText } from \"data/utils\";\r\n\r\nimport {\r\n DocListColumnType,\r\n DocListFilterOperators,\r\n type DocListFilterRequestDTO,\r\n} from \"data/types\";\r\n\r\ntype Props = {\r\n onClick: (props: Object) => void,\r\n itemUri: string,\r\n action: ItemActionConfig,\r\n view: ItemActionViewConfig,\r\n filters: Array,\r\n dispatch: Dispatch,\r\n};\r\n\r\ntype DocListClickContext = {\r\n rowIndex: number,\r\n columnIndex: number,\r\n itemUri: string,\r\n};\r\n\r\nconst Icons = {\r\n filterByValue: \"filter\",\r\n filterAddValue: \"filter\",\r\n filterRemove: \"eraser\",\r\n reset: \"times\",\r\n};\r\n\r\nconst getActionArgs = (\r\n actionId: string,\r\n context: DocListClickContext,\r\n cols,\r\n filters,\r\n rows\r\n): {} | { col: string, operator: string, value: string } => {\r\n if (\r\n actionId === \"reset\" ||\r\n context.columnIndex == null ||\r\n context.rowIndex == null ||\r\n cols == null ||\r\n cols[context.columnIndex] == null ||\r\n filters == null\r\n ) {\r\n return {};\r\n }\r\n\r\n // find filter reference\r\n const filter = filters.find(\r\n (f) => f.name === cols[context.columnIndex].name\r\n );\r\n\r\n /* istanbul ignore if */\r\n if (filter == null) {\r\n return {};\r\n }\r\n\r\n // replace \"None\" with \"Equal\"\r\n let opType = filter.operator;\r\n // those operators are not supported - will be replaced (if chosen) in _setDocFilter()\r\n /* istanbul ignore if */\r\n if (\r\n [\r\n DocListFilterOperators.None,\r\n DocListFilterOperators.Between,\r\n DocListFilterOperators.NotBetween,\r\n ].includes(opType)\r\n )\r\n opType = DocListFilterOperators.Equals;\r\n /* istanbul ignore if */\r\n if ([DocListFilterOperators.DoesNotContain].includes(opType))\r\n opType = DocListFilterOperators.NotEquals;\r\n\r\n // arguments used in i18n.json which are then shown in ContextMenu\r\n return {\r\n col: cols[context.columnIndex].caption,\r\n opType,\r\n operator: getLocalizedText(\"$folder:action_filter.operators.\" + opType),\r\n value: GetFilterValueAsString(\r\n rows[context.rowIndex][context.columnIndex]\r\n ),\r\n };\r\n};\r\n\r\nexport const showAction = (\r\n actionId: string,\r\n context: DocListClickContext,\r\n cols,\r\n filters,\r\n rows\r\n): boolean => {\r\n if (\r\n context.columnIndex == null ||\r\n context.rowIndex == null ||\r\n cols == null ||\r\n rows == null\r\n )\r\n return false;\r\n\r\n // always allow resetting filters\r\n if (actionId === \"reset\") return true;\r\n\r\n const col = cols[context.columnIndex];\r\n\r\n // no sorting/filtering allowed?\r\n /* istanbul ignore else */\r\n if (!col.canSort) return false;\r\n\r\n // find filter reference\r\n const filter = filters.find((f) => f.name === col.name);\r\n // can we actually have a filter for it?\r\n /* istanbul ignore else */\r\n if (filter == null) return false;\r\n\r\n // filter already set?\r\n // TODO filterRemove always displayed!\r\n const isFilterSet = String(filter.values[0]).length > 0;\r\n // show filterRemove, but hide the filterAdd options\r\n if (isFilterSet && actionId === \"filterRemove\") {\r\n return true;\r\n } else if (actionId === \"filterRemove\") return false;\r\n\r\n // no support for some column types\r\n /* istanbul ignore else */\r\n if (\r\n [\r\n DocListColumnType.DateTimeValue,\r\n DocListColumnType.ObjectValue,\r\n DocListColumnType.DateTimeOffsetValue,\r\n ].includes(col.type)\r\n )\r\n return false;\r\n\r\n // check empty value\r\n /* istanbul ignore if */\r\n if (\r\n rows[context.rowIndex] == null ||\r\n rows[context.rowIndex][context.columnIndex] == null\r\n )\r\n return false;\r\n const value = GetFilterValueAsString(\r\n rows[context.rowIndex][context.columnIndex]\r\n );\r\n /* istanbul ignore if */\r\n if (String(value).length === 0) return false;\r\n return true;\r\n};\r\n\r\nexport const ItemView_Filter = ({\r\n view,\r\n itemUri,\r\n columnIndex,\r\n rowIndex,\r\n filters,\r\n cols,\r\n rows,\r\n dispatch,\r\n onAction,\r\n}: Props) => {\r\n const context = useMemo(\r\n (): DocListClickContext => ({\r\n rowIndex,\r\n columnIndex,\r\n itemUri,\r\n }),\r\n [rowIndex, columnIndex, itemUri]\r\n );\r\n\r\n const actions = useMemo(\r\n () =>\r\n view.actions\r\n .filter((action) =>\r\n showAction(action, context, cols, filters, rows)\r\n )\r\n .map((action) => ({\r\n id: action,\r\n name: getLocalizedText(\r\n `$doclist_context:actions.${action}`,\r\n getActionArgs(action, context, cols, filters, rows)\r\n ),\r\n icon: Icons[action],\r\n })),\r\n [view.actions, context, cols, rows, filters]\r\n );\r\n\r\n const onActionClick = useCallback(\r\n (action) => {\r\n switch (action.id) {\r\n case \"filterByValue\":\r\n dispatch(setDocFilterByRef(context, true));\r\n break;\r\n case \"filterAddValue\":\r\n dispatch(setDocFilterByRef(context, false));\r\n break;\r\n case \"filterRemove\":\r\n dispatch(\r\n setDocFilterByRef(\r\n {\r\n columnIndex: columnIndex,\r\n rowIndex: -1, //clear values of this filter\r\n },\r\n false\r\n )\r\n );\r\n break;\r\n case \"reset\":\r\n dispatch(resetDocFilters());\r\n break;\r\n default:\r\n console.warn(\r\n `Unknown ActionId ${action.id} will be ignored`\r\n );\r\n }\r\n onAction();\r\n },\r\n [dispatch, context, columnIndex, onAction]\r\n );\r\n if (rowIndex == null || columnIndex == null || cols == null || rows == null)\r\n return null;\r\n return ;\r\n};\r\nItemView_Filter.displayName = \"ItemViews.Filter\";\r\n\r\n//#region redux\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => {\r\n let filters = s.docsLayoutFiltersSelector(state);\r\n const cols = s.docsColsSelector(state);\r\n const formatId = s.breadcrumbFormatIdSelector(\r\n state,\r\n s.currentNameSelector(state)\r\n );\r\n /* istanbul ignore else */\r\n if (filters == null || filters.length === 0) {\r\n /* istanbul ignore else */\r\n if (cols != null) {\r\n filters = GetDefaults(ownProps.itemUri, formatId, cols).filters;\r\n }\r\n }\r\n return {\r\n filters,\r\n cols,\r\n rows: s.docsRowsSelector(state),\r\n ...ownProps,\r\n };\r\n};\r\n//#endregion\r\n\r\nexport default connect(mapStateToProps)(ItemView_Filter);\r\n","import React from \"react\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport { type ItemActionConfig } from \"data/types\";\r\n\r\nimport ItemView_DocList from \"./itemView_docList\";\r\nimport ItemView_ActivityList from \"./itemView_activityList\";\r\nimport ItemView_Workflow from \"./itemView_workflow\";\r\nimport ItemView_Reminder from \"./itemView_reminder\";\r\nimport ItemView_Filter from \"./itemView_filter\";\r\n\r\nconst viewMappings = {\r\n itemView_docList: ItemView_DocList,\r\n itemView_activityList: ItemView_ActivityList,\r\n itemView_workflow: ItemView_Workflow,\r\n itemView_reminder: ItemView_Reminder,\r\n itemView_filter: ItemView_Filter,\r\n};\r\n\r\nconst Factory = ({\r\n action,\r\n onAction,\r\n}: {\r\n action: ItemActionConfig,\r\n onAction: () => void,\r\n}) => {\r\n const componentClass = viewMappings[action.view && action.view.name];\r\n if (componentClass == null) {\r\n alert(\r\n `CommandAction ${action.id} defines an unknown view named ${action.view.name}`\r\n );\r\n return null;\r\n } else {\r\n let props = { onAction };\r\n if (\r\n action.commandAction != null &&\r\n action.commandAction.props != null\r\n ) {\r\n props = Object.assign(props, action.commandAction.props, {\r\n action: action,\r\n view: action.view,\r\n onItemUriAction: (itemUri: string) =>\r\n CommandActionHandler(\r\n action.commandAction.name,\r\n Object.assign({}, action.commandAction.props, {\r\n itemUri,\r\n })\r\n ),\r\n onClick: (props: Object) =>\r\n CommandActionHandler(\r\n action.commandAction.name,\r\n Object.assign({}, action.commandAction.props, props)\r\n ),\r\n });\r\n } else {\r\n console.warn(\r\n `Since action ${action.id} has a view defined ${action.view.name} but no CommandAction defined, no contextProps will be passed on!`\r\n );\r\n }\r\n return React.createElement(componentClass, props);\r\n }\r\n};\r\nFactory.displayName = \"itemViews.Factory\";\r\nexport default Factory;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Row from \"react-bootstrap/lib/Row\";\r\nimport ItemAction from \"./ItemAction\";\r\nimport { type ItemActionConfig } from \"data/types\";\r\nimport styles from \"./ItemActions.module.css\";\r\nimport ItemViewFactory from \"components/CommandActions/itemViews/Factory\";\r\n\r\ntype Props = {\r\n /** list of actions to render\r\n * @type {Array}\r\n */\r\n actions: Array,\r\n /** callback when user runs an action\r\n * @param {ItemActionConfig} action which action to execute\r\n */\r\n onAction: (action: ItemActionConfig) => void,\r\n};\r\n\r\n/**\r\n * will render a list of itemActions\r\n */\r\nconst ItemActions = ({ actions, onAction }: Props) => (\r\n
\r\n {actions.map((action: ItemActionConfig, index: number) => (\r\n \r\n {action.view ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n ))}\r\n
\r\n);\r\nItemActions.displayName = \"ActionPanel.ItemActions\";\r\nexport default ItemActions;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Modal from \"components/Modal\";\r\n// import Tab from \"react-bootstrap/lib/Tab\";\r\n// import Tabs from \"react-bootstrap/lib/Tabs\";\r\n// import loc from \"i18next\";\r\nimport ActionCategory from \"./ActionCategory\";\r\n// import ItemActions from \"./ItemActions\";\r\nimport {\r\n type ItemActionConfig,\r\n type ItemActionCategoryConfig,\r\n} from \"data/types\";\r\nimport NoData from \"components/NoData\";\r\nimport Status from \"components/Status\";\r\nimport Constants from \"data/constants\";\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** React Component to render as Title */\r\n title?: React.Node,\r\n /** React Component to render as body */\r\n body?: React.Node,\r\n /** list of action categories */\r\n categories?: Array,\r\n /** CommandActions to render */\r\n actions?: Array,\r\n /** callback when user selects an Action to execute */\r\n onAction: (action: ItemActionConfig) => void,\r\n /** is loading */\r\n isLoading: boolean,\r\n};\r\n\r\n/**\r\n * renders a docked modal as the actionPanel\r\n */\r\nconst ActionPanel = ({\r\n open,\r\n close,\r\n title,\r\n body,\r\n categories,\r\n actions,\r\n onAction,\r\n isLoading,\r\n}: Props) => (\r\n \r\n {title && (\r\n \r\n {title}\r\n \r\n )}\r\n \r\n {body}\r\n {isLoading && }\r\n {!isLoading && (categories == null || categories.length === 0) && (\r\n \r\n )}\r\n {!isLoading &&\r\n categories &&\r\n categories.length > 0 &&\r\n categories.map((category, index) => (\r\n {\r\n if (\r\n action != null &&\r\n typeof onAction === \"function\"\r\n )\r\n onAction(action);\r\n close();\r\n }\r\n }\r\n />\r\n ))}\r\n \r\n \r\n);\r\nActionPanel.displayName = \"ActionPanel\";\r\nexport default ActionPanel;\r\n","// @flow\r\nimport React, { useMemo, useCallback } from \"react\";\r\nimport { useAsyncMemo } from \"hooks\";\r\nimport ActionPanel from \"components/ActionPanel\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport { isListed } from \"data/utils\";\r\nimport { context } from \"data/api\";\r\nimport {\r\n type ItemActionConfigBase,\r\n type ItemActionConfig,\r\n type ItemActionCategoryConfig,\r\n type ItemActionsConfigDTO,\r\n ItemContextsFlags,\r\n} from \"data/types\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport { shouldBeVisible } from \"./ActionPanel_shouldBeVisible\";\r\nimport store from \"data/store\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { getItemActionsConfig } from \"data/itemActions\";\r\nimport { getDefaultsConfig } from \"data/constants\";\r\nimport unionBy from \"lodash/unionBy\";\r\nimport cloneDeep from \"lodash/cloneDeep\";\r\nimport { asyncFilter } from \"data/utils\";\r\n\r\nexport /**\r\n * returns true if item (itemAction or category) should be shown to the user\r\n *\r\n * @param {ItemActionConfigBase} item action or category to render\r\n * @param {string} itemUri current item\r\n * @param {number} formatId current formatId\r\n * @param {Object} contextProps current contextProps\r\n * @param {string} [targetView] override view context (from store)\r\n * @returns {boolean} true if should render, false to hide\r\n */\r\nconst shouldRenderItem = async (\r\n item: ItemActionConfigBase,\r\n itemUri: string,\r\n formatId: number,\r\n contextProps: Object,\r\n targetView: ?string\r\n): Promise => {\r\n if (contextProps == null) return false;\r\n if (item.visible === false) return false;\r\n if (\r\n item.views &&\r\n !check_isView({\r\n views: item.views,\r\n targetView,\r\n })\r\n )\r\n return false;\r\n if (\r\n item.itemUriRegex &&\r\n !check_itemUriRegex({\r\n itemUri,\r\n itemUriRegex: item.itemUriRegex,\r\n })\r\n )\r\n return false;\r\n if (\r\n item.formatIds &&\r\n !check_formatId({\r\n formatId,\r\n formatIds: item.formatIds,\r\n })\r\n )\r\n return false;\r\n\r\n // Add backwards compatibility\r\n const backwardsCompatibleShouldBeVisible = (\r\n item.shouldBeVisible ?? [\r\n \"!isRecycleBin\",\r\n \"!isSpecialFolder\",\r\n \"!isMultiSelection\",\r\n \"isOnline\",\r\n ]\r\n ).slice();\r\n\r\n // hide everything from recyclebin\r\n if (\r\n !backwardsCompatibleShouldBeVisible.some((rule) =>\r\n rule.endsWith(\"isRecycleBin\")\r\n )\r\n ) {\r\n backwardsCompatibleShouldBeVisible.push(\"!isRecycleBin\");\r\n }\r\n // hide everything from special folder\r\n if (\r\n !contextProps.multiple &&\r\n !backwardsCompatibleShouldBeVisible.some((rule) =>\r\n rule.endsWith(\"isSpecialFolder\")\r\n )\r\n ) {\r\n backwardsCompatibleShouldBeVisible.push(\"!isSpecialFolder\");\r\n }\r\n // hide everything on multi selection\r\n if (\r\n !backwardsCompatibleShouldBeVisible.some(\r\n (rule) =>\r\n rule.endsWith(\"isMultiSelection\") ||\r\n rule.endsWith(\"isAnySelection\")\r\n )\r\n ) {\r\n backwardsCompatibleShouldBeVisible.push(\"!isMultiSelection\");\r\n }\r\n // hide everything offline...\r\n if (\r\n !backwardsCompatibleShouldBeVisible.some(\r\n (rule) =>\r\n rule.endsWith(\"isOnline\") || rule.endsWith(\"isAnyOnlineStatus\")\r\n )\r\n ) {\r\n backwardsCompatibleShouldBeVisible.push(\"isOnline\");\r\n }\r\n\r\n // apply shouldBeVisible\r\n return (\r\n (await shouldBeVisible({\r\n item: {\r\n ...item,\r\n shouldBeVisible: backwardsCompatibleShouldBeVisible,\r\n },\r\n itemUri,\r\n contextProps,\r\n })) === true\r\n );\r\n};\r\n\r\nconst getContextProps = async (\r\n contextProps: any,\r\n itemContexts = ItemContextsFlags.ResultFlags | ItemContextsFlags.Offline\r\n) => {\r\n const { itemUri, formatId, ext, name, itemStatus, multiple, items } =\r\n contextProps;\r\n /* istanbul ignore else */\r\n if (itemStatus == null) {\r\n itemContexts |= ItemContextsFlags.ItemStatus;\r\n }\r\n /* istanbul ignore else */\r\n if (name == null) {\r\n itemContexts |= ItemContextsFlags.WebDavName;\r\n }\r\n /* istanbul ignore else */\r\n if (ext == null) {\r\n itemContexts |= ItemContextsFlags.Extension;\r\n }\r\n const itemUris = multiple ? items.map((i) => i.itemUri) : [itemUri];\r\n let formatIds = multiple ? items.map((i) => i.formatId) : [formatId];\r\n if (formatIds.filter((i) => i != null).length === 0) {\r\n formatIds = null;\r\n }\r\n return await context(itemUris, formatIds, itemContexts);\r\n};\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** React Component to render as Title */\r\n title?: React.Node,\r\n /** React Component to render as body */\r\n body?: React.Node,\r\n /** any context props passed by caller will be assigned to commandAction props */\r\n contextProps: {\r\n itemUri: string,\r\n formatId: number,\r\n multiple: boolean,\r\n items: Array,\r\n } & Object,\r\n /** Override view context for Action Panel items */\r\n targetView?: string,\r\n};\r\n\r\nexport const ActionPanelContainer = (props: Props) => {\r\n const { contextProps, targetView, ...rest } = props;\r\n\r\n // fetch context and extend contextProps\r\n const allContextProps = useAsyncMemo(async () => {\r\n try {\r\n return {\r\n ...contextProps,\r\n ...(await getContextProps(contextProps)),\r\n };\r\n } catch (e) {\r\n console.error(`Cannot calculate contextProps: ${e.message}`);\r\n return contextProps;\r\n }\r\n }, [contextProps]);\r\n\r\n const [itemUri, formatId] = useMemo(() => {\r\n if (allContextProps == null) {\r\n return [null, -1];\r\n }\r\n const { itemUri, folderItemUri, formatId, multiple, items } =\r\n allContextProps;\r\n if (!multiple) {\r\n return [itemUri, formatId];\r\n }\r\n const combinedFormatId = items.every(\r\n (item) => item.formatId === items[0].formatId\r\n )\r\n ? items[0].formatId\r\n : -1;\r\n return [folderItemUri, combinedFormatId];\r\n }, [allContextProps]);\r\n\r\n const itemActions = useMemo(\r\n () => mergeItemActionsConfig(itemUri, formatId),\r\n [itemUri, formatId]\r\n );\r\n\r\n const categories: Array = useAsyncMemo(\r\n async () =>\r\n await asyncFilter(\r\n itemActions.categories,\r\n (category: ItemActionCategoryConfig) =>\r\n shouldRenderItem(\r\n category,\r\n itemUri,\r\n formatId,\r\n allContextProps,\r\n targetView\r\n )\r\n ),\r\n [itemActions, itemUri, formatId, allContextProps, targetView]\r\n );\r\n\r\n const actions: Array = useAsyncMemo(async () => {\r\n const result = await asyncFilter(\r\n itemActions.actions,\r\n (action: ItemActionConfig) =>\r\n shouldRenderItem(\r\n action,\r\n itemUri,\r\n formatId,\r\n allContextProps,\r\n targetView\r\n )\r\n );\r\n\r\n // HACK itemViews_* use the CommandActionHandler to RENDER before onAction is being called!\r\n result.forEach(\r\n (action) =>\r\n action.commandAction &&\r\n (action.commandAction.props = Object.assign(\r\n {},\r\n action.commandAction.props,\r\n allContextProps\r\n ))\r\n );\r\n return result;\r\n }, [itemActions, itemUri, formatId, allContextProps, targetView]);\r\n\r\n const onAction = useCallback(\r\n (action: ItemActionConfig) => {\r\n if (action.commandAction == null) {\r\n alert(\r\n `Sorry, no CommandAction defined for action.name='${action.name}'`\r\n );\r\n } else {\r\n CommandActionHandler(\r\n action.commandAction.name,\r\n Object.assign(\r\n {},\r\n action.commandAction.props,\r\n allContextProps\r\n )\r\n );\r\n }\r\n },\r\n [allContextProps]\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n/* istanbul ignore next */\r\nconst MemoActionPanelContainer = React.memo(\r\n ActionPanelContainer,\r\n (prevProps, nextProps) => prevProps.itemUri !== nextProps.itemUri\r\n);\r\nexport const openActionPanel = createModal(MemoActionPanelContainer);\r\n\r\nexport /**\r\n * checks if view is (not) included in list (case-insensitive)\r\n * negate with \"!\" as prefix\r\n *\r\n * @param {{Array}} views to search\r\n * @param {{?string}} targetView to (not) search for in views\r\n * @returns {boolean} true if match found\r\n */\r\nconst check_isView = ({\r\n views,\r\n targetView,\r\n}: {\r\n views: Array,\r\n targetView: ?string,\r\n}) => {\r\n if (views.length === 0) return false;\r\n const targetViewOrCurrent = targetView\r\n ? targetView\r\n : s.currentNameSelector(store.getState());\r\n const negatedViews = views\r\n .filter((l) => l.startsWith(\"!\"))\r\n .map((l) => l.substr(1));\r\n const defaultViews = views.filter((l) => !l.startsWith(\"!\"));\r\n return (\r\n (negatedViews.length === 0 ||\r\n !isListed(targetViewOrCurrent, negatedViews)) &&\r\n (defaultViews.length === 0 ||\r\n isListed(targetViewOrCurrent, defaultViews))\r\n );\r\n};\r\n\r\nexport /**\r\n * checks if itemUri matches the itemUriRegex regular expression\r\n * @returns {boolean} true if match found\r\n */\r\nconst check_itemUriRegex = ({\r\n itemUri,\r\n itemUriRegex,\r\n}: {\r\n itemUri: string,\r\n itemUriRegex: string,\r\n}) => new RegExp(itemUriRegex, \"i\").exec(itemUri) !== null;\r\n\r\nexport /**\r\n * checks if formatId is included in the formatIds list\r\n * @returns {boolean} true if included\r\n */\r\nconst check_formatId = ({\r\n formatId,\r\n formatIds,\r\n}: {\r\n formatId: number,\r\n formatIds: Array,\r\n}) => formatIds.includes(formatId);\r\n\r\n/** merges our data/itemActions.js with customer defined actions from appsettings.json */\r\nexport const mergeItemActionsConfig = (\r\n itemUri: string,\r\n formatId: number\r\n): ItemActionsConfigDTO => {\r\n // get itemActions as defined in appsettings.json (after being checked for security for this user)\r\n const userActions = cloneDeep(s.userItemActionsSelector(store.getState()));\r\n const itemActions = cloneDeep(getItemActionsConfig());\r\n\r\n // get itemUri specific itemActions\r\n const defaults = getDefaultsConfig(itemUri, formatId);\r\n if (defaults && defaults.itemActions) {\r\n if (defaults.itemActions.replace === true) {\r\n return {\r\n actions:\r\n mergePartialConfig(\r\n defaults.itemActions.actions,\r\n itemActions.actions\r\n ) || [],\r\n categories:\r\n defaults.itemActions.categories || itemActions.categories, // use our system categories in case they are not specified\r\n };\r\n } else {\r\n return {\r\n actions: unionBy(\r\n defaults.itemActions.actions,\r\n userActions.actions,\r\n itemActions.actions,\r\n \"id\"\r\n ),\r\n categories: unionBy(\r\n defaults.itemActions.categories,\r\n userActions.categories,\r\n itemActions.categories,\r\n \"id\"\r\n ),\r\n };\r\n }\r\n } else {\r\n return {\r\n actions: unionBy(userActions.actions, itemActions.actions, \"id\"),\r\n categories: unionBy(\r\n userActions.categories,\r\n itemActions.categories,\r\n \"id\"\r\n ),\r\n };\r\n }\r\n};\r\n\r\nconst mergePartialConfig = (userActions, sysActions) => {\r\n let result = cloneDeep(userActions);\r\n if (result)\r\n result.forEach((userAction) => {\r\n // is the userAction trying to override an existing system action (by id)?\r\n const sysIndex = sysActions.findIndex(\r\n (sa) => sa.id === userAction.id\r\n );\r\n if (sysIndex !== -1) {\r\n const sysAction = sysActions[sysIndex];\r\n // merge properties (in case user missed/does not want to specify any)\r\n Object.keys(sysAction).forEach((key) => {\r\n userAction[key] = userAction[key] || sysAction[key];\r\n });\r\n }\r\n });\r\n return result;\r\n};\r\n","// @flow\r\nimport {\r\n type ItemActionsConfigDTO,\r\n ItemLinkType,\r\n SearchItemType,\r\n} from \"data/types\";\r\n\r\n// this file defines all the system pre-defined actionPanel commandActions available\r\n/* istanbul ignore next */\r\nexport const getItemActionsConfig = (): ItemActionsConfigDTO => ({\r\n categories: [\r\n {\r\n id: \"filter\",\r\n name: \"$actionCategory:filter.name\",\r\n icon: \"filter\",\r\n shouldBeVisible: [\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n \"hasRowAndColId\",\r\n ],\r\n },\r\n {\r\n id: \"general\",\r\n name: \"$actionCategory:general.name\",\r\n icon: \"hand-o-right\",\r\n shouldBeVisible: [\"isAnyOnlineStatus\", \"isAnySelection\"],\r\n },\r\n {\r\n id: \"doc\",\r\n name: \"$actionCategory:doc.name\",\r\n icon: \"file-text-o\",\r\n shouldBeVisible: [\"isAnyOnlineStatus\", \"isAnySelection\"],\r\n },\r\n {\r\n id: \"doclist\",\r\n name: \"$actionCategory:doclist.name\",\r\n icon: \"files-o\",\r\n shouldBeVisible: [\"isAnyOnlineStatus\", \"isAnySelection\"],\r\n },\r\n {\r\n id: \"wf\",\r\n name: \"$actionCategory:wf.name\",\r\n icon: \"check-square-o\",\r\n shouldBeVisible: [\"!hasContext:isFlatAU\", \"isWorkflowEnabled\"],\r\n },\r\n {\r\n id: \"reminder\",\r\n name: \"$actionCategory:reminder.name\",\r\n icon: \"clock-o\",\r\n },\r\n {\r\n id: \"history\",\r\n name: \"Activities\",\r\n expanded: true,\r\n shouldBeVisible: [\"hasContext:workflow\", \"isAnyOnlineStatus\"],\r\n },\r\n {\r\n id: \"sync\",\r\n name: \"$actionCategory:sync.name\",\r\n icon: \"external-link\",\r\n shouldBeVisible: [\"isSyncEnabled\", \"isAnySelection\"],\r\n },\r\n {\r\n id: \"clipboard\",\r\n name: \"$actionCategory:clipboard.name\",\r\n icon: \"clipboard\",\r\n shouldBeVisible: [\"isValidItemUri\", \"isAnyOnlineStatus\"],\r\n },\r\n {\r\n name: \"$actionCategory:others.name\",\r\n shouldBeVisible: [\"isAnyOnlineStatus\"],\r\n },\r\n {\r\n id: \"recyclebin\",\r\n name: \"$actionCategory:recyclebin\",\r\n icon: \"trash\",\r\n shouldBeVisible: [\"isAnySelection\", \"isRecycleBin\"],\r\n },\r\n {\r\n id: \"offline\",\r\n name: \"$actionCategory:offline\",\r\n shouldBeVisible: [\r\n \"hasFeature:offline\",\r\n \"isAnySelection\",\r\n \"isAnyOnlineStatus\",\r\n ],\r\n },\r\n ],\r\n actions: [\r\n {\r\n id: \"folder_activities\",\r\n category: \"history\",\r\n views: [\"home\", \"wf\"],\r\n shouldBeVisible: [\"isFolder\", \"isValidItemUri\"],\r\n commandAction: {\r\n name: \"folder_preview\",\r\n },\r\n view: {\r\n name: \"itemView_activityList\",\r\n isDoc: false,\r\n showAddNote: false,\r\n showHistory: false,\r\n showNotes: true,\r\n showRetentionInfo: false,\r\n },\r\n },\r\n {\r\n id: \"doc_activities\",\r\n category: \"history\",\r\n shouldBeVisible: [\"isDoc\", \"isValidItemUri\"],\r\n views: [\"home\", \"wf\", \"news\"],\r\n commandAction: {\r\n name: \"doc_preview\",\r\n },\r\n view: {\r\n name: \"itemView_activityList\",\r\n isDoc: true,\r\n showAddNote: false,\r\n showHistory: true,\r\n showNotes: true,\r\n },\r\n },\r\n {\r\n id: \"doclist_exportCsv\",\r\n category: \"doclist\",\r\n name: \"$itemActions:doclist_exportCsv.name\",\r\n icon: \"file-excel-o\",\r\n views: [\"flat\", \"folder\", \"miniflat\"],\r\n commandAction: { name: \"doclist_exportCsv\" },\r\n },\r\n {\r\n id: \"doclist_filters\",\r\n category: \"filter\",\r\n views: [\"flat\", \"folder\", \"miniflat\", \"mailbox\"],\r\n view: {\r\n name: \"itemView_filter\",\r\n actions: [\r\n \"filterByValue\",\r\n \"filterAddValue\",\r\n \"filterRemove\",\r\n \"reset\",\r\n ],\r\n },\r\n shouldBeVisible: [\"hasRowAndColId\"],\r\n commandAction: {}, //HACK: persist props to itemView\r\n },\r\n {\r\n id: \"doc_preview\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_preview.name\",\r\n icon: \"eye\",\r\n views: [\r\n \"flat\",\r\n \"folder\",\r\n \"searchresult\",\r\n \"news\",\r\n \"home\",\r\n \"wf\",\r\n \"offline_item\",\r\n ],\r\n shouldBeVisible: [\"isDoc\", \"isAnyOnlineStatus\"],\r\n commandAction: {\r\n name: \"doc_preview\",\r\n },\r\n },\r\n {\r\n id: \"doc_popout\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_popout.name\",\r\n icon: \"external-link\",\r\n views: [\r\n \"flat\",\r\n \"folder\",\r\n \"searchresult\",\r\n \"docmodal\",\r\n \"mailbox\",\r\n \"news\",\r\n \"home\",\r\n \"wf\",\r\n \"offline_item\",\r\n ],\r\n shouldBeVisible: [\"isDoc\", \"isAnyOnlineStatus\"],\r\n commandAction: {\r\n name: \"doc_preview\",\r\n props: {\r\n newWindow: true,\r\n },\r\n },\r\n },\r\n {\r\n id: \"doc_previewAndPrint\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_print.name\",\r\n icon: \"print\",\r\n views: [\r\n \"flat\",\r\n \"folder\",\r\n \"mailbox\",\r\n \"searchresult\",\r\n \"home\",\r\n \"news\",\r\n \"offline_item\",\r\n ],\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"isAnyOnlineStatus\",\r\n \"hasItemStatus:PDF\",\r\n ],\r\n commandAction: {\r\n name: \"doc_preview\",\r\n props: {\r\n triggerPrint: true,\r\n },\r\n },\r\n },\r\n {\r\n id: \"doc_print\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_print.name\",\r\n icon: \"print\",\r\n views: [\"doc\", \"docmodal\"],\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"isAnyOnlineStatus\",\r\n \"hasItemStatus:PDF\",\r\n ],\r\n commandAction: {\r\n name: \"doc_print\",\r\n },\r\n },\r\n {\r\n id: \"doc_lock\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_lock.name\",\r\n icon: \"lock\",\r\n views: [\"flat\", \"folder\", \"searchresult\", \"docmodal\", \"document\"],\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"!hasItemStatus:Locked\",\r\n \"hasContext:isDocEditAllowed\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"lock\",\r\n },\r\n },\r\n {\r\n id: \"doc_unlock\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_unlock.name\",\r\n icon: \"unlock\",\r\n views: [\"flat\", \"folder\", \"searchresult\", \"docmodal\", \"document\"],\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"hasItemStatus:Locked\",\r\n \"hasContext:isDocEditAllowed\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"unlock\",\r\n },\r\n },\r\n {\r\n id: \"fav_add\",\r\n category: \"general\",\r\n // name: \"Add as Favorite\",\r\n name: \"$itemActions:fav_add.name\",\r\n icon: \"star-o\",\r\n shouldBeVisible: [\r\n \"!isFav\",\r\n \"isValidItemUri\",\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"favorite\",\r\n props: {\r\n isFav: false,\r\n },\r\n },\r\n },\r\n {\r\n id: \"fav_remove\",\r\n category: \"general\",\r\n name: \"$itemActions:fav_remove.name\",\r\n // name: \"Remove from Favorites\",\r\n icon: \"star\",\r\n shouldBeVisible: [\r\n \"isFav\",\r\n \"isValidItemUri\",\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"favorite\",\r\n props: {\r\n isFav: true,\r\n },\r\n },\r\n },\r\n {\r\n id: \"share_web\",\r\n category: \"general\",\r\n name: \"$itemActions:share_web.name\",\r\n icon: \"share-alt\",\r\n shouldBeVisible: [\r\n \"hasBrowser_webShareApi\",\r\n \"isValidItemUri\",\r\n \"!hasSiteType:SharedSites\",\r\n \"isAnyOnlineStatus\",\r\n ],\r\n commandAction: {\r\n name: \"share_web\",\r\n },\r\n },\r\n {\r\n id: \"share\",\r\n category: \"general\",\r\n name: \"$itemActions:share.name\",\r\n icon: \"share-alt\",\r\n shouldBeVisible: [\r\n \"isValidItemUri\",\r\n \"!hasSiteType:SharedSites\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"share\",\r\n },\r\n },\r\n {\r\n id: \"share_edit\",\r\n category: \"general\",\r\n name: \"$itemActions:share_edit.name\",\r\n icon: \"share-alt-square\",\r\n shouldBeVisible: [\r\n \"isValidItemUri\",\r\n \"!hasSiteType:SharedSites\",\r\n \"hasItemStatus:Share\",\r\n ],\r\n commandAction: {\r\n name: \"share\",\r\n props: {\r\n isEdit: true,\r\n },\r\n },\r\n },\r\n {\r\n id: \"search_favorite_add\",\r\n category: \"general\",\r\n // name: \"Add as Favorite\",\r\n name: \"$itemActions:fav_add.name\",\r\n icon: \"star-o\",\r\n shouldBeVisible: [\r\n \"hasContext:searchRequest\",\r\n `!hasSearchType:${SearchItemType.Favorite}`,\r\n ],\r\n commandAction: {\r\n name: \"search_favorite\",\r\n },\r\n },\r\n {\r\n id: \"search_favorite_remove\",\r\n category: \"general\",\r\n name: \"$itemActions:fav_remove.name\",\r\n // name: \"Remove from Favorites\",\r\n icon: \"star\",\r\n shouldBeVisible: [\r\n \"hasContext:searchRequest\",\r\n `hasSearchType:${SearchItemType.Favorite}`,\r\n ],\r\n commandAction: {\r\n name: \"search_favorite\",\r\n },\r\n },\r\n {\r\n id: \"search_preview\",\r\n category: \"general\",\r\n name: \"$itemActions:search_preview.name\",\r\n icon: \"eye\",\r\n views: [\"home\"],\r\n shouldBeVisible: [\"hasContext:searchRequest\"],\r\n commandAction: {\r\n name: \"search_preview\",\r\n },\r\n },\r\n {\r\n id: \"search_popout\",\r\n category: \"general\",\r\n name: \"$itemActions:search_popout.name\",\r\n icon: \"external-link\",\r\n views: [\"home\"],\r\n shouldBeVisible: [\"hasContext:searchRequest\"],\r\n commandAction: {\r\n name: \"search_preview\",\r\n props: {\r\n newWindow: true,\r\n },\r\n },\r\n },\r\n {\r\n id: \"subscribe\",\r\n category: \"general\",\r\n name: \"$itemActions:subscribe.name\",\r\n icon: \"feed\",\r\n views: [\"flat\", \"folder\", \"searchresult\", \"docmodal\", \"document\"],\r\n shouldBeVisible: [\r\n \"!hasContext:isFlatAU\",\r\n \"!hasItemStatus:Subscribed\",\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"subscribe\",\r\n },\r\n },\r\n {\r\n id: \"unsubscribe\",\r\n category: \"general\",\r\n name: \"$itemActions:unsubscribe.name\",\r\n icon: \"feed\",\r\n views: [\r\n \"flat\",\r\n \"folder\",\r\n \"searchresult\",\r\n \"docmodal\",\r\n \"news\",\r\n \"document\",\r\n ],\r\n shouldBeVisible: [\r\n \"hasItemStatus:Subscribed\",\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"unsubscribe\",\r\n },\r\n },\r\n // {\r\n // id: \"transfer\",\r\n // category: \"general\",\r\n // name: \"$itemActions:transfer.name\",\r\n // icon: \"exchange\",\r\n // views: [\"flat\", \"folder\", \"searchresult\", \"docmodal\", \"document\"],\r\n // shouldBeVisible: [\"isValidItemUri\"],\r\n // commandAction: {\r\n // name: \"transfer\",\r\n // },\r\n // },\r\n {\r\n id: \"move\",\r\n category: \"general\",\r\n name: \"$itemActions:transfer.move\",\r\n icon: \"exchange\",\r\n views: [\"folder\", \"searchresult\", \"docmodal\", \"document\"],\r\n shouldBeVisible: [\r\n \"isValidItemUri\",\r\n \"!hasContext:isFlatAU\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"transfer\",\r\n props: {\r\n type: \"move\",\r\n },\r\n },\r\n },\r\n {\r\n id: \"copy\",\r\n category: \"general\",\r\n name: \"$itemActions:transfer.copy\",\r\n icon: \"files-o\",\r\n views: [\"folder\", \"searchresult\", \"docmodal\", \"document\"],\r\n shouldBeVisible: [\r\n \"isValidItemUri\",\r\n \"isDoc\",\r\n \"!hasContext:isFlatAU\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"transfer\",\r\n props: {\r\n type: \"copy\",\r\n },\r\n },\r\n },\r\n {\r\n id: \"link\",\r\n category: \"general\",\r\n name: \"$itemActions:transfer.link\",\r\n icon: \"link\",\r\n views: [\"folder\", \"searchresult\", \"docmodal\", \"document\"],\r\n shouldBeVisible: [\r\n \"isValidItemUri\",\r\n \"!hasContext:isFlatAU\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"transfer\",\r\n props: {\r\n type: \"link\",\r\n },\r\n },\r\n },\r\n {\r\n id: \"reminder_manage\",\r\n category: \"reminder\",\r\n shouldBeVisible: [\"isValidItemUri\"],\r\n view: {\r\n name: \"itemView_reminder\",\r\n },\r\n commandAction: {\r\n name: \"reminder_manage\",\r\n },\r\n },\r\n {\r\n id: \"reminder_add\",\r\n category: \"reminder\",\r\n name: \"$itemActions:reminder_add.name\",\r\n icon: \"clock-o\",\r\n shouldBeVisible: [\"isValidItemUri\"],\r\n commandAction: {\r\n name: \"reminder_manage\",\r\n },\r\n },\r\n {\r\n id: \"folder_preview\",\r\n category: \"general\",\r\n name: \"$itemActions:folder_preview.name\",\r\n icon: \"eye\",\r\n views: [\r\n \"searchresult\",\r\n \"news\",\r\n \"home\",\r\n \"document\",\r\n \"wf\",\r\n \"offline_item\",\r\n ],\r\n shouldBeVisible: [\r\n \"isValidItemUri\",\r\n \"!isMiniView\",\r\n \"!hasContext:isFlatAU\",\r\n ],\r\n commandAction: {\r\n name: \"folder_preview\",\r\n },\r\n },\r\n {\r\n id: \"folder_popout\",\r\n category: \"general\",\r\n name: \"$itemActions:folder_popout.name\",\r\n icon: \"external-link\",\r\n views: [\r\n \"searchresult\",\r\n \"news\",\r\n \"home\",\r\n \"document\",\r\n \"wf\",\r\n \"offline_item\",\r\n ],\r\n shouldBeVisible: [\r\n \"isValidItemUri\",\r\n \"isAnyOnlineStatus\",\r\n \"!isMiniView\",\r\n \"!hasContext:isFlatAU\",\r\n ],\r\n commandAction: {\r\n name: \"folder_preview\",\r\n props: {\r\n newWindow: true,\r\n },\r\n },\r\n },\r\n {\r\n id: \"doc_download\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_download.name\",\r\n // name: \"Download\",\r\n icon: \"download\",\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"hasContext:isDocDownloadAllowed\",\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"doc_download\",\r\n },\r\n },\r\n {\r\n id: \"doc_editWebDav\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_editWebDav.name\",\r\n icon: \"pencil\",\r\n views: [\"folder\", \"document\", \"docmodal\", \"flat\", \"home\"],\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"hasContext:isDocEditAllowed\",\r\n \"!hasItemStatus:CloudSync\",\r\n ],\r\n commandAction: {\r\n name: \"doc_editWebDav\",\r\n },\r\n },\r\n {\r\n id: \"doc_editCloud\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_editCloud.name\",\r\n icon: \"pencil\",\r\n views: [\"folder\", \"document\", \"docmodal\", \"flat\", \"home\"],\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"hasContext:isDocEditAllowed\",\r\n \"hasItemStatus:CloudSync\",\r\n ],\r\n commandAction: {\r\n name: \"doc_editCloud\",\r\n props: {\r\n onlineEditor: true,\r\n },\r\n },\r\n },\r\n {\r\n id: \"doc_editCloudLocal\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_editCloudLocal.name\",\r\n icon: \"pencil\",\r\n views: [\"folder\", \"document\", \"docmodal\", \"flat\", \"home\"],\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"hasContext:isDocEditAllowed\",\r\n \"hasItemStatus:CloudSync\",\r\n ],\r\n commandAction: {\r\n name: \"doc_editCloud\",\r\n props: {\r\n onlineEditor: false,\r\n },\r\n },\r\n },\r\n {\r\n id: \"doc_delete\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_delete.name\",\r\n icon: \"trash\",\r\n views: [\"folder\", \"document\", \"docmodal\", \"flat\"],\r\n shouldBeVisible: [\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n \"isDoc\",\r\n \"hasContext:isDocEditAllowed\",\r\n ],\r\n commandAction: { name: \"doc_delete\" },\r\n },\r\n {\r\n id: \"folder_delete\",\r\n category: \"general\",\r\n name: \"$itemActions:folder_delete.name\",\r\n icon: \"trash\",\r\n views: [\"folder\"],\r\n shouldBeVisible: [\r\n \"isFolder\",\r\n \"hasContext:isEditAllowed\",\r\n \"licenseAllowEdit\",\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: { name: \"folder_delete\" },\r\n },\r\n {\r\n id: \"folder_editClassification\",\r\n category: \"general\",\r\n name: \"$itemActions:folder_editClassification.name\",\r\n icon: \"edit\",\r\n views: [\"folder\"],\r\n shouldBeVisible: [\r\n \"isFolder\",\r\n \"hasContext:isEditAllowed\",\r\n \"hasContext:isFolderClassificationEditAllowed\",\r\n \"licenseAllowEdit\",\r\n \"isAnyOnlineStatus\",\r\n ],\r\n commandAction: { name: \"folder_editClassification\" },\r\n },\r\n {\r\n id: \"doc_previewAndEditClassification\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_editClassification.name\",\r\n icon: \"edit\",\r\n views: [\"flat\", \"folder\", \"searchresult\"],\r\n shouldBeVisible: [\"isDoc\", \"licenseAllowEdit\", \"isAnyOnlineStatus\"],\r\n commandAction: {\r\n name: \"doc_preview\",\r\n props: {\r\n triggerEditMode: true,\r\n },\r\n },\r\n },\r\n {\r\n id: \"doc_editClassification\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_editClassification.name\",\r\n icon: \"edit\",\r\n views: [\"document\", \"docmodal\"],\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"hasContext:isDocEditAllowed\",\r\n \"hasContext:isDocClassificationEditAllowed\",\r\n \"licenseAllowEdit\",\r\n \"isAnyOnlineStatus\",\r\n ],\r\n commandAction: { name: \"doc_editClassification\" },\r\n },\r\n // {\r\n // category: \"doc\",\r\n // name: \"Add to Basket\",\r\n // icon: \"shopping-basket\",\r\n // shouldBeVisible: [\"isDoc\"]\r\n // },\r\n // {\r\n // category: \"doc\",\r\n // name: \"Remove from Basket\",\r\n // icon: \"shopping-basket\",\r\n // shouldBeVisible: [\"isDoc\"]\r\n // },\r\n {\r\n id: \"doc_uploadVersion\",\r\n category: \"doc\",\r\n name: \"$itemActions:doc_uploadVersion.name\",\r\n icon: \"upload\",\r\n views: [\"document\", \"docmodal\", \"folder\", \"flat\"],\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"hasContext:isDocEditAllowed\",\r\n \"licenseAllowEdit\",\r\n \"!isSyncUpload\",\r\n \"isAnyOnlineStatus\",\r\n ],\r\n commandAction: { name: \"doc_uploadVersion\" },\r\n },\r\n {\r\n id: \"doc_upload\",\r\n category: \"doclist\",\r\n name: \"$itemActions:doc_upload.name\",\r\n icon: \"upload\",\r\n views: [\"folder\", \"flat\", \"miniflat\"],\r\n shouldBeVisible: [\r\n \"isFolder\",\r\n \"hasContext:isDocAssignmentAllowed\",\r\n \"licenseAllowEdit\",\r\n \"!isSyncUpload\",\r\n \"isAnyOnlineStatus\",\r\n ],\r\n // commandAction: { name: \"doc_upload\" }\r\n commandAction: {\r\n name: \"itemFlows\",\r\n props: {\r\n direction: \"in\",\r\n flowId: \"doc_upload\",\r\n },\r\n },\r\n },\r\n // {\r\n // category: \"general\",\r\n // name: \"Add to Selection\",\r\n // icon: \"check-circle-o\",\r\n // views: [\"folder\", \"flat\"],\r\n // shouldBeVisible: [\"isValidItemUri\", \"isDoc\"]\r\n // },\r\n // {\r\n // category: \"general\",\r\n // name: \"Remove from Selection\",\r\n // icon: \"circle-o\",\r\n // views: [\"folder\", \"flat\"],\r\n // shouldBeVisible: [\"isValidItemUri\", \"isDoc\"]\r\n // },\r\n // {\r\n // category: \"doc\",\r\n // name: \"Edit\",\r\n // icon: \"edit\",\r\n // shouldBeVisible: [\"isDoc\"]\r\n // },\r\n // {\r\n // category: \"doc\",\r\n // name: \"Lock\",\r\n // icon: \"lock\",\r\n // desc: \"Lock file to block any changes from other users\",\r\n // shouldBeVisible: [\"isDoc\"]\r\n // },\r\n // {\r\n // category: \"doc\",\r\n // name: \"Unlock\",\r\n // icon: \"unlock\",\r\n // shouldBeVisible: [\"isDoc\"]\r\n // },\r\n {\r\n id: \"itemFlows_input\",\r\n category: \"general\",\r\n name: \"$itemActions:itemFlows_input.name\",\r\n icon: \"plus-circle\",\r\n views: [\"folder\"],\r\n shouldBeVisible: [\"isCreateAllowed\", \"isAnyOnlineStatus\"],\r\n commandAction: {\r\n name: \"itemFlows\",\r\n props: {\r\n direction: \"in\",\r\n },\r\n },\r\n },\r\n // {\r\n // id: \"offline_depsMap\",\r\n // category: \"offline\",\r\n // name: \"$itemActions:offline_depsMap.name\",\r\n // views: [\"offline_item\"],\r\n // shouldBeVisible: [\"isAdmin\", \"hasFeature:offline\"],\r\n // commandAction: {\r\n // name: \"offline_depsMap\",\r\n // },\r\n // },\r\n {\r\n id: \"offline_add\",\r\n icon: \"power-off\",\r\n category: \"general\",\r\n name: \"$itemActions:offline_add.name\",\r\n shouldBeVisible: [\r\n \"isValidItemUri\",\r\n \"!hasContext:isOffline\",\r\n \"hasFeature:offline\",\r\n \"isFolder\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"offline_add\",\r\n },\r\n },\r\n {\r\n id: \"offline_del\",\r\n icon: \"power-off\",\r\n category: \"general\",\r\n name: \"$itemActions:offline_delete.name\",\r\n shouldBeVisible: [\r\n \"hasContext:isOffline\",\r\n \"hasFeature:offline\",\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: {\r\n name: \"offline_delete\",\r\n },\r\n },\r\n {\r\n id: \"offline_syncItem\",\r\n icon: \"cloud-download\",\r\n category: \"general\",\r\n name: \"$itemActions:offline_syncItem.name\",\r\n shouldBeVisible: [\"hasContext:isOffline\", \"hasFeature:offline\"],\r\n views: [\"offline_item\"],\r\n commandAction: {\r\n name: \"offline_syncItem\",\r\n },\r\n },\r\n {\r\n id: \"clipboard_copyItemUri\",\r\n category: \"clipboard\",\r\n name: \"$itemActions:clipboard_copyItemUri.name\",\r\n icon: \"clipboard\",\r\n views: [\"flat\", \"folder\", \"docmodal\", \"mailbox\", \"offline_item\"],\r\n shouldBeVisible: [\"isAdmin\", \"isAnyOnlineStatus\"],\r\n commandAction: {\r\n name: \"clipboard_copyItemUri\",\r\n },\r\n },\r\n {\r\n id: \"clipboard_copyItemLink\",\r\n category: \"clipboard\",\r\n name: \"$itemActions:clipboard_copyItemLink.name\",\r\n icon: \"clipboard\",\r\n views: [\"flat\", \"folder\", \"docmodal\", \"mailbox\", \"offline_item\"],\r\n shouldBeVisible: [\"isAnyOnlineStatus\"],\r\n commandAction: {\r\n name: \"clipboard_copyItemLink\",\r\n },\r\n },\r\n // {\r\n // category: \"general\",\r\n // name: \"Copy\",\r\n // icon: \"clone\",\r\n // shouldBeVisible: [\"isValidItemUri\"]\r\n // },\r\n // {\r\n // category: \"general\",\r\n // name: \"Cut\",\r\n // icon: \"scissors\",\r\n // shouldBeVisible: [\"isValidItemUri\"]\r\n // },\r\n // {\r\n // category: \"general\",\r\n // name: \"Paste\",\r\n // icon: \"clipboard\",\r\n // shouldBeVisible: [\"isValidItemUri\"]\r\n // },\r\n // {\r\n // category: \"general\",\r\n // name: \"Paste as Link\",\r\n // icon: \"link\",\r\n // shouldBeVisible: [\"isValidItemUri\"]\r\n // },\r\n {\r\n id: \"wf_report\",\r\n category: \"wf\",\r\n name: \"$itemActions:wf_report.name\",\r\n //desc: \"Displays workflow report(s)\",\r\n icon: \"book\",\r\n // views: [\"document\", \"docmodal\", \"folder\", \"miniflat\"],\r\n shouldBeVisible: [\"isWorkflowEnabled\", \"hasItemStatus:WFReport\"],\r\n commandAction: {\r\n name: \"doc_related\",\r\n props: {\r\n itemLinkType: ItemLinkType.WorkflowReport,\r\n },\r\n },\r\n },\r\n {\r\n id: \"wf_start\",\r\n category: \"wf\",\r\n name: \"$itemActions:wf_start.name\",\r\n //desc: \"Starts a workflow\",\r\n icon: \"check-square-o\",\r\n views: [\r\n \"home\",\r\n \"news\",\r\n \"document\",\r\n \"docmodal\",\r\n \"folder\",\r\n \"miniflat\",\r\n ],\r\n shouldBeVisible: [\r\n // \"hasContext:isDocEditAllowed\",\r\n \"isWorkflowEnabled\",\r\n ],\r\n commandAction: {\r\n name: \"wf_start\",\r\n },\r\n },\r\n // {\r\n // name: \"Stop Workflow\",\r\n // desc:\r\n // \"Stop a WIP status\",\r\n // icon: \"cancel\",\r\n // shouldBeVisible: [{ loc:\"isField\", name:\"status\", value:\"WIP\"}]\r\n // },\r\n {\r\n id: \"wf_info\",\r\n category: \"wf\",\r\n shouldBeVisible: [\r\n \"isValidItemUri\",\r\n // \"hasContext:isDocEditAllowed\",\r\n \"isWorkflowEnabled\",\r\n ],\r\n views: [\r\n \"home\",\r\n \"folder\",\r\n \"document\",\r\n \"docmodal\",\r\n \"flat\",\r\n \"miniflat\",\r\n \"searchresult\",\r\n \"wf\",\r\n ],\r\n commandAction: {\r\n name: \"link\",\r\n props: {\r\n asModal: true,\r\n docked: true,\r\n },\r\n },\r\n view: {\r\n name: \"itemView_workflow\",\r\n },\r\n },\r\n {\r\n id: \"wf_info_noitemuri\",\r\n category: \"wf\",\r\n shouldBeVisible: [\r\n \"!isValidItemUri\",\r\n // \"hasContext:isDocEditAllowed\",\r\n \"isWorkflowEnabled\",\r\n ],\r\n views: [\"wf\"],\r\n commandAction: {\r\n name: \"link\",\r\n props: {\r\n asModal: true,\r\n docked: true,\r\n },\r\n },\r\n view: {\r\n name: \"itemView_workflow\",\r\n },\r\n },\r\n {\r\n id: \"ip_archive\",\r\n category: \"sync\",\r\n name: \"$itemActions:ip_archive.name\",\r\n // desc: \"Launch inPoint.Sync ArchiveDialog\",\r\n icon: \"upload\",\r\n shouldBeVisible: [\r\n \"isWindows\",\r\n \"isSyncEnabled\",\r\n \"isFolder\",\r\n \"hasContext:isDocAssignmentAllowed\",\r\n ],\r\n commandAction: { name: \"ip_archive\" },\r\n },\r\n {\r\n id: \"ip_browse\",\r\n category: \"sync\",\r\n name: \"$itemActions:ip_browse.name\",\r\n icon: \"eye\",\r\n // desc: \"Browse in inPoint.Client\",\r\n shouldBeVisible: [\"isWindows\", \"isSyncEnabled\", \"isValidItemUri\"],\r\n commandAction: { name: \"ip_browse\" },\r\n },\r\n {\r\n id: \"ip_properties\",\r\n category: \"sync\",\r\n name: \"$itemActions:ip_properties.name\",\r\n // desc: \"Launch inPoint.Sync Properties dialog\",\r\n icon: \"tasks\",\r\n shouldBeVisible: [\r\n \"isWindows\",\r\n \"isSyncEnabled\",\r\n \"hasContext:isDocAssignmentAllowed\",\r\n \"!hasContext:isFlatAU\",\r\n ],\r\n commandAction: { name: \"ip_properties\" },\r\n },\r\n {\r\n id: \"ip_edit\",\r\n category: \"sync\",\r\n name: \"$itemActions:ip_edit.name\",\r\n // desc: \"Edit (in original application) with inPoint.Sync\",\r\n icon: \"edit\",\r\n shouldBeVisible: [\r\n \"isWindows\",\r\n \"isSyncEnabled\",\r\n \"isDoc\",\r\n \"hasContext:isDocAssignmentAllowed\",\r\n \"hasContext:isDocEditAllowed\",\r\n \"!hasContext:isFlatAU\",\r\n ],\r\n commandAction: { name: \"ip_edit\" },\r\n },\r\n {\r\n id: \"ip_commandAction_itemSendAsEmail\",\r\n category: \"sync\",\r\n name: \"$itemActions:ip_commandAction.itemSendAsEmail\",\r\n icon: \"envelope-o\",\r\n shouldBeVisible: [\r\n \"isAnySelection\",\r\n \"isWindows\",\r\n \"isSyncEnabled\",\r\n \"isDoc\",\r\n \"hasContext:isDocSendByEmailAllowed\",\r\n ],\r\n commandAction: {\r\n name: \"ip_commandAction\",\r\n props: {\r\n commandAction: \"ItemSendAsEmailCommandAction\",\r\n },\r\n },\r\n },\r\n {\r\n id: \"ip_commandAction_itemSendAsEmailLink\",\r\n category: \"sync\",\r\n name: \"$itemActions:ip_commandAction.itemSendAsEmailLink\",\r\n icon: \"envelope-o\",\r\n shouldBeVisible: [\r\n \"isAnySelection\",\r\n \"isWindows\",\r\n \"isSyncEnabled\",\r\n \"isValidItemUri\",\r\n ],\r\n commandAction: {\r\n name: \"ip_commandAction\",\r\n props: {\r\n commandAction: \"ItemSendAsEmailLinkCommandAction\",\r\n },\r\n },\r\n },\r\n // {\r\n // category: \"sync\",\r\n // name: \"Make available Offline\",\r\n // desc: \"Sync for offline use with inPoint.Sync\",\r\n // icon: \"power-off\",\r\n // shouldBeVisible: [\"isWindows\", \"isSyncEnabled\"]\r\n // },\r\n\r\n // ---- Recycle Bin\r\n {\r\n id: \"doc_previewRecycleBin\",\r\n category: \"recyclebin\",\r\n name: \"$itemActions:doc_preview.name\",\r\n icon: \"eye\",\r\n views: [\"flat\", \"folder\", \"searchresult\", \"news\", \"home\"],\r\n shouldBeVisible: [\"isDoc\", \"isRecycleBin\"],\r\n commandAction: {\r\n name: \"doc_preview\",\r\n },\r\n },\r\n {\r\n id: \"doc_clear\",\r\n category: \"recyclebin\",\r\n name: \"$itemActions:doc_clear.name\",\r\n icon: \"trash\",\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"hasItemStatus:Deleted\",\r\n \"isRecycleBin\",\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: { name: \"recyclebin_docClear\" },\r\n },\r\n {\r\n id: \"doc_restore\",\r\n category: \"recyclebin\",\r\n name: \"$itemActions:doc_restore.name\",\r\n icon: \"repeat\",\r\n shouldBeVisible: [\r\n \"isDoc\",\r\n \"hasItemStatus:Deleted\",\r\n \"!hasItemStatus:ParentDeleted\",\r\n \"isRecycleBin\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: { name: \"recyclebin_docRestore\" },\r\n },\r\n {\r\n id: \"folder_clear\",\r\n category: \"recyclebin\",\r\n name: \"$itemActions:folder_clear.name\",\r\n icon: \"trash\",\r\n shouldBeVisible: [\r\n \"isFolder\",\r\n \"hasItemStatus:Deleted\",\r\n \"isRecycleBin\",\r\n \"isAnyOnlineStatus\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: { name: \"recyclebin_folderClear\" },\r\n },\r\n {\r\n id: \"folder_restore\",\r\n category: \"recyclebin\",\r\n name: \"$itemActions:folder_restore.name\",\r\n icon: \"repeat\",\r\n shouldBeVisible: [\r\n \"isFolder\",\r\n \"hasItemStatus:Deleted\",\r\n \"!hasItemStatus:ParentDeleted\",\r\n \"isRecycleBin\",\r\n \"isAnySelection\",\r\n ],\r\n commandAction: { name: \"recyclebin_folderRestore\" },\r\n },\r\n ],\r\n});\r\n","// @flow\r\nimport React from \"react\";\r\nimport { type ListViewModeEnum } from \"data/types\";\r\nimport AbsoluteDropdown from \"components/AbsoluteDropdown\";\r\nimport Dropdown from \"react-bootstrap/lib/Dropdown\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport { ViewModeIcon } from \"./ViewModes\";\r\n\r\ntype Props = {\r\n /** current selected viewMode */\r\n viewMode: ListViewModeEnum,\r\n /** all available viewModes to render */\r\n viewModes?: Array,\r\n /** callback when user changes viewMode\r\n * @param {ListViewModeEnum} viewMode the viewMode the user chose\r\n */\r\n onChange: (viewMode: ListViewModeEnum) => void,\r\n /** options CSS class name to apply */\r\n className?: string,\r\n};\r\n\r\n/** render a Dropdownlist with requested viewModes marking the currently active viewMode */\r\nconst ViewModesMenu = ({ viewMode, viewModes, onChange, className }: Props) => (\r\n \r\n \r\n \r\n \r\n \r\n {viewModes.map((vm) => (\r\n onChange(vm)}\r\n >\r\n \r\n {loc.t(`common:view.${vm}`)}\r\n \r\n ))}\r\n \r\n \r\n);\r\n\r\nViewModesMenu.displayName = \"ViewModesMenu\";\r\nexport default ViewModesMenu;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { type ListViewModeEnum } from \"data/types\";\r\nimport ToggleButtonGroup from \"react-bootstrap/lib/ToggleButtonGroup\";\r\nimport ToggleButton from \"react-bootstrap/lib/ToggleButton\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport { ViewModeIcon } from \"./ViewModes\";\r\n\r\ntype Props = {\r\n /** current selected viewMode */\r\n viewMode: ListViewModeEnum,\r\n /** all available viewModes to render */\r\n viewModes?: Array,\r\n /** callback when user changes viewMode\r\n * @param {ListViewModeEnum} viewMode the viewMode the user chose\r\n */\r\n onChange: (viewMode: ListViewModeEnum) => void,\r\n /** options CSS class name to apply */\r\n className?: string,\r\n};\r\n\r\n/** render a Dropdownlist with requested viewModes marking the currently active viewMode */\r\nconst ViewModesButtons = ({\r\n viewMode,\r\n viewModes,\r\n onChange,\r\n className,\r\n}: Props) => (\r\n <>\r\n {/*
{loc.t(\"view.menuCaption\")}
*/}\r\n \r\n {/* \r\n \r\n */}\r\n {viewModes.map((vm) => (\r\n onChange(vm)}\r\n >\r\n \r\n \r\n ))}\r\n \r\n \r\n);\r\nViewModesButtons.displayName = \"ViewModesButtons\";\r\nexport default ViewModesButtons;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport ViewModesMenu from \"./ViewModesMenu\";\r\nimport ViewModesButtons from \"./ViewModesButtons\";\r\nimport { type ListViewModeEnum, ListViewMode } from \"data/types\";\r\nimport styles from \"./ViewModes.module.css\";\r\n\r\nexport const ViewModeIcon = {\r\n [ListViewMode.Thumbnails]: \"picture-o\",\r\n [ListViewMode.List]: \"list\",\r\n [ListViewMode.Grid]: \"table\",\r\n [ListViewMode.Map]: \"globe\",\r\n [ListViewMode.Calendar]: \"calendar\",\r\n};\r\n\r\ntype Props = {\r\n /** current selected ViewMode */\r\n viewMode: ListViewModeEnum,\r\n /** all available viewModes to render */\r\n viewModes: Array,\r\n /** callback when user selects a different viewMode\r\n * @param {ListViewModeEnum} viewMode new selected viewMode\r\n */\r\n onChange: (viewMode: ListViewModeEnum) => void,\r\n};\r\n\r\n/** render the ViewMenu choice with requested viewModes marking the currently active viewMode */\r\nexport const ViewModes = (props: Props) => {\r\n if (\r\n props.viewModes == null ||\r\n props.viewMode == null ||\r\n props.viewModes.length <= 1\r\n )\r\n return null;\r\n else\r\n return props.browser.greaterThanOrEqual.large ? (\r\n \r\n ) : (\r\n \r\n );\r\n};\r\nViewModes.displayName = \"ViewModes\";\r\n\r\n// apply Redux Store state to Component Properties\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n browser: state.browser,\r\n ...ownProps,\r\n});\r\n\r\nexport default connect(mapStateToProps)(ViewModes);\r\n","// configuration file for components/ActionsMenu\r\n// localized text defined in data/i8n.*.json {viewName}/actions\r\nconst ActionMenus = {\r\n docactivity_context: [\r\n {\r\n id: \"details\",\r\n },\r\n {\r\n id: \"view\",\r\n },\r\n {\r\n id: \"popout\",\r\n },\r\n {\r\n id: \"download\",\r\n },\r\n {\r\n id: \"sep\",\r\n type: \"separator\",\r\n },\r\n {\r\n id: \"restore\",\r\n },\r\n {\r\n id: \"delete\",\r\n },\r\n ],\r\n docactivity_readonly_context: [\r\n {\r\n id: \"details\",\r\n },\r\n {\r\n id: \"view\",\r\n },\r\n ],\r\n};\r\n\r\nexport default ActionMenus;\r\n","// @flow\r\nimport React from \"react\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport actionMenus from \"data/actionMenus\";\r\nimport loc from \"i18next\";\r\n\r\ntype ActionMenuItem = {\r\n id: string,\r\n text: string,\r\n type: null | \"separator\" | \"header\",\r\n};\r\n\r\ntype Props = {\r\n menuName: string,\r\n item: ActionMenuItem,\r\n /** callback to decide whether specified action should be visible\r\n * @param {object} action action object for which to decide visibility\r\n * @returns {boolean} true if should be visible, false to not render\r\n */\r\n onShouldBeVisible: ?(action: { id: string }) => boolean,\r\n /** callback to retrieve parameters to show in the action's text */\r\n onGetActionTextArguments: ?(actionId: string) => Object,\r\n /** callback when user selects action from ActionsMenu */\r\n onSelect: (id: string) => void,\r\n};\r\n\r\nexport const RenderActionMenuItem = ({\r\n menuName,\r\n item,\r\n onShouldBeVisible,\r\n onGetActionTextArguments,\r\n onSelect,\r\n}: Props) => {\r\n if (typeof onShouldBeVisible === \"function\") {\r\n if (!onShouldBeVisible(item)) return null;\r\n }\r\n const args =\r\n typeof onGetActionTextArguments === \"function\"\r\n ? onGetActionTextArguments(item.id)\r\n : {};\r\n\r\n return (\r\n \r\n {item.type !== \"separator\" &&\r\n loc.t(`${menuName}:actions.${item.id}`, args)}\r\n \r\n );\r\n};\r\n\r\nfunction RenderActionsMenu(\r\n name: string,\r\n onShouldBeVisible: ?(action: { id: string }) => boolean,\r\n onGetActionTextArguments: ?(actionId: string) => Object,\r\n onSelect: (id: string) => void\r\n) {\r\n if (!Object.prototype.hasOwnProperty.call(actionMenus, name)) return null;\r\n\r\n return actionMenus[name].map((item, key) => (\r\n {\r\n if (typeof id === \"string\") onSelect(id);\r\n }\r\n }\r\n />\r\n ));\r\n}\r\n\r\nexport default RenderActionsMenu;\r\n","// @flow\r\nimport React from \"react\";\r\nimport RenderActionsMenu from \"./Render\";\r\nimport AbsoluteDropdown from \"components/AbsoluteDropdown\";\r\nimport Dropdown from \"react-bootstrap/lib/Dropdown\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport styles from \"./ActionsMenu.module.css\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** view name */\r\n name: string,\r\n /** callback when user selects action from ActionsMenu\r\n * @param {string} actionId which action has been selected by the user\r\n */\r\n onAction: (actionId: string) => void,\r\n /** callback to decide whether specified action should be visible\r\n * @param {object} action action object for which to decide visibility\r\n * @returns {boolean} true if should be visible, false to not render\r\n */\r\n onShouldBeVisible?: (action: { id: string }) => boolean,\r\n /** whether to disable the whole actionsMenu */\r\n disabled?: boolean,\r\n /** optional CSS class to apply to dropdown */\r\n className?: string,\r\n toggleComponent?: React.Element,\r\n};\r\n\r\n/**\r\n * renders a dropdown menu with actions\r\n */\r\nconst ActionsMenu = ({\r\n name,\r\n onAction,\r\n onShouldBeVisible,\r\n disabled,\r\n className,\r\n toggleComponent,\r\n}: Props) => (\r\n \r\n \r\n {toggleComponent ? (\r\n toggleComponent\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n {RenderActionsMenu(name, onShouldBeVisible, null, onAction)}\r\n \r\n \r\n);\r\n\r\nActionsMenu.displayName = \"ActionsMenu\";\r\nexport default ActionsMenu;\r\n","// @flow\r\nimport React, { useMemo, useCallback, useContext } from \"react\";\r\nimport { MultiSelectionContext } from \"data/context\";\r\nimport Icons from \"@hs/icons\";\r\nimport ItemStatusIcons from \"components/ItemStatusIcons\";\r\nimport Attributes from \"components/Attributes\";\r\nimport {\r\n GridListConstant,\r\n type DocColumnResultDTO,\r\n type docFilterText,\r\n DocListColumnType,\r\n} from \"data/types\";\r\n// import { shortItemUri } from \"components/ItemUriLink\";\r\nimport Thumbnail from \"./Thumbnail\";\r\nimport Mark from \"@hs/mark\";\r\nimport ValueFactory from \"components/Attributes/SummaryAttribute/ValueFactory\";\r\nimport { getClassNames, getValue } from \"data/utils\";\r\nimport { isHandheld } from \"data/bowser\";\r\nimport withStickyToggle from \"containers/StickyToggle\";\r\nimport StickyToggleStyle from \"containers/StickyToggle/style\";\r\nimport styles from \"./RowResult.module.css\";\r\n\r\ntype Props = {\r\n /** CSS styles to apply */\r\n style?: StyleSheet,\r\n /** the row object */\r\n row: Object,\r\n /** row index */\r\n index: number,\r\n /** all the columns */\r\n cols: Array,\r\n /** whether row should be marked as selected */\r\n isSelected: boolean,\r\n /** callback when user clicks document icon\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n */\r\n onIconClick?: (e: SyntheticMouseEvent<*>) => void,\r\n /** callback when user single clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onSingleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** callback when user double clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onDoubleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** callback when user clicks on More... Button\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onMoreClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** whether to disable the More... button */\r\n actionsDisabled?: boolean,\r\n /** callback when row has been rendered (and HTML loaded) */\r\n onLoad?: () => void,\r\n /** whether to show thumbnails or just file types' icons */\r\n showThumbnail: boolean,\r\n /** quick filter details */\r\n filterText: ?docFilterText,\r\n};\r\n\r\n/**\r\n * Render one document row in \"Simple\" layout mode\r\n */\r\nexport const RowResult = (props: Props) => {\r\n const {\r\n className,\r\n style,\r\n row,\r\n index,\r\n cols,\r\n isSelected,\r\n isHovered,\r\n filterText,\r\n onIconClick,\r\n onSingleClick,\r\n onDoubleClick,\r\n onMoreClick,\r\n onMouseEnter,\r\n onMouseLeave,\r\n onLoad,\r\n showThumbnail,\r\n divRef,\r\n onTouchStart,\r\n onTouchMove,\r\n onTouchEnd,\r\n onMouseDown,\r\n onMouseUp,\r\n onContextMenu,\r\n } = props;\r\n\r\n /* istanbul ignore next */\r\n const {\r\n multiple,\r\n renderCheckbox,\r\n isSelected: isMultiSelected,\r\n } = useContext(MultiSelectionContext) || {\r\n multiple: false,\r\n renderCheckbox: () => null,\r\n isSelected: (index: number) => false,\r\n };\r\n\r\n const itemUri = useMemo(() => row[row.length - 1], [row]);\r\n\r\n const handleSingleClick = useCallback(\r\n (e: SyntheticMouseEvent<*>) => {\r\n e.stopPropagation();\r\n /* istanbul ignore else */\r\n if (typeof onSingleClick === \"function\")\r\n onSingleClick(e, itemUri, index);\r\n },\r\n [itemUri, index, onSingleClick]\r\n );\r\n\r\n const handleDoubleClick = useCallback(\r\n (e: SyntheticMouseEvent<*>) => {\r\n e.stopPropagation();\r\n /* istanbul ignore else */\r\n if (typeof onDoubleClick === \"function\")\r\n onDoubleClick(e, itemUri, index);\r\n },\r\n [itemUri, index, onDoubleClick]\r\n );\r\n\r\n const handleIconClick = useCallback(\r\n (e: SyntheticMouseEvent<*>) => {\r\n e.stopPropagation();\r\n /* istanbul ignore else */\r\n if (typeof onIconClick === \"function\")\r\n onIconClick(e, itemUri, index);\r\n },\r\n [itemUri, index, onIconClick]\r\n );\r\n\r\n const renderName = useCallback(() => {\r\n let nameColIndex = cols.findIndex(\r\n (col) => col.type === DocListColumnType.WebDavName\r\n );\r\n // FlatAUs do not have any Name columns\r\n if (nameColIndex === -1) nameColIndex = 1;\r\n\r\n const col = cols[nameColIndex];\r\n\r\n let name = row[nameColIndex];\r\n if (typeof name !== \"string\") {\r\n name = ;\r\n }\r\n\r\n if (\r\n filterText &&\r\n filterText.name &&\r\n filterText.value &&\r\n filterText.name.toUpperCase() === col.name.toUpperCase()\r\n ) {\r\n return {name};\r\n } else return name;\r\n }, [row, cols, filterText]);\r\n\r\n const extensionColIndex = useMemo(\r\n () =>\r\n cols.findIndex((col) => col.name.toUpperCase() === \"EXTENSIONICON\"),\r\n [cols]\r\n );\r\n const statusColIndex = useMemo(\r\n () =>\r\n cols.findIndex(\r\n (col) => col.name.toUpperCase() === \"ICONITEMSTATUS\"\r\n ),\r\n [cols]\r\n );\r\n const sizeColIndex = useMemo(\r\n () => cols.findIndex((col) => col.type === DocListColumnType.FileSize),\r\n [cols]\r\n );\r\n\r\n const size = useMemo(\r\n () => getValue(row[sizeColIndex]),\r\n [row, sizeColIndex]\r\n );\r\n const attributes = useMemo(\r\n () =>\r\n cols.reduce((accumulator, col, idx, arr) => {\r\n const val = row[idx];\r\n if (\r\n ![\r\n GridListConstant.ExtensionIcon.toUpperCase(),\r\n GridListConstant.IconItemStatus.toUpperCase(),\r\n GridListConstant.ItemUri.toUpperCase(),\r\n ].includes(col.name.toUpperCase()) &&\r\n col.type !== DocListColumnType.WebDavName &&\r\n col.type !== DocListColumnType.FileSize &&\r\n val != null\r\n ) {\r\n if (typeof val === \"string\") {\r\n accumulator.push([col.caption, val]);\r\n } else {\r\n accumulator.push({\r\n caption: col.caption,\r\n value: val,\r\n });\r\n }\r\n }\r\n\r\n return accumulator;\r\n }, []),\r\n [cols, row]\r\n );\r\n const combinedClassNames = getClassNames(\r\n className,\r\n styles.row,\r\n multiple\r\n ? isMultiSelected(index)\r\n ? styles.active\r\n : null\r\n : isSelected\r\n ? styles.active\r\n : null,\r\n isHovered ? styles.hovered : null,\r\n showThumbnail ? styles.thumbnail : null,\r\n isHandheld() ? (multiple ? styles.multi : null) : styles.multi\r\n );\r\n return (\r\n \r\n {(multiple || (isHovered && !isHandheld())) &&\r\n renderCheckbox(index, styles.checkbox)}\r\n
\r\n {showThumbnail && (\r\n \r\n )}\r\n {!showThumbnail && (\r\n \r\n )}\r\n
\r\n
\r\n {sizeColIndex !== -1 && size !== \"0 B\" && size + \" \"}\r\n {showThumbnail && (\r\n \r\n )}\r\n \r\n
\r\n
{renderName()}
\r\n \r\n
\r\n );\r\n};\r\nRowResult.displayName = \"RowResult\";\r\nRowResult.defaultProps = {\r\n isSelected: false,\r\n showThumbnail: false,\r\n};\r\n\r\nconst RowResultWithStickyToggle = withStickyToggle({\r\n renderDiv: false,\r\n usePortal: false,\r\n getStyle: StickyToggleStyle.List,\r\n isActiveProp: \"isSelected\",\r\n})(RowResult);\r\n\r\nexport default RowResultWithStickyToggle;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { type docsResultState } from \"data/reducers/types\";\r\nimport { type DocListLayout } from \"data/types\";\r\nimport CellMeasurer from \"react-virtualized/dist/commonjs/CellMeasurer\";\r\nimport CellMeasurerCache from \"react-virtualized/dist/commonjs/CellMeasurer/CellMeasurerCache\";\r\nimport Measure from \"react-measure\";\r\nimport ReactResizeDetector from \"react-resize-detector\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport ContextMenuHandler from \"components/ContextMenu/Handler\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport NoDocs from \"components/NoDocs\";\r\nimport ListGroup from \"react-bootstrap/lib/ListGroup\";\r\nimport List from \"react-virtualized/dist/commonjs/List\";\r\nimport InfiniteLoader from \"react-virtualized/dist/commonjs/InfiniteLoader\";\r\nimport \"react-virtualized/styles.css\"; // only needs to be imported once\r\nimport styles from \"./DocListSimple.module.css\";\r\nimport immutable from \"object-path-immutable\";\r\nimport RowResult from \"./RowResult\";\r\n\r\ntype Props = {\r\n /** doclist fetch result */\r\n result: docsResultState,\r\n /** total number of documents */\r\n totalCount: number,\r\n /** callback to request loading next page */\r\n loadMoreRows: ({ rowIndex: number }) => Promise,\r\n /** docList layout settings */\r\n layout?: DocListLayout,\r\n /** callback to set filtering on a specific column\r\n * @param {string} colName name of column to filter\r\n */\r\n requestShowFilter: (colName: string) => void,\r\n /** which row index is currently selected */\r\n activeRowIndex?: ?number,\r\n /** which row index to bring into view */\r\n scrollToRow?: ?number,\r\n /** which row is the UI currently updating\r\n * @param {number} rowStartIndex row index in result.rows\r\n */\r\n rowStartIndexUpdated: (rowStartIndex: number) => void,\r\n /** callback when user clicks document icon\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n */\r\n onIconClick?: (e: SyntheticMouseEvent) => void,\r\n /** callback when user single clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} rowIndex the row's index\r\n */\r\n onSingleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n rowIndex: number\r\n ) => void,\r\n /** callback when user clicks on More... button\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onMoreClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** whether to disable the More... button */\r\n actionsDisabled?: boolean,\r\n /** callback when user right clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {number} rowIndex the row's index\r\n * @param {number} columnsIndex the column's index\r\n * @param {string} itemUri the row's itemUri\r\n */\r\n onContextClick?: (\r\n e: SyntheticMouseEvent,\r\n rowIndex: number,\r\n columnIndex: number,\r\n itemUri: string\r\n ) => void,\r\n /** React.Node children */\r\n children?: Node,\r\n /** whether to show thumbnails or just file types' icons */\r\n showThumbnails?: boolean,\r\n /** minimum row height (in px) */\r\n minRowHeight?: number,\r\n /** alternative Component used to Render each Row */\r\n RenderRowComponentClass?: React.Node,\r\n};\r\n\r\ntype State = {\r\n rows: Object,\r\n pageSize: number,\r\n pagesStatus: Array,\r\n activeRowIndex: number,\r\n hoveredRowIndex: number,\r\n refreshId: number,\r\n};\r\n\r\n/**\r\n * Renders the Tiles/Thumbnails documents list\r\n */\r\nclass DocListSimple extends PureComponent {\r\n _cache: Object;\r\n _list: List | null; // internal ref to rendered virtualized List Component\r\n // _autoHide: AutoHide | null;\r\n\r\n static defaultProps = {\r\n showThumbnails: false,\r\n RenderRowComponentClass: RowResult,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this._initCellMeasurerCache(props);\r\n\r\n this.state = {\r\n //first page results loaded by DocListContainer\r\n rows: props.result.rows,\r\n pageSize: props.result.pageSize,\r\n //first page already pre-loaded otherwise we wouldn't be here\r\n pagesStatus: [Constants.OK],\r\n activeRowIndex:\r\n props.activeRowIndex != null ? props.activeRowIndex : -1,\r\n hoveredRowIndex: -1,\r\n refreshId: 0,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n /* istanbul ignore else */\r\n if (prevProps.showThumbnails !== this.props.showThumbnails) {\r\n this._initCellMeasurerCache(this.props);\r\n this._onResize();\r\n }\r\n if (prevState.rows !== this.state.rows) {\r\n this._onResize();\r\n }\r\n }\r\n\r\n _initCellMeasurerCache = (props: Props) => {\r\n this._cache = new CellMeasurerCache({\r\n fixedWidth: true,\r\n minHeight:\r\n props.minRowHeight ||\r\n /* istanbul ignore next */ (props.showThumbnails ? 85 : 55),\r\n });\r\n };\r\n\r\n /* istanbul ignore next */ _onResize = (width: number, height: number) => {\r\n /* istanbul ignore next */\r\n this.setState(\r\n ({ refreshId }: State) => ({\r\n refreshId: ++refreshId,\r\n }),\r\n () => this._cache.clearAll()\r\n );\r\n };\r\n\r\n _isRowLoaded = ({ index }: { index: number }) => {\r\n const { rows } = this.state;\r\n return Object.prototype.hasOwnProperty.call(rows, index);\r\n };\r\n\r\n _loadMoreRows = ({\r\n startIndex,\r\n stopIndex,\r\n }: {\r\n startIndex: number,\r\n stopIndex: number,\r\n }) => {\r\n const { rows, pageSize, pagesStatus } = this.state;\r\n //console.log(\"loadMoreRows\", startIndex, stopIndex);\r\n\r\n // result already has data?\r\n /* istanbul ignore next */\r\n if (\r\n Object.prototype.hasOwnProperty.call(rows, startIndex) &&\r\n Object.prototype.hasOwnProperty.call(rows, stopIndex)\r\n ) {\r\n return;\r\n }\r\n\r\n // calc pagenumber\r\n let pageNum = 0;\r\n /* istanbul ignore else */\r\n if (startIndex > 0) {\r\n // specific row index requested? calc page number\r\n pageNum = Math.floor(startIndex / pageSize);\r\n }\r\n // check that stopIndex is indeed included\r\n /* istanbul ignore next */\r\n if ((pageNum + 1) * pageSize < stopIndex) {\r\n pageNum++;\r\n }\r\n\r\n // page already loaded/requested?\r\n /* istanbul ignore next */\r\n if (\r\n pagesStatus[pageNum] === Constants.OK ||\r\n pagesStatus[pageNum] === Constants.LOADING\r\n )\r\n return;\r\n\r\n // fetch\r\n pagesStatus[pageNum] = Constants.LOADING;\r\n return this.props.loadMoreRows(pageNum).then((result) => {\r\n this.setState(\r\n {\r\n rows: immutable.assign(this.state, \"rows\", result.rows)\r\n .rows,\r\n },\r\n // after setting State make this page available to everyone\r\n () => {\r\n pagesStatus[pageNum] = Constants.OK;\r\n }\r\n );\r\n });\r\n };\r\n\r\n _rowRenderer = ({\r\n index,\r\n isScrolling,\r\n key,\r\n parent,\r\n style,\r\n }: {\r\n index: number,\r\n isScrolling: boolean,\r\n key: number,\r\n parent: Object,\r\n style: StyleSheet,\r\n }) => {\r\n if (this._isRowLoaded({ index })) {\r\n const { rows } = this.state;\r\n const row = rows[index];\r\n const itemUri = row[row.length - 1];\r\n const handleRowMoreClick = (e) => {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onMoreClick === \"function\")\r\n this.props.onMoreClick(e, itemUri, index);\r\n };\r\n const handleRowContextMenu = (e) => {\r\n this._cellOnContextMenu(e, index, itemUri);\r\n };\r\n const handleRowMouseEnter = (e) => {\r\n this.setState({ hoveredRowIndex: index });\r\n };\r\n return (\r\n \r\n {({ measure }) => (\r\n \r\n {React.createElement(\r\n this.props.RenderRowComponentClass,\r\n {\r\n index,\r\n row,\r\n onLoad: this._onResize,\r\n showThumbnail: this.props.showThumbnails,\r\n filterText: this.props.result.filterText,\r\n layout: this.props.layout,\r\n cols: this.props.result.cols,\r\n isSelected:\r\n this.props.activeRowIndex === index,\r\n isHovered:\r\n this.state.hoveredRowIndex === index,\r\n onIconClick: this.props.onIconClick,\r\n onSingleClick: this.props.onSingleClick,\r\n onMoreClick: handleRowMoreClick,\r\n onDoubleClick: this.props.onDoubleClick,\r\n actionsDisabled: this.props.actionsDisabled,\r\n }\r\n )}\r\n \r\n )}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {({ measure }) => (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n };\r\n\r\n _cellOnContextMenu = (\r\n e: SyntheticMouseEvent<*>,\r\n rowIndex: number,\r\n itemUri: string\r\n ) => {\r\n this.setState({ activeRowIndex: rowIndex });\r\n //this.multiGrid.forceUpdateGrids();\r\n e.preventDefault();\r\n e.persist();\r\n /* istanbul ignore else */\r\n if (typeof this.props.onContextClick === \"function\") {\r\n //console.log(e.target.innerText, columnIndex);\r\n this.props.onContextClick(e, rowIndex, 0, itemUri);\r\n }\r\n };\r\n\r\n render() {\r\n const { rows } = this.state;\r\n const count =\r\n this.props.totalCount === 0\r\n ? this.props.result.rowCount\r\n : this.props.totalCount;\r\n\r\n return (\r\n \r\n {(dimensions) => (\r\n \r\n \r\n \r\n {({ onRowsRendered, registerChild }) => (\r\n {\r\n this._list = ref;\r\n registerChild(ref);\r\n }}\r\n deferredMeasurementCache={this._cache}\r\n width={dimensions.width}\r\n height={dimensions.height}\r\n rowCount={count}\r\n rowHeight={this._cache.rowHeight}\r\n rowRenderer={this._rowRenderer}\r\n onRowsRendered={onRowsRendered}\r\n overscanRowCount={10}\r\n noRowsRenderer={() => (\r\n \r\n )}\r\n rows={rows}\r\n scrollToIndex={this.props.scrollToRow}\r\n scrollToAlignment=\"start\"\r\n />\r\n )}\r\n \r\n \r\n \r\n {this.props.children}\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default DocListSimple;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport loc from \"i18next\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\n\r\nconst OpenFiltersButton = ({ onClick }: { onClick: Function }) => (\r\n \r\n \r\n {loc.t(\"actionCategory:filter.name\")}\r\n \r\n);\r\nOpenFiltersButton.displayName = \"OpenFiltersButton\";\r\nexport default OpenFiltersButton;\r\n","// @flow\r\nimport React from \"react\";\r\nimport NoData from \"components/NoData\";\r\nimport { IsFiltered } from \"components/DocListFilterModal/Utils\";\r\nimport { type DocListLayout } from \"data/types\";\r\nimport OpenFiltersButton from \"./OpenFiltersButton\";\r\nimport CommandActionButton from \"components/CommandActions/CommandActionButton\";\r\nimport { docsItemUri, docsFlagsIsDocAssignmentAllowed } from \"data/storeHelper\";\r\n\r\nconst NoDocs = ({\r\n layout,\r\n requestShowFilter,\r\n showAddDocument,\r\n}: {\r\n layout?: DocListLayout,\r\n requestShowFilter?: Function,\r\n showAddDocument?: boolean,\r\n}) => {\r\n const itemUri = docsItemUri();\r\n const hasActiveFilter =\r\n layout != null &&\r\n layout.filters &&\r\n requestShowFilter != null &&\r\n IsFiltered(layout.filters);\r\n return (\r\n \r\n {(hasActiveFilter || itemUri) && (\r\n \r\n {hasActiveFilter && (\r\n \r\n )}\r\n {showAddDocument &&\r\n !hasActiveFilter &&\r\n itemUri &&\r\n docsFlagsIsDocAssignmentAllowed() && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\nNoDocs.displayName = \"NoDocs\";\r\nNoDocs.defaultProps = {\r\n showAddDocument: true,\r\n};\r\nexport default NoDocs;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport ToggleButtonGroup from \"react-bootstrap/lib/ToggleButtonGroup\";\r\nimport ToggleButton from \"react-bootstrap/lib/ToggleButton\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport SettingValue, { type SettingValueProps } from \"containers/SettingValue\";\r\nimport bowser from \"data/bowser\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** persisted search radius */\r\n showSearchOperators: SettingValueProps,\r\n};\r\n\r\nexport const ToggleMode = ({ showSearchOperators }: Props) => (\r\n \r\n showSearchOperators.setValue(!showSearchOperators.value)\r\n }\r\n >\r\n \r\n {bowser.is(\"mobile\") ? (\r\n \r\n ) : (\r\n loc.t(\"search:form.toggleOperators\")\r\n )}\r\n \r\n \r\n);\r\nToggleMode.displayName = \"ToggleMode\";\r\nexport default compose(\r\n connect(),\r\n SettingValue({\r\n name: \"showSearchOperators\",\r\n namespace: \"showSearchOperators\",\r\n defaultValue: false,\r\n })\r\n)(ToggleMode);\r\n","// @flow\r\nimport React from \"react\";\r\nimport { type SearchFormResultDTO } from \"data/types\";\r\nimport Header from \"components/Header\";\r\nimport ToggleMode from \"./ToggleMode\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./SearchFormHeader.module.css\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\n\r\ntype Props = {\r\n /** current SearchForm */\r\n searchForm: ?SearchFormResultDTO,\r\n /** callback when user clicks Cancel */\r\n onCancel: () => void,\r\n /** callback when user clicks Clear */\r\n onClear: () => void,\r\n /** used for evaluating if the clear button should be visible */\r\n clearEnabled: () => boolean,\r\n};\r\n\r\n/**\r\n * renders the SearchForm's panel header\r\n *\r\n * @param {Props} { searchForm, onCancel, onClear }\r\n */\r\nconst SearchFormHeader = ({ searchForm, onCancel, onClear, clearEnabled }: Props) => (\r\n 0 && \r\n }\r\n rightComponent={\r\n clearEnabled &&\r\n typeof clearEnabled === \"function\" &&\r\n clearEnabled() &&\r\n \r\n {loc.t(\"search:form.clear\")}\r\n }\r\n />\r\n);\r\n\r\nSearchFormHeader.displayName = \"SearchFormHeader\";\r\nexport default SearchFormHeader;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"Status_wrapper__1xrEx\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"btnToast\":\"toast_btnToast__1G1AD\",\"toast\":\"toast_toast__WLizo\",\"detail\":\"toast_detail__2jbz7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"Modal_modal__1cXJL\",\"fs\":\"Modal_fs__1ig4z\",\"docked\":\"Modal_docked__yb-5V\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"button\":\"ItemAction_button__3fwaS\",\"icon\":\"ItemAction_icon__1ZbDt\",\"desc\":\"ItemAction_desc__3Ql9P\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"top\":\"itemView_docList_top___U4a4\",\"wrapper\":\"itemView_docList_wrapper__2nlL6\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"button\":\"StickyToggle_button__29V1n\",\"wrapper\":\"StickyToggle_wrapper__2zrSm\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"noteContainer\":\"NoteInput_noteContainer__35zt_\",\"noteWrapper\":\"NoteInput_noteWrapper__op-sG\",\"noteInput\":\"NoteInput_noteInput__1CY0F\",\"highlight\":\"NoteInput_highlight__3iRLs\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"Activities_wrapper__13MQj\",\"info\":\"Activities_info__1k3pe\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"title\":\"ItemActionPanel_title__3xKil\",\"wrapper\":\"ItemActionPanel_wrapper__1Wsxv\",\"bc\":\"ItemActionPanel_bc__3rbA-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"PlaceInput_container__Yz99t\",\"inputGroup\":\"PlaceInput_inputGroup__3vN1D\",\"iconWrapper\":\"PlaceInput_iconWrapper__3GUOj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dropdownButton\":\"GeoRadiusInput_dropdownButton__3jxaT\",\"radius\":\"GeoRadiusInput_radius__3O3pp\",\"unit\":\"GeoRadiusInput_unit__2eoLl\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"formmodal\":\"FormModal_formmodal__nKPGO\",\"notAuthorizedWrapper\":\"FormModal_notAuthorizedWrapper__22m8U\",\"notAuthorizedIcon\":\"FormModal_notAuthorizedIcon__2Lb9B\"};","import React from \"react\";\r\nimport LocalContactInfo from \"components/LocalContactInfo\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport styles from \"./PageStatus.module.css\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** current status */\r\n status: ConstantsEnum,\r\n /** optional message to display\r\n * NOTE: only visible when status = ERROR or LOADING\r\n */\r\n message?: string,\r\n /** optional React element to show below message\r\n * NOTE: only visible when status = ERROR or LOADING\r\n */\r\n children?: React.ElementType,\r\n};\r\n\r\nconst PageStatus = ({ status, message, children }: Props) => (\r\n
\r\n \"inPoint\r\n {[Constants.ERROR, Constants.LOADING].includes(status) && (\r\n
\r\n {message}\r\n {children}\r\n {status === Constants.ERROR && }\r\n
\r\n )}\r\n
\r\n);\r\nPageStatus.displayName = \"PageStatus\";\r\nPageStatus.defaultProps = {\r\n status: Constants.NONE,\r\n};\r\nexport default PageStatus;\r\n","import { compose, createStore, applyMiddleware } from \"redux\";\r\nimport appReducers from \"data/reducers\";\r\n// redux-persist\r\nimport { persistStore, persistReducer } from \"redux-persist\";\r\nimport {\r\n // transformCorrelationId,\r\n transformInitialState,\r\n} from \"data/persistTransforms\";\r\nimport { LocalNodeDevelopment } from \"./config\";\r\n// responsive\r\nimport { responsiveStoreEnhancer } from \"redux-responsive\";\r\n// sagas\r\nimport createSagaMiddleware from \"redux-saga\";\r\n//import { version } from \"../../package.json\";\r\nimport { persistStorage } from \"data/storage\";\r\nimport { initialState as loginInitialState } from \"data/reducers/loginReducer\";\r\n// import { initialState as userInitialState } from \"data/reducers/userReducer\";\r\nimport { setupLogging } from \"data/logging\";\r\n\r\n/* istanbul ignore next */\r\nif (process.env.NODE_ENV !== \"production\") {\r\n // Log the initial state\r\n //console.log(store.getState())\r\n // Every time the state changes, log it\r\n // Note that subscribe() returns a function for unregistering the listener//let unsubscribe =\r\n /* store.subscribe(() => {\r\n console.log(\"%c store\", \"color: orange\", store.getState());\r\n }); */\r\n // this sets window.CONFIG either locally (node.js server) or when hosted, from MVC\r\n\r\n /* istanbul ignore next */\r\n if (typeof window.CONFIG === \"string\") {\r\n window.CONFIG = LocalNodeDevelopment;\r\n\r\n //const url = `${window.CONFIG.host.basename}config`;\r\n //fetch(url)\r\n // .then((result) => result.json())\r\n // .then((config) => {\r\n // window.CONFIG.general = config.general;\r\n // });\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\nif (process.env.JEST_WORKER_ID === undefined) {\r\n setupLogging();\r\n}\r\n\r\n// create the saga middleware\r\nexport const sagaMiddleware = createSagaMiddleware();\r\n\r\n// redux-persist\r\nconst transforms = [\r\n /*transformCorrelationId()*/\r\n];\r\n/* istanbul ignore next */\r\nif (window.CONFIG.auth.forceLogin === true || window.CONFIG.token != null) {\r\n transforms.push(transformInitialState(\"login\", loginInitialState));\r\n // transforms.push(transformInitialState(\"user\", userInitialState));\r\n}\r\n\r\nconst persistConfig = {\r\n key: \"root\",\r\n version: 3,\r\n whitelist: [\r\n \"settings\",\r\n /*\"user\",*/ \"login\",\r\n \"cards\",\r\n \"offline\",\r\n \"notification\",\r\n ],\r\n storage: persistStorage, //localForage,\r\n debug: process.env.NODE_ENV !== \"production\",\r\n autoRehydrate: true,\r\n transforms,\r\n};\r\nconst reducer = persistReducer(persistConfig, appReducers);\r\n\r\n// simple Redux console logger\r\n// https://twitter.com/dan_abramov/status/629347448247468032?lang=en\r\n/* function logger({ getState }) {\r\n return next => action => {\r\n //console.time();\r\n console.groupCollapsed(action.type);\r\n console.info(\"dispatching:\", action);\r\n const result = next(action);\r\n console.log(\"next state:\", getState());\r\n console.groupEnd();\r\n //console.timeEnd();\r\n return result;\r\n };\r\n} */\r\n\r\n// http://redux.js.org/\r\nconst middlewares = [sagaMiddleware];\r\n/* if (process.env.NODE_ENV !== \"production\") {\r\n middlewares.push(logger);\r\n} */\r\n\r\nconst composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\r\nconst store = createStore(\r\n reducer,\r\n composeEnhancers(responsiveStoreEnhancer, applyMiddleware(...middlewares))\r\n);\r\n\r\nexport const persistor = persistStore(store);\r\n\r\nexport default store;\r\n","import { createTransform } from \"redux-persist\";\r\n// https://github.com/rt2zz/redux-persist\r\n\r\n// // do not store/reload the correlationId (used for server-side logging)\r\n// export const transformCorrelationId = /* istanbul ignore next */ () =>\r\n// createTransform(\r\n// // transform state on its way to being serialized and persisted.\r\n// (inboundState, key) => {\r\n// return { ...inboundState, correlationId: undefined };\r\n// },\r\n// // transform state being rehydrated\r\n// (outboundState, key) => {\r\n// return { ...outboundState, correlationId: undefined };\r\n// },\r\n// // define which reducers this transform gets called for.\r\n// { whitelist: [\"user\"] }\r\n// );\r\n\r\nexport const transformInitialState = /* istanbul ignore next */ (\r\n reducerName,\r\n initialState\r\n) =>\r\n createTransform(\r\n // transform state on its way to being serialized and persisted.\r\n (inboundState, key) => {\r\n return {\r\n ...inboundState,\r\n ...initialState,\r\n };\r\n },\r\n // transform state being rehydrated\r\n (outboundState, key) => {\r\n return {\r\n ...outboundState,\r\n ...initialState,\r\n };\r\n },\r\n // define which reducers this transform gets called for.\r\n { whitelist: [reducerName] }\r\n );\r\n\r\n// // optionally skip storing/loading the login reducer (forcing user to re-login every time)\r\n// export const transformLoginToken = createTransform(\r\n// // transform state on its way to being serialized and persisted.\r\n// (inboundState, key) => {\r\n// return {\r\n// ...inboundState,\r\n// ...loginInitialState\r\n// };\r\n// },\r\n// // transform state being rehydrated\r\n// (outboundState, key) => {\r\n// return {\r\n// ...outboundState,\r\n// ...loginInitialState\r\n// };\r\n// },\r\n// // define which reducers this transform gets called for.\r\n// { whitelist: [\"login\"] }\r\n// );\r\n\r\n// // optionally skip storing/loading the login reducer (forcing user to re-login every time)\r\n// export const transformUserToken = createTransform(\r\n// // transform state on its way to being serialized and persisted.\r\n// (inboundState, key) => {\r\n// return {\r\n// ...inboundState,\r\n// ...userInitialState\r\n// };\r\n// },\r\n// // transform state being rehydrated\r\n// (outboundState, key) => {\r\n// return {\r\n// ...outboundState,\r\n// ...userInitialState\r\n// };\r\n// },\r\n// // define which reducers this transform gets called for.\r\n// { whitelist: [\"user\"] }\r\n// );\r\n","export const ArrowNavigationAction = {\r\n Ready: \"mini.doc.ready\",\r\n Load: \"mini.doc.load\",\r\n Reload: \"mini.doc.reload\",\r\n Paginate: \"mini.doc.paginate\",\r\n SetIndex: \"mini.doc.setIndex\",\r\n};\r\n","export const PdfHighlightAction = {\r\n Load: \"pdf.highlight.load\",\r\n Upsert: \"pdf.highlight.upsert\",\r\n Highlight: \"pdf.highlight.highlight\",\r\n Delete: \"pdf.highlight.delete\",\r\n Select: \"pdf.highlight.select\",\r\n};\r\n","export const PdfSignatureAction = \"pdf.signature\";\r\n","export const PdfPrintAction = \"pdf.print\";\r\n","export const ModalAction = {\r\n Close: \"modal.close\",\r\n CloseLegacy: \"close-modal\", //Legacy notation, keep for\r\n};\r\n","export const NotificationAction = {\r\n Show: \"notification.center.show\",\r\n Hide: \"notification.center.hide\",\r\n Clear: \"notification.clear\",\r\n Status: \"notification.status\",\r\n Upsert: \"notification.upsert\",\r\n Delete: \"notification.delete\",\r\n Toast: \"notification.toast\",\r\n};\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"toast\":\"NetworkStatus_toast__22kCS\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"row\":\"ItemActions_row__3Mfen\",\"itemView\":\"ItemActions_itemView__2KTgu\"};","// @flow\r\nimport React, { type Node } from \"react\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./NoData.module.css\";\r\n\r\nconst NoData = ({\r\n locContext,\r\n children,\r\n}: {\r\n locContext?: string,\r\n children?: Node,\r\n}) => (\r\n
\r\n {loc.t(\"nodata\", { context: locContext })}\r\n {children}\r\n
\r\n);\r\nNoData.displayName = \"NoData\";\r\nexport default NoData;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"right\":\"ViewModes_right__tbtY3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"group\":\"UserGroup_group__qwvmB\",\"icon\":\"UserGroup_icon__25Yuf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"ActionCategory_header__2Hh_h\",\"icon\":\"ActionCategory_icon__WCKKA\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"overlay\":\"Error_overlay__1UguQ\",\"message\":\"Error_message__fDSMI\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"avatar\":\"PrincipalEditorControl_avatar__1sUXW\",\"name\":\"PrincipalEditorControl_name__1iaFI\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"Attachments_wrapper__1Qz6t\",\"group\":\"Attachments_group__1jb8T\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"ShareModal_modal__OeMRv\",\"button\":\"ShareModal_button__2zvF6\",\"delete\":\"ShareModal_delete__2g9CF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"footer\":\"MapModal_footer__EXrf1\",\"btnSet\":\"MapModal_btnSet__oNMCf\"};","import { type Location, type RasterLocation } from \"data/types\";\r\n\r\nexport const TrimLocation = (location: Array): Array =>\r\n location\r\n .map((point) => point.replace(/\\s+/g, \"\"))\r\n .filter((point) => !!point);\r\n\r\nexport /**\r\n * will parse a string like \"63.4234,-18.1232\" into a Location object\r\n *\r\n * @param {string} location in string i.e. \"lat,lang\"\r\n * @returns {Location} in object format i.e. { latitude: number, longitude: number } or null if could not parse\r\n */\r\nconst ParseLocation = (location: string): Location => {\r\n if (\r\n location == null ||\r\n String(location).trim().length === 0 ||\r\n location.indexOf(\",\") === -1\r\n )\r\n return null;\r\n const pos = TrimLocation(location.split(\",\"));\r\n // only Number() will correctly return NaN if any letters are in there\r\n if (isNaN(Number(pos[0])) || isNaN(Number(pos[1]))) return null;\r\n // but only parseFloat() will correctly return the full number (not rounded)\r\n const latitude = parseFloat(pos[0]);\r\n const longitude = parseFloat(pos[1]);\r\n return { latitude, longitude };\r\n};\r\n\r\nexport const ParseRaster = (location: string): RasterLocation => {\r\n if (\r\n location == null ||\r\n String(location).trim().length === 0 ||\r\n location.indexOf(\",\") === -1 ||\r\n location.indexOf(\":\") === -1\r\n )\r\n return null;\r\n const pos = TrimLocation(location.split(\":\"));\r\n const loc = ParseLocation(pos[1]);\r\n if (loc == null) return null;\r\n return {\r\n x: loc.latitude,\r\n y: loc.longitude,\r\n rasterId: pos[0],\r\n };\r\n};\r\n\r\nexport /**\r\n * will parse a string like \"63.4234,-18.1232;63.4234,-18.1232;63.4234,-18.1232\" into a list of Location objects\r\n *\r\n * @param {string} area in string i.e. \"lat,lang;lat,lang;...\"\r\n * @returns {Array} in object format i.e. [{latitude:number, longitude: number}, ...] or null if could not parse\r\n */\r\nconst ParseArea = (area: string): Array => {\r\n if (\r\n area == null ||\r\n String(area).trim().length === 0 ||\r\n area.indexOf(\",\") === -1\r\n )\r\n return null;\r\n return TrimLocation(area.split(\";\")).map((point) => ParseLocation(point));\r\n};\r\n\r\nexport /**\r\n * will parse a string like \"13.45,22.32,5000\" into a Location and Radius\r\n */\r\nconst ParseRadius = (\r\n value: string\r\n): { location: Location, radius: ?number } => {\r\n let location = null,\r\n radius = null;\r\n if (value && String(value).length > 0 && value.indexOf(\",\") > 0) {\r\n const parts = TrimLocation(value.split(\",\"));\r\n /* istanbul ignore else */\r\n if (parts.length >= 2) {\r\n location = ParseLocation(`${parts[0]},${parts[1]}`);\r\n if (parts.length === 3 && !isNaN(Number(parts[2]))) {\r\n radius = parseFloat(parts[2]);\r\n }\r\n }\r\n }\r\n return {\r\n location,\r\n radius,\r\n };\r\n};\r\n\r\nexport /**\r\n * will convert a location with radius into a string\r\n *\r\n * @param {Location} location input location object\r\n * @param {number} radius radius in meters\r\n * @returns {string} string result i.e. \"latitude,longitude,radius\"\r\n */\r\nconst RadiusToString = (location: Location, radius: number) =>\r\n location == null || radius == null\r\n ? \"\"\r\n : LocationToString(location) + \",\" + radius.toFixed(0);\r\n\r\nexport /**\r\n * will convert a Location object into a string\r\n *\r\n * @param {Location} location input location object\r\n * @returns {string} string result comma-separated i.e. \"lat,longitude\"\r\n */\r\nconst LocationToString = (location: Location): string =>\r\n location == null ? \"\" : location.latitude + \",\" + location.longitude;\r\n\r\nexport /**\r\n * will convert an area path into a string\r\n *\r\n * @param {Array} area input area coordinates\r\n * @returns {string} string result comma-separated and semi-colon separated i.e. \"lat,longitude;lat,longitude;...\"\r\n */\r\nconst AreaToString = (area: Array): string =>\r\n area == null\r\n ? \"\"\r\n : area.reduce(\r\n (result, location, index) =>\r\n (result +=\r\n (index > 0 ? \";\" : \"\") + LocationToString(location)),\r\n \"\"\r\n );\r\n\r\nexport /**\r\n * will convert a raster coordinate into a string\r\n *\r\n * @param {RasterLocation} raster input raster coordinates\r\n * @returns {string} string result of raster location, i.e. \"rasterId:x,y\"\r\n */\r\nconst RasterToString = (raster: RasterLocation) =>\r\n raster == null || raster.rasterId == null\r\n ? \"\"\r\n : `${raster.rasterId}:${raster.x},${raster.y}`;\r\n\r\nexport const GeoPointValidationRegex = /^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?),\\s*[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$/;\r\nexport const GeoAreaValidationRegex = /^([-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?),\\s*[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)(;)*)*$/;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"outer\":\"PageStatus_outer__TYodB\",\"animatedBackground\":\"PageStatus_animatedBackground__2q7v0\",\"inner\":\"PageStatus_inner__2xhw7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"empty\":\"SearchOperators_empty__188C7\",\"select\":\"SearchOperators_select__3RnHA\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"placeholder\":\"SearchResult_placeholder__1a31x\",\"list\":\"SearchResult_list__2JtCF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"searchResult\":\"ArchiveTargetSearchItem_searchResult__2NwBP\",\"wrapper\":\"ArchiveTargetSearchItem_wrapper__26ZKc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"divider\":\"itemFlow_document_divider__Ubyke\",\"wrapper\":\"itemFlow_document_wrapper__3fjsn\"};","import localForage from \"localforage\";\r\nimport { extendPrototype } from \"localforage-startswith\";\r\n\r\nextendPrototype(localForage);\r\n\r\n// Add n/a fallback StorageDriver #53854\r\nexport function NotAvailable(...args) {\r\n return new Promise((resolve, reject) => {\r\n console.error(\"No StorageDriver is available\", args);\r\n resolve(null);\r\n });\r\n}\r\n\r\nconst NoStorageDriver = {\r\n _driver: \"NOSTORAGE\",\r\n _initStorage: /* istanbul ignore next */ () => {},\r\n setItem: NotAvailable,\r\n getItem: NotAvailable,\r\n removeItem: NotAvailable,\r\n clear: NotAvailable,\r\n length: NotAvailable,\r\n key: NotAvailable,\r\n keys: NotAvailable,\r\n iterate: NotAvailable,\r\n};\r\nlocalForage.defineDriver(NoStorageDriver);\r\n\r\n// configure our local storage for Views (currentItem_*)\r\n// https://github.com/localForage/localForage/issues/191#issuecomment-342793463\r\n/* istanbul ignore next */\r\nexport const viewStorage = localForage.createInstance({\r\n name: \"inPoint.Web\",\r\n driver: [localForage.INDEXEDDB, localForage.LOCALSTORAGE, \"NOSTORAGE\"],\r\n version: 4,\r\n size: 4980736,\r\n storeName: \"views\",\r\n});\r\nviewStorage\r\n .ready()\r\n .catch(\r\n /* istanbul ignore next */ () =>\r\n console.error(\"Cannot load viewStorage\")\r\n );\r\n\r\n// configure our local storage for persist (redux-persist)\r\n/* istanbul ignore next */\r\nexport const persistStorage = localForage.createInstance({\r\n name: \"inPoint.Web\",\r\n driver: [localForage.LOCALSTORAGE, \"NOSTORAGE\"],\r\n version: 4,\r\n size: 4980736,\r\n storeName: \"persist\",\r\n});\r\npersistStorage\r\n .ready()\r\n .catch(\r\n /* istanbul ignore next */ () =>\r\n console.error(\"Cannot load persistStorage\")\r\n );\r\n\r\n/* istanbul ignore next */\r\nexport const cacheStorage = localForage.createInstance({\r\n name: \"inPoint.Web\",\r\n driver: [localForage.LOCALSTORAGE, \"NOSTORAGE\"],\r\n version: 4,\r\n size: 4980736,\r\n storeName: \"cache\",\r\n});\r\n// clear on F5 or Browser Refresh\r\ncacheStorage\r\n .ready()\r\n .then(() => cacheStorage.clear())\r\n .catch(\r\n /* istanbul ignore next */ () =>\r\n console.error(\"Cannot load cacheStorage\")\r\n );\r\n\r\nexport const offlineQueueStorage = localForage.createInstance({\r\n name: \"inPoint.Web\",\r\n driver: [localForage.INDEXEDDB],\r\n version: 4,\r\n size: 4980736,\r\n storeName: \"offline\",\r\n});\r\n\r\nexport async function getStorageEstimate() {\r\n if (\"storage\" in navigator && \"estimate\" in navigator.storage) {\r\n const { usage, quota } = await navigator.storage.estimate();\r\n const percentUsed = Math.round((usage / quota) * 100);\r\n const usageInGb = Math.round(usage / (1024 * 1024) / 954);\r\n const quotaInGb = Math.round(quota / (1024 * 1024) / 954);\r\n\r\n // const usageInMib = Math.round(usage / (1024 * 1024) / 954);\r\n // const quotaInMib = Math.round(quota / (1024 * 1024) / 954);\r\n // const details = `${usageInMib} out of ${quotaInMib} MiB used (${percentUsed}%)`;\r\n\r\n return { usageInGb, quotaInGb, percentUsed };\r\n }\r\n return null;\r\n}\r\n\r\nexport /* istanbul ignore next*/ function getAllItems(db): Promise> {\r\n var accumulator = [];\r\n return db\r\n .iterate(function (value, key /*, iterationNumber*/) {\r\n accumulator.push({ key, value });\r\n })\r\n .then(function () {\r\n return accumulator;\r\n });\r\n}\r\n","// @flow\r\nimport { openItemActionPanel } from \"components/ItemActionPanel\";\r\nimport { getLocalizedText } from \"data/utils\";\r\n\r\nexport const openMultiSelectionActionPanel = ({\r\n targetView,\r\n activeRows,\r\n mapper,\r\n folderItemUri,\r\n ...contextProps\r\n}: {\r\n targetView: string,\r\n activeRows: any,\r\n mapper: (row: any) => any,\r\n}) => {\r\n let docCount = 0;\r\n let folderCount = 0;\r\n const items = Object.values(activeRows).map(mapper);\r\n items.forEach((row) => {\r\n row.isDoc ? docCount++ : folderCount++;\r\n });\r\n const itemKey =\r\n docCount && folderCount ? \"mixed\" : docCount ? \"document\" : \"folder\";\r\n return openItemActionPanel({\r\n title: getLocalizedText(`$multiselection:actionpanel.${itemKey}`, {\r\n document: getLocalizedText(`$multiselection:actionpanel.document`, {\r\n count: docCount,\r\n }),\r\n folder: getLocalizedText(`$multiselection:actionpanel.folder`, {\r\n count: folderCount,\r\n }),\r\n count: docCount + folderCount,\r\n }),\r\n contextProps: {\r\n ...contextProps,\r\n items,\r\n multiple: true,\r\n folderItemUri,\r\n },\r\n targetView,\r\n });\r\n};\r\n","// @flow\r\nimport React, { PureComponent, type ComponentType } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport Constants, { getDisplayName } from \"data/constants\";\r\nimport { type docsLayoutState } from \"data/reducers/types\";\r\nimport { requestDocsLayoutAction } from \"data/actions\";\r\nimport Status from \"components/Status\";\r\n\r\ntype Props = {\r\n dispatch: Dispatch,\r\n itemUri: string,\r\n layout: docsLayoutState,\r\n showDocs?: boolean,\r\n};\r\n\r\n// will block until docsLayout is OK and pass it on as a layout prop\r\nconst LayoutLoader = (WrappedComponent: ComponentType) => {\r\n class PP extends PureComponent {\r\n static displayName = `LayoutLoader(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n\r\n componentDidMount() {\r\n const { dispatch, itemUri, showDocs } = this.props;\r\n dispatch(requestDocsLayoutAction(itemUri, showDocs === false));\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n const { dispatch, itemUri, showDocs } = this.props;\r\n if (itemUri !== prevProps.itemUri) {\r\n dispatch(requestDocsLayoutAction(itemUri, showDocs === false));\r\n }\r\n }\r\n\r\n render() {\r\n const { layout, ...rest } = this.props;\r\n if (layout.status === Constants.OK)\r\n return ;\r\n if (layout.status === Constants.ERROR)\r\n return ;\r\n return ;\r\n }\r\n }\r\n\r\n const mapStateToProps = (state, ownProps) => ({\r\n layout: state.docsLayout,\r\n ...ownProps,\r\n });\r\n\r\n return connect(mapStateToProps)(PP);\r\n};\r\n\r\nexport default LayoutLoader;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\n// import LayoutLoader from \"containers/LayoutLoader\";\r\nimport FilterBarContainer from \"containers/FilterBar\";\r\nimport {\r\n DocListFilterOperators,\r\n type DocListLayout,\r\n type SearchBucketDTO,\r\n type SearchFilterDTO,\r\n type SearchValueTypeEnum,\r\n type DocColumnResultDTO,\r\n DocListColumnType,\r\n LocalDateStringOption,\r\n ListViewMode,\r\n type ListViewModeEnum,\r\n SearchValueType,\r\n type DocListFilterRequestDTO,\r\n SORT_BUCKET_NAME,\r\n} from \"data/types\";\r\nimport { type docsResultState } from \"data/reducers/types\";\r\nimport {\r\n resetDocFilters,\r\n setDocListViewModeAction,\r\n setDocFilterByName,\r\n setDocFilterTextAction,\r\n} from \"data/actions\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { GetDefaults } from \"components/DocListFilterModal/Utils\";\r\nimport { getDefaultsConfig, get } from \"data/constants\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** doclist fetch status */\r\n status: ConstantsEnum,\r\n /** doclist fetch result */\r\n result: docsResultState,\r\n /** current docListViewMode */\r\n docListViewMode: ListViewModeEnum,\r\n /** docList layout settings */\r\n layout: DocListLayout,\r\n /** callback to set filtering on a specific column\r\n * @param {string} colName name of column to filter\r\n */\r\n requestShowFilter: (colName: string) => void,\r\n /** callback to set sorting on a specific column\r\n * @param {string} colName name of column to sort\r\n */\r\n setSorting: (colName: string) => void,\r\n /** redux: current itemUri */\r\n itemUri: string,\r\n /** redux: current formatId */\r\n formatId: number,\r\n /** whether doclist filter should be rendered */\r\n renderFilter: ?boolean,\r\n /** whether doclist filter should be disabled */\r\n disableFilter: ?boolen,\r\n};\r\n\r\ntype QuickFilterConfig = {\r\n name: string,\r\n caption?: string,\r\n visible: boolean,\r\n operator: DocListFilterOperatorsEnum,\r\n valueType: SearchValueTypeEnum,\r\n};\r\n\r\ntype State = {\r\n aggregations: Array,\r\n selected: Array,\r\n quickFilter: ?QuickFilterConfig,\r\n};\r\n\r\nexport class DocListFilterBar extends React.PureComponent {\r\n state = {\r\n aggregations: [],\r\n selected: [],\r\n quickFilter: null,\r\n };\r\n\r\n componentDidMount() {\r\n this.setState({\r\n ...this.prepFilters(),\r\n });\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n if (\r\n this.props.status !== prevProps.status &&\r\n this.props.result != null\r\n ) {\r\n this.setState({\r\n ...this.prepFilters(),\r\n });\r\n }\r\n }\r\n\r\n prepFilters = () => {\r\n // prep available sorting/filters\r\n const { status, layout, result, formatId } = this.props;\r\n if (status !== Constants.OK || result == null || result.cols == null)\r\n return null;\r\n\r\n // filterBar buckets\r\n let selected = [];\r\n let filterBuckets: Array = [];\r\n const sortBucket = {\r\n visible: true,\r\n icon: \"sort\",\r\n name: SORT_BUCKET_NAME,\r\n caption: loc.t(\"common:filter.SortCaption\"),\r\n valueType: SearchValueType.NotSet,\r\n selected: [\"\"],\r\n buckets: [],\r\n };\r\n\r\n // add sorting\r\n result.cols.forEach((col) => {\r\n if (col.canSort) {\r\n // add sorting\r\n sortBucket.buckets.push({\r\n value: col.name,\r\n caption: col.caption,\r\n });\r\n }\r\n });\r\n // custom sorting set?\r\n sortBucket.selected =\r\n layout && layout.sorts && layout.sorts.length > 0\r\n ? [layout.sorts[0].name]\r\n : [\"\"];\r\n selected.push({\r\n name: SORT_BUCKET_NAME,\r\n value: sortBucket.selected[0],\r\n valueType: SearchValueType.NotSet,\r\n });\r\n\r\n // find current quickFilter defaults settings\r\n const quickFilter = this._getQuickFilterConfig();\r\n const quickFilterCol = this._findCol(quickFilter.name);\r\n if (quickFilterCol) quickFilter.caption = quickFilterCol.caption;\r\n else quickFilter.visible = false;\r\n\r\n // add filters\r\n const defaultFilters = GetDefaults(\r\n result.itemUri,\r\n formatId,\r\n result.cols\r\n ).filters;\r\n const filters =\r\n layout.filters != null && layout.filters.length > 0\r\n ? layout.filters\r\n : defaultFilters;\r\n\r\n filters.forEach((filter) => {\r\n const col = this._findCol(filter.name);\r\n if (col == null || col.canSort === false) return;\r\n // add filter\r\n const dupIdx = filterBuckets.findIndex((b) => b.name === col.name);\r\n // avoid duplicates\r\n /* istanbul ignore else */\r\n if (dupIdx === -1) {\r\n const hasFilter =\r\n filter != null &&\r\n filter.values.filter((f) => f != null && String(f).length)\r\n .length > 0;\r\n const filterCaption = hasFilter\r\n ? this._getFilterDisplay(filter, col)\r\n : null;\r\n if (hasFilter) {\r\n selected.push({\r\n name: col.name,\r\n value: this._getValueOrValues(filter.values),\r\n valueType: SearchValueType.NotSet,\r\n });\r\n }\r\n // add to filterBar\r\n filterBuckets.push({\r\n name: col.name,\r\n caption: col.caption,\r\n valueType: SearchValueType.NotSet,\r\n selected: hasFilter ? filter.values : [],\r\n buckets: hasFilter\r\n ? [\r\n {\r\n value: this._getValueOrValues(filter.values),\r\n caption: filterCaption,\r\n },\r\n ]\r\n : [],\r\n hideMenu: true,\r\n hideName: false,\r\n visible: true,\r\n });\r\n // is it also our quickFilter?\r\n if (\r\n quickFilter &&\r\n quickFilter.visible &&\r\n // this.props.result.filterText == null &&\r\n quickFilter.name.toUpperCase() === col.name.toUpperCase() &&\r\n quickFilter.operator === filter.operator\r\n ) {\r\n this._onFilterTextChange(filter.values, quickFilter);\r\n }\r\n }\r\n });\r\n\r\n // sort always at the end\r\n filterBuckets.push(sortBucket);\r\n\r\n return { aggregations: filterBuckets, selected, quickFilter };\r\n };\r\n\r\n _getValueOrValues = (values: Array): Array | any =>\r\n values.length > 1 ? values : values[0];\r\n\r\n _getFilterDisplay = (\r\n filter: DocListFilterRequestDTO,\r\n col?: DocColumnResultDTO\r\n ): string => {\r\n let values = [...filter.values];\r\n // Convert JSON UTC Date value to localized Date\r\n /* istanbul ignore else */\r\n if (\r\n col &&\r\n col.type === DocListColumnType.DateTimeValue &&\r\n filter.operator !== DocListFilterOperators.DateRelative\r\n ) {\r\n values = values.map((value) =>\r\n value == null\r\n ? \"\"\r\n : new Date(\r\n String(value).replace(\"Z\", \"\")\r\n ).toLocaleDateString(\r\n userLanguage(),\r\n LocalDateStringOption.Date\r\n )\r\n );\r\n }\r\n switch (filter.operator) {\r\n case DocListFilterOperators.DateRelative:\r\n return loc.t(\"common:filter.RelativeDate.\" + values[0]);\r\n case DocListFilterOperators.Equals:\r\n return `${values[0]}`;\r\n case DocListFilterOperators.Between:\r\n return `${loc.t(\r\n \"folder:action_filter.operators.\" + filter.operator\r\n )} ${values[0]}-${values[1]}`;\r\n default:\r\n return `${loc.t(\r\n \"folder:action_filter.operators.\" + filter.operator\r\n )} ${values[0]}`;\r\n }\r\n };\r\n\r\n _findCol = (\r\n name: string,\r\n identifier: string = \"name\"\r\n ): DocColumnResultDTO | null =>\r\n this.props.result &&\r\n this.props.result.cols &&\r\n this.props.result.cols.find(\r\n (c) => c[identifier].toUpperCase() === name.toUpperCase()\r\n );\r\n\r\n _onFilterBarSelect = (\r\n name: string,\r\n valueType: SearchValueTypeEnum,\r\n value: any\r\n ) => {\r\n if (value === null) {\r\n // button item\r\n this.props.requestShowFilter(name);\r\n } else if (name === SORT_BUCKET_NAME) {\r\n // sort\r\n this.props.setSorting(value);\r\n } else {\r\n this.props.dispatch(setDocFilterByName({ name, valueType, value }));\r\n }\r\n };\r\n\r\n _onFilterBarClear = () => this.props.dispatch(resetDocFilters());\r\n\r\n _onViewModeChange = (viewMode: ListViewModeEnum) =>\r\n this.props.dispatch(setDocListViewModeAction(viewMode));\r\n\r\n _getQuickFilterConfig = () => {\r\n // merge default with appsettings defaults\r\n const quickFilter = Object.assign(\r\n {},\r\n {\r\n visible: true,\r\n name: null, //will then search for Name or Dateiname\r\n operator: DocListFilterOperators.Contains,\r\n valueType: SearchValueType.String, // we only really support strings anyways\r\n },\r\n get(\r\n getDefaultsConfig(this.props.itemUri, this.props.formatId),\r\n [\"docList\", \"quickFilter\"],\r\n {}\r\n )\r\n );\r\n // find real name column (unless provided)\r\n const nameCol = quickFilter.name\r\n ? this._findCol(quickFilter.name)\r\n : this._findCol(DocListColumnType.WebDavName, \"type\");\r\n quickFilter.name = (nameCol && nameCol.name) || \"Name\"; // nothing found, fallback to Name\r\n return quickFilter;\r\n };\r\n\r\n _onFilterTextChange = (\r\n filterText?: string,\r\n quickFilter?: QuickFilterConfig\r\n ) =>\r\n this.props.dispatch(\r\n setDocFilterTextAction({\r\n ...(quickFilter || this.state.quickFilter),\r\n value: filterText,\r\n })\r\n );\r\n\r\n render = () => (\r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n docListViewMode: s.docListViewModeSelector(state),\r\n status: s.docsStatusSelector(state),\r\n result: state.docs,\r\n itemUri: s.breadcrumbItemUriSelector(state, s.currentNameSelector(state)),\r\n formatId: s.breadcrumbFormatIdSelector(state, s.currentNameSelector(state)),\r\n ...ownProps,\r\n});\r\n\r\nexport default connect(mapStateToProps)(DocListFilterBar);\r\n","import React, { useContext, useMemo } from \"react\";\r\nimport { MultiSelectionContext } from \"data/context\";\r\nimport Mark from \"@hs/mark\";\r\nimport Icons from \"@hs/icons\";\r\nimport ItemStatusIcons from \"components/ItemStatusIcons\";\r\nimport { BrowserDragLink } from \"components/ItemUriLink\";\r\nimport ValueFactory from \"components/Attributes/SummaryAttribute/ValueFactory\";\r\nimport { DocListColumnType, GridListConstant } from \"data/types\";\r\nimport withStickyToggle from \"containers/StickyToggle\";\r\nimport StickyToggleStyle from \"containers/StickyToggle/style\";\r\nimport { isHandheld } from \"data/bowser\";\r\nimport styles from \"./CellContent.module.css\";\r\n\r\ntype Props = {\r\n index: number,\r\n col: DocColumnResultDTO,\r\n cell: any,\r\n filterText: any,\r\n onMoreClick: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n actionsDisabled: boolean,\r\n itemUri: string,\r\n};\r\n\r\nexport const CellContent = ({\r\n index,\r\n col,\r\n cell,\r\n filterText,\r\n onMoreClick,\r\n itemUri,\r\n isHovered,\r\n}: Props): any => {\r\n /* istanbul ignore next */\r\n const { multiple, renderCheckbox } = useContext(MultiSelectionContext) || {\r\n multiple: false,\r\n renderCheckbox: () => null,\r\n };\r\n // Note: Needs to be inside Component to be able to mock isHandheld for jest\r\n const style = useMemo(\r\n () => ({\r\n marginLeft: isHandheld() ? \".5em\" : undefined,\r\n verticalAlign: \"middle\",\r\n }),\r\n []\r\n );\r\n\r\n const { caption: header } = col;\r\n let content = cell;\r\n if (content == null) return null;\r\n if (header === GridListConstant.ExtensionIcon) {\r\n if (multiple && isHandheld()) {\r\n content = renderCheckbox(index, styles.checkbox);\r\n } else {\r\n content = (\r\n <>\r\n {(isHovered || multiple) &&\r\n !isHandheld() &&\r\n renderCheckbox(\r\n index,\r\n `${styles.checkbox} ${styles.desktop}`\r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n } else if (header === GridListConstant.IconItemStatus) {\r\n content = (\r\n \r\n );\r\n } else if (typeof content !== \"string\") {\r\n content = ;\r\n }\r\n\r\n if (col.type === DocListColumnType.BooleanValue) {\r\n return (\r\n \r\n );\r\n }\r\n if (header === GridListConstant.IconItemStatus) {\r\n return <>{content};\r\n }\r\n if (\r\n [\r\n DocListColumnType.IntValue,\r\n DocListColumnType.LongValue,\r\n DocListColumnType.FileSize,\r\n DocListColumnType.ShortValue,\r\n DocListColumnType.DoubleValue,\r\n DocListColumnType.DecimalValue,\r\n DocListColumnType.SingleValue,\r\n ].includes(col.type)\r\n ) {\r\n return {content};\r\n }\r\n // #51803 filterText highlighting\r\n if (\r\n filterText &&\r\n filterText.name &&\r\n filterText.name.toUpperCase() === col.name.toUpperCase() &&\r\n filterText.value\r\n ) {\r\n return {content};\r\n }\r\n return <>{content};\r\n};\r\n\r\nconst CellContentWithStickyToggle = withStickyToggle({\r\n getStyle: StickyToggleStyle.GridList,\r\n renderDiv: true,\r\n portalTargetSelector:\r\n \"#docListPanel .ReactVirtualized__Grid__innerScrollContainer\",\r\n // shouldRender: ({ col }) => {\r\n // return !isHandheld() || col.caption === GridListConstant.ExtensionIcon;\r\n // },\r\n})(CellContent);\r\n\r\nexport default CellContentWithStickyToggle;\r\n","// @flow\r\nimport React, { PureComponent, type Node } from \"react\";\r\nimport {\r\n GridListConstant,\r\n SortDirectionOptions,\r\n type DocListLayout,\r\n} from \"data/types\";\r\nimport { type docsResultState } from \"data/reducers/types\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport GridList from \"@hs/grid-list\";\r\nimport \"@hs/grid-list/build/GridList.css\";\r\nimport ContextMenuHandler from \"components/ContextMenu/Handler\";\r\nimport CellContent from \"./CellContent\";\r\nimport { isHandheld } from \"data/bowser\";\r\n\r\ntype Props = {\r\n /** doclist fetch result */\r\n result: docsResultState,\r\n /** total number of documents */\r\n totalCount: number,\r\n /** callback to request loading next page */\r\n loadMoreRows: ({ rowIndex: number }) => Promise,\r\n /** callback to set sorting on a specific column\r\n * @param {string} colName name of column to sort\r\n */\r\n setSorting: (colName: string) => void,\r\n /** docList layout settings */\r\n layout?: DocListLayout,\r\n /** callback to set filtering on a specific column\r\n * @param {string} colName name of column to filter\r\n */\r\n requestShowFilter: (colName: string) => void,\r\n /** which row index is currently selected */\r\n activeRowIndex?: ?number,\r\n /** which row index to bring into view */\r\n scrollToRow?: ?number,\r\n /** which row is the UI currently updating\r\n * @param {number} rowStartIndex row index in result.rows\r\n */\r\n rowStartIndexUpdated: (rowStartIndex: number) => void,\r\n /** callback when user clicks document icon\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n */\r\n onIconClick?: (e: SyntheticMouseEvent<*>) => void,\r\n /** callback when user single clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onSingleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** callback when user double clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onDoubleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** callback when user clicks on More... button\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onMoreClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** whether to disable the More... button */\r\n actionsDisabled?: boolean,\r\n /** callback when user right clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {number} rowIndex the row's index\r\n * @param {number} columnsIndex the column's index\r\n * @param {string} itemUri the row's itemUri\r\n */\r\n onContextClick?: (\r\n e: SyntheticMouseEvent,\r\n rowIndex: number,\r\n columnIndex: number,\r\n itemUri: string\r\n ) => void,\r\n /** React.Node children */\r\n children?: Node,\r\n};\r\n\r\ntype State = {\r\n rows: Object,\r\n pageSize: number,\r\n pagesStatus: Array,\r\n};\r\n\r\n/**\r\n * Renders the Grid documents list\r\n */\r\nexport default class DocList extends PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n //first page results loaded by DocListContainer\r\n rows: props.result.rows,\r\n pageSize: props.result.pageSize,\r\n //first page already pre-loaded otherwise we wouldn't be here\r\n pagesStatus: [Constants.OK],\r\n };\r\n }\r\n\r\n isColumnFiltered = (name: string): boolean => {\r\n const { layout } = this.props;\r\n if (layout?.filters == null) return false;\r\n const filter = layout.filters.find((f) => f.name === name);\r\n /* istanbul ignore next */\r\n if (filter == null) return false;\r\n return (\r\n filter?.values?.length > 0 && String(filter.values[0]).length > 0\r\n );\r\n };\r\n\r\n canColumnFilter = (name: string): boolean => {\r\n const { layout } = this.props;\r\n if (!layout?.filters?.length) return true;\r\n return layout.filters.findIndex((f) => f.name === name) !== -1;\r\n };\r\n\r\n isColumnSorted = (name: string): boolean => {\r\n if (this.props.layout == null) {\r\n return false;\r\n }\r\n const { sorts } = this.props.layout;\r\n return sorts?.some((s) => s.name === name);\r\n };\r\n\r\n getColumnSortDirection = (name: string): SortDirectionEnum => {\r\n if (this.props.layout == null) {\r\n return SortDirectionOptions.Ascending;\r\n }\r\n const { sorts } = this.props.layout;\r\n const sort = sorts?.find((s) => s.name === name);\r\n return sort ? sort.direction : SortDirectionOptions.Ascending;\r\n };\r\n\r\n // #36000 single-click behavior\r\n handleCellClick = (\r\n e: SyntheticMouseEvent<*>,\r\n rowIndex: number,\r\n columnIndex: number,\r\n itemUri: string\r\n ): void => {\r\n if (columnIndex === 0) {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onIconClick === \"function\")\r\n this.props.onIconClick(e, itemUri, rowIndex);\r\n } else {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onSingleClick === \"function\")\r\n this.props.onSingleClick(e, itemUri, rowIndex);\r\n }\r\n };\r\n\r\n parseCellColumnTitle = (caption: string, content: any): string => {\r\n if (caption === GridListConstant.ItemUri) {\r\n return undefined;\r\n } else if (content != null && typeof content !== \"string\") {\r\n return content.value;\r\n }\r\n return content;\r\n };\r\n\r\n handleHeaderFilterClick = (\r\n e: SyntheticMouseEvent<*>,\r\n name: string\r\n ): void => {\r\n e.stopPropagation();\r\n this.props.requestShowFilter(name);\r\n };\r\n\r\n handleHeaderClick = (columnIndex: number, header: string): void => {\r\n const col = this.props.result.cols[columnIndex];\r\n if (col.canSort) this.props.setSorting(col.name);\r\n };\r\n\r\n parseCellHeaderCaption = (rawData: string): string => {\r\n if (\r\n rawData === GridListConstant.ExtensionIcon ||\r\n rawData === GridListConstant.IconItemStatus ||\r\n rawData === GridListConstant.ItemUri\r\n ) {\r\n return \"\";\r\n }\r\n return rawData;\r\n };\r\n\r\n getColumnWidth = ({\r\n index,\r\n col,\r\n }: {\r\n index: number,\r\n col: DocColumnResultDTO,\r\n }): number => {\r\n const header = col.caption;\r\n let width = 0;\r\n if (header === GridListConstant.ExtensionIcon) {\r\n width += isHandheld() ? 35 : 42;\r\n } else if (header === GridListConstant.IconItemStatus) {\r\n /* istanbul ignore next */\r\n width += col.width > 0 ? col.width : 20;\r\n } else {\r\n width += col.width * 1.2 + 15;\r\n }\r\n if (index === this.props.result.cols.length - 1) {\r\n width += 20;\r\n }\r\n return width;\r\n };\r\n\r\n isRowLoaded = ({ rowIndex }: { rowIndex: number }): boolean =>\r\n Object.prototype.hasOwnProperty.call(this.state.rows, rowIndex);\r\n\r\n loadMoreRows = ({ rowIndex }: { rowIndex: number }) => {\r\n const { pageSize, pagesStatus } = this.state;\r\n\r\n // calc page number\r\n let pageNum = 0;\r\n /* istanbul ignore else */\r\n if (rowIndex > 0) {\r\n // specific row index requested? calc page number\r\n pageNum = Math.floor(rowIndex / pageSize);\r\n }\r\n\r\n // page already loaded/requested?\r\n /* istanbul ignore else */\r\n if (pagesStatus[pageNum] === Constants.OK) return null;\r\n\r\n // fetch\r\n pagesStatus[pageNum] = Constants.OK;\r\n this.props.loadMoreRows(pageNum);\r\n };\r\n\r\n sectionRendered = (section: { rowStartIndex: number }) =>\r\n this.props.rowStartIndexUpdated(section.rowStartIndex);\r\n\r\n render() {\r\n const count =\r\n this.props.totalCount === 0\r\n ? this.props.result.rowCount\r\n : this.props.totalCount;\r\n if (this.props.result.cols.length === 0) {\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n }\r\n}\r\n","// @flow\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport FormControl from \"react-bootstrap/lib/FormControl\";\r\nimport { DocListFilterOperators, type DocListColumnTypeEnum } from \"data/types\";\r\nimport loc from \"i18next\";\r\n\r\nconst operatorsPerType = {\r\n StringValue: [\r\n DocListFilterOperators.Equals,\r\n DocListFilterOperators.NotEquals,\r\n DocListFilterOperators.Contains,\r\n DocListFilterOperators.DoesNotContain,\r\n DocListFilterOperators.StartsWith,\r\n DocListFilterOperators.DoesNotStartWith,\r\n DocListFilterOperators.EndsWith,\r\n DocListFilterOperators.DoesNotEndWith,\r\n ],\r\n IntValue: [\r\n DocListFilterOperators.Equals,\r\n DocListFilterOperators.NotEquals,\r\n DocListFilterOperators.LessThan,\r\n DocListFilterOperators.LessThanOrEqualsTo,\r\n DocListFilterOperators.GreaterThan,\r\n DocListFilterOperators.GreaterThanOrEqualsTo,\r\n DocListFilterOperators.Between,\r\n ],\r\n BooleanValue: [DocListFilterOperators.None, DocListFilterOperators.Equals],\r\n LongValue: [\r\n DocListFilterOperators.Equals,\r\n DocListFilterOperators.NotEquals,\r\n DocListFilterOperators.LessThan,\r\n DocListFilterOperators.LessThanOrEqualsTo,\r\n DocListFilterOperators.GreaterThan,\r\n DocListFilterOperators.GreaterThanOrEqualsTo,\r\n DocListFilterOperators.Between,\r\n ],\r\n ShortValue: [\r\n DocListFilterOperators.Equals,\r\n DocListFilterOperators.NotEquals,\r\n DocListFilterOperators.LessThan,\r\n DocListFilterOperators.LessThanOrEqualsTo,\r\n DocListFilterOperators.GreaterThan,\r\n DocListFilterOperators.GreaterThanOrEqualsTo,\r\n DocListFilterOperators.Between,\r\n ],\r\n DoubleValue: [\r\n DocListFilterOperators.Equals,\r\n DocListFilterOperators.NotEquals,\r\n DocListFilterOperators.LessThan,\r\n DocListFilterOperators.LessThanOrEqualsTo,\r\n DocListFilterOperators.GreaterThan,\r\n DocListFilterOperators.GreaterThanOrEqualsTo,\r\n DocListFilterOperators.Between,\r\n ],\r\n DecimalValue: [\r\n DocListFilterOperators.Equals,\r\n DocListFilterOperators.NotEquals,\r\n DocListFilterOperators.LessThan,\r\n DocListFilterOperators.LessThanOrEqualsTo,\r\n DocListFilterOperators.GreaterThan,\r\n DocListFilterOperators.GreaterThanOrEqualsTo,\r\n DocListFilterOperators.Between,\r\n ],\r\n SingleValue: [\r\n DocListFilterOperators.Equals,\r\n DocListFilterOperators.NotEquals,\r\n DocListFilterOperators.LessThan,\r\n DocListFilterOperators.LessThanOrEqualsTo,\r\n DocListFilterOperators.GreaterThan,\r\n DocListFilterOperators.GreaterThanOrEqualsTo,\r\n ],\r\n DateTimeValue: [\r\n DocListFilterOperators.DateRelative,\r\n DocListFilterOperators.Equals,\r\n //DocListFilterOperators.NotEquals,\r\n DocListFilterOperators.LessThan,\r\n DocListFilterOperators.LessThanOrEqualsTo,\r\n DocListFilterOperators.GreaterThan,\r\n DocListFilterOperators.GreaterThanOrEqualsTo,\r\n DocListFilterOperators.Between,\r\n //DocListFilterOperators.NotBetween\r\n ],\r\n DateTimeOffsetValue: [DocListFilterOperators.None],\r\n ByteValue: [\r\n DocListFilterOperators.Equals,\r\n DocListFilterOperators.NotEquals,\r\n DocListFilterOperators.LessThan,\r\n DocListFilterOperators.LessThanOrEqualsTo,\r\n DocListFilterOperators.GreaterThan,\r\n DocListFilterOperators.GreaterThanOrEqualsTo,\r\n DocListFilterOperators.Between,\r\n ],\r\n ObjectValue: [DocListFilterOperators.None],\r\n};\r\n\r\noperatorsPerType.WebDavName = operatorsPerType.StringValue;\r\noperatorsPerType.FileSize = operatorsPerType.LongValue;\r\n\r\nconst Operators = ({\r\n index,\r\n type,\r\n value,\r\n onChange,\r\n}: {\r\n index: number,\r\n type: DocListColumnTypeEnum,\r\n value: string,\r\n onChange: Function,\r\n}) => (\r\n \r\n {Array.isArray(operatorsPerType[type]) ? (\r\n operatorsPerType[type].map((opType, index) => (\r\n \r\n ))\r\n ) : (\r\n \r\n )}\r\n \r\n);\r\n\r\nOperators.propTypes = {\r\n index: PropTypes.number.isRequired,\r\n type: PropTypes.string.isRequired,\r\n value: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default Operators;\r\n","import React, { PureComponent, useRef, useCallback } from \"react\";\r\nimport {\r\n DocListFilterOperators,\r\n type DocListFilterOperatorsEnum,\r\n} from \"data/types\";\r\nimport moment from \"moment\";\r\nimport Moment from \"containers/Moment\";\r\nimport LocaleUtils, { formatDate, parseDate } from \"react-day-picker/moment\";\r\nimport DayPickerInput from \"react-day-picker/DayPickerInput\";\r\nimport { Manager } from \"react-popper\";\r\nimport {\r\n DatePickerReference,\r\n DatePickerPopper,\r\n} from \"components/ExtraAttributes/EditorControl/DateEditorControl\";\r\nimport \"react-day-picker/lib/style.css\";\r\nimport loc from \"i18next\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\n\r\n// range of dates to show in the picker\r\nconst currentYear = () => new Date().getFullYear();\r\nconst fromMonth = () => new Date(currentYear() - 10, 0);\r\nconst toMonth = () => new Date(currentYear() + 10, 11);\r\n\r\nexport function YearMonthForm({\r\n date,\r\n localeUtils,\r\n onChange,\r\n}: {\r\n date?: Date,\r\n localeUtils?: Object,\r\n onChange: Function,\r\n}) {\r\n const month = useRef(null);\r\n const year = useRef(null);\r\n\r\n const handleChange = useCallback(\r\n (e) => {\r\n onChange(new Date(year.current.value, month.current.value));\r\n },\r\n [month, year, onChange]\r\n );\r\n\r\n if (localeUtils === undefined || localeUtils === null) return null;\r\n if (date === undefined || date === null) date = new Date();\r\n const months = localeUtils.getMonths(userLanguage());\r\n\r\n const years = [];\r\n for (\r\n let i = fromMonth().getFullYear();\r\n i <= toMonth().getFullYear();\r\n i += 1\r\n ) {\r\n years.push(i);\r\n }\r\n\r\n return (\r\n
\r\n \r\n {months.map((month, i) => (\r\n \r\n ))}\r\n \r\n \r\n {years.map((year, i) => (\r\n \r\n ))}\r\n \r\n
\r\n );\r\n}\r\n\r\ntype Props = {\r\n autoFocus?: boolean,\r\n index: number,\r\n operator: DocListFilterOperatorsEnum,\r\n values: Array,\r\n valueIndex: number,\r\n onChange: Function,\r\n};\r\n\r\ntype State = {\r\n month: Date,\r\n values: Array,\r\n};\r\n\r\nexport class DatePicker extends PureComponent {\r\n state = {\r\n month: fromMonth(),\r\n values: [],\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n month: new Date(),\r\n values:\r\n (Array.isArray(props.values) &&\r\n props.values.map((value) => this.getValueAsDate(value))) ||\r\n [],\r\n };\r\n moment.locale(userLanguage());\r\n }\r\n\r\n handleYearMonthChange = (month: Date) => {\r\n this.setState({ month });\r\n };\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (prevProps.values !== this.props.values) {\r\n this.setState({ month: new Date() });\r\n }\r\n }\r\n\r\n getValueAsDate = (value: ?string) =>\r\n value && String(value).length > 0 ? moment(value).format(\"L\") : null;\r\n\r\n handleDayChange = (\r\n day: ?Date,\r\n modifiers: Object,\r\n dayPickerInput: DayPickerInput\r\n ) => {\r\n const { index, valueIndex, onChange } = this.props;\r\n const input = dayPickerInput.getInput();\r\n let currentValue;\r\n if (day != null) {\r\n currentValue = this.getValueAsDate(day);\r\n onChange(\r\n moment(day).utc().startOf(\"day\").toJSON(),\r\n index,\r\n valueIndex\r\n );\r\n } else {\r\n currentValue = input.value;\r\n onChange(\r\n moment.utc(currentValue, \"L\").toJSON() || \"\",\r\n index,\r\n valueIndex\r\n );\r\n }\r\n const values = [...this.state.values];\r\n values[valueIndex] = currentValue;\r\n this.setState({ values });\r\n };\r\n\r\n render() {\r\n const { autoFocus, valueIndex, values, operator } = this.props;\r\n\r\n const from =\r\n [\r\n DocListFilterOperators.Between,\r\n DocListFilterOperators.NotBetween,\r\n ].includes(operator) &&\r\n values &&\r\n values[0] &&\r\n String(values[0]).length > 0\r\n ? moment(values[0]).toDate()\r\n : null;\r\n\r\n return (\r\n
\r\n \r\n \r\n ),\r\n }}\r\n onDayChange={this.handleDayChange}\r\n value={this.state.values[valueIndex]}\r\n placeholder={moment.localeData().longDateFormat(\"L\")}\r\n format=\"L\"\r\n formatDate={formatDate}\r\n parseDate={parseDate}\r\n component={DatePickerReference}\r\n overlayComponent={DatePickerPopper}\r\n />\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default Moment(DatePicker);\r\n","// @flow\r\nimport React from \"react\";\r\nimport {\r\n DocListFilterOperators,\r\n type DocListFilterOperatorsEnum,\r\n} from \"data/types\";\r\nimport DatePicker from \"./DatePicker\";\r\nimport RelativeDatePicker from \"./RelativeDatePicker\";\r\n\r\nconst FilterDateValue = ({\r\n autoFocus,\r\n index,\r\n valueIndex,\r\n values,\r\n operator,\r\n onChange,\r\n}: {\r\n autoFocus: boolean,\r\n index: number,\r\n valueIndex: number,\r\n values?: Array,\r\n operator: DocListFilterOperatorsEnum,\r\n onChange: Function,\r\n}) => {\r\n switch (operator) {\r\n case DocListFilterOperators.DateRelative:\r\n return (\r\n \r\n onChange(e, index, valueIndex)\r\n }\r\n />\r\n );\r\n\r\n case DocListFilterOperators.None:\r\n return null;\r\n\r\n default:\r\n return (\r\n \r\n );\r\n }\r\n};\r\n\r\nexport default FilterDateValue;\r\n","// @flow\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport ToggleButtonGroup from \"react-bootstrap/lib/ToggleButtonGroup\";\r\nimport ToggleButton from \"react-bootstrap/lib/ToggleButton\";\r\nimport loc from \"i18next\";\r\n\r\nconst BoolPicker = ({\r\n index,\r\n value,\r\n onChange,\r\n}: {\r\n index: number,\r\n value?: string,\r\n onChange: Function,\r\n}) => (\r\n \r\n \r\n {loc.t(\"folder:action_filter.Boolean.None\")}\r\n \r\n \r\n {loc.t(\"folder:action_filter.Boolean.True\")}\r\n \r\n \r\n {loc.t(\"folder:action_filter.Boolean.False\")}\r\n \r\n \r\n);\r\n\r\nBoolPicker.propTypes = {\r\n index: PropTypes.number.isRequired,\r\n value: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default BoolPicker;\r\n","// @flow\r\nimport React from \"react\";\r\nimport FormControl from \"react-bootstrap/lib/FormControl\";\r\nimport {\r\n type DocListColumnTypeEnum,\r\n DocListColumnType,\r\n type DocListFilterOperatorsEnum,\r\n DocListFilterOperators,\r\n} from \"data/types\";\r\nimport FilterDateValue from \"./FilterDateValue\";\r\nimport \"react-day-picker/lib/style.css\";\r\nimport BoolPicker from \"./BoolPicker\";\r\nimport ClearableInput from \"@hs/clearable-input\";\r\n\r\ntype Props = {\r\n autoFocus?: boolean,\r\n index: number,\r\n type: DocListColumnTypeEnum,\r\n operator: DocListFilterOperatorsEnum,\r\n values: Array,\r\n valueIndex: number,\r\n onChange: Function,\r\n};\r\n\r\nconst FilterValue = ({\r\n autoFocus,\r\n index,\r\n valueIndex,\r\n type,\r\n values,\r\n operator,\r\n onChange,\r\n}: Props) => {\r\n const from =\r\n [\r\n DocListFilterOperators.Between,\r\n DocListFilterOperators.NotBetween,\r\n ].includes(operator) &&\r\n values &&\r\n values[0] &&\r\n String(values[0]).length > 0\r\n ? values[0]\r\n : null;\r\n\r\n switch (type) {\r\n case DocListColumnType.BooleanValue:\r\n return (\r\n onChange(e, index)\r\n }\r\n />\r\n );\r\n\r\n case DocListColumnType.DateTimeValue:\r\n return (\r\n \r\n );\r\n\r\n case DocListColumnType.IntValue:\r\n case DocListColumnType.LongValue:\r\n case DocListColumnType.FileSize:\r\n case DocListColumnType.ShortValue:\r\n case DocListColumnType.DoubleValue:\r\n case DocListColumnType.DecimalValue:\r\n case DocListColumnType.SingleValue:\r\n return (\r\n onChange(e, index, valueIndex)\r\n }\r\n />\r\n );\r\n\r\n default:\r\n return (\r\n \r\n onChange(e, index, valueIndex)\r\n }\r\n className=\"form-control\"\r\n />\r\n );\r\n }\r\n};\r\nFilterValue.displayName = \"FilterValue\";\r\nexport default FilterValue;\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport Col from \"react-bootstrap/lib/Col\";\r\nimport Modal from \"components/Modal\";\r\nimport ButtonToolbar from \"react-bootstrap/lib/ButtonToolbar\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport SplitButton from \"react-bootstrap/lib/SplitButton\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport Form from \"react-bootstrap/lib/Form\";\r\nimport FormGroup from \"react-bootstrap/lib/FormGroup\";\r\nimport ControlLabel from \"react-bootstrap/lib/ControlLabel\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Operators from \"./Operators\";\r\nimport FilterValue from \"./FilterValue\";\r\nimport {\r\n type DocListFilterRequestDTO,\r\n DocListFilterOperators,\r\n DocListColumnType,\r\n} from \"data/types\";\r\nimport { type docsResultState } from \"data/reducers/types\";\r\nimport immutable from \"object-path-immutable\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./DocListFilterModal.module.css\";\r\nimport { GetDefaults } from \"./Utils\";\r\n\r\ntype Props = {\r\n /** whether to show modal */\r\n show: boolean,\r\n /** which filter to focus on */\r\n focusOnFilterName: ?string,\r\n /** modal dialog title */\r\n title: string,\r\n /** current result */\r\n result: docsResultState,\r\n /** callback when user closes modal */\r\n onClose: () => void,\r\n /** callback when user wants to set filters\r\n * @param {Array} filters all filters values\r\n */\r\n onFilter: (filters: Array) => void,\r\n /** current filters definitions */\r\n filters: ?Array,\r\n};\r\n\r\ntype State = {\r\n filters: Array,\r\n};\r\n\r\nexport default class DocListFilterModal extends PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n if (props.filters == null || props.filters.length === 0) {\r\n if (props.result.itemUri != null)\r\n this.state = {\r\n filters:\r\n GetDefaults(\r\n props.result.itemUri,\r\n props.formatId,\r\n props.result.cols\r\n ).filters /* istanbul ignore next */ || [],\r\n };\r\n else this.state = { filters: [] };\r\n } else {\r\n this.state = {\r\n filters: props.filters,\r\n };\r\n }\r\n }\r\n\r\n _onFilter = () => {\r\n this.props.onFilter(this.state.filters);\r\n };\r\n\r\n _onSubmit = (e: SyntheticInputEvent<*>) => {\r\n e.preventDefault();\r\n this._onFilter();\r\n };\r\n\r\n _onOperatorChange = (e: SyntheticInputEvent<*>): void => {\r\n const index = parseInt(e.currentTarget.name, 10);\r\n const filter = this.state.filters[index];\r\n let newfilters = immutable.set(\r\n this.state.filters,\r\n [String(index), \"operator\"],\r\n e.currentTarget.value\r\n );\r\n // reset value only if not compatible\r\n if (\r\n filter.operator === DocListFilterOperators.DateRelative ||\r\n newfilters[index].operator === DocListFilterOperators.DateRelative\r\n ) {\r\n newfilters = immutable.set(\r\n newfilters,\r\n [String(index), \"values\"],\r\n [\"\"]\r\n );\r\n }\r\n this.setState({\r\n filters: newfilters,\r\n });\r\n };\r\n\r\n _onValueChange = (\r\n e: SyntheticInputEvent<*> | string,\r\n index: number,\r\n valueIndex: ?number\r\n ) => {\r\n let value;\r\n /* istanbul ignore if */\r\n if (typeof e === \"string\") {\r\n value = e;\r\n } else {\r\n value = e.currentTarget.value;\r\n }\r\n this.setState(\r\n {\r\n filters: immutable.set(\r\n this.state.filters,\r\n [\r\n String(index),\r\n \"values\",\r\n valueIndex /* istanbul ignore next */ || 0,\r\n ],\r\n value\r\n ),\r\n },\r\n () => {\r\n if (\r\n valueIndex === 0 &&\r\n this.state.filters[index].operator ===\r\n DocListFilterOperators.Between\r\n )\r\n this.setState({\r\n filters: immutable.set(\r\n this.state.filters,\r\n [String(index), \"values\", 1],\r\n \"\"\r\n ),\r\n });\r\n }\r\n );\r\n };\r\n\r\n _resetValues = () => {\r\n this._resetSelect(\"values\");\r\n };\r\n\r\n _resetSelect = (eventKey: \"all\" | \"values\") => {\r\n if (eventKey === \"all\") {\r\n const { result, formatId } = this.props;\r\n // clear the WHOLE form (operators & values)\r\n /* istanbul ignore else */\r\n if (result.itemUri != null)\r\n this.setState({\r\n filters: GetDefaults(result.itemUri, formatId, result.cols)\r\n .filters,\r\n });\r\n else this.setState({ filters: [] });\r\n } else {\r\n /* istanbul ignore else */\r\n if (eventKey === \"values\") {\r\n this.setState({\r\n filters: this.state.filters.map((filter) =>\r\n immutable.set(filter, \"values\", [\"\"])\r\n ),\r\n });\r\n }\r\n }\r\n };\r\n\r\n // submit form on keyboard Enter\r\n _onKeyPress = (e: SyntheticKeyboardEvent<*>) => {\r\n /* istanbul ignore else */\r\n if (e.which === 13) {\r\n e.preventDefault();\r\n this._onFilter();\r\n }\r\n };\r\n\r\n /*_getValidationState = (\r\n filter: DocListFilterRequestDTO\r\n ): \"success\" | \"warning\" | \"error\" | null => {\r\n if (filter.operator === DocListFilterOperators.Between) {\r\n console.log(\"filter\", filter);\r\n return filter.values.length === 2 &&\r\n String(filter.values[0]).length > 0 &&\r\n String(filter.values[1]).length > 0\r\n ? \"success\"\r\n : \"error\";\r\n }\r\n return null;\r\n };\r\n \r\n validationState={this._getValidationState(\r\n filter\r\n )}\r\n */\r\n\r\n // will return column index to focus on\r\n // if passed in props then return that\r\n // otherwise find first visible field\r\n _getFocusColumnIndex = () => {\r\n const { filters } = this.state;\r\n const { focusOnFilterName, result } = this.props;\r\n if (focusOnFilterName == null) {\r\n const cols = result.cols || [];\r\n // find first field available\r\n const i = filters.findIndex((filter) => {\r\n const col = cols.find((c) => c.name === filter.name);\r\n if (col != null && col.canSort) return true;\r\n return false;\r\n });\r\n return i;\r\n }\r\n\r\n const i = filters.findIndex(\r\n (filter) => filter.name === focusOnFilterName\r\n );\r\n /* istanbul ignore next */\r\n if (i == null) return -1;\r\n return i;\r\n };\r\n\r\n render() {\r\n const { show, onClose, result, title } = this.props;\r\n const { filters } = this.state;\r\n const cols = result.cols || [];\r\n const focusColumnIndex = this._getFocusColumnIndex();\r\n\r\n return (\r\n \r\n
\r\n \r\n {/*\r\n {loc.t(\"folder:action_filter.reset\")}\r\n */}\r\n \r\n \r\n {\" \" +\r\n loc.t(\"folder:action_filter.title\") +\r\n \" \" +\r\n title}\r\n \r\n \r\n \r\n {filters.map((filter, index) => {\r\n const col = cols.find(\r\n (c) => c.name === filter.name\r\n );\r\n if (col == null) {\r\n /* console.warn(\r\n `Cannot find matching col named ${filter.name}; skipping`\r\n ); */\r\n return null;\r\n }\r\n if (!col.canSort) return null;\r\n return (\r\n \r\n \r\n {col.caption}\r\n \r\n {col.type !==\r\n DocListColumnType.BooleanValue && (\r\n \r\n \r\n \r\n )}\r\n {[\r\n DocListFilterOperators.Between,\r\n DocListFilterOperators.NotBetween,\r\n ].includes(filter.operator) ? (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n {loc.t(\"folder:action_filter.reset_all\")}\r\n \r\n \r\n \r\n \r\n \r\n {loc.t(\"folder:action_filter.filter\")}\r\n \r\n {/**/}\r\n \r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\n","//@flow\r\nimport React, { PureComponent, type ComponentType } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport findIndex from \"lodash/findIndex\";\r\nimport { getDisplayName } from \"data/constants\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { type TrackCurrentRowProps } from \"containers/TrackCurrentRow\";\r\nimport {\r\n type ServerEventMessage,\r\n ServerEventItemType,\r\n ServerEventActionType,\r\n} from \"data/types\";\r\nimport { type docsResultState } from \"data/reducers/types\";\r\n\r\ntype Props = {\r\n /** Current User ID */\r\n userId: number,\r\n /** DocList Container: Result (from API) */\r\n result: docsResultState,\r\n /** DocList Container: Tracker Object */\r\n docTracker: TrackCurrentRowProps,\r\n /** GlobalEventsHandler: Id */\r\n refreshId: number,\r\n /** GlobalEventsHandler: Event */\r\n refreshEvent: ?ServerEventMessage,\r\n};\r\n\r\ntype State = {\r\n refreshId: number,\r\n userId: number,\r\n itemUri: string,\r\n};\r\n\r\nconst UploadHandler = () => (WrappedComponent: ComponentType) => {\r\n class PP extends PureComponent {\r\n static displayName = `UploadHandler(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n\r\n state = {\r\n refreshId: -1,\r\n userId: -1,\r\n itemUri: \"\",\r\n };\r\n\r\n static _maybeSetActiveRow(props, state) {\r\n /* istanbul ignore else */\r\n if (!props.result) {\r\n return null;\r\n }\r\n\r\n const rows = props.result.rows;\r\n /* istanbul ignore else */\r\n if (!rows || props.result.rowCount === 0) {\r\n return null;\r\n }\r\n\r\n const itemUriIndex = findIndex(props.result.cols, [\r\n \"name\",\r\n \"ITEMURI\",\r\n ]);\r\n /* istanbul ignore else */\r\n if (itemUriIndex === -1) {\r\n return null;\r\n }\r\n\r\n const activeRowIndex = Object.keys(rows).reduce(\r\n (indexOrUndefined, index) =>\r\n typeof indexOrUndefined === \"undefined\" &&\r\n rows[index][itemUriIndex] === state.itemUri\r\n ? index\r\n : indexOrUndefined,\r\n undefined\r\n );\r\n /* istanbul ignore else */\r\n if (\r\n typeof activeRowIndex !== \"undefined\" &&\r\n props.docTracker &&\r\n props.docTracker.currentRow !== activeRowIndex\r\n ) {\r\n props.docTracker.setCurrentRow(activeRowIndex);\r\n // Reset itemUri and User ID\r\n return {\r\n userId: -1,\r\n itemUri: \"\",\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n static getDerivedStateFromProps(props, state) {\r\n /* istanbul ignore else */\r\n if (!props.refreshEvent) {\r\n return null;\r\n }\r\n\r\n // Did my upload finish? Maybe need to set new active row\r\n /* istanbul ignore else */\r\n if (state.itemUri && state.userId === props.userId) {\r\n const newState = PP._maybeSetActiveRow(props, state);\r\n /* istanbul ignore else */\r\n if (newState) {\r\n return newState;\r\n }\r\n }\r\n\r\n const { item, action, data } = props.refreshEvent;\r\n // Is the refresh event a file upload\r\n /* istanbul ignore else */\r\n if (\r\n item !== ServerEventItemType.document ||\r\n action !== ServerEventActionType.add\r\n ) {\r\n return null;\r\n }\r\n\r\n // Is the upload event mine and new?\r\n /* istanbul ignore else */\r\n if (\r\n props.refreshId !== state.refreshId &&\r\n data.userId === props.userId\r\n ) {\r\n return {\r\n refreshId: props.refreshId,\r\n userId: data.userId,\r\n itemUri: data.itemUri,\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n render() {\r\n // Remove userID property\r\n const { userId, ...props } = this.props;\r\n\r\n return ;\r\n }\r\n }\r\n\r\n const mapStateToProps = (state, ownProps) => ({\r\n userId: s.userIdSelector(state),\r\n ...ownProps,\r\n });\r\n\r\n return connect(mapStateToProps)(PP);\r\n};\r\n\r\nexport default UploadHandler;\r\n","// @flow\r\nimport React, { PureComponent, type Node } from \"react\";\r\nimport { compose } from \"redux\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport loc from \"i18next\";\r\nimport noop from \"lodash/noop\";\r\nimport isEqual from \"lodash/isEqual\";\r\nimport LayoutLoader from \"containers/LayoutLoader\";\r\nimport {\r\n RefreshMode,\r\n type DocListFilterRequestDTO,\r\n type DocListSortRequestDTO,\r\n SortDirectionOptions,\r\n type DocListLayout,\r\n type ListViewModeEnum,\r\n ListViewMode,\r\n ServerEventItemType,\r\n type TrackCurrentRowProps,\r\n} from \"data/types\";\r\nimport { type docsResultState } from \"data/reducers/types\";\r\nimport {\r\n getDocsAction,\r\n togglesUpdateCounterAction,\r\n setDocsLayoutAction,\r\n} from \"data/actions\";\r\nimport { fetchDocs } from \"data/api\";\r\nimport DocListFilterBar from \"components/DocListFilterBar\";\r\nimport DocList from \"components/DocList\";\r\nimport DocListSimple from \"components/DocListSimple\";\r\nimport DocListFilterModal from \"components/DocListFilterModal\";\r\nimport {\r\n IsFiltered,\r\n GetDefaultFilters,\r\n} from \"components/DocListFilterModal/Utils\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport GlobalEventsHandler from \"containers/GlobalEventsHandler\";\r\nimport UploadHandler from \"containers/UploadHandler\";\r\nimport Status from \"components/Status\";\r\nimport NoDocs from \"components/NoDocs\";\r\nimport withOfflineHandler from \"containers/OfflineHandler\";\r\nimport { type MultiSelectionProps } from \"containers/MultiSelection\";\r\n\r\ntype Props = {\r\n /** folder itemUri to show */\r\n itemUri: string,\r\n /** whether to popup filter modal */\r\n showFilter: boolean,\r\n /** whether to automatically load and show documents */\r\n showDocs: boolean,\r\n /** whether to show the AddDocument action when NoDocs found\r\n * @default {boolean} true\r\n */\r\n showAddDocument?: boolean,\r\n /** callback when user closes filter modal */\r\n onFilterClose: () => void,\r\n /** callback when user clicks document icon\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n */\r\n onIconClick?: (e: SyntheticMouseEvent) => void,\r\n /** callback when user single clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onSingleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** callback when user double clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onDoubleClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** callback when user clicks on More... button\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {string} itemUri the row's itemUri\r\n * @param {number} index the row's index\r\n */\r\n onMoreClick?: (\r\n e: SyntheticMouseEvent,\r\n itemUri: string,\r\n index: number\r\n ) => void,\r\n /** whether doclist filters should be rendered */\r\n renderFilter: ?boolean,\r\n /** whether to disable the More... button */\r\n actionsDisabled?: boolean,\r\n /** callback when user right clicks the whole row\r\n * @param {SyntheticMouseEvent} e HTML click event\r\n * @param {number} rowIndex the row's index\r\n * @param {number} columnsIndex the column's index\r\n * @param {string} itemUri the row's itemUri\r\n */\r\n onContextClick?: (\r\n e: SyntheticMouseEvent,\r\n rowIndex: number,\r\n columnIndex: number,\r\n itemUri: string\r\n ) => void,\r\n activeRowIndex?: number,\r\n scrollToRow?: number,\r\n /** React.Node children */\r\n children?: Node,\r\n forceDocListSimple?: boolean,\r\n\r\n // from redux connect()\r\n layout?: DocListLayout,\r\n /** current viewName */\r\n viewName: ?string,\r\n breadcrumbName: string,\r\n result?: docsResultState,\r\n status: ConstantsEnum,\r\n /** GlobalEventsHandler.refreshId */\r\n refreshId: number,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** current docListViewMode */\r\n docListViewMode: ListViewModeEnum,\r\n /** redux: current formatId */\r\n formatId: number,\r\n /** TrackCurrentRow: tracks current selected document row */\r\n docTracker: ?TrackCurrentRowProps,\r\n /** withMultipleSelection additional props */\r\n multiSelection: MultiSelectionProps,\r\n};\r\n\r\ntype State = {\r\n rowStartIndex: number, //current top row rendered\r\n scrollToRow: number,\r\n focusOnFilterName: ?string,\r\n};\r\n\r\nexport class DocListContainer extends PureComponent {\r\n static defaultProps = {\r\n showFilter: false,\r\n showDocs: true,\r\n onFilterClose: undefined,\r\n status: Constants.LOADING,\r\n dispatch: noop,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n focusOnFilterName: null,\r\n rowStartIndex: 0,\r\n scrollToRow: props.scrollToRow || -1,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n /* istanbul ignore else */\r\n if (\r\n this.props.showDocs === true ||\r\n this.props.status === Constants.NONE\r\n ) {\r\n this._fetch(this.props.itemUri);\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n // reload data?\r\n /* istanbul ignore else */\r\n if (this.props.showDocs === true && this.props.itemUri !== undefined) {\r\n const prevNotInitialFilters = prevProps.layout?.filters?.length;\r\n\r\n const isLayoutChanged =\r\n prevProps.layout?.filters &&\r\n this.props.layout?.filters &&\r\n !isEqual(prevProps.layout, this.props.layout);\r\n\r\n const notDefaultFilters =\r\n this.props.layout?.filters &&\r\n this.props.result?.cols &&\r\n !isEqual(\r\n this.props.layout.filters,\r\n GetDefaultFilters(this.props.result.cols)\r\n );\r\n\r\n /* istanbul ignore else */\r\n if (\r\n prevProps.showDocs !== this.props.showDocs ||\r\n prevProps.itemUri !== this.props.itemUri ||\r\n (isLayoutChanged &&\r\n (prevNotInitialFilters || notDefaultFilters))\r\n ) {\r\n this.setState(\r\n {\r\n scrollToRow: this.props.activeRowIndex,\r\n rowStartIndex: 0,\r\n },\r\n () => this._fetch(this.props.itemUri)\r\n );\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (\r\n this.props.docTracker &&\r\n isLayoutChanged &&\r\n (prevNotInitialFilters || notDefaultFilters)\r\n ) {\r\n this.props.docTracker.setCurrentRow(-1);\r\n this.setState({ scrollToRow: -1 });\r\n }\r\n }\r\n\r\n if (prevProps.itemUri !== this.props.itemUri) {\r\n this.props.multiSelection?.disable();\r\n }\r\n\r\n if (\r\n prevProps.status !== this.props.status &&\r\n this.props.status === Constants.OK &&\r\n this.props.result !== undefined &&\r\n this.props.result.pageNum > 0\r\n ) {\r\n this.setState((state) => ({\r\n scrollToRow: state.rowStartIndex + 1,\r\n }));\r\n }\r\n\r\n // update totalCount\r\n if (\r\n prevProps.result !== this.props.result &&\r\n this.props.result !== undefined\r\n ) {\r\n if (this.props.result.totalCount !== this.props.result.pageSize) {\r\n this._updateToggleCounter(this.props.result.totalCount);\r\n } else if (this.props.result.pageSize === 0) {\r\n this._updateToggleCounter(0);\r\n }\r\n\r\n // Update multiSelection available Rows\r\n /* istanbul ignore next */\r\n this.props.multiSelection?.setAvailableRows(this.props.result.rows);\r\n }\r\n\r\n if (\r\n this.props.status === Constants.ERROR &&\r\n prevProps.status !== this.props.status &&\r\n this.props.viewName != null\r\n ) {\r\n this.props.dispatch(\r\n togglesUpdateCounterAction({\r\n name: this.props.viewName,\r\n counts: { doclist: 0 },\r\n status: { doclist: Constants.ERROR },\r\n })\r\n );\r\n }\r\n\r\n // finished uploading? refresh\r\n /* istanbul ignore else */\r\n if (prevProps.refreshId !== this.props.refreshId) {\r\n this._fetch(this.props.itemUri);\r\n this.props.multiSelection?.disable();\r\n }\r\n }\r\n\r\n _updateToggleCounter(count: number, loading?: boolean): void {\r\n const { dispatch, viewName, layout } = this.props;\r\n let status = null;\r\n if (loading === true) {\r\n status = Constants.LOADING;\r\n } else if (layout && layout.filters && IsFiltered(layout.filters)) {\r\n status = \"filter\";\r\n }\r\n /* istanbul ignore else */\r\n if (viewName !== undefined && viewName !== null)\r\n dispatch(\r\n togglesUpdateCounterAction({\r\n name: viewName,\r\n counts: { doclist: count },\r\n status: { doclist: status },\r\n })\r\n );\r\n }\r\n\r\n _loadMoreRowsSimple = (pageNum: number) => {\r\n const { layout } = this.props;\r\n /* istanbul ignore else */\r\n if (this.props.itemUri !== undefined)\r\n return this.props.offlineHandler.factory(fetchDocs)(\r\n this.props.itemUri,\r\n pageNum,\r\n layout?.sorts,\r\n layout?.filters,\r\n layout?.cols\r\n );\r\n };\r\n\r\n // load next page of results\r\n _loadMoreRows = (pageNum: number) => {\r\n /* istanbul ignore else */\r\n if (this.props.itemUri !== undefined)\r\n this._fetch(this.props.itemUri, pageNum);\r\n };\r\n\r\n // load first page of documents\r\n _fetch(itemUri: string, pageNum?: number) {\r\n const { dispatch, showDocs, layout } = this.props;\r\n const reqPageNum = pageNum || 0;\r\n if (reqPageNum === 0) this._updateToggleCounter(0, true);\r\n dispatch(\r\n getDocsAction({\r\n pageNum: showDocs ? reqPageNum : -1,\r\n itemUri,\r\n sorts: layout?.sorts,\r\n filters: layout?.filters,\r\n })\r\n );\r\n }\r\n\r\n _setSorting = (name: string) => {\r\n const { layout } = this.props;\r\n let direction = SortDirectionOptions.Ascending;\r\n if (layout?.sorts?.[0]?.name === name) {\r\n direction =\r\n layout.sorts[0].direction === SortDirectionOptions.Ascending\r\n ? SortDirectionOptions.Descending\r\n : SortDirectionOptions.Ascending;\r\n }\r\n\r\n const sorts: Array = [\r\n {\r\n name,\r\n direction,\r\n },\r\n ];\r\n this.props.dispatch(setDocsLayoutAction({ sorts }));\r\n };\r\n\r\n _onFilter = (filters: Array) => {\r\n this._onFilterClose();\r\n this.props.dispatch(setDocsLayoutAction({ filters }));\r\n };\r\n\r\n _onFilterClose = () => {\r\n this.setState({ focusOnFilterName: null });\r\n /* istanbul ignore else */\r\n if (typeof this.props.onFilterClose === \"function\")\r\n this.props.onFilterClose();\r\n };\r\n\r\n /* istanbul ignore next */ _requestShowFilter = (name) =>\r\n this.setState({\r\n focusOnFilterName: name,\r\n });\r\n\r\n /* istanbul ignore next */ _rowStartIndexUpdated = (rowStartIndex) =>\r\n this.setState({ rowStartIndex });\r\n\r\n _onContextClick = (\r\n e,\r\n rowIndex: number,\r\n columnIndex: number,\r\n itemUri: string\r\n ) => this.props.onMoreClick(e, itemUri, rowIndex, columnIndex);\r\n\r\n _isRowActive = (rowIndex: number, activeState: boolean): boolean => {\r\n return this.props.multiSelection?.multiple\r\n ? this.props.multiSelection?.isSelected(rowIndex)\r\n : activeState;\r\n };\r\n\r\n render() {\r\n const {\r\n status,\r\n showDocs,\r\n showFilter,\r\n renderFilter,\r\n result,\r\n hasFilter,\r\n layout,\r\n breadcrumbName,\r\n forceDocListSimple,\r\n docListViewMode,\r\n } = this.props;\r\n if (showDocs) {\r\n return (\r\n \r\n \r\n\r\n {status === Constants.OK && result != null && (\r\n \r\n )}\r\n {(status !== Constants.OK || result == null) && (\r\n \r\n )}\r\n {status === Constants.OK &&\r\n result != null &&\r\n result.totalCount === 0 && (\r\n \r\n )}\r\n {status === Constants.OK &&\r\n result != null &&\r\n result.totalCount > 0 && (\r\n <>\r\n {(forceDocListSimple ||\r\n docListViewMode === ListViewMode.List ||\r\n docListViewMode ===\r\n ListViewMode.Thumbnails) && (\r\n \r\n {this.props.children}\r\n \r\n )}\r\n {docListViewMode === ListViewMode.Grid && (\r\n \r\n {this.props.children}\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n } else if (showFilter || this.state.focusOnFilterName != null) {\r\n if (\r\n status === Constants.OK &&\r\n result != null &&\r\n result.filters != null\r\n ) {\r\n return (\r\n \r\n );\r\n } else return ;\r\n } else\r\n return (\r\n this.props.children || (\r\n \r\n )\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n viewName: s.currentNameSelector(state), // state.current.name,\r\n breadcrumbName: s.breadcrumbNameSelector(\r\n state,\r\n s.currentNameSelector(state)\r\n ),\r\n status: s.docsStatusSelector(state),\r\n error: s.docsErrorSelector(state),\r\n docListViewMode: s.docListViewModeSelector(state),\r\n formatId: s.breadcrumbFormatIdSelector(state, s.currentNameSelector(state)),\r\n result:\r\n s.docsStatusSelector(state) === Constants.OK ? state.docs : undefined,\r\n hasFilter: (s.docsLayoutFiltersSelector(state) || []).filter(\r\n (filter) => filter.values.filter((v) => v).length\r\n ).length,\r\n ...ownProps,\r\n});\r\n\r\nexport default compose(\r\n LayoutLoader,\r\n connect(mapStateToProps),\r\n GlobalEventsHandler({\r\n items: [ServerEventItemType.document],\r\n refreshMode: RefreshMode.Originator,\r\n refreshMessage: loc.t(\"globalEvents:refresh.doclist\"),\r\n }),\r\n UploadHandler(),\r\n withOfflineHandler\r\n)(DocListContainer);\r\n","//@flow\r\nimport React from \"react\";\r\nimport AbsoluteDropdown from \"components/AbsoluteDropdown\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport Dropdown from \"react-bootstrap/lib/Dropdown\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport isEqual from \"lodash/isEqual\";\r\nimport styles from \"components/FilterBar/SearchBucket/SearchBucket.module.css\";\r\n\r\ntype Props = {\r\n multiple: boolean,\r\n activeRows: Array,\r\n disable: () => void,\r\n handleSelectAll: () => void,\r\n handleDeselectAll: () => void,\r\n handleInvert: () => void,\r\n};\r\n\r\nconst badge = {\r\n marginLeft: 3,\r\n};\r\n\r\nconst Bucket = ({\r\n multiple,\r\n activeRows,\r\n availableRows,\r\n enable,\r\n disable,\r\n handleSelectAll,\r\n handleDeselectAll,\r\n handleInvert,\r\n}: Props) =>\r\n multiple ? (\r\n \r\n \r\n \r\n {getLocalizedText(\"$multiselection:name\")}\r\n \r\n {Object.keys(activeRows).length > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {getLocalizedText(\"$multiselection:disable\")}\r\n \r\n {!isEqual(activeRows, availableRows) && (\r\n \r\n {getLocalizedText(\"$multiselection:selectAll\")}\r\n \r\n )}\r\n {Object.keys(activeRows).length > 0 && (\r\n \r\n {getLocalizedText(\"$multiselection:deselectAll\")}\r\n \r\n )}\r\n \r\n {getLocalizedText(\"$multiselection:invert\")}\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n {getLocalizedText(\"$multiselection:enable\")}\r\n \r\n \r\n );\r\nBucket.displayName = \"MultiSelection.Bucket\";\r\n\r\nexport default Bucket;\r\n","// @flow\r\nimport React, { useCallback } from \"react\";\r\n\r\ntype Props = {\r\n className: string,\r\n handleToggle: (index: number) => void,\r\n index: number,\r\n activeRows: Array,\r\n};\r\n\r\nconst style = {\r\n height: \"15px\",\r\n width: \"15px\",\r\n padding: 0,\r\n verticalAlign: \"top\",\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n};\r\n\r\nconst input = {\r\n margin: 0,\r\n height: \"15px\",\r\n width: \"15px\",\r\n cursor: \"pointer\",\r\n};\r\n\r\nconst stopPropagation = (e) => {\r\n e.stopPropagation();\r\n};\r\n\r\nconst Checkbox = ({ className, handleToggle, index, isSelected }: Props) => {\r\n const handleChange = useCallback(\r\n (e) => {\r\n handleToggle(index);\r\n },\r\n [handleToggle, index]\r\n );\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nCheckbox.displayName = \"MultiSelection.Checkbox\";\r\n\r\nexport default Checkbox;\r\n","//@flow\r\nimport React, {\r\n useState,\r\n useCallback,\r\n useRef,\r\n useMemo,\r\n useEffect,\r\n} from \"react\";\r\nimport { getDisplayName } from \"data/constants\";\r\nimport { MultiSelectionContext } from \"data/context\";\r\nimport produce from \"immer\";\r\nimport Bucket from \"./Bucket\";\r\nimport Checkbox from \"./Checkbox\";\r\nimport {\r\n MultiSelectionActions,\r\n MultiSelectionHandlers,\r\n MultiSelectionContextProps,\r\n MultiSelectionProps,\r\n} from \"data/types\";\r\n\r\ntype Config = {\r\n delay: number,\r\n};\r\n\r\ntype Props = {};\r\n\r\n/* istanbul ignore next */\r\nconst isTouchEvent = (event) => {\r\n return \"touches\" in event;\r\n};\r\n\r\n/* istanbul ignore next */\r\nconst preventDefault = (event) => {\r\n if (!isTouchEvent(event)) return;\r\n\r\n if (event.touches.length < 2 && event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n};\r\n\r\nconst withMultiSelection =\r\n ({ delay = 300 }: Config) =>\r\n (WrappedComponent: ComponentType) => {\r\n const HOC = (props: Props) => {\r\n const timeout = useRef();\r\n const target = useRef();\r\n const [multiple, setMultiple] = useState(false);\r\n const [activeRows, setActiveRows] = useState({});\r\n const [availableRows, setAvailableRows] = useState({});\r\n const enable = useCallback(() => {\r\n setMultiple(true);\r\n }, []);\r\n const disable = useCallback(() => {\r\n setMultiple(false);\r\n setActiveRows({});\r\n }, []);\r\n\r\n const isSelected = useCallback(\r\n (index) => activeRows.hasOwnProperty(index),\r\n [activeRows]\r\n );\r\n\r\n // Actions\r\n const handleAdd = useCallback(\r\n (id) =>\r\n setActiveRows((activeRows) =>\r\n produce(activeRows, (draft) => {\r\n /* istanbul ignore else */\r\n if (!draft.hasOwnProperty(id)) {\r\n draft[id] = availableRows[id];\r\n setMultiple(true);\r\n }\r\n })\r\n ),\r\n [availableRows]\r\n );\r\n const handleRemove = useCallback(\r\n (id) =>\r\n setActiveRows((activeRows) =>\r\n produce(activeRows, (draft) => {\r\n draft[id] = null;\r\n delete draft[id];\r\n Object.keys(draft).length === 0 &&\r\n setMultiple(false);\r\n })\r\n ),\r\n []\r\n );\r\n const handleToggle = useCallback(\r\n (id) =>\r\n setActiveRows((activeRows) =>\r\n produce(activeRows, (draft) => {\r\n if (draft.hasOwnProperty(id)) {\r\n draft[id] = null;\r\n delete draft[id];\r\n Object.keys(draft).length === 0 &&\r\n setMultiple(false);\r\n } else {\r\n draft[id] = availableRows[id];\r\n setMultiple(true);\r\n }\r\n })\r\n ),\r\n [availableRows]\r\n );\r\n const handleSelectAll = useCallback(\r\n () =>\r\n setActiveRows((activeRows) =>\r\n produce(activeRows, (draft) => {\r\n Object.keys(availableRows).forEach(\r\n /* istanbul ignore next */\r\n (id) => (draft[id] = availableRows[id])\r\n );\r\n })\r\n ),\r\n [availableRows]\r\n );\r\n const handleDeselectAll = useCallback(() => setActiveRows({}), []);\r\n const handleInvert = useCallback(\r\n () =>\r\n setActiveRows((activeRows) =>\r\n produce(activeRows, (draft) => {\r\n Object.keys(availableRows).forEach(\r\n /* istanbul ignore next */ (id) => {\r\n if (draft.hasOwnProperty(id)) {\r\n draft[id] = null;\r\n delete draft[id];\r\n } else {\r\n draft[id] = availableRows[id];\r\n }\r\n }\r\n );\r\n })\r\n ),\r\n [availableRows]\r\n );\r\n\r\n // Handle Longpress\r\n const on = useCallback((e) => {\r\n target.current = e.target;\r\n /* istanbul ignore else */\r\n if (target.current) {\r\n timeout.current = setTimeout(() => {\r\n setMultiple(true);\r\n e.target.addEventListener(\"touchend\", preventDefault, {\r\n passive: false,\r\n });\r\n }, delay);\r\n }\r\n }, []);\r\n\r\n const off = useCallback((e) => {\r\n timeout.current && clearTimeout(timeout.current);\r\n target.current &&\r\n target.current.removeEventListener(\r\n \"touchend\",\r\n preventDefault\r\n );\r\n }, []);\r\n\r\n const handler: MultiSelectionHandlers = useMemo(\r\n () => ({\r\n onTouchEnd: off,\r\n onTouchMove: off,\r\n onTouchStart: on,\r\n }),\r\n [on, off]\r\n );\r\n\r\n // Handle Esc\r\n const handleEsc = useCallback(\r\n (e: SyntheticKeyboardEvent<*>) => {\r\n /* istanbul ignore else */\r\n if (e.keyCode === 27) {\r\n e.preventDefault();\r\n disable();\r\n }\r\n },\r\n [disable]\r\n );\r\n useEffect(() => {\r\n window.document.addEventListener(\"keydown\", handleEsc);\r\n return () => {\r\n window.document.removeEventListener(\"keydown\", handleEsc);\r\n };\r\n }, [handleEsc]);\r\n\r\n // UI for multi selection\r\n const renderedBucket = useMemo(\r\n () => (\r\n \r\n ),\r\n [\r\n enable,\r\n disable,\r\n handleSelectAll,\r\n handleDeselectAll,\r\n handleInvert,\r\n activeRows,\r\n multiple,\r\n availableRows,\r\n ]\r\n );\r\n\r\n // UI for checkbox\r\n const renderCheckbox = useCallback(\r\n (index, className) => (\r\n \r\n ),\r\n [handleToggle, isSelected]\r\n );\r\n\r\n const actions: MultiSelectionActions = useMemo(\r\n () => ({\r\n handleAdd,\r\n handleRemove,\r\n handleToggle,\r\n handleSelectAll,\r\n handleDeselectAll,\r\n handleInvert,\r\n }),\r\n [\r\n handleAdd,\r\n handleRemove,\r\n handleToggle,\r\n handleSelectAll,\r\n handleDeselectAll,\r\n handleInvert,\r\n ]\r\n );\r\n\r\n const context: MultiSelectionContextProps = useMemo(\r\n () => ({\r\n handler,\r\n multiple,\r\n actions,\r\n isSelected,\r\n renderCheckbox,\r\n renderedBucket,\r\n }),\r\n [\r\n handler,\r\n multiple,\r\n actions,\r\n renderCheckbox,\r\n isSelected,\r\n renderedBucket,\r\n ]\r\n );\r\n\r\n const multiSelection: MultiSelectionProps = useMemo(\r\n () => ({\r\n actions,\r\n activeRows,\r\n availableRows,\r\n setAvailableRows,\r\n enable,\r\n disable,\r\n handler,\r\n multiple,\r\n isSelected,\r\n }),\r\n [\r\n handler,\r\n enable,\r\n disable,\r\n actions,\r\n activeRows,\r\n multiple,\r\n availableRows,\r\n isSelected,\r\n ]\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n };\r\n HOC.displayName = `withMultiSelection(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n return HOC;\r\n };\r\n\r\nexport default withMultiSelection;\r\n","// @flow\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { useEffectOnce } from \"hooks\";\r\nimport { Location } from \"history\";\r\nimport queryString from \"data/queryString\";\r\nimport { fetchSearchSuggestion } from \"data/api\";\r\nimport {\r\n type ApiError,\r\n type SearchFilterDTO,\r\n SearchValueType,\r\n} from \"data/types\";\r\nimport Constants, { getDisplayName } from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport PageStatus from \"components/PageStatus\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** React-router history object */\r\n location: Location,\r\n /** Redux-state current itemUri */\r\n itemUri: string,\r\n};\r\n\r\ntype Config = {\r\n /** whether we expect a doc ItemUri */\r\n docSearchProvider: boolean,\r\n};\r\n\r\nexport const isSearchParam = (p: string): boolean => {\r\n if (p == null) return false;\r\n const pSplit = p.split(\".\");\r\n if (pSplit.length === 1) {\r\n if ([\"searchtext\", \"advancedsearchtext\"].includes(p)) return true;\r\n else return false;\r\n }\r\n return [\r\n \"leafnode\",\r\n \"doc\",\r\n \"item\",\r\n \"allnodes\",\r\n \"folder\",\r\n \"itemany\",\r\n ].includes(pSplit[0]);\r\n};\r\n\r\n/**\r\n * HOC to handle searching for an itemUri by fulltext search filters passed as URL query parameters,\r\n * will then pass the result itemUri\r\n * @param {ComponentType} WrappedComponent children to render\r\n */\r\nconst SuggestionHandler =\r\n ({ docSearchProvider = false }: Config) =>\r\n (WrappedComponent: ComponentType) => {\r\n const HOC = ({ location, ...props }: Props) => {\r\n const itemUriFromLocation =\r\n \"pam-item://\" + queryString.parse(location.search).uri;\r\n const [status, setStatus] = useState(Constants.LOADING);\r\n const [errorDetail, setErrorDetail] = useState(null);\r\n const [itemUri, setItemUri] = useState(null);\r\n useEffectOnce(() => {\r\n if (itemUriFromLocation !== \"pam-item://undefined\") {\r\n setStatus(Constants.OK);\r\n setItemUri(itemUriFromLocation);\r\n return;\r\n }\r\n const qs = queryString.parse(location.search);\r\n // any specific provider or use default\r\n let provider = \"\";\r\n /* istanbul ignore else */\r\n if (qs.p) {\r\n provider = qs.p;\r\n delete qs.p;\r\n }\r\n // remove secureParams\r\n /* istanbul ignore else */\r\n if (qs.sp) {\r\n delete qs.sp;\r\n }\r\n // anything else should be a suggestion filter (/parameter)\r\n const filters: Array = Object.keys(qs)\r\n .filter((p) => isSearchParam(p.toLowerCase()))\r\n .map((p) => ({\r\n name: p,\r\n value: qs[p],\r\n valueType: SearchValueType.NotSet,\r\n }));\r\n // should we return a Doc ItemUri or a Folder one?\r\n if (provider.length === 0 && docSearchProvider === true)\r\n provider = \"DocSearchProvider\";\r\n\r\n fetchSearchSuggestion(provider, filters)\r\n .catch((err: ApiError) => {\r\n if (\r\n err.data &&\r\n err.data.eventId &&\r\n err.data.eventId.id ===\r\n 1540 /*SEARCH_SUGGESTION_NOTFOUND*/\r\n ) {\r\n setStatus(Constants.ERROR);\r\n setErrorDetail(\r\n \"Not Found! Please contact your administrator.\"\r\n );\r\n }\r\n return null;\r\n })\r\n .then((itemUri) => {\r\n if (\r\n itemUri !== null &&\r\n String(itemUri).length > 0 &&\r\n String(itemUri).startsWith(\"pam-item://\")\r\n ) {\r\n setStatus(Constants.OK);\r\n setItemUri(itemUri);\r\n } else {\r\n setStatus(Constants.ERROR);\r\n }\r\n });\r\n });\r\n useEffect(() => {\r\n if (\r\n status === Constants.OK &&\r\n itemUri != null &&\r\n itemUriFromLocation !== \"pam-item://undefined\"\r\n ) {\r\n setItemUri(itemUriFromLocation);\r\n }\r\n }, [itemUriFromLocation, itemUri, status]);\r\n switch (status) {\r\n case Constants.OK:\r\n // passthrough overriding with our suggested itemUri\r\n return (\r\n \r\n );\r\n case Constants.ERROR:\r\n return errorDetail == null ? (\r\n \r\n ) : (\r\n \r\n );\r\n default:\r\n return (\r\n \r\n );\r\n }\r\n };\r\n HOC.displayName = `SuggestionHandler(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n return HOC;\r\n };\r\n\r\nexport default SuggestionHandler;\r\n","//@flow\r\nimport React from \"react\";\r\nimport styles from \"./Error.module.css\";\r\n\r\ntype Props = {\r\n errorMessage: string,\r\n showValidationBelow: boolean,\r\n};\r\n\r\nexport default ({ errorMessage, showValidationBelow }: Props) => (\r\n <>\r\n \r\n {showValidationBelow && (\r\n

\r\n *{errorMessage}\r\n

\r\n )}\r\n \r\n);\r\n","// @flow\r\nimport React, { type Node } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport { withFormsy } from \"formsy-react\";\r\nimport FormGroup from \"react-bootstrap/lib/FormGroup\";\r\nimport AttributeLabel from \"components/ExtraAttributes/AttributeLabel.js\";\r\nimport Error from \"components/ExtraAttributes/Error.js\";\r\nimport styles from \"components/ExtraAttributes/AttributeLabel.module.css\";\r\n\r\nexport type FormsyEditorBaseDTO = {\r\n name: string,\r\n value: any,\r\n};\r\n\r\ntype Props = {\r\n /** class attribute for wrapper */\r\n baseClassName: string,\r\n /** label to display */\r\n header: string,\r\n /** unique field name */\r\n name: string,\r\n /** current field's value */\r\n value: string,\r\n /** React component to render after header before value */\r\n afterHeaderComponentClass?: Node,\r\n /** React component to render value */\r\n render: (value: any, changeValue: Function) => Node,\r\n /** Additional react component to render */\r\n additionalRender?: Node,\r\n /** Should Formsy Base render just the child? (No wrapping container) */\r\n isAdditionalRender: boolean,\r\n /** callback when value has been changed\r\n * @param {string} name field's name\r\n * @param {any} value new field's value\r\n */\r\n /** whether to render validation below */\r\n showValidationBelow: boolean,\r\n /** whether form field is required */\r\n isRequired: Boolean,\r\n onChange?: (name: string, value: any) => void,\r\n /** whether to show field's label */\r\n showLabel: boolean,\r\n /** withFormsy(): setValue */\r\n setValue: Function,\r\n /** withFormsy(): isValid */\r\n isValid: boolean,\r\n /** withFormsy(): errorMessage */\r\n errorMessage: ?string,\r\n /** callback when an attribute is edited\r\n * @param {string} name unique name of attribute being changed\r\n * @param {any} value new value\r\n */\r\n onChange: (name: string, value: any) => void,\r\n /** optional key to force refresh */\r\n loadIndex?: any,\r\n /** optional extras */\r\n extras?: any,\r\n};\r\n\r\ntype State = {\r\n /** whether form field is focused */\r\n focused: boolean,\r\n};\r\n\r\nexport class FormsyEditorBase extends React.Component {\r\n static defaultProps = {\r\n showLabel: true,\r\n isAdditionalRender: false,\r\n additionalRender: null,\r\n showValidationBelow: false,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n focused: false,\r\n };\r\n }\r\n\r\n _changeValue = (value: any) => {\r\n this.props.setValue(value);\r\n /* istanbul ignore else */\r\n if (typeof this.props.onChange === \"function\") {\r\n this.props.onChange(this.props.name, value);\r\n }\r\n };\r\n\r\n changeValue = (\r\n changed: SyntheticInputEvent<*> | Array\r\n ) => {\r\n if (\r\n changed &&\r\n Object.prototype.hasOwnProperty.call(changed, \"currentTarget\")\r\n ) {\r\n this._changeValue(changed.currentTarget.value);\r\n } else if (changed && Array.isArray(changed) && changed.length > 0) {\r\n changed.forEach(({ name, value }) => {\r\n if (this.props.name === name) {\r\n this._changeValue(value, true); // HACK: if array of objects, assume lookup and force re-render #51586\r\n } else if (typeof this.props.onChange === \"function\") {\r\n this.props.onChange(name, value);\r\n } else {\r\n console.warn(`Cannot update ${this.props.name}`);\r\n }\r\n });\r\n } else {\r\n console.warn(\r\n `Unknown changed type, cannot update ${this.props.name}`\r\n );\r\n }\r\n };\r\n\r\n /* istanbul ignore next */ _onFocus = () =>\r\n this.setState({ focused: true });\r\n\r\n /* istanbul ignore next */ _onBlur = () => {\r\n this.setState({ focused: true });\r\n };\r\n\r\n _renderField = () => (\r\n <>\r\n {this.props.render(\r\n this.props.value,\r\n this.changeValue,\r\n this.props.isValid\r\n )}\r\n {!this.props.isValid && (\r\n \r\n )}\r\n \r\n );\r\n\r\n render() {\r\n if (this.props.isAdditionalRender) {\r\n return this._renderField();\r\n }\r\n // console.log(this.props.name, this.props);\r\n // console.log(`render ${this.props.name}`, this.props.getValue());\r\n return (\r\n \r\n {this.props.showLabel && (\r\n \r\n )}\r\n {typeof this.props.afterHeaderComponentClass === \"function\" &&\r\n this.props.afterHeaderComponentClass()}\r\n
\r\n {this._renderField()}\r\n {this.props.additionalRender}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n showValidationBelow: !state.browser.greaterThanOrEqual.medium,\r\n ...ownProps,\r\n});\r\n\r\nconst FormsyEditorBaseContainer = compose(\r\n withFormsy,\r\n connect(mapStateToProps, null, null, { forwardRef: true })\r\n)(FormsyEditorBase);\r\n\r\nexport default FormsyEditorBaseContainer;\r\n","// @flow\r\nimport React from \"react\";\r\nimport LinkViewerControl from \"./LinkViewerControl\";\r\n\r\ntype Props = {\r\n name: string,\r\n header?: string,\r\n value: ?string,\r\n width?: number,\r\n isGridCell: boolean,\r\n};\r\n\r\nconst EmailViewerControl = ({\r\n name,\r\n header,\r\n value,\r\n width,\r\n isGridCell,\r\n}: Props) => (\r\n \r\n);\r\nEmailViewerControl.displayName = \"EmailViewerControl\";\r\nexport default EmailViewerControl;\r\n","// @flow\r\nimport React from \"react\";\r\nimport LinkViewerControl from \"./LinkViewerControl\";\r\n\r\ntype Props = {\r\n name: string,\r\n header?: string,\r\n value: ?string,\r\n width?: number,\r\n isGridCell: boolean,\r\n};\r\n\r\nconst TelViewerControl = ({\r\n name,\r\n header,\r\n value,\r\n width,\r\n isGridCell,\r\n}: Props) => (\r\n \r\n);\r\nTelViewerControl.displayName = \"TelViewerControl\";\r\nexport default TelViewerControl;\r\n","// @flow\r\nimport React, { useCallback } from \"react\";\r\nimport { useEffectOnce } from \"hooks\";\r\nimport { getDisplayName } from \"data/constants\";\r\n\r\ntype Props = {\r\n /** callback when user pressed the left arrow */\r\n onPrev?: () => void,\r\n /** callback when user pressed the right arrow */\r\n onNext?: () => void,\r\n};\r\n\r\n/** used by ImageViewer/InlineViewer to intercept left/right keyboard commands */\r\nconst ViewerKeysHandler = (WrappedComponent: ReactClass): Node => {\r\n const HOC = (props: Props) => {\r\n const { onNext, onPrev } = props;\r\n if (typeof onNext !== \"function\" || typeof onPrev !== \"function\") {\r\n console.warn(\"Missing onNext/onPrev callback\");\r\n }\r\n const handleKeyDown = useCallback(\r\n (e) => {\r\n // #43374 arrow keys during DocForm editing\r\n if (\r\n e.target?.classList?.contains(\"form-control\") ||\r\n e.target?.tagName === \"INPUT\"\r\n )\r\n return;\r\n\r\n const keyCode = e.keyCode || e.which || e.charCode;\r\n switch (keyCode) {\r\n case 39: // key: →\r\n /* istanbul ignore else */\r\n if (typeof onNext === \"function\") {\r\n e.preventDefault();\r\n onNext();\r\n }\r\n break;\r\n case 37: // key: ←\r\n /* istanbul ignore else */\r\n if (typeof onPrev === \"function\") {\r\n e.preventDefault();\r\n onPrev();\r\n }\r\n break;\r\n /* istanbul ignore next */\r\n default:\r\n break;\r\n }\r\n },\r\n [onNext, onPrev]\r\n );\r\n\r\n useEffectOnce(() => {\r\n window.document.addEventListener(\"keydown\", handleKeyDown, false);\r\n return () => {\r\n window.document.removeEventListener(\r\n \"keydown\",\r\n handleKeyDown,\r\n false\r\n );\r\n };\r\n });\r\n return ;\r\n };\r\n HOC.displayName = `ViewerKeysHandler(${getDisplayName(WrappedComponent)})`;\r\n return HOC;\r\n};\r\n\r\nexport default ViewerKeysHandler;\r\n","import React, { useMemo, useCallback } from \"react\";\r\nimport { useEffectOnce, usePersistSetting } from \"hooks\";\r\nimport SearchInput from \"@hs/search-input\";\r\nimport loc from \"i18next\";\r\nimport ToggleButtonGroup from \"react-bootstrap/lib/ToggleButtonGroup\";\r\nimport ToggleButton from \"react-bootstrap/lib/ToggleButton\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport styles from \"./TreeFilter.module.css\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\ntype Props = {\r\n /** current text filter */\r\n filter: string,\r\n /** whether to allow subfolders */\r\n allowSubfolders?: boolean,\r\n /** whether to include subfolders */\r\n includeSubfolders: boolean,\r\n /** callback when user changes filter and/or includeSubfolders */\r\n onChange: (filter: string, includeSubfolders: boolean) => void,\r\n};\r\n\r\nconst TreeFilter = ({\r\n filter,\r\n includeSubfolders,\r\n onChange,\r\n allowSubfolders = false,\r\n}: Props) => {\r\n const isOnline = useSelector(s.isOnlineSelector);\r\n const [\r\n persisted_includeSubfolders,\r\n persisted_setIncludeSubfolders,\r\n ] = usePersistSetting({\r\n name: \"treeFilter.includeSubfolders\",\r\n default: false,\r\n });\r\n\r\n // onMount make sure we use the persisted value\r\n useEffectOnce(() => {\r\n if (!isOnline) {\r\n onChange(filter, false);\r\n } else {\r\n if (includeSubfolders !== persisted_includeSubfolders) {\r\n onChange(filter, persisted_includeSubfolders);\r\n }\r\n }\r\n });\r\n\r\n const changeFilter = useCallback(\r\n (value: ?string) => onChange(value || \"\", includeSubfolders),\r\n [onChange, includeSubfolders]\r\n );\r\n\r\n const toggleSubfolders = useCallback(() => {\r\n persisted_setIncludeSubfolders(!includeSubfolders);\r\n onChange(filter, !includeSubfolders);\r\n }, [persisted_setIncludeSubfolders, onChange, includeSubfolders, filter]);\r\n\r\n const placeholderText = useMemo(\r\n () =>\r\n includeSubfolders\r\n ? loc.t(\"folder:treefilter.deep.text\")\r\n : loc.t(\"folder:treefilter.shallow.text\"),\r\n [includeSubfolders]\r\n );\r\n const toggleTitle = useMemo(\r\n () =>\r\n includeSubfolders\r\n ? loc.t(\"folder:treefilter.shallow.title\")\r\n : loc.t(\"folder:treefilter.deep.title\"),\r\n [includeSubfolders]\r\n );\r\n\r\n return (\r\n
\r\n {isOnline && allowSubfolders && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n {/* */}\r\n
\r\n );\r\n};\r\nexport default TreeFilter;\r\n","import { useRef } from \"react\";\r\nimport { useUnmount, usePostMessageHandler } from \"hooks\";\r\nimport { toastStyled, dismissToast, toastTypes, toastId } from \"data/toast\";\r\nimport { PdfSignatureAction } from \"hooks/PostMessage/Actions\";\r\nimport loc from \"i18next\";\r\n\r\n/**\r\n * handles messaging with pdfJs to alert user of invalidated PDF Signature\r\n */\r\nconst useHandleSignedPdf = () => {\r\n const toastRef = useRef(null);\r\n // register callback from pdf.js\r\n usePostMessageHandler({\r\n [PdfSignatureAction]: () => {\r\n if (toastRef.current == null) {\r\n toastRef.current = toastStyled({\r\n ...toastTypes.pdfSignature,\r\n message: loc.t(\"docmodal:signedPdf\"),\r\n });\r\n }\r\n },\r\n });\r\n\r\n // dismiss Toast in case user just closed the DocViewer\r\n useUnmount(() => dismissToast(toastId.PdfJs));\r\n};\r\n\r\nexport default useHandleSignedPdf;\r\n","import { useCallback } from \"react\";\r\nimport { usePostMessageHandler } from \"hooks\";\r\nimport doc_print from \"components/CommandActions/doc_print\";\r\nimport { PdfPrintAction } from \"hooks/PostMessage/Actions\";\r\n\r\n/**\r\n * handles messaging with pdfJs to toggle print dialog\r\n */\r\nconst useHandlePdfPrint = (target, triggerPrint) => {\r\n const handleTriggerPrint = useCallback(() => {\r\n if (target == null) {\r\n return;\r\n }\r\n new doc_print().execute({ target });\r\n }, [target]);\r\n usePostMessageHandler({\r\n [PdfPrintAction]: handleTriggerPrint,\r\n });\r\n if (triggerPrint) {\r\n handleTriggerPrint();\r\n }\r\n};\r\n\r\nexport default useHandlePdfPrint;\r\n","// @flow\r\nimport { useMemo } from \"react\";\r\nimport { downloadDocToken } from \"data/api\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\n\r\ntype Props = {\r\n /** document download token */\r\n token: string,\r\n /** whether document is a PDF file */\r\n isPdf: boolean,\r\n /**pdf.js: search terms */\r\n searchTerm: ?string,\r\n};\r\n\r\n/**\r\n * returns a full ViewerUrl including one-time-access download link\r\n * @param {*} { token, pdf, searchTerm }\r\n * @returns\r\n */\r\nconst useViewerUrl = ({ token, isPdf, searchTerm }: Props) => {\r\n // builds the one-time-download link\r\n const getDocUrl: string = useMemo(\r\n () =>\r\n downloadDocToken(\r\n token,\r\n !isPdf, //this.props.inline\r\n isPdf\r\n ),\r\n [token, isPdf]\r\n );\r\n\r\n // builds the full pdfJs viewer url\r\n const getViewerUrl: string = useMemo(\r\n () =>\r\n isPdf\r\n ? `${\r\n process.env.PUBLIC_URL || \"\"\r\n }/__pdfjs/web/viewer.html?file=${encodeURIComponent(\r\n getDocUrl\r\n )}#locale=${userLanguage()}${\r\n searchTerm != null ? `&search=${searchTerm}` : \"\"\r\n }`\r\n : getDocUrl,\r\n [isPdf, getDocUrl, searchTerm]\r\n );\r\n\r\n return getViewerUrl;\r\n};\r\n\r\nexport default useViewerUrl;\r\n","import { useCallback } from \"react\";\r\n/**\r\n * handles navigating between different documents using keyboard arrows\r\n *\r\n * @param {*} { _iframe, onNext, onPrev, onPdfReady }\r\n * @returns\r\n */\r\nconst usePdfArrowNavigation = ({ iframe, onNext, onPrev, onPdfReady }) => {\r\n // handle onPrev/onNext\r\n const onKeyDown = useCallback(\r\n (e: SyntheticKeyboardEvent<*>) => {\r\n const allowNav =\r\n !iframe.current.contentWindow.PDFViewerApplication.pdfViewer\r\n .isHorizontalScrollbarEnabled;\r\n switch (e.keyCode) {\r\n case 27: //Escape - close\r\n var event = document.createEvent(\"Event\");\r\n event.initEvent(\"keydown\", true, true);\r\n event.keyCode = 27;\r\n document.dispatchEvent(event);\r\n break;\r\n case 39: // right\r\n /* istanbul ignore else */\r\n if (\r\n iframe.current != null &&\r\n typeof onNext === \"function\" &&\r\n allowNav\r\n ) {\r\n onNext();\r\n }\r\n break;\r\n case 37: // left\r\n /* istanbul ignore else */\r\n if (\r\n iframe.current != null &&\r\n typeof onPrev === \"function\" &&\r\n allowNav\r\n ) {\r\n onPrev();\r\n }\r\n break;\r\n /* istanbul ignore next */\r\n default:\r\n break;\r\n }\r\n },\r\n [iframe, onNext, onPrev]\r\n );\r\n\r\n // once iframe loads register our events\r\n const onLoad = useCallback(() => {\r\n /* istanbul ignore else */\r\n if (iframe.current != null) {\r\n iframe.current.contentWindow.addEventListener(\"keydown\", onKeyDown);\r\n iframe.current.contentWindow.document.addEventListener(\r\n \"textlayerrendered\",\r\n onPdfReady,\r\n true\r\n );\r\n }\r\n }, [iframe, onPdfReady, onKeyDown]);\r\n\r\n return { onLoad };\r\n};\r\n\r\nexport default usePdfArrowNavigation;\r\n","// @flow\r\nimport React, { useRef, useCallback } from \"react\";\r\nimport { usePdfHighlight } from \"hooks\";\r\nimport useHandleSignedPdf from \"./HandleSignedPdf\";\r\nimport useHandlePdfPrint from \"./HandlePdfPrint\";\r\nimport useViewerUrl from \"./ViewerUrl\";\r\nimport usePdfArrowNavigation from \"./PdfArrowNavigation\";\r\n\r\ntype Props = {\r\n /** document download token */\r\n token: string,\r\n /** whether document is a PDF file */\r\n pdf: boolean,\r\n /** callback when user click on Prev */\r\n onPrev?: () => void,\r\n /** callback when user click on Next */\r\n onNext?: () => void,\r\n /**pdf.js: search terms */\r\n searchTerm?: string,\r\n /** pdf.js: whether trigger browser print */\r\n triggerPrint: boolean,\r\n};\r\n\r\nconst DocViewer = ({\r\n token,\r\n pdf,\r\n onPrev,\r\n onNext,\r\n searchTerm,\r\n triggerPrint,\r\n}: Props) => {\r\n const iframe = useRef(null);\r\n const [target, setTarget] = usePdfHighlight();\r\n useHandleSignedPdf();\r\n useHandlePdfPrint(target, triggerPrint);\r\n\r\n const viewerUrl = useViewerUrl({ token, isPdf: pdf, searchTerm });\r\n\r\n // setup pdfJs once ready\r\n const onPdfReady = useCallback(() => {\r\n /* istanbul ignore else */\r\n if (iframe.current != null) {\r\n setTarget(iframe.current.contentWindow);\r\n iframe.current.contentWindow.PDFViewerApplication.pdfViewer.focus();\r\n }\r\n }, [iframe, setTarget]);\r\n\r\n const { onLoad } = usePdfArrowNavigation({\r\n iframe,\r\n onNext,\r\n onPrev,\r\n onPdfReady,\r\n });\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default DocViewer;\r\n","// @flow\r\nimport React, { useCallback } from \"react\";\r\nimport { downloadDocUri } from \"data/api\";\r\nimport ViewerKeysHandler from \"containers/ViewerKeysHandler\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport \"./index.css\";\r\n\r\nconst InlineViewer = ({\r\n itemUri,\r\n isDocDownloadAllowed,\r\n}: {\r\n itemUri: string,\r\n isDocDownloadAllowed: boolean,\r\n}) => {\r\n const handleClick = useCallback(\r\n (e) =>\r\n downloadDocUri(itemUri).then((uri) => {\r\n window.location.assign(uri);\r\n }),\r\n [itemUri]\r\n );\r\n return (\r\n
\r\n {loc.t(\"common:noviewer\")}\r\n {isDocDownloadAllowed && (\r\n <>\r\n
\r\n
\r\n \r\n
\r\n
\r\n {loc.t(\"common:download\")}\r\n
\r\n \r\n )}\r\n
\r\n );\r\n};\r\nInlineViewer.displayName = \"InlineViewer\";\r\nexport default ViewerKeysHandler(InlineViewer);\r\n","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { compose } from \"redux\";\r\nimport DocViewer from \"components/DocViewer\";\r\nimport InlineViewer from \"components/InlineViewer\";\r\nimport LoadingIframe from \"components/LoadingIframe\";\r\nimport { fetchDownloadToken } from \"data/api\";\r\nimport {\r\n LoadingType,\r\n ServerEventActionType,\r\n ServerEventItemType,\r\n type DocInfoResultWithTokenDTO,\r\n DocsFlags,\r\n} from \"data/types\";\r\nimport Status from \"components/Status\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport GlobalEventsHandler from \"containers/GlobalEventsHandler\";\r\nimport Loader from \"components/Loader\";\r\nimport withOfflineHandler from \"containers/OfflineHandler\";\r\n\r\n/* istanbul ignore next */\r\nconst MediaViewer = Loader(\r\n {\r\n loader: () =>\r\n import(\r\n \"components/MediaViewer\" /* webpackChunkName: \"component-MediaViewer\" */\r\n ),\r\n },\r\n LoadingType.Status\r\n);\r\n\r\n/* istanbul ignore next */\r\nconst ImageViewer = Loader(\r\n {\r\n loader: () =>\r\n import(\r\n \"components/ImageViewer\" /* webpackChunkName: \"component-ImageViewer\" */\r\n ),\r\n },\r\n LoadingType.Status\r\n);\r\n\r\ntype Props = {\r\n /** current itemUri to display */\r\n itemUri?: ?string,\r\n /** callback when we have docInfo\r\n * @param {DocInfoResultWithTokenDTO} docInfo document info result\r\n */\r\n onDocInfoResult?: (docInfo: DocInfoResultWithTokenDTO) => void,\r\n /** callback when user clicks left arrow */\r\n onPrev?: () => void,\r\n /** callback when user clicks right arrow */\r\n onNext?: () => void,\r\n /** GlobalEventsHandler.refreshId */\r\n refreshId: number,\r\n /**pdf.js: search terms */\r\n searchTerm?: string,\r\n /** pdf.js: whether trigger browser print */\r\n triggerPrint: boolean,\r\n};\r\n\r\ntype State = {\r\n status: ConstantsEnum,\r\n currentViewer: string,\r\n pdf: boolean,\r\n itemUri: ?string,\r\n isDocDownloadAllowed: boolean,\r\n token: ?string,\r\n customViewerUrl: ?string,\r\n};\r\n\r\nexport class DocViewerContainer extends PureComponent {\r\n state = {\r\n status: Constants.LOADING,\r\n currentViewer: \"pdfJs\",\r\n pdf: true,\r\n itemUri: null,\r\n isDocDownloadAllowed: false,\r\n token: null,\r\n customViewerUrl: null,\r\n };\r\n\r\n componentDidMount() {\r\n this._fetch(this.props.itemUri);\r\n }\r\n\r\n componentDidUpdate(prevProps: Props): void {\r\n /* istanbul ignore else */\r\n if (\r\n prevProps.itemUri !== this.props.itemUri ||\r\n prevProps.refreshId !== this.props.refreshId\r\n ) {\r\n this._fetch(this.props.itemUri);\r\n }\r\n }\r\n\r\n _fetch = (itemUri?: ?string): void => {\r\n /* istanbul ignore else */\r\n if (itemUri != null) {\r\n this.setState({ status: Constants.LOADING }, () =>\r\n this.props.offlineHandler\r\n .factory(fetchDownloadToken)(itemUri)\r\n .catch((err) => {\r\n this.setState({ status: Constants.ERROR });\r\n return null;\r\n })\r\n .then((result: DocInfoResultWithTokenDTO) => {\r\n if (result !== null) {\r\n const { onDocInfoResult } = this.props;\r\n if (typeof onDocInfoResult === \"function\")\r\n onDocInfoResult(result);\r\n this.setState(\r\n this._getUsableViewer(result, \"pdfJs\", itemUri)\r\n );\r\n }\r\n })\r\n );\r\n }\r\n };\r\n\r\n _getUsableViewer = (\r\n result: DocInfoResultWithTokenDTO,\r\n docViewer: \"inline\" | \"pdfJs\",\r\n itemUri: ?string\r\n ): State => {\r\n const isDocDownloadAllowed = !(\r\n ~result.flags & DocsFlags.IsDocDownloadAllowed\r\n );\r\n if (Object.prototype.hasOwnProperty.call(result, \"customViewerUrl\")) {\r\n return {\r\n currentViewer: \"customViewerUrl\",\r\n customViewerUrl: result.customViewerUrl,\r\n pdf: false,\r\n status: Constants.OK,\r\n itemUri,\r\n isDocDownloadAllowed,\r\n };\r\n }\r\n // #42627 integrated image viewer\r\n if (\r\n window.CONFIG.general.imageViewerExtensions.includes(\r\n String(result.ext).toLowerCase()\r\n )\r\n ) {\r\n return {\r\n token: result.token,\r\n currentViewer: \"image\",\r\n pdf: false,\r\n status: Constants.OK,\r\n itemUri,\r\n isDocDownloadAllowed,\r\n };\r\n }\r\n\r\n if (\r\n window.CONFIG.general.mediaViewerExtensions.includes(\r\n String(result.ext).toLowerCase()\r\n )\r\n ) {\r\n return {\r\n token: result.token,\r\n currentViewer: \"media\",\r\n pdf: false,\r\n status: Constants.OK,\r\n itemUri,\r\n isDocDownloadAllowed,\r\n };\r\n }\r\n\r\n if (\r\n docViewer === \"pdfJs\" &&\r\n !result.isPdf &&\r\n !result.hasPdf &&\r\n !result.canPdf\r\n ) {\r\n console.warn(`is/has/canPdf is false for ${result.name})`);\r\n // will fallback to inline and show original file\r\n return {\r\n token: result.token,\r\n currentViewer: \"inline\",\r\n pdf: false,\r\n status: Constants.OK,\r\n itemUri,\r\n isDocDownloadAllowed,\r\n };\r\n } else {\r\n return {\r\n token: result.token,\r\n currentViewer: docViewer,\r\n pdf: true,\r\n status: Constants.OK,\r\n itemUri,\r\n isDocDownloadAllowed,\r\n };\r\n }\r\n };\r\n\r\n render() {\r\n const { pdf, status, itemUri } = this.state;\r\n /* istanbul ignore else */\r\n if (itemUri == null || status !== Constants.OK)\r\n return (\r\n \r\n );\r\n\r\n /* istanbul ignore next */\r\n switch (this.state.currentViewer) {\r\n case \"customViewerUrl\":\r\n return (\r\n \r\n );\r\n case \"image\":\r\n return (\r\n \r\n );\r\n case \"media\":\r\n return (\r\n \r\n );\r\n case \"inline\":\r\n return (\r\n \r\n );\r\n case \"pdfJs\":\r\n return (\r\n \r\n );\r\n default:\r\n alert(\r\n `Unknown docViewer: ${window.CONFIG.general.docViewer} !`\r\n );\r\n break;\r\n }\r\n }\r\n}\r\n\r\nexport default compose(\r\n GlobalEventsHandler({\r\n actions: [\r\n ServerEventActionType.modify,\r\n ServerEventActionType.edit,\r\n ServerEventActionType.refresh,\r\n ],\r\n items: [ServerEventItemType.document],\r\n }),\r\n withOfflineHandler\r\n)(DocViewerContainer);\r\n","// @flow\r\nimport React from \"react\";\r\nimport { useToggle } from \"hooks\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** title to show on hover */\r\n title: string,\r\n /** whether the narrow state is disabled */\r\n toggled: boolean,\r\n /** icon to show instead of components */\r\n icon: string,\r\n /** label to show next to icon */\r\n label: string,\r\n /** whether to render narrow layout (icon only, input on focus) */\r\n narrow: boolean,\r\n /** react component to render icon in, defaults to Bootstrap Button */\r\n Component: ?any,\r\n};\r\n\r\nconst NarrowToggle = ({\r\n className,\r\n title,\r\n toggled,\r\n icon,\r\n label,\r\n narrow,\r\n children,\r\n Component = Button,\r\n}: Props) => {\r\n const [isToggled, setIsToggled] = useToggle(toggled);\r\n return narrow && !isToggled ? (\r\n setIsToggled(true)}\r\n >\r\n {\" \"}\r\n {label}\r\n \r\n ) : (\r\n <>\r\n {children}\r\n {narrow && (\r\n setIsToggled(false)}\r\n >\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default NarrowToggle;\r\n","// @flow\r\nimport React from \"react\";\r\nimport AbsoluteDropdown from \"components/AbsoluteDropdown\";\r\nimport Dropdown from \"react-bootstrap/lib/Dropdown\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport SearchBucket from \"./SearchBucket\";\r\nimport loc from \"i18next\";\r\n// import \"font-awesome/css/font-awesome.css\";\r\n// import FontAwesome from \"react-fontawesome\";\r\n\r\ntype Props = {\r\n buckets: Array,\r\n onSelect: (name: string, value: Object) => void,\r\n isDisabled: boolean,\r\n};\r\n\r\nconst CombinedFiltersMenu = ({ buckets, onSelect, isDisabled }: Props) => {\r\n if (buckets.length === 0) return null;\r\n return (\r\n \r\n \r\n {/* {\" \"} */}\r\n {loc.t(\"actionCategory:filter.name\")}\r\n \r\n \r\n {buckets.map((bucket, i) => (\r\n \r\n onSelect({\r\n name: bucket.name,\r\n value: null,\r\n })\r\n }\r\n >\r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\nCombinedFiltersMenu.displayName = \"FilterBar.CombinedFiltersMenu\";\r\n\r\nexport default CombinedFiltersMenu;\r\n","// @flow\r\nimport React, { useState, useEffect, useContext } from \"react\";\r\nimport { useToggle } from \"hooks\";\r\nimport { PaneSizeContext, MultiSelectionContext } from \"data/context\";\r\nimport {\r\n type SearchBucketDTO,\r\n type ListViewModeEnum,\r\n ListViewMode,\r\n} from \"data/types\";\r\nimport { connect } from \"react-redux\";\r\nimport ButtonToolbar from \"react-bootstrap/lib/ButtonToolbar\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport \"./index.css\";\r\nimport loc from \"i18next\";\r\nimport Measure from \"react-measure\";\r\nimport NarrowToggle from \"components/NarrowToggle\";\r\nimport SearchBucket from \"./SearchBucket\";\r\nimport CombinedFiltersMenu from \"./CombinedFiltersMenu\";\r\nimport ViewModes from \"./ViewModes\";\r\nimport SearchInput from \"@hs/search-input\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n className?: string,\r\n /** list of filters (and if any possible values) to show */\r\n buckets: Array,\r\n /** callback when user selects a filter\r\n * @param {string} name field's common name\r\n * @param {Object} value the actual value selected\r\n */\r\n onSelect: ({\r\n name: string,\r\n value: Object,\r\n }) => void,\r\n /** current filterText value */\r\n filterText: ?string,\r\n /** callback when user wants to quickly filter by text */\r\n onFilterTextChange?: (value: ?string) => void,\r\n /** placeholder text to display on quick text filter */\r\n filterTextPlaceholder?: string,\r\n /** callback when user wants to clear/reset all filter values */\r\n onClear?: () => void,\r\n /** whether to show the clear/reset button */\r\n showClear?: boolean,\r\n /** current viewMode */\r\n viewMode: ListViewModeEnum,\r\n /** which view modes to show/allow */\r\n viewModes?: Array,\r\n /** callback when user changes viewMode\r\n * @param {ListViewModeEnum} viewMode the viewMode the user chose\r\n */\r\n onViewModeChange: (viewMode: ListViewModeEnum) => void,\r\n /** whether filter should be rendered */\r\n renderFilter: ?boolean,\r\n /** whether filter should be disabled */\r\n disableFilter: ?boolen,\r\n /** maxHeight allowed for FilteBar, before toggeling narrow mode, defaults to 41 pixels */\r\n maxHeight: ?number,\r\n};\r\n\r\nconst FilterBar = ({\r\n className,\r\n buckets,\r\n onSelect,\r\n onClear,\r\n showClear,\r\n filterText,\r\n onFilterTextChange,\r\n filterTextPlaceholder,\r\n viewMode = ListViewMode.List,\r\n viewModes,\r\n onViewModeChange,\r\n browser,\r\n renderFilter = true,\r\n disableFilter = false,\r\n maxHeight = 42,\r\n}: Props) => {\r\n // Fallback if context is not set.\r\n const dimensions = useContext(PaneSizeContext) || { width: 0, height: 0 };\r\n /* istanbul ignore next */\r\n const { multiple, renderedBucket } = useContext(MultiSelectionContext) || {\r\n multiple: false,\r\n renderedBucket: null,\r\n };\r\n const [height, setHeight] = useState(0);\r\n const [maxWidth, setMaxWidth] = useState(0);\r\n const [isNarrow, setIsNarrow] = useToggle(false);\r\n useEffect(() => {\r\n if (maxWidth > 0 && dimensions.width <= maxWidth) {\r\n // dimensions reach maxwidth\r\n setIsNarrow(true);\r\n } else if (maxWidth === 0 && height > maxHeight) {\r\n // onMeasure could have been called before dimensions where ready\r\n setIsNarrow(true);\r\n setMaxWidth(dimensions.width);\r\n } else if (!browser.greaterThanOrEqual.medium) {\r\n // mobile always render narrow\r\n setIsNarrow(true);\r\n } else {\r\n // default is not narrow\r\n setIsNarrow(false);\r\n }\r\n }, [\r\n browser.greaterThanOrEqual.medium,\r\n maxWidth,\r\n dimensions.width,\r\n height,\r\n maxHeight,\r\n setIsNarrow,\r\n ]);\r\n return (\r\n {\r\n if (measure.height > maxHeight) {\r\n setIsNarrow(true);\r\n setMaxWidth(dimensions.width);\r\n }\r\n setHeight(measure.height);\r\n }}\r\n >\r\n {({ measureRef }) => (\r\n \r\n \r\n {renderFilter && (\r\n <>\r\n {typeof onFilterTextChange === \"function\" && (\r\n \r\n )}\r\n \r\n \r\n item.visible !== false &&\r\n item.hideMenu === true &&\r\n item.selected.length === 0\r\n )}\r\n />\r\n {typeof onClear === \"function\" &&\r\n showClear === true && (\r\n \r\n \r\n \r\n )}\r\n {buckets\r\n .filter(\r\n (item) =>\r\n item.visible !== false &&\r\n (item.hideMenu !== true ||\r\n item.selected.length > 0)\r\n )\r\n .map((item, i) => (\r\n \r\n ))}\r\n {!disableFilter && renderedBucket}\r\n \r\n \r\n )}\r\n {viewModes && (\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nFilterBar.displayName = \"FilterBar\";\r\n\r\nexport { FilterBar };\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n browser: state.browser,\r\n ...ownProps,\r\n});\r\n\r\nexport default connect(mapStateToProps)(FilterBar);\r\n","// @flow\r\nimport React, { useCallback, useMemo } from \"react\";\r\nimport Badge from \"react-bootstrap/lib/Badge\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport Icons from \"@hs/icons\";\r\nimport Mark from \"@hs/mark\";\r\nimport { type TreeItemDTO } from \"data/types\";\r\nimport Tree from \"components/Tree\";\r\nimport styles from \"./FolderTree.module.css\";\r\nimport { BrowserDragLink } from \"components/ItemUriLink\";\r\nimport { getLocalizedText, isValidItemUri } from \"data/utils\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** current node id to mark as active */\r\n activeTreeNodeId: number,\r\n /** tree items */\r\n tree: Array,\r\n /** callback when user clicks a tree item\r\n * @param {TreeItemDTO} treeItem tree item's object the user clicked\r\n * @param {SyntheticMouseEvent<*>} e HTML event object\r\n */\r\n onClick: (treeItem: TreeItemDTO, e: SyntheticMouseEvent<*>) => void,\r\n /** callback when user double-click a tree item\r\n * @param {TreeItemDTO} treeItem tree item's object the user clicked\r\n */\r\n onDoubleClick: (treeItem: TreeItemDTO) => void,\r\n /** callback when user expands a tree item\r\n * @param {TreeItemDTO} treeItem tree item's object the user clicked\r\n * @param {SyntheticMouseEvent<*>} e HTML event object\r\n */\r\n onExpand: (treeItem: TreeItemDTO, e: SyntheticMouseEvent<*>) => void,\r\n /** callback when user wants to load more results */\r\n onLoadMore: () => void,\r\n /** filter text currently applied */\r\n filter?: string,\r\n /** optional NoData Content Component */\r\n NoDataContent: Element,\r\n /** total number of results available */\r\n totalCount: number,\r\n /** whether list is currently focused\r\n * @default {boolean} true\r\n */\r\n focused?: boolean,\r\n};\r\n\r\nconst FolderTree = ({\r\n activeTreeNodeId,\r\n tree,\r\n onClick,\r\n onDoubleClick,\r\n onExpand,\r\n onLoadMore,\r\n filter,\r\n NoDataContent,\r\n totalCount,\r\n focused = true,\r\n}: Props) => {\r\n const _hasMore = useMemo(\r\n () => tree && totalCount > tree.length,\r\n [totalCount, tree]\r\n );\r\n\r\n const _renderRow = useCallback(\r\n ({\r\n key, // Unique key within array of rows\r\n index, // Index of row within collection\r\n isScrolling, // The List is currently being scrolled\r\n isVisible, // This row is visible within the List (eg it is not an overscanned row)\r\n style, // Style object to be applied to row (to position it)\r\n }: {\r\n key: number,\r\n index: number,\r\n isScrolling: boolean,\r\n isVisible: boolean,\r\n style: StyleSheet,\r\n }) => {\r\n if (_hasMore && index === tree.length) {\r\n return (\r\n \r\n {loc.t(\"folder:treefilter.loadmore\")}\r\n {\" \"}\r\n \r\n \r\n );\r\n }\r\n const treeItem = tree[index];\r\n /* istanbul ignore next */\r\n const localizedWebDavName = isValidItemUri(treeItem.itemUri)\r\n ? treeItem.webDavName\r\n : getLocalizedText(treeItem.webDavName);\r\n return (\r\n onDoubleClick(treeItem)\r\n }\r\n onClick={\r\n /* istanbul ignore next */ (e) => onClick(treeItem, e)\r\n }\r\n data-test=\"folderTreeRow\"\r\n >\r\n \r\n onExpand(treeItem, e)\r\n }\r\n >\r\n {treeItem.numberOfChildren > 0 && (\r\n \r\n )}\r\n {treeItem.numberOfChildren === 0 && (\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n {localizedWebDavName}\r\n \r\n {treeItem.numberOfChildren > 0 && (\r\n \r\n {loc.format(treeItem.numberOfChildren, \"pretty\")}\r\n \r\n )}\r\n \r\n );\r\n },\r\n [\r\n tree,\r\n onClick,\r\n onDoubleClick,\r\n onExpand,\r\n onLoadMore,\r\n filter,\r\n activeTreeNodeId,\r\n _hasMore,\r\n ]\r\n );\r\n\r\n const _getActiveTreeNodeIndex = useCallback(\r\n () =>\r\n tree ? tree.findIndex((row) => row.id === activeTreeNodeId) : -1,\r\n [tree, activeTreeNodeId]\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default FolderTree;\r\n","// @flow\r\nimport React, { useState, useEffect, useCallback, type Element } from \"react\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport FolderTree from \"components/FolderTree\";\r\nimport { isValidItemUri } from \"data/utils\";\r\nimport { getTreeAction, togglesUpdateCounterAction } from \"data/actions\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport {\r\n ServerEventActionType,\r\n ServerEventItemType,\r\n type TreeItemDTO,\r\n} from \"data/types\";\r\nimport Constants from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport GlobalEventsHandler from \"containers/GlobalEventsHandler\";\r\nimport NoData from \"components/NoData\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** current itemUri */\r\n itemUri: string,\r\n /** current selected tree node's id */\r\n activeTreeNodeId: number,\r\n /** text filtering */\r\n filter: ?string,\r\n /** whether to include subfolders when text filtering */\r\n includeSubfolders: boolean,\r\n /** callback when a tree item is clicked\r\n * @param {string} itemUri tree node's itemUri * @param {number} nodeId tree node's id\r\n */\r\n onClick: (itemUri: string, nodeId: number) => void,\r\n /** callback when a tree item is expanded\r\n * @param {string} itemUri tree node's itemUri\r\n */\r\n onExpand: (itemUri: string) => void,\r\n /** callback when tree is being scrolled */\r\n onScroll?: () => void,\r\n /** GlobalEventsHandler.refreshId */\r\n refreshId: number,\r\n /** optional NoData Content Component */\r\n NoDataContent: Element,\r\n /** whether list is currently focused\r\n * @default {boolean} true\r\n */\r\n focused?: boolean,\r\n};\r\n\r\nexport const FolderTreeContainer = ({\r\n itemUri,\r\n activeTreeNodeId,\r\n filter,\r\n includeSubfolders,\r\n onClick,\r\n onExpand,\r\n onScroll,\r\n refreshId,\r\n NoDataContent,\r\n focused = true,\r\n}: Props) => {\r\n const dispatch = useDispatch();\r\n // redux state\r\n const status = useSelector(s.treeStatusSelector);\r\n const error = useSelector(s.treeErrorSelector);\r\n const treeNodes = useSelector(s.treeNodesSelector);\r\n const totalCount = useSelector(s.treeTotalCountSelector);\r\n const isBrowsable = useSelector(s.treeIsBrowsableSelector);\r\n\r\n const [all, setAll] = useState(false);\r\n\r\n const _updateToggleCounter = useCallback(\r\n (count: number, loading?: boolean, status?: string): void =>\r\n dispatch(\r\n togglesUpdateCounterAction({\r\n name: \"folder\",\r\n counts: { tree: count },\r\n status: {\r\n tree: loading === true ? Constants.LOADING : status,\r\n },\r\n })\r\n ),\r\n [dispatch /*, treeNodes, totalCount, filter*/]\r\n );\r\n\r\n useEffect(() => {\r\n /* istanbul ignore else */\r\n if (itemUri && isValidItemUri(itemUri)) {\r\n // fetch results\r\n dispatch(\r\n getTreeAction({\r\n itemUri,\r\n filter,\r\n deep: includeSubfolders,\r\n all: false,\r\n })\r\n );\r\n setAll(false);\r\n }\r\n }, [\r\n dispatch,\r\n itemUri,\r\n filter,\r\n includeSubfolders,\r\n refreshId,\r\n _updateToggleCounter,\r\n ]);\r\n\r\n // update tree toggle:\r\n // show totalCount of results,\r\n // show if results are filtered,\r\n // show if there are more results available\r\n useEffect(() => {\r\n if (status === Constants.OK)\r\n _updateToggleCounter(\r\n totalCount,\r\n false,\r\n filter && String(filter).length > 0\r\n ? \"filter\"\r\n : treeNodes && treeNodes.length < totalCount\r\n ? \"step-forward\"\r\n : null\r\n );\r\n else if (status === Constants.LOADING)\r\n // start loading icon\r\n _updateToggleCounter(0, true);\r\n }, [_updateToggleCounter, totalCount, status, treeNodes, filter]);\r\n\r\n // user clicks a tree node\r\n const _onClick = useCallback(\r\n (treeNode: TreeItemDTO, e?: SyntheticMouseEvent<*>) => {\r\n /* istanbul ignore next */\r\n if (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n onClick(treeNode.itemUri, treeNode.id);\r\n },\r\n [onClick]\r\n );\r\n\r\n // user expands a tree node\r\n const _onExpand = (treeNode: TreeItemDTO, e?: SyntheticMouseEvent<*>) => {\r\n /* istanbul ignore else */\r\n if (!isValidItemUri(treeNode.itemUri)) {\r\n return;\r\n }\r\n /* istanbul ignore next */\r\n if (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n onExpand(treeNode.itemUri);\r\n };\r\n\r\n const _onLoadMore = useCallback(() => {\r\n // start loading icon\r\n _updateToggleCounter(0, true);\r\n // fetch results\r\n dispatch(\r\n getTreeAction({\r\n itemUri,\r\n filter,\r\n deep: includeSubfolders,\r\n all: true,\r\n })\r\n );\r\n setAll(true);\r\n }, [dispatch, _updateToggleCounter, itemUri, filter, includeSubfolders]);\r\n\r\n // #56492 Handle folders that are not on initial Tree payload\r\n useEffect(() => {\r\n if (\r\n filter ||\r\n !treeNodes ||\r\n treeNodes.length === 0 ||\r\n activeTreeNodeId == null ||\r\n treeNodes.some((node) => node.id === activeTreeNodeId)\r\n ) {\r\n return;\r\n }\r\n if (totalCount === treeNodes.length) {\r\n // Item does not exist (anymore), select first element\r\n onClick(treeNodes[0].itemUri, treeNodes[0].id);\r\n return;\r\n }\r\n if (!all) _onLoadMore();\r\n }, [\r\n _onLoadMore,\r\n totalCount,\r\n treeNodes,\r\n activeTreeNodeId,\r\n all,\r\n onClick,\r\n filter,\r\n ]);\r\n\r\n if (status !== Constants.OK) {\r\n return ;\r\n }\r\n\r\n // do not render further if this folder is non-browsable!\r\n if (isBrowsable === false) {\r\n return (\r\n \r\n
{loc.t(\"folder:nonBrowsable\")}
\r\n
\r\n );\r\n } else {\r\n return (\r\n \r\n );\r\n }\r\n};\r\n\r\nexport default compose(\r\n GlobalEventsHandler({\r\n actions: [\r\n ServerEventActionType.add,\r\n ServerEventActionType.modify,\r\n ServerEventActionType.refresh,\r\n ServerEventActionType.delete,\r\n ],\r\n items: [ServerEventItemType.folder],\r\n })\r\n)(FolderTreeContainer);\r\n","import { get, getDefaultsConfig } from \"data/constants\";\r\n\r\nexport const SupportGeoMapViewer = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"map\", \"enabled\"], false) !== false;\r\n\r\nexport const getGeoMapViewerProvider = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"map\"]);\r\n\r\nexport /** whether support for GeoCoding is enabled */ const SupportGeoPlaceInput = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"places\", \"enabled\"], false) !==\r\n false;\r\n\r\nexport const getGeoPlacesProvider = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"places\"]);\r\n\r\nexport /** whether support for editing a marker on a map is enabled */ const SupportGeoPointEdit = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"pointEdit\", \"enabled\"], false) !==\r\n false;\r\n\r\nexport const getGeoPointProvider = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"pointEdit\"]);\r\n\r\nexport /** whether support for editing radius on a map is enabled */ const SupportGeoRadiusEdit = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"radius\", \"enabled\"], false) !==\r\n false;\r\n\r\nexport const getGeoRadiusProvider = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"radius\"]);\r\n\r\nexport /** whether support for editing areas on a map is enabled */ const SupportGeoAreaEdit = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"areaEdit\", \"enabled\"], false) !==\r\n false;\r\n\r\nexport const getGeoAreaProvider = () =>\r\n get(window.CONFIG, [\"general\", \"geo\", \"areaEdit\"]);\r\n\r\nexport const getGeoRasterProvider = (itemUri: string, formatId: number) => {\r\n const config = getDefaultsConfig(itemUri, formatId);\r\n return config ? config.map : null;\r\n};\r\n","//@flow\r\nimport { inPointAction, inPointActionLink } from \"components/ItemUriLink\";\r\n\r\n/**\r\n * opens inPoint.Client to execute command action for the specified itemUris\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ items?: Array }} { items }\r\n * @param {{ commandAction?: string}} { commandAction }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n items?: Array,\r\n commandAction?: string,\r\n};\r\n\r\nclass ip_commandAction {\r\n execute({ itemUri, items, commandAction }: Context) {\r\n window.location.assign(\r\n inPointActionLink(\r\n inPointAction.commandAction,\r\n items?.length ? undefined : itemUri,\r\n items?.length ? items.map((item) => item.itemUri) : undefined,\r\n {\r\n name: commandAction,\r\n }\r\n )\r\n );\r\n return true;\r\n }\r\n}\r\n\r\nexport default ip_commandAction;\r\n","import ip_commandAction from \"./ip_commandAction\";\r\n\r\n/**\r\n * opens inPoint.Client to archive to the specified itemUri\r\n *\r\n * @param {{ itemUri?: string }} { itemUri }\r\n */\r\n\r\nclass ip_archive extends ip_commandAction {\r\n execute = ({ itemUri }: { itemUri?: string }) =>\r\n super.execute({ itemUri, commandAction: \"ArchiveCommandAction\" });\r\n}\r\n\r\nexport default ip_archive;\r\n","import ip_commandAction from \"./ip_commandAction\";\r\n\r\n/**\r\n * opens inPoint.Client to browse to the specified itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n */\r\n\r\nclass ip_browse extends ip_commandAction {\r\n execute = ({ itemUri }: { itemUri: string }) =>\r\n super.execute({ itemUri, commandAction: \"ItemBrowseCommandAction\" });\r\n}\r\n\r\nexport default ip_browse;\r\n","import ip_commandAction from \"./ip_commandAction\";\r\n\r\n/**\r\n * opens inPoint.Client to edit to the specified itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n */\r\n\r\nclass ip_edit extends ip_commandAction {\r\n execute = ({ itemUri }: { itemUri: string }) =>\r\n super.execute({ itemUri, commandAction: \"DocumentOpenCommandAction\" });\r\n}\r\n\r\nexport default ip_edit;\r\n","import ip_commandAction from \"./ip_commandAction\";\r\n\r\n/**\r\n * opens inPoint.Client to show properties window for the specified itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ isDoc: boolean }} { isDoc }\r\n */\r\n\r\nclass ip_properties extends ip_commandAction {\r\n execute = ({ itemUri, isDoc }: { itemUri: string, isDoc: boolean }) =>\r\n super.execute({\r\n itemUri,\r\n commandAction: isDoc\r\n ? \"DocumentEditAttributesCommandAction\"\r\n : \"FolderEditAttributesCommandAction\",\r\n });\r\n}\r\n\r\nexport default ip_properties;\r\n","import { openConfirmModal } from \"components/ConfirmModal\";\r\nimport { delItemUri } from \"data/api\";\r\nimport loc from \"i18next\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\n/**\r\n * deletes an existing folder by itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n};\r\n\r\nclass folder_delete {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n shouldRender: boolean = true;\r\n\r\n render = async ({ name }: Context): Promise => {\r\n this.shouldRender = false;\r\n return await openConfirmModal({\r\n body: loc.t(\"commandAction:folder_delete.confirmBody\", { name }),\r\n confirmButton: loc.t(\"commandAction:folder_delete.confirmYes\"),\r\n });\r\n };\r\n\r\n execute = async ({ itemUri }: Context): Promise => {\r\n try {\r\n return await delItemUri(itemUri);\r\n } catch (err) {\r\n console.warn(err);\r\n return false;\r\n }\r\n };\r\n\r\n report = async (success: boolean, { name }: Context): Promise => {\r\n this.logger(success === true, \"commandAction:folder_delete\", { name });\r\n };\r\n}\r\n\r\nexport default folder_delete;\r\n","import { formSetEditModeAction } from \"data/actions\";\r\n\r\n/**\r\n * starts editing the current folder form\r\n */\r\n\r\nclass folder_editClassification {\r\n execute = ({ dispatch }) => dispatch(formSetEditModeAction(\"folder\", true));\r\n}\r\nexport default folder_editClassification;\r\n","import React, { useCallback, useMemo } from \"react\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\nimport DropdownButton from \"react-bootstrap/lib/DropdownButton\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport ButtonGroup from \"react-bootstrap/lib/ButtonGroup\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { type EnumValue } from \"data/types\";\r\nimport { getLocalizedText } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** Enum Values */\r\n enum: Array>,\r\n /** Is a required field */\r\n isRequired?: boolean,\r\n /** Is a read only field */\r\n isReadonly?: boolean,\r\n /** wheather it is an Enum or and EnumFlag */\r\n isMulti?: boolean,\r\n};\r\n\r\ntype EnumRendererProps = {\r\n isValid: boolean,\r\n enum: Array>,\r\n value?: int,\r\n name: string,\r\n changeValue: () => void,\r\n};\r\n\r\nconst ButtonGroupEnumRenderer = (props: EnumRendererProps) => (\r\n \r\n {props.enum.map((enumValue) => (\r\n props.onChange(enumValue.value)}\r\n disabled={!!props.isReadonly}\r\n active={props.isActive(enumValue.value)}\r\n >\r\n {enumValue.icon && typeof enumValue.icon === \"string\" ? (\r\n \r\n ) : (\r\n enumValue.icon\r\n )}{\" \"}\r\n {getLocalizedText(enumValue.label)}\r\n \r\n ))}\r\n \r\n);\r\n\r\nconst DropdownEnumRenderer = (props: EnumRendererProps) => (\r\n e.stopPropagation()}\r\n >\r\n {props.enum.map((enumValue, idx) => (\r\n props.onChange(enumValue.value)}\r\n active={props.isActive(enumValue.value)}\r\n >\r\n {enumValue.icon && typeof enumValue.icon === \"string\" ? (\r\n \r\n ) : (\r\n enumValue.icon\r\n )}{\" \"}\r\n {getLocalizedText(enumValue.label)}\r\n \r\n ))}\r\n \r\n);\r\n\r\nconst EnumRenderer = {\r\n ButtonGroup: ButtonGroupEnumRenderer,\r\n Dropdown: DropdownEnumRenderer,\r\n};\r\n\r\nconst EnumEditorControl = (props: Props) => {\r\n const isActive = useCallback(\r\n (enumValue: int) =>\r\n props.isMulti\r\n ? (props.value & enumValue) > 0\r\n : enumValue === props.value,\r\n [props.isMulti, props.value]\r\n );\r\n\r\n const handleFlagsChange = useCallback(\r\n (enumValue: int) =>\r\n (props.value & enumValue) > 0\r\n ? props.value & ~enumValue\r\n : props.value | enumValue,\r\n [props.value]\r\n );\r\n\r\n const handleChange = useCallback(\r\n (changeValue: () => void, enumValue: int) => {\r\n const newValue = props.isMulti\r\n ? handleFlagsChange(enumValue)\r\n : enumValue;\r\n changeValue({ currentTarget: { value: newValue } });\r\n },\r\n [props.isMulti, handleFlagsChange]\r\n );\r\n const activeLabels = useMemo(\r\n () =>\r\n props.enum\r\n .filter((enumValue) =>\r\n props.isMulti\r\n ? (props.value & enumValue.value) > 0\r\n : enumValue.value ===\r\n props.value /* istanbul ignore next */ ||\r\n (enumValue.value == null && props.value == null)\r\n )\r\n .map((enumValue) => (\r\n \r\n {enumValue.icon &&\r\n typeof enumValue.icon === \"string\" ? (\r\n \r\n ) : (\r\n enumValue.icon\r\n )}{\" \"}\r\n {getLocalizedText(enumValue.label)}\r\n \r\n )),\r\n [props.enum, props.value, props.isMulti, props.name]\r\n );\r\n const EnumRenderComponent = useMemo(() => {\r\n if (\r\n typeof props.component === \"string\" &&\r\n EnumRenderer.hasOwnProperty(props.component)\r\n ) {\r\n return EnumRenderer[props.component];\r\n }\r\n if (props.component != null && typeof props.component === \"function\") {\r\n return props.component;\r\n }\r\n return EnumRenderer.ButtonGroup;\r\n }, [props.component]);\r\n return (\r\n void,\r\n isValid: boolean\r\n ) => (\r\n \r\n handleChange(changeValue, enumValue)\r\n }\r\n />\r\n )}\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nEnumEditorControl.displayName = \"EnumEditorControl\";\r\nexport default EnumEditorControl;\r\n","import React, { useCallback, useEffect } from \"react\";\r\nimport loc from \"i18next\";\r\nimport TextEditorControl from \"components/ExtraAttributes/EditorControl/TextEditorControl\";\r\nimport DateEditorControl from \"components/ExtraAttributes/EditorControl/DateEditorControl\";\r\nimport EnumEditorControl from \"components/ExtraAttributes/EditorControl/EnumEditorControl\";\r\nimport {\r\n ShareType,\r\n DateTimeFormat,\r\n type ShareActionDTO,\r\n type ShareTypeEnum,\r\n} from \"data/types\";\r\n\r\ntype Props = {\r\n onChange: (value) => void,\r\n onConfirm: (name: sting, value: ShareTypeEnum) => Promise,\r\n name: string,\r\n value?: ShareActionDTO,\r\n extras?: any,\r\n};\r\n\r\nconst ShareActionForm = ({\r\n onChange,\r\n onConfirm,\r\n name,\r\n value: shareAction,\r\n extras = {},\r\n}: Props) => {\r\n const handleChange = useCallback(\r\n (name: string, value: any) =>\r\n onChange({ ...shareAction, [name]: value }),\r\n [onChange, shareAction]\r\n );\r\n const handleShareAsChange = useCallback(\r\n (nameAndIndex, indexValue) => {\r\n const [name, index] = nameAndIndex.split(\".\");\r\n const value = [...shareAction.shareAs];\r\n value[index] = indexValue;\r\n return onChange({ ...shareAction, [name]: value });\r\n },\r\n [onChange, shareAction]\r\n );\r\n const handleConfirmedChange = useCallback(\r\n (name: string, value: ShareTypeEnum) =>\r\n onConfirm(name, value).then(\r\n (success) => success && handleChange(name, value)\r\n ),\r\n [handleChange, onConfirm]\r\n );\r\n const { typeEnumValues, aclEnumValues } = extras;\r\n useEffect(() => {\r\n if (\r\n typeof shareAction.expires === \"undefined\" ||\r\n (shareAction.type !== ShareType.Share &&\r\n shareAction.expires != null)\r\n ) {\r\n handleChange(\"expires\", null);\r\n }\r\n }, [shareAction, handleChange]);\r\n return (\r\n <>\r\n
\r\n \r\n {shareAction.type === ShareType.Share && (\r\n \r\n )}\r\n
\r\n {shareAction.type === ShareType.Share && (\r\n <>\r\n {shareAction.shareAs.map((shareAs, i) => (\r\n \r\n ))}\r\n \r\n value == null ||\r\n new Date(value) - Date.now() > 0,\r\n }}\r\n validationErrors={{\r\n isGreaterThanNow: loc.t(\r\n \"common:validation.greaterThanNow\"\r\n ),\r\n }}\r\n />\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nShareActionForm.displayName = \"ShareActionForm\";\r\nexport default ShareActionForm;\r\n","import React, { type Component } from \"react\";\r\nimport Alert from \"react-bootstrap/lib/Alert\";\r\nimport ButtonToolbar from \"react-bootstrap/lib/ButtonToolbar\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport FormsyEditorBase from \"components/ExtraAttributes/EditorControl/FormsyEditorBase\";\r\nimport ShareActionForm from \"components/ShareModal/ShareActionForm\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./ShareAction.module.css\";\r\nimport { type ShareActionDTO } from \"data/types\";\r\n\r\ntype Props = {\r\n value?: ShareActionDTO,\r\n name: string,\r\n extras: any,\r\n onChange: () => void,\r\n onConfirm: (name: string, value: ShareTypeEnum) => Promise,\r\n onCancel?: () => void,\r\n Form?: Component,\r\n};\r\n\r\nconst ShareActionEditorControl = ({\r\n Form = ShareActionForm,\r\n ...props\r\n}: Props) => (\r\n void,\r\n isValid: boolean\r\n ) => (\r\n
\r\n \r\n {typeof props.onCancel === \"function\" && (\r\n
\r\n {\" \"}\r\n {props.header}\r\n
\r\n )}\r\n \r\n changeValue({ currentTarget: { value } })\r\n }\r\n onConfirm={props.onConfirm}\r\n />\r\n {typeof props.onCancel === \"function\" && (\r\n \r\n \r\n {loc.t(\"close\")}\r\n \r\n \r\n )}\r\n
\r\n
\r\n )}\r\n {...props}\r\n />\r\n);\r\n\r\nShareActionEditorControl.displayName = \"ShareActionEditorControl\";\r\nexport default ShareActionEditorControl;\r\n","import React, { useState, useCallback, useMemo, useRef } from \"react\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\nimport Mark from \"@hs/mark\";\r\nimport PrincipalAvatar from \"components/User/PrincipalAvatar\";\r\nimport loc from \"i18next\";\r\nimport { fetchSearchPrincipal } from \"data/api\";\r\nimport {\r\n PrincipalType,\r\n type UserPrincipalDTO,\r\n type GroupPrincipalDTO,\r\n type ApiError,\r\n} from \"data/types\";\r\nimport { closeMenuOnScroll } from \"data/utils\";\r\nimport Async from \"react-select/async\";\r\nimport AsyncCreatable from \"react-select/async-creatable\";\r\nimport { components } from \"react-select\";\r\nimport { validationRules } from \"formsy-react\";\r\nimport styles from \"./PrincipalEditorControl.module.css\";\r\nimport { useAbortController } from \"hooks\";\r\n\r\nconst { Option } = components;\r\n\r\ntype Props = {\r\n /** Allows to create new User */\r\n createUser?: boolean,\r\n /** Allows to create new Group */\r\n createGroup?: boolean,\r\n /** Handle Users */\r\n includeUsers?: boolean,\r\n /** Handle UserGroups */\r\n includeGroups?: boolean,\r\n /** Is a required field */\r\n isRequired?: boolean,\r\n /** Can multiple Users be selected */\r\n isMulti?: boolean,\r\n /** Can input be cleared */\r\n isClearable?: boolean,\r\n /** New UserId reference */\r\n newUserIdRef?: { current?: int },\r\n /** Focus the control when it is mounted */\r\n autoFocus?: boolean,\r\n};\r\n\r\nconst PrincipalEditorControl = (props: Props) => {\r\n const localNewUserIdRef = useRef(0);\r\n const abortController = useAbortController();\r\n const {\r\n isMulti = false,\r\n createUser = false,\r\n createGroup = false,\r\n includeUsers = true,\r\n includeGroups = false,\r\n newUserIdRef = localNewUserIdRef,\r\n } = props;\r\n const [keyword, setKeyword] = useState(\"\");\r\n\r\n const getNewId = useCallback(() => {\r\n newUserIdRef.current -= 1;\r\n return newUserIdRef.current;\r\n }, [newUserIdRef]);\r\n\r\n const types = useMemo(() => {\r\n const types = [];\r\n /* istanbul ignore else */\r\n if (includeUsers)\r\n types.push(loc.t(`principal.type.user${isMulti ? \"s\" : \"\"}`));\r\n /* istanbul ignore else */\r\n if (includeGroups)\r\n types.push(loc.t(`principal.type.group${isMulti ? \"s\" : \"\"}`));\r\n return types.join(\r\n isMulti ? loc.t(\"principal.type.and\") : loc.t(\"principal.type.or\")\r\n );\r\n }, [includeUsers, includeGroups, isMulti]);\r\n\r\n const Component = useMemo(\r\n () => (createUser || createGroup ? AsyncCreatable : Async),\r\n [createUser, createGroup]\r\n );\r\n const componentProps = useMemo(\r\n () =>\r\n createUser || createGroup\r\n ? {\r\n createOptionPosition: \"first\",\r\n isValidNewOption: (\r\n inputValue: string,\r\n selectValue?: Array = [],\r\n selectOptions?: Array = []\r\n ) =>\r\n inputValue &&\r\n selectOptions.find(\r\n (principal) =>\r\n principal &&\r\n principal.email &&\r\n principal.email.toLowerCase() ===\r\n inputValue.toLowerCase()\r\n ) == null &&\r\n createUser &&\r\n validationRules.isEmail(selectValue, inputValue),\r\n getNewOptionData: (\r\n inputValue: string,\r\n optionLabel: React.Node\r\n ): any => {\r\n const isEmail = validationRules.isEmail(\r\n undefined,\r\n inputValue\r\n );\r\n return {\r\n id: getNewId(),\r\n $type: isEmail\r\n ? PrincipalType.User\r\n : PrincipalType.Group,\r\n displayName: inputValue,\r\n email: isEmail ? inputValue : undefined,\r\n };\r\n },\r\n }\r\n : {},\r\n [createUser, createGroup, getNewId]\r\n );\r\n\r\n const handleInputChange = useCallback((keyword: string) => {\r\n setKeyword(keyword);\r\n return keyword;\r\n }, []);\r\n\r\n const handleSearchAsYouType = useCallback(\r\n (\r\n keyword: string\r\n ): Promise> => {\r\n if (keyword.length > 0) {\r\n return fetchSearchPrincipal(\r\n keyword,\r\n !!includeUsers,\r\n !!includeGroups,\r\n /* !! Do NOT abort multiple calls, since Async react-select, caches responses !! */\r\n abortController().signal\r\n )\r\n .catch((err: ApiError) => {\r\n return [];\r\n })\r\n .then((options) => options);\r\n } else {\r\n // TODO return previously used emails\r\n return Promise.resolve([]);\r\n }\r\n },\r\n [includeUsers, includeGroups, abortController]\r\n );\r\n const optionRenderer = useCallback(\r\n (props) =>\r\n Option && (\r\n \r\n ),\r\n [keyword]\r\n );\r\n return (\r\n void,\r\n isValid: boolean\r\n ) => (\r\n ({\r\n ...provided,\r\n width: \"100%\",\r\n minWidth: 191,\r\n }),\r\n control: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n minHeight: 34,\r\n borderColor: isValid\r\n ? provided.borderColor\r\n : \"#a94442\",\r\n borderRadius: 0,\r\n }),\r\n menu: /* istanbul ignore next */ (provided, state) => ({\r\n ...provided,\r\n borderRadius: 0,\r\n marginTop: 0,\r\n }),\r\n menuPortal: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n zIndex: 9999,\r\n }),\r\n valueContainer: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n padding: \"0px 6px\",\r\n minHeight: 34,\r\n }),\r\n input: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n margin: 0,\r\n padding: 0,\r\n }),\r\n dropdownIndicator: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n padding: 4,\r\n }),\r\n clearIndicator: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => ({\r\n ...provided,\r\n padding: 4,\r\n }),\r\n option: /* istanbul ignore next */ (\r\n provided,\r\n state\r\n ) => {\r\n let style = {\r\n ...provided,\r\n display: \"flex\",\r\n width: \"100%\",\r\n alignItems: \"center\",\r\n };\r\n /* istanbul ignore next */\r\n if (state.isFocused) {\r\n return Object.assign({}, style, {\r\n boxShadow: \"none\",\r\n background: \"#f5f5f5\",\r\n textShadow: \"none\",\r\n cursor: \"pointer\",\r\n // border: \"1px solid #f5f5f5\"\r\n });\r\n }\r\n return style;\r\n },\r\n }}\r\n components={{\r\n Option: optionRenderer,\r\n }}\r\n // async loading\r\n cacheOptions={true}\r\n loadOptions={handleSearchAsYouType}\r\n // options\r\n getOptionLabel={\r\n /* istanbul ignore next */\r\n (option: UserPrincipalDTO | GroupPrincipalDTO) =>\r\n option.displayName\r\n }\r\n getOptionValue={\r\n /* istanbul ignore next */\r\n (option: UserPrincipalDTO | GroupPrincipalDTO) =>\r\n option.id\r\n }\r\n defaultOptions={true}\r\n isMulti={props.isMulti || false}\r\n // behaviour\r\n isClearable={props.isClearable || false}\r\n openMenuOnFocus={true}\r\n // localizations\r\n aria-label={loc.t(\"principal.search.prompt\", { types })}\r\n loadingMessage={\r\n /* istanbul ignore next */\r\n () => loc.t(\"principal.search.loading\")\r\n }\r\n placeholder={loc.t(\"principal.placeholder\", { types })}\r\n noOptionsMessage={\r\n /* istanbul ignore next */\r\n () => loc.t(\"principal.search.prompt\", { types })\r\n }\r\n // selection\r\n onInputChange={handleInputChange}\r\n onChange={(value) =>\r\n changeValue({\r\n currentTarget: {\r\n value:\r\n Array.isArray(value) && !value.length\r\n ? null\r\n : value,\r\n },\r\n })\r\n }\r\n menuPortalTarget={document.body}\r\n menuPlacement=\"auto\"\r\n closeMenuOnScroll={closeMenuOnScroll}\r\n value={props.value}\r\n autoFocus={props.autoFocus}\r\n {...componentProps}\r\n />\r\n )}\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nPrincipalEditorControl.displayName = \"PrincipalEditorControl\";\r\nexport default PrincipalEditorControl;\r\n","import React, { useCallback, useMemo } from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport PrincipalEditorControl from \"components/ExtraAttributes/EditorControl/PrincipalEditorControl\";\r\nimport EnumEditorControl from \"components/ExtraAttributes/EditorControl/EnumEditorControl\";\r\nimport { ShareType, type SharePrincipalDTO } from \"data/types\";\r\nimport loc from \"i18next\";\r\nimport { getLocalizedText } from \"data/utils\";\r\n\r\ntype Props = {\r\n onRemove: (value) => void,\r\n onChange: (value) => void,\r\n name: string,\r\n value?: SharePrincipalDTO,\r\n extras?: any,\r\n};\r\n\r\nconst SharePrincipalForm = ({\r\n onChange,\r\n onRemove,\r\n name,\r\n value: sharePrincipal,\r\n extras = { aclEnumValues: null, acl: null, newUserIdRef: null },\r\n}: Props) => {\r\n const handleChange = useCallback(\r\n (name: string, value: any) =>\r\n onChange({\r\n ...sharePrincipal,\r\n principal: sharePrincipal.principal\r\n ? { ...sharePrincipal.principal }\r\n : null,\r\n [name]: value,\r\n }),\r\n [onChange, sharePrincipal]\r\n );\r\n const aclEnumValuesWithDefault = useMemo(() => {\r\n const aclEnumValuesOrEmpty = extras.aclEnumValues || [];\r\n const withDefault = [...aclEnumValuesOrEmpty];\r\n const defaultAcl = aclEnumValuesOrEmpty.find(\r\n (enumValue) => enumValue.value === extras.acl\r\n );\r\n withDefault.unshift({\r\n value: null,\r\n label: loc.t(\"share:acl.default\", {\r\n default: defaultAcl\r\n ? getLocalizedText(defaultAcl.label)\r\n : \"n/a\",\r\n }),\r\n });\r\n return withDefault;\r\n }, [extras.aclEnumValues, extras.acl]);\r\n return (\r\n <>\r\n \r\n {extras.type === ShareType.Share && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nSharePrincipalForm.displayName = \"SharePrincipalForm\";\r\nexport default SharePrincipalForm;\r\n","import React, { useCallback } from \"react\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport ButtonToolbar from \"react-bootstrap/lib/ButtonToolbar\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport FormsyEditorBase from \"components/ExtraAttributes/EditorControl/FormsyEditorBase\";\r\nimport SharePrincipalForm from \"components/ShareModal/SharePrincipalForm\";\r\nimport loc from \"i18next\";\r\nimport { SharePrincipalType } from \"data/types\";\r\nimport styles from \"./SharePrincipal.module.css\";\r\n\r\ntype Props = {\r\n name: string,\r\n extras: any,\r\n value: Array,\r\n};\r\n\r\nconst SharePrincipalEditorControl = (props: Props) => {\r\n const handleChange = useCallback(\r\n (value, changeValue, currentPrincipal, currentIdx) =>\r\n changeValue({\r\n currentTarget: {\r\n value: value.map((principal, idx) =>\r\n idx === currentIdx ? currentPrincipal : principal\r\n ),\r\n },\r\n }),\r\n []\r\n );\r\n const handleRemove = useCallback((value, changeValue, currentIdx) => {\r\n const sharePrincipal = value.filter(\r\n (principal, idx) => idx !== currentIdx\r\n );\r\n changeValue({\r\n currentTarget: {\r\n value: sharePrincipal.length ? sharePrincipal : null,\r\n },\r\n });\r\n }, []);\r\n const { name, value, onChange } = props;\r\n const handleAdd = useCallback(() => {\r\n const principals = value != null ? [...value] : [];\r\n principals.push({\r\n $type: SharePrincipalType.Share,\r\n principal: null,\r\n acl: null,\r\n });\r\n onChange(name, principals);\r\n }, [onChange, name, value]);\r\n\r\n return (\r\n ,\r\n changeValue: (name: string, value?: ShareActionDTO) => void,\r\n isValid: boolean\r\n ) => (\r\n
\r\n {!Array.isArray(value) ? (\r\n \r\n {loc.t(\"share:principal.empty\")}\r\n \r\n ) : (\r\n value.map((sharePrincipal, idx) => (\r\n \r\n \r\n handleChange(\r\n value,\r\n changeValue,\r\n currentPrincipal,\r\n idx\r\n )\r\n }\r\n onRemove={() =>\r\n handleRemove(value, changeValue, idx)\r\n }\r\n />\r\n
\r\n ))\r\n )}\r\n \r\n \r\n {\" \"}\r\n {loc.t(\"share:principal.new\")}\r\n \r\n \r\n \r\n )}\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nSharePrincipalEditorControl.displayName = \"SharePrincipalEditorControl\";\r\nexport default SharePrincipalEditorControl;\r\n","import React from \"react\";\r\nimport Alert from \"react-bootstrap/lib/Alert\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./ExternalUser.module.css\";\r\n\r\ntype Props = {\r\n value: Array,\r\n onDelete?: () => void,\r\n};\r\n\r\nconst ExternalUserViewerControl = ({ value, onDelete }: Props) => (\r\n
\r\n \r\n \r\n
\r\n {value.map((user) => (\r\n \r\n {user.displayName}\r\n {typeof onDelete === \"function\" && (\r\n onDelete(user.id)}\r\n >\r\n ×\r\n \r\n )}\r\n
\r\n ))}\r\n
\r\n \r\n \r\n);\r\n\r\nExternalUserViewerControl.displayName = \"ExternalUserViewerControl\";\r\nexport default ExternalUserViewerControl;\r\n","import loc from \"i18next\";\r\nimport {\r\n LocalDateStringOption,\r\n AllowedShareActionFlags,\r\n type AllowedShareActionFlagsEnum,\r\n} from \"data/types\";\r\nimport {\r\n getClientLinkHtml,\r\n getBrowserLinkHtml,\r\n inPointAction,\r\n} from \"components/ItemUriLink\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\n\r\nexport const getShareDate = (expires: string) =>\r\n expires\r\n ? loc.t(`share:action.date`, {\r\n expires: new Date(expires).toLocaleDateString(\r\n userLanguage(),\r\n LocalDateStringOption.Date\r\n ),\r\n })\r\n : \"\";\r\n\r\nexport const getBytes = (bytes: number): string => {\r\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\r\n return (\r\n (!bytes && \"0 Bytes\") ||\r\n (bytes / Math.pow(1024, i)).toFixed(2) +\r\n \" \" +\r\n [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"][i]\r\n );\r\n};\r\n\r\nexport const getMailLink = (label, link, multiple = false) =>\r\n loc.t(`share:mail.link.template${multiple ? \"_multi\" : \"\"}`, {\r\n label,\r\n link,\r\n });\r\nexport const getMailSyncLink = (\r\n name: string,\r\n itemUri: string,\r\n isDoc: boolean,\r\n allowedShareActionFlags: AllowedShareActionFlagsEnum,\r\n multiple?: boolean\r\n) =>\r\n (allowedShareActionFlags & AllowedShareActionFlags.Sync) > 0\r\n ? getMailLink(\r\n loc.t(\"share:mail.link.sync\"),\r\n getClientLinkHtml(\r\n name,\r\n itemUri,\r\n isDoc ? inPointAction.preview : inPointAction.browse\r\n ),\r\n multiple\r\n )\r\n : \"\";\r\nexport const getMailWebLink = (\r\n name: string,\r\n itemUri: string,\r\n isDoc: boolean,\r\n allowedShareActionFlags: AllowedShareActionFlagsEnum,\r\n multiple?: boolean\r\n) =>\r\n (allowedShareActionFlags & AllowedShareActionFlags.Web) > 0\r\n ? getMailLink(\r\n loc.t(\"share:mail.link.web\"),\r\n getBrowserLinkHtml(name, itemUri, isDoc),\r\n multiple\r\n )\r\n : \"\";\r\n\r\nexport const getMailMessage = (message: string) =>\r\n message\r\n ? loc.t(\"share:mail.message\", {\r\n message,\r\n })\r\n : \"\";\r\n\r\nexport const getItemKey = (isDoc: boolean, isMixed: boolean = false) =>\r\n isMixed ? \"mixed\" : isDoc ? \"document\" : \"folder\";\r\nexport const getActionKey = (isEdit: boolean) => (isEdit ? \"update\" : \"create\");\r\n\r\nexport /**\r\n * Maps EnumValues to their designated icons\r\n *\r\n * @param { id: string } { enum value identifier }\r\n * @returns {string} fontawesome 4.7 icon identifier\r\n */\r\nconst getEnumIcon = (id: string): ?string => {\r\n switch (id) {\r\n // ShareAccessControlListType\r\n case \"view\":\r\n return \"eye\";\r\n case \"edit\":\r\n return \"pencil\";\r\n case \"delete\":\r\n return \"pencil-square-o\";\r\n // ShareType\r\n /* istanbul ignore next */\r\n case \"anonym\":\r\n return \"globe\";\r\n case \"link\":\r\n return \"link\";\r\n case \"share\":\r\n return \"share-alt\";\r\n case \"attachment\":\r\n return \"envelope-o\";\r\n case \"pdf\":\r\n return \"file-pdf-o\";\r\n /* istanbul ignore next */\r\n default:\r\n return undefined;\r\n }\r\n};\r\n","import React, { useMemo } from \"react\";\r\nimport Alert from \"react-bootstrap/lib/Alert\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./ShareAction.module.css\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { getShareDate } from \"components/ShareModal/Utils\";\r\n\r\ntype Props = {\r\n isDoc: boolean,\r\n value: ShareActionDTO,\r\n onEdit: () => void,\r\n extras?: any,\r\n};\r\n\r\nconst ShareActionViewerControl = ({\r\n itemKey,\r\n value,\r\n onEdit,\r\n extras = {},\r\n}: Props) => {\r\n const { type, expires, acl } = value;\r\n const { count, docCount, folderCount } = extras;\r\n const [identifier, context] = useMemo(\r\n () => [\r\n `${type}.${itemKey}`,\r\n {\r\n acl: loc.t(`share:acl.${acl}`),\r\n date: getShareDate(expires),\r\n count,\r\n document: loc.t(`share:name.document`, { count: docCount }),\r\n folder: loc.t(`share:name.folder`, { count: folderCount }),\r\n },\r\n ],\r\n [type, expires, acl, itemKey, count, docCount, folderCount]\r\n );\r\n return (\r\n
\r\n \r\n {\" \"}\r\n {loc.t(`share:action.${identifier}`, context)}\r\n \r\n
\r\n );\r\n};\r\n\r\nShareActionViewerControl.displayName = \"ShareActionViewerControl\";\r\nexport default ShareActionViewerControl;\r\n","import React from \"react\";\r\nimport styles from \"./Attachments.module.css\";\r\nimport InputGroup from \"react-bootstrap/lib/InputGroup\";\r\nimport AttributeLabel from \"components/ExtraAttributes/AttributeLabel\";\r\nimport ViewerControlBase from \"components/ExtraAttributes/ViewerControl/ViewerControlBase\";\r\nimport Icons from \"@hs/icons\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { getBytes } from \"../Utils\";\r\nimport { type DocInfoResultDTO } from \"data/types\";\r\n\r\nconst AttachmentsViewerControl = ({\r\n header,\r\n value: attachments,\r\n ext,\r\n showBytes = true,\r\n}: {\r\n header?: string,\r\n value: Array,\r\n ext?: string,\r\n showBytes?: boolean,\r\n}) =>\r\n attachments?.map((attachment, i) =>\r\n attachment == null ? null : (\r\n \r\n {header && }\r\n \r\n \r\n \r\n \r\n \r\n \r\n {attachment.name}\r\n {showBytes && (\r\n \r\n {\" \"}\r\n {\" (\" + getBytes(attachment.size) + \")\"}\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n );\r\n\r\nAttachmentsViewerControl.displayName = \"AttachmentsViewerControl\";\r\nexport default AttachmentsViewerControl;\r\n","import React, {\r\n useCallback,\r\n useState,\r\n useMemo,\r\n useEffect,\r\n useRef,\r\n} from \"react\";\r\nimport Formsy from \"formsy-react\";\r\nimport loc from \"i18next\";\r\nimport ShareActionEditorControl from \"./EditorControl/ShareAction\";\r\nimport SharePrincipalEditorControl from \"./EditorControl/SharePrincipal\";\r\nimport PrincipalEditorControl from \"components/ExtraAttributes/EditorControl/PrincipalEditorControl\";\r\nimport MemoEditorControl from \"components/ExtraAttributes/EditorControl/MemoEditorControl\";\r\nimport ExternalUserViewerControl from \"./ViewerControl/ExternalUser\";\r\nimport ShareActionViewerControl from \"./ViewerControl/ShareAction\";\r\nimport AttachmentsViewerControl from \"./ViewerControl/Attachments\";\r\nimport { getEnumIcon } from \"./Utils\";\r\nimport {\r\n AllowedShareActionFlags,\r\n ShareType,\r\n SharePrincipalType,\r\n type ShareTypeEnum,\r\n type ShareFormDTO,\r\n type EnumValue,\r\n} from \"data/types\";\r\n\r\ntype Props = {\r\n items: Array,\r\n share: ShareFormDTO,\r\n setCanSubmit: () => void,\r\n handleSave: () => void,\r\n handleChange: () => void,\r\n handleConfirm: (name: string, value: ShareTypeEnum) => Promise,\r\n isAdvanced: boolean,\r\n isDoc: boolean,\r\n isEdit: boolean,\r\n attachments?: Array,\r\n aclEnumValues?: Array>,\r\n folderCount: number,\r\n docCount: number,\r\n};\r\n\r\nconst ShareForm = ({\r\n items,\r\n share,\r\n setCanSubmit,\r\n handleSave,\r\n handleChange,\r\n handleConfirm,\r\n isAdvanced,\r\n setIsAdvanced,\r\n allowedShareActionFlags,\r\n aclEnumValues,\r\n isDoc,\r\n isEdit,\r\n attachments,\r\n itemKey,\r\n folderCount,\r\n docCount,\r\n}: Props) => {\r\n const disableSubmit = useCallback(\r\n () => setCanSubmit(false),\r\n [setCanSubmit]\r\n );\r\n const enableSubmit = useCallback(() => setCanSubmit(true), [setCanSubmit]);\r\n const [isActionEdit, setIsActionEdit] = useState(false);\r\n const [oldAdvanced, setOldAdvanced] = useState(!isAdvanced);\r\n const toggleFlag = useCallback((flag, setFlag) => setFlag(!flag), []);\r\n const principals = useMemo(\r\n () => (share.principals == null ? [] : share.principals),\r\n [share.principals]\r\n );\r\n\r\n const newUserId = useRef(0);\r\n\r\n useEffect(() => {\r\n // Only re-calculate principals if isAdvanced has changed\r\n if (oldAdvanced === isAdvanced) {\r\n return;\r\n }\r\n\r\n // Only re-calculate principals if there are any and NOT while editing\r\n if (!principals.length || isEdit) {\r\n setOldAdvanced(isAdvanced);\r\n return;\r\n }\r\n\r\n if (isAdvanced) {\r\n handleChange(\r\n \"principals\",\r\n principals.map((r) => ({\r\n principal: r,\r\n acl: null,\r\n $type: SharePrincipalType.Share,\r\n }))\r\n );\r\n } else {\r\n const changedPrincipals = principals\r\n .filter((r) => r.principal != null)\r\n .map((r) => r.principal);\r\n handleChange(\r\n \"principals\",\r\n changedPrincipals.length > 0 ? changedPrincipals : null\r\n );\r\n }\r\n setOldAdvanced(isAdvanced);\r\n }, [isAdvanced, oldAdvanced, handleChange, principals, isEdit]);\r\n\r\n // ExternalUser\r\n const externalUsers = useMemo(\r\n () =>\r\n principals\r\n .filter((r) =>\r\n r && Object.prototype.hasOwnProperty.call(r, \"principal\")\r\n ? r.principal && r.principal.id < 0\r\n : r && r.id < 0\r\n )\r\n .map((r) =>\r\n Object.prototype.hasOwnProperty.call(r, \"principal\")\r\n ? r.principal\r\n : r\r\n ),\r\n [principals]\r\n );\r\n const handleUserRemove = useCallback(\r\n (id: int) => {\r\n const changedPrincipals = principals.filter((r) =>\r\n Object.prototype.hasOwnProperty.call(r, \"principal\")\r\n ? r.principal.id !== id\r\n : r.id !== id\r\n );\r\n handleChange(\r\n \"principals\",\r\n changedPrincipals.length ? changedPrincipals : null\r\n );\r\n },\r\n [principals, handleChange]\r\n );\r\n\r\n const typeEnumValues = useMemo(\r\n (): Array> =>\r\n Object.keys(ShareType)\r\n .filter(\r\n (key) =>\r\n ((allowedShareActionFlags &\r\n AllowedShareActionFlags.Share) >\r\n 0 &&\r\n ShareType[key] === ShareType.Share) ||\r\n ((allowedShareActionFlags &\r\n AllowedShareActionFlags.Link) >\r\n 0 &&\r\n ShareType[key] === ShareType.Link) ||\r\n (isDoc &&\r\n (allowedShareActionFlags &\r\n AllowedShareActionFlags.Attachment) >\r\n 0 &&\r\n ShareType[key] === ShareType.Attachment) ||\r\n (isDoc &&\r\n (allowedShareActionFlags &\r\n AllowedShareActionFlags.Pdf) >\r\n 0 &&\r\n ShareType[key] === ShareType.Pdf)\r\n )\r\n .map((key) => ({\r\n value: ShareType[key],\r\n label: `$share:type.${ShareType[key]}`,\r\n icon: getEnumIcon(ShareType[key]),\r\n })),\r\n [allowedShareActionFlags, isDoc]\r\n );\r\n\r\n const extras = useMemo(\r\n () => ({\r\n items,\r\n newUserIdRef: newUserId,\r\n type: share.action.type,\r\n acl: share.action.acl,\r\n aclEnumValues,\r\n typeEnumValues,\r\n count: folderCount + docCount,\r\n docCount,\r\n folderCount,\r\n }),\r\n [\r\n share.action.type,\r\n share.action.acl,\r\n aclEnumValues,\r\n typeEnumValues,\r\n items,\r\n folderCount,\r\n docCount,\r\n ]\r\n );\r\n\r\n return (\r\n \r\n {isAdvanced ? (\r\n <>\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {isActionEdit ? (\r\n \r\n toggleFlag(isActionEdit, setIsActionEdit)\r\n }\r\n />\r\n ) : (\r\n \r\n toggleFlag(isActionEdit, setIsActionEdit)\r\n }\r\n />\r\n )}\r\n \r\n \r\n )}\r\n {share.action.type === ShareType.Share &&\r\n externalUsers.length > 0 && (\r\n \r\n )}\r\n {share.action.type !== ShareType.Share && (\r\n \r\n )}\r\n {share.action.type === ShareType.Pdf && (\r\n \r\n )}\r\n {share.action.type === ShareType.Attachment && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nShareForm.displayName = \"ShareForm\";\r\nexport default ShareForm;\r\n","import React, { useCallback, useState, useEffect, useMemo } from \"react\";\r\nimport isEqual from \"lodash/isEqual\";\r\nimport { useAsync, useAbortController, usePersistSetting } from \"hooks\";\r\nimport {\r\n fetchShare,\r\n deleteShare,\r\n createShare,\r\n updateShare,\r\n checkShareName,\r\n} from \"data/api\";\r\nimport Constants from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport { openConfirmModal } from \"components/ConfirmModal\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport loc from \"i18next\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport Checkbox from \"react-bootstrap/lib/Checkbox\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport ShareForm from \"./ShareForm\";\r\nimport styles from \"./ShareModal.module.css\";\r\nimport {\r\n getShareDate,\r\n getMailSyncLink,\r\n getMailWebLink,\r\n getMailMessage,\r\n getActionKey,\r\n} from \"components/ShareModal/Utils\";\r\nimport {\r\n AllowedShareActionFlags,\r\n ShareType,\r\n ShareAccessControlListType,\r\n type ShareDTO,\r\n type ShareFormDTO,\r\n type AllowedShareActionFlagsEnum,\r\n} from \"data/types\";\r\n\r\ntype Props = {\r\n open: boolean,\r\n close: () => void,\r\n itemUris: Array,\r\n items: Array,\r\n name: string,\r\n isEdit: boolean,\r\n canEdit: boolean,\r\n isDoc: boolean,\r\n allowedShareActionFlags: AllowedShareActionFlagsEnum,\r\n aclEnumValues?: Array>,\r\n attachments?: Array,\r\n shareType?: ShareTypeEnum,\r\n folderCount: number,\r\n docCount: number,\r\n};\r\n\r\nconst getShare = async (\r\n allowedShareActionFlags: AllowedShareActionFlagsEnum,\r\n itemUris: Array,\r\n shareAs: Array,\r\n shareType: ShareTypeEnum\r\n): ShareFormDTO => ({\r\n itemUris,\r\n action: {\r\n allowedFlags: allowedShareActionFlags,\r\n type: shareType,\r\n acl: ShareAccessControlListType.View,\r\n shareAs: await checkShareName(itemUris, shareAs), //Always get an initial valid shareAs\r\n expires: null,\r\n },\r\n principals: null,\r\n});\r\n\r\nexport const ShareModal = (props: Props) => {\r\n const {\r\n open,\r\n close,\r\n itemUris,\r\n items,\r\n name,\r\n itemKey,\r\n isEdit,\r\n canEdit,\r\n isDoc,\r\n allowedShareActionFlags: allowedShareActionFlagsFromProps,\r\n aclEnumValues,\r\n attachments,\r\n shareType: shareTypeFromProps,\r\n folderCount,\r\n docCount,\r\n } = props;\r\n\r\n // Load persisted settings\r\n const [isAdvancedFromSettings, persistIsAdvancedToSettings] =\r\n usePersistSetting({\r\n name: \"shareIsAdvanced\",\r\n defaultValue: false,\r\n });\r\n const [shareTypeFromSettings, persistShareTypeToSettings] =\r\n usePersistSetting({\r\n name: \"shareDefaultType\",\r\n defaultValue: ShareType.Share,\r\n });\r\n const [isPersisted, persistIsPersisted] = usePersistSetting({\r\n name: \"shareIsPersisted\",\r\n defaultValue: false,\r\n });\r\n\r\n // Setup variables\r\n const [share, setShare] = useState();\r\n const [shareAs, setShareAs] = useState();\r\n const [canSubmit, setCanSubmit] = useState(false);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [isAdvanced, setIsAdvanced] = useState(\r\n isEdit || isAdvancedFromSettings\r\n );\r\n const [allowedShareActionFlags, setAllowedShareActionFlags] = useState(\r\n allowedShareActionFlagsFromProps\r\n );\r\n const shareType = shareTypeFromProps || shareTypeFromSettings;\r\n\r\n const abortController = useAbortController();\r\n\r\n const state = useAsync(async () => {\r\n if (isEdit) {\r\n try {\r\n return await fetchShare(\r\n itemUris[0],\r\n abortController().signal\r\n ).then((share) => {\r\n setAllowedShareActionFlags(share.action.allowedFlags);\r\n setShareAs(share.action.shareAs); //Update name to NOT check again.\r\n setShare(share);\r\n });\r\n } catch (err) {\r\n console.warn(\"Error while fetchShare\", err);\r\n throw err;\r\n }\r\n } else {\r\n setShare(\r\n await getShare(\r\n allowedShareActionFlags,\r\n itemUris,\r\n items.map((i) => i.name),\r\n shareType\r\n )\r\n );\r\n }\r\n }, []);\r\n\r\n const handleConfirm = useCallback(\r\n (name: string, value: ShareTypeEnum) => {\r\n if (\r\n !isEdit &&\r\n canEdit &&\r\n name === \"type\" &&\r\n value === ShareType.Share\r\n ) {\r\n if (items.length > 1) {\r\n toastActionResult(\r\n false,\r\n \"share:action_update\",\r\n {\r\n name,\r\n context: \"multiple\",\r\n },\r\n \"multi_share_edit\"\r\n );\r\n } else {\r\n return openConfirmModal({\r\n body: loc.t(\r\n `share:action_update.confirmBody.${itemKey}`\r\n ),\r\n confirmButton: loc.t(\"share:action_update.confirmYes\"),\r\n }).then(\r\n (success) =>\r\n success &&\r\n (close() ||\r\n openShareModal({ ...props, isEdit: true }))\r\n );\r\n }\r\n }\r\n return new Promise((resolve) => resolve(true));\r\n },\r\n [props, isEdit, canEdit, close, itemKey, items]\r\n );\r\n\r\n // Handle not allowed Share Types (by Settings or Acl)\r\n useEffect(() => {\r\n // Wait until initial share is loaded\r\n if (state.loading || state.error || share == null) return;\r\n\r\n const shareTypeKey = Object.keys(ShareType).find(\r\n (key) => ShareType[key] === share.action.type\r\n );\r\n let changeShareType = false;\r\n /* istanbul ignore else */\r\n if (\r\n shareTypeKey == null ||\r\n !(\r\n (allowedShareActionFlags &\r\n AllowedShareActionFlags[shareTypeKey]) >\r\n 0\r\n )\r\n ) {\r\n console.warn(\r\n `ShareType \"${ShareType[shareTypeKey]}\" is not allowed by AllowedShareActionFlags`\r\n );\r\n changeShareType = true;\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (canEdit && !isEdit && share.action.type === ShareType.Share) {\r\n console.warn(\r\n `You can only create one Share per itemUri, changing to next available ShareType`\r\n );\r\n changeShareType = true;\r\n handleConfirm(\"type\", ShareType.Share);\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (changeShareType) {\r\n const newShareTypeKey = Object.keys(ShareType).find(\r\n (key) =>\r\n key !== shareTypeKey &&\r\n (allowedShareActionFlags & AllowedShareActionFlags[key]) > 0\r\n );\r\n if (newShareTypeKey == null) {\r\n toastActionResult(false, \"share:action_allowed\", {\r\n name,\r\n });\r\n close();\r\n }\r\n setShare({\r\n ...share,\r\n action: { ...share.action, type: ShareType[newShareTypeKey] },\r\n });\r\n }\r\n }, [\r\n name,\r\n isEdit,\r\n canEdit,\r\n handleConfirm,\r\n allowedShareActionFlags,\r\n share,\r\n state.error,\r\n state.loading,\r\n close,\r\n ]);\r\n\r\n const handleChange = useCallback((name: string, value: any) => {\r\n setShare((r) => ({ ...r, [name]: value }));\r\n }, []);\r\n\r\n const handlePersistSettings = useCallback(() => {\r\n if (isPersisted === false) {\r\n return;\r\n }\r\n persistShareTypeToSettings(share.action.type);\r\n persistIsAdvancedToSettings(isAdvanced);\r\n }, [\r\n share,\r\n isAdvanced,\r\n isPersisted,\r\n persistShareTypeToSettings,\r\n persistIsAdvancedToSettings,\r\n ]);\r\n\r\n const upsertShare = useCallback(\r\n (shareAs: ?Array = null) => {\r\n setIsSubmitting(true);\r\n const upsertShare = isEdit ? updateShare : createShare;\r\n const webLinks = [];\r\n const syncLinks = [];\r\n items?.forEach((item) => {\r\n syncLinks.push(\r\n getMailSyncLink(\r\n item.name,\r\n item.itemUri,\r\n item.isDoc,\r\n allowedShareActionFlags,\r\n true\r\n )\r\n );\r\n webLinks.push(\r\n getMailWebLink(\r\n item.name,\r\n item.itemUri,\r\n item.isDoc,\r\n allowedShareActionFlags,\r\n true\r\n )\r\n );\r\n });\r\n const SHARE: ShareDTO = {\r\n itemUris: share.itemUris,\r\n action: { ...share.action },\r\n principals: share.principals,\r\n subject: loc.t(\r\n `share:mail.subject.${share.action.type}.${itemKey}`,\r\n { name }\r\n ),\r\n body: loc.t(`share:mail.body.${share.action.type}.${itemKey}`, {\r\n web:\r\n webLinks.filter((link) => link).length &&\r\n loc.t(\"share:mail.link.template\", {\r\n label: loc.t(\"share:mail.link.web\"),\r\n link: `
${webLinks.join(\"
\")}`,\r\n }),\r\n sync:\r\n syncLinks.filter((link) => link).length &&\r\n loc.t(\"share:mail.link.template\", {\r\n label: loc.t(\"share:mail.link.sync\"),\r\n link: `
${syncLinks.join(\"
\")}`,\r\n }),\r\n message: getMailMessage(share.message),\r\n }),\r\n };\r\n if (shareAs != null) {\r\n SHARE.action.shareAs = shareAs;\r\n }\r\n const locContext = {\r\n name: items.length > 1 ? name : SHARE.action.shareAs.join(\", \"),\r\n date: getShareDate(SHARE.action.expires),\r\n };\r\n upsertShare(SHARE, abortController(true).signal)\r\n .then((success) => {\r\n toastActionResult(\r\n success,\r\n `share:action_${getActionKey(isEdit)}`,\r\n locContext\r\n );\r\n if (success) close();\r\n else setIsSubmitting(false);\r\n })\r\n .catch(() => {\r\n setIsSubmitting(false);\r\n toastActionResult(\r\n false,\r\n `share:action_${getActionKey(isEdit)}`,\r\n locContext\r\n );\r\n });\r\n },\r\n [\r\n isEdit,\r\n share,\r\n abortController,\r\n close,\r\n allowedShareActionFlags,\r\n items,\r\n name,\r\n itemKey,\r\n ]\r\n );\r\n\r\n const handleSave = useCallback(() => {\r\n if (\r\n share.action.type === ShareType.Share &&\r\n !isEqual(share.action.shareAs, shareAs)\r\n ) {\r\n // if share AND shareAs not initial value check for unique share name\r\n // NOTE: Formsy validation, cannot handle async validation with ajax calls\r\n checkShareName(\r\n itemUris,\r\n share.action.shareAs,\r\n abortController(true).signal\r\n )\r\n .then((proposedShareAs) => {\r\n if (!isEqual(proposedShareAs, share.action.shareAs)) {\r\n // i18n context\r\n const name = share.action.shareAs.filter(\r\n (s, i) => s !== proposedShareAs[i]\r\n );\r\n const proposed = proposedShareAs.filter(\r\n (s, i) => s !== share.action.shareAs[i]\r\n );\r\n // if shareAs is already present, await confirmation\r\n openConfirmModal({\r\n body: loc.t(\"share:action_unique.confirmBody\", {\r\n name,\r\n proposed,\r\n }),\r\n confirmButton: loc.t(\r\n \"share:action_unique.confirmYes\",\r\n { proposed }\r\n ),\r\n }).then((confirmed) => {\r\n /* istanbul ignore else */\r\n if (confirmed === true) {\r\n upsertShare(proposedShareAs);\r\n } else {\r\n setIsAdvanced(true);\r\n }\r\n });\r\n } else {\r\n // if shareAs is OK\r\n upsertShare();\r\n }\r\n })\r\n .catch(() => toastActionResult(false, \"share:action_unique\"));\r\n } else {\r\n upsertShare();\r\n }\r\n handlePersistSettings();\r\n }, [\r\n upsertShare,\r\n share,\r\n abortController,\r\n itemUris,\r\n shareAs,\r\n handlePersistSettings,\r\n ]);\r\n\r\n const handleDelete = useCallback(() => {\r\n openConfirmModal({\r\n body: loc.t(\"share:action_delete.confirmBody\", { name }),\r\n confirmButton: loc.t(\"share:action_delete.confirmYes\"),\r\n }).then((confirmed) => {\r\n /* istanbul ignore else */\r\n if (confirmed === true) {\r\n deleteShare(itemUris[0], abortController(true).signal)\r\n .then((success) => {\r\n toastActionResult(success, \"share:action_delete\");\r\n if (success) close();\r\n })\r\n .catch(() => {\r\n toastActionResult(false, \"share:action_delete\");\r\n });\r\n }\r\n });\r\n }, [itemUris, abortController, close, name]);\r\n return (\r\n close(false)}\r\n dialogClassName={styles.modal}\r\n docked\r\n >\r\n \r\n \r\n {\" \"}\r\n {loc.t(\"share:title\", { name })}\r\n \r\n \r\n \r\n {state.loading || state.error ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n persistIsPersisted(!isPersisted)}\r\n checked={isPersisted}\r\n >\r\n {loc.t(\"share:persist\")}\r\n \r\n close(false)}\r\n bsStyle=\"link\"\r\n className=\"pull-left\"\r\n >\r\n {loc.t(\"cancel\")}\r\n \r\n {!(state.loading || state.error) && (\r\n <>\r\n {isEdit ? (\r\n \r\n {loc.t(\"share:stop\")}\r\n \r\n ) : (\r\n setIsAdvanced(!isAdvanced)}\r\n bsStyle=\"link\"\r\n >\r\n {loc.t(\r\n `share:${\r\n isAdvanced ? \"simple\" : \"advanced\"\r\n }`\r\n )}\r\n \r\n )}\r\n \r\n {isSubmitting && (\r\n \r\n )}{\" \"}\r\n {loc.t(`share:${getActionKey(isEdit)}`)}\r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nShareModal.displayName = \"ShareModal\";\r\nexport const openShareModal = createModal(ShareModal);\r\n","import { openShareModal } from \"components/ShareModal\";\r\nimport { fetchDocInfo, fetchShareContext } from \"data/api\";\r\nimport {\r\n AllowedShareActionFlags,\r\n ItemStatuses,\r\n type ItemStatusesDTO,\r\n type ShareTypeEnum,\r\n} from \"data/types\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport { getEnumIcon } from \"components/ShareModal/Utils\";\r\nimport loc from \"i18next\";\r\n\r\ntype Context = {\r\n itemUri: string,\r\n formatId: number,\r\n name: string,\r\n itemStatus: ItemStatusesDTO,\r\n isDoc: boolean,\r\n isEdit: boolean,\r\n shareType?: ShareTypeEnum,\r\n multiple?: boolean,\r\n items?: Array,\r\n};\r\n\r\nclass share {\r\n constructor() {\r\n this.execute = this.execute.bind(this);\r\n this.getAttachment = this.getAttachment.bind(this);\r\n }\r\n\r\n logger: () => any = toastActionResult;\r\n\r\n async getAttachment(itemUri: string) {\r\n try {\r\n return await fetchDocInfo(itemUri);\r\n } catch {\r\n console.error(`Error while fetching document (${itemUri})`);\r\n return null;\r\n }\r\n }\r\n\r\n getModalProps({ multiple, isDoc, name, items }) {\r\n if (multiple) {\r\n const docCount = items.filter((i) => i.isDoc).length;\r\n const folderCount = items.length - docCount;\r\n const itemKey =\r\n folderCount && docCount\r\n ? \"mixed\"\r\n : docCount\r\n ? \"document\"\r\n : \"folder\";\r\n return {\r\n docCount,\r\n folderCount,\r\n itemKey,\r\n name: loc.t(`share:name.${itemKey}`, {\r\n document: loc.t(`share:name.document`, { count: docCount }),\r\n folder: loc.t(`share:name.folder`, { count: folderCount }),\r\n count: docCount + folderCount,\r\n }),\r\n };\r\n }\r\n return {\r\n docCount: isDoc ? 1 : 0,\r\n folderCount: isDoc ? 0 : 1,\r\n name,\r\n itemKey: isDoc ? \"document\" : \"folder\",\r\n };\r\n }\r\n\r\n /**\r\n * Opens Modal to (update/create) Share for folder/document\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ formatId: number }} { formatId }\r\n * @param {{ name: string }} { name }\r\n * @param {{ itemStatus?: ItemStatusesDTO }} { itemStatus }\r\n * @param {{ isDoc?: bool }} { isDoc }\r\n * @param {{ isEdit?: bool }} { isEdit }\r\n * @param {{ shareType?: ShareTypeEnum }} { shareType }\r\n * @param {{ items?: Array }} { items }\r\n * @param {{ multiple?: bool }} { multiple }\r\n */\r\n async execute({\r\n itemUri,\r\n formatId,\r\n name,\r\n itemStatus = ItemStatuses.Nothing,\r\n isDoc = false,\r\n isEdit = false,\r\n shareType,\r\n items,\r\n multiple,\r\n }: Context) {\r\n const itemUris = [];\r\n const formatIds = [];\r\n let attachments = [];\r\n if (multiple) {\r\n for (let item of items) {\r\n itemUris.push(item.itemUri);\r\n formatIds.push(item.formatId);\r\n item.isDoc &&\r\n attachments.push(await this.getAttachment(item.itemUri));\r\n }\r\n } else {\r\n itemUris.push(itemUri);\r\n formatIds.push(formatId);\r\n isDoc && attachments.push(await this.getAttachment(itemUri));\r\n }\r\n attachments = attachments.filter((a) => !!a);\r\n const {\r\n allowedActions:\r\n allowedShareActionFlags = AllowedShareActionFlags.Default,\r\n allowedAcl,\r\n shareType: shareTypeFromContext,\r\n } = await fetchShareContext(itemUris, formatIds);\r\n const aclEnumValues = allowedAcl?.map((value) => ({\r\n value,\r\n label: `$share:acl.${value}`,\r\n icon: getEnumIcon(value),\r\n }));\r\n\r\n // bail if no share action is available\r\n /* istanbul ignore else */\r\n if (\r\n !(\r\n (allowedShareActionFlags & AllowedShareActionFlags.Link) > 0 ||\r\n (allowedShareActionFlags & AllowedShareActionFlags.Share) > 0 ||\r\n (allowedShareActionFlags & AllowedShareActionFlags.Attachment) >\r\n 0 ||\r\n (allowedShareActionFlags & AllowedShareActionFlags.Pdf) > 0 ||\r\n (allowedShareActionFlags & AllowedShareActionFlags.Anonym) > 0\r\n )\r\n ) {\r\n this.logger(false, \"share:action_allowed\", {\r\n name,\r\n });\r\n return;\r\n }\r\n\r\n await openShareModal({\r\n itemUris,\r\n items: items || [{ itemUri, isDoc, name }],\r\n isEdit: isEdit && (itemStatus & ItemStatuses.Share) > 0,\r\n canEdit: (itemStatus & ItemStatuses.Share) > 0,\r\n isDoc,\r\n allowedShareActionFlags,\r\n aclEnumValues,\r\n attachments: attachments.length && attachments,\r\n shareType: shareType || shareTypeFromContext?.toLowerCase(),\r\n ...this.getModalProps({ isDoc, name, items, multiple }),\r\n });\r\n return true;\r\n }\r\n}\r\nexport default share;\r\n","import share from \"./share\";\r\nimport { ShareType } from \"data/types\";\r\n\r\n/**\r\n * opens the share dialog with share type link\r\n */\r\nclass folder_emailAttachment extends share {\r\n execute = (context) =>\r\n super.execute({ ...context, shareType: ShareType.Link });\r\n}\r\nexport default folder_emailAttachment;\r\n","import history from \"data/history\";\r\nimport { getRoute } from \"components/ItemUriLink\";\r\nimport { getFolderUri } from \"data/utils\";\r\n\r\n/**\r\n * opens the folder browse in current or newWindow\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ newWindow?: boolean}} { newWindow }\r\n * @param {{ toggles?: string | Array}} { toggles }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n newWindow?: boolean,\r\n toggles?: string | Array,\r\n};\r\n\r\nclass folder_preview {\r\n execute = ({ itemUri, newWindow, toggles }: Context) => {\r\n const folderUri = getFolderUri(itemUri);\r\n if (newWindow) {\r\n window.open(\r\n getRoute(folderUri, true, true, false, toggles),\r\n \"\",\r\n `status=no,location=no,toolbar=no,menubar=no,width=600px,height=640px,top=${\r\n Math.random() * 100\r\n },left=${Math.random() * 100}`\r\n );\r\n } else {\r\n history.push(getRoute(folderUri, false, false, false, toggles));\r\n }\r\n return true;\r\n };\r\n}\r\nexport default folder_preview;\r\n","import * as API from \"data/api\";\r\nimport { SearchItemType, type SearchRequestDTO } from \"data/types\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\n/**\r\n * toggles favorite flag for the given search request\r\n *\r\n * @param {{ searchRequest: SearchRequestDTO }} { searchRequest }\r\n */\r\nclass search_favorite {\r\n logger: () => any = toastActionResult;\r\n execute = async ({\r\n searchRequest,\r\n }: {\r\n searchRequest: SearchRequestDTO,\r\n }) => {\r\n const endpoint =\r\n searchRequest.searchType === SearchItemType.Favorite\r\n ? \"delFavoriteLink\"\r\n : \"addSearchFavorite\";\r\n const message =\r\n searchRequest.searchType === SearchItemType.Favorite\r\n ? \"breadcrumb.delfav\"\r\n : \"breadcrumb.addfav\";\r\n const payload =\r\n searchRequest.searchType === SearchItemType.Favorite\r\n ? searchRequest.id\r\n : searchRequest;\r\n try {\r\n const success = await API[endpoint](payload);\r\n this.logger(success, message, {\r\n name: searchRequest.name,\r\n });\r\n return true;\r\n } catch (error) {\r\n this.logger(false, message, { name: searchRequest.name });\r\n return false;\r\n }\r\n };\r\n}\r\nexport default search_favorite;\r\n","import history from \"data/history\";\r\nimport { searchRouteWithItem } from \"components/ItemUriLink\";\r\nimport { type SearchRequestDTO } from \"data/types\";\r\n\r\n/**\r\n * opens preview for the given search request\r\n *\r\n * @param {{ searchRequest: SearchRequestDTO }} { searchRequest }\r\n * @param {{ newWindow: bool}} { newWindow }\r\n */\r\n\r\nclass search_preview {\r\n execute = ({\r\n searchRequest,\r\n newWindow,\r\n }: {\r\n searchRequest: SearchRequestDTO,\r\n newWindow: boolean,\r\n }) => {\r\n const searchResultUrl = searchRouteWithItem(searchRequest);\r\n newWindow\r\n ? window.open(\r\n searchResultUrl,\r\n \"\",\r\n `status=no,location=no,toolbar=no,menubar=no,width=600px,height=640px,top=${\r\n Math.random() * 100\r\n },left=${Math.random() * 100}`\r\n )\r\n : history.push(searchResultUrl);\r\n return true;\r\n };\r\n}\r\nexport default search_preview;\r\n","import { resetDocFilters } from \"data/actions\";\r\n\r\n/**\r\n * clears current doclist filters\r\n */\r\n\r\nclass doc_resetFilters {\r\n execute = ({ dispatch }) => dispatch(resetDocFilters());\r\n}\r\nexport default doc_resetFilters;\r\n","import { exportDocsToCsvAction } from \"data/actions\";\r\n\r\n/**\r\n * exports current doclist to CSV\r\n */\r\n\r\nclass doc_exportCsv {\r\n execute = ({ dispatch }) => dispatch(exportDocsToCsvAction());\r\n}\r\nexport default doc_exportCsv;\r\n","import { downloadDocUri } from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\n/**\r\n * starts a download for the given itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n};\r\n\r\nclass doc_download {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n execute = async ({ itemUri }: Context): Promise => {\r\n try {\r\n const uri = await downloadDocUri(itemUri);\r\n if (uri == null)\r\n throw new Error(\"Error while creating Download URI (empty)\");\r\n\r\n // HACK: to download multiple files\r\n const temporaryDownloadLink = document.createElement(\"a\");\r\n temporaryDownloadLink.style.display = \"none\";\r\n temporaryDownloadLink.setAttribute(\"href\", uri);\r\n temporaryDownloadLink.setAttribute(\"download\", true);\r\n document.body.appendChild(temporaryDownloadLink);\r\n temporaryDownloadLink.click();\r\n document.body.removeChild(temporaryDownloadLink);\r\n\r\n return true;\r\n } catch (err) {\r\n return false;\r\n }\r\n };\r\n report = async (success: boolean): Promise => {\r\n !success && this.logger(success, \"commandAction:doc_download\");\r\n };\r\n}\r\nexport default doc_download;\r\n","import { openConfirmModal } from \"components/ConfirmModal\";\r\nimport { delItemUri } from \"data/api\";\r\nimport loc from \"i18next\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n items?: Array,\r\n};\r\n\r\nclass doc_delete {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n shouldRender: boolean = true;\r\n\r\n /**\r\n * renders confirm dialog\r\n *\r\n * @param {{ name: string }} { name }\r\n * @param {{ items?: Array }} { items }\r\n */\r\n render = async ({ name, items }: Context): Promise => {\r\n this.shouldRender = false;\r\n const count = items?.length ?? 1;\r\n return await openConfirmModal({\r\n body: loc.t(\"commandAction:doc_delete.confirmBody\", {\r\n name,\r\n count,\r\n }),\r\n confirmButton: loc.t(\"commandAction:doc_delete.confirmYes\", {\r\n count,\r\n }),\r\n });\r\n };\r\n\r\n /**\r\n * deletes an existing document by itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n */\r\n execute = async ({ itemUri }: Context): Promise => {\r\n try {\r\n return await delItemUri(itemUri);\r\n } catch (err) {\r\n console.warn(err);\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * logs success state\r\n *\r\n * @param { success: boolean } { success }\r\n */\r\n report = async (success: boolean): Promise => {\r\n this.logger(success === true, \"commandAction:doc_delete\");\r\n };\r\n}\r\n\r\nexport default doc_delete;\r\n","// @flow\r\nimport React from \"react\";\r\nimport loc from \"i18next\";\r\n\r\n/** Expand to Fullscreen svg image */\r\nconst ExpandButton = () => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\n/** Reduce from Fullscreen svg image */\r\nconst CompressButton = () => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\ntype Props = {\r\n /** whether we are now in Fullscreen mode */\r\n isFullscreen: boolean,\r\n /** callback when user clicked on icon */\r\n onClick: () => void,\r\n};\r\n\r\n/** Renders a Fullscreen button */\r\nconst ModalFullscreenButton = ({ isFullscreen, onClick }: Props) => (\r\n \r\n {isFullscreen ? : }\r\n \r\n {isFullscreen\r\n ? loc.t(\"common:exit_fullscreen\")\r\n : loc.t(\"common:enter_fullscreen\")}\r\n \r\n \r\n);\r\nModalFullscreenButton.displayName = \"ModalFullscreenButton\";\r\nexport default ModalFullscreenButton;\r\n","// @flow\r\nimport React, { useState, useCallback, useMemo } from \"react\";\r\nimport Modal from \"components/Modal\";\r\nimport TopRowExtras from \"./TopRowExtras\";\r\nimport CloseButton from \"components/ModalCloseButton\";\r\nimport FullscreenButton from \"components/ModalFullscreenButton\";\r\nimport \"./index.css\";\r\nimport { DocumentWithoutHash } from \"views/document\";\r\nimport { FullScreen, useFullScreenHandle } from \"react-full-screen\";\r\nimport bowser from \"data/bowser\";\r\nimport { createModal } from \"react-modal-promise\";\r\n\r\nexport type DocModalProps = $Shape<{\r\n /** which rowIndex is currently displayed (for back&fwd buttons) */\r\n activeRowIndex: number,\r\n /** how many document exist (for back&fwd buttons) - set to -1 to disable */\r\n totalCount: number,\r\n /** whether to trigger Print */\r\n triggerPrint: boolean,\r\n /** whether to trigger EditMode */\r\n triggerEditMode: boolean,\r\n /** callback when user clicks back or fwd buttons\r\n * @param {number} activeRowIndex new row index\r\n * @param {boolean} isNext if new row index is incremented/decremented\r\n * @return {number} new (modified) row index\r\n */\r\n onSetActiveRowIndex: (activeRowIndex: number, isNext: boolean) => number,\r\n /** callback to get itemUri by activeRowIndex\r\n * @param {number} activeRowIndex new row index\r\n * @return {string} itemUri\r\n */\r\n getActiveRowItemUri: (activeRowIndex: number) => string,\r\n /** (optional) callback to reopen DocModal with same context but differend itemUri\r\n * @param {string} itemUri itemUri to use to reopen DocModal\r\n */\r\n onReopenWith?: (itemUri: string) => void,\r\n}>;\r\n\r\ntype Props = DocModalProps & {\r\n /** document's itemUri to show */\r\n itemUri: string,\r\n /** whether to show modal */\r\n open: boolean,\r\n /** callback when user closes modal */\r\n close: () => void,\r\n /** selected toggles */\r\n toggles?: Array,\r\n /**pdf.js: search terms */\r\n searchTerm?: string,\r\n /** pdf.js: whether trigger browser print */\r\n triggerPrint: boolean,\r\n};\r\n\r\n/**\r\n * DocViewer in Modal window\r\n */\r\nexport const DocModal = ({\r\n totalCount = -1,\r\n onSetActiveRowIndex = (index: number) => index,\r\n getActiveRowItemUri = () => null,\r\n itemUri,\r\n activeRowIndex: activeRowIndexFromProps,\r\n close,\r\n open,\r\n toggles,\r\n onReopenWith,\r\n searchTerm,\r\n triggerPrint,\r\n triggerEditMode,\r\n}: Props) => {\r\n const [activeRowIndex, setActiveRowIndex] = useState(\r\n activeRowIndexFromProps\r\n );\r\n const [minCount, setMinCount] = useState(0);\r\n const [maxCount, setMaxCount] = useState(totalCount);\r\n\r\n const fullScreenHandle = useFullScreenHandle();\r\n\r\n const isNextDisabled = activeRowIndex + 1 === maxCount;\r\n const isPrevDisabled = activeRowIndex === minCount;\r\n\r\n const handleDeletedWhileOpen = useCallback(\r\n (itemUri, rowIndex, isNext) => {\r\n //Go back until you find a valid itemUri\r\n while (itemUri == null && rowIndex > minCount) {\r\n rowIndex = onSetActiveRowIndex(--rowIndex, isNext);\r\n itemUri = getActiveRowItemUri(rowIndex);\r\n }\r\n if (itemUri != null && typeof onReopenWith === \"function\") {\r\n onReopenWith(itemUri);\r\n }\r\n return close();\r\n },\r\n [\r\n onSetActiveRowIndex,\r\n getActiveRowItemUri,\r\n onReopenWith,\r\n close,\r\n minCount,\r\n ]\r\n );\r\n\r\n const onNext = useCallback(() => {\r\n if (isNextDisabled) return;\r\n const nextRowIndex = onSetActiveRowIndex(activeRowIndex + 1, true);\r\n const itemUri = getActiveRowItemUri(nextRowIndex);\r\n if (itemUri == null) {\r\n return handleDeletedWhileOpen(itemUri, activeRowIndex, true);\r\n }\r\n\r\n setActiveRowIndex(nextRowIndex);\r\n setMaxCount((maxCount) =>\r\n nextRowIndex === activeRowIndex && maxCount === totalCount\r\n ? nextRowIndex + 1\r\n : maxCount\r\n );\r\n }, [\r\n isNextDisabled,\r\n activeRowIndex,\r\n onSetActiveRowIndex,\r\n getActiveRowItemUri,\r\n handleDeletedWhileOpen,\r\n totalCount,\r\n ]);\r\n\r\n const onPrev = useCallback(() => {\r\n if (isPrevDisabled) return;\r\n const prevRowIndex = onSetActiveRowIndex(activeRowIndex - 1, false);\r\n const itemUri = getActiveRowItemUri(prevRowIndex);\r\n if (itemUri == null) {\r\n return handleDeletedWhileOpen(itemUri, prevRowIndex, false);\r\n }\r\n\r\n setActiveRowIndex(prevRowIndex);\r\n setMinCount((minCount) =>\r\n prevRowIndex === activeRowIndex && minCount === 0\r\n ? prevRowIndex\r\n : minCount\r\n );\r\n }, [\r\n isPrevDisabled,\r\n onSetActiveRowIndex,\r\n getActiveRowItemUri,\r\n handleDeletedWhileOpen,\r\n activeRowIndex,\r\n ]);\r\n\r\n const toggleFullscreen = useCallback(() => {\r\n /* istanbul ignore next */ !fullScreenHandle?.active\r\n ? fullScreenHandle.enter()\r\n : fullScreenHandle.exit();\r\n }, [fullScreenHandle]);\r\n\r\n const activeItemUri = useMemo(\r\n () => getActiveRowItemUri(activeRowIndex) || itemUri,\r\n [activeRowIndex, getActiveRowItemUri, itemUri]\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n onPrev={onPrev}\r\n onNext={onNext}\r\n topRowEnd={\r\n <>\r\n {!bowser.is(\"iOS\") && (\r\n \r\n )}\r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const openDocModal = createModal(DocModal);\r\n","// @flow\r\nimport { openDocModal, type DocModalProps } from \"components/DocModal\";\r\nimport { docRoute } from \"components/ItemUriLink\";\r\n\r\n/**\r\n * opens document Preview\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ newWindow: boolean}} { newWindow }\r\n * @param {{ setTarget?: () => void}} { setTarget }\r\n * @param {{ toggles?: string | Array}} { toggles }\r\n */\r\n\r\ntype Context = DocModalProps & {\r\n itemUri: string,\r\n newWindow?: boolean,\r\n setTarget?: () => any,\r\n toggles?: string | Array,\r\n};\r\n\r\nclass doc_preview {\r\n execute = async ({\r\n itemUri,\r\n newWindow,\r\n setTarget,\r\n toggles,\r\n ...docModalProps\r\n }: Context): Promise => {\r\n if (newWindow) {\r\n const target = window.open(\r\n docRoute(\r\n itemUri,\r\n true,\r\n true,\r\n toggles,\r\n docModalProps.searchTerm,\r\n docModalProps.triggerPrint\r\n ),\r\n \"\",\r\n `status=no,location=no,toolbar=no,menubar=no,width=600px,height=640px,top=${\r\n Math.random() * 100\r\n },left=${Math.random() * 100}`\r\n //\"scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=600,height=300,left=100,top=100\"\r\n );\r\n // Set target for PostMessage communication\r\n /* istanbul ignore else */\r\n if (typeof setTarget === \"function\") {\r\n setTarget(target);\r\n }\r\n return true;\r\n } else {\r\n await openDocModal({\r\n itemUri,\r\n toggles:\r\n typeof toggles === \"string\" ? toggles.split(\",\") : toggles,\r\n ...docModalProps,\r\n });\r\n return true;\r\n }\r\n };\r\n}\r\nexport default doc_preview;\r\n","// @flow\r\nimport loc from \"i18next\";\r\nimport { openDocModal } from \"components/DocModal\";\r\nimport { fetchRelatedDocs } from \"data/api\";\r\nimport { type ItemLinkTypeEnum } from \"data/types\";\r\nimport { toastActionResult, toastStyled, toastTypes } from \"data/toast\";\r\n\r\n/**\r\n * opens related documents in preview\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n itemLinkType: ItemLinkTypeEnum,\r\n getSource: ?boolean,\r\n};\r\n\r\nclass doc_related {\r\n /* istanbul ignore next */\r\n logger: () => any = (...args) =>\r\n typeof args[0] === \"boolean\"\r\n ? toastActionResult(...args)\r\n : toastStyled(...args);\r\n\r\n execute = async ({\r\n itemUri,\r\n itemLinkType,\r\n getSource,\r\n ...relatedDocsProps\r\n }: Context): Promise => {\r\n try {\r\n const rows: Array = await fetchRelatedDocs(\r\n itemUri,\r\n itemLinkType,\r\n getSource\r\n );\r\n if (!rows || !rows.length) {\r\n return false;\r\n }\r\n const docModalProps = Object.assign(relatedDocsProps, {\r\n itemUri: rows[0],\r\n activeRowIndex: 0,\r\n totalCount: rows.length > 1 ? rows.length : -1,\r\n getActiveRowItemUri: /* istanbul ignore next */ (rowIndex) =>\r\n rows[rowIndex] || undefined,\r\n });\r\n openDocModal({ ...docModalProps });\r\n return true;\r\n } catch (err) {\r\n this.logger({\r\n message: loc.t(\"itemActions:doc_related.error\"),\r\n ...toastTypes.failure,\r\n });\r\n }\r\n };\r\n\r\n report = async (success: boolean): Promise => {\r\n !success && this.logger(success === true, \"itemActions:doc_related\");\r\n };\r\n}\r\n\r\nexport default doc_related;\r\n","// @flow\r\nimport React, { useCallback } from \"react\";\r\nimport Modal from \"components/Modal\";\r\nimport Upload from \"views/upload\";\r\nimport CloseButton from \"components/ModalCloseButton\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport { usePostMessageHandler } from \"hooks\";\r\nimport { ModalAction } from \"hooks/PostMessage/Actions\";\r\nimport uppy from \"data/uppy\";\r\n\r\ntype Props = {\r\n /** whether to show modal */\r\n open: boolean,\r\n /** target folder itemUri */\r\n itemUri: string,\r\n /** callback when user closes Modal */\r\n close: () => void,\r\n};\r\n\r\n/**\r\n * UploadModal\r\n */\r\nconst UploadModal = ({ open, itemUri, close }: Props) => {\r\n const handleCancel = useCallback(() => {\r\n //#59285 Remove file from queue on Cancel\r\n uppy.reset();\r\n close();\r\n }, [close]);\r\n usePostMessageHandler({\r\n [ModalAction.Close]: handleCancel,\r\n [ModalAction.CloseLegacy]: handleCancel,\r\n });\r\n return (\r\n \r\n \r\n }\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default UploadModal;\r\nexport const openUploadModal = createModal(UploadModal);\r\n","import { openUploadModal } from \"components/UploadModal\";\r\n\r\n/**\r\n * opens the upload dialog to the given itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n */\r\n\r\nclass doc_upload {\r\n execute = async ({ itemUri }: { itemUri: string }) => {\r\n await openUploadModal({ itemUri });\r\n return true;\r\n };\r\n}\r\n\r\nexport default doc_upload;\r\n","// @flow\r\nimport React, { useEffect, useCallback } from \"react\";\r\nimport Modal from \"components/Modal\";\r\nimport Breadcrumb from \"containers/Breadcrumb\";\r\nimport UploadSelection from \"components/UploadSelection\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { useUppy } from \"hooks\";\r\nimport { addUppyEvents, removeUppyEvents, type uppyFile } from \"data/uppy\";\r\nimport { UploadMode } from \"data/types\";\r\nimport { toastStyled, toastTypes } from \"data/toast\";\r\nimport styles from \"./UploadVersionModal.module.css\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport { type DroppedFile } from \"containers/FileDropHandler\";\r\nimport { usePostMessageHandler } from \"hooks\";\r\nimport { ModalAction } from \"hooks/PostMessage/Actions\";\r\n\r\ntype Props = {\r\n /** target existing document's itemUri */\r\n itemUri: string,\r\n /** which file(s) to automatically add (used by FileDropHandler.onDrop) */\r\n files?: Array,\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog or upload was a success\r\n * @param {boolean} success whether file was successfully upload\r\n */\r\n close: (success: boolean) => void,\r\n};\r\n\r\n/** Uppy properties for UploadVersionModal */\r\nconst uppyProps = {\r\n maxNumberOfFiles: 1,\r\n};\r\n\r\n/**\r\n * Will display a File browser dialog and add a new version to an existing document\r\n */\r\nconst UploadVersionModal = ({ itemUri, files, open, close }: Props) => {\r\n usePostMessageHandler({\r\n [ModalAction.Close]: close,\r\n [ModalAction.CloseLegacy]: close,\r\n });\r\n\r\n const uppy = useUppy({\r\n uppyId: \"upload-version\",\r\n uppyProps,\r\n });\r\n\r\n const _onClose = useCallback(\r\n (success?: boolean) => {\r\n /* istanbul ignore else */\r\n if (success === true) {\r\n toastStyled(toastTypes.uppyComplete);\r\n }\r\n // all success -> reset uppy, close and refresh\r\n uppy.cancelAll();\r\n close(success === true);\r\n },\r\n [uppy, close]\r\n );\r\n\r\n const _onFileAdded = useCallback(\r\n (file: uppyFile): void => {\r\n /* istanbul ignore else */\r\n if (file.meta.itemUri == null) {\r\n // attach itemUri (managed server-side by TusMiddleware.cs)\r\n uppy.setFileMeta(file.id, {\r\n itemUri,\r\n mode: UploadMode.ModifyDocument,\r\n });\r\n // do it!\r\n uppy.upload();\r\n }\r\n },\r\n [uppy, itemUri]\r\n );\r\n\r\n const _onUploadSuccess = useCallback(\r\n (file: uppyFile, resp: Any, uploadURL: string): void => _onClose(true),\r\n [_onClose]\r\n );\r\n\r\n useEffect(() => {\r\n /* istanbul ignore else */\r\n if (uppy) {\r\n addUppyEvents(\r\n [\r\n { type: \"file-added\", callback: _onFileAdded },\r\n { type: \"upload-success\", callback: _onUploadSuccess },\r\n ],\r\n uppy\r\n );\r\n\r\n // user dropped file with FileDropHandler\r\n if (Array.isArray(files) && files.length > 0) {\r\n try {\r\n uppy.addFile(files[0]);\r\n } catch (err) /* istanbul ignore next */ {\r\n // ... but failed restrictions - close dialog\r\n console.warn(\"UploadVersionModal Cannot addFile: \", err);\r\n _onClose(false);\r\n }\r\n }\r\n\r\n return () => {\r\n removeUppyEvents(\r\n [\r\n { type: \"file-added\", callback: _onFileAdded },\r\n { type: \"upload-success\", callback: _onUploadSuccess },\r\n ],\r\n uppy\r\n );\r\n };\r\n }\r\n }, [uppy, files, _onFileAdded, _onUploadSuccess, _onClose]);\r\n\r\n return (\r\n \r\n \r\n \r\n {\" \"}\r\n \r\n \r\n \r\n {uppy && }\r\n \r\n );\r\n};\r\nexport default UploadVersionModal;\r\nexport const openUploadVersionModal = createModal(UploadVersionModal);\r\n","import { openUploadVersionModal } from \"components/UploadVersionModal\";\r\nimport { type DroppedFile } from \"containers/FileDropHandler\";\r\n\r\n/**\r\n * opens the upload dialog to upload a new document version to the given itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ files: Array }} { files }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n files?: Array,\r\n};\r\nclass doc_uploadVersion {\r\n execute = async ({ itemUri, files }: Context) => {\r\n await openUploadVersionModal({\r\n files,\r\n itemUri,\r\n });\r\n return true;\r\n };\r\n}\r\n\r\nexport default doc_uploadVersion;\r\n","import share from \"./share\";\r\nimport { ShareType } from \"data/types\";\r\n\r\n/**\r\n * opens the share dialog with share type link\r\n */\r\n\r\nclass doc_emailLink extends share {\r\n execute = async (context) =>\r\n super.execute({\r\n ...context,\r\n shareType: ShareType.Link,\r\n });\r\n}\r\nexport default doc_emailLink;\r\n","import share from \"./share\";\r\nimport { ShareType } from \"data/types\";\r\n\r\n/**\r\n * opens the share dialog with share type attachment\r\n */\r\n\r\nclass doc_emailAttachment extends share {\r\n execute = async (context) => {\r\n return super.execute({\r\n ...context,\r\n shareType: ShareType.Attachment,\r\n });\r\n };\r\n}\r\nexport default doc_emailAttachment;\r\n","import { formSetEditModeAction } from \"data/actions\";\r\n\r\n/**\r\n * starts editing the current document\r\n */\r\n\r\nclass doc_editClassification {\r\n execute = ({ dispatch }) => {\r\n dispatch(formSetEditModeAction(\"doc\", true));\r\n return true;\r\n };\r\n}\r\nexport default doc_editClassification;\r\n","import { getWebDavHttpLink } from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\n/**\r\n * opens webDav edit http link for a document\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n};\r\n\r\nclass doc_editWebDav {\r\n logger: () => any = toastActionResult;\r\n\r\n execute = async ({ itemUri, name }: Context): Promise => {\r\n try {\r\n const webDavUrl = await getWebDavHttpLink(itemUri, name);\r\n if (webDavUrl == null || String(webDavUrl).length === 0) {\r\n throw new Error(`Invalid WebDavURL`);\r\n }\r\n window.location.assign(webDavUrl);\r\n return true;\r\n } catch (err) {\r\n return false;\r\n }\r\n };\r\n\r\n report = async (success: boolean): Promise => {\r\n this.logger(success === true, \"itemActions:doc_editWebDav\");\r\n };\r\n}\r\n\r\nexport default doc_editWebDav;\r\n","import { getCloudInfo } from \"data/api\";\r\nimport { toastActionResult, toastStyled, toastTypes } from \"data/toast\";\r\n\r\n/**\r\n * opens webDav edit http link for a document synced in cloud\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n * @param {{ onlineEditor?: boolean }} { onlineEditor }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n onlineEditor?: boolean,\r\n};\r\n\r\nconst SupportedExtensions = [\".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\"];\r\n\r\nclass doc_editCloud {\r\n logger: () => any = toastActionResult;\r\n\r\n execute = async ({\r\n itemUri,\r\n name,\r\n onlineEditor = false,\r\n ext,\r\n }: Context): Promise => {\r\n const i18n = onlineEditor\r\n ? \"itemActions:doc_editCloud\"\r\n : \"itemActions:doc_editCloudLocal\";\r\n\r\n if (!onlineEditor && !SupportedExtensions.includes(ext)) {\r\n toastStyled({\r\n ...toastTypes.failure,\r\n toastId: \"doc_editCloudLocal\",\r\n message: `$${i18n}.not_supported`,\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n const [webEditUrl, webDavUrl] = await getCloudInfo(itemUri, name);\r\n const args: Array = [];\r\n if (onlineEditor) {\r\n args.push(webEditUrl);\r\n args.push(\"\");\r\n args.push(\r\n `status=no,location=no,toolbar=no,menubar=no,width=600px,height=640px,top=${\r\n Math.random() * 100\r\n },left=${Math.random() * 100}`\r\n );\r\n } else {\r\n args.push(webDavUrl);\r\n }\r\n if (args[0] == null || String(args[0]).length === 0) {\r\n throw new Error(\r\n `Invalid ${onlineEditor ? \"WebEditURL\" : \"WebDavURL\"}`\r\n );\r\n }\r\n window.open(...args);\r\n this.logger(true, i18n);\r\n } catch (err) {\r\n this.logger(false, i18n);\r\n }\r\n };\r\n}\r\n\r\nexport default doc_editCloud;\r\n","import { toggleFavorite } from \"containers/Breadcrumb\";\r\n\r\n/**\r\n * toggles favorite flag for the given itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ isFav: boolean}} { isFav }\r\n * @param {{ name: string}} { name }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n isFav: boolean,\r\n name: string,\r\n};\r\n\r\nclass favorite {\r\n queueMultiple: boolean = true;\r\n execute = ({ itemUri, isFav, name }: Context) =>\r\n toggleFavorite({ isFav, itemUri, name, logger: this.logger });\r\n}\r\nexport default favorite;\r\n","import { openExternalLinkModal } from \"components/ExternalLinkModal\";\r\nimport { mapValues, tokenize } from \"data/utils\";\r\nimport { fetchForm } from \"data/api\";\r\n\r\n/**\r\n * opens the specified url either in a modal popup or new browser window\r\n * @param {{ asModal?: boolean}} { asModal } whether to open as Modal within inPoint\r\n * @param {{ docked?: boolean}} { docked } whether to open as a Docked Modal (only with asModal=true)\r\n * @param {{ url: string }} { url } supports interpolation with any context properties\r\n * @param {{ title?: string }} { title } Modal or Browser window title\r\n * @param {{ specs?: string }} { specs } Browser window(..., specs) specifications\r\n * @param {{ useFormTokens?: boolean }} { useFormTokens } whether to load all Form fields/attributes for the tokens\r\n */\r\n\r\ntype Context = {\r\n asModal?: boolean,\r\n docked?: boolean,\r\n url: string,\r\n title?: string,\r\n specs?: string,\r\n useFormTokens?: boolean,\r\n context: ?Object,\r\n};\r\n\r\nclass link {\r\n execute = async ({\r\n asModal,\r\n docked,\r\n url,\r\n title,\r\n specs,\r\n useFormTokens,\r\n ...context\r\n }: Context): Promise => {\r\n // in this case ALL context props are URL encoded\r\n let encodedContext = mapValues(context, (value) =>\r\n encodeURIComponent(value)\r\n );\r\n\r\n try {\r\n if (useFormTokens === true) {\r\n const form = await fetchForm(context.itemUri);\r\n let rawValues = {};\r\n if (form.fields && form.fields.length > 0) {\r\n form.fields.forEach(\r\n (field) =>\r\n (rawValues[\"ip_\" + field.name] = encodeURIComponent(\r\n field.value\r\n ))\r\n );\r\n }\r\n\r\n if (form.attributes && form.attributes.length > 0) {\r\n form.attributes.forEach(\r\n (attribute) =>\r\n (rawValues[\"ea_\" + attribute.name] =\r\n encodeURIComponent(attribute.value))\r\n );\r\n }\r\n encodedContext = Object.assign(encodedContext, rawValues);\r\n }\r\n } catch (e) {\r\n console.error(\"Error while useFormTokens\", e);\r\n alert(\"Sorry an error has occurred while fetching form; Aborting.\");\r\n return false;\r\n }\r\n const tokenizedUrl = tokenize(\r\n url.replace(\"{ea.\", \"{ea_\").replace(\"{ip.\", \"{ip_\"), // hack since tokenize does not support sub-objects\r\n encodedContext\r\n );\r\n if (asModal === true) {\r\n openExternalLinkModal({ url: tokenizedUrl, name: title, docked });\r\n } else {\r\n window.open(\r\n tokenizedUrl,\r\n title || \"\",\r\n specs || \"\" // \"width=600px,height=640px\"\r\n //\"scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=600,height=300,left=100,top=100\"\r\n );\r\n }\r\n return true;\r\n };\r\n}\r\nexport default link;\r\n","import { lock as lockApi } from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\nclass lock {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n execute = async ({ itemUri }: { itemUri: string }): Promise => {\r\n try {\r\n return await lockApi(itemUri);\r\n } catch (err) {\r\n return false;\r\n }\r\n };\r\n report = async (success: boolean): Promise => {\r\n this.logger(success === true, \"commandAction:lock\");\r\n };\r\n}\r\n\r\nexport default lock;\r\n","import { unlock as unlockApi } from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\nclass unlock {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n execute = async ({ itemUri }: { itemUri: string }): Promise => {\r\n try {\r\n return await unlockApi(itemUri);\r\n } catch (err) {\r\n return false;\r\n }\r\n };\r\n report = async (success: boolean): Promise => {\r\n this.logger(success === true, \"commandAction:unlock\");\r\n };\r\n}\r\n\r\nexport default unlock;\r\n","import { subscribe as subscribeApi } from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\n/**\r\n * Subscribes a given resource by itemUri, with an optional confirm dialog\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n\r\nclass subscribe {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n\r\n execute = async ({ itemUri, name }: { itemUri: string, name: string }) => {\r\n try {\r\n return await subscribeApi(itemUri, name);\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n report = (success, { name }: Context) => {\r\n this.logger(success, \"commandAction:subscribe\", {\r\n name,\r\n context: name ? \"name\" : undefined,\r\n });\r\n };\r\n}\r\n\r\nexport default subscribe;\r\n","import * as API from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport { openConfirmModal } from \"components/ConfirmModal\";\r\nimport loc from \"i18next\";\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n confirm?: boolean,\r\n};\r\n\r\nclass unsubscribe {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n /**\r\n * Api call to either unsubscribe by link ID or itemUri\r\n *\r\n * @param {string} api unsubscribe API Endpoint, ByID or ByItemUri\r\n * @param {string | { linkID: number, itemUri: string }} payload API payload, that will be sent.\r\n * @param {string} name webDavName of ressource, for notification purposes.\r\n * @returns {Promise} Promise of the API call\r\n */\r\n handleUnsubscribe = async (\r\n api: string,\r\n payload: string | { linkID: number, itemUri: string },\r\n name: string\r\n ) => {\r\n try {\r\n const success = await API[`unsubscribe${api}`](payload);\r\n this.logger(success, \"commandAction:unsubscribe\", { name });\r\n return true;\r\n } catch (error) {\r\n this.logger(false, \"commandAction:unsubscribe\", { name });\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Unsubscribes a given resource by itemUri, with an optional confirm dialog\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n * @param {{ confirm: bool }} { confirm }\r\n */\r\n execute = async ({ itemUri, name, confirm = false }: Context) => {\r\n if (!confirm) {\r\n return this.handleUnsubscribe(\"ByItemUri\", itemUri, name);\r\n }\r\n try {\r\n const item = await API.isSubscribed(itemUri);\r\n if (!item) {\r\n this.logger(false, \"commandAction:unsubscribe\", { name });\r\n return false;\r\n }\r\n const payload = {\r\n linkID: item.id,\r\n itemUri: item.itemUri,\r\n };\r\n if (item.itemUri === itemUri) {\r\n return this.handleUnsubscribe(\"ById\", payload, name);\r\n }\r\n const confirmed = await openConfirmModal({\r\n body: loc.t(\"commandAction:unsubscribe.confirm\", {\r\n name,\r\n subscription: item.name,\r\n context: /* istanbul ignore next*/ name\r\n ? \"name\"\r\n : undefined,\r\n }),\r\n confirmButton: loc.t(\"commandAction:unsubscribe.name\"),\r\n });\r\n return (\r\n confirmed && this.handleUnsubscribe(\"ById\", payload, item.name)\r\n );\r\n } catch (error) {\r\n /* istanbul ignore next */\r\n return this.logger(false, \"commandAction:unsubscribe\", { name });\r\n }\r\n };\r\n}\r\n\r\nexport default unsubscribe;\r\n","import { toastActionResult } from \"data/toast\";\r\nimport { getRoute } from \"components/ItemUriLink\";\r\nimport { downloadDocUri } from \"data/api\";\r\n\r\ntype Context = {\r\n name: string,\r\n itemUri: string,\r\n isDoc: boolean,\r\n isDocSendByEmailAllowed?: boolean,\r\n isDocDownloadAllowed?: boolean,\r\n};\r\n\r\nclass share_web {\r\n logger: () => any = toastActionResult;\r\n execute = async ({\r\n name,\r\n itemUri,\r\n isDoc,\r\n isDocSendByEmailAllowed,\r\n isDocDownloadAllowed,\r\n }: Context) => {\r\n // double-check (itemAction.shouldBeVisible should already have hasBrowser_webShareApi())\r\n if (navigator.share === undefined) {\r\n return false;\r\n }\r\n const text = \"Your link is ready to be shared.\";\r\n let files = undefined;\r\n if (isDoc && isDocSendByEmailAllowed && isDocDownloadAllowed) {\r\n try {\r\n const uri = await downloadDocUri(itemUri);\r\n const response = await fetch(uri);\r\n if (!response.ok) throw new Error(\"Could not retrieve file\");\r\n // retrieve real filename/mimetype\r\n name = getFileNameFromContentDisposition(\r\n name,\r\n response.headers.get(\"content-disposition\")\r\n );\r\n const blob = await response.blob();\r\n // TODO #44618 eventually support attaching multiple files\r\n files = [new File([blob], name, { type: blob.type })];\r\n\r\n /* istanbul ignore else */\r\n if (files && files.length > 0) {\r\n if (!navigator.canShare || !navigator.canShare({ files })) {\r\n return false;\r\n }\r\n }\r\n } catch (e) {\r\n console.error(\"Error while trying to download/attach file\", e);\r\n return false;\r\n }\r\n }\r\n try {\r\n await navigator.share({\r\n files,\r\n title: name,\r\n text,\r\n url: getRoute(itemUri, true, true, isDoc),\r\n });\r\n return true;\r\n } catch (error) {\r\n console.error(\"Error while trying to share\", error);\r\n return false;\r\n }\r\n };\r\n report = (success) => {\r\n !success && this.logger(success, \"itemActions:share_web\");\r\n };\r\n}\r\n\r\nexport function getFileNameFromContentDisposition(name, contentDisposition) {\r\n const regex = /filename[^;=\\n]*=(UTF-8(['\"]*))?([^;\\s]*)/;\r\n const matches = regex.exec(contentDisposition);\r\n let filename = name;\r\n\r\n if (matches != null && matches[3]) {\r\n filename = matches[3].replace(/['\"]/g, \"\");\r\n }\r\n\r\n return decodeURI(filename);\r\n}\r\n\r\nexport default share_web;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport Form from \"react-bootstrap/lib/Form\";\r\nimport FormGroup from \"react-bootstrap/lib/FormGroup\";\r\nimport ClearableInput from \"@hs/clearable-input\";\r\nimport ControlLabel from \"react-bootstrap/lib/ControlLabel\";\r\nimport HelpBlock from \"react-bootstrap/lib/HelpBlock\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport { createModal } from \"react-modal-promise\";\r\n// import \"font-awesome/css/font-awesome.css\";\r\n// import FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** text to show in OK button */\r\n okButton?: string,\r\n /** text to show in Cancel button */\r\n cancelButton?: string,\r\n /** Modal Dialog title */\r\n title?: string,\r\n /** default name to show */\r\n name?: string,\r\n /** text to show for the input text label */\r\n nameLabel?: string,\r\n /** callback to validate name before submitting\r\n * @param {string} newName new value typed by user\r\n */\r\n validation?: (newName: string) => Object,\r\n};\r\n\r\ntype State = {\r\n newName: string,\r\n validationMessage: ?string,\r\n};\r\n\r\n/** presents a (re-)Name dialog to the user\r\n * @returns {string} new name user has chosen, null if cancelled\r\n */\r\nexport class NameModal extends React.PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n newName: props.name || \"\",\r\n validationMessage: null,\r\n };\r\n }\r\n\r\n _isValid = () =>\r\n this.state.newName &&\r\n String(this.state.newName).length > 0 &&\r\n this.state.validationMessage == null;\r\n _validationState = () => (this._isValid() ? null : \"error\");\r\n\r\n _onSubmit = async () => {\r\n if (typeof this.props.validation === \"function\") {\r\n var result = await this.props.validation(this.state.newName);\r\n if (result != null) {\r\n this.setState({ validationMessage: result });\r\n return;\r\n }\r\n }\r\n this.props.close(this.state.newName);\r\n };\r\n\r\n _onChange = (newName: string) =>\r\n this.setState({ newName, validationMessage: null });\r\n\r\n render() {\r\n const {\r\n open,\r\n close,\r\n okButton = loc.t(\"confirm.yes\"),\r\n cancelButton = loc.t(\"confirm.cancel\"),\r\n nameLabel,\r\n title,\r\n } = this.props;\r\n return (\r\n close(null)}\r\n // dialogClassName={styles.modal}\r\n >\r\n {title && (\r\n \r\n {title}\r\n \r\n )}\r\n \r\n e.preventDefault()\r\n }\r\n style={{\r\n padding: 50,\r\n // display: \"flex\",\r\n // flexDirection: \"column\",\r\n // height: \"100%\"\r\n }}\r\n >\r\n \r\n {nameLabel && (\r\n {nameLabel}\r\n )}\r\n \r\n {this.state.validationMessage && (\r\n \r\n {this.state.validationMessage}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {okButton}\r\n \r\n close(null)}\r\n >\r\n {cancelButton}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport const openNameModal = createModal(NameModal);\r\n","import { openNameModal } from \"components/NameModal\";\r\nimport { openProgressModal } from \"components/ProgressModal\";\r\nimport {\r\n validateForm,\r\n createFolderFromTemplate,\r\n createFolderTemplateGetItemUri,\r\n} from \"data/api\";\r\nimport loc from \"i18next\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport isEmpty from \"lodash/isEmpty\";\r\nimport history from \"data/history\";\r\nimport { getRoute } from \"components/ItemUriLink\";\r\nimport { getLocalizedText } from \"data/utils\";\r\n\r\n/**\r\n * Will validate the model against the server\r\n * @async\r\n * @returns {Object} containing all localized validation errors per field e.g. {fieldName:error, fieldName:error...}\r\n * @memberof FormContainer\r\n */\r\nexport const ValidateTemplate = async (\r\n template: string,\r\n itemUri: string,\r\n newTargetFolderName: string\r\n): Object => {\r\n // this.abortController = new AbortController();\r\n const validationErrors = await validateForm(\r\n true, //isNew\r\n false, //isDoc\r\n itemUri,\r\n true, //validateWebDavName\r\n { ip: { $NAME$: newTargetFolderName } } // we want to send the {ip:{...}} model\r\n // this.abortController.signal\r\n );\r\n // localize error messages\r\n const locErrors = {};\r\n if (!isEmpty(validationErrors)) {\r\n Object.keys(validationErrors).forEach(\r\n (k) => (locErrors[k] = getLocalizedText(validationErrors[k]))\r\n );\r\n return locErrors[\"ip.Name\"];\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * interval pulling for job status; will redirect once new itemUri received\r\n */\r\nexport const CheckJobStatus = ({\r\n jobId,\r\n close,\r\n logger = toastActionResult,\r\n}: {\r\n jobId: number,\r\n close: () => void,\r\n logger: () => void,\r\n}) => {\r\n let times = 1;\r\n const interval = window.setInterval(async () => {\r\n /* istanbul ignore if */\r\n if (times > 12) {\r\n //one minute? too long, bail user\r\n window.clearInterval(interval);\r\n logger(false, \"folder:action_createFolder_template\");\r\n close();\r\n } else {\r\n try {\r\n const newTargetItemUri = await createFolderTemplateGetItemUri(\r\n jobId\r\n );\r\n /* istanbul ignore else */\r\n if (String(newTargetItemUri).startsWith(\"pam-item://\")) {\r\n window.clearInterval(interval);\r\n close();\r\n history.push(getRoute(newTargetItemUri, false, false));\r\n logger(true, \"folder:action_createFolder_template\");\r\n } else {\r\n times++;\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n window.clearInterval(interval);\r\n logger(false, \"folder:action_createFolder_template\");\r\n close();\r\n }\r\n }\r\n }, 5000);\r\n};\r\n\r\ntype Context = {\r\n itemUri: string,\r\n template: string,\r\n targetFolderName?: string,\r\n};\r\n\r\nclass createFolder_template {\r\n logger: () => any = toastActionResult;\r\n\r\n /**\r\n * will actually create the job for creating the folder template and show a progress modal\r\n */\r\n createFolder = ({\r\n itemUri,\r\n template,\r\n newTargetFolderName,\r\n }: {\r\n itemUri: string,\r\n template: string,\r\n newTargetFolderName?: string,\r\n }) =>\r\n openProgressModal({\r\n icon: \"sitemap\",\r\n title: loc.t(\"folder:action_createFolder_template.creating\", {\r\n name: newTargetFolderName,\r\n }),\r\n doWork: async (close, setError) => {\r\n try {\r\n const jobId = await createFolderFromTemplate(\r\n template,\r\n itemUri,\r\n newTargetFolderName\r\n );\r\n if (jobId == null)\r\n throw new Error(\"Error while creating a JobID\");\r\n CheckJobStatus({ jobId, close, logger: this.logger });\r\n } catch (err) {\r\n /* istanbul ignore next */ if (err && err.message)\r\n setError(err.message);\r\n console.warn(err);\r\n // notify user\r\n this.logger(false, \"folder:action_createFolder_template\");\r\n return null;\r\n }\r\n },\r\n });\r\n\r\n targetFolderName: string = \"\";\r\n shouldRender: boolean = true;\r\n render = async ({\r\n itemUri,\r\n template,\r\n targetFolderName,\r\n }: Context): Promise => {\r\n this.targetFolderName = await openNameModal({\r\n itemUri,\r\n name: targetFolderName,\r\n title: loc.t(\"folder:action_createFolder_template.title\", {\r\n name: template,\r\n }),\r\n nameLabel: loc.t(\"folder:action_createFolder_template.nameLabel\"),\r\n okButton: loc.t(\r\n \"folder:action_createFolder_template.confirmButton\"\r\n ),\r\n validation: /* istanbul ignore next */ (\r\n newTargetFolderName: String\r\n ) => ValidateTemplate(template, itemUri, newTargetFolderName),\r\n });\r\n if (this.targetFolderName == null) return false;\r\n return true;\r\n };\r\n\r\n execute = ({\r\n itemUri,\r\n template,\r\n targetFolderName,\r\n }: Context): Promise => {\r\n this.createFolder({\r\n itemUri,\r\n template,\r\n newTargetFolderName: this.targetFolderName,\r\n });\r\n this.logger(true, \"folder:action_createFolder_template\");\r\n return true;\r\n };\r\n}\r\n\r\nexport default createFolder_template;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { useAsync } from \"hooks\";\r\nimport loc from \"i18next\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport Modal from \"components/Modal\";\r\nimport Status from \"components/Status\";\r\nimport NoData from \"components/NoData\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Constants from \"data/constants\";\r\nimport { fetchNewWorkflows } from \"data/api\";\r\nimport { type WorkflowDTO, WorkflowProvider } from \"data/types\";\r\nimport { openExternalLinkModal } from \"components/ExternalLinkModal\";\r\nimport ItemActions from \"components/ActionPanel/ItemActions\";\r\n\r\n/**\r\n * shows the Workflow Actions\r\n */\r\nexport const WorkflowActions = ({\r\n onClick,\r\n workflows,\r\n}: {\r\n onClick: (wf: WorkflowDTO) => void,\r\n workflows: Array,\r\n}) => {\r\n const workflowActions = workflows.map((wf) =>\r\n Object.assign({}, wf, {\r\n desc: wf.description,\r\n })\r\n );\r\n return ;\r\n};\r\nWorkflowActions.displayName = \"ListWorkflowsModal.Actions\";\r\n\r\ntype Props = {\r\n /** whether to show modal */\r\n open: boolean,\r\n /** callback when user closes modal */\r\n close: () => void,\r\n /** itemUri to start the Workflow with */\r\n itemUri: string,\r\n};\r\n\r\nexport const ListWorkflowsModal = ({ open, close, itemUri }: Props) => {\r\n const state = useAsync(async () => {\r\n try {\r\n return await fetchNewWorkflows(itemUri);\r\n } catch (err) {\r\n console.warn(\"Error while fetchNewWorkflows\", err);\r\n throw err;\r\n }\r\n }, [itemUri]);\r\n\r\n return (\r\n \r\n \r\n \r\n {\" \"}\r\n {loc.t(\"itemActions:wf_start.name\")}\r\n \r\n \r\n \r\n {state.loading && }\r\n {state.error && }\r\n\r\n {state.value != null &&\r\n Array.isArray(state.value) &&\r\n state.value.length > 0 ? (\r\n {\r\n if (\r\n workflow.provider ===\r\n WorkflowProvider.inPointWorkflow\r\n ) {\r\n openExternalLinkModal({\r\n url: workflow.startLink,\r\n name: workflow.name,\r\n docked: true,\r\n });\r\n } else {\r\n window.open(\r\n workflow.startLink,\r\n \"\",\r\n \"noopener=yes,noreferrer=yes\"\r\n );\r\n }\r\n close();\r\n }}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\nListWorkflowsModal.displayName = \"ListWorkflowsModal\";\r\n\r\nexport const openListWorkflowsModal = createModal(ListWorkflowsModal);\r\n","// @flow\r\n\r\nimport { openListWorkflowsModal } from \"components/ListWorkflowsModal\";\r\n\r\n/**\r\n * Start Workflow with selected itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri to start Workflow with }\r\n */\r\n\r\nclass wf_start {\r\n execute = async ({ itemUri }: { itemUri: string }) => {\r\n await openListWorkflowsModal({ itemUri });\r\n return true;\r\n };\r\n}\r\n\r\nexport default wf_start;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { type ItemFlowConfigDTO } from \"data/types\";\r\nimport Icons from \"@hs/icons\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\n\r\nconst FlowCardImage = ({ flow }: { flow: ItemFlowConfigDTO }) => {\r\n if (\r\n flow.icon &&\r\n (flow.icon.startsWith(\"http\") ||\r\n flow.icon.startsWith(\"data:image\") ||\r\n flow.icon.startsWith(\"/\") ||\r\n flow.icon.startsWith(\"./\") ||\r\n flow.icon.startsWith(\"../\"))\r\n )\r\n return \"\";\r\n\r\n switch (flow.commandAction.name) {\r\n case \"itemFlow_folder\":\r\n return ;\r\n case \"itemFlow_docTemplate\":\r\n if (flow.icon.startsWith(\".\")) {\r\n return ;\r\n } else\r\n return ;\r\n case \"itemFlow_folderTemplate\":\r\n return ;\r\n\r\n default:\r\n return (\r\n \r\n );\r\n }\r\n};\r\nFlowCardImage.displayName = \"ItemFlowsList.FlowCardImage\";\r\nexport default FlowCardImage;\r\n","import React, { useMemo } from \"react\";\r\nimport {\r\n type ItemFlowConfigDTO,\r\n SiteType,\r\n CardType,\r\n CardItemType,\r\n} from \"data/types\";\r\nimport CardItem from \"components/CardList/CardItem\";\r\nimport \"components/CardList/index.css\";\r\nimport NoData from \"components/NoData\";\r\nimport FlowCardImage from \"./FlowCardImage\";\r\nimport Divider from \"components/Divider\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport loc from \"i18next\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport { removeSpaces } from \"data/integrationTestUtils\";\r\n\r\ntype Props = {\r\n /** current folder's itemUri */\r\n itemUri: string,\r\n /** current filterText */\r\n filterText: string,\r\n /** list of all flows */\r\n flows: Array,\r\n /** currently selected flow */\r\n selectedFlow: ?ItemFlowConfigDTO,\r\n /** callback when user selects a flow\r\n * @param {ItemFlowConfigDTO} flow selected\r\n */\r\n onSelect: (flow: ItemFlowConfigDTO) => void,\r\n};\r\n\r\nconst ItemFlowsList = ({\r\n itemUri,\r\n filterText,\r\n flows = [],\r\n selectedFlow,\r\n onSelect,\r\n}: Props) => {\r\n const suggested = useMemo(\r\n () => flows.filter((flow) => flow.isSuggested),\r\n [flows]\r\n );\r\n const others = useMemo(\r\n () => flows.filter((flow) => !flow.isSuggested),\r\n [flows]\r\n );\r\n if (flows.length === 0) return ;\r\n\r\n const renderCardItem = (flow) => (\r\n }\r\n onClick={() => onSelect(flow)}\r\n dataTest={`flowListItem${removeSpaces(flow.name)}`}\r\n />\r\n );\r\n return (\r\n \r\n {/* TODO \r\n meh\r\n */}\r\n {suggested.length > 0 && (\r\n \r\n {loc.t(\"itemflows:list.isSuggested\")}{\" \"}\r\n \r\n \r\n }\r\n >\r\n \r\n {suggested.map((flow) => renderCardItem(flow))}\r\n \r\n \r\n )}\r\n {others.length > 0 && (\r\n \r\n {loc.t(\"itemflows:list.others\")}{\" \"}\r\n \r\n \r\n }\r\n >\r\n \r\n {others.map((flow) => renderCardItem(flow))}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\nItemFlowsList.displayName = \"ItemFlowsList\";\r\nexport default ItemFlowsList;\r\n","// @flow\r\nimport React from \"react\";\r\nimport ToggleButtonGroup from \"react-bootstrap/lib/ToggleButtonGroup\";\r\nimport ToggleButton from \"react-bootstrap/lib/ToggleButton\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { type ItemFlowCategory } from \"data/types\";\r\nimport { getLocalizedText } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** currently selected type */\r\n value?: string,\r\n /** flow categories */\r\n categories: Array,\r\n /** callback when user selects a new type to filter\r\n * @param {string} newFilterType new selected filter type\r\n */\r\n onChange: (newFilterType: string) => void,\r\n /** optional CSS style to apply */\r\n style?: Object,\r\n /** optional CSS classname to apply */\r\n className?: string,\r\n};\r\n\r\nconst CategoryFilter = ({\r\n value,\r\n categories,\r\n onChange,\r\n style,\r\n className,\r\n}: Props) => (\r\n \r\n {categories.map((category) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n);\r\nCategoryFilter.displayName = \"ItemFlows.CategoryFilter\";\r\nexport default CategoryFilter;\r\n","import React from \"react\";\r\nimport { type Props } from \"./Factory\";\r\n\r\nconst CustomItemFlow = (props: Props) => (\r\n \r\n);\r\n\r\nCustomItemFlow.displayName = \"ItemFlowsInput.Custom\";\r\nexport default CustomItemFlow;\r\n","import React, { useState } from \"react\";\r\nimport { useAsync } from \"hooks\";\r\nimport { fetchItemFlowForm } from \"data/api\";\r\nimport {\r\n type NewFormTypeEnum,\r\n type ItemFlowTemplateTypeEnum,\r\n} from \"data/types\";\r\nimport FormContainer from \"containers/Form\";\r\nimport { type Props } from \"./Factory\";\r\nimport Status from \"components/Status\";\r\nimport Constants from \"data/constants\";\r\nimport loc from \"i18next\";\r\nimport produce from \"immer\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\ntype FormProps = Props & {\r\n formType: NewFormTypeEnum,\r\n templateType: ItemFlowTemplateTypeEnum,\r\n templateId: string,\r\n};\r\n\r\n// centrally load new form definition required by any NewItemType (since all use /api/item/templates/newform)\r\n// one thing special here: props.onCreate is expected to actually create the item,\r\n// props.onCreated is called by parent to notify NewItemModal that it was actually created\r\n\r\nconst Form = (props: FormProps) => {\r\n // we might need to manipulate defaultValues\r\n const [defaultValues, setDefaultValues] = useState(\r\n props.defaultValues || {}\r\n );\r\n\r\n // get form definition\r\n const state = useAsync(async () => {\r\n try {\r\n const form = await fetchItemFlowForm({\r\n formType: props.formType,\r\n itemUri: props.itemUri,\r\n templateId: props.templateId,\r\n templateType: props.templateType,\r\n });\r\n // in order for WebDavName to be included in Save(model) it needs to be manually added to defaultValues for changeLog to take effect\r\n if (defaultValues == null || defaultValues[\"$NAME$\"] == null) {\r\n const nameField = form.fields.find(\r\n (f) => f.format === \"WebDavName\" && f.name === \"$NAME$\"\r\n );\r\n if (nameField != null) {\r\n setDefaultValues(\r\n produce(defaultValues, (draft) => {\r\n draft[\"$NAME$\"] = nameField.value;\r\n })\r\n );\r\n }\r\n }\r\n return form;\r\n } catch (err) {\r\n console.error(\"Error while fetchItemFlowForm\", err);\r\n props.onCancel();\r\n toastActionResult(false, \"itemflows:form\");\r\n\r\n throw err;\r\n }\r\n }, [props.flow]);\r\n\r\n if (state.loading) return ;\r\n if (state.error) return ;\r\n\r\n return (\r\n \r\n );\r\n};\r\nForm.displayName = \"ItemFlowsInput.Form\";\r\nexport default Form;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { type Props } from \"./Factory\";\r\nimport {\r\n NewFormType,\r\n ItemFlowTemplateType,\r\n type NewItemResultDTO,\r\n} from \"data/types\";\r\nimport Form from \"./Form\";\r\nimport { createFolder } from \"data/api\";\r\nimport history from \"data/history\";\r\nimport { getRoute } from \"components/ItemUriLink\";\r\n\r\nconst Folder = (props: Props) => {\r\n const onCreate = async (model): Promise => {\r\n try {\r\n const result: NewItemResultDTO = await createFolder({\r\n elementType: props.flow.commandAction.props.elementType,\r\n formatId: props.flow.commandAction.props.templateId,\r\n itemUri: props.itemUri,\r\n values: model,\r\n });\r\n if (result) {\r\n if (result.success) {\r\n if (props.previewNewItem === true && result.itemUri) {\r\n history.push(getRoute(result.itemUri));\r\n }\r\n props.onCreated(true, null, result);\r\n return true;\r\n } else {\r\n console.warn(\"Received success=false\");\r\n props.onCreated(false, null);\r\n return false;\r\n }\r\n } else {\r\n throw new Error(\"No Result received\");\r\n }\r\n } catch (err) {\r\n console.warn(err);\r\n props.onCreated(false, err);\r\n return false;\r\n }\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\nFolder.displayName = \"ItemFlowsInput.Folder\";\r\nFolder.defaultProps = {\r\n previewNewItem: true,\r\n};\r\nexport default Folder;\r\n","import React, { useRef } from \"react\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\n\r\ntype Props = {\r\n /** uppy instance reference */\r\n uppy: Object,\r\n /** url to custom page providing file selection */\r\n url: string,\r\n /** callback to close custom panel */\r\n onClose: () => void,\r\n};\r\n\r\nconst CustomUploadSelection = (props: Props) => {\r\n const iframeRef = useRef(null);\r\n\r\n // TODO currently data supported is only blob; in the future also URL to self download\r\n /* istanbul ignore next */ function cbAddFile(name, data) {\r\n props.uppy.addFile({\r\n name, // file name\r\n // type: 'image/jpeg', // file type\r\n data, // file blob\r\n source: \"Local\", // optional, determines the source of the file, for example, Instagram\r\n isRemote: false, // optional, set to true if actual file is not in the browser, but on some remote server, for example, when using companion in combination with Instagram\r\n });\r\n if (typeof props.onClose === \"function\") props.onClose();\r\n // alert(\"will add \" + name);\r\n }\r\n\r\n /* istanbul ignore next */ function frameLoaded() {\r\n if (iframeRef.current && iframeRef.current.contentWindow) {\r\n if (typeof iframeRef.current.contentWindow.start === \"function\")\r\n iframeRef.current.contentWindow.start({\r\n cbAddFile,\r\n language: userLanguage(),\r\n });\r\n else\r\n console.warn(\r\n \"Loaded CustomUploadSelection at \" +\r\n props.url +\r\n \" has no start() method\"\r\n );\r\n }\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\nCustomUploadSelection.displayName = \"ItemFlows.CustomUploadSelection\";\r\nexport default CustomUploadSelection;\r\n","import React, { useState, useMemo, useCallback } from \"react\";\r\nimport UploadSelection from \"components/UploadSelection\";\r\nimport CustomUploadSelection from \"./CustomUploadSelection\";\r\nimport { useUppy } from \"hooks\";\r\n\r\ntype Props = {\r\n /** reference to Uppy */\r\n uppyRef: { current: null | Node },\r\n /** which uppy ID to use (to separate from other upload queues) */\r\n uppyId: string,\r\n /** callback when user adds a file */\r\n onFileAdded: (file: uppyFile) => void,\r\n /** callback when user removes a file */\r\n onFileRemoved: (file: uppyFile) => void,\r\n /** whether to immediately open File Browse dialog */\r\n openBrowseDialog?: boolean,\r\n /** whether to immediately open Camera dialog */\r\n openCamera?: boolean,\r\n /** whether to use a custom URL for the file selection (instead of Uppy) */\r\n openCustomUrl?: string,\r\n /** current total number of files queued for upload */\r\n numOfFiles: number,\r\n};\r\n\r\nexport const DocumentSelection = ({\r\n uppyRef,\r\n uppyId,\r\n onFileAdded,\r\n onFileRemoved,\r\n openBrowseDialog,\r\n openCamera,\r\n openCustomUrl,\r\n numOfFiles,\r\n}: Props) => {\r\n const [isOpen, setOpen] = useState(false);\r\n const events = useMemo(\r\n () => [\r\n { type: \"file-added\", callback: onFileAdded },\r\n { type: \"file-removed\", callback: onFileRemoved },\r\n ],\r\n [onFileAdded, onFileRemoved]\r\n );\r\n const onAddFile = useCallback(() => setOpen(true), []);\r\n const onClose = useCallback(() => setOpen(false), []);\r\n\r\n uppyRef.current = useUppy({\r\n uppyId,\r\n events,\r\n });\r\n /* istanbul ignore if */\r\n if (uppyRef.current == null) return null;\r\n\r\n if (openCustomUrl)\r\n return (\r\n <>\r\n {(numOfFiles === 0 || isOpen) && (\r\n \r\n )}\r\n {numOfFiles > 0 && !isOpen && (\r\n \r\n )}\r\n \r\n );\r\n else\r\n return (\r\n \r\n );\r\n};\r\n\r\n// we are forwarding the new instanced uppy reference up to our parent since we do not want to handle actual uploads\r\n/* istanbul ignore next */\r\nconst DocumentSelectionWithRef = React.forwardRef((props: Props, uppyRef) => (\r\n \r\n));\r\n\r\nexport default DocumentSelectionWithRef;\r\n","import React, { useState, useRef, useCallback } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { UploadMode, NewFormType, ItemFlowTemplateType } from \"data/types\";\r\nimport DocumentSelection from \"./DocumentSelection\";\r\nimport { type Props } from \"./Factory\";\r\nimport Form from \"./Form\";\r\nimport produce from \"immer\";\r\nimport { replaceFileExtension } from \"data/utils\";\r\nimport Divider from \"components/Divider\";\r\nimport CountBadge from \"components/CountBadge\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./itemFlow_document.module.css\";\r\n\r\nconst Document = (props: Props) => {\r\n const isOnline = useSelector(s.isOnlineSelector);\r\n const [files, setFiles] = useState([]);\r\n // we'll keep a reference to the uppy instance created by \r\n const uppyRef = useRef(null);\r\n\r\n const _updateFiles = useCallback(\r\n () => setFiles(uppyRef.current.getFiles()),\r\n [uppyRef]\r\n );\r\n\r\n /**\r\n * will try to get the first filename available\r\n * @returns {string} filename or null if nothing found\r\n * @memberof Upload\r\n */\r\n const _getWebDavNameHint = () => {\r\n const firstFile = files.find((f) => f.meta && f.meta.itemUri == null);\r\n return firstFile\r\n ? firstFile.meta.name /* istanbul ignore next */\r\n : null;\r\n };\r\n\r\n /**\r\n * will return defaultValues to pass on to form\r\n * @returns defaultValues or null if no filename found\r\n * @memberof Upload\r\n */\r\n const _getDefaultValues = () =>\r\n produce(props.defaultValues || {}, (draft) => {\r\n const WebDavName = _getWebDavNameHint();\r\n /* istanbul ignore else */\r\n if (WebDavName) draft[\"$NAME$\"] = WebDavName;\r\n });\r\n\r\n const _onCreate = async (model, keepOriginalFilename: boolean = false) => {\r\n // COPY from views/upload/_onSaveNew()\r\n files.forEach((file) => {\r\n // has itemUri set (from previous failure?)\r\n /* istanbul ignore else */\r\n if (file.meta.itemUri == null) {\r\n // #46997 let's fix the file extension\r\n // HACK\r\n const newModel = produce(model, (draft) => {\r\n draft.ip[\"$NAME$\"] = replaceFileExtension(\r\n model.ip[\"$NAME$\"], // first filename\r\n file.extension // current real extension\r\n );\r\n });\r\n // attach classification form (ip/ea) to each file's metadata (managed server-side by TusMiddleware.cs)\r\n uppyRef.current.setFileMeta(file.id, {\r\n itemUri: props.itemUri,\r\n mode: UploadMode.CreateDocument,\r\n model: JSON.stringify(newModel),\r\n keepOriginalFilename,\r\n });\r\n }\r\n });\r\n uppyRef.current\r\n .upload()\r\n // .catch(err => props.onCreated(false, err))\r\n .then((result) =>\r\n props.onCreated(!isOnline || result.failed.length === 0)\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {loc.t(\"itemflows:toggles.file\")}{\" \"}\r\n {!!files.length && (\r\n \r\n )}\r\n \r\n }\r\n name=\"upload\"\r\n expanded={files.length === 0}\r\n unmountOnExit={false}\r\n mountOnEnter={false}\r\n >\r\n
\r\n \r\n
\r\n \r\n \r\n {files.length > 0 && (\r\n \r\n )}\r\n \r\n );\r\n};\r\nDocument.displayName = \"ItemFlowsInput.Document\";\r\nexport default Document;\r\n","import React from \"react\";\r\nimport { type Props } from \"./Factory\";\r\nimport { saveNewDocFromTemplate } from \"data/api\";\r\nimport { NewFormType, ItemFlowTemplateType } from \"data/types\";\r\nimport Form from \"./Form\";\r\n\r\nconst DocTemplate = (props: Props) => {\r\n const _onCreate = async (model) => {\r\n try {\r\n const result = await saveNewDocFromTemplate({\r\n templateId: props.flow.commandAction.props.templateId,\r\n itemUri: props.itemUri,\r\n values: model,\r\n });\r\n props.onCreated(result === true);\r\n } catch (err) {\r\n // console.warn(err);\r\n props.onCreated(false, err);\r\n }\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\nDocTemplate.displayName = \"ItemFlowsInput.DocTemplate\";\r\nexport default DocTemplate;\r\n","import React from \"react\";\r\nimport { type Props } from \"./Factory\";\r\nimport Form from \"./Form\";\r\nimport { NewFormType, ItemFlowTemplateType } from \"data/types\";\r\nimport { createFolderFromTemplate } from \"data/api\";\r\nimport { CheckJobStatus } from \"components/CommandActions/createFolder_template\";\r\n\r\nconst FolderTemplate = (props: Props) => {\r\n const _onCreate = (model) =>\r\n createFolderFromTemplate(\r\n props.flow.commandAction.props.templateId,\r\n props.itemUri,\r\n model.ip[\"$NAME$\"]\r\n )\r\n .catch((err) => {\r\n props.onCreated(false, err);\r\n return null;\r\n })\r\n .then(\r\n /* istanbul ignore next */ (jobId) =>\r\n jobId != null &&\r\n CheckJobStatus({\r\n jobId,\r\n close: () => props.onCreated(true),\r\n })\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\nFolderTemplate.displayName = \"ItemFlowsInput.FolderTemplate\";\r\nexport default FolderTemplate;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { type ItemFlowConfigDTO, type NewItemResultDTO } from \"data/types\";\r\nimport CustomItemFlow from \"./itemFlow_custom\";\r\nimport Folder from \"./itemFlow_folder\";\r\nimport Document from \"./itemFlow_document\";\r\nimport DocTemplate from \"./itemFlow_docTemplate\";\r\nimport FolderTemplate from \"./itemFlow_folderTemplate\";\r\nimport * as s from \"data/reducers/selectors\";\r\n\r\nexport type Props = {\r\n /** current flow selected by user */\r\n flow: ItemFlowConfigDTO,\r\n /** current viewName */\r\n viewName: string,\r\n /** target folder itemUri to create item in */\r\n itemUri: string,\r\n /** callback when user cancel */\r\n onCancel: () => void,\r\n /** callback when user wants to create the item\r\n * @async\r\n * @param {object} model the form's values\r\n * @returns {boolean} true if success, false otherwise\r\n */\r\n onCreate?: (model: Object) => Promise,\r\n /** callback when item has been created\r\n * @param {boolean} success true if created successfully\r\n * @param {Object} error error object in case success is false\r\n * @param {NewItemResultDTO} data additional data related to new item\r\n */\r\n onCreated?: (\r\n success: boolean,\r\n error?: Object,\r\n data?: NewItemResultDTO\r\n ) => void,\r\n /** form default values */\r\n defaultValues?: Object,\r\n /** optional whether to preview the newly created item\r\n * @default true\r\n */\r\n previewNewItem?: boolean,\r\n};\r\n\r\nconst flowsMappings = {\r\n itemFlow_custom: CustomItemFlow,\r\n itemFlow_document: Document,\r\n itemFlow_docTemplate: DocTemplate,\r\n itemFlow_folder: Folder,\r\n itemFlow_folderTemplate: FolderTemplate,\r\n};\r\n\r\n/** ItemFLows Type factory\r\n * each component takes care of:\r\n * 1. rendering whatever is required (e.g. Form or Upload)\r\n * 2. handling the creation process\r\n * 3. calling back onCreated with success/failure\r\n */\r\nconst Factory = (props: Props) => {\r\n // get default form values\r\n const defaultValues = Object.assign(\r\n {},\r\n useSelector(s.formDefaultsSelector),\r\n props.defaultValues\r\n );\r\n const ComponentClass = flowsMappings[props.flow.commandAction.name];\r\n if (ComponentClass == null)\r\n return (\r\n
Unknown itemFlow named {props.flow.commandAction.name}
\r\n );\r\n else return ;\r\n};\r\nFactory.displayName = \"ItemFlows.Factory\";\r\nexport default Factory;\r\n","// @flow\r\n//#region imports\r\nimport React, { PureComponent } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport TogglesHandler from \"containers/TogglesHandler\";\r\nimport \"./index.css\";\r\nimport MainLayout from \"components/MainLayout\";\r\nimport ItemFlowsList from \"components/ItemFlowsList\";\r\nimport {\r\n type ToggleDTO,\r\n type ToggleItemDTO,\r\n type ItemFlowConfigDTO,\r\n type ItemFlowCategory,\r\n type NewItemResultDTO,\r\n} from \"data/types\";\r\nimport SplitPanes from \"containers/SplitPanes\";\r\nimport loc from \"i18next\";\r\nimport CloseButton from \"components/ModalCloseButton\";\r\nimport SearchInput from \"@hs/search-input\";\r\nimport { togglesUpdateCounterAction } from \"data/actions\";\r\nimport Constants from \"data/constants\";\r\nimport CategoryFilter from \"./CategoryFilter\";\r\nimport SettingValue, { type SettingValueProps } from \"containers/SettingValue\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport {\r\n setCurrentItemAction,\r\n backupCurrentItemAction,\r\n restoreCurrentItemAction,\r\n} from \"data/actions\";\r\nimport { get } from \"data/constants\";\r\nimport { getFolderUri } from \"data/utils\";\r\nimport ItemFlowsFactory from \"components/CommandActions/itemFlows/Factory\";\r\nimport Pane from \"components/SplitPanes/Pane\";\r\nimport { isHandheld } from \"data/bowser\";\r\nimport { inPointAction, inPointActionLink } from \"components/ItemUriLink\";\r\nimport { check_isSyncUpload } from \"containers/ActionPanel_shouldBeVisible\";\r\n//#endregion\r\n\r\nexport const viewName = \"itemflows\";\r\n\r\ntype Props = {\r\n /** whether shown as Modal */\r\n asModal?: boolean,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** callback when closing Modal dialog */\r\n onClose?: () => void,\r\n /** list of flows to render */\r\n flows: ?Array,\r\n /** list of flow categories */\r\n categories: ?Array,\r\n /** pre-selected flow */\r\n selectedFlow?: ItemFlowConfigDTO,\r\n /** pre-selected category */\r\n selectedCategory?: ItemFlowCategory,\r\n // from TogglesHandler\r\n /** TogglesHandler callback to set toggles */\r\n setToggles: Function,\r\n /** TogglesHandler this view's toggles definitions */\r\n toggles: ?ToggleDTO,\r\n /** current itemUri */\r\n itemUri: string,\r\n // from redux\r\n /** which toggles are currently selected */\r\n selectedToggles: Array,\r\n /** SplitPanes callback to set split sizes */\r\n setSplitSizes: Function,\r\n /** persisted filterType */\r\n filterType: SettingValueProps,\r\n /** optional default attribute values to pass to form */\r\n defaultValues?: Object,\r\n /** optional whether to preview the newly created item\r\n * @default true\r\n */\r\n previewNewItem?: boolean,\r\n /** optional callback when completed\r\n * @param {NewItemResultDTO} data details about the item created\r\n */\r\n onDone?: (data: NewItemResultDTO) => void,\r\n};\r\n\r\ntype State = {\r\n filterText: string,\r\n filterType: string,\r\n filteredFlows: ?Array,\r\n selectedFlow: ?ItemFlowConfigDTO,\r\n};\r\n\r\nexport class ItemFlows extends PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n filterText: \"\",\r\n filterType: props.selectedCategory\r\n ? props.selectedCategory.id\r\n : props.filterType.value,\r\n filteredFlows: null,\r\n selectedFlow: props.selectedFlow,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const { dispatch, itemUri, selectedFlow } = this.props;\r\n dispatch(backupCurrentItemAction());\r\n dispatch(setCurrentItemAction({ name: viewName, itemUri }));\r\n\r\n this._updateToggles();\r\n this._filterList();\r\n this._updateFormToggle(selectedFlow != null);\r\n }\r\n\r\n componentWillUnmount() {\r\n const { dispatch } = this.props;\r\n dispatch(restoreCurrentItemAction());\r\n }\r\n\r\n componentDidUpdate(prevProps: Props, prevState: State) {\r\n if (prevState.selectedFlow !== this.state.selectedFlow) {\r\n this._updateFormToggle(this.state.selectedFlow != null);\r\n }\r\n if (\r\n prevState.filterText !== this.state.filterText ||\r\n prevState.filterType !== this.state.filterType\r\n ) {\r\n this._filterList();\r\n }\r\n if (prevState.filteredFlows !== this.state.filteredFlows) {\r\n this._updateToggles();\r\n }\r\n }\r\n\r\n _updateToggles = () =>\r\n this.props.dispatch(\r\n togglesUpdateCounterAction({\r\n name: viewName,\r\n counts: { list: this._getTotalCount() },\r\n status: { list: Constants.OK },\r\n })\r\n );\r\n\r\n _getTotalCount = () =>\r\n this.state.filteredFlows\r\n ? this.state.filteredFlows.length\r\n : this.props.flows.length;\r\n\r\n _filterList = () =>\r\n this.setState({ filteredFlows: this._getFilteredList() });\r\n\r\n _getFilteredList = () =>\r\n this.props.flows == null\r\n ? /* istanbul ignore next */ []\r\n : this.props.flows.filter((t) => {\r\n // filter type\r\n let show =\r\n this.state.filterType === \"all\"\r\n ? true\r\n : t.category.toLowerCase() === this.state.filterType;\r\n if (!show) return false;\r\n\r\n // filter name and/or description\r\n if (this.state.filterText.length > 0)\r\n show =\r\n (\r\n get(t, [\"name\"], \"\").toLowerCase() +\r\n get(t, [\"desc\"], \"\").toLowerCase()\r\n ).indexOf(this.state.filterText.toLowerCase()) >= 0;\r\n if (!show) return false;\r\n\r\n return show;\r\n });\r\n\r\n _onFilterTextChange = (filterText: ?string) =>\r\n this.setState({ filterText: filterText || \"\" });\r\n\r\n _onFilterTypeChange = (filterType: ?string) =>\r\n this.setState({ filterType: filterType || \"all\" }, () => {\r\n this.props.filterType.setValue(filterType || \"all\");\r\n });\r\n\r\n _updateFormToggle = (show: boolean) => {\r\n /* istanbul ignore if */\r\n if (this.props.toggles == null) return;\r\n // form toggles visibility\r\n const toggles = this.props.toggles.toggles.map(\r\n (toggle: ToggleItemDTO) => {\r\n if (toggle.value === \"form\") {\r\n // handle form toggle\r\n toggle.isDisabled = !show;\r\n toggle.isSelected = show;\r\n } else if (isHandheld() && toggle.value === \"list\") {\r\n // handle list toggle (handheld only)\r\n toggle.isSelected = !show;\r\n }\r\n return toggle;\r\n }\r\n );\r\n /* istanbul ignore else */\r\n if (toggles != null) {\r\n this.props.setToggles({\r\n name: viewName,\r\n isMultiple: show,\r\n toggles,\r\n });\r\n }\r\n };\r\n\r\n _onSelect = (selectedFlow: ItemFlowConfigDTO) => {\r\n if (selectedFlow.id === \"doc_upload\" && check_isSyncUpload()) {\r\n const win = window.open(\r\n inPointActionLink(inPointAction.archive),\r\n \"_blank\"\r\n );\r\n win.focus();\r\n } else {\r\n this.setState({ selectedFlow });\r\n }\r\n };\r\n\r\n _onFormCancel = () => this.setState({ selectedFlow: null });\r\n\r\n _onCreated = (\r\n success: boolean,\r\n error?: Object,\r\n data?: NewItemResultDTO\r\n ) => {\r\n toastActionResult(success, `${viewName}:created`);\r\n if (typeof this.props.onDone === \"function\") {\r\n this.props.onDone(\r\n Object.assign(\r\n {},\r\n {\r\n success,\r\n },\r\n data\r\n )\r\n );\r\n }\r\n if (success === true) {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onClose === \"function\") this.props.onClose();\r\n } else {\r\n // TODO do we toast itemFlows failure? Do we close?\r\n console.error(error || \"Unknown error happened during creation\");\r\n }\r\n };\r\n\r\n render() {\r\n const { toggles } = this.props;\r\n const itemUri = getFolderUri(this.props.itemUri);\r\n return (\r\n }\r\n >\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n {this.state.selectedFlow && (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default compose(\r\n connect(),\r\n TogglesHandler({\r\n viewName,\r\n }),\r\n SplitPanes({\r\n viewName,\r\n paneIds: [\"#itemFlowsListPanel\", \"#itemFlowsFormPanel\"],\r\n toggleIds: [\"list\", \"form\"],\r\n direction: \"horizontal\",\r\n }),\r\n SettingValue({\r\n name: \"itemFlows.filterType\",\r\n namespace: \"filterType\",\r\n defaultValue: \"all\",\r\n })\r\n)(ItemFlows);\r\n","// @flow\r\nimport React, { useState } from \"react\";\r\nimport { useAsync } from \"hooks\";\r\nimport { fetchItemFlows } from \"data/api\";\r\nimport { isListed } from \"data/utils\";\r\nimport Status from \"components/Status\";\r\nimport ItemFlows from \"views/itemFlows\";\r\nimport Constants from \"data/constants\";\r\nimport {\r\n type ItemFlowsConfigDTO,\r\n type ItemFlowDirectionEnum,\r\n type NewItemResultDTO,\r\n} from \"data/types\";\r\n\r\ntype Props = {\r\n /** current folder's itemUri */\r\n itemUri: string,\r\n /** callback when user closes */\r\n onClose: () => void,\r\n /** flow direction \"in\" vs \"out\" */\r\n direction?: ItemFlowDirectionEnum,\r\n /** optional flow.id to pre-select */\r\n flowId?: string,\r\n /** flow.ids to allow visible */\r\n visibleFlowIds?: Array,\r\n /** optional category.id to pre-select */\r\n categoryId?: string,\r\n /** optional default attribute values to pass to form */\r\n defaultValues?: Object,\r\n /** optional whether to preview the newly created item\r\n * @default true\r\n */\r\n previewNewItem?: boolean,\r\n /** optional callback when completed\r\n * @param {NewItemResultDTO} data details about the item created\r\n */\r\n onDone?: (data: NewItemResultDTO) => void,\r\n};\r\n\r\nconst ItemFlowsContainer = (props: Props) => {\r\n const [selectedFlow, setSelectedFlow] = useState(null);\r\n const [selectedCategory, setSelectedCategory] = useState(null);\r\n // get input item flows\r\n const state = useAsync(async () => {\r\n try {\r\n const cfg: ItemFlowsConfigDTO = await fetchItemFlows(\r\n props.itemUri,\r\n props.direction\r\n );\r\n // filter requested visible flows\r\n // PS: yes I know we could filter them on the server-side, but it would not improve performance just reduce packet size\r\n if (props.visibleFlowIds) {\r\n cfg.flows = cfg.flows.filter((f) =>\r\n isListed(f.id, props.visibleFlowIds)\r\n );\r\n }\r\n // pre-select a specific flow\r\n if (props.flowId) {\r\n setSelectedFlow(cfg.flows.find((f) => f.id === props.flowId));\r\n }\r\n // pre-select a specific category\r\n if (props.categoryId) {\r\n setSelectedCategory(\r\n cfg.categories.find((c) => c.id === props.categoryId)\r\n );\r\n }\r\n return cfg;\r\n } catch (err) {\r\n console.warn(\"Error while fetchItemFlows\", err);\r\n throw err;\r\n }\r\n }, [props.itemUri]);\r\n\r\n if (state.loading) return ;\r\n if (state.error) return ;\r\n\r\n return (\r\n \r\n );\r\n};\r\nItemFlowsContainer.displayName = \"ItemFlowsContainer\";\r\nItemFlowsContainer.defaultProps = {\r\n direction: \"in\",\r\n};\r\nexport default ItemFlowsContainer;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport styles from \"./ItemFlowsModal.module.css\";\r\nimport ItemFlowsContainer from \"containers/ItemFlows\";\r\nimport { type ItemFlowDirectionEnum, type NewItemResultDTO } from \"data/types\";\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** current folder's itemUri */\r\n itemUri: string,\r\n /** flow direction \"in\" vs \"out\" */\r\n direction?: ItemFlowDirectionEnum,\r\n /** flow.id to pre-select */\r\n flowId?: string,\r\n /** flow.ids to allow visible */\r\n visibleFlowIds?: Array,\r\n /** category.id to pre-select */\r\n categoryId?: string,\r\n /** optional default attribute values to pass to form */\r\n defaultValues?: Object,\r\n /** optional whether to preview the newly created item\r\n * @default true\r\n */\r\n previewNewItem?: boolean,\r\n /** optional callback when completed\r\n * @param {NewItemResultDTO} data details about the item created\r\n */\r\n onDone?: (data: NewItemResultDTO) => void,\r\n};\r\n\r\n/** presents the available item templates to the user */\r\nexport const ItemFlowsModal = ({\r\n open,\r\n close,\r\n itemUri,\r\n direction,\r\n flowId,\r\n visibleFlowIds,\r\n categoryId,\r\n defaultValues,\r\n previewNewItem,\r\n onDone,\r\n}: Props) => (\r\n close(false)}\r\n dialogClassName={styles.itemflows}\r\n headerSize={0}\r\n footerSize={0}\r\n dataTest=\"itemFlowsModal\"\r\n >\r\n \r\n \r\n \r\n \r\n);\r\nItemFlowsModal.displayName = \"ItemFlowsModal\";\r\nexport const openItemFlowsModal = createModal(ItemFlowsModal);\r\n","import { openItemFlowsModal } from \"components/ItemFlowsModal\";\r\nimport {\r\n type ItemFlowDirectionEnum,\r\n ItemFlowDirection,\r\n type NewItemResultDTO,\r\n} from \"data/types\";\r\n\r\n/**\r\n * opens the itemFlows input dialog for the given itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri } target folder itemUri\r\n * @param {{ direction: ItemFlowDirection }} { direction } \"in\" or \"out\" (defaults to \"in\")\r\n * @param {{ flowId?: string}} { flowId } optional pre-selected flow.id\r\n * @param {{ visibleFlowIds?: Array}} { visibleFlowIds } optional limit which flowIds are at all visible\r\n * @param {{ categoryId?: string}} { categoryId } optional pre-selected category.id\r\n * @param {{ defaultValues?: Object }} { defaultValues } optional default attribute values to pass to form\r\n * @param {{ previewNewItem?: boolean}} { previewNewItem } internal: whether to preview to the newly created item (defaults to false)\r\n * @param {{ onDone?: (data: NewItemResultDTO) => void}} { onDone } internal: callback once complete ({success:boolean, itemUri, name, formatId, elementType, ... })\r\n *\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n direction?: ItemFlowDirectionEnum,\r\n flowId?: string,\r\n visibleFlowIds?: Array,\r\n categoryId?: string,\r\n defaultValues?: Object,\r\n previewNewItem?: boolean,\r\n onDone?: (data: NewItemResultDTO) => void,\r\n};\r\n\r\nclass itemFlows {\r\n execute = async ({\r\n itemUri,\r\n direction = ItemFlowDirection.in,\r\n flowId,\r\n visibleFlowIds,\r\n categoryId,\r\n defaultValues,\r\n previewNewItem = true,\r\n onDone,\r\n }: Context): Promise => {\r\n await openItemFlowsModal({\r\n itemUri,\r\n direction,\r\n flowId,\r\n visibleFlowIds,\r\n categoryId,\r\n defaultValues,\r\n previewNewItem,\r\n onDone,\r\n });\r\n return true;\r\n };\r\n}\r\n\r\nexport default itemFlows;\r\n","import { transfer as transferApi } from \"data/api\";\r\nimport { getFolderUri } from \"data/utils\";\r\nimport { toastActionResult, toastStyled, toastTypes } from \"data/toast\";\r\nimport { openPickerModal, PickerType } from \"components/PickerModal\";\r\nimport {\r\n NotificationStyle,\r\n TransferType,\r\n type TransferTypeEnum,\r\n type TransferItemRequestDTO,\r\n} from \"data/types\";\r\nimport loc from \"i18next\";\r\n\r\n/**\r\n * Transfer by type a given resource by itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n * @param {{ type: TransferTypeEnum }} { type }\r\n * @param {{ isDoc: bool }} { isDoc }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n type: TransferTypeEnum,\r\n isDoc: boolean,\r\n};\r\n\r\nclass transfer {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n shouldRender: boolean = true;\r\n transferRequest: ?TransferItemRequestDTO = null;\r\n\r\n render = async ({ itemUri, name, type }: Context) => {\r\n this.shouldRender = false;\r\n const folderUri = getFolderUri(itemUri);\r\n let selectButton = loc.t(\"commandAction:transfer.copy.name\");\r\n const additionalActions = [];\r\n const onSelect = (eventKey) => (type = eventKey);\r\n switch (type) {\r\n case TransferType.Copy:\r\n break;\r\n case TransferType.Move:\r\n selectButton = loc.t(\"commandAction:transfer.move.name\");\r\n break;\r\n case TransferType.Link:\r\n selectButton = loc.t(\"commandAction:transfer.link.name\");\r\n break;\r\n default:\r\n additionalActions.push({\r\n label: loc.t(\"commandAction:transfer.move.name\"),\r\n eventKey: TransferType.Move,\r\n });\r\n additionalActions.push({\r\n label: loc.t(\"commandAction:transfer.link.name\"),\r\n eventKey: TransferType.Link,\r\n });\r\n // Set default type\r\n type = type || TransferType.Copy;\r\n break;\r\n }\r\n const targetItemUri = await openPickerModal({\r\n pickerType: PickerType.Folder,\r\n scopeBreadcrumb: false,\r\n itemUri: folderUri,\r\n helpText: loc.t(\"commandAction:transfer.helpText\", { name }),\r\n selectButton,\r\n onSelect,\r\n additionalActions,\r\n });\r\n if (targetItemUri === false) return false;\r\n this.transferRequest = {\r\n type,\r\n targetItemUri,\r\n };\r\n return true;\r\n };\r\n\r\n execute = async ({ itemUri, name, isDoc }: Context): Promise => {\r\n try {\r\n const success = await transferApi({\r\n ...this.transferRequest,\r\n itemUri,\r\n name,\r\n });\r\n if (this.transferRequest?.type === TransferType.Move && !isDoc) {\r\n toastStyled({\r\n ...toastTypes.failure,\r\n icon: \"alert\",\r\n style: NotificationStyle.Warning,\r\n toastId: \"transfer\",\r\n message: `$commandAction:transfer.${this.transferRequest?.type}.warning`,\r\n });\r\n }\r\n return success;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n report = (success: boolean, { name }: Context) => {\r\n this.logger(\r\n success,\r\n `commandAction:transfer.${this.transferRequest?.type}`,\r\n { name }\r\n );\r\n };\r\n}\r\n\r\nexport default transfer;\r\n","import { openConfirmModal } from \"components/ConfirmModal\";\r\nimport { delDefiniteItemUri } from \"data/api\";\r\nimport loc from \"i18next\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\n/**\r\n * Permanently deletes a definitely document from the Recycle Bin by itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n};\r\n\r\nclass recyclebin_docClear {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n shouldRender: boolean = true;\r\n\r\n render = async ({ name }: Context): Promise => {\r\n this.shouldRender = false;\r\n return await openConfirmModal({\r\n body: loc.t(\"commandAction:recyclebin_docClear.confirmBody\", {\r\n name,\r\n }),\r\n confirmButton: loc.t(\r\n \"commandAction:recyclebin_docClear.confirmYes\"\r\n ),\r\n });\r\n };\r\n\r\n execute = async ({ itemUri }: Context): Promise => {\r\n try {\r\n return await delDefiniteItemUri(itemUri);\r\n } catch (err) {\r\n console.warn(err);\r\n return false;\r\n }\r\n };\r\n\r\n report = async (success: boolean, { name }: Context): Promise => {\r\n this.logger(success === true, \"commandAction:recyclebin_docClear\", {\r\n name,\r\n });\r\n };\r\n}\r\n\r\nexport default recyclebin_docClear;\r\n","import { restoreItemUri } from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\n/**\r\n * Restores a document from the Recycle Bin by itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n};\r\n\r\nclass recyclebin_docRestore {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n\r\n execute = async ({ itemUri }: Context): Promise => {\r\n try {\r\n return await restoreItemUri(itemUri);\r\n } catch (err) {\r\n console.warn(err);\r\n return false;\r\n }\r\n };\r\n\r\n report = async (success: boolean, { name }: Context): Promise => {\r\n this.logger(success === true, \"commandAction:recyclebin_docRestore\", {\r\n name,\r\n });\r\n };\r\n}\r\n\r\nexport default recyclebin_docRestore;\r\n","import { openConfirmModal } from \"components/ConfirmModal\";\r\nimport { delDefiniteItemUri } from \"data/api\";\r\nimport loc from \"i18next\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\n/**\r\n * Permanently deletes an folder from the Recycle Bin by itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n};\r\n\r\nclass recyclebin_folderClear {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n shouldRender: boolean = true;\r\n\r\n render = async ({ name }: Context): Promise => {\r\n this.shouldRender = false;\r\n return await openConfirmModal({\r\n body: loc.t(\"commandAction:recyclebin_folderClear.confirmBody\", {\r\n name,\r\n }),\r\n confirmButton: loc.t(\r\n \"commandAction:recyclebin_folderClear.confirmYes\"\r\n ),\r\n });\r\n };\r\n\r\n execute = async ({ itemUri }: Context): Promise => {\r\n try {\r\n return await delDefiniteItemUri(itemUri);\r\n } catch (err) {\r\n console.warn(err);\r\n return false;\r\n }\r\n };\r\n\r\n report = async (success: boolean, { name }: Context): Promise => {\r\n this.logger(success === true, \"commandAction:recyclebin_folderClear\", {\r\n name,\r\n });\r\n };\r\n}\r\n\r\nexport default recyclebin_folderClear;\r\n","import { restoreItemUri } from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\n\r\n/**\r\n * Restores a folder from the Recycle Bin by itemUri\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n};\r\n\r\nclass recyclebin_folderRestore {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n\r\n execute = async ({ itemUri }: Context): Promise => {\r\n try {\r\n return await restoreItemUri(itemUri);\r\n } catch (err) {\r\n console.warn(err);\r\n return false;\r\n }\r\n };\r\n\r\n report = async (success: boolean, { name }: Context): Promise => {\r\n this.logger(\r\n success === true,\r\n \"commandAction:recyclebin_folderRestore\",\r\n {\r\n name,\r\n }\r\n );\r\n };\r\n}\r\n\r\nexport default recyclebin_folderRestore;\r\n","// @flow\r\nimport React, { useRef, useState } from \"react\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport Form from \"containers/Form\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport Breadcrumb from \"containers/Breadcrumb\";\r\nimport { type FormResultDTO, type DocFormResultDTO } from \"data/types\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./FormModal.module.css\";\r\nimport ButtonToolbar from \"react-bootstrap/lib/ButtonToolbar\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport Pane from \"components/SplitPanes/Pane\";\r\n\r\ntype Props = {\r\n /** whether to show modal */\r\n open: boolean,\r\n /** callback when user closes Modal */\r\n close: () => void,\r\n /** target itemUri */\r\n formProps: { itemUri: string, viewName: string } & Object,\r\n};\r\n\r\n/**\r\n * FormModal\r\n */\r\nexport const FormModal = ({ open, close, ...formProps }: Props) => {\r\n // used by FormContainer to fill in Save button\r\n const footerRef = useRef(null);\r\n // whether editing is allowed\r\n const [isEditAllowed, setEditAllowed] = useState(true);\r\n const onFormLoad = (form: FormResultDTO | DocFormResultDTO) =>\r\n setEditAllowed(form.isEditAllowed);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!isEditAllowed && (\r\n <>\r\n
\r\n \r\n {loc.t(\r\n `${formProps.viewName}:edit_form.notAuthorized`\r\n )}\r\n
\r\n \r\n \r\n {loc.t(\"close\")}\r\n \r\n \r\n \r\n )}\r\n\r\n
\r\n \r\n \r\n );\r\n};\r\nFormModal.displayName = \"FormModal\";\r\nexport default FormModal;\r\nexport const openFormModal = createModal(FormModal);\r\n","// @flow\r\nimport { openFormModal } from \"components/FormModal\";\r\n\r\n/**\r\n * opens FormModal to edit classification\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n */\r\n\r\nclass editClassification {\r\n execute = async ({ itemUri }: { itemUri: string }) => {\r\n await openFormModal({\r\n itemUri,\r\n viewName: \"formmodal\",\r\n });\r\n return true;\r\n };\r\n}\r\n\r\nexport default editClassification;\r\n","import copy from \"copy-to-clipboard\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport loc from \"i18next\";\r\n\r\n/**\r\n * copies current itemUri to clipboard\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n */\r\n\r\nclass clipboard_copyItemUri {\r\n logger: () => any = toastActionResult;\r\n shouldRender: boolean = false;\r\n execute = async ({ itemUri }: Context): Promise =>\r\n new Promise((resolve) => {\r\n copy(itemUri, {\r\n message: loc.t(\"itemActions:clipboard_copyItemUri.message\"),\r\n format: \"text/plain\",\r\n onCopy: (clipboardData: Object) => resolve(true),\r\n });\r\n });\r\n report = async (success: boolean): Promise => {\r\n this.logger(success === true, \"itemActions:clipboard_copyItemUri\");\r\n };\r\n}\r\nexport default clipboard_copyItemUri;\r\n","import copy from \"copy-to-clipboard\";\r\nimport { getRoute } from \"components/ItemUriLink\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport loc from \"i18next\";\r\n\r\n/**\r\n * copies a link to a view with the current itemUri to clipboard\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n};\r\n\r\nclass clipboard_copyItemLink {\r\n logger: () => any = toastActionResult;\r\n execute = async ({ itemUri }: Context): Promise =>\r\n new Promise((resolve) => {\r\n copy(window.location.origin + getRoute(itemUri, true, true), {\r\n message: loc.t(\"itemActions:clipboard_copyItemLink.message\"),\r\n format: \"text/plain\",\r\n onCopy: (clipboardData: Object) => resolve(true),\r\n });\r\n });\r\n report = async (success: boolean): Promise => {\r\n this.logger(success === true, \"itemActions:clipboard_copyItemLink\");\r\n };\r\n}\r\nexport default clipboard_copyItemLink;\r\n","import React from \"react\";\r\nimport { type RasterMapLayerDTO } from \"data/types\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport Thumbnail from \"components/DocListSimple/Thumbnail\";\r\nimport styles from \"./RasterLayer.module.css\";\r\nimport loc from \"i18next\";\r\nimport FormGroup from \"react-bootstrap/lib/FormGroup\";\r\nimport InputGroup from \"react-bootstrap/lib/InputGroup\";\r\nimport FormControl from \"react-bootstrap/lib/FormControl\";\r\n\r\nconst RasterLayer = ({\r\n layer,\r\n onRemove,\r\n onRename,\r\n onMoveUp,\r\n onMoveDown,\r\n}: {\r\n layer: RasterMapLayerDTO,\r\n onRemove: () => void,\r\n onRename: (newName: string) => void,\r\n onMoveUp: () => void,\r\n onMoveDown: () => void,\r\n}) => (\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n \r\n \r\n CommandActionHandler(\"doc_preview\", {\r\n itemUri: layer.itemUri,\r\n })\r\n }\r\n />\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n onRename(e.currentTarget.value)}\r\n className={styles.name}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* */}\r\n
\r\n);\r\n\r\nRasterLayer.displayName = \"RasterMapManager.RasterLayer\";\r\nexport default RasterLayer;\r\n","import React, { useCallback } from \"react\";\r\nimport RasterLayer from \"./RasterLayer\";\r\nimport styles from \"./LayersEditor.module.css\";\r\nimport immutable from \"object-path-immutable\";\r\nimport { RasterMapLayerEditAction } from \"data/types\";\r\nimport { moveArrayItem } from \"data/utils\";\r\n\r\ntype Props = {\r\n onMapEdit: (map) => void,\r\n map: RasterMapResultDTO,\r\n};\r\n\r\nconst LayersEditor = ({ map, onMapEdit }: Props) => {\r\n const removeLayer = useCallback(\r\n (layer) => {\r\n const idx = map.layers.findIndex((i) => i.id === layer.id);\r\n onMapEdit(\r\n immutable.set(\r\n map,\r\n `layers.${idx}.editAction`,\r\n RasterMapLayerEditAction.delete\r\n )\r\n );\r\n },\r\n [map, onMapEdit]\r\n );\r\n\r\n const renameLayer = useCallback(\r\n (layer, newName) => {\r\n const idx = map.layers.findIndex((i) => i.id === layer.id);\r\n let newMap = immutable.set(map, `layers.${idx}.name`, newName);\r\n // do not change editAction for new .added layers\r\n if (newMap.layers[idx].editAction !== RasterMapLayerEditAction.add)\r\n newMap.layers[idx].editAction = RasterMapLayerEditAction.rename;\r\n onMapEdit(newMap);\r\n },\r\n [map, onMapEdit]\r\n );\r\n\r\n const moveUp = useCallback(\r\n (layer) => {\r\n const idx = map.layers.findIndex((i) => i.id === layer.id);\r\n let target = idx - 1;\r\n if (idx === 0) target = map.layers.length - 1;\r\n onMapEdit(\r\n immutable.set(\r\n map,\r\n \"layers\",\r\n moveArrayItem(map.layers, idx, target)\r\n )\r\n );\r\n },\r\n [map, onMapEdit]\r\n );\r\n\r\n const moveDown = useCallback(\r\n (layer) => {\r\n const idx = map.layers.findIndex((i) => i.id === layer.id);\r\n let target = idx + 1;\r\n if (target === map.layers.length) target = 0;\r\n onMapEdit(\r\n immutable.set(\r\n map,\r\n \"layers\",\r\n moveArrayItem(map.layers, idx, target)\r\n )\r\n );\r\n },\r\n [map, onMapEdit]\r\n );\r\n\r\n return (\r\n
\r\n {map.layers\r\n .filter((m) => m.editAction !== RasterMapLayerEditAction.delete)\r\n .map((layer, i) => (\r\n removeLayer(layer)}\r\n onRename={(newName) => renameLayer(layer, newName)}\r\n onMoveUp={() => moveUp(layer)}\r\n onMoveDown={() => moveDown(layer)}\r\n />\r\n ))}\r\n
\r\n );\r\n};\r\nLayersEditor.displayName = \"RasterMapManager.LayersEditor\";\r\nexport default LayersEditor;\r\n","// @flow\r\nimport React, { useState, useMemo, useCallback } from \"react\";\r\nimport { useAsync } from \"hooks\";\r\nimport { openPickerModal } from \"components/PickerModal\";\r\nimport immutable from \"object-path-immutable\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport LayersEditor from \"./LayersEditor\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./RasterMapModal.module.css\";\r\nimport { type RasterMapResultDTO, RasterMapLayerEditAction } from \"data/types\";\r\nimport { getGeoRasterProvider } from \"components/MapViewer/providerSupport\";\r\nimport Status from \"components/Status\";\r\nimport Constants from \"data/constants\";\r\nimport { fetchRasterMapLayers, saveRasterMapLayers } from \"data/api\";\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** current formatId */\r\n formatId: number,\r\n /** current itemUri */\r\n itemUri: string,\r\n /** current name */\r\n name: string,\r\n};\r\n\r\n/** presents the available raster layers and allows managing them */\r\nexport const RasterMapManagerModal = ({\r\n open,\r\n close,\r\n formatId,\r\n itemUri,\r\n name,\r\n}: Props) => {\r\n const [map, setMap] = useState();\r\n\r\n // get current mapProvider\r\n const mapProvider = useMemo(() => getGeoRasterProvider(itemUri, formatId), [\r\n itemUri,\r\n formatId,\r\n ]);\r\n // get current layers\r\n const state = useAsync(async () => {\r\n try {\r\n // retrieve any existing layers (or create appropriately)\r\n const map: RasterMapResultDTO = await fetchRasterMapLayers({\r\n itemUri,\r\n rasterMapIdSelector: mapProvider.rasterMapIdSelector,\r\n create: true,\r\n });\r\n setMap(map);\r\n return map;\r\n } catch (e) {\r\n console.error(e);\r\n throw e;\r\n }\r\n });\r\n\r\n const addLayer = useCallback(async () => {\r\n const selectedItemUri = await openPickerModal({\r\n itemUri,\r\n helpText: loc.t(\"common:raster.pickerText\"),\r\n });\r\n /* istanbul ignore else */\r\n if (selectedItemUri) {\r\n setMap(\r\n immutable.push(map, \"layers\", {\r\n editAction: RasterMapLayerEditAction.add,\r\n name: loc.t(\"common:raster.newLayer\"),\r\n itemUri: selectedItemUri,\r\n })\r\n );\r\n }\r\n }, [itemUri, map]);\r\n\r\n const saveMap = useCallback(async () => {\r\n try {\r\n await saveRasterMapLayers({ map });\r\n window.location.reload(true);\r\n } catch (e) {\r\n console.error(e);\r\n alert(e.message);\r\n }\r\n }, [map]);\r\n\r\n return (\r\n close(false)}\r\n dialogClassName={styles.modal}\r\n >\r\n \r\n \r\n {name}\r\n \r\n \r\n \r\n {state.loading && }\r\n {state.error && }\r\n {state.value && (\r\n \r\n setMap(newMap)\r\n }\r\n />\r\n )}\r\n \r\n \r\n {state.value && (\r\n \r\n {loc.t(\"common:raster.addLayer\")}\r\n \r\n )}\r\n \r\n {loc.t(\"save\")}\r\n \r\n \r\n \r\n );\r\n};\r\nRasterMapManagerModal.displayName = \"RasterMapManagerModal\";\r\nexport const openRasterMapManagerModal = createModal(RasterMapManagerModal);\r\n","import { openRasterMapManagerModal } from \"components/RasterMapManagerModal\";\r\n\r\ntype Context = {\r\n formatId: number,\r\n itemUri: string,\r\n name: string,\r\n};\r\n\r\nclass raster_manage {\r\n /**\r\n * Opens Modal to manage Raster Layers\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n execute = async ({ formatId, itemUri, name }: Context) => {\r\n await openRasterMapManagerModal({ formatId, itemUri, name });\r\n return true;\r\n };\r\n}\r\nexport default raster_manage;\r\n","import React, { useCallback, useMemo } from \"react\";\r\nimport AttributeLabel from \"components/ExtraAttributes/AttributeLabel\";\r\nimport ViewerControlBase from \"components/ExtraAttributes/ViewerControl/ViewerControlBase\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { type EnumValue } from \"data/types\";\r\nimport { getLocalizedText } from \"data/utils\";\r\nimport styles from \"./EnumViewerControl.module.css\";\r\n\r\ntype Props = {\r\n /** CommonName */\r\n name: string,\r\n /** Label */\r\n header: string,\r\n /** Style for */\r\n style: CSSStyleDeclaration,\r\n /** Enum Value */\r\n value: T,\r\n /** Enum Values */\r\n enum: Array>,\r\n /** Is a required field */\r\n isRequired?: boolean,\r\n /** wheather it is an Enum or and EnumFlag */\r\n isMulti?: boolean,\r\n};\r\n\r\nconst EnumViewerControl = (props: Props) => {\r\n const renderEnumValue = useCallback(\r\n (enumValue: EnumValue) => (\r\n \r\n {enumValue.icon && typeof enumValue.icon === \"string\" ? (\r\n \r\n ) : (\r\n enumValue.icon\r\n )}{\" \"}\r\n {getLocalizedText(enumValue.label)}\r\n \r\n ),\r\n [props.name]\r\n );\r\n const renderedValue = useMemo(\r\n () =>\r\n props.value\r\n ? props.isMulti\r\n ? props.enum\r\n .filter((e) => (props.value & e.value) > 0)\r\n .map((e) => renderEnumValue(e))\r\n : renderEnumValue(\r\n props.enum.find((e) => e.value === props.value)\r\n )\r\n : null,\r\n [renderEnumValue, props.isMulti, props.value, props.enum]\r\n );\r\n return (\r\n \r\n \r\n
\r\n {renderedValue}\r\n
\r\n
\r\n );\r\n};\r\n\r\nEnumViewerControl.displayName = \"EnumViewerControl\";\r\nexport default EnumViewerControl;\r\n","import React, { useCallback, useMemo } from \"react\";\r\nimport Formsy from \"formsy-react\";\r\nimport loc from \"i18next\";\r\nimport DateEditorControl from \"components/ExtraAttributes/EditorControl/DateEditorControl\";\r\nimport PrincipalEditorControl from \"components/ExtraAttributes/EditorControl/PrincipalEditorControl\";\r\nimport EnumEditorControl from \"components/ExtraAttributes/EditorControl/EnumEditorControl\";\r\nimport EnumViewerControl from \"components/ExtraAttributes/ViewerControl/EnumViewerControl\";\r\nimport MemoEditorControl from \"components/ExtraAttributes/EditorControl/MemoEditorControl\";\r\nimport HelpBlock from \"react-bootstrap/lib/HelpBlock\";\r\nimport Icons from \"@hs/icons\";\r\nimport {\r\n DateTimeFormat,\r\n ReminderTypeFlags,\r\n ReminderTypeFlagsEnumValues,\r\n ReminderPriorityEnumValues,\r\n type ReminderDTO,\r\n} from \"data/types\";\r\n\r\ntype Props = {\r\n reminder: ReminderDTO,\r\n autoFocus?: boolean,\r\n allowReminderTypeEdit: boolean,\r\n setCanSubmit: () => void,\r\n handleSave: () => void,\r\n handleChange: () => void,\r\n};\r\n\r\nconst ReminderForm = ({\r\n reminder: { customAction, ...reminder },\r\n autoFocus,\r\n setCanSubmit,\r\n handleSave,\r\n handleChange,\r\n allowReminderTypeEdit,\r\n}: Props) => {\r\n const disableSubmit = useCallback(\r\n () => setCanSubmit(false),\r\n [setCanSubmit]\r\n );\r\n const enableSubmit = useCallback(() => setCanSubmit(true), [setCanSubmit]);\r\n const reminderTypeEnumValues = useMemo(\r\n () =>\r\n customAction == null\r\n ? ReminderTypeFlagsEnumValues.filter(\r\n (r) =>\r\n ![\r\n ReminderTypeFlags.Task,\r\n ReminderTypeFlags.Calendar,\r\n ].includes(r.value)\r\n )\r\n : ReminderTypeFlagsEnumValues.filter(\r\n (r) =>\r\n ![\r\n ReminderTypeFlags.Task,\r\n ReminderTypeFlags.Calendar,\r\n ].includes(r.value)\r\n ).concat({\r\n value: ReminderTypeFlags.CustomAction,\r\n label:\r\n customAction.displayName ||\r\n \"$reminder:type.customAction\",\r\n icon: (\r\n \r\n ),\r\n }),\r\n [customAction]\r\n );\r\n return (\r\n \r\n \r\n new Date(value) - Date.now() > 0,\r\n }}\r\n validationErrors={{\r\n isDefaultRequiredValue: loc.t(\"common:validation.required\"),\r\n isGreaterThanNow: loc.t(\"common:validation.greaterThanNow\"),\r\n }}\r\n />\r\n \r\n \r\n \r\n {allowReminderTypeEdit ? (\r\n \r\n value !== ReminderTypeFlags.NotSet,\r\n }}\r\n validationErrors={{\r\n hasFlag: loc.t(\"common:validation.required\"),\r\n }}\r\n value={reminder.type}\r\n onChange={handleChange}\r\n />\r\n ) : (\r\n \r\n )}\r\n {customAction != null && customAction.error && (\r\n {customAction.error}\r\n )}\r\n \r\n );\r\n};\r\n\r\nReminderForm.displayName = \"ReminderForm\";\r\nexport default ReminderForm;\r\n","import React, { useCallback, useState, useMemo } from \"react\";\r\nimport { useAbortController } from \"hooks\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./ReminderManagerModal.module.css\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport Constants from \"data/constants\";\r\nimport Status from \"components/Status\";\r\nimport {\r\n LocalDateStringOption,\r\n ReminderPriority,\r\n ReminderTypeFlags,\r\n type ReminderDTO,\r\n} from \"data/types\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport ReminderForm from \"components/Reminder/ReminderForm\";\r\nimport { upsertReminder } from \"data/api\";\r\nimport { userLanguage } from \"data/storeHelper\";\r\n\r\ntype Props = {\r\n open: boolean,\r\n close: () => void,\r\n itemUri: string,\r\n name: string,\r\n onSave: () => void,\r\n reminder?: ReminderDTO,\r\n};\r\n\r\nconst getReminder = (itemUri): ReminderDTO => ({\r\n id: null,\r\n itemUri,\r\n date: new Date(new Date().setDate(new Date().getDate() + 1)).toLocalJSON(),\r\n creator: null,\r\n recipient: null,\r\n reason: \"\",\r\n priority: ReminderPriority.Normal,\r\n type: ReminderTypeFlags.Mail,\r\n});\r\n\r\nexport const ReminderManagerModal = ({\r\n itemUri,\r\n name,\r\n close,\r\n open,\r\n onSave,\r\n reminder: reminderFromProps = getReminder(itemUri),\r\n}: Props) => {\r\n const [reminder, setReminder] = useState(reminderFromProps);\r\n const [isDirty, setIsDirty] = useState(false);\r\n\r\n const allowReminderTypeEdit = useMemo(\r\n () =>\r\n Object.keys(ReminderTypeFlags).filter(\r\n (k) =>\r\n ReminderTypeFlags[k] === ReminderTypeFlags.Mail ||\r\n (reminderFromProps.type & ReminderTypeFlags[k]) > 1\r\n ).length > 1,\r\n [reminderFromProps]\r\n );\r\n\r\n const [canSubmit, setCanSubmit] = useState(false);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n\r\n const abortController = useAbortController();\r\n\r\n const handleChange = useCallback((name, value) => {\r\n setIsDirty(true);\r\n setReminder((r) => ({ ...r, [name]: value }));\r\n }, []);\r\n\r\n const handleCanSubmit = useCallback(\r\n (canSubmit) => setCanSubmit(canSubmit && isDirty),\r\n [isDirty]\r\n );\r\n\r\n const handleSave = useCallback(() => {\r\n const locContext = {\r\n date: new Date(reminder.date).toLocaleDateString(\r\n userLanguage(),\r\n LocalDateStringOption.DateTime\r\n ),\r\n };\r\n setIsSubmitting(true);\r\n upsertReminder(reminder, abortController(true).signal)\r\n .then((reminderId) => {\r\n const id = parseInt(reminderId, 10);\r\n /* istanbul ignore else */\r\n if (typeof onSave === \"function\") {\r\n onSave(reminder, id);\r\n }\r\n setIsSubmitting(false);\r\n /* istanbul ignore else */\r\n if (id > 0) {\r\n close(false);\r\n }\r\n toastActionResult(id > 0, \"reminder:action_save\", locContext);\r\n return reminderId;\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n setIsSubmitting(false);\r\n toastActionResult(false, \"reminder:action_save\", locContext);\r\n });\r\n }, [reminder, abortController, onSave, close]);\r\n\r\n return (\r\n close(false)}\r\n dialogClassName={styles.modal}\r\n docked\r\n >\r\n \r\n \r\n \r\n {` ${loc.t(\r\n reminder.id == null ? \"reminder:new\" : \"reminder:edit\"\r\n )} › ${name}`}\r\n \r\n \r\n \r\n \r\n \r\n \r\n close(false)}\r\n bsStyle=\"link\"\r\n className=\"pull-left\"\r\n >\r\n {loc.t(\"cancel\")}\r\n \r\n \r\n {isSubmitting && (\r\n \r\n )}{\" \"}\r\n {loc.t(\r\n `reminder:action_save.${\r\n reminder.id == null ? \"insert\" : \"update\"\r\n }`\r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nReminderManagerModal.displayName = \"ReminderManagerModal\";\r\nexport const openReminderManagerModal = createModal(ReminderManagerModal);\r\n","import { openReminderManagerModal } from \"components/ReminderManagerModal\";\r\nimport { type ReminderDTO } from \"data/types\";\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n onSave?: () => void,\r\n reminder?: ReminderDTO,\r\n};\r\n\r\nclass reminder_manage {\r\n /**\r\n * Opens Modal to manage (insert/update) Reminder\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n * @param {{ onSave?: () => void ) }} { onSave }\r\n * @param {{ reminder?: ReminderDTO }} { reminder }\r\n */\r\n execute = async ({\r\n itemUri,\r\n name,\r\n onSave,\r\n reminder,\r\n }: Context): Promise => {\r\n await openReminderManagerModal({ itemUri, name, onSave, reminder });\r\n return true;\r\n };\r\n}\r\nexport default reminder_manage;\r\n","import { addOfflineItem } from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport {\r\n setOfflineItemSyncStatusAction,\r\n offlineSyncUpdateAction,\r\n} from \"data/actions\";\r\nimport { OfflineSyncStatus } from \"data/types\";\r\nimport { Dispatch } from \"react-redux\";\r\n\r\n/**\r\n * Marks an item to be available offline\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n dispatch: Dispatch,\r\n};\r\n\r\nclass offline_add {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n execute = async ({\r\n itemUri,\r\n name,\r\n dispatch,\r\n }: Context): Promise => {\r\n try {\r\n const id = await addOfflineItem(itemUri);\r\n if (id == null) {\r\n throw new Error(\"Cannot create offline Item (id is null)\");\r\n }\r\n dispatch(\r\n setOfflineItemSyncStatusAction({\r\n item: { id, itemUri },\r\n status: OfflineSyncStatus.Unknown,\r\n })\r\n );\r\n // Request sync update\r\n dispatch(offlineSyncUpdateAction());\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n report = async (success: boolean, { name }: Context): Promise => {\r\n this.logger(success === true, \"commandAction:offline_add\", {\r\n name,\r\n });\r\n };\r\n}\r\n\r\nexport default offline_add;\r\n","import { delOfflineItem } from \"data/api\";\r\nimport { toastActionResult } from \"data/toast\";\r\nimport { offlineSyncUpdateAction } from \"data/actions\";\r\nimport { Dispatch } from \"react-redux\";\r\n\r\n/**\r\n * Removes an item from being available offline\r\n *\r\n * @param {{ itemUri: string }} { itemUri }\r\n * @param {{ name: string }} { name }\r\n */\r\n\r\ntype Context = {\r\n itemUri: string,\r\n name: string,\r\n dispatch: Dispatch,\r\n};\r\n\r\nclass offline_delete {\r\n queueMultiple: boolean = true;\r\n logger: () => any = toastActionResult;\r\n execute = async ({\r\n itemUri,\r\n name,\r\n dispatch,\r\n }: Context): Promise => {\r\n try {\r\n const success = await delOfflineItem(itemUri);\r\n dispatch(offlineSyncUpdateAction());\r\n return success;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n report = async (success: boolean, { name }: Context): Promise => {\r\n this.logger(success === true, \"commandAction:offline_delete\", {\r\n name,\r\n });\r\n };\r\n}\r\n\r\nexport default offline_delete;\r\n","import { setOfflineItemSyncStatusAction } from \"data/actions\";\r\nimport { OfflineSyncStatus } from \"data/types\";\r\n\r\n/**\r\n * re-sync current offlineItem\r\n */\r\nclass offline_syncItem {\r\n execute = ({ dispatch, offlineItem }) =>\r\n dispatch(\r\n setOfflineItemSyncStatusAction({\r\n item: offlineItem,\r\n status: OfflineSyncStatus.Unknown,\r\n })\r\n );\r\n}\r\n\r\nexport default offline_syncItem;\r\n","// @flow\r\nimport { dispatch } from \"data/storeHelper\";\r\nimport { commandActionRequestAction } from \"data/actions\";\r\n\r\nimport ip_archive from \"./ip_archive\";\r\nimport ip_browse from \"./ip_browse\";\r\nimport ip_edit from \"./ip_edit\";\r\nimport ip_properties from \"./ip_properties\";\r\nimport ip_commandAction from \"./ip_commandAction\";\r\n\r\nimport folder_delete from \"./folder_delete\";\r\nimport folder_editClassification from \"./folder_editClassification\";\r\nimport folder_emailLink from \"./folder_emailLink\";\r\nimport folder_preview from \"./folder_preview\";\r\n\r\nimport search_favorite from \"./search_favorite\";\r\nimport search_preview from \"./search_preview\";\r\n\r\nimport doclist_resetFilters from \"./doclist_resetFilters\";\r\nimport doclist_exportCsv from \"./doclist_exportCsv\";\r\n\r\nimport doc_download from \"./doc_download\";\r\nimport doc_delete from \"./doc_delete\";\r\nimport doc_preview from \"./doc_preview\";\r\nimport doc_print from \"./doc_print\";\r\nimport doc_related from \"./doc_related\";\r\nimport doc_upload from \"./doc_upload\";\r\nimport doc_uploadVersion from \"./doc_uploadVersion\";\r\nimport doc_emailLink from \"./doc_emailLink\";\r\nimport doc_emailAttachment from \"./doc_emailAttachment\";\r\nimport doc_editClassification from \"./doc_editClassification\";\r\nimport doc_editWebDav from \"./doc_editWebDav\";\r\nimport doc_editCloud from \"./doc_editCloud\";\r\n\r\nimport favorite from \"./favorite\";\r\n\r\nimport searchResult_form from \"./searchResult_form\";\r\nimport link from \"./link\";\r\nimport lock from \"./lock\";\r\nimport unlock from \"./unlock\";\r\nimport subscribe from \"./subscribe\";\r\nimport unsubscribe from \"./unsubscribe\";\r\nimport share from \"./share\";\r\nimport share_web from \"./share_web\";\r\nimport createFolder_template from \"./createFolder_template\";\r\nimport wf_start from \"./wf_start\";\r\nimport itemFlows from \"./itemFlows\";\r\nimport transfer from \"./transfer\";\r\n\r\nimport recyclebin_docClear from \"./recyclebin_docClear\";\r\nimport recyclebin_docRestore from \"./recyclebin_docRestore\";\r\nimport recyclebin_folderClear from \"./recyclebin_folderClear\";\r\nimport recyclebin_folderRestore from \"./recyclebin_folderRestore\";\r\n\r\nimport editClassification from \"./editClassification\";\r\nimport clipboard_copyItemUri from \"./clipboard_copyItemUri\";\r\nimport clipboard_copyItemLink from \"./clipboard_copyItemLink\";\r\n\r\nimport raster_manage from \"./raster_manage\";\r\nimport reminder_manage from \"./reminder_manage\";\r\n\r\nimport offline_add from \"./offline_add\";\r\nimport offline_delete from \"./offline_delete\";\r\nimport offline_syncItem from \"./offline_syncItem\";\r\n\r\n// steps to add a new custom action -> see README.md\r\nexport const actionMappings = {\r\n ip_archive,\r\n ip_browse,\r\n ip_edit,\r\n ip_properties,\r\n ip_commandAction,\r\n\r\n folder_delete,\r\n folder_editClassification,\r\n folder_emailLink,\r\n folder_preview,\r\n\r\n search_favorite,\r\n search_preview,\r\n\r\n doclist_resetFilters,\r\n doclist_exportCsv,\r\n\r\n doc_download,\r\n doc_delete,\r\n doc_preview,\r\n doc_print,\r\n doc_related,\r\n doc_upload,\r\n doc_uploadVersion,\r\n doc_emailLink,\r\n doc_emailAttachment,\r\n doc_editClassification,\r\n doc_editWebDav,\r\n doc_editCloud,\r\n\r\n favorite,\r\n link,\r\n lock,\r\n unlock,\r\n subscribe,\r\n unsubscribe,\r\n share,\r\n share_web,\r\n searchResult_form,\r\n createFolder_template,\r\n wf_start,\r\n itemFlows,\r\n transfer,\r\n\r\n recyclebin_docClear,\r\n recyclebin_docRestore,\r\n recyclebin_folderClear,\r\n recyclebin_folderRestore,\r\n\r\n editClassification,\r\n clipboard_copyItemUri,\r\n clipboard_copyItemLink,\r\n\r\n raster_manage,\r\n reminder_manage,\r\n\r\n offline_add,\r\n offline_delete,\r\n offline_syncItem,\r\n};\r\n\r\nconst CommandActionHandler = (\r\n actionId: string,\r\n props?: any\r\n): boolean | null => {\r\n const actionHandler = actionMappings[actionId];\r\n if (typeof actionHandler !== \"function\") {\r\n alert(\"Unknown action: \" + actionId);\r\n return false;\r\n }\r\n dispatch(\r\n commandActionRequestAction({\r\n commandAction: actionId,\r\n props,\r\n items: props?.items ?? [\r\n {\r\n name: props?.name,\r\n itemUri: props?.itemUri,\r\n formatId: props?.formatId ?? -1,\r\n isDoc: props?.isDoc ?? false,\r\n },\r\n ],\r\n })\r\n );\r\n // HACK inPoint.Cloud.Azure AppInsights...\r\n /* istanbul ignore next */\r\n if (\"appInsights\" in window) {\r\n window.appInsights.trackEvent({\r\n name: \"CommandAction\",\r\n properties: {\r\n actionId,\r\n ...props,\r\n },\r\n });\r\n }\r\n //return actionHandler({ dispatch: dispatch, ...props });\r\n};\r\nexport default CommandActionHandler;\r\n","// @flow\r\nimport { Plugin } from \"@uppy/core\";\r\n//import { type uppyFile } from \"data/uppy\";\r\nimport isEmpty from \"lodash/isEmpty\";\r\nimport parser from \"exif-parser\";\r\n\r\ntype uppyFileMetadata = {\r\n type: string,\r\n};\r\n\r\nexport type uppyFile = {\r\n id: string, // 'uppyteamkongjpg1501851828779'\r\n name: string, // 'nature.jpg'\r\n extension: string, // '.jpg'\r\n type: string, // 'image/jpeg'\r\n data: Object, // the Blob object\r\n size: number | string, // 3947642 (returns 'N/A' if size cannot be determined)\r\n preview: string, // value that can be used to populate \"src\" attribute of an \"img\" tag,\r\n meta: uppyFileMetadata,\r\n};\r\n\r\n/* istanbul ignore next */\r\nexport default class UppyExif extends Plugin {\r\n constructor(uppy: Object, opts: Object) {\r\n super(uppy, opts);\r\n this.uppy = uppy;\r\n this.type = \"exif\";\r\n this.id = \"Exif\";\r\n this.title = \"uppy-exif\";\r\n\r\n // set default options\r\n const defaultOptions = {\r\n prefix: \"exif_\",\r\n tags: [],\r\n };\r\n\r\n // merge default options with the ones set by user\r\n this.opts = Object.assign({}, defaultOptions, opts);\r\n }\r\n\r\n install() {\r\n this.uppy.log(\"[Exif] Installing UppyExif Plugin\");\r\n this.uppy.on(\"file-added\", this.extractExif);\r\n }\r\n\r\n uninstall() {\r\n this.uppy.log(\"[Exif] Removing UppyExif Plugin\");\r\n this.uppy.off(\"file-added\", this.extractExif);\r\n }\r\n\r\n extractExif = (file: uppyFile) => {\r\n // NOTE: EXIF only supported on jpeg files!\r\n if (file.meta.type !== \"image/jpeg\") {\r\n this.uppy.log(\r\n `[Exif] mime type: ${file.meta.type} does not support EXIF tags`\r\n );\r\n return;\r\n }\r\n\r\n this.uppy.log(`[Exif] Extracting tags from ${file.name}`);\r\n const reader = new FileReader();\r\n reader.addEventListener(\"loadend\", () => {\r\n // DONE?\r\n /* istanbul ignore else */\r\n if (reader.readyState === 2) {\r\n try {\r\n let buffer = parser.create(reader.result);\r\n // get Exif Tags\r\n const result = buffer.parse();\r\n const metadata = {};\r\n // any requested tags?\r\n if (this.opts.tags.length === 0) {\r\n // no, return them all\r\n Object.keys(result.tags).forEach((tagName) => {\r\n metadata[this.opts.prefix + tagName] =\r\n result.tags[tagName];\r\n });\r\n } else {\r\n // yes, return only those\r\n this.opts.tags.forEach((tagName) => {\r\n const tag = result.tags[tagName];\r\n /* istanbul ignore else */\r\n if (tag != null) {\r\n metadata[this.opts.prefix + tagName] = tag;\r\n }\r\n });\r\n }\r\n // any tags found?\r\n if (!isEmpty(metadata)) {\r\n this.uppy.setFileMeta(file.id, metadata);\r\n this.uppy.log(\r\n `[Exif] Found tags for ${file.name} and added to metadata with prefix: ${this.opts.prefix}`\r\n );\r\n } else {\r\n this.uppy.log(\r\n `[Exif] None of the requested tags found for ${file.name}`\r\n );\r\n }\r\n } catch (err) {\r\n // console.log(err);\r\n // got invalid data, handle error\r\n this.uppy.log(\r\n `[Exif] Cannot analyse tags for ${file.name}`,\r\n err.message\r\n );\r\n }\r\n } else {\r\n this.uppy.log(\r\n `[Exif] Cannot load file ${file.name}: ${reader.error.message}`\r\n );\r\n }\r\n });\r\n\r\n // convert from Blob to ArrayBuffer\r\n reader.readAsArrayBuffer(file.data);\r\n };\r\n}\r\n","// @flow\r\nimport Uppy from \"@uppy/core\";\r\nimport \"@uppy/core/dist/style.css\";\r\nimport Tus from \"@uppy/tus\";\r\nimport Webcam from \"@uppy/webcam\";\r\nimport \"@uppy/webcam/dist/style.css\";\r\nimport ThumbnailGenerator from \"@uppy/thumbnail-generator\";\r\nimport GoldenRetriever from \"@uppy/golden-retriever\";\r\nimport { accessToken, userLanguage, correlationId } from \"data/storeHelper\";\r\nimport uppyRedux from \"@uppy/store-redux\";\r\nimport store from \"data/store\";\r\nimport isEmpty from \"lodash/isEmpty\";\r\nimport UppyExif from \"components/uppy-exif\";\r\nimport UppyMsg from \"@hs/uppy-msg\";\r\nimport UppyLexmark from \"@wegener-it/uppy-plugin-lexmark\";\r\nimport UppyRestrictions from \"components/uppy-restrictions\";\r\nimport { isFeatureOn, Feature, get, isMiniView } from \"data/constants\";\r\nimport { CustomHttpHeader } from \"data/types\";\r\nimport { JL } from \"data/logging\";\r\nimport { isOnline } from \"data/storeHelper\";\r\nimport { OfflineQueueItemType } from \"data/types\";\r\nimport {\r\n addToOfflineQueue,\r\n anyPendingChanges,\r\n} from \"data/offline/offlineQueue\";\r\nimport { postMessageTo } from \"hooks/PostMessage/Utils\";\r\nimport { ModalAction } from \"hooks/PostMessage/Actions\";\r\nimport { toastStyled, toastTypes } from \"data/toast\";\r\nimport loc from \"i18next\";\r\n\r\nconst DEFAULT_UPPY_ID = \"upload\";\r\n\r\nexport type uppyFile = {\r\n id: string, // 'uppyteamkongjpg1501851828779'\r\n name: string, // 'nature.jpg'\r\n extension: string, // '.jpg'\r\n type: string, // 'image/jpeg'\r\n data: Object, // the Blob object\r\n size: number | string, // 3947642 (returns 'N/A' if size cannot be determined)\r\n preview: string, // value that can be used to populate \"src\" attribute of an \"img\" tag\r\n};\r\n\r\nexport const uppyPendingUploadsCountSelector = (\r\n state: Object,\r\n id: string /* istanbul ignore next */ = DEFAULT_UPPY_ID\r\n) => {\r\n let pendingCount = 0;\r\n if (\r\n state &&\r\n state.uppy &&\r\n state.uppy[id] &&\r\n state.uppy[id].files &&\r\n !isEmpty(state.uppy[id].files)\r\n ) {\r\n Object.keys(state.uppy[id].files).forEach((fileId) => {\r\n const file = state.uppy[id].files[fileId];\r\n if (file.progress.uploadComplete !== true) {\r\n pendingCount++;\r\n }\r\n });\r\n }\r\n return pendingCount;\r\n};\r\n\r\nexport const uppyHasPendingUploadsSelector = (\r\n state: Object,\r\n id: string = DEFAULT_UPPY_ID\r\n) => uppyPendingUploadsCountSelector(state, id) > 0;\r\n\r\nexport const uppyIsResumingUploadsSelector = (\r\n state: Object,\r\n id: string = DEFAULT_UPPY_ID\r\n) =>\r\n state &&\r\n state.uppy &&\r\n state.uppy[id] &&\r\n state.uppy[id].currentUploads &&\r\n !isEmpty(state.uppy[id].currentUploads);\r\n\r\n// returns metadata of queued pending files (not uploaded nor started)\r\nexport const uppyPendingFilesMetaSelector = (\r\n state: Object,\r\n id: string = DEFAULT_UPPY_ID\r\n) => {\r\n if (\r\n state &&\r\n state.uppy &&\r\n state.uppy[id] &&\r\n state.uppy[id].files &&\r\n !isEmpty(state.uppy[id].files)\r\n ) {\r\n let result = [];\r\n Object.keys(state.uppy[id].files).forEach((fileId) => {\r\n const file = state.uppy[id].files[fileId];\r\n if (\r\n file.progress.uploadStarted === null &&\r\n file.progress.uploadComplete === false\r\n ) {\r\n result.push(\r\n Object.assign(\r\n {},\r\n { id: file.id, preview: file.preview },\r\n file.meta\r\n )\r\n );\r\n }\r\n });\r\n return result;\r\n } else {\r\n return null;\r\n }\r\n};\r\n\r\n/* istanbul ignore next */\r\nexport const getUppyLocale = async () => {\r\n const locale = mapToUppyLocale[userLanguage()] || \"en_US\";\r\n const i18n = await import(\r\n `__i18n/uppy/${locale}` /* webpackChunkName: \"uppy-[request]\" */\r\n );\r\n return {\r\n locale,\r\n i18n,\r\n };\r\n};\r\n\r\nexport const mapToUppyLocale: Object = {\r\n bg: \"bg_BG\",\r\n cs: \"cs_CZ\",\r\n de: \"de_DE\",\r\n \"de-AT\": \"de_DE\",\r\n \"de-CH\": \"de_DE\",\r\n \"de-DE\": \"de_DE\",\r\n en: \"en_US\",\r\n \"en-GB\": \"en_US\",\r\n \"en-US\": \"en_US\",\r\n es: \"es_ES\",\r\n fr: \"fr_FR\",\r\n hr: \"hr_HR\",\r\n hu: \"hu_HU\",\r\n it: \"it_IT\",\r\n ru: \"ru_RU\",\r\n sk: \"sk_SK\",\r\n uk: \"ru_RU\", //\"uk_UA\", //NOT SUPPORTED\r\n lt: \"en_US\", //\"lt_LT\", //NOT SUPPORTED\r\n};\r\n\r\nexport const createUppy = ({\r\n id = DEFAULT_UPPY_ID,\r\n maxNumberOfFiles,\r\n maxFileSize,\r\n allowedFileTypes,\r\n deniedFileTypes,\r\n metadata,\r\n}: {\r\n id?: string,\r\n maxNumberOfFiles?: number,\r\n maxFileSize?: number,\r\n allowedFileTypes?: Array,\r\n deniedFileTypes?: Array,\r\n metadata?: Object,\r\n}) =>\r\n new Uppy({\r\n store: uppyRedux({\r\n store,\r\n id,\r\n }),\r\n autoProceed: false,\r\n restrictions: {\r\n maxNumberOfFiles,\r\n maxFileSize,\r\n allowedFileTypes,\r\n deniedFileTypes, // custom option handled by our own components/uppy-restrictions\r\n },\r\n meta: metadata,\r\n allowMultipleUploads: false,\r\n debug:\r\n process.env.NODE_ENV !== \"production\" /* istanbul ignore next */ ||\r\n get(window.CONFIG, [\"general\", \"browserLoggingLevel\"], 4000) < 3000,\r\n logger: JL(\"Uppy\"),\r\n });\r\n\r\n// #48012: Load uppy plugins when token is available\r\nexport const addUppyPlugins = (_uppy = uppy) => {\r\n const headers = {\r\n [CustomHttpHeader.CorrelationId]: correlationId(),\r\n [CustomHttpHeader.SecureParams]: get(\r\n window.CONFIG,\r\n [\"general\", \"secure_params\"],\r\n undefined\r\n ),\r\n [CustomHttpHeader.MiniView]: /* istanbul ignore next */ isMiniView(\r\n window.location\r\n )\r\n ? \"1\"\r\n : \"0\",\r\n };\r\n /* istanbul ignore next */\r\n if (get(window.CONFIG, [\"auth\", \"useCustomAuthHeader\"], false)) {\r\n headers[\"X-inPoint-Auth\"] = accessToken();\r\n } else {\r\n headers.authorization = `Bearer ${accessToken()}`;\r\n }\r\n /* istanbul ignore next */\r\n if (!_uppy.getPlugin(\"Tus\")) {\r\n _uppy = _uppy.use(Tus, {\r\n endpoint:\r\n (window.CONFIG.host.bridge || window.CONFIG.host.basename) +\r\n \"/__up\",\r\n withCredentials: true,\r\n headers,\r\n resume: false,\r\n autoRetry: true,\r\n limit: 1, //only one concurrent upload at a time - to avoid filename collisions\r\n retryDelays: [0, 1000, 3000, 5000],\r\n removeFingerprintOnSuccess: true,\r\n });\r\n }\r\n /* istanbul ignore next */\r\n try {\r\n if (!_uppy.getPlugin(\"Webcam\")) {\r\n _uppy = _uppy.use(Webcam, {\r\n facingMode: \"environment\",\r\n countdown: false,\r\n modes: [\"video-audio\", \"video-only\", \"audio-only\", \"picture\"],\r\n mirror: false,\r\n title: \"Camera\",\r\n });\r\n }\r\n } catch (e) {\r\n _uppy.log(\"[Webcam] Cannot load Plugin...\");\r\n }\r\n /* istanbul ignore next */\r\n if (!_uppy.getPlugin(\"Lexmark\") && isFeatureOn(Feature.uppyLexmark)) {\r\n const { UppyLexmark: Lexmark } = UppyLexmark;\r\n _uppy = _uppy.use(Lexmark, {\r\n id: \"Lexmark\",\r\n });\r\n }\r\n /* istanbul ignore next */\r\n if (!_uppy.getPlugin(\"ThumbnailGenerator\")) {\r\n _uppy = _uppy.use(ThumbnailGenerator, { thumbnailWidth: 280 });\r\n }\r\n /* istanbul ignore next */\r\n try {\r\n if (!_uppy.getPlugin(\"GoldenRetriever\") && window.localStorage) {\r\n // NOTE: https://github.com/transloadit/uppy/pull/268\r\n // GoldenRetriever restores ALL files from ANY queue (uppy.id)\r\n _uppy = _uppy\r\n // only now (after Thumbnail-generator has been registered) include Golden-Retriever!\r\n .use(GoldenRetriever, { serviceWorker: true });\r\n }\r\n } catch (e) {\r\n if (e instanceof DOMException && e.name === \"SecurityError\")\r\n console.error(\r\n \"Cannot load Uppy Plugin GoldenRetriever (disabled Local Storage)\"\r\n );\r\n }\r\n /* istanbul ignore next */\r\n if (!_uppy.getPlugin(\"Exif\")) {\r\n _uppy = _uppy.use(UppyExif, {\r\n tags: [\"GPSLatitude\", \"GPSLongitude\", \"GPSDOP\", \"Orientation\"],\r\n });\r\n }\r\n /* istanbul ignore next */\r\n if (!_uppy.getPlugin(\"Msg\")) {\r\n _uppy = _uppy.use(UppyMsg, {\r\n tags: [\"senderName\", \"senderEmail\", \"senderDomain\", \"subject\"],\r\n });\r\n }\r\n /* istanbul ignore next */\r\n if (!_uppy.getPlugin(\"Restrictions\")) {\r\n _uppy = _uppy.use(UppyRestrictions, {});\r\n }\r\n\r\n // standard upload-error handling (including offline queueing)\r\n _uppy.on(\"upload-error\", (file: uppyFile, error: any) => {\r\n console.warn(\"[Uppy] upload-error\", file, error);\r\n // upload completely started offline?\r\n // otherwise let Uppy's GolderRetriever plugin take care of it\r\n if (\r\n error &&\r\n error.isNetworkError &&\r\n !isOnline() &&\r\n file &&\r\n file.progress &&\r\n file.progress.uploadStarted === null &&\r\n file.progress.uploadComplete === false\r\n ) {\r\n const key = file.meta.itemUri + \"_\" + file.id; // to identify pending changes on target folder\r\n anyPendingChanges(key).then((exists) => {\r\n if (!exists) {\r\n addToOfflineQueue({\r\n type: OfflineQueueItemType.UppyFile,\r\n key,\r\n name: file.name,\r\n params: file,\r\n }).then(() => {\r\n _uppy.removeFile(file.id);\r\n postMessageTo(ModalAction.Close);\r\n toastStyled(toastTypes.swOfflineQueueAddFile);\r\n });\r\n }\r\n });\r\n } else {\r\n toastStyled({\r\n ...toastTypes.uppyError,\r\n message: loc.t(\"upload:error\", { file: file.name }),\r\n });\r\n }\r\n });\r\n\r\n return _uppy;\r\n};\r\n\r\nexport type UppyEvent = {\r\n type: string,\r\n callback: Function,\r\n};\r\n\r\nexport const addUppyEvents = (events: Array, _uppy = uppy) => {\r\n events.forEach((event) => _uppy.on(event.type, event.callback));\r\n return _uppy;\r\n};\r\n\r\nexport const removeUppyEvents = (events: Array, _uppy = uppy) => {\r\n events.forEach((event) => _uppy.off(event.type, event.callback));\r\n return _uppy;\r\n};\r\n\r\n/** our global uppy handler instance */\r\nconst uppy = createUppy({});\r\nexport default uppy;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport styles from \"./ConfirmModal.module.css\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog */\r\n close: () => void,\r\n /** text to show in Confirm button */\r\n confirmButton?: string,\r\n /** confirm button bsStyle\r\n * @default {string} danger\r\n */\r\n confirmStyle?: string,\r\n /** text to show in Cancel button */\r\n cancelButton?: string,\r\n /** Modal Dialog title */\r\n title?: string,\r\n /** text to show in body of Modal dialog */\r\n body: string,\r\n /** FontAwesome icon to show above title\r\n * @default {string} \"exclamation-triangle\"\r\n */\r\n icon: ?string,\r\n /** whether escape closes the window calling close(false) */\r\n requireSelection?: boolean,\r\n};\r\n\r\n/** presents a Confirm dialog to the user\r\n * @returns {boolean} true if user confirmed, null/undefined otherwise\r\n */\r\nexport const ConfirmModal = ({\r\n open,\r\n close,\r\n body,\r\n confirmButton = loc.t(\"common:confirm.yes\"),\r\n confirmStyle = \"danger\",\r\n cancelButton = loc.t(\"common:confirm.cancel\"),\r\n title = loc.t(\"common:confirm.title\"),\r\n icon = \"exclamation-triangle\",\r\n requireSelection = false,\r\n}: Props) => (\r\n \r\n requireSelection !== true && close(false)\r\n }\r\n dialogClassName={styles.modal}\r\n dataTest=\"confirmModal\"\r\n >\r\n {title && (\r\n \r\n {icon && (\r\n \r\n )}\r\n {title}\r\n \r\n )}\r\n \r\n

{body}

\r\n
\r\n \r\n close(true)}\r\n data-test=\"confirmModalConfirmButton\"\r\n >\r\n {confirmButton}\r\n \r\n \r\n \r\n \r\n);\r\nConfirmModal.displayName = \"ConfirmModal\";\r\nexport const openConfirmModal = createModal(ConfirmModal);\r\n","// @flow\r\nimport React from \"react\";\r\nimport loc from \"i18next\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport CommandActionHandler from \"./index\";\r\nimport { ItemFlowDirection } from \"data/types\";\r\n\r\n/**\r\n * Create itemAction localization identifier for CommandAction Button\r\n *\r\n * @param {action: string } {itemUri} CommandAction identifier string\r\n * @param {props?: any } {props} optional commandAction properties\r\n *\r\n */\r\nconst getItemActionLocalizationIdentifier = (\r\n action: string,\r\n props?: any\r\n): string => {\r\n switch (action) {\r\n case \"itemFlows\":\r\n let locId = `${action}_${\r\n props?.direction === ItemFlowDirection.out ? \"output\" : \"input\"\r\n }`;\r\n return props?.categoryId !== \"all\"\r\n ? `${locId}.${props.categoryId}`\r\n : locId;\r\n default:\r\n return action;\r\n }\r\n};\r\n\r\nconst CommandActionButton = ({\r\n action,\r\n props,\r\n}: {\r\n action: string,\r\n props?: any,\r\n}) => {\r\n const label = loc.t(\r\n `itemActions:${getItemActionLocalizationIdentifier(action, props)}.name`\r\n );\r\n return (\r\n CommandActionHandler(action, props)}\r\n style={{ color: \"#337ab7\", fontSize: 13 }}\r\n >\r\n {label}\r\n \r\n );\r\n};\r\nCommandActionButton.displayName = \"CommandActionButton\";\r\nexport default CommandActionButton;\r\n","import { getDefaultsConfig } from \"data/constants\";\r\nimport immutable from \"object-path-immutable\";\r\nimport {\r\n type DocListFilterRequestDTO,\r\n DocListFilterOperators,\r\n type DocListFilterOperatorsEnum,\r\n DocListColumnType,\r\n type DocListColumnTypeEnum,\r\n type DocColumnResultDTO,\r\n type DocListLayout,\r\n} from \"data/types\";\r\nimport { getValue } from \"data/utils\";\r\n\r\nexport function GetDefaults(\r\n itemUri: string,\r\n formatId: number,\r\n cols?: Array\r\n): DocListLayout {\r\n const defaults = getDefaultsConfig(itemUri, formatId);\r\n if (defaults != null && defaults.filters != null) {\r\n let filters: Array = [];\r\n for (let i = 0, len = defaults.filters.length; i < len; i++) {\r\n const filterDef = defaults.filters[i];\r\n filters.push(Object.assign({}, filterDef, {}));\r\n }\r\n return { filters, sorts: defaults.sorts };\r\n }\r\n if (cols != null)\r\n return {\r\n filters: GetDefaultFilters(cols),\r\n sorts: [],\r\n };\r\n return { filters: [], sorts: [] };\r\n}\r\n\r\n// creates the filters array for first use\r\nexport function GetDefaultFilters(\r\n cols: Array\r\n): Array {\r\n let filters: Array = [];\r\n\r\n for (let i = 0, len = cols.length; i < len; i++) {\r\n filters.push({\r\n operator: GetDefaultOperatorForType(cols[i].type),\r\n name: cols[i].name,\r\n values: [\"\"],\r\n });\r\n }\r\n return filters;\r\n}\r\n\r\nexport function GetDefaultOperatorForType(\r\n type: DocListColumnTypeEnum\r\n): DocListFilterOperatorsEnum {\r\n switch (type) {\r\n case DocListColumnType.BooleanValue:\r\n return DocListFilterOperators.None;\r\n case DocListColumnType.StringValue:\r\n case DocListColumnType.WebDavName:\r\n return DocListFilterOperators.Contains;\r\n case DocListColumnType.DateTimeValue:\r\n return DocListFilterOperators.DateRelative;\r\n default:\r\n return DocListFilterOperators.Equals;\r\n }\r\n}\r\n\r\n// returns the filters with cleared values\r\nexport function ResetFilters(\r\n itemUri: string,\r\n formatId: number,\r\n filters?: Array,\r\n cols?: Array\r\n): ?Array {\r\n // none yet? return default list\r\n if (filters == null || filters.length === 0) {\r\n return GetDefaults(itemUri, formatId, cols).filters;\r\n }\r\n\r\n // reset values ONLY (operators stay as they are)\r\n // TODO should actually re-use docListFilter/resetValues()\r\n return filters.map((filter) => immutable.set(filter, \"values\", [\"\"]));\r\n}\r\n\r\nexport const IsFiltered = (filters: ?Array): boolean =>\r\n filters &&\r\n filters.some(\r\n (f) => f.values && f.values.length > 0 && String(f.values[0]).length > 0\r\n );\r\n\r\nexport const GetFilterValueAsString = (\r\n value: string | (SummaryAttributeValue & { value: string }) = \"\"\r\n): string => {\r\n // Handle Objects with prop rawValue or value\r\n const v = getValue(value, \"rawValue\");\r\n // Handle non-string values\r\n return typeof v === \"string\" ? v : \"\";\r\n};\r\n","const actions = {\r\n TOGGLES_PERSIST: \"toggles/PERSIST\",\r\n TOGGLES_CHANGE: \"toggles/CHANGE\",\r\n TOGGLES_UPDATECOUNTER: \"toggles/UPDATECOUNTER\",\r\n\r\n USER_FETCH_REQUESTED: \"user/FETCH_REQUESTED\",\r\n USER_FETCH_RESULT: \"user/FETCH_RESULT\",\r\n\r\n USER_SITES_RESULT: \"user/SITES_RESULT\",\r\n\r\n LOGIN_RESULT: \"login/RESULT\",\r\n LOGIN_SIGNOUT: \"login/SIGNOUT\",\r\n\r\n FAVORITES_FETCH_REQUEST: \"favorites/FETCH_REQUEST\",\r\n FAVORITES_FETCH_RESULT: \"favorites/FETCH_RESULT\",\r\n\r\n CARDS_FETCH_REQUESTED: \"cards/FETCH_REQUESTED\",\r\n CARDS_FETCH_RESULT: \"cards/FETCH_RESULT\",\r\n\r\n WF_FETCH_REQUESTED: \"wf/FETCH_REQUEST\",\r\n WF_FETCH_RESULT: \"wf/FETCH_RESULT\",\r\n\r\n TREE_FETCH_REQUEST: \"tree/FETCH_REQUEST\",\r\n TREE_FETCH_RESULT: \"tree/FETCH_RESULT\",\r\n\r\n DOCS_FETCH_REQUEST: \"docs/FETCH_REQUEST\",\r\n DOCS_FETCH_RESULT: \"docs/FETCH_RESULT\",\r\n DOCS_EXPORT_CSV: \"docs/EXPORT_CSV\",\r\n\r\n DOCS_LAYOUT_REQUEST: \"docs/LAYOUT_REQUEST\",\r\n DOCS_LAYOUT_SET: \"docs/LAYOUT_SET\",\r\n\r\n DOCS_FILTERS_RESET: \"docs/FILTER_RESET\",\r\n DOCS_FILTERS_SETBYREF: \"docs/FILTER_SETBYREF\",\r\n DOCS_FILTERS_SETBYNAME: \"docs/FILTER_SETBYNAME\",\r\n DOCS_FILTERTEXT_SET: \"docs/FILTERTEXT\",\r\n\r\n DOCS_THUMBNAIL_REQUEST: \"docs/THUMBNAIL_REQUEST\",\r\n DOCS_THUMBNAIL_RESULT: \"docs/THUMBNAIL_RESULT\",\r\n\r\n SEARCH_RESET: \"search/RESET\",\r\n SEARCH_FETCH_REQUEST: \"search/FETCH_REQUEST\",\r\n SEARCH_FETCH_RESULT: \"search/FETCH_RESULT\",\r\n SEARCH_FAVRENAME_REQUEST: \"search/FAVRENAME_REQUEST\",\r\n SEARCH_FAVRENAME_RESULT: \"search/FAVRENAME_RESULT\",\r\n SEARCH_ITEM_SAVE: \"search/ITEM_SAVE\",\r\n SEARCH_COUNT_REQUEST: \"search/AGGR_REQUEST\",\r\n SEARCH_COUNT_RESULT: \"search/AGGR_RESULT\",\r\n\r\n SEARCH_FORM_FETCH_REQUEST: \"search/FORM_FETCH_REQUEST\",\r\n SEARCH_FORM_FETCH_RESULT: \"search/FORM_FETCH_RESULT\",\r\n SEARCH_FORM_CHANGES: \"search/FORM_CHANGES\",\r\n SEARCH_FORM_RESET: \"search/FORM_RESET\",\r\n\r\n SEARCH_FORM_LIST_FETCH_REQUEST: \"search/FORM_LIST_FETCH_REQUEST\",\r\n SEARCH_FORM_LIST_FETCH_RESULT: \"search/FORM_LIST_FETCH_RESULT\",\r\n\r\n SPLITPANES_PERSIST: \"splitPanes/PERSIST\",\r\n SPLITPANES_SET: \"splitPanes/SET\",\r\n\r\n SETTINGS_SIDEBAR_MINI: \"settings/SIDEBAR_MINI\",\r\n SETTINGS_DOCLIST_VIEWMODE: \"settings/DOCLIST_VIEWMODE\",\r\n SETTINGS_SET: \"settings/SET\",\r\n\r\n GLOBALDEFAULTSEARCH_FETCH_REQUEST: \"globalDefaultSearch/FETCH_REQUEST\",\r\n GLOBALDEFAULTSEARCH_FETCH_RESULT: \"globalDefaultSearch/FETCH_RESULT\",\r\n\r\n CURRENT_BREADCRUMB: \"current/BREADCRUMB\",\r\n\r\n CURRENTITEM_SET: \"currentItem/SET\",\r\n CURRENTITEM_BAK: \"currentItem/BACKUP\",\r\n CURRENTITEM_RESTORE: \"currentItem/RESTORE\",\r\n CURRENTITEM_SAVE: \"currentItem/SAVE\",\r\n CURRENTITEM_LOADED: \"currentItem/LOADED\",\r\n\r\n EA_CLEAR: \"EA/CLEAR\",\r\n EA_DETAILVIEW_SET: \"EA/DETAILVIEW_SET\",\r\n EA_GRID_CURRENTROW: \"EA/GRID_CURRENTROW\",\r\n EA_FIELD_SET: \"EA/FIELD_SET\",\r\n EA_AUDITLOG_UPDATE: \"EA/AUDITLOG_UPDATE\",\r\n EA_AUDITLOG_CLEAR: \"EA/AUDITLOG_CLEAR\",\r\n EA_AUDITLOG_INSERT: \"EA/AUDITLOG_INSERT\",\r\n EA_AUDITLOG_DEL: \"EA/AUDITLOG_DEL\",\r\n EA_TABINDEX_SET: \"EA/TABINDEX_SET\",\r\n FORM_DEFAULTS_SET: \"form/DEFAULTS_SET\",\r\n FORM_EDITMODE_SET: \"form/EDITMODE_SET\",\r\n\r\n GLOBALEVENTS_SERVER: \"GLOBALEVENTS/SERVER\",\r\n\r\n OFFLINE_SYNC_REQUEST: \"offline/SYNC_REQUEST\",\r\n OFFLINE_SYNC_STARTED: \"offline/SYNC_STARTED\",\r\n OFFLINE_SYNC_DONE: \"offline/SYNC_DONE\",\r\n OFFLINE_SYNC_UPDATE: \"offline/SYNC_UPDATE\",\r\n OFFLINEITEM_SYNC_STATUS: \"offlineItem/STATUS\",\r\n OFFLINEITEM_REMOVE: \"offlineItem/REMOVE\",\r\n OFFLINEITEM_DEPSMAP_REQUEST: \"offlineItem/DEPSMAP_REQUEST\",\r\n OFFLINEITEM_DEPSMAP_RESULT: \"offlineItem/DEPSMAP_RESULT\",\r\n // EVENT_REFRESH_TASKS: \"EVENT/REFRESH_TASKS\" source: client/server, lastUpdateDate:xxx\r\n\r\n SW_INIT: \"sw/INIT\",\r\n SW_UPDATE: \"sw/UPDATE\",\r\n\r\n NOTIFICATION_TOAST: \"notification/TOAST\",\r\n NOTIFICATION_UPSERT: \"notification/UPSERT\",\r\n NOTIFICATION_DEL: \"notification/DEL\",\r\n NOTIFICATION_CLEAR: \"notification/CLEAR\",\r\n NOTIFICATION_STATUS: \"notification/STATUS\",\r\n\r\n COMMANDACTION_REQUEST: \"commandAction/REQUEST\",\r\n COMMANDACTION_QUEUE_ADD: \"commandAction/QUEUE_ADD\",\r\n COMMANDACTION_QUEUE_REMOVE: \"commandAction/QUEUE_REMOVE\",\r\n COMMANDACTION_QUEUE_START: \"commandAction/QUEUE_START\",\r\n COMMANDACTION_QUEUE_PAUSE: \"commandAction/QUEUE_PAUSE\",\r\n COMMANDACTION_ABORT: \"commandAction/ABORT\",\r\n COMMANDACTION_REMOVE: \"commandAction/REMOVE\",\r\n COMMANDACTION_LOG: \"commandAction/LOG\",\r\n COMMANDACTION_STATUS: \"commandAction/STATUS\",\r\n COMMANDACTION_ITEM_STATUS: \"commandAction/ITEM_STATUS\",\r\n\r\n PERSIST_PURGE: \"persist/PURGE\",\r\n};\r\nexport default actions;\r\n","import actionTypes from \"data/actions/actionTypes\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport immutable from \"object-path-immutable\";\r\nimport { type docsResultState, type docFilterText } from \"./types\";\r\nimport { DocsFlags } from \"data/types\";\r\n\r\nconst initialState: docsResultState = {\r\n status: Constants.NONE,\r\n error: undefined,\r\n filters: [],\r\n sorts: [],\r\n totalCount: 0,\r\n rowCount: 0,\r\n pageNum: 0,\r\n pageSize: 0,\r\n itemUri: null,\r\n rows: {},\r\n cols: [],\r\n filterText: null,\r\n};\r\n\r\nconst docsReducer = (state: docsResultState = initialState, action) => {\r\n switch (action.type) {\r\n case actionTypes.CURRENTITEM_SET:\r\n if (\r\n action.payload.name !== \"docmodal\" &&\r\n action.payload.name !== \"itemflows\" &&\r\n action.payload.itemUri !== state.itemUri\r\n )\r\n return { ...initialState };\r\n else return state;\r\n\r\n case actionTypes.DOCS_FILTERTEXT_SET:\r\n return { ...state, filterText: action.payload };\r\n\r\n case actionTypes.DOCS_FETCH_REQUEST:\r\n return {\r\n ...state,\r\n ...action.payload,\r\n };\r\n\r\n case actionTypes.DOCS_FETCH_RESULT:\r\n switch (action.payload.status) {\r\n case Constants.ERROR:\r\n return {\r\n ...initialState,\r\n itemUri: state.itemUri,\r\n status: action.payload.status,\r\n error: action.payload.error,\r\n receivedAt: action.payload.receivedAt,\r\n };\r\n case Constants.OK:\r\n if (state.pageNum <= 0) {\r\n return {\r\n ...state,\r\n // req specific\r\n totalCount: action.payload.totalCount,\r\n status: action.payload.status,\r\n error: action.payload.error,\r\n receivedAt: action.payload.receivedAt,\r\n\r\n rowCount: action.payload.result.rowCount,\r\n ...action.payload.result,\r\n };\r\n } else {\r\n return {\r\n // kept\r\n cols: state.cols,\r\n // TODO remove filters/sorts - should be retrieved from DocLayout!\r\n filters: state.filters,\r\n sorts: state.sorts,\r\n itemUri: state.itemUri,\r\n pageSize: state.pageSize,\r\n totalCount: state.totalCount,\r\n pageNum: state.pageNum,\r\n // req specific\r\n status: action.payload.status,\r\n error: action.payload.error,\r\n receivedAt: action.payload.receivedAt,\r\n\r\n rowCount: action.payload.result.rowCount,\r\n flags: action.payload.result.flags,\r\n rows: immutable.assign(\r\n state,\r\n \"rows\",\r\n action.payload.result.rows\r\n ).rows,\r\n };\r\n }\r\n\r\n /* istanbul ignore next */\r\n default:\r\n return {\r\n ...state,\r\n ...action.payload,\r\n };\r\n }\r\n\r\n /* istanbul ignore next */\r\n case actionTypes.PERSIST_PURGE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default docsReducer;\r\n\r\nexport const docsItemUriSelector = (state: Object): string =>\r\n state.docs.itemUri;\r\nexport const docsStatusSelector = (state: Object): ConstantsEnum =>\r\n state.docs.status;\r\nexport const docsErrorSelector = (state: Object) => state.docs.error;\r\nexport const docsColsSelector = (state: Object) => state.docs.cols;\r\nexport const docsRowsSelector = (state: Object) => state.docs.rows;\r\nexport const docsFilterTextSelector = (state: Object): docFilterText =>\r\n state.docs.filterText;\r\nexport const docsTotalCountSelector = (state: Object): number =>\r\n state.docs.totalCount;\r\nexport const docsFiltersSelector = (state: Object) => state.docs.filters;\r\nexport const docsSortsSelector = (state: Object) => state.docs.sorts;\r\nexport const docsFlagsSelector = (state: Object) => state.docs.flags || 0;\r\nexport const docsFlagsForceDocListSimpleSelector = (state: Object) =>\r\n docsStatusSelector(state) === Constants.OK\r\n ? !(~docsFlagsSelector(state) & DocsFlags.ForceDocListSimple)\r\n : false;\r\nexport const docsFlagsIsDocEditAllowedSelector = (state: Object) =>\r\n docsStatusSelector(state) === Constants.OK\r\n ? !(~docsFlagsSelector(state) & DocsFlags.IsDocEditAllowed)\r\n : true;\r\nexport const docsFlagsIsDocDownloadAllowedSelector = (state: Object) =>\r\n docsStatusSelector(state) === Constants.OK\r\n ? !(~docsFlagsSelector(state) & DocsFlags.IsDocDownloadAllowed)\r\n : true;\r\nexport const docsFlagsIsDocAssignmentAllowedSelector = (state: Object) =>\r\n docsStatusSelector(state) === Constants.OK\r\n ? !(~docsFlagsSelector(state) & DocsFlags.IsDocAssignmentAllowed)\r\n : true;\r\nexport const docsFlagsIsDocSendByEmailAllowedSelector = (state: Object) =>\r\n docsStatusSelector(state) === Constants.OK\r\n ? !(~docsFlagsSelector(state) & DocsFlags.IsDocSendByEmailAllowed)\r\n : true;\r\nexport const docsFlagsInPointSyncIntegrationSelector = (state: Object) =>\r\n docsStatusSelector(state) === Constants.OK\r\n ? !(~docsFlagsSelector(state) & DocsFlags.inPointSyncIntegration)\r\n : true;\r\nexport const docsFlagsIsFolderClassificationEditAllowedSelector = (\r\n state: Object\r\n) =>\r\n docsStatusSelector(state) === Constants.OK\r\n ? !(\r\n ~docsFlagsSelector(state) &\r\n DocsFlags.IsFolderClassificationEditAllowed\r\n )\r\n : true;\r\n\r\nexport const docsFlagsIsDocClassificationEditAllowedSelector = (\r\n state: Object\r\n) =>\r\n docsStatusSelector(state) === Constants.OK\r\n ? !(\r\n ~docsFlagsSelector(state) &\r\n DocsFlags.IsDocClassificationEditAllowed\r\n )\r\n : true;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Badge from \"react-bootstrap/lib/Badge\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** CSS class to apply */\r\n className?: string,\r\n /** number to show (null or <0 will not render) */\r\n count?: number,\r\n /** title to show, defaults to count */\r\n title?: string,\r\n};\r\n\r\n// https://stackoverflow.com/questions/2685911/is-there-a-way-to-round-numbers-into-a-reader-friendly-format-e-g-1-1k\r\nfunction abbrNum(number, decPlaces) {\r\n // 2 decimal places => 100, 3 => 1000, etc\r\n decPlaces = Math.pow(10, decPlaces);\r\n\r\n // Enumerate number abbreviations\r\n var abbrev = [\"k\", \"m\", \"b\", \"t\"];\r\n\r\n // Go through the array backwards, so we do the largest first\r\n for (var i = abbrev.length - 1; i >= 0; i--) {\r\n // Convert array index to \"1000\", \"1000000\", etc\r\n var size = Math.pow(10, (i + 1) * 3);\r\n\r\n // If the number is bigger or equal do the abbreviation\r\n if (size <= number) {\r\n // Here, we multiply by decPlaces, round, and then divide by decPlaces.\r\n // This gives us nice rounding to a particular decimal place.\r\n number = Math.round((number * decPlaces) / size) / decPlaces;\r\n\r\n // Handle special case where we round up to the next abbreviation\r\n /* istanbul ignore next */\r\n if (number === 1000 && i < abbrev.length - 1) {\r\n number = 1;\r\n i++;\r\n }\r\n\r\n // Add the letter for the abbreviation\r\n number = loc.format(number, \"pretty\") + abbrev[i];\r\n\r\n // We are done... stop\r\n break;\r\n }\r\n }\r\n\r\n return number;\r\n}\r\n\r\n/** renders a normalized localized count number in a Badge */\r\nconst CountBadge = ({ className, count, title }: Props) => {\r\n if (count == null || count < 0) return null;\r\n return (\r\n \r\n {abbrNum(count, 1)}\r\n \r\n );\r\n};\r\nCountBadge.displayName = \"CountBadge\";\r\nexport default CountBadge;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport ButtonGroup from \"react-bootstrap/lib/ButtonGroup\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\n\r\nexport const PrevDocButton = ({\r\n onClick,\r\n disabled,\r\n}: {\r\n onClick: Function,\r\n disabled: boolean,\r\n}) => (\r\n \r\n \r\n \r\n);\r\n\r\nexport const NextDocButton = ({\r\n onClick,\r\n disabled,\r\n}: {\r\n onClick: Function,\r\n disabled: boolean,\r\n}) => (\r\n \r\n \r\n \r\n);\r\n\r\nconst TopRowExtras = ({\r\n onNext,\r\n nextDisabled,\r\n onPrev,\r\n prevDisabled,\r\n onFullscreen,\r\n}: {\r\n onNext: Function,\r\n nextDisabled: boolean,\r\n onPrev: Function,\r\n prevDisabled: boolean,\r\n onFullscreen: Function,\r\n}) => (\r\n \r\n \r\n \r\n \r\n);\r\nexport default TopRowExtras;\r\n","// @flow\r\n//#region imports\r\nimport React, { PureComponent, type Node } from \"react\";\r\nimport { History } from \"history\";\r\nimport { withRouter } from \"react-router\";\r\nimport TogglesHandler from \"containers/TogglesHandler\";\r\nimport \"./index.css\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport { compose } from \"redux\";\r\nimport queryString from \"data/queryString\";\r\nimport MainLayout from \"components/MainLayout\";\r\nimport FormContainer from \"containers/Form\";\r\nimport DocViewerContainer from \"containers/DocViewer\";\r\nimport ActivitiesContainer from \"containers/Activities\";\r\nimport {\r\n setCurrentItemAction,\r\n setCurrentBreadcrumb,\r\n backupCurrentItemAction,\r\n restoreCurrentItemAction,\r\n formSetEditModeAction,\r\n} from \"data/actions\";\r\nimport {\r\n ItemStatuses,\r\n RefreshMode,\r\n ServerEventItemType,\r\n ServerEventActionType,\r\n type DocInfoResultDTO,\r\n type ItemStatusesDTO,\r\n type SiteTypeEnum,\r\n type ToggleDTO,\r\n type ToggleItemDTO,\r\n} from \"data/types\";\r\nimport GlobalEventsHandler from \"containers/GlobalEventsHandler\";\r\nimport CommandActionHandler from \"components/CommandActions\";\r\nimport bowser from \"data/bowser\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport Constants, { isMiniView } from \"data/constants\";\r\nimport SplitPanes from \"containers/SplitPanes\";\r\nimport loc from \"i18next\";\r\n// import FloatingBarList from \"components/FloatingBar/FloatingBarList\";\r\nimport FileDropHandler, { type DroppedFile } from \"containers/FileDropHandler\";\r\nimport { toastStyled, toastTypes } from \"data/toast\";\r\nimport {\r\n check_isSyncUpload,\r\n check_licenseAllowEdit,\r\n} from \"containers/ActionPanel_shouldBeVisible\";\r\n\r\nimport SuggestionHandler from \"containers/SuggestionHandler\";\r\nimport Pane from \"components/SplitPanes/Pane\";\r\nimport Status from \"components/Status\";\r\n//#endregion\r\n\r\n//#region flow types\r\ntype Props = {\r\n /** React-router History */\r\n history: History,\r\n /** whether shown as Modal */\r\n asModal?: boolean,\r\n /** React Node to show before toolbar */\r\n topRowBefore?: Node,\r\n /** React Node to show after toolbar */\r\n topRowEnd?: Node,\r\n /** callback when user wants to see previous doc */\r\n onPrev?: Function,\r\n /** callback when user wants to see next doc */\r\n onNext?: Function,\r\n // from TogglesHandler\r\n /** TogglesHandler: set current toggles */\r\n setToggles: Function,\r\n /** TogglesHandler: current toggles */\r\n toggles: ?ToggleDTO,\r\n /** Redux: current itemUri */\r\n itemUri: string,\r\n /** Redux: breadcrumb itemUri version */\r\n version?: number,\r\n /** whether current document is a favorite */\r\n isFav: boolean,\r\n /** whether running in Mini view mode */\r\n isMini: boolean,\r\n /** current document name */\r\n docName: string,\r\n /** current viewName */\r\n viewName: string,\r\n /** whether running under Windows OS */\r\n onWindows: boolean,\r\n /** whether trigger edit mode on mount */\r\n triggerEditMode: boolean,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** TogglesHandler: currently selected toggles' names */\r\n selectedToggles: Array,\r\n /** SplitPanes callback to set split sizes */\r\n setSplitSizes: Function,\r\n /** whether folder classification is in edit mode */\r\n formInEditMode: boolean,\r\n /**redux: current folder formatId */\r\n formatId: number,\r\n /**redux: current folder siteType */\r\n siteType: SiteTypeEnum,\r\n /**pdf.js: search terms */\r\n searchTerm?: string,\r\n /** pdf.js: whether trigger browser print */\r\n triggerPrint: boolean,\r\n};\r\n\r\ntype State = {\r\n isFlatAU: ?boolean,\r\n isDocEditAllowed: boolean, //content editing\r\n isDocClassificationEditAllowed: boolean, //classification editing\r\n itemStatus: ItemStatusesDTO,\r\n currentVersion: number,\r\n currentVersionItemUri: ?string,\r\n triggerEditMode: boolean,\r\n};\r\n//#endregion\r\n\r\nexport class Document extends PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n isFlatAU: undefined,\r\n isDocEditAllowed: false,\r\n isDocClassificationEditAllowed: false,\r\n itemStatus: ItemStatuses.Nothing,\r\n currentVersion: props.version || 0,\r\n currentVersionItemUri: null,\r\n triggerEditMode: props.triggerEditMode || false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const { dispatch, itemUri, viewName } = this.props;\r\n dispatch(backupCurrentItemAction());\r\n dispatch(setCurrentItemAction({ name: viewName, itemUri }));\r\n }\r\n\r\n componentWillUnmount() {\r\n const { dispatch, viewName } = this.props;\r\n dispatch(setCurrentBreadcrumb({ breadcrumb: {}, viewName }));\r\n dispatch(formSetEditModeAction(\"doc\", false));\r\n dispatch(restoreCurrentItemAction());\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n const { dispatch, viewName } = this.props;\r\n /* istanbul ignore else */\r\n if (\r\n prevProps.itemUri !== this.props.itemUri ||\r\n prevProps.refreshId !== this.props.refreshId\r\n ) {\r\n this.setState({\r\n isFlatAU: undefined,\r\n currentVersion: this.props.version || 0,\r\n currentVersionItemUri: null,\r\n triggerEditMode: this.props.triggerEditMode || false,\r\n });\r\n dispatch(formSetEditModeAction(\"doc\", false));\r\n dispatch(\r\n setCurrentItemAction({\r\n name: viewName,\r\n itemUri: this.props.itemUri,\r\n })\r\n );\r\n }\r\n if (prevProps.version !== this.props.version) {\r\n this.setState({\r\n currentVersion: this.props.version,\r\n });\r\n }\r\n }\r\n\r\n _uploadVersion = (files?: Array) =>\r\n CommandActionHandler(\"doc_uploadVersion\", {\r\n files,\r\n itemUri: this.props.itemUri,\r\n });\r\n\r\n _maybeTriggerEditMode = () => {\r\n /* istanbul ignore else */\r\n if (this.state.triggerEditMode) {\r\n const { dispatch } = this.props;\r\n if (this.state.isDocClassificationEditAllowed) {\r\n /* istanbul ignore else */\r\n if (!this.props.isEditMode) {\r\n dispatch(formSetEditModeAction(\"doc\", true));\r\n this.setState({\r\n triggerEditMode: false,\r\n });\r\n }\r\n } else {\r\n toastStyled({\r\n message: loc.t(\"document:edit_form.notAuthorized\"),\r\n ...toastTypes.failure,\r\n });\r\n }\r\n }\r\n };\r\n\r\n _onDocInfoResult = (result: DocInfoResultDTO): void => {\r\n this.setState(\r\n {\r\n isFlatAU: result.isFlatAU,\r\n itemStatus: result.itemStatus,\r\n isDocEditAllowed:\r\n s.docsFlagsIsDocEditAllowedSelector({\r\n docs: { status: Constants.OK, flags: result.flags },\r\n }) && !this._isRecycleBin(result),\r\n isDocClassificationEditAllowed:\r\n s.docsFlagsIsDocClassificationEditAllowedSelector({\r\n docs: { status: Constants.OK, flags: result.flags },\r\n }) && !this._isRecycleBin(result),\r\n },\r\n this._maybeTriggerEditMode\r\n );\r\n /* istanbul ignore else */\r\n if (result.isFlatAU) {\r\n // disable form/actions toggle when isFlatAU\r\n /* istanbul ignore else */\r\n if (this.props.toggles != null) {\r\n this.props.setToggles({\r\n name: this.props.viewName,\r\n isMultiple: true,\r\n toggles: this.props.toggles.toggles\r\n .filter(\r\n (toggle: ToggleItemDTO) => toggle.value === \"viewer\"\r\n )\r\n .map((toggle: ToggleItemDTO) => {\r\n /* istanbul ignore else */\r\n if (result.isFlatAU && toggle.value === \"viewer\") {\r\n toggle.isSelected = true;\r\n }\r\n return toggle;\r\n }),\r\n });\r\n }\r\n this.props.setSplitSizes(1, [0, 100]);\r\n }\r\n };\r\n\r\n _onCancelForm = () =>\r\n this.props.dispatch(formSetEditModeAction(\"doc\", false));\r\n\r\n _onShowVersion = (currentVersion: number, itemUri: string) =>\r\n this.setState({ currentVersion, currentVersionItemUri: itemUri });\r\n\r\n _isDeleted = (state: State = this.state): boolean =>\r\n (state.itemStatus & ItemStatuses.Deleted) > 0;\r\n _isParentDeleted = (state: State = this.state): boolean =>\r\n (state.itemStatus & ItemStatuses.ParentDeleted) > 0;\r\n _isRecycleBin = (state: State = this.state): boolean =>\r\n this._isDeleted(state) || this._isParentDeleted(state);\r\n\r\n render() {\r\n const { toggles, viewName, searchTerm, triggerPrint } = this.props;\r\n const itemUriWithVersion =\r\n this.state.currentVersionItemUri || this.props.itemUri;\r\n if (this.props.isMini && this._isRecycleBin()) {\r\n return (\r\n \r\n );\r\n }\r\n return (\r\n \r\n {/* {this._renderFloatingBar()} */}\r\n \r\n \r\n \r\n \r\n \r\n {this.state.isFlatAU === false && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n {this.state.isFlatAU === false && (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => {\r\n const viewName = ownProps.asModal === true ? \"docmodal\" : \"document\";\r\n let searchTerm = ownProps.searchTerm;\r\n let triggerPrint = ownProps.triggerPrint;\r\n const qs = queryString.parse(ownProps.history.location.search);\r\n if (qs.mark != null) {\r\n searchTerm = qs.mark;\r\n }\r\n if (qs.print) {\r\n triggerPrint = true;\r\n }\r\n return {\r\n itemUri: ownProps.itemUri || s.itemUriSelector(ownProps),\r\n formatId: s.breadcrumbFormatIdSelector(state, viewName),\r\n siteType: s.breadcrumbSiteTypeSelector(state, viewName),\r\n version: s.breadcrumbVersionSelector(state, viewName),\r\n isFav: s.breadcrumbIsFavSelector(state, viewName),\r\n isMini: isMiniView(ownProps.history.location),\r\n docName: s.breadcrumbNameSelector(state, viewName),\r\n onWindows: bowser.is(\"windows\"),\r\n viewName,\r\n formInEditMode: s.formIsEditModeSelector(state, viewName),\r\n ...ownProps,\r\n searchTerm,\r\n triggerPrint,\r\n };\r\n};\r\n\r\nexport const DocumentWithoutHash = compose(\r\n withRouter,\r\n connect(mapStateToProps),\r\n TogglesHandler({\r\n /* viewName */\r\n }),\r\n GlobalEventsHandler({\r\n items: [ServerEventItemType.document],\r\n actions: [ServerEventActionType.delete],\r\n refreshMode: RefreshMode.Originator,\r\n refreshMessage: loc.t(\"globalEvents:document.delete\"),\r\n refreshRoute: false,\r\n }),\r\n SplitPanes({\r\n /* viewName: \"docmodal\", */\r\n paneIds: [\r\n \"#viewerPanel\",\r\n \"#drightPanel\",\r\n \"#docformPanel\",\r\n \"#docActivityPanel\",\r\n ],\r\n toggleIds: [\"viewer\", \"form\", \"act\"],\r\n })\r\n)(Document);\r\n\r\nexport default compose(\r\n withRouter,\r\n connect(mapStateToProps),\r\n SuggestionHandler({ docSearchProvider: true }),\r\n TogglesHandler({\r\n /* viewName */\r\n }),\r\n GlobalEventsHandler({\r\n items: [ServerEventItemType.document],\r\n actions: [ServerEventActionType.delete],\r\n refreshMode: RefreshMode.Originator,\r\n refreshMessage: loc.t(\"globalEvents:document.delete\"),\r\n refreshRoute: false,\r\n }),\r\n SplitPanes({\r\n /*viewName: \"docmodal\", */\r\n paneIds: [\r\n \"#viewerPanel\",\r\n \"#drightPanel\",\r\n \"#docformPanel\",\r\n \"#docActivityPanel\",\r\n ],\r\n toggleIds: [\"viewer\", \"form\", \"act\"],\r\n })\r\n)(Document);\r\n","// @flow\r\nimport loc from \"i18next\";\r\nimport { type ToggleItemDTO, type ToggleDTO } from \"./types\";\r\n\r\nexport const Toggles = {\r\n home: {\r\n name: \"home\",\r\n isMultiple: false,\r\n toggles: [\r\n {\r\n value: \"action\",\r\n text: \"Actions\",\r\n icon: \"thumb-tack\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"fav\",\r\n text: \"Favorites\",\r\n icon: \"star-o\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"rec\",\r\n text: \"Recents\",\r\n icon: \"history\",\r\n isSelected: false,\r\n },\r\n ],\r\n },\r\n wf: {\r\n name: \"wf\",\r\n isMultiple: false,\r\n toggles: [\r\n {\r\n value: \"start\",\r\n text: \"Start\",\r\n icon: \"calendar-plus-o\",\r\n isSelected: false,\r\n },\r\n {\r\n value: \"pending\",\r\n text: \"Pending\",\r\n icon: \"calendar-o\",\r\n isSelected: true,\r\n },\r\n // {\r\n // value: \"done\",\r\n // text: \"Done\",\r\n // icon: \"calendar-check-o\",\r\n // },\r\n ],\r\n },\r\n news: {\r\n name: \"news\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"folders\",\r\n text: \"Folders\",\r\n icon: \"folder-o\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"documents\",\r\n text: \"Documents\",\r\n icon: \"file-o\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"shares\",\r\n text: \"shares\",\r\n icon: \"share\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"reminders\",\r\n text: \"reminders\",\r\n icon: \"clock-o\",\r\n isSelected: true,\r\n },\r\n ],\r\n },\r\n minipicker: {\r\n name: \"minipicker\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"tree\",\r\n text: \"Tree\",\r\n icon: \"sitemap\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"doclist\",\r\n text: \"Documents\",\r\n icon: \"list\",\r\n isSelected: true,\r\n },\r\n ],\r\n },\r\n folder: {\r\n name: \"folder\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"tree\",\r\n text: \"Tree\",\r\n icon: \"sitemap\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"form\",\r\n text: \"Classification\",\r\n icon: \"edit\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"doclist\",\r\n text: \"Documents\",\r\n icon: \"list\",\r\n isSelected: true,\r\n },\r\n ],\r\n },\r\n flat: {\r\n name: \"flat\",\r\n isMultiple: false,\r\n toggles: [\r\n {\r\n value: \"doclist\",\r\n text: \"Documents\",\r\n icon: \"list\",\r\n isSelected: true,\r\n isDisabled: true,\r\n },\r\n ],\r\n },\r\n mailbox: {\r\n name: \"mailbox\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"tree\",\r\n text: \"Tree\",\r\n icon: \"sitemap\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"doclist\",\r\n text: \"Mails\",\r\n icon: \"list\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"viewer\",\r\n text: \"Viewer\",\r\n icon: \"envelope-o\",\r\n isSelected: true,\r\n },\r\n ],\r\n },\r\n miniflat: {\r\n name: \"miniflat\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"doclist\",\r\n text: \"Mails\",\r\n icon: \"list\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"viewer\",\r\n text: \"Viewer\",\r\n icon: \"file-o\",\r\n isSelected: true,\r\n },\r\n ],\r\n },\r\n search: {\r\n name: \"search\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"forms\",\r\n text: \"Forms\",\r\n icon: \"list-ul\",\r\n isSelected: true,\r\n isDisabled: false,\r\n },\r\n {\r\n value: \"search\",\r\n text: \"Manual\",\r\n icon: \"edit\",\r\n isSelected: true,\r\n isDisabled: false,\r\n },\r\n {\r\n value: \"result\",\r\n text: \"Results\",\r\n icon: \"list\",\r\n isSelected: false,\r\n isDisabled: true,\r\n },\r\n ],\r\n },\r\n searchresult: {\r\n name: \"searchresult\",\r\n isMultiple: false,\r\n toggles: [\r\n // {\r\n // value: \"form\",\r\n // text: \"Form\",\r\n // icon: \"edit\",\r\n // isSelected: false\r\n // },\r\n {\r\n value: \"result\",\r\n text: \"Results\",\r\n icon: \"list\",\r\n isSelected: true,\r\n isDisabled: true,\r\n },\r\n ],\r\n },\r\n document: {\r\n name: \"document\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"viewer\",\r\n text: \"Document\",\r\n icon: \"file-o\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"form\",\r\n text: \"Form\",\r\n icon: \"edit\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"act\",\r\n text: \"Activity\",\r\n icon: \"history\",\r\n isSelected: true,\r\n },\r\n ],\r\n },\r\n docmodal: {\r\n name: \"docmodal\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"viewer\",\r\n text: \"Document\",\r\n icon: \"file-o\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"form\",\r\n text: \"Form\",\r\n icon: \"edit\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"act\",\r\n text: \"Activity\",\r\n icon: \"history\",\r\n isSelected: true,\r\n },\r\n ],\r\n },\r\n upload: {\r\n name: \"upload\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"files\",\r\n text: \"Files\",\r\n icon: \"files-o\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"form\",\r\n text: \"Target\",\r\n icon: \"bullseye\",\r\n isSelected: false,\r\n },\r\n ],\r\n },\r\n itemflows: {\r\n name: \"itemflows\",\r\n isMultiple: true,\r\n toggles: [\r\n {\r\n value: \"list\",\r\n text: \"Items\",\r\n icon: \"list-ul\",\r\n isSelected: true,\r\n },\r\n {\r\n value: \"form\",\r\n text: \"Form\",\r\n icon: \"edit\",\r\n isSelected: false,\r\n isDisabled: true,\r\n },\r\n ],\r\n },\r\n};\r\n\r\nexport default function getToggles(\r\n name: string,\r\n isCallback?: Function\r\n): ToggleDTO | void {\r\n let toggles = Toggles[name];\r\n if (toggles) {\r\n // localize 'em!\r\n toggles.toggles.forEach((toggle: ToggleItemDTO) => {\r\n toggle.text = loc.t(`${name}:toggles.${toggle.value}`);\r\n //console.log(\"localizing\", toggle.value, toggle.text);\r\n if (typeof isCallback === \"function\") toggle = isCallback(toggle);\r\n });\r\n return toggles;\r\n }\r\n console.error(\"Cannot find toggles: \" + name);\r\n return undefined;\r\n}\r\n","// @flow\r\nimport React, { useContext, useMemo } from \"react\";\r\nimport AttributeLabel from \"components/ExtraAttributes/AttributeLabel\";\r\nimport MapButton from \"components/MapButton\";\r\nimport ViewerControlBase from \"components/ExtraAttributes/ViewerControl/ViewerControlBase\";\r\nimport { type MarkerDTO } from \"data/types\";\r\nimport { PaneSizeContext, LabelSizeContext } from \"data/context\";\r\n\r\ntype Props = {\r\n /** Common Name */\r\n name: string,\r\n /** Display Name*/\r\n header?: string,\r\n /** Coordinates for Geo Area/Point */\r\n value: any | string,\r\n /** optional width of button */\r\n width?: number,\r\n /** optional (custom) location marker icon */\r\n marker?: MarkerDTO,\r\n};\r\n\r\nconst LocationViewerControl = ({\r\n name,\r\n header,\r\n value,\r\n width,\r\n marker,\r\n}: Props) => {\r\n const { width: maxWidth } = useContext(PaneSizeContext);\r\n const labelWidth = useContext(LabelSizeContext);\r\n // $FlowFixMe\r\n const style: CSSStyleDeclaration = useMemo(() => {\r\n const style: CSSStyleDeclaration = {\r\n flexShrink: 1,\r\n };\r\n if (width && width > 0) style.width = width + \"px\";\r\n else style.minWidth = \"100px\";\r\n return style;\r\n }, [width]);\r\n\r\n const margins = 45;\r\n const labelMargins = 15;\r\n const wrapperStyle: CSSStyleDeclaration = useMemo(\r\n () => ({\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n maxWidth: maxWidth - labelWidth - margins - labelMargins,\r\n }),\r\n [maxWidth, labelWidth, margins, labelMargins]\r\n );\r\n\r\n return (\r\n \r\n \r\n {String(value || \"\").length > 0 ? (\r\n
\r\n \r\n {value}\r\n \r\n\r\n \r\n
\r\n ) : (\r\n

\r\n )}\r\n \r\n );\r\n};\r\n\r\nLocationViewerControl.displayName = \"LocationViewerControl\";\r\nexport default LocationViewerControl;\r\n","// @flow\r\nimport React, { useContext, useMemo } from \"react\";\r\nimport AttributeLabel from \"components/ExtraAttributes/AttributeLabel\";\r\nimport MapButton from \"components/MapButton\";\r\nimport ViewerControlBase from \"components/ExtraAttributes/ViewerControl/ViewerControlBase\";\r\nimport { PaneSizeContext, LabelSizeContext } from \"data/context\";\r\nimport { type MarkerDTO } from \"data/types\";\r\n\r\ntype Props = {\r\n itemUri: string,\r\n formatId: number,\r\n name: string,\r\n header?: string,\r\n value: any | string,\r\n width?: number,\r\n /** optional (custom) location marker icon */\r\n marker?: MarkerDTO,\r\n};\r\n\r\nconst GeoRasterViewerControl = ({\r\n itemUri,\r\n formatId,\r\n name,\r\n header,\r\n value,\r\n width,\r\n marker,\r\n}: Props) => {\r\n const { width: maxWidth } = useContext(PaneSizeContext);\r\n const labelWidth = useContext(LabelSizeContext);\r\n // $FlowFixMe\r\n const style: CSSStyleDeclaration = useMemo(() => {\r\n const style: CSSStyleDeclaration = {\r\n flexShrink: 1,\r\n };\r\n if (width && width > 0) style.width = width + \"px\";\r\n else style.minWidth = \"100px\";\r\n return style;\r\n }, [width]);\r\n\r\n const margins = 45;\r\n const labelMargins = 15;\r\n const wrapperStyle: CSSStyleDeclaration = useMemo(\r\n () => ({\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n maxWidth: maxWidth - labelWidth - margins - labelMargins,\r\n }),\r\n [maxWidth, labelWidth, margins, labelMargins]\r\n );\r\n\r\n return (\r\n \r\n \r\n

\r\n \r\n {value}\r\n \r\n {value && String(value).length > 0 && (\r\n \r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nGeoRasterViewerControl.displayName = \"GeoRasterViewerControl\";\r\nexport default GeoRasterViewerControl;\r\n","/* istanbul ignore file */\r\n\r\nimport Loader from \"components/Loader\";\r\nimport { LoadingType } from \"data/types\";\r\n\r\nexport default Loader(\r\n {\r\n loader: () =>\r\n import(\r\n \"./GeoPointEditorControl\" /* webpackChunkName: \"component-GeoPointEditorControl\" */\r\n ),\r\n },\r\n LoadingType.Status\r\n);\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"row\":\"RowResult_row__2wnkq\",\"multi\":\"RowResult_multi__Xisw1\",\"checkbox\":\"RowResult_checkbox__3t--4\",\"active\":\"RowResult_active__bg-6W\",\"hovered\":\"RowResult_hovered__3P9Sl\",\"bc\":\"RowResult_bc__3DMv6\",\"article\":\"RowResult_article__fMUtY\",\"header\":\"RowResult_header__1YNyV\",\"icon\":\"RowResult_icon__15Eyg\",\"footer\":\"RowResult_footer__3m6Qz\"};","// @flow\r\nimport React, { useRef, useEffect, type Element } from \"react\";\r\nimport ListGroup from \"react-bootstrap/lib/ListGroup\";\r\nimport List from \"react-virtualized/dist/commonjs/List\";\r\nimport \"react-virtualized/styles.css\"; // only needs to be imported once\r\nimport Measure from \"react-measure\";\r\nimport NoData from \"components/NoData\";\r\nimport { getClassNames } from \"data/utils\";\r\nimport styles from \"./Tree.module.css\";\r\n\r\ntype Props = {\r\n /** function called to render one item\r\n * @param {string} key Unique key within array of rows\r\n * @param {number} index Index of row within collection\r\n * @param {boolean} isScrolling The List is currently being scrolled\r\n * @param {boolean} isVisible This row is visible within the List (eg it is not an overscanned row)\r\n * @param {CSStyle} style Style object to be applied to row (to position it)\r\n */\r\n renderRow: (\r\n key: string,\r\n index: number,\r\n isScrolling: boolean,\r\n isVisible: boolean,\r\n style: CSSStyle\r\n ) => React.Node,\r\n /** current node index to scroll to */\r\n scrollToIndex: number,\r\n /** current node id to mark as active */\r\n activeTreeNodeId: number,\r\n /** total number items to render */\r\n totalItems: number,\r\n /** callback when user scrolls the tree */\r\n onScroll: () => void,\r\n /** localization context (e.g. for nodata) */\r\n locContext: string,\r\n /** optional NoData Content Component */\r\n NoDataContent: Element,\r\n /** filter text currently applied */\r\n filter?: string,\r\n /** optional classname to apply to root ListGroup */\r\n className?: string,\r\n};\r\n\r\nconst Tree = ({\r\n renderRow,\r\n scrollToIndex,\r\n activeTreeNodeId,\r\n totalItems,\r\n onScroll,\r\n locContext,\r\n NoDataContent,\r\n filter,\r\n className,\r\n}: Props) => {\r\n const list: List = useRef(null); // internal ref to rendered virtualized List Component\r\n\r\n useEffect(() => {\r\n /* istanbul ignore next */ list.current &&\r\n list.current.forceUpdateGrid();\r\n }, [activeTreeNodeId, filter]);\r\n\r\n if (totalItems === 0)\r\n return (\r\n \r\n {NoDataContent && }\r\n \r\n );\r\n\r\n return (\r\n \r\n {\r\n /* istanbul ignore next */ (dimensions) => (\r\n //
\r\n \r\n \r\n \r\n //
\r\n )\r\n }\r\n
\r\n );\r\n};\r\n\r\nexport default Tree;\r\n","import React from \"react\";\r\nimport { useLocalStore } from \"hooks\";\r\nimport { Provider } from \"react-redux\";\r\nimport { getDisplayName } from \"data/constants\";\r\n\r\ntype Props = {\r\n name?: string,\r\n childres?: any,\r\n};\r\n\r\nconst LocalStore = ({ name = \"LocalStore\", children }: Props) => {\r\n const localStore = useLocalStore(name);\r\n return {children};\r\n};\r\n\r\ntype Config = {\r\n name?: string,\r\n};\r\n\r\nexport const LocalStoreHandler = ({\r\n name = \"LocalStore\",\r\n}: Config = {}): Node => (WrappedComponent: ReactClass) => {\r\n const HOC = (props) => (\r\n \r\n \r\n \r\n );\r\n HOC.displayName = `LocalStoreHandler(${getDisplayName(WrappedComponent)})`;\r\n return HOC;\r\n};\r\n\r\nexport default LocalStore;\r\n","// @flow\r\nimport React from \"react\";\r\nimport GeoPointInput from \"components/GeoPointInput\";\r\nimport DropdownButton from \"react-bootstrap/lib/DropdownButton\";\r\nimport InputGroup from \"react-bootstrap/lib/InputGroup\";\r\nimport MenuItem from \"react-bootstrap/lib/MenuItem\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport styles from \"./GeoRadiusInput.module.css\";\r\nimport {\r\n ParseLocation,\r\n LocationToString,\r\n ParseRadius,\r\n RadiusToString,\r\n} from \"components/MapViewer/utils\";\r\nimport SettingValue, { type SettingValueProps } from \"containers/SettingValue\";\r\nimport loc from \"i18next\";\r\nimport { type Location, type MapEditLocationResult } from \"data/types\";\r\n\r\ntype Props = {\r\n /** displayName of field */\r\n label: ?string,\r\n /** location:radius in string format */\r\n value: string,\r\n /** callback when user sets location\r\n * @param {string} locationWithRadius new location in string format\r\n */\r\n onChange: (locationWithRadius: string) => void,\r\n /** callback when user sets location by map\r\n * @param {string} locationWithRadius string format of location:radius\r\n */\r\n onManualLocation: (locationWithRadius: string) => void,\r\n /** persisted search radius */\r\n radius: SettingValueProps,\r\n /** placeholder text to display when @see {value} is empty */\r\n placeholder?: string,\r\n};\r\n\r\ntype State = {\r\n location: ?Location,\r\n radius: number,\r\n};\r\n\r\nexport class GeoRadiusInput extends React.PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = this._parseFromString(props.value, props.radius.value);\r\n }\r\n\r\n _parseFromString = (\r\n value: string,\r\n radiusIn: ?number\r\n ): { location: string, radius: number } => {\r\n const locRadius = ParseRadius(value);\r\n return {\r\n location: locRadius.location,\r\n radius: locRadius.radius || radiusIn || 500,\r\n };\r\n };\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: Props) {\r\n /* istanbul ignore else */\r\n if (this.props.value !== nextProps.value) {\r\n this.setState(\r\n this._parseFromString(nextProps.value, nextProps.radius.value)\r\n );\r\n }\r\n }\r\n\r\n _displayUnit = (meter: number) =>\r\n meter < 1000 ? `${meter}m` : `${(meter / 1000).toFixed(0)} km`;\r\n\r\n _fireChangedValue = () =>\r\n this.props.onChange(\r\n RadiusToString(this.state.location, this.state.radius)\r\n );\r\n\r\n _onChange = (location: string) =>\r\n this.setState(\r\n { location: ParseLocation(location) },\r\n this._fireChangedValue\r\n );\r\n\r\n _onRadiusChange = (radius: number) =>\r\n this.setState({ radius }, () => {\r\n if (this.state.location != null) this._fireChangedValue();\r\n this.props.radius.setValue(radius);\r\n });\r\n\r\n _onManualLocation = (editLocationResult: MapEditLocationResult) =>\r\n this.setState(\r\n {\r\n location: editLocationResult.location,\r\n radius: editLocationResult.radius,\r\n },\r\n () =>\r\n this.props.onManualLocation(\r\n RadiusToString(\r\n editLocationResult.location,\r\n editLocationResult.radius\r\n )\r\n )\r\n );\r\n\r\n render = () => (\r\n \r\n \r\n \r\n {this._displayUnit(this.state.radius)}\r\n \r\n \r\n \r\n }\r\n >\r\n {window.CONFIG.general.geo.radius.searchRadius.map((r) => (\r\n \r\n this._onRadiusChange(r)\r\n }\r\n >\r\n {this._displayUnit(r)}\r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\nexport default SettingValue({ name: \"geoSearchRadius\", namespace: \"radius\" })(\r\n GeoRadiusInput\r\n);\r\n","// @flow\r\nimport React, { type ElementRef } from \"react\";\r\nimport NativeSelect from \"components/NativeSelect\";\r\nimport {\r\n type SearchValueTypeEnum,\r\n SearchValueType,\r\n SearchOperator,\r\n type SearchOperatorEnum,\r\n} from \"data/types\";\r\nimport styles from \"./SearchOperators.module.css\";\r\nimport loc from \"i18next\";\r\n\r\n/** map which SearchOperators are available for which Search SearchValueType */\r\nexport const SearchValueTypeOperatorsMapping = {\r\n [SearchValueType.NotSet]: [\"Equals\"], // special $FREETEXT$ field\r\n [SearchValueType.ItemType]: [\"Equals\"],\r\n [SearchValueType.FileSize]: [\"Equals\"],\r\n [SearchValueType.String]: [\r\n \"Contextor\",\r\n \"ContextorContains\",\r\n \"Contains\",\r\n \"Equals\",\r\n \"StartsWith\",\r\n \"EndsWith\",\r\n ],\r\n [SearchValueType.Link]: [],\r\n [SearchValueType.StringFieldOnly]: [\r\n \"Contextor\",\r\n \"ContextorContains\",\r\n \"Contains\",\r\n \"Equals\",\r\n \"StartsWith\",\r\n \"EndsWith\",\r\n ],\r\n [SearchValueType.RelativeDate]: [\r\n \"Contextor\",\r\n \"From\",\r\n \"FromWithTime\",\r\n \"To\",\r\n \"ToWithTime\",\r\n // TODO \"FromTo\",\r\n // TODO \"FromToWithTime\",\r\n \"Equals\",\r\n \"EqualsWithTime\",\r\n \"RelativeDate\",\r\n // #46483 remove not working date searchform Operators\r\n // \"FromRelativeTo\",\r\n // \"FromRelativeToWithTime\",\r\n // \"FromToRelative\",\r\n // \"FromWithTimeToRelative\",\r\n \"FromRelative\",\r\n \"ToRelative\",\r\n ],\r\n [SearchValueType.DateTime]: [\r\n \"Contextor\",\r\n \"From\",\r\n \"FromWithTime\",\r\n \"To\",\r\n \"ToWithTime\",\r\n \"FromTo\",\r\n \"FromToWithTime\",\r\n \"Equals\",\r\n \"EqualsWithTime\",\r\n \"RelativeDate\",\r\n // #46483 remove not working date searchform Operators\r\n // \"FromRelativeTo\",\r\n // \"FromRelativeToWithTime\",\r\n // \"FromToRelative\",\r\n // \"FromWithTimeToRelative\",\r\n \"FromRelative\",\r\n \"ToRelative\",\r\n ],\r\n [SearchValueType.Decimal]: [\"Contextor\", \"From\", \"To\", \"FromTo\", \"Equals\"],\r\n [SearchValueType.DecimalFieldOnly]: [\r\n \"Contextor\",\r\n \"From\",\r\n \"To\",\r\n \"FromTo\",\r\n \"Equals\",\r\n ],\r\n [SearchValueType.GeoPoint]: [\"GeoRadius\", \"GeoArea\"],\r\n [SearchValueType.GeoArea]: [\r\n \"GeoRadiusIntersect\",\r\n \"GeoRadiusWithin\",\r\n \"GeoAreaIntersect\",\r\n \"GeoAreaWithin\",\r\n \"GeoAreaPoint\",\r\n ],\r\n};\r\n\r\n/** get localized searchOperators */\r\nconst getOperatorsForField = (valueType: SearchValueTypeEnum) =>\r\n SearchValueTypeOperatorsMapping[valueType].map((K) => ({\r\n // special handling for those that have only Contextor (and no Contextor.StartsWith/Contains)\r\n T:\r\n K === \"Contextor\" &&\r\n (valueType === SearchValueType.DateTime ||\r\n valueType === SearchValueType.Decimal ||\r\n valueType === SearchValueType.DecimalFieldOnly)\r\n ? loc.t(\"search:form.op.Choose\")\r\n : loc.t(\"search:form.op.\" + K),\r\n K: SearchOperator[K],\r\n }));\r\n\r\ntype Props = {\r\n /** React.createRef to assign to NativeSelect element */\r\n selectRef?: ElementRef<*>,\r\n /** search field type */\r\n valueType: SearchValueTypeEnum,\r\n /** current seach operator */\r\n value: SearchOperatorEnum,\r\n /** callback when user changes the search operator\r\n * @param {SearchOperatorEnum} op new searchOperator key chosen\r\n */\r\n onChange: (op: SearchOperatorEnum) => void,\r\n};\r\n\r\n/** render SearchOperators dropdown */\r\nexport default class SearchOperators extends React.PureComponent {\r\n render() {\r\n const { selectRef, valueType, value, onChange } = this.props;\r\n const operators = getOperatorsForField(valueType);\r\n if (valueType === SearchValueType.NotSet)\r\n return
;\r\n else\r\n return (\r\n o.K === value) || operators[0]}\r\n onChange={(o) => onChange(o.K)}\r\n />\r\n );\r\n }\r\n}\r\n","// @flow\r\nimport React, { PureComponent, type ComponentType } from \"react\";\r\nimport { getDisplayName } from \"data/constants\";\r\nimport SearchOperators from \"components/SearchOperators\";\r\nimport { type SearchOperatorEnum, type SearchValueTypeEnum } from \"data/types\";\r\n\r\ntype Props = {\r\n /** currently selected searchOperator */\r\n searchOperator: SearchOperatorEnum,\r\n /** callback when value has been changed\r\n * @param {string} name field's name\r\n * @param {any} value new field's value\r\n */\r\n onChange: (name: string, value: any) => void,\r\n /** current value */\r\n value: any,\r\n /** current name */\r\n name: string,\r\n /** current valueType */\r\n valueType: SearchValueTypeEnum,\r\n};\r\n\r\ntype State = {\r\n /** currently selected searchOperator */\r\n op: SearchOperatorEnum,\r\n /** current value */\r\n value: any,\r\n};\r\n\r\n/** wraps *EditorControls to add Search Operators and handling */\r\nconst toSearchEditor = (WrappedComponent: ComponentType) =>\r\n class PP extends PureComponent {\r\n upstreamOnChange: (name: string, value: any) => void;\r\n // opRef: ElementRef<*>;\r\n\r\n static displayName = `toSearchEditor(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n op: props.searchOperator,\r\n value: props.value,\r\n };\r\n this.upstreamOnChange = this.props.onChange;\r\n // this.opRef = React.createRef();\r\n }\r\n\r\n _onChange = () => {\r\n this.upstreamOnChange(this.props.name, {\r\n op: this.state.op,\r\n val: this.state.value,\r\n });\r\n };\r\n\r\n _onChangeValue = (name: string, value: any) =>\r\n this.setState({ value }, this._onChange);\r\n\r\n _onChangeOperator = (op: SearchOperatorEnum) =>\r\n this.setState({ op, value: null }, this._onChange);\r\n\r\n // _focusNextInput = (node: React.Element) => {\r\n // if (this.opRef == null || this.opRef.current == null) return null;\r\n // const input = this.opRef.current.parentNode.querySelector(\"input\");\r\n // if (input != null) input.focus();\r\n // };\r\n\r\n render = () => (\r\n (\r\n \r\n )\r\n }\r\n />\r\n );\r\n };\r\n\r\nexport default toSearchEditor;\r\n","// @flow\r\nimport React, { PureComponent, type ComponentType } from \"react\";\r\nimport { getDisplayName } from \"data/constants\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** callback when value has been changed\r\n * @param {string} name field's name\r\n * @param {any} value new field's value\r\n */\r\n onChange: (name: string, value: any) => void,\r\n /** current value */\r\n value: ?Array,\r\n};\r\n\r\ntype State = {\r\n value1: ?any,\r\n value2: ?any,\r\n};\r\n\r\n/** wraps *EditorControls to allow FromTo operator */\r\nconst toBetweenEditor = (\r\n WrappedComponent1: ComponentType,\r\n WrappedComponent2: ComponentType\r\n) =>\r\n class PP extends PureComponent {\r\n upstreamOnChange: (name: string, value: any) => void;\r\n // opRef: ElementRef<*>;\r\n\r\n static displayName = `toBetweenEditor(${getDisplayName(\r\n WrappedComponent1\r\n )},${getDisplayName(WrappedComponent2)})`;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n value1:\r\n props.value && Array.isArray(props.value) && props.value[0],\r\n value2:\r\n props.value && Array.isArray(props.value) && props.value[1],\r\n };\r\n this.upstreamOnChange = this.props.onChange;\r\n }\r\n\r\n _onChange = () => {\r\n this.upstreamOnChange(this.props.name, [\r\n this.state.value1,\r\n this.state.value2,\r\n ]);\r\n };\r\n\r\n _onChangeValue1 = (name: string, value1: any) =>\r\n this.setState({ value1 }, this._onChange);\r\n\r\n _onChangeValue2 = (name: string, value2: any) =>\r\n this.setState({ value2 }, this._onChange);\r\n\r\n render = () => (\r\n \r\n }\r\n />\r\n );\r\n };\r\n\r\nexport default toBetweenEditor;\r\n","// @flow\r\nimport React from \"react\";\r\nimport FormsyEditorBase from \"components/ExtraAttributes/EditorControl/FormsyEditorBase\";\r\nimport GeoRadiusInput from \"components/GeoRadiusInput\";\r\n\r\ntype Props = {\r\n /** current value */\r\n value?: string,\r\n /** CSS classname to apply */\r\n className?: string,\r\n /** placeholder text to display when @see {value} is empty */\r\n placeholder?: string,\r\n};\r\n\r\nconst GeoRadiusEditorControl = (props: Props) => (\r\n (\r\n \r\n changeValue({ currentTarget: { value } })\r\n }\r\n onManualLocation={\r\n /* istanbul ignore next */ (value) =>\r\n changeValue({ currentTarget: { value } })\r\n }\r\n // style={props.style}\r\n className={props.className}\r\n placeholder={props.placeholder}\r\n />\r\n )}\r\n {...props}\r\n />\r\n);\r\nGeoRadiusEditorControl.displayName = \"GeoRadiusEditorControl\";\r\nexport default GeoRadiusEditorControl;\r\n","import React from \"react\";\r\nimport FormsyEditorBase from \"components/ExtraAttributes/EditorControl/FormsyEditorBase\";\r\nimport RelativeDatePicker from \"components/DocListFilterModal/RelativeDatePicker\";\r\n\r\nconst RelativeDateEditorControl = (props) => (\r\n (\r\n {\r\n if (e.currentTarget.value === \"NotSet\")\r\n changeValue({ currentTarget: { value: null } });\r\n else changeValue(e);\r\n }\r\n }\r\n style={props.style}\r\n className={props.className}\r\n />\r\n )}\r\n {...props}\r\n />\r\n);\r\nRelativeDateEditorControl.displayName = \"RelativeDateEditorControl\";\r\nexport default RelativeDateEditorControl;\r\n","// @flow\r\nimport React from \"react\";\r\nimport { type SearchFieldDefinitionDTO, FormLookupType } from \"data/types\";\r\nimport toSearchEditor from \"./toSearchEditor\";\r\nimport toBetweenEditor from \"./toBetweenEditor\";\r\n\r\n// import CheckboxEditorControl from \"components/ExtraAttributes/EditorControl/CheckboxEditorControl\";\r\nimport TextEditorControl from \"components/ExtraAttributes/EditorControl/TextEditorControl\";\r\n// import MemoEditorControl from \"components/ExtraAttributes/EditorControl/MemoEditorControl\";\r\nimport NumberEditorControl from \"components/ExtraAttributes/EditorControl/NumberEditorControl\";\r\nimport DateEditorControl from \"components/ExtraAttributes/EditorControl/DateEditorControl\";\r\n// import RadioEditorControl from \"components/ExtraAttributes/EditorControl/RadioEditorControl\";\r\nimport LookupEditorControl from \"components/ExtraAttributes/EditorControl/LookupEditorControl\";\r\n\r\nimport GeoAreaEditorControl from \"components/ExtraAttributes/EditorControl/GeoAreaEditorControl\";\r\nimport GeoRadiusEditorControl from \"./GeoRadiusEditorControl\";\r\nimport RelativeDateEditorControl from \"./RelativeDateEditorControl\";\r\nimport { SearchValueType, SearchOperator, DateTimeFormat } from \"data/types\";\r\nimport styles from \"./AttributeSearch.module.css\";\r\n// import * as s from \"data/reducers/selectors\";\r\nimport loc from \"i18next\";\r\n\r\ntype Props = {\r\n /** current itemUri */\r\n itemUri: string,\r\n /** current attribute definition */\r\n attribute?: SearchFieldDefinitionDTO,\r\n /** list of all attributes */\r\n attributes: Array,\r\n /** custom width */\r\n width?: number,\r\n /** callback when an attribute is edited\r\n * @param {string} name unique name of attribute being changed\r\n * @param {any} value new value\r\n */\r\n onChange: (name: string, value: any) => void,\r\n /** whether to show field's label */\r\n showLabel: boolean,\r\n};\r\n\r\nconst formPrefix = \"sf.\";\r\nconst SearchLookupEditorControl = toSearchEditor(LookupEditorControl);\r\nconst SearchTextEditorControl = toSearchEditor(TextEditorControl);\r\nconst SearchNumberEditorControl = toSearchEditor(NumberEditorControl);\r\nconst SearchDateEditorControl = toSearchEditor(DateEditorControl);\r\nconst RelativeDateSearchControl = toSearchEditor(RelativeDateEditorControl);\r\nconst GeoSearchRadiusEditorControl = toSearchEditor(GeoRadiusEditorControl);\r\nconst GeoSearchAreaEditorControl = toSearchEditor(GeoAreaEditorControl);\r\nconst SearchBetweenNumberEditorControl = toSearchEditor(\r\n toBetweenEditor(NumberEditorControl, NumberEditorControl)\r\n);\r\nconst SearchBetweenDateEditorControl = toSearchEditor(\r\n toBetweenEditor(DateEditorControl, DateEditorControl)\r\n);\r\n\r\nclass AttributeSearch extends React.Component {\r\n /** re-render only when value or searchOperator changes! */\r\n /* istanbul ignore next*/ shouldComponentUpdate = (nextProps: Props) =>\r\n nextProps.attribute == null ||\r\n this.props.attribute == null ||\r\n nextProps.attribute.id !== this.props.attribute.id ||\r\n nextProps.attribute.value !== this.props.attribute.value ||\r\n nextProps.attribute.op !== this.props.attribute.op;\r\n\r\n render() {\r\n const { itemUri, attribute, attributes, onChange, showLabel } =\r\n this.props;\r\n // if no attributeDefinition found then render nothing\r\n if (attribute == null) return null;\r\n\r\n //console.log('Attribute', attribute);\r\n // TODO header converter from name like CurionLib does\r\n const header = attribute.header || attribute.name;\r\n const value = attribute.value;\r\n\r\n switch (attribute.op) {\r\n case SearchOperator.Contextor:\r\n case SearchOperator.ContextorContains:\r\n return (\r\n \r\n );\r\n\r\n case SearchOperator.FromTo:\r\n case SearchOperator.FromToWithTime:\r\n switch (attribute.valueType) {\r\n case SearchValueType.Decimal:\r\n case SearchValueType.DecimalFieldOnly:\r\n return (\r\n \r\n );\r\n\r\n case SearchValueType.DateTime:\r\n return (\r\n \r\n );\r\n default:\r\n return null;\r\n }\r\n\r\n // case SearchOperator.FromRelativeTo:\r\n // case SearchOperator.FromToRelative:\r\n // case SearchOperator.FromWithTimeToRelative:\r\n // return
TODO: from-to relative date
;\r\n\r\n case SearchOperator.RelativeDate:\r\n case SearchOperator.FromRelative:\r\n case SearchOperator.ToRelative:\r\n return (\r\n \r\n );\r\n\r\n case SearchOperator.Equals:\r\n case SearchOperator.Contains:\r\n case SearchOperator.StartsWith:\r\n case SearchOperator.EndsWith:\r\n case SearchOperator.From:\r\n case SearchOperator.FromWithTime:\r\n case SearchOperator.To:\r\n case SearchOperator.ToWithTime:\r\n case SearchOperator.EqualsWithTime:\r\n switch (attribute.valueType) {\r\n case SearchValueType.Decimal:\r\n case SearchValueType.DecimalFieldOnly:\r\n return (\r\n \r\n );\r\n case SearchValueType.DateTime:\r\n return (\r\n \r\n );\r\n case SearchValueType.NotSet:\r\n case SearchValueType.String:\r\n case SearchValueType.StringFieldOnly:\r\n return (\r\n \r\n );\r\n default:\r\n return null;\r\n }\r\n\r\n case SearchOperator.GeoRadius:\r\n case SearchOperator.GeoRadiusIntersect:\r\n case SearchOperator.GeoRadiusWithin:\r\n return (\r\n \r\n );\r\n case SearchOperator.GeoArea:\r\n case SearchOperator.GeoAreaIntersect:\r\n case SearchOperator.GeoAreaWithin:\r\n case SearchOperator.GeoAreaPoint:\r\n return (\r\n \r\n );\r\n\r\n case SearchOperator.NotSet:\r\n // special Freetext attribute?\r\n if (\r\n attribute.valueType === SearchValueType.NotSet &&\r\n attribute.name === \"$SEARCHTEXT$\"\r\n ) {\r\n return (\r\n \r\n );\r\n }\r\n //lint -fallthrough\r\n default:\r\n console.warn(\r\n `TODO for SearchValueType: ${attribute.valueType}, SearchOperator: ${attribute.op}`\r\n );\r\n return null;\r\n }\r\n }\r\n}\r\nexport default AttributeSearch;\r\n","// @flow\r\nimport React, { useState, useCallback } from \"react\";\r\nimport ButtonToolbar from \"react-bootstrap/lib/ButtonToolbar\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport EAForm from \"components/ExtraAttributes/EAForm\";\r\nimport Formsy, { addValidationRule } from \"formsy-react\";\r\nimport { type SearchFormResultDTO } from \"data/types\";\r\nimport AttributeSearch from \"./AttributeSearch\";\r\nimport \"components/Form/index.css\";\r\nimport \"./index.css\";\r\nimport { getClassNames } from \"data/utils\";\r\nimport { LabelSizeContext } from \"data/context\";\r\nimport { useEffectOnce } from \"react-use\";\r\n\r\nconst EASearchForm = (props) => (\r\n \r\n);\r\n\r\ntype Props = {\r\n /** result itemUri */\r\n itemUri: string,\r\n /** searchForm definition */\r\n form: SearchFormResultDTO,\r\n /** Search button label */\r\n searchLabel: string,\r\n /** whether the Search button should be enabled */\r\n searchEnabled?: boolean,\r\n /** whether to show search operators */\r\n showSearchOperators?: boolean,\r\n // /** callback when user clicks the Cancel button */\r\n // onCancel: () => void,\r\n /** callback when user clicks the Search button */\r\n onSearch: (model: Object) => void,\r\n /** callback when an attribute is edited\r\n * @param {string} name unique name of attribute being changed\r\n * @param {any} value new value\r\n */\r\n onChange: (name: string, value: any) => void,\r\n /** callback when a validation is finished on the form (could be valid or invalid) */\r\n onValidated?: (isValid: boolean) => void,\r\n};\r\n\r\nconst SearchForm = (props: Props) => {\r\n const [isValid, setIsValid] = useState(true);\r\n const [isChanged, setIsChanged] = useState(true);\r\n\r\n useEffectOnce(() => {\r\n /* istanbul ignore next */\r\n addValidationRule(\r\n \"isNotInvalid\",\r\n (values, value) =>\r\n value == null || !String(value).startsWith(\"__INVALID__\")\r\n );\r\n });\r\n\r\n const _onValidChanged = useCallback((valid: boolean) => {\r\n setIsValid(valid);\r\n isChanged &&\r\n props.onValidated &&\r\n props.onValidated(valid);\r\n }, [setIsValid, isChanged, props]);\r\n\r\n /* istanbul ignore next */\r\n const _onChange = useCallback((currentValues, changed) => changed && !isChanged && setIsChanged(true), [isChanged, setIsChanged]);\r\n\r\n return ( _onValidChanged(true)}\r\n onInvalid={/* istanbul ignore next */() => _onValidChanged(false)}\r\n onChange={_onChange}\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n {props.searchLabel}\r\n \r\n \r\n );\r\n}\r\n\r\nexport default SearchForm","// @flow\r\nimport React, { PureComponent } from \"react\";\r\nimport { connect, Dispatch } from \"react-redux\";\r\nimport SearchForm from \"components/SearchForm\";\r\nimport Status from \"components/Status\";\r\nimport { getSearchFormAction, setSearchFormChangesAction } from \"data/actions\";\r\nimport {\r\n type SearchFormResultDTO,\r\n type SearchItemDTO,\r\n type SearchFilterDTO,\r\n SearchItemType,\r\n FormLookupValue,\r\n} from \"data/types\";\r\nimport Constants, {\r\n isFeatureOn,\r\n Feature,\r\n type ConstantsEnum,\r\n} from \"data/constants\";\r\nimport immutable from \"object-path-immutable\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport SearchFormHeader from \"components/SearchFormHeader\";\r\n\r\ntype Props = {\r\n /** search form id to render */\r\n id: number,\r\n /** optional extra filters to set on searchRequest */\r\n extraFilters?: Array,\r\n /** current itemUri */\r\n itemUri: string,\r\n /** label to show on Search button */\r\n searchLabel: string,\r\n /** callback when user clicks the Search button\r\n * @param {SearchItemDTO} searchItem searchItem containing query\r\n */\r\n onSearch: (searchItem: SearchItemDTO) => void,\r\n /** callback when user clicks the Cancel button */\r\n onCancel: () => void,\r\n /** Redux dispatch */\r\n dispatch: Dispatch,\r\n /** the search form itself */\r\n form: ?SearchFormResultDTO,\r\n /** search form fetch status */\r\n status: ConstantsEnum,\r\n /** whether to enable the search button */\r\n searchEnabled?: boolean,\r\n /** whether to show search operators */\r\n showSearchOperators?: boolean,\r\n};\r\n\r\ntype State = {\r\n changed: Object,\r\n form: ?SearchFormResultDTO,\r\n};\r\n\r\nexport class SearchFormContainer extends PureComponent {\r\n state = {\r\n changed: {},\r\n form: undefined,\r\n };\r\n\r\n static defaultProps = {\r\n searchEnabled: true,\r\n showSearchOperators: false,\r\n };\r\n\r\n componentDidMount = () => this._fetch(this.props.id);\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n /* istanbul ignore else */\r\n if (\r\n prevProps.itemUri !== this.props.itemUri ||\r\n prevProps.id !== this.props.id\r\n ) {\r\n this._fetch(this.props.id);\r\n }\r\n /* istanbul ignore else */\r\n if (\r\n prevProps.form !== this.props.form &&\r\n this.props.form != null &&\r\n this.props.form.attributes != null\r\n ) {\r\n const changed = {};\r\n const attributes = [];\r\n // create copy of attributes\r\n this.props.form.attributes.forEach((attr, i) => {\r\n let val = attr.value;\r\n let op = attr.op;\r\n // prefill free text search with value from store...\r\n if (\r\n (prevProps.form == null ||\r\n prevProps.form.name === this.props.form.name ||\r\n attr.name === \"$SEARCHTEXT$\") &&\r\n this.props.changes[attr.name]\r\n ) {\r\n val = this.props.changes[attr.name].val;\r\n op = this.props.changes[attr.name].op;\r\n }\r\n attributes[i] = immutable.set(attr, \"op\", op);\r\n attributes[i] = immutable.set(attributes[i], \"value\", val);\r\n changed[attr.name] = {\r\n val,\r\n op,\r\n };\r\n });\r\n // apply extraFilters\r\n if (\r\n this.props.extraFilters != null &&\r\n this.props.extraFilters.length > 0\r\n ) {\r\n let customId = -50;\r\n this.props.extraFilters.forEach((filter) => {\r\n // add to form definition\r\n attributes.splice(0, 0, {\r\n hidden: true,\r\n id: customId--,\r\n header: filter.name,\r\n name: filter.name,\r\n value: filter.value,\r\n valueType: filter.valueType,\r\n op: filter.op,\r\n nodeType: filter.nodeType,\r\n });\r\n // add values\r\n changed[filter.name] = {\r\n val: filter.value,\r\n op: filter.op,\r\n };\r\n });\r\n }\r\n let form = immutable.set(this.props.form, \"attributes\", attributes);\r\n form = immutable.set(form, \"name\", this.props.name);\r\n this.setState(\r\n {\r\n changed,\r\n form,\r\n },\r\n () => {\r\n this.props.dispatch(setSearchFormChangesAction(changed));\r\n if (isFeatureOn(Feature.searchAsYouType)) this._onSearch();\r\n }\r\n );\r\n }\r\n }\r\n\r\n _fetch = (id: number): void => {\r\n this.props.dispatch(\r\n getSearchFormAction({\r\n id,\r\n model: this.state.changed,\r\n })\r\n );\r\n };\r\n\r\n _hasChanged = () =>\r\n this.state?.form?.attributes.filter((attr, ind) =>\r\n (this.props.form?.attributes[ind]?.value !== attr.value &&\r\n !(this.props.form?.attributes[ind]?.value === null && attr?.value === ''))\r\n )?.length > 0\r\n\r\n _onValidated = (isValid: boolean) => {\r\n if (isValid && isFeatureOn(Feature.searchAsYouType)) this._onSearch();\r\n };\r\n\r\n _onChange = (name: string, value: any) => {\r\n const splittedName = name.split(\".\");\r\n if (\r\n value == null &&\r\n !Object.prototype.hasOwnProperty.call(\r\n this.state.changed,\r\n splittedName[1]\r\n )\r\n ) {\r\n return;\r\n }\r\n const oldValue = this.state.changed[splittedName[1]];\r\n // console.log(\"containers/searchForm onChange\", name, oldValue, value);\r\n if (\r\n oldValue != null &&\r\n value != null &&\r\n (oldValue.val !== value.val || oldValue.op !== value.op)\r\n ) {\r\n // console.log(\"containers/searchForm doChange!\");\r\n const idx = this.state.form.attributes.findIndex(\r\n (a) => a.name === splittedName[1]\r\n );\r\n // set operator\r\n let form = immutable.set(\r\n this.state.form,\r\n [\"attributes\", idx, \"op\"],\r\n value.op\r\n );\r\n // set value\r\n form = immutable.set(form, [\"attributes\", idx, \"value\"], value.val);\r\n\r\n const changed = immutable.set(\r\n this.state.changed,\r\n splittedName[1],\r\n value\r\n );\r\n // update local state\r\n this.setState(\r\n {\r\n changed,\r\n form,\r\n },\r\n () => {\r\n this.props.dispatch(setSearchFormChangesAction(changed));\r\n }\r\n );\r\n }\r\n };\r\n\r\n _clear = () => {\r\n let form = immutable.set(this.state.form, \"attributes\", this.props.form.attributes);\r\n let changed = this.props.form.attributes?.reduce((prev, curr) =>\r\n ({ ...prev, [curr.name]: { val: curr.value, op: curr.op } }),\r\n {});\r\n this.setState(\r\n {\r\n changed,\r\n form,\r\n },\r\n () => {\r\n this.props.dispatch(setSearchFormChangesAction(changed));\r\n //if (isFeatureOn(Feature.searchAsYouType)) this._onSearch();\r\n }\r\n );\r\n }\r\n\r\n _toFilterValue = (value: string | FormLookupValue) =>\r\n value && (value.T || value);\r\n\r\n // send our search model with searchOperators\r\n _onSearch = () => {\r\n const { changed, form } = this.state;\r\n // console.log(\"searchForm\", searchForm);\r\n // console.log(\"model\", model);\r\n\r\n // convert model into filters\r\n const filters = [];\r\n let searchText = null;\r\n form.attributes.forEach((attr) => {\r\n const changedField = changed[attr.name];\r\n /* istanbul ignore else */\r\n if (changedField != null) {\r\n filters.push({\r\n name: attr.name,\r\n op: changedField.op,\r\n value: this._toFilterValue(changedField.val),\r\n valueType: attr.valueType,\r\n nodeType: attr.nodeType,\r\n keywordField: attr.keywordField,\r\n });\r\n // keep special searchText for highlighting\r\n if (attr.name === \"$SEARCHTEXT$\")\r\n searchText = this._toFilterValue(changedField.val);\r\n }\r\n });\r\n\r\n // build searchItem\r\n const searchItem: SearchItemDTO = {\r\n id: this.props.id,\r\n name: this.props.form.name,\r\n searchType: SearchItemType.Form,\r\n searchText,\r\n filters,\r\n sorts: this.props.form.sorts,\r\n };\r\n\r\n /* istanbul ignore else */\r\n if (typeof this.props.onSearch === \"function\")\r\n this.props.onSearch(searchItem);\r\n };\r\n\r\n render = () => (\r\n <>\r\n \r\n {this.props.status !== Constants.OK && (\r\n \r\n )}\r\n {this.props.status === Constants.OK && this.state.form == null && (\r\n \r\n )}\r\n {this.props.status === Constants.OK && this.state.form != null && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = /* istanbul ignore next */ (state, ownProps) => ({\r\n status: s.searchFormStatusSelector(state),\r\n form: s.searchFormResultSelector(state),\r\n showSearchOperators: s.settingValueSelector(\"showSearchOperators\", state),\r\n changes: s.searchFormChangesSelector(state),\r\n ...ownProps,\r\n});\r\n\r\nexport default connect(mapStateToProps)(SearchFormContainer);\r\n","/* istanbul ignore next */\r\nfunction getRadianAngle(degreeValue) {\r\n return (degreeValue * Math.PI) / 180;\r\n}\r\n\r\n/* istanbul ignore next */\r\nexport const createImage = (url) =>\r\n new Promise((resolve, reject) => {\r\n const image = new Image();\r\n image.addEventListener(\"load\", () => resolve(image));\r\n image.addEventListener(\"error\", (error) => reject(error));\r\n image.setAttribute(\"crossOrigin\", \"anonymous\"); // needed to avoid cross-origin issues\r\n image.src = url;\r\n });\r\n\r\n/**\r\n * This function was adapted from the one in the ReadMe of https://github.com/DominicTobias/react-image-crop\r\n * @param {File} image - Image File url\r\n * @param {Object} pixelCrop - pixelCrop Object provided by react-easy-crop\r\n * @param {number} rotation - optional rotation parameter\r\n */\r\n/* istanbul ignore next */\r\nexport default async function getCroppedImg(imageSrc, pixelCrop, rotation = 0) {\r\n const image = await createImage(imageSrc);\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n\r\n // set width to double image size to allow for a safe area for the\r\n // image to rotate in without being clipped by canvas context\r\n canvas.width = image.width * 2;\r\n canvas.height = image.height * 2;\r\n\r\n // translate canvas context to a central location to allow rotating around the center.\r\n ctx.translate(image.width, image.height);\r\n ctx.rotate(getRadianAngle(rotation));\r\n ctx.translate(-image.width, -image.height);\r\n\r\n // draw rotated image and store data.\r\n ctx.drawImage(image, image.width / 2, image.height / 2);\r\n const data = ctx.getImageData(0, 0, image.width * 2, image.height * 2);\r\n\r\n // set canvas width to final desired crop size - this will clear existing context\r\n canvas.width = pixelCrop.width;\r\n canvas.height = pixelCrop.height;\r\n\r\n // paste generated rotate image with correct offsets for x,y crop values.\r\n ctx.putImageData(\r\n data,\r\n 0 - image.width / 2 - pixelCrop.x,\r\n 0 - image.height / 2 - pixelCrop.y\r\n );\r\n\r\n // As Base64 string\r\n return canvas.toDataURL(\"image/jpeg\");\r\n\r\n // // As a blob\r\n // return new Promise((resolve, reject) => {\r\n // canvas.toBlob(file => {\r\n // resolve(URL.createObjectURL(file))\r\n // }, 'image/jpeg')\r\n // })\r\n}\r\n","import React from \"react\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport ButtonGroup from \"react-bootstrap/lib/ButtonGroup\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport { clampInRange } from \"./clampInRange\";\r\n\r\nconst degrees = [0, 90, 180, 270];\r\n\r\nconst Rotation = ({\r\n value = 0,\r\n onRotate,\r\n}: {\r\n value: number,\r\n onRotate: (degrees: number) => void,\r\n}) => {\r\n const setRotation = clampInRange(\r\n degrees,\r\n degrees.findIndex((v) => v === value)\r\n );\r\n\r\n return (\r\n \r\n onRotate(setRotation.prev())}\r\n >\r\n \r\n \r\n\r\n onRotate(setRotation.next())}\r\n >\r\n \r\n \r\n \r\n );\r\n};\r\nRotation.displayName = \"ImageEditor.Rotation\";\r\nexport default Rotation;\r\n","// idea extended from https://github.com/watson/roundround/blob/master/index.js\r\nexport function clampInRange(array, index) {\r\n index = index || 0;\r\n\r\n /* istanbul ignore next */\r\n if (array == null || !Array.isArray(array))\r\n throw new Error(\"Expecting argument to RoundRound to be an Array\");\r\n\r\n return {\r\n prev: () => {\r\n if (index <= 0) index = array.length;\r\n return array[--index];\r\n },\r\n next: () => {\r\n if (index >= array.length - 1) index = -1;\r\n return array[++index];\r\n },\r\n };\r\n}\r\n","import React from \"react\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport ButtonGroup from \"react-bootstrap/lib/ButtonGroup\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\n\r\nconst Zoom = ({\r\n value,\r\n maxZoom,\r\n onZoom,\r\n}: {\r\n value: number,\r\n maxZoom: number,\r\n onZoom: (zoom: number) => void,\r\n}) => (\r\n \r\n onZoom(value + 1)}\r\n >\r\n \r\n \r\n\r\n onZoom(value - 1)}\r\n >\r\n \r\n \r\n \r\n);\r\n\r\nZoom.displayName = \"ImageEditor.Zoom\";\r\nexport default Zoom;\r\n","// @flow\r\nimport React from \"react\";\r\nimport Modal, { ModalSize } from \"components/Modal\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport ButtonToolbar from \"react-bootstrap/lib/ButtonToolbar\";\r\nimport { createModal } from \"react-modal-promise\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport styles from \"./ImageEditorModal.module.css\";\r\nimport Cropper from \"react-easy-crop\";\r\nimport getCroppedImg from \"./cropImage\";\r\nimport Rotation from \"./rotation\";\r\nimport Zoom from \"./zoom\";\r\n\r\nconst MAX_ZOOM = 10;\r\n\r\ntype Props = {\r\n /** react-modal-promise: whether to show dialog */\r\n open: boolean,\r\n /** react-modal-promise: callback when user closes Dialog\r\n * @param {{croppedImage : string}} croppedImage new image after editing\r\n */\r\n close: ({ croppedImage: string }) => void,\r\n /** Modal Dialog title */\r\n title?: string,\r\n /** dataURL (base64) encoded image */\r\n src: string,\r\n /** requested image height */\r\n height: number,\r\n /** requested image width */\r\n width: number,\r\n};\r\n\r\ntype State = {\r\n crop: ?Object,\r\n zoom: number,\r\n aspect: Number,\r\n rotation: number,\r\n croppedAreaPixels: ?Object,\r\n};\r\n\r\n/** presents a simple image editor (rotate, crop, ...) dialog to the user\r\n */\r\nexport class ImageEditorModal extends React.PureComponent {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n crop: { x: 0, y: 0 },\r\n zoom: 1,\r\n aspect: 4 / 3,\r\n rotation: 0,\r\n croppedAreaPixels: null,\r\n };\r\n }\r\n\r\n _onDone = async () => {\r\n const croppedImage = await getCroppedImg(\r\n this.props.src,\r\n this.state.croppedAreaPixels,\r\n this.state.rotation\r\n );\r\n this.props.close({ croppedImage });\r\n };\r\n\r\n _onCropChange = (crop) => this.setState({ crop });\r\n\r\n _onCropComplete = (croppedArea, croppedAreaPixels) =>\r\n this.setState({ croppedAreaPixels });\r\n\r\n _onZoomChange = (zoom) => this.setState({ zoom });\r\n\r\n _onRotationChange = (rotation) => this.setState({ rotation });\r\n\r\n render() {\r\n const { open, close, title } = this.props;\r\n return (\r\n close()}\r\n dialogClassName={styles.modal}\r\n >\r\n \r\n \r\n {title}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* {this.state.legacy && (\r\n \r\n )} */}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\nexport const openImageEditorModal = createModal(ImageEditorModal);\r\n","import React from \"react\";\r\nimport ImageViewerControl from \"components/ExtraAttributes/ViewerControl/ImageViewerControl\";\r\nimport FileDropHandler, { type DroppedFile } from \"containers/FileDropHandler\";\r\nimport styles from \"./UploadImage.module.css\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport { getFileExtension } from \"data/utils\";\r\nimport { openImageEditorModal } from \"./ImageEditorModal\";\r\nimport loc from \"i18next\";\r\nimport { toastStyled, toastTypes } from \"data/toast\";\r\nimport { defaultFallbackImage } from \"components/ExtraAttributes/ViewerControl/ImageViewerControl\";\r\nimport { type ImageResultDTO } from \"data/types\";\r\n\r\ntype Props = {\r\n /** relativePath for upload queue (e.g. while offline) */\r\n relativePath: string,\r\n /** unique attribute name */\r\n name: string,\r\n /** current image blob */\r\n value: ?string | ImageResultDTO,\r\n /** optional pixel width */\r\n width?: number,\r\n /** optional pixel height */\r\n height?: number,\r\n /** whether to allow editing */\r\n isReadonly?: boolean,\r\n /** CSV list of image file extensions (with .) to accept\r\n * @default \".png,.jpg,.jpeg,.jfif,.gif\"\r\n */\r\n accept?: string,\r\n /** callback when user chose file to upload\r\n * @param {string} base64 image encoded as base64\r\n */\r\n onDone: (base64: string) => void,\r\n};\r\n\r\n// https://github.com/GrillWork/react-file-reader/blob/master/ReactFileReader.js\r\nexport default class UploadImage extends React.PureComponent {\r\n _input: HTMLInputElement | null;\r\n\r\n static defaultProps = {\r\n isReadonly: false,\r\n accept: \".png,.jpg,.jpeg,.jfif,.gif\",\r\n };\r\n\r\n _onDrop = (files: Array) => {\r\n if (files.length !== 1) {\r\n toastStyled({\r\n message: loc.t(\"upload:image.onlyOne\"),\r\n ...toastTypes.failure,\r\n });\r\n return;\r\n }\r\n const file = files[0].data;\r\n if (this._validateFile(file)) this._processFile(file);\r\n };\r\n\r\n _onBrowse = (e) => this._input && this._input.click();\r\n\r\n _onBrowseChange = (e) => {\r\n // get the files\r\n let files = e.target.files;\r\n /* istanbul ignore next */\r\n if (files.length !== 1) return;\r\n e.persist();\r\n\r\n // Process single first file\r\n let file = files[0];\r\n if (this._validateFile(file))\r\n this._processFile(file, () => {\r\n // We clear the input after a file is selected, because otherwise\r\n // change event is not fired in Chrome and Safari when a file\r\n // with the same name is selected.\r\n // ___Why not use value=\"\" on instead?\r\n // Because if we use that method of clearing the input,\r\n // Chrome will not trigger change if we drop the same file twice (Issue #768).\r\n e.target.value = null;\r\n });\r\n };\r\n\r\n _validateFile = (file: Blob): boolean => {\r\n const ext = getFileExtension(file.name);\r\n if (this.props.accept.indexOf(ext) === -1) {\r\n toastStyled({\r\n message: loc.t(\"upload:image.invalidFile\", {\r\n valid: this.props.accept,\r\n }),\r\n ...toastTypes.failure,\r\n });\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n _processFile = (file: Blob, cb?: Function) => {\r\n // Make new FileReader\r\n const reader = new FileReader();\r\n reader.addEventListener(\"loadend\", () => {\r\n /* istanbul ignore else */\r\n if (reader.readyState === 2) {\r\n /* istanbul ignore else */\r\n if (typeof this.props.onDone === \"function\")\r\n this.props.onDone(reader.result);\r\n } else {\r\n console.warn(\r\n `UploadImage Cannot load file ${file.name}: ${reader.error.message}`\r\n );\r\n }\r\n /* istanbul ignore else */\r\n if (typeof cb === \"function\") cb();\r\n });\r\n\r\n // Convert the file to base64 text\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n _onEdit = () => {\r\n const { src } = this._parseValueAsImageResultDTO();\r\n openImageEditorModal({\r\n title: loc.t(\"upload:image.title\", { name: this.props.name }),\r\n src,\r\n width: this.props.width,\r\n height: this.props.height,\r\n }).then((result) => result && this.props.onDone(result.croppedImage));\r\n };\r\n\r\n _parseValueAsImageResultDTO = () => {\r\n const { value } = this.props;\r\n if (!value) {\r\n return {\r\n src: defaultFallbackImage,\r\n fallback: true,\r\n };\r\n } else if (typeof value === \"string\") {\r\n return {\r\n src: value,\r\n fallback: false,\r\n };\r\n } else {\r\n return this.props.value;\r\n }\r\n };\r\n\r\n render() {\r\n const { src, fallback: hideEdit } = this._parseValueAsImageResultDTO();\r\n\r\n const viewer = (\r\n \r\n );\r\n\r\n if (this.props.isReadonly)\r\n return (\r\n
\r\n {viewer}\r\n
\r\n );\r\n else\r\n return (\r\n \r\n {src && viewer}\r\n
\r\n (this._input = ref)}\r\n />\r\n \r\n \r\n

{loc.t(\"upload:image.upload.button\")}

\r\n \r\n {!hideEdit && (\r\n \r\n \r\n

{loc.t(\"upload:image.edit.button\")}

\r\n \r\n )}\r\n
\r\n \r\n );\r\n }\r\n}\r\n","// @flow\r\nimport React from \"react\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\nimport UploadImage from \"components/UploadImage\";\r\n\r\ntype Props = {\r\n itemUri: string,\r\n name: string,\r\n header: string,\r\n value: Object,\r\n width?: number,\r\n height?: number,\r\n isReadonly?: boolean,\r\n isRequired?: boolean,\r\n};\r\n\r\nconst ImageEditorControl = (props: Props) => (\r\n (\r\n \r\n changeValue({ currentTarget: { value } })\r\n }\r\n />\r\n )}\r\n {...props}\r\n />\r\n);\r\nImageEditorControl.displayName = \"ImageEditorControl\";\r\nexport default ImageEditorControl;\r\n","var _path;\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgTarget(_ref, svgRef) {\n let title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n style: {\n enableBackground: \"new 0 0 469.333 469.333\"\n },\n viewBox: \"0 0 469.333 469.333\",\n xmlSpace: \"preserve\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M234.667,149.333c-47.147,0-85.333,38.187-85.333,85.333S187.52,320,234.667,320S320,281.813,320,234.667 S281.813,149.333,234.667,149.333z M425.387,213.333C415.573,124.373,344.96,53.76,256,43.947V0h-42.667v43.947 C124.373,53.76,53.76,124.373,43.947,213.333H0V256h43.947c9.813,88.96,80.427,159.573,169.387,169.387v43.947H256v-43.947 C344.96,415.573,415.573,344.96,425.387,256h43.947v-42.667H425.387L425.387,213.333z M234.667,384 c-82.453,0-149.333-66.88-149.333-149.333s66.88-149.333,149.333-149.333S384,152.213,384,234.667S317.12,384,234.667,384z\"\n })));\n}\n\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgTarget);\nexport default __webpack_public_path__ + \"static/media/target.9129153c.svg\";\nexport { ForwardRef as ReactComponent };","import React from \"react\";\r\nimport geolocator from \"geolocator\";\r\nimport geoLocatorOptions from \"./geoLocatorOptions\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport Constants, { type ConstantsEnum } from \"data/constants\";\r\nimport { type Location } from \"data/types\";\r\nimport { ReactComponent as TargetIcon } from \"./target.svg\";\r\n\r\ntype Props = {\r\n /** callback when location received\r\n * @param {Location} location new location object\r\n */\r\n onSetLocation: (location: Location) => void,\r\n /** CSS class to apply to button */\r\n className?: string,\r\n /** fallback to IP if Geolocation fails or rejected */\r\n fallbackToIP: boolean,\r\n};\r\n\r\ntype State = {\r\n status: ConstantsEnum,\r\n};\r\n\r\nclass LocatorButton extends React.PureComponent {\r\n state = {\r\n status: Constants.OK,\r\n };\r\n static defaultProps = {\r\n fallbackToIP: true,\r\n };\r\n\r\n /** Locate location by GPS */\r\n locate = () =>\r\n this.setState({ status: Constants.LOADING }, () =>\r\n geolocator.locate(\r\n geoLocatorOptions({ fallbackToIP: this.props.fallbackToIP }),\r\n (err, location) => {\r\n if (err) {\r\n /* istanbul ignore next */\r\n if (err.message != null) alert(err.message);\r\n console.warn(err);\r\n this.setState({ status: Constants.ERROR });\r\n } else {\r\n this.setState({ status: Constants.OK });\r\n // console.log(location);\r\n this.props.onSetLocation(location.coords);\r\n }\r\n }\r\n )\r\n );\r\n\r\n _buttonStatus = () => {\r\n switch (this.state.status) {\r\n case Constants.LOADING:\r\n return ;\r\n\r\n case Constants.OK:\r\n return ;\r\n\r\n default:\r\n return (\r\n \r\n );\r\n }\r\n };\r\n\r\n render = () => (\r\n \r\n {this._buttonStatus()}\r\n \r\n );\r\n}\r\n\r\nexport default LocatorButton;\r\n","// @flow\r\nimport React from \"react\";\r\nimport InputGroup from \"react-bootstrap/lib/InputGroup\";\r\nimport FormControl from \"react-bootstrap/lib/FormControl\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport LocatorButton from \"components/LocatorButton\";\r\nimport { ParseLocation, LocationToString } from \"components/MapViewer/utils\";\r\nimport {\r\n type Location,\r\n type MapEditLocationResult,\r\n type MarkerDTO,\r\n} from \"data/types\";\r\nimport { openMapModal } from \"components/MapModal\";\r\nimport styles from \"./GeoPointInput.module.css\";\r\nimport GeoPlaceInput from \"components/GeoPlaceInput\";\r\nimport {\r\n SupportGeoPlaceInput,\r\n SupportGeoPointEdit,\r\n SupportGeoRadiusEdit,\r\n getGeoPointProvider,\r\n getGeoRadiusProvider,\r\n} from \"components/MapViewer/providerSupport\";\r\n\r\ntype Props = {\r\n /** displayName of field */\r\n label: ?string,\r\n /** current location in string format */\r\n value: ?string,\r\n /** whether to show an icon before the text field */\r\n showIcon: boolean,\r\n /** callback when user sets location\r\n * @param {string} value new location in string format\r\n */\r\n onChange: (value: string) => void,\r\n /** optional callback when user wants to manually set location on map\r\n * if defined this needs to take of calling openMapModal!\r\n */\r\n onSetLocationManually?: () => void,\r\n /** callback when user sets location by map\r\n * only needed if onSetLocationManually is not defined\r\n * @param {MapEditLocationResult} editLocationResult location set\r\n */\r\n onManualLocation?: (editLocationResult: MapEditLocationResult) => void,\r\n /** callback when user wants to triangulate - when not set then\r\n * button not visible\r\n */\r\n onTriangulate?: () => void,\r\n /** circle radius */\r\n radius?: number,\r\n /** optional CSS class to apply to root element */\r\n className?: string,\r\n /** placeholder text to display when @see {value} is empty */\r\n placeholder?: string,\r\n /** optional (custom) location marker icon */\r\n marker?: MarkerDTO,\r\n};\r\n\r\ntype State = {\r\n value: ?string,\r\n};\r\n\r\nclass GeoPointInput extends React.PureComponent {\r\n static defaultProps = {\r\n showIcon: true,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n value: props.value,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n if (prevProps.value !== this.props.value) {\r\n this.setState({ value: this.props.value });\r\n }\r\n }\r\n\r\n /** change location input text value */\r\n changeValue = (e) =>\r\n this.setState({ value: e.target.value }, () =>\r\n this.props.onChange(this.state.value)\r\n );\r\n\r\n changeValueFromPlace = (value: string) =>\r\n this.changeValue({ target: { value } });\r\n\r\n /** retrieve location from current GPS position */\r\n _setCurrentLocation = (location: Location): void =>\r\n this.setState({ value: LocationToString(location) }, () =>\r\n this.props.onChange(this.state.value)\r\n );\r\n\r\n /** show map and allow user to change marker's location */\r\n _setLocationManually = () => {\r\n // if (this.state.value.length === 0)\r\n // this._setCurrentLocation({ longitude: 0, latitude: 0 });\r\n openMapModal({\r\n mapProvider:\r\n this.props.radius == null\r\n ? getGeoPointProvider()\r\n : getGeoRadiusProvider(),\r\n useMarker: true,\r\n radius: this.props.radius,\r\n locations: [\r\n Object.assign(\r\n {},\r\n ParseLocation(\r\n this.state.value != null &&\r\n String(this.state.value).length > 0\r\n ? this.state.value\r\n : \"0,0\"\r\n ),\r\n {\r\n label: /* istanbul ignore next*/ this.props.label || \"\",\r\n icon:\r\n /* istanbul ignore next*/ this.props.radius == null\r\n ? this.props.marker\r\n : undefined,\r\n }\r\n ),\r\n ],\r\n // onSet: this._setCurrentLocation\r\n onSet: (editLocationResult: MapEditLocationResult) =>\r\n this.props.onManualLocation(editLocationResult),\r\n });\r\n };\r\n\r\n _supportGeoPointEdit = () =>\r\n this.props.radius == null\r\n ? SupportGeoPointEdit()\r\n : SupportGeoRadiusEdit();\r\n\r\n render = () => (\r\n \r\n {this.props.showIcon && (\r\n \r\n \r\n \r\n )}\r\n {SupportGeoPlaceInput() && (\r\n \r\n )}\r\n {!SupportGeoPlaceInput() && (\r\n \r\n )}\r\n \r\n {this.props.onTriangulate && (\r\n \r\n \r\n \r\n )}\r\n \r\n {this._supportGeoPointEdit() && (\r\n \r\n \r\n \r\n )}\r\n \r\n {this.props.children}\r\n \r\n );\r\n}\r\nexport default GeoPointInput;\r\n","// @flow\r\nimport React from \"react\";\r\nimport FormGroup from \"react-bootstrap/lib/FormGroup\";\r\nimport InputGroup from \"react-bootstrap/lib/InputGroup\";\r\nimport FormControl from \"react-bootstrap/lib/FormControl\";\r\nimport \"font-awesome/css/font-awesome.css\";\r\nimport FontAwesome from \"react-fontawesome\";\r\nimport loc from \"i18next\";\r\nimport Button from \"react-bootstrap/lib/Button\";\r\nimport { ParseRaster } from \"components/MapViewer/utils\";\r\nimport { openMapModal } from \"components/MapModal\";\r\nimport styles from \"./GeoRasterInput.module.css\";\r\nimport { getGeoRasterProvider } from \"components/MapViewer/providerSupport\";\r\nimport { type MarkerDTO } from \"data/types\";\r\nimport { getClassNames } from \"data/utils\";\r\n\r\ntype Props = {\r\n /** current itemUri */\r\n itemUri: string,\r\n /** current formatId */\r\n formatId: number,\r\n /** displayName of field */\r\n label: ?string,\r\n /** current location in string format */\r\n value: ?string,\r\n /** whether to show an icon before the text field */\r\n showIcon: boolean,\r\n /** callback when user sets location\r\n * @param {string} value new location in string format\r\n */\r\n onChange: (value: string) => void,\r\n /** optional callback when user wants to manually set location on map\r\n * if defined this needs to take of calling openMapModal!\r\n */\r\n onSetLocationManually?: () => void,\r\n /** callback when user sets location by map\r\n * only needed if onSetLocationManually is not defined\r\n * @param {string} editLocationResult location set\r\n */\r\n onManualLocation?: (editLocationResult: string) => void,\r\n /** optional CSS class to apply to root element */\r\n className?: string,\r\n /** placeholder text to display when @see {value} is empty */\r\n placeholder?: string,\r\n /** optional (custom) location marker icon */\r\n marker?: MarkerDTO,\r\n};\r\n\r\ntype State = {\r\n value: ?string,\r\n};\r\n\r\nclass GeoRasterInput extends React.PureComponent {\r\n static defaultProps = {\r\n showIcon: true,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n value: props.value,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n if (prevProps.value !== this.props.value) {\r\n this.setState({ value: this.props.value });\r\n }\r\n }\r\n\r\n /** change location input text value */\r\n changeValue = (e) =>\r\n this.setState({ value: e.target.value }, () =>\r\n this.props.onChange(this.state.value)\r\n );\r\n\r\n /** show map and allow user to change marker's location */\r\n _setLocationManually = () => {\r\n const mapProvider = getGeoRasterProvider(\r\n this.props.itemUri,\r\n this.props.formatId\r\n );\r\n /* istanbul ignore next */\r\n if (mapProvider == null || mapProvider.isRaster !== true) {\r\n alert(\r\n \"Missing Raster configuration - do not know which Raster map to display!\"\r\n );\r\n return;\r\n }\r\n openMapModal({\r\n itemUri: this.props.itemUri,\r\n title: this.props.label,\r\n usePlaceInput: false,\r\n mapProvider,\r\n useMarker: true,\r\n locations: [\r\n Object.assign(\r\n {},\r\n ParseRaster(\r\n this.state.value != null &&\r\n String(this.state.value).length > 0\r\n ? this.state.value\r\n : \"\" // only MapViewer knows the real layer ids\r\n ),\r\n {\r\n label: /* istanbul ignore next*/ this.props.label || \"\",\r\n icon: this.props.marker,\r\n }\r\n ),\r\n ],\r\n onSet: (editLocationResult: string) =>\r\n this.props.onManualLocation(editLocationResult),\r\n });\r\n };\r\n\r\n render = () => (\r\n \r\n \r\n {this.props.showIcon && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.props.children}\r\n \r\n \r\n );\r\n}\r\nexport default GeoRasterInput;\r\n","import React from \"react\";\r\nimport FormsyEditorBase from \"./FormsyEditorBase\";\r\nimport GeoRasterInput from \"components/GeoRasterInput\";\r\n\r\nconst GeoRasterEditorControl = (props) => (\r\n (\r\n \r\n changeValue({ currentTarget: { value } })\r\n }\r\n onManualLocation={\r\n /* istanbul ignore next */ (value: string) =>\r\n changeValue({ currentTarget: { value } })\r\n }\r\n placeholder={props.placeholder}\r\n />\r\n )}\r\n {...props}\r\n />\r\n);\r\nGeoRasterEditorControl.displayName = \"GeoRasterEditorControl\";\r\nexport default GeoRasterEditorControl;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"overlay\":\"Overlay_overlay__3F_R_\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"ConfirmModal_modal__Z7-B_\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"chromedToggle\":\"AbsoluteDropdown_chromedToggle__3fkaw\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"nodata\":\"NoData_nodata__3up7l\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"placeholder\":\"DocListSimple_placeholder__vwjcC\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"avatar\":\"Avatar_avatar__1dKRK\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"nolink\":\"LinkViewer_nolink__16Yhn\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"thumbnail\":\"Thumbnail_thumbnail__1L6K-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"menu\":\"ActionsMenu_menu__3RmT7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"ShareAction_header__2l1Yj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"info\":\"ShareAction_info__i6wY8\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"gpi\":\"GeoPlaceInput_gpi__1aADj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"option\":\"LookupEditorControl_option__1DYL2\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"ImageEditorModal_modal__1IqC7\"};","// @flow\r\nimport React, { PureComponent, type ComponentType } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { getDisplayName, isMiniView } from \"data/constants\";\r\nimport { toastStyled, toastTypes } from \"data/toast\";\r\nimport * as s from \"data/reducers/selectors\";\r\nimport { getRoute } from \"components/ItemUriLink\";\r\nimport {\r\n RefreshMode,\r\n type RefreshModeEnum,\r\n type ServerEventMessage,\r\n type ServerEventItemEnum,\r\n type ServerEventActionEnum,\r\n} from \"data/types\";\r\n\r\ntype Config = {\r\n actions?: Array,\r\n items?: Array,\r\n /** Whom do we want to auto refresh */\r\n refreshMode?: RefreshModeEnum,\r\n /** Message, if not auto refresh */\r\n refreshMessage?: string,\r\n /** Refresh Route (e.g. if itemUri was deleted) */\r\n refreshRoute?: boolean,\r\n};\r\n\r\ntype Props = {\r\n /** current globalEvents from store */\r\n globalEvents: ?ServerEventMessage,\r\n /** current users Id */\r\n userId: number,\r\n /** current itemUri */\r\n itemUri?: string,\r\n /** React-router History */\r\n history?: History,\r\n /** is in mini view */\r\n isMini?: boolean,\r\n};\r\n\r\ntype State = {\r\n refreshId: number,\r\n refreshEvent: ?ServerEventMessage,\r\n};\r\n\r\n/**\r\n * will intercept globalEvents changes and provide a refreshId property\r\n */\r\nconst GlobalEventsHandler =\r\n ({\r\n actions = [],\r\n items = [],\r\n refreshMode = RefreshMode.All,\r\n refreshMessage = \"\",\r\n refreshRoute = false,\r\n }: Config) =>\r\n (WrappedComponent: ComponentType) => {\r\n class PP extends PureComponent {\r\n static displayName = `GlobalEventsHandler(${getDisplayName(\r\n WrappedComponent\r\n )})`;\r\n\r\n state = {\r\n refreshId: 0,\r\n refreshEvent: null,\r\n };\r\n\r\n componentDidUpdate(prevProps: Props) {\r\n // console.log(prevProps.globalEvents.id, this.props.globalEvents.id);\r\n\r\n // new event?\r\n let doRefresh =\r\n prevProps.globalEvents.id !== this.props.globalEvents.id &&\r\n this.props.globalEvents.data != null;\r\n if (!doRefresh) return;\r\n\r\n // specific itemUri?\r\n doRefresh =\r\n this.props.itemUri == null\r\n ? true\r\n : // is this the one we are currently displaying?\r\n this.props.globalEvents.data.itemUri ===\r\n this.props.itemUri ||\r\n this.props.globalEvents.data.parentItemUri ===\r\n this.props.itemUri;\r\n if (!doRefresh) return;\r\n\r\n if (\r\n actions.length > 0 &&\r\n !actions.includes(this.props.globalEvents.action)\r\n )\r\n return;\r\n if (\r\n items.length > 0 &&\r\n !items.includes(this.props.globalEvents.item)\r\n )\r\n return;\r\n const refresh: string =\r\n refreshRoute && this.props.globalEvents.data.parentItemUri\r\n ? \"_refreshRoute\"\r\n : \"_refreshId\";\r\n if (refreshMode === RefreshMode.Self) {\r\n /* istanbul ignore else */\r\n if (\r\n this.props.globalEvents.data.userId ===\r\n this.props.userId\r\n ) {\r\n this[refresh]();\r\n }\r\n } else if (\r\n refreshMode === RefreshMode.Originator &&\r\n this.props.globalEvents.data.userId !== this.props.userId\r\n ) {\r\n toastStyled({\r\n ...toastTypes.refresh,\r\n message: refreshMessage,\r\n handleClick: this[refresh],\r\n });\r\n } else {\r\n this[refresh]();\r\n }\r\n }\r\n\r\n _refreshId = (): void => {\r\n this.setState((prevState: State) => ({\r\n refreshId: prevState.refreshId + 1,\r\n refreshEvent: this.props.globalEvents,\r\n }));\r\n };\r\n\r\n _refreshRoute = (): void => {\r\n const { history, isMini } = this.props;\r\n if (typeof history === \"undefined\") {\r\n console.error(\r\n \"Refreshing routes is not possible without props history and isMini\"\r\n );\r\n return;\r\n }\r\n history.push(\r\n getRoute(this.props.globalEvents.data.parentItemUri, isMini)\r\n );\r\n };\r\n\r\n render() {\r\n const { globalEvents, userId, ...rest } = this.props;\r\n return (\r\n \r\n );\r\n }\r\n }\r\n\r\n const mapStateToProps = (state, ownProps) => ({\r\n globalEvents: state.globalEvents,\r\n userId: s.userIdSelector(state),\r\n // We might not have a history prop => fallback\r\n isMini:\r\n ownProps.isMini ||\r\n (ownProps.history\r\n ? isMiniView(ownProps.history.location)\r\n : false),\r\n ...ownProps,\r\n });\r\n\r\n return connect(mapStateToProps)(PP);\r\n };\r\n\r\nexport default GlobalEventsHandler;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"picker\":\"PickerModal_picker__1uvkV\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"list\":\"Tree_list__1gcde\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"DocListFilterModal_modal__g0_qf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"reset\":\"SearchFormHeader_reset__3W5X8\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"SearchResult_wrapper__30dY1\"};"],"sourceRoot":""}